/*----------------------------------------------------------------------------\
|                          DateTimePicker V.1.0                               |
|-----------------------------------------------------------------------------|
|                          Created by Adam Kubiczek                           |
|-----------------------------------------------------------------------------|
| Fully featured component that allows to create equivalent for <select>      |
| HTML tag. This component creates multicolumn, sortable and searchable lists.|
| It may be use also as sortable and scrollable table.                        |
|-----------------------------------------------------------------------------|
|                   Copyright (c) 2004 by Empress Adam Kubiczek               |
|                         http://www.empress-software.com                     |
|-----------------------------------------------------------------------------|
| This software is provided "as is", without warranty of any kind, express or |
| implied, including  but not limited  to the warranties of  merchantability, |
| fitness for a particular purpose and noninfringement. In no event shall the |
| authors or  copyright  holders be  liable for any claim,  damages or  other |
| liability, whether  in an  action of  contract, tort  or otherwise, arising |
| from,  out of  or in  connection with  the software or  the  use  or  other |
| dealings in the software.                                                   |
|#############################################################################|
| This  software is  available under the commercial license that permits      |
| the holder the right to use  the software in a commercial context.          |
|#############################################################################|
| Files:                                                                      |
|        datetimepicker.js (this file)                                        |
|        datetimepicker.css (defining component's look in CSS))               |
\----------------------------------------------------------------------------*/


var DateTimePicker = {
	all       : {},
	idCounter : 0,
	shown     : false,
	idPrefix  : "ems-datetime-picker-",
	getId     : function() { return DateTimePicker.idPrefix + DateTimePicker.idCounter; },
	changeMonth   : function (objid,delta) { 			
		DateTimePicker.all[objid].changeMonth(delta);
	},
	changeYear   : function (objid,delta) {
		DateTimePicker.all[objid].changeYear(delta);
	},
	getCalendarTable : function (objid) {
		return DateTimePicker.all[objid].makeCalendarTable();
	},
	dayClicked : function(objid,d,m,y) {
		DateTimePicker.all[objid].dayClicked(d,m,y);
	},
	closeCalendar : function(objid) { 
	    if (!DateTimePicker.all[DateTimePicker.getId()].dontCloseYet) {
	       DateTimePicker.all[DateTimePicker.getId()].removeDiv();
	       emsDateTimePicker=null;
	       DateTimePicker.shown=false;
	    } else {
            DateTimePicker.all[DateTimePicker.getId()].dontCloseYet=false;
        }
	},
	Show : function (e,targetid1,targetid2,targetid3) {
	    if (DateTimePicker.shown) {
	       DateTimePicker.all[DateTimePicker.getId()].removeDiv();
	       emsDateTimePicker=null;
	    }
	    emsDateTimePicker=new EmsDateTimePicker();
	    emsDateTimePicker.Display(e,targetid1,targetid2,targetid3);
	    DateTimePicker.shown=true;
	    return emsDateTimePicker;
	}
}

function EmsDateTimePicker() {

	this.Id = DateTimePicker.getId();
	DateTimePicker.all[this.Id] = this;

	this.Language="en";  //pl, en, fr, de
	this.DayNames="mid"; //"no", "full", "mid", "short"

    date=new Date();
	this.Year=date.getFullYear();
	this.Month=date.getMonth()+1;
	this.Day=date.getDate();
	this.SundayFirst=false;


	this.DateFormat='%Y-%m-%d';

	this.oYear=0;
	this.oMonth=0;
	this.oDay=0;

	this.targetElementId1=null;
	this.targetElementId2=null;
	this.targetElementId3=null;
	this.divElement=null;
	this.dontCloseYet=true;
	this.displayed=false;

	this.MonthNames = new Array("pl","en","de","fr");
	this.WeekDayNames = new Array("pl","en","de","fr");
	this.WeekDayMidNames = new Array("pl","en","de","fr");
	this.WeekDayShortNames = new Array("pl","en","de","fr");

	this.MonthNames["pl"] = new Array("Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień");
	this.WeekDayNames["pl"] = new Array("Poniedziałek", "Wtorek", "Źroda", "Czwartek", "Piątek", "Sobota", "Niedziela");
	this.WeekDayMidNames["pl"] = new Array("Pon", "Wto", "Źro", "Czw", "Pią", "Sob", "Nie");
	this.WeekDayShortNames["pl"] = new Array("P", "W", "Ź", "C", "P", "S", "N");

	this.MonthNames["en"] = new Array("January", "February", "March", "April", "May", "Juny", "July", "August", "September", "October", "November", "December");
	this.WeekDayNames["en"] = new Array("Moday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday");
	this.WeekDayMidNames["en"] = new Array("Mod", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun");
	this.WeekDayShortNames["en"] = new Array("M", "T", "W", "T", "F", "S", "S");

	this.MonthNames["de"] = new Array("Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember");
	this.WeekDayNames["de"] = new Array("Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag");
	this.WeekDayMidNames["de"] = new Array("Mon", "Die", "Mit", "Don", "Fre", "Sam", "Son");
	this.WeekDayShortNames["de"] = new Array("M", "D", "M", "M", "F", "S", "S");

	this.MonthNames["fr"] = new Array("Janvier ", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aoút", "Septembre", "Octobre", "Novembre", "Décembre");
	this.WeekDayNames["fr"] = new Array("Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi ", "Samedi", "Dimanche");
	this.WeekDayMidNames["fr"] = new Array("Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim");
	this.WeekDayShortNames["fr"] = new Array("L", "M", "M", "J", "V", "S", "D");

}

//*****************************************************************************
//public methods
//*****************************************************************************

EmsDateTimePicker.prototype.dayClicked = function (d,m,y) {
	if (this.targetElementId1!=null) {
		//var returnString=this.DateFormat;
		d=d+''; m=m+'';
		if (d.length==1) { d='0'+d; }
		if (m.length==1) { m='0'+m; }
		document.getElementById(this.targetElementId1).value=y+'-'+m+'-'+d;
		//document.getElementById(this.targetElementId2).value=m;
		//document.getElementById(this.targetElementId3).value=y;
		//document.getElementById(this.targetElementId).value=returnString;
	}
	this.removeDiv();
}

EmsDateTimePicker.prototype.removeDiv = function () {
	this.displayed=false;
	this.dontCloseYet=true;
    if (DateTimePicker.shown == true){
        document.body.removeChild(this.divElement);
    }
    DateTimePicker.shown=false;
}

EmsDateTimePicker.prototype.changeMonth = function (d) {
	this.Month+=d;
	if (this.Month>12) {
		this.Month-=12; this.Year++;
	}
	if (this.Month<1) {
		this.Month+=12; this.Year--;
	}

	document.getElementById(this.Id+'mdiv').innerHTML=this.MonthNames[this.Language][this.Month-1]+' ';
	document.getElementById(this.Id+'cdiv').innerHTML=this.makeCalendarTable();
}

EmsDateTimePicker.prototype.changeYear = function (d) {
	this.Year+=d;
	document.getElementById(this.Id+'ydiv').innerHTML=this.Year+' ';
	document.getElementById(this.Id+'cdiv').innerHTML=this.makeCalendarTable();
}


EmsDateTimePicker.prototype.makeCalendarTable = function () {

	this.oYear=this.Year;
	this.oMonth=this.Month;
	this.oDay=this.Day;

	var div='<table cellspacing="0" cellpadding="0" class="ems-date-picker" style="width:100%">';

	if (this.DayNames != "no") {
		div+='<tr>';
		for (var i=0; i<7; i++) {
			div+='<th class="weekday">'
			switch (this.DayNames) {
				case "short": div+=this.WeekDayShortNames[this.Language][i]; break;
				case "mid": div+=this.WeekDayMidNames[this.Language][i]; break;
				case "long": div+=this.WeekDayNames[this.Language][i]; break;						
			}
			div+='</th>';
		}
		
		div+='</tr>';
	}
	
	day=1;
	
	dateNow=new Date(this.Year,this.Month-1);
	dateNow.setDate(1); weekDay=dateNow.getDay();

	this.Day=1;

	if (this.SundayFirst==false) {
		if (--weekDay<0) { weekDay=6; }
	}

	div+='<tr>';

	for (x=0; x<weekDay; x++) {
		this.subOneDay();
	}

	for (x=0; x<weekDay; x++) {
		div+=this.makeTd(this.Day);
		this.addOneDay();
	}

	var sx=x;

	var rows=5; if (this.GetDaysNumber(this.Month,this.Year)-(7-weekDay)>28) { rows=6; }
	for (y=0; y<rows; y++) {
		
		for (x=sx; x<7; x++) {
			if (this.Month>this.oMonth) {
				div+=this.makeTd(this.Day);
			} else {
				div+=this.makeTd(this.Day);
			}
			this.addOneDay();
		}
		div+='</tr><tr>';
		sx=0;
	}
	div+='</tr></table>';

	this.Year=this.oYear;
	this.Month=this.oMonth;
	this.Day=this.oDay;

	return div;
}


EmsDateTimePicker.prototype.shouldBeClose = function (e) {	
    var shouldClose=true;
	if (e) {  
        var obj=e.target;
	} else if (window.event && window.event.srcElement) {
	   var obj=window.event.srcElement;
    }
    while (obj) {
        if (obj.name=="emsDateTimePicker-div") { shouldClose=false; break; }
        obj=obj.parentNode;
    } 
    if (shouldClose) {
        DateTimePicker.closeCalendar();
    }    
}


EmsDateTimePicker.prototype.Display = function (e,targetid1,targetid2,targetid3) {
	var content;
	
	document.onclick=this.shouldBeClose;
	if (targetid1!=null) { this.targetElementId1=targetid1; }
	if (targetid2!=null) { this.targetElementId2=targetid2; }
	if (targetid3!=null) { this.targetElementId3=targetid3; }
	
    content='<table cellspacing="0" cellpadding="0"><tr><td><table cellspacing="0" cellpadding="0" class="ems-date-picker" style="width:100%">';
	content+='<tr><td style="width:1%"><input id="ems-prev-button" type="button" class="ems-date-picker-button" value="<" onclick="DateTimePicker.changeMonth(\''+this.Id+'\',-1);" ondblclick="DateTimePicker.changeMonth(\''+this.Id+'\',-1);"></td>';
	content+='<td class="month" id="'+this.Id+'mdiv">'+this.MonthNames[this.Language][this.Month-1]+'</td>';
	content+='<td style="width:1%"><input type="button" class="ems-date-picker-button" value=">" onclick="DateTimePicker.changeMonth(\''+this.Id+'\',1);" ondblclick="DateTimePicker.changeMonth(\''+this.Id+'\',1);"></td>';
	content+='<td style="">&nbsp;</td>';
	content+='<td style="width:1%"><input id="ems-prev-button" type="button" class="ems-date-picker-button" value="<" onclick="DateTimePicker.changeYear(\''+this.Id+'\',-1);" ondblclick="DateTimePicker.changeYear(\''+this.Id+'\',-1);"></td>';
	content+='<td class="year" id="'+this.Id+'ydiv">'+this.Year+'</td>';
	content+='<td style="width:1%"><input type="button" class="ems-date-picker-button" value=">" onclick="DateTimePicker.changeYear(\''+this.Id+'\',1);" ondblclick="DateTimePicker.changeYear(\''+this.Id+'\',1);"></td></tr></table>';
	content+='<div id="'+this.Id+'cdiv">'+this.makeCalendarTable()+'</div></td></tr></table>';

	this.divElement=document.createElement('div');
	this.divElement.innerHTML=content; 
	this.divElement.name="emsDateTimePicker-div"; 
	this.divElement.style.zindex="999";
	this.divElement.style.position="absolute"; 
	this.divElement.style.visibility="hidden"; 
    this.divElement.style.top=0;
    this.divElement.style.left=0;	
	
	//get window size
	var windowWidth=0, windowHeight=0;
	if( typeof( window.innerWidth ) == 'number' ) {
		windowWidth = window.innerWidth;
		windowHeight = window.innerHeight;
	} else if( document.documentElement &&
	  ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
		//IE 6+ in 'standards compliant mode'
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		//IE 4 compatible
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}

	document.body.appendChild(this.divElement);
	//elementWidth=parseInt(this.divElement.scrollWidth);
	//elementHeight=parseInt(this.divElement.scrollHeight);
	elementWidth=parseInt(this.divElement.offsetWidth);
	elementHeight=parseInt(this.divElement.offsetHeight);


    element=e; x=0; y=0;
    while (element) {
        x += element.offsetLeft;
        y += element.offsetTop;
        element = element.offsetParent;
    }


// 	if (document.all) {
// 	   this.divElement.style.top=event.clientY;
// 	   this.divElement.style.left=event.clientX;
// 	} else {
// 	   this.divElement.style.top=e.offsetTop;
// 	   this.divElement.style.left=e.offsetLeft;
// 	}
    this.divElement.style.left=x+'px';
    this.divElement.style.top=y+'px';
	
// 	if (elementWidth+parseInt(this.divElement.style.left) > windowWidth) {
// 		if (windowWidth-elementWidth>0) {
// 			this.divElement.style.left=windowWidth-elementWidth;
// 		} else {
// 			this.divElement.style.left=0;
// 		}
// 	};
// 	if (elementHeight+parseInt(this.divElement.style.top) > windowHeight) {
// 		if (windowHeight-elementHeight>0) {
// 			this.divElement.style.top=windowHeight-elementHeight;
// 		} else {
// 			this.divElement.style.top=0;
// 		}
// 	};
	this.divElement.style.visibility="visible"; 
	//this.displayed=true;
}

EmsDateTimePicker.prototype.makeTd = function (day) {
	if (this.oDay==day && this.Month==this.oMonth && this.Year==this.oYear) {
		var css="today";
	}
	else if (this.Month==this.oMonth) {
		var css="currentmonth";
	} else {
		var css="nextprevmonth";
	}
	return '<td onclick="DateTimePicker.dayClicked(\''+this.Id+'\','+day+','+this.Month+','+this.Year+');" onmouseover="this.className=\''+css+'_h\'" onmouseout="this.className=\''+css+'\'" class="'+css+'">'+day+'</td>';
}

EmsDateTimePicker.prototype.subOneDay = function () {
	if (--this.Day==0) {
		if (--this.Month==0) {
			this.Month=12; this.Day=31; this.Year--;
		} else {
			this.Day=this.GetDaysNumber(this.Month,this.Year);
		}
	}
}

EmsDateTimePicker.prototype.addOneDay = function () {
	if (++this.Day>this.GetDaysNumber(this.Month,this.Year)) {
		if (++this.Month==13) {
			this.Month=1; this.Year++;
		}
		this.Day=1;
	}
}

EmsDateTimePicker.prototype.GetDaysNumber = function(month,year) {
	var DaysNumber=new Array (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	if (this.IsLeapYear(year)) {
		DaysNumber[1]=29;
	}	
	return DaysNumber[month-1];	
}

EmsDateTimePicker.prototype.IsLeapYear = function(year) {
	if ((year%4)==0) {
		if ((year%100==0) && (year%400)!=0) {
			return false;
		} else {
			return true;
		}
	} 
	return false;
}


