/*
datepicker.js
Last modified: 26/02/2006
*/
Date.monthNames=new Array('January','February','March','April','May','June','July','August','September','October','November','December');Date.monthAbbreviations=new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');Date.dayNames=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');Date.dayAbbreviations=new Array('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
Date.$VERSION = 1.0;
Date.LZ=function(x){return(x<0||x>9?"":"0")+x};Date.monthNames=new Array('January','February','March','April','May','June','July','August','September','October','November','December');Date.monthAbbreviations=new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');Date.dayNames=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');Date.dayAbbreviations=new Array('Sun','Mon','Tue','Wed','Thu','Fri','Sat');Date.preferAmericanFormat=true;if(!Date.prototype.getFullYear){Date.prototype.getFullYear=function(){var yy=this.getYear();return(yy<1900?yy+1900:yy);}}
Date.parseString=function(val,format){if(typeof(format)=="undefined"||format==null||format==""){var generalFormats=new Array('y-M-d','MMM d, y','MMM d,y','y-MMM-d','d-MMM-y','yyyy-MM-dd HH:mm:ss','yyyyMMddHHmmss','MMM d','MMM-d','d-MMM');var monthFirst=new Array('M/d/y','M-d-y','M.d.y','M/d','M-d');var dateFirst=new Array('d/M/y','d-M-y','d.M.y','d/M','d-M');var checkList=new Array(generalFormats,Date.preferAmericanFormat?monthFirst:dateFirst,Date.preferAmericanFormat?dateFirst:monthFirst);for(var i=0;i<checkList.length;i++){var l=checkList[i];for(var j=0;j<l.length;j++){var d=Date.parseString(val,l[j]);if(d!=null){return d;}}}return null;}this.isInteger=function(val){for(var i=0;i<val.length;i++){if("1234567890".indexOf(val.charAt(i))==-1){return false;}}return true;};this.getInt=function(str,i,minlength,maxlength){for(var x=maxlength;x>=minlength;x--){var token=str.substring(i,i+x);if(token.length<minlength){return null;}if(this.isInteger(token)){return token;}}return null;};val=val+"";format=format+"";var i_val=0;var i_format=0;var c="";var token="";var token2="";var x,y;var year=new Date().getFullYear();var month=1;var date=1;var hh=0;var mm=0;var ss=0;var ampm="";while(i_format<format.length){c=format.charAt(i_format);token="";while((format.charAt(i_format)==c)&&(i_format<format.length)){token+=format.charAt(i_format++);}if(token=="yyyy"||token=="yy"||token=="y"){if(token=="yyyy"){x=4;y=4;}if(token=="yy"){x=2;y=2;}if(token=="y"){x=2;y=4;}year=this.getInt(val,i_val,x,y);if(year==null){return null;}i_val+=year.length;if(year.length==2){if(year>=70){year=1900+(year-0);}else{year=2000+(year-0);}}}else if(token=="MMM"||token=="NNN"){month=0;var names=(token=="MMM"?Date.monthNames:Date.monthAbbreviations);for(var i=0;i<names.length;i++){var month_name=names[i];if(val.substring(i_val,i_val+month_name.length).toLowerCase()==month_name.toLowerCase()){month=i+1;i_val+=month_name.length;break;}}if((month<1)||(month>12)){return null;}}else if(token=="EE"||token=="E"){var names=(token=="EE"?Date.dayNames:Date.dayAbbreviations);for(var i=0;i<names.length;i++){var day_name=names[i];if(val.substring(i_val,i_val+day_name.length).toLowerCase()==day_name.toLowerCase()){i_val+=day_name.length;break;}}}else if(token=="MM"||token=="M"){month=this.getInt(val,i_val,token.length,2);if(month==null||(month<1)||(month>12)){return null;}i_val+=month.length;}else if(token=="dd"||token=="d"){date=this.getInt(val,i_val,token.length,2);if(date==null||(date<1)||(date>31)){return null;}i_val+=date.length;}else if(token=="hh"||token=="h"){hh=this.getInt(val,i_val,token.length,2);if(hh==null||(hh<1)||(hh>12)){return null;}i_val+=hh.length;}else if(token=="HH"||token=="H"){hh=this.getInt(val,i_val,token.length,2);if(hh==null||(hh<0)||(hh>23)){return null;}i_val+=hh.length;}else if(token=="KK"||token=="K"){hh=this.getInt(val,i_val,token.length,2);if(hh==null||(hh<0)||(hh>11)){return null;}i_val+=hh.length;hh++;}else if(token=="kk"||token=="k"){hh=this.getInt(val,i_val,token.length,2);if(hh==null||(hh<1)||(hh>24)){return null;}i_val+=hh.length;hh--;}else if(token=="mm"||token=="m"){mm=this.getInt(val,i_val,token.length,2);if(mm==null||(mm<0)||(mm>59)){return null;}i_val+=mm.length;}else if(token=="ss"||token=="s"){ss=this.getInt(val,i_val,token.length,2);if(ss==null||(ss<0)||(ss>59)){return null;}i_val+=ss.length;}else if(token=="a"){if(val.substring(i_val,i_val+2).toLowerCase()=="am"){ampm="AM";}else if(val.substring(i_val,i_val+2).toLowerCase()=="pm"){ampm="PM";}else{return null;}i_val+=2;}else{if(val.substring(i_val,i_val+token.length)!=token){return null;}else{i_val+=token.length;}}}if(i_val!=val.length){return null;}if(month==2){if(((year%4==0)&&(year%100!=0))||(year%400==0)){if(date>29){return null;}}else{if(date>28){return null;}}}if((month==4)||(month==6)||(month==9)||(month==11)){if(date>30){return null;}}if(hh<12&&ampm=="PM"){hh=hh-0+12;}else if(hh>11&&ampm=="AM"){hh-=12;}return new Date(year,month-1,date,hh,mm,ss);}
Date.isValid=function(val,format){return(Date.parseString(val,format)!=null);}
Date.prototype.isBefore=function(date2){if(date2==null){return false;}return(this.getTime()<date2.getTime());}
Date.prototype.isAfter=function(date2){if(date2==null){return false;}return(this.getTime()>date2.getTime());}
Date.prototype.equals=function(date2){if(date2==null){return false;}return(this.getTime()==date2.getTime());}
Date.prototype.equalsIgnoreTime=function(date2){if(date2==null){return false;}var d1=new Date(this.getTime()).clearTime();var d2=new Date(date2.getTime()).clearTime();return(d1.getTime()==d2.getTime());}
Date.prototype.format=function(format){format=format+"";var result="";var i_format=0;var c="";var token="";var y=this.getYear()+"";var M=this.getMonth()+1;var d=this.getDate();var E=this.getDay();var H=this.getHours();var m=this.getMinutes();var s=this.getSeconds();var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;var value=new Object();if(y.length<4){y=""+(+y+1900);}value["y"]=""+y;value["yyyy"]=y;value["yy"]=y.substring(2,4);value["M"]=M;value["MM"]=Date.LZ(M);value["MMM"]=Date.monthNames[M-1];value["NNN"]=Date.monthAbbreviations[M-1];value["d"]=d;value["dd"]=Date.LZ(d);value["E"]=Date.dayAbbreviations[E];value["EE"]=Date.dayNames[E];value["H"]=H;value["HH"]=Date.LZ(H);if(H==0){value["h"]=12;}else if(H>12){value["h"]=H-12;}else{value["h"]=H;}value["hh"]=Date.LZ(value["h"]);value["K"]=value["h"]-1;value["k"]=value["H"]+1;value["KK"]=Date.LZ(value["K"]);value["kk"]=Date.LZ(value["k"]);if(H>11){value["a"]="PM";}else{value["a"]="AM";}value["m"]=m;value["mm"]=Date.LZ(m);value["s"]=s;value["ss"]=Date.LZ(s);while(i_format<format.length){c=format.charAt(i_format);token="";while((format.charAt(i_format)==c)&&(i_format<format.length)){token+=format.charAt(i_format++);}if(value[token]!=null){result=result+value[token];}else{result=result+token;}}return result;}
Date.prototype.getDayName=function(){return Date.dayNames[this.getDay()];}
Date.prototype.getDayAbbreviation=function(){return Date.dayAbbreviations[this.getDay()];}
Date.prototype.getMonthName=function(){return Date.monthNames[this.getMonth()];}
Date.prototype.getMonthAbbreviation=function(){return Date.monthAbbreviations[this.getMonth()];}
Date.prototype.clearTime=function(){this.setHours(0);this.setMinutes(0);this.setSeconds(0);this.setMilliseconds(0);return this;}
Date.prototype.add=function(interval,number){if(typeof(interval)=="undefined"||interval==null||typeof(number)=="undefined"||number==null){return this;}number=+number;if(interval=='y'){this.setFullYear(this.getFullYear()+number);}else if(interval=='M'){this.setMonth(this.getMonth()+number);}else if(interval=='d'){this.setDate(this.getDate()+number);}else if(interval=='w'){var step=(number>0)?1:-1;while(number!=0){this.add('d',step);while(this.getDay()==0||this.getDay()==6){this.add('d',step);}number-=step;}}else if(interval=='h'){this.setHours(this.getHours()+number);}else if(interval=='m'){this.setMinutes(this.getMinutes()+number);}else if(interval=='s'){this.setSeconds(this.getSeconds()+number);}return this;}

// Local changes
Date.preferAmericanFormat = false;
Date.prototype.isBefore = function(date2){if(date2==null){date2=new Date;}return(this.getTime()<date2.getTime());}
Date.prototype.isAfter = function(date2){if(date2==null){date2=new Date;}return(this.getTime()>date2.getTime());}
Date.parseStrings = function(val, formats){if(typeof formats!='object')formats=[formats];var d;var i=0;do{d=Date.parseString(val,formats[i++]);}while(!(d||i>=formats.length));return d;}



function GMdatePicker(input, formats)
{
	this.input = input;
	this.input.picker = this;

	if (!formats)
		this.formats = GMdatePicker.preferredFormats;
	else if (typeof formats != 'object')
		this.formats = [formats];
	else
		this.formats = formats;

	this.year = 0;
	this.month = 0;
	this.day = 0;

	this.weekstart = GMdatePicker.weekStart;

	// Create DIV
	document.write('<div class="datepicker" id="datepicker_'+input.name+'" style="position:absolute;display:none"></div>');
	this.div = document.getElementById('datepicker_'+input.name);

	// Turns weekday regarding to this.weekstart (1-Mon, 2-Tue,... if this.weekstart==1)
	// (plus optional shift in days) into standard weekday number (0-Sun, 1-Mon, ..)
	// To obtain reverse transformation (standard to shifted) use shift = -this.weekstart*2
	this.shiftWeekday = function(day, shift)
	{
		if (typeof(shift)=='undefined')
			shift = 0;
		day += this.weekstart + shift;
		day = day%7;
		if (day<0) day = 7-Math.abs(day);
		return day;
	}

	this.recalendar = function()
	{
		var thisRef = 'document.forms[\''+input.form.name+'\'].elements[\''+input.name+'\'].picker';

		var str = '';
		str += '<table cellspacing="0" width="100%"><tr><th>';
		str += '<a href="javascript:'+thisRef+'.change(\'month\',-1);">&laquo; </a>';
		str += Date.monthNames[this.month];
		str += '<a href="javascript:'+thisRef+'.change(\'month\',+1);"> &raquo;</a>';
		str += '</th><th>';
		str += '<a href="javascript:'+thisRef+'.change(\'year\',-1);">&laquo; </a>';
		str += this.year;
		str += '<a href="javascript:'+thisRef+'.change(\'year\',+1);"> &raquo;</a>';
		str += '</th></tr></table>';

		str += '<table class="calendar" cellspacing="0" width="100%"><tr>';
		for (i=0; i<7; i++)
			str += '<th'+((this.shiftWeekday(i,-1)>4)?' class="holiday"':'')+'>'+Date.dayAbbreviations[this.shiftWeekday(i)]+'</th>';
		str += '</tr>';

		var firstDay = new Date(this.year,this.month,1).getDay();
		firstDay = this.shiftWeekday(firstDay,-(2*this.weekstart));
		var lastDay = new Date(this.year,this.month+1,0).getDate();

		var dayInWeek = 0;
		var dispmonth;
		var actDate = new Date;
		var style,className;

		str += '<tr>';
		for (i=0; i<firstDay; i++)
			{ str += '<td></td>'; dayInWeek++; }
		for (i=1; i<=lastDay; i++) {
			if (dayInWeek==7)
				{ str += '</tr><tr>'; dayInWeek = 0; }
			dispmonth = 1+this.month;
			actDate.setFullYear(this.year, dispmonth-1, i);
			style = (i==this.day) ? ' id="selected"' : '';	className = '';
			className += (this.shiftWeekday(dayInWeek,-1)>4) ? 'holiday' : '';
			className += (actDate.equalsIgnoreTime(new Date)) ? ' today' : '';
			style += (className!='') ? ' class="'+className+'"' : '';
			str += '<td'+style+'><a href="javascript:'+thisRef+'.clickDate(\''+actDate.format(this.formats[0])+'\');">'+i+'</a></td>';
			dayInWeek++;
		}
		for (i=dayInWeek; i<7; i++)
			str += '<td></td>';
		str += '</tr></table>';

		this.div.innerHTML = str;
	}

	this.change = function(what, how)
	{
		if (what=='year')
			this.year += how;
		else if (what=='month')
		{
			this.month += how;
			if (this.month>11) { this.month=0; this.year++; }
			if (this.month<0) { this.month=11; this.year--; }
		}
		this.recalendar();
	}

	this.clickDate = function(str)
	{
		this.input.value = str;
		this.div.style.display = 'none';
		if (this.input.onchange)
			this.input.onchange();
		this.input.focus();
	}

	this.show = function(state)
	{
		if (typeof(state)=='undefined' || state==null)
			state = (this.div.style.display=='none');

		if (state)
		{
			// Get value
			var curDate;
			if (this.input.value != '')
			{
				curDate = Date.parseStrings(this.input.value, formats);
				if (!curDate)
					curDate = Date.parseString(this.input.value);
			}
			if (!curDate)
				curDate = new Date();

			this.year = curDate.getFullYear();
			this.month = curDate.getMonth();
			this.day = curDate.getDate();

			// Hide previous calendar
			if (typeof(GMdatePicker.activePicker)=='object' && GMdatePicker.activePicker!=null)
				GMdatePicker.activePicker.show(false);
			GMdatePicker.activePicker = this;

			this.recalendar();
			this.div.style.display = '';
		}
		else
		{
			this.div.style.display = 'none';
			GMdatePicker.activePicker = null;
		}
	}

}

GMdatePicker.weekStart = 1; // 0-Sun, 1-Mon, etc
GMdatePicker.preferredFormats = ['dd.MM.yy', 'd.M.y', 'yyyy-MM-dd HH:mm:ss', 'yyyyMMddHHmmss']; // First is used for output

