﻿// JavaScript Document

var DatePicker = new Object();

DatePicker.todayDate        = new Date();
DatePicker.currentDate      = null;
DatePicker.seldDate         = null;
DatePicker.callback         = null;
DatePicker.offsetTop        = "-500px";
DatePicker.offsetLeft       = "-500px";

DatePicker.defaultLocale = "pl-PL";
DatePicker.locale = DatePicker.defaultLocale;

DatePicker.locales = [
	"en-US",
	"it-IT",
	"pl-PL"
];

DatePicker.shortLocales = ["en", "it", "pl"];

DatePicker.windowTitle = "Wybierz datę";

// Leap and Non-Leap year Month days..
DatePicker.NonLeapYearMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
DatePicker.LeapYearMonthDays    = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

DatePicker.DayNames = new Array();
DatePicker.DayNames["en-US"] = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
DatePicker.DayNames["it-IT"] = ["Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"];
DatePicker.DayNames["pl-PL"] = ["Nd",  "Pn",  "Wt",  "Śr",  "Cz",  "Pt",  "So" ];

DatePicker.MonthNames = new Array();
DatePicker.MonthNames["en-US"] = ["January", "February", "March",  "April",    "May", "June",     "July",   "August",   "September", "October",     "November", "December"];
DatePicker.MonthNames["it-IT"] = ["Gennaio", "Febbraio", "Marzo",  "Aprile",   "Può", "Giugno",   "Luglio", "Agosto",   "Settembre", "Ottobre",     "Novembre", "Dicembre"];
DatePicker.MonthNames["pl-PL"] = ["Styczeń", "Luty",     "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień",  "Październik", "Listopad", "Grudzień"];


// sets global locale (date format)
DatePicker.setLocale = function (myLocale) {
	this.locale = this.getLocaleSymbol(myLocale);
}


// retrieves selected date in short format (two-digits year)
DatePicker.getShortDate = function (myLocale) {
	myLocale  = this.getLocaleSymbol(myLocale);
	var day   = this.currentDate.getDate();
	var month = this.currentDate.getMonth() + 1;
	var year  = new String(this.currentDate.getFullYear());
	var day_long   = (day   < 10 ? "0" + new String(day)   : day);
	var month_long = (month < 10 ? "0" + new String(month) : month);
	
	year = year.substr(2, 2);

	if (myLocale == "en-US") return new String(year_long    + "-" + month_long + "-" + day_long);
	if (myLocale == "it-IT") return new String(day    + "/" + month + "/" + year);
	if (myLocale == "pl-PL") return new String(day    + "-" + month + "-" + year);
}


// retrieves selected date
DatePicker.getLongDate = function (myLocale) {
	myLocale  = this.getLocaleSymbol(myLocale);
	var day   = this.currentDate.getDate();
	var month = this.currentDate.getMonth() + 1;
	var year  = this.currentDate.getYear();
	
	var day_long   = (day   < 10 ? "0" + new String(day)   : day);
	var month_long = (month < 10 ? "0" + new String(month) : month);
	var year_long  = this.currentDate.getFullYear();

	if (myLocale == "en-US") return new String(year_long + "-" + month_long + "-" + day_long);
	if (myLocale == "it-IT") return new String(day       + "/" + month      + "/" + year_long);
	if (myLocale == "pl-PL") return new String(year_long + "-" + month_long + "-" + day_long);
}

DatePicker.setLongDate = function(dateString) {
	try {
		var dt = new Date(dateString);
		if (dt != null) this.currentDate = dt;
	} catch(ex) {}
}


DatePicker.getSelectedDate = function() {
	return this.currentDate;
}



DatePicker.getSelectedDay   = function() { return this.currentDate.getDate(); }
DatePicker.getSelectedMonth = function() { return this.currentDate.getMonth() + 1; }
DatePicker.getSelectedYear  = function() { return this.currentDate.getFullYear(); }




DatePicker.isLocaleSupported = function(myLocale) {
	var isSupported = false;
	for (var i=0; i<this.locales.length; i++) {
		if (this.locales[i] == myLocale) return true;
	}
	for (var i=0; i<this.shortLocales.length; i++) {
		if (this.shortLocales[i] == myLocale) return true;
	}
	return false;
}



DatePicker.getLocaleSymbol = function(shortLocaleSymbol) {
	if (shortLocaleSymbol == "en") return "en-US";
	if (shortLocaleSymbol == "it") return "it-IT";
	if (shortLocaleSymbol == "pl") return "pl-PL";
	if (shortLocaleSymbol == "en-US") return shortLocaleSymbol;
	if (shortLocaleSymbol == "it-IT") return shortLocaleSymbol;
	if (shortLocaleSymbol == "pl-PL") return shortLocaleSymbol;
	return DatePicker.locale;
}


// 	Check for leap year ..
//	1.Years evenly divisible by four are normally leap years, except for... 
//	2.Years also evenly divisible by 100 are not leap years, except for... 
//	3.Years also evenly divisible by 400 are leap years. 
DatePicker.getDaysOfMonth = function (month, year) {
	var isLeapYear = false;
	if ( (year%4==0) && !( (year%100)==0 && (year%400)!=0) ) {
		isLeapYear = true;
	}
	return (isLeapYear 
		? DatePicker.LeapYearMonthDays[month]
		: DatePicker.NonLeapYearMonthDays[month]);
}


// -------- EVENT HANDLERS ----------
DatePicker.monthNext = function() {
	this.currentDate.setMonth(this.currentDate.getMonth() +1);
	this.show();
}

DatePicker.monthPrev = function() {
	this.currentDate.setMonth(this.currentDate.getMonth() -1);
	this.show();
}

DatePicker.yearNext = function() {
	this.currentDate.setFullYear(this.currentDate.getFullYear() +1);
	this.show();
}

DatePicker.yearPrev = function() {
	this.currentDate.setFullYear(this.currentDate.getFullYear() -1);
	this.show();
}

DatePicker.dayClicked = function(dayNumber) {
	this.parentElement.style.display = "none";
	this.currentDate.setDate(dayNumber);
	this.callback();
	this.currentDate = new Date();
}

DatePicker.closeClicked = function() {
	this.currentDate = null;
	this.parentElement.style.display = "none";
}



DatePicker.init  = function() {
	this.parentElement = document.createElement("DIV");
	this.parentElement.style.position = "absolute";
	this.parentElement.style.display  = "none";
	document.body.appendChild(this.parentElement);
}



// element - dhtml element which will contain rendered table
DatePicker.show = function () {
	if (this.currentDate == null) {
		this.currentDate = new Date();
	}
	var month = this.currentDate.getMonth();
	var year  = this.currentDate.getFullYear();

	this.todayDate.setMinutes(1);
	this.todayDate.setHours(1);
	this.todayDate.setSeconds(1);
	this.currentDate.setMinutes(1);
	this.currentDate.setHours(1);
	this.currentDate.setSeconds(1);

	var navbarHTML = this.buildNavbar(month, year);
	var daysHTML   = this.buildMonth(month, year);
	
	this.parentElement.innerHTML =
		"<table cellpadding='0' cellspacing='0' style='background-color: silver'><tr><td class='DatePickerTable'>"
			+ navbarHTML + daysHTML   +
		"</td></tr></table>";
		
	this.parentElement.style.top  = DatePicker.offsetTop   + "px";
	this.parentElement.style.left = DatePicker.offsetLeft  + "px";
	this.parentElement.style.display = "block";
}


// renders bar with months and years
DatePicker.buildNavbar = function (month, year) {
	var s =
		"<table width='100%' cellpadding='0' cellspacing='0' class='DatePickerNavbarTable'>" + 
		"    <tr>" + 
		"        <td colspan='4' align='left' valign='top' onClick='' class='DatePickerTitleBar'>" + 
					DatePicker.windowTitle  +
		"        </td>" + 
		"        <td colspan='3' align='right' valign='top' onClick='' class='DatePickerTitleBar'>" + 
		"            <a href='javascript:DatePicker.closeClicked()' class='DatePickerTitleBarCloseLink'>X</a>" + 
		"        </td>" + 
		"    </tr>" +
		
		"    <tr> " + 
		"        <td align='center' class='DatePickerMonthPrevCell' width='9%'>" + 
		"            <a href='javascript:void(0)' onMouseUp='DatePicker.monthPrev()' class='DatePickerMonthPrevLink'>&lt;&lt;</a>" + 
		"        </td>" + 
		"        <td align='center' class='DatePickerMonthCell' width='40%'> " + DatePicker.MonthNames[this.locale][month] + " </td>" + 
		"        <td align='center' class='DatePickerMonthNextCell' width='9%'>" + 
		"            <a href='javascript:void(0)' onMouseUp='DatePicker.monthNext()' class='DatePickerMonthNextLink'>&gt;&gt;</a>" + 
		"        </td>"+

		"        <td width='4%'>&nbsp;</td>" + 

		"        <td align='center' class='DatePickerYearPrevCell' width='9%'>" + 
		"            <a href='javascript:void(0)' onMouseUp='DatePicker.yearPrev()' class='DatePickerYearPrevLink'>&lt;&lt;</a>" + 
		"        </td>" + 
		"        <td align='center' class='DatePickerYearCell' width='20%'> " + new String(year) + " </td>" + 
		"        <td align='center' class='DatePickerYearNextCell' width='9%'>" + 
		"            <a href='javascript:void(0)' onMouseUp='DatePicker.yearNext()' class='DatePickerYearNextLink'>&gt;&gt;</a>" + 
		"        </td>" + 
		"    </tr> " + 
		"</table>";
	return s;
}


// renders all days within given month
DatePicker.buildMonth = function (month, year) {
	var daysInMonth = this.getDaysOfMonth(month, year);
	
	var vDate = new Date();
	vDate.setDate(1);
	vDate.setMonth(month);
	vDate.setFullYear(year);
	
	var currSysDate  = new Date();
	var firstWeekday = vDate.getDay();
	
	var s = "<table class='DatePickerMonthTable' cellpadding='0' cellspacing='0'> <tr>";
	for (i=0; i<7; i++) {
		s += " <td class='DatePickerDaysNames'>" + DatePicker.DayNames[this.locale][i] + "</td>";
	}
	s += "</tr><tr>";
	
	for (i=0; i<firstWeekday; i++) {
		s += "<td class='DatePickerPrevMonthDay'>&nbsp;</td>";
	}
		
	for (i=0; i<daysInMonth; i++) {
		var j = i + firstWeekday;
		vDate.setDate(i);
		var k = i + 1;
		if (j % 7 == 0 && i != 0) s += "</tr> <tr>";  // this is end of week, begin new row
		
		var dayCssClass = "DatePickerDay";
		var dayCssClassLink = "DatePickerDayLink";
		if (j % 7 == 0) {
			dayCssClass     = "DatePickerSunday";
			dayCssClassLink = "DatePickerSundayLink";
		}
		if (j % 7 == 6) {
			dayCssClass     = "DatePickerSaturday";
			dayCssClassLink = "DatePickerSaturdayLink";
		}
		var clickElement = 
			"<a href='javascript:void(0)' " + 
			"	onMouseUp='DatePicker.dayClicked(" + k + ")'" +
			"	class='" + dayCssClassLink +"'>" + k + "</a>";
		
		if (   this.todayDate.getDate() == (i+1)
		    && (vDate.getMonth()+1) == this.todayDate.getMonth()
			&& vDate.getFullYear()  == this.todayDate.getFullYear() ) dayCssClass = "DatePickerDayToday";
		
		s += "<td class='" + dayCssClass + "'>" + clickElement + "</td>";
	}
	
	var restDays = (firstWeekday + daysInMonth)%7;
	for (i=0; (i<7-restDays) && restDays != 0; i++) {
		s += "<td class='DatePickerNextMonthDay'>&nbsp;</td>";
	}
	s += "</tr></table>";

	return s;
}



// these functions are copied from other library
// and are not a part of DatePicker

function getOffsetTop (element) {
	var mOffsetTop    = element.offsetTop;
	var mOffsetParent = element.offsetParent;

	while(mOffsetParent){
		mOffsetTop   += mOffsetParent.offsetTop;
		mOffsetParent = mOffsetParent.offsetParent;
	}
	return mOffsetTop;
}


function getOffsetLeft (element) {
	var mOffsetLeft   = element.offsetLeft;
	var mOffsetParent = element.offsetParent;

	while(mOffsetParent){
		mOffsetLeft  += mOffsetParent.offsetLeft;
		mOffsetParent = mOffsetParent.offsetParent;
	}
	return mOffsetLeft;
}
