/*******************************************************************/
/***                                                             ***/
/***   datepicker.js - Kalendarz (selektor daty)                 ***/
/***                                                             ***/
/***   Wersja           : 1.2                                    ***/
/***   Data utworzenia 	: 12.09.2009                             ***/
/***   Data modyfikacji	: 31.03.2010                             ***/
/***   Prawa autorskie  : Agencja interaktywna Scripting         ***/
/***   WWW              : http://www.scripting.pl                ***/
/***                                                             ***/
/*******************************************************************/

/**
 * Rozszerzenia klasy Date
**/

/**
 * Zwrócenie aktualnie ustawionej daty jako obiektu
 * posiadającego atrybuty day, month, year
**/
Date.prototype.getFullDate = function()
{
	var day = this.getDate();
	var month = this.getMonth()+1;
	var year = this.getFullYear();
	
	if(day < 10)
	day = '0' + day;
	
	if(month < 10)
	month = '0' + month;
	
	return String(year +'-'+ month +'-'+ day);
}

/**
 * Pobranie ilości dni w miesiącu na podstawie ustawionej daty
**/
Date.prototype.daysInMonth = function()
{
	return 32 - new Date(this.getFullYear(), this.getMonth(), 32).getDate();
}

function datePicker(fieldName, initDate, show)
{
	this.year = 0;
	this.month = 0;
	this.day = 0;
	
	this.todayYear = 0;
	this.todayMonth = 0;
	this.todayDay = 0;
	
	this.navigationYear = 0;
	this.navigationMonth = 0;
	
	this.fieldName = fieldName;
	this.fieldElem = $(fieldName);
	this.pickerElem = $(fieldName+'Calendar');
	this.buttonElem = $(fieldName+'PickerButton');
	this.buttonContainer = $(fieldName+'Button');
	
	this.monthsNames = new Array('Styczeń', 'Luty', 'Marzec', 'Kwiecień', 'Maj', 'Czerwiec', 'Lipiec', 'Sierpień', 'Wrzesień', 'Październik', 'Listopad', 'Grudzień');
	this.daysNames = new Array('Pn', 'Wt', 'Śr', 'Cz', 'Pi', 'So', 'Nd');
	
	this.built = false;

	if(initDate)
	{
		initDateArray = initDate.split('-')
		
		if(initDateArray.length == 3 && initDateArray[0].length == 4 && initDateArray[1].length == 2 && initDateArray[2].length == 2)
		{
			this.year = initDateArray[0];
			this.month = initDateArray[1];
			this.day = initDateArray[2];
		}
	}
	
	todayDateArray = new Date().getFullDate().split('-');
	
	this.todayYear = todayDateArray[0];
	this.todayMonth = todayDateArray[1];
	this.todayDay = todayDateArray[2];
	
	if(this.year > 0 && this.month > 0)
	{
		this.navigationYear = this.year;
		this.navigationMonth = this.month;
	}
	else
	{
		this.navigationYear = this.todayYear;
		this.navigationMonth = this.todayMonth;
	}
	
	this.increaseYear = function()
	{
		this.navigationYear++;
		this.buildCalendar();
	}
	
	this.decreaseYear = function()
	{
		this.navigationYear--;
		this.buildCalendar();
	}
	
	this.changeYear = function(year)
	{
		if(year.length < 4)
		return;
		
		this.navigationYear = year;
		this.buildCalendar();
	}
	
	this.increaseMonth = function()
	{
		this.navigationMonth++;
		
		if(this.navigationMonth > 12)
		{
			this.navigationMonth = 1;
			this.increaseYear();
		}
		
		if(this.navigationMonth < 10)
		this.navigationMonth = '0'+this.navigationMonth;

		this.buildCalendar();
	}
	
	this.decreaseMonth = function()
	{
		this.navigationMonth--;
		
		if(this.navigationMonth < 1)
		{
			this.navigationMonth = 12;
			this.decreaseYear();
		}
		
		if(this.navigationMonth < 10)
		this.navigationMonth = '0'+this.navigationMonth;

		this.buildCalendar();
	}
	
	this.buildCalendar = function()
	{
		if(!this.fieldElem || !this.pickerElem)
		return alert('Błąd: nie można utworzyć kalendarza.');

		htmlYear = '<input type="button" value="&laquo;" onclick="'+this.fieldName+'DatePicker.decreaseYear();" class="button datepicker-calendar-year-increase-button" /><input type="text" id="" value="'+ this.navigationYear +'" size="4" maxlength="4" class="text datepicker-calendar-year" onkeyup="'+this.fieldName+'DatePicker.changeYear(this.value);" /><input type="button" value="&raquo;" onclick="'+this.fieldName+'DatePicker.increaseYear();" class="button datepicker-calendar-year-decrease-button" />';
		htmlMonth = '<input type="button" value="&laquo;" onclick="'+this.fieldName+'DatePicker.decreaseMonth();" class="button datepicker-calendar-month-decrease-button" /><input type="text" id="" value="'+ this.monthsNames[this.navigationMonth-1] +'" size="9" readonly class="text datepicker-calendar-month" /><input type="button" value="&raquo;" onclick="'+this.fieldName+'DatePicker.increaseMonth();" class="button datepicker-calendar-month-decrease-button" />';

		daysNamesHeader = '';
		
		for(i=0; i<this.daysNames.length; i++)
		daysNamesHeader = daysNamesHeader + '<th class="datepicker-calendar-day-header">'+ this.daysNames[i] +'</th>';
		
		daysList = new Array();
		skipDays = new Date(this.navigationYear, this.navigationMonth-1, 1).getDay() - 1;
		
		for(i=1; i<=skipDays; i++)
		daysList[daysList.length] = '';

		daysInMonth = new Date(this.navigationYear, this.navigationMonth-1).daysInMonth();
		
		for(i=1; i<=daysInMonth; i++)
		daysList[daysList.length] = i;
		
		fillDays = 7 - daysList.length % 7;
		
		for(i=1; i<=fillDays % 7; i++)
		daysList[daysList.length] = '';
		
		htmlDaysCells = '';
		
		for(i=0; i<daysList.length; i++)
		{
			if(i > 0 && i % 7 == 0)
			htmlDaysCells = htmlDaysCells + '</tr>';

			if(i < daysList.length && i % 7 == 0)
			htmlDaysCells = htmlDaysCells + '<tr>';
			
			if(!daysList[i])
			htmlDaysCells = htmlDaysCells + '<td class="datepicker-calendar-day-cell">&nbsp;</td>';
			else
			{
				if(daysList[i] < 10)
				navigationDay = '0'+daysList[i];
				else
				navigationDay = daysList[i];
				
				buttonStyles = '';
				
				if(this.year == this.navigationYear && this.month == this.navigationMonth && this.day == navigationDay)
				buttonStyles = buttonStyles + 'current' + ' ';
				
				if(this.todayYear == this.navigationYear && this.todayMonth == this.navigationMonth && this.todayDay == navigationDay)
				buttonStyles = buttonStyles + 'today' + ' ';

				htmlDaysCells = htmlDaysCells + '<td class="datepicker-calendar-day-cell"><input class="'+ buttonStyles +'button datepicker-calendar-day-button" type="button" value="'+ daysList[i] +'" onclick="'+this.fieldName+'DatePicker.select(\''+ this.navigationYear +'\', \''+ this.navigationMonth +'\', \''+ navigationDay +'\', true);" /></td>';
			}
		}
		
		htmlDays = '<div class="days"><table cellspacing="0" class="datepicker-calendar-table"><tr>' + daysNamesHeader +'</tr><tr>'+ htmlDaysCells +'</tr></table></div>';
				
		this.pickerElem.innerHTML = '<div class="datepicker-calendar"><div class="years">'+ htmlYear +'</div><div class="months">'+ htmlMonth +'</div>'+ htmlDays + '</div>';
		
		this.built = true;
	}
	
	this.select = function(year, month, day, hide)
	{
		this.year = year;
		this.month = month;
		this.day = day;

		this.fieldElem.value = year +'-'+ month +'-'+ day;
		
		if(hide === true)
		this.hideCalendar();
	}
	
	this.showCalendar = function()
	{
		if(this.build !== true)
		this.buildCalendar();

		if(this.built === true)
		this.pickerElem.style.display = 'block';

		this.buttonContainer.innerHTML = '<input type="button" value="&laquo;" id="'+this.fieldName+'PickerButton" onclick="'+this.fieldName+'DatePicker.hideCalendar();" />';
	}
	
	this.hideCalendar = function()
	{
		if(this.built === true)
		this.pickerElem.style.display = 'none';

		this.buttonContainer.innerHTML = '<input type="button" value="&raquo;" id="'+this.fieldName+'PickerButton" onclick="'+this.fieldName+'DatePicker.showCalendar();" />';
	}

	if(show === true)
	this.showCalendar();
}


