
var format		= 'eu';
var days		= new Array('Po', 'Út', 'St', 'Čt', 'Pá', 'So', 'Ne');
var months		= new Array('Leden','Únor','Březen','Duben','Květen','Červen','Červenec',
		'Srpen','Září','Říjen','Listopad','Prosinec');
var last_click	= new Array();
var current_month  = '';
var current_year   = '';
var last_date  = '';

//	Set date to what is in the field
var lastDates = new Array();

function calendar(id, d, highlight, adjusted)
{
	if (adjusted == undefined)
	{
		var d = new Date(d * 1000);
	}

	this.id			= id;
	lastDates[id] = 'empty field';
	this.highlight	= highlight;
	this.date_obj	= d;
	this.write		= build_calendar;
	this.total_days	= total_days;
	this.month		= d.getMonth();
	this.date		= d.getDate();
	this.day		= d.getDay();
	this.year		= d.getFullYear();
	this.hours		= d.getHours();
	this.minutes	= d.getMinutes();
	this.seconds	= d.getSeconds();
	this.date_str	= date_str;

	if (highlight == false)
	{
		this.selected_date = '';
	}
	else
	{
		this.selected_date = this.year + '' + this.month + '' + this.date;
	}

	//	Set the "selected date"
	d.setDate(1);
	this.firstDay = d.getDay();

	//then reset the date object to the correct date
	d.setDate(this.date);
}

//	Build the body of the calendar
function build_calendar()
{
	var str = '';

	//	Calendar Heading

// 	str += '<div id="cal' + this.id + '">';
	str += '<table class="calendar" cellspacing="0" cellpadding="0" border="0" >';
	str += '<tr>';
	str += '<td class="calnavleft" onClick="change_month(-1, \'' + this.id + '\')">&lt;&lt;<\/td>';
	str += '<td colspan="5" class="calheading">' + months[this.month] + ' ' + this.year + '<\/td>';
	str += '<td class="calnavright" onClick="change_month(1, \'' + this.id + '\')">&gt;&gt;<\/td>';
	str += '<\/tr>';

	//	Day Names

	str += '<tr>';

	for (i = 0; i < 7; i++)
	{
		str += '<td class="caldayheading">' + days[i] + '<\/td>';
	}

	str += '<\/tr>';

	//	Day Cells

	str += '<tr>';

// 	selDate = (last_date != '') ? last_date : this.date;
	selDate = this.date;

	for (j = 0; j < 42; j++)
	{
		var displayNum = (j - this.firstDay + 1);

		if (j < this.firstDay) // leading empty cells
		{
			str += '<td class="calblanktop">&nbsp;<\/td>';
		}
		else if (displayNum == selDate && this.highlight == true) // Selected date
		{
			str += '<td id="' + this.id +'selected" class="caldayselected" onClick="set_date(this,\'' + this.id + '\')">' + displayNum + '<\/td>';
		}
		else if (displayNum > this.total_days())
		{
			str += '<td class="calblankbot">&nbsp;<\/td>'; // trailing empty cells
		}
		else  // Unselected days
		{
			str += '<td id="" class="caldaycells" onClick="set_date(this,\'' + this.id + '\'); return false;"  onMouseOver="javascript:cell_highlight(this,\'' + displayNum + '\',\'' + this.id + '\');" onMouseOut="javascript:cell_reset(this,\'' + displayNum + '\',\'' + this.id + '\');" >' + displayNum + '<\/td>';
		}

		if (j % 7 == 6)
		{
			str += '<\/tr><tr>';
		}
	}

	str += '<\/tr>';
	str += '<\/table>';
// 	str += '<\/div>';

	return str;
}

//	Total number of days in a month
function total_days()
{
	switch(this.month)
	{
		case 1: // Check for leap year
			if ((  this.date_obj.getFullYear() % 4 == 0
				&& this.date_obj.getFullYear() % 100 != 0)
				|| this.date_obj.getFullYear() % 400 == 0)
				return 29;
			else
				return 28;
		case 3:
			return 30;
		case 5:
			return 30;
		case 8:
			return 30;
		case 10:
			return 30
		default:
			return 31;
	}
}

//	Highlight Cell on Mouseover
function cell_highlight(td, num, cal)
{
	cal = eval(cal);

	if (last_click[cal.id]  != num)
	{
		td.className = "caldaycellhover";
	}
}

//	Reset Cell on MouseOut
function cell_reset(td, num, cal)
{
	cal = eval(cal);

	if (last_click[cal.id] == num)
	{
		td.className = "caldayselected";
	}
	else
	{
		td.className = "caldaycells";
	}
}

//	Clear Field
function clear_field(id)
{
	$(id).value = '';

	if ($(id + "selected"))
	{
		$(id + "selected").className = "caldaycells";
		$(id + "selected").id = "";
	}
	cal = eval(id);
	cal.selected_date = '';
}


//	Set date to specified time
function set_to_time(id, raw)
{
	if ($(id + "selected"))
	{
		$(id + "selected").className = "caldaycells";
		$(id + "selected").id = "";
	}

	$(id + 'Cal').update();

	var nowDate = new Date();
	nowDate.setTime = raw * 1000;

	current_month	= nowDate.getMonth();
	current_year	= nowDate.getFullYear();
	current_date	= nowDate.getDate();

	oldcal = eval(id);
	oldcal.selected_date = current_year + '' + current_month + '' + current_date;

	cal = new calendar(id, nowDate, true, true);
	cal.selected_date = current_year + '' + current_month + '' + current_date;

	last_date = cal.date;

	$(id + 'Cal').update(cal.write());
	// nastavit pri vyberu schovani kalendare
	$$('.caldaycells, .caldayselected').each(function(el){
			el.observe('click',hideCalendars);
		}, this);

	insert_date(cal);
}

function update_calendar(id, dateValue)
{
	if(!dateValue) dateValue = $F(id);

	if (lastDates[id] == dateValue) return;

	lastDates[id] = dateValue;

	var fieldString = dateValue.replace(/\s+/g, ' ');

	while (fieldString.substring(0,1) == ' ')
	{
		fieldString = fieldString.substring(1, fieldString.length);
	}

	var dateString = fieldString.split(' ');
	var dateParts = dateString[0].split('.')

	if (dateParts.length < 3){
		var _date = new Date();
		dateParts[0] = ''+_date.getDate();
		dateParts[1] = ''+(_date.getMonth()+1);
		dateParts[2] = ''+_date.getFullYear();
	}
	var newDay   = dateParts[0];
	var newMonth = dateParts[1];
	var newYear  = dateParts[2];

	if (isNaN(newDay)  || newDay < 1 || (newDay.length != 1 && newDay.length != 2)) return;
	if (isNaN(newYear) || newYear < 1 || newYear.length != 4) return;
	if (isNaN(newMonth) || newMonth < 1 || (newMonth.length != 1 && newMonth.length != 2)) return;

	if (newMonth > 12) newMonth = 12;

	if (newDay > 28)
	{
		switch(newMonth - 1)
		{
			case 1: // Check for leap year
				if ((newYear % 4 == 0 && newYear % 100 != 0) || newYear % 400 == 0)
				{
					if (newDay > 29) newDay = 29;
				}
				else
				{
					if (newDay > 28) newDay = 28;
				}
			case 3:
				if (newDay > 30) newDay = 30;
			case 5:
				if (newDay > 30) newDay = 30;
			case 8:
				if (newDay > 30) newDay = 30;
			case 10:
				if (newDay > 30) newDay = 30;
			default:
				if (newDay > 31) newDay = 31;
		}
	}

	if ($(id + "selected"))
	{
		$(id + "selected").className = "caldaycells";
		$(id + "selected").id = "";
	}


	$(id + 'Cal').update();

	var nowDate = new Date();
	nowDate.setDate(newDay);
	nowDate.setMonth(newMonth - 1);
	nowDate.setYear(newYear);
	nowDate.setHours(12);

	var cal = eval(id);
	cal.date_obj = nowDate;
	cal.date = newDay;
	current_month	= nowDate.getMonth();
	current_year	= nowDate.getFullYear();

	cal.selected_date = cal.date_obj.getFullYear() + '' + cal.date_obj.getMonth() + '' + cal.date;
	change_month(0, id);
}

//	Set the date
function set_date(td, cal)
{
	cal = eval(cal);

	// If the user is clicking a cell that is already
	// selected we'll de-select it and clear the form field

	if (last_click[cal.id] == td.firstChild.nodeValue)
	{
		td.className = "caldaycells";
		last_click[cal.id] = '';
		remove_date(cal);
		cal.selected_date =  '';
		return;
	}

	// Onward!
	if ($(cal.id + "selected"))
	{
		$(cal.id + "selected").className = "caldaycells";
		$(cal.id + "selected").id = "";
	}

	td.className = "caldayselected";
	td.id = cal.id + "selected";

	cal.selected_date = cal.date_obj.getFullYear() + '' + cal.date_obj.getMonth() + '' + cal.date;
	cal.date_obj.setDate(td.firstChild.nodeValue);
	cal = new calendar(cal.id, cal.date_obj, true, true);
	cal.selected_date = cal.date_obj.getFullYear() + '' + cal.date_obj.getMonth() + '' + cal.date;

	last_date = cal.date;

	//cal.date
	last_click[cal.id] = cal.date;

	// Insert the date into the form
	insert_date(cal);
}

//	Insert the date into the form field
function insert_date(cal)
{
	cal = eval(cal);
	fval = $(cal.id);

	if (fval.value == '')
	{
		fval.value = cal.date_str();
	}
	else
	{
// 		time = fval.value.substring(10);
// 		new_date = cal.date_str('n') + time;
		new_date = cal.date_str('n');
		fval.value = new_date;
	}
}

//	Remove the date from the form field
function remove_date(cal)
{
	cal = eval(cal);
	fval = $(cal.id);
	fval.value = '';
}

//	Change to a new month
function change_month(mo, cal)
{
	cal = eval(cal);

	if (current_month != '')
	{
		cal.date_obj.setMonth(current_month);
		cal.date_obj.setYear(current_year);

		current_month	= '';
		current_year	= '';
	}

	var newMonth = cal.date_obj.getMonth() + mo;
	var newDate  = cal.date_obj.getDate();

	if (newMonth == 12)
	{
		cal.date_obj.setYear(cal.date_obj.getFullYear() + 1)
		newMonth = 0;
	}
	else if (newMonth == -1)
	{
		cal.date_obj.setYear(cal.date_obj.getFullYear() - 1)
		newMonth = 11;
	}

	if (newDate > 28)
	{
		var newYear = cal.date_obj.getFullYear();

		switch(newMonth)
		{
			case 1: // Check for leap year
				if ((newYear % 4 == 0 && newYear % 100 != 0) || newYear % 400 == 0)
				{
					if (newDate > 29) newDate = 29;
				}
				else
				{
					if (newDate > 28) newDate = 28;
				}
			case 3:
				if (newDate > 30) newDate = 30;
			case 5:
				if (newDate > 30) newDate = 30;
			case 8:
				if (newDate > 30) newDate = 30;
			case 10:
				if (newDate > 30) newDate = 30;
			default:
				if (newDate > 31) newDate = 31;
		}
	}

	cal.date_obj.setDate(newDate);
	cal.date_obj.setMonth(newMonth);
	new_mdy	= cal.date_obj.getFullYear() + '' + cal.date_obj.getMonth() + '' + cal.date;

	highlight = (cal.selected_date == new_mdy) ? true : false;

	cal = new calendar(cal.id, cal.date_obj, highlight, true);
	$(cal.id + 'Cal').update(cal.write());
	// nastavit pri vyberu schovani kalendare
	$$('.caldaycells, .caldayselected').each(function(el){
			el.observe('click',hideCalendars);
		}, this);

}

//	Finalize the date string
function date_str(time)
{
	var month = this.month + 1;
	if (month < 10)
		month = '0' + month;

	var day		= (this.date  < 10) 	?  '0' + this.date		: this.date;
	var minutes	= (this.minutes  < 10)	?  '0' + this.minutes	: this.minutes;

	if (format == 'us')
	{
		var hours	= (this.hours > 12) ? this.hours - 12 : this.hours;
		var ampm	= (this.hours > 11) ? 'PM' : 'AM'
	}
	else
	{
		var hours	= this.hours;
		var ampm	= '';
	}

	if (time == 'y')
	{
		return this.year + '-' + month + '-' + day + '  ' + hours + ':' + minutes + ' ' + ampm;
	}
	else
	{
		return day + '.' + month + '.' + this.year ;
	}
}