var days_months = new Array();
days_months[1]=31;
days_months[2]=28;
days_months[3]=31;
days_months[4]=30;
days_months[5]=31;
days_months[6]=30;
days_months[7]=31;
days_months[8]=31;
days_months[9]=30;
days_months[10]=31;
days_months[11]=30;
days_months[12]=31;

var months = new Array();
months[1]="January";
months[2]="February";
months[3]="March";
months[4]="April";
months[5]="May";
months[6]="June";
months[7]="July";
months[8]="August";
months[9]="September";
months[10]="October";
months[11]="November";
months[12]="December";


function get_days_in_month( month, year )
{
	d = days_months[month];
	if(month==2 && year%4==0 && year%400!=0)
		d++;
	return d;
};


function get_age_diff( d1,m1,y1, d2,m2,y2 )
{
	y = y1 - y2;
	if(y<0) return get_age_diff( d2,m2,y2, d1,m1,y1 );

	m = m1 - m2;
	if(m<0)
	{
		y--;
		m += 12;
	}

	d = d1 - d2;
	if(d<0)
	{
		m--;
		if(m<0) y--;
	}

	return y;
};


// date stuff

Date.prototype.getMonthName = function()
{
	return months[this.getMonth()+1].substr(0,3);
};

Date.prototype.getWeek = function()	//0-51
{
var onejan = new Date(this.getFullYear(),0,1);
return Math.ceil((((this - onejan) / 86400000) + onejan.getDay())/7)-1;
};

/*
	var Year = this.getFullYear();
	var Month = this.getMonth();
	var Day = this.getDate();
	var now = Date.UTC(Year,Month,Day+1,0,0,0);
	var Firstday = new Date();
	Firstday.setYear(Year);
	Firstday.setMonth(0);
	Firstday.setDate(1);
	var then = Date.UTC(Year,0,1,0,0,0);
	var Compensation = Firstday.getDay();
//	if (Compensation ==0 ) Compensation = -6;
//	else Compensation = 1-Compensation;
	if (Compensation > 3) Compensation -= 4;
	else Compensation += 3;
	var NumberOfWeek =  Math.round((((now-then)/86400000)+Compensation)/7);
	return NumberOfWeek-1;
} */

Date.prototype.getMonthStart = function()
{
	var Year = this.getFullYear();
	var Month = this.getMonth();

	return new Date(Year,Month,1,0,0,0);
};

Date.prototype.getMonthEnd = function()
{
	var u1 = Date.UTC(this.getFullYear(),this.getMonth()+1,0, 0,0,0);
	return new Date(u1);
};

Date.prototype.getNextMonth = function()
{
	var u1 = Date.UTC(this.getFullYear(),this.getMonth()+1,1, 0,0,0);
	return new Date(u1);
};

Date.prototype.getPrevMonth = function()
{
	var u1 = Date.UTC(this.getFullYear(),this.getMonth()-1,1, 0,0,0);
	return new Date(u1);
};


Date.prototype.getWeekStart = function()
{
	var Year = this.getFullYear();
	var Month = this.getMonth();
	var Day = this.getDate();

	var Compensation = this.getDay();
	if (Compensation ==0 ) Compensation = -6;
	else Compensation = 1-Compensation;

	var start = new Date(Year,Month,Day+Compensation,0,0,0);
	return start;
};

Date.prototype.getNextWeek = function()
{
	var Year = this.getFullYear();
	var Month = this.getMonth();
	var Day = this.getDate();

	var Compensation = this.getDay();
	if (Compensation ==0 ) Compensation = -6;
	else Compensation = 1-Compensation;

	var start = new Date(Year,Month,Day+Compensation+7,0,0,0);
	return start;
};

Date.prototype.stepNextDay = function()
{
	var Year = this.getFullYear();
	var Month = this.getMonth();
	var Day = this.getDate();

	this.setFullYear(Year,Month,Day+1,0,0,0);
};

Date.prototype.addDays = function(d)
{
	var u1 = Date.UTC(this.getFullYear(),this.getMonth(),this.getDate(),this.getHours()>=12?12:0,0,0);
	u1 += parseInt(86400000*d,10);	// days in UTC

	return new Date(u1);
};

Date.prototype.getPrevWeek = function()
{
	var Year = this.getFullYear();
	var Month = this.getMonth();
	var Day = this.getDate();

	var Compensation = this.getDay();
	if (Compensation ==0 ) Compensation = -6;
	else Compensation = 1-Compensation;

	var start = new Date(Year,Month,Day+Compensation-7,0,0,0);
	return start;
};


Date.prototype.fromString = function(val)
{
	if( !val ) return false;
	if( val.getDate ) return true;	// already a date...
	
	// try dd/mm/yyyy
	var reg = /([0-9]{2}).([0-9]{2}).([0-9]{4}).([0-9]{2}).([0-9]{2}).([0-9]{2})/i;
	var r = val.match(reg);
	if( !r )
	{
		reg = /([0-9]{2}).([0-9]{2}).([0-9]{4}).([0-9]{2}).([0-9]{2})/i;
		r = val.match(reg);
	}
	if( !r )
	{
		reg = /([0-9]{2}).([0-9]{2}).([0-9]{4})/i;
		r = val.match(reg);
	}
	
	if( r )
	{
		var day = r[1];
		var month = r[2];
		var year = r[3];
		if( year==0 ) return false;
		this.setFullYear(year,month-1,day);
		this.setHours(0); this.setMinutes(0); this.setSeconds(0,0);
		if( r[4] && r[5] && r[6] )
		{
			this.setHours(r[4]); this.setMinutes(r[5]); this.setSeconds(r[6]);
		}
		else if( r[4] && r[5] )
		{
			this.setHours(r[4]); this.setMinutes(r[5]);
		}
		return true;
	}
	
	// try yyyy/mm/dd
	reg = /([0-9]{4}).([0-9]{2}).([0-9]{2}).([0-9]{2}).([0-9]{2}).([0-9]{2})/i;
	r = val.match(reg);
	if( !r )
	{
		reg = /([0-9]{4}).([0-9]{2}).([0-9]{2})/i;
		r = val.match(reg);
	}

	if( r )
	{
		var day = r[3];
		var month = r[2];
		var year = r[1];
		if( year==0 ) return false;
		this.setFullYear(year,month-1,day);
		this.setHours(0); this.setMinutes(0); this.setSeconds(0,0);
		if( r[4] && r[5] && r[6] )
		{
			this.setHours(r[4]); this.setMinutes(r[5]); this.setSeconds(r[6]);
		}
		return true;
	}

	return false;
};

Date.prototype.isSameDay = function(d)
{
	if( !d || !d.getDate ) return false;
	return  this.getFullYear()==d.getFullYear() &&
			this.getMonth()==d.getMonth() &&
			this.getDate()==d.getDate();
};

Date.prototype.isSameBlock = function(d)
{
	if( !d || !d.getDate ) return false;
	var u1 = Date.UTC(this.getFullYear(),this.getMonth(),this.getDate(),this.getHours()>=12?12:0,0,0);
	var u2 = Date.UTC(d.getFullYear(),d.getMonth(),d.getDate(),d.getHours()>=12?12:0,0,0);

	return u1==u2;
};

Date.prototype.isBeforeBlock = function(d)
{
	if( !d || !d.getDate ) return false;
	var u1 = Date.UTC(this.getFullYear(),this.getMonth(),this.getDate(),this.getHours()>=12?12:0,0,0);
	var u2 = Date.UTC(d.getFullYear(),d.getMonth(),d.getDate(),d.getHours()>=12?12:0,0,0);

	return  u1<u2;
};

Date.prototype.isAfterBlock = function(d)
{
	if( !d || !d.getDate ) return false;
	var u1 = Date.UTC(this.getFullYear(),this.getMonth(),this.getDate(),this.getHours()>=12?12:0,0,0);
	var u2 = Date.UTC(d.getFullYear(),d.getMonth(),d.getDate(),d.getHours()>=12?12:0,0,0);

	return  u1>=u2;
};
	
Date.prototype.isAM = function()
{
	return this.getHours()<12;
};

Date.prototype.isWeekend = function()
{
	return this.getDay()==0 || this.getDay()==6;
};

//// FORMATTING

Date.prototype.getStr = function(full)
{
	var y = this.getFullYear();var m = this.getMonth()+1;var d = this.getDate();
	if( !full ) return (d<10?'0':'')+d+'-'+(m<10?'0':'')+m+'-'+y;
	var hh = this.getHours();var mm = this.getMinutes();
	return (d<10?'0':'')+d+'-'+(m<10?'0':'')+m+'-'+y + ' '+(hh<10?'0':'')+hh+':'+(mm<10?'0':'')+mm;
};

Date.prototype.getLongStr = function()
{
	var y = this.getFullYear();
	var m = this.getMonth()+1;
	var d = this.getDate();
	return d + ' ' + months[m] + ' ' + y;
};

Date.prototype.getTimeStr = function()
{
	var hh = this.getHours();
	var mm = this.getMinutes();
	return (hh<10?'0':'')+hh+':'+(mm<10?'0':'')+mm;
};

Date.prototype.getDayStr = function()
{
	return this.getDate()<10?'0'+this.getDate():this.getDate();
};

function getWorkingDaysBetween( d1, d2 )
{
	var aday = 86400000;
	var aweek = 7*aday;

	var day1 = d1.getDay();
	var day2 = d2.getDay();

	d1 = Date.UTC(d1.getFullYear(),d1.getMonth(),d1.getDate(),0,0,0);
	d2 = Date.UTC(d2.getFullYear(),d2.getMonth(),d2.getDate(),0,0,0);
	d2 += aday;

	// make day1 a working day
	if(day1==0) {
		d1 += aday;
		day1=1;
	}
	else if(day1==6) {
		day1=1;
		d1 += aday+aday;
	}
	
	var diff = (d2-d1)/aday;
	if( diff <= 0 ) {
		return 0;
	}

	if( diff <= 7 )
		return diff<=5?diff:5;

	// more than a week

	var res = 6 - day1;
	
	// move on to saturday
	d1 += aday*res;

	while( d1+aweek<d2 )
	{
		d1 += aweek;
		res += 5;
	}

	// now move to next monday...
	d1 += aday+aday;

	if( d2>d1 ) {
		diff = (d2-d1)/aday;	
		return res + (diff<=5?diff:5);
	}
	else return res;
};

function dateFromMySQL(val)
{
if( val=='' ) return null;
var y=val.substr(0,4);var m=val.substr(5,2);var d=val.substr(8,2);var hh=val.substr(11,2);var mm=val.substr(14,2);var ss=val.substr(17,2);	
var d2=new Date();d2.setFullYear(y,m-1,d);d2.setHours(hh);d2.setMinutes(mm);d2.setSeconds(ss);return d2;
};


Date.prototype.lessThan = function(d)
{
	if( !d || !d.getDate ) return false;
	var u1 = Date.UTC(this.getFullYear(),this.getMonth(),this.getDate(),this.getHours(),d.getMinutes(),0);
	var u2 = Date.UTC(d.getFullYear(),d.getMonth(),d.getDate(),d.getHours(),d.getMinutes(),0);

	return  u1<u2;
};

Date.prototype.lessThanEq = function(d)
{
	if( !d || !d.getDate ) return false;
	var u1 = Date.UTC(this.getFullYear(),this.getMonth(),this.getDate(),this.getHours(),d.getMinutes(),0);
	var u2 = Date.UTC(d.getFullYear(),d.getMonth(),d.getDate(),d.getHours(),d.getMinutes(),0);

	return  u1<=u2;
};

Date.prototype.greaterThan = function(d)
{
	if( !d || !d.getDate ) return false;
	var u1 = Date.UTC(this.getFullYear(),this.getMonth(),this.getDate(),this.getHours(),d.getMinutes(),0);
	var u2 = Date.UTC(d.getFullYear(),d.getMonth(),d.getDate(),d.getHours(),d.getMinutes(),0);

	return  u1>u2;
};

Date.prototype.greaterThanEq = function(d)
{
	if( !d || !d.getDate ) return false;
	var u1 = Date.UTC(this.getFullYear(),this.getMonth(),this.getDate(),this.getHours(),d.getMinutes(),0);
	var u2 = Date.UTC(d.getFullYear(),d.getMonth(),d.getDate(),d.getHours(),d.getMinutes(),0);

	return  u1>=u2;
};

Date.prototype.addHours = function(h)
{
	var u1 = Date.UTC(this.getFullYear(),this.getMonth(),this.getDate(),this.getHours(),this.getMinutes(),0);
	return new Date(u1 + (2*3600000));
};
