/*
	
	Datepicker version 0.2
	
*/

var dpThisDayDate;
var dpCurrentDate;
var dpCurrentMonth;
var dpCurrentYear;
var dpMinYear;
var dpMaxYear;

var dpMonths = new Array("Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu");
var dpDays = new Array("M","T","K","T","P","L","S");

var dpContainerId;
var dpDateInput;
var dpDayInput;
var dpMonthInput;
var dpYearInput;

var dpIsOpen = false;

/**
 * Opens the datepicker
 */
function dpOpen(id,day,month,year,yearMin,yearMax) {
/*function openDatepicker(id,date) {*/

	if(dpIsOpen)
		return false;

	dpContainerId = id;
	dpContainer = document.getElementById(id);
	
	dpBuild();
	
	dpContainer.style.display = "block";
	
	dpThisDayDate = new Date();
	
	// Gets the selected date value
	// ---------
	
	/*dpDateInput = document.getElementById(date);
	
	var dateInputValue = dpDateInput.value;
	
	if(dateInputValue)
		dpCurrentDate = dpKeyToDate(dateInputValue);
	else
		dpCurrentDate = dpThisDayDate;*/
	
	// ---------
	
	// Gets the selected date value (select elements)
	// ---------
	
	dpMinYear = yearMin;
	dpMaxYear = yearMax;
	
	dpDayInput = document.getElementById(day);
	var dayInputValue = dpDayInput[dpDayInput.selectedIndex].value;
	
	dpMonthInput = document.getElementById(month);
	var monthInputValue = dpMonthInput[dpMonthInput.selectedIndex].value;
	
	dpYearInput = document.getElementById(year);
	var yearInputValue = dpYearInput[dpYearInput.selectedIndex].value;
	
	if(dayInputValue && monthInputValue && yearInputValue) {
		var strDate = dayInputValue + "." + monthInputValue + "." + yearInputValue;
		dpCurrentDate = dpKeyToDate(strDate);
	}
	else
		dpCurrentDate = dpThisDayDate;
	
	// ---------
	
	dpSetYear(dpCurrentDate.getFullYear());
	dpSetMonth(dpCurrentDate.getMonth());
	
	dpUpdate();
}

/**
 * Closes the datepicker
 */
function dpClose() {
	dpContainer.style.display = "none";
}

/**
 * Gets the current date object
 */
function dpGetDurrentDate() {
	return dpCurrentDate;
}

/**
 * Gets the current day
 */
function dpGetDurrentDay() {
	return dpCurrentDate.getDate();
}

/**
 * Gets the current month
 */
function dpGetDurrentMonth() {
	return dpCurrentDate.getMonth() + 1;
}

/**
 * Gets the current year
 */
function dpGetDurrentYear() {
	return dpCurrentDate.getFullYear();
}


/**
 * Builds the datepicker base html
 */
function dpBuild() {
	var html = "";
	
	html += '<div class="dp">';
	html += '<div class="dpWrapper">';
	html += '<div class="dpBrowser">';
	html += '<div><a href="" onclick="dpPrevMonth(); return false;" id="dpPrev_' + dpContainerId + '"><img src="/images/datepicker_prev.gif" alt="" /></a></div>';
	html += '<div class="dpBrowserMonth" id="dpBrowserMonth_' + dpContainerId + '">Marraskuu</div>';
	html += '<div><a href="" onclick="dpNextMonth(); return false;" id="dpNext_' + dpContainerId+ '"><img src="/images/datepicker_next.gif" alt="" /></a></div>';
	html += '</div>';
	html += '<div class="dpClearer"><!-- --></div>';
	html += '<div class="dpDayContainer" id="dpDayContainer_' + dpContainerId + '">';
	
	html += '</div>';
	html += '<div class="dpClearer"><!-- --></div>';
	html += '<a href="" onclick="dpClose(); return false;" style="float: right;">Sulje [x]</a>';
	html += '<div class="dpClearer"><!-- --></div>';
	html += '</div>';
	html += '</div>';
	
	dpContainer.innerHTML = html;
}

/**
 * Updates the datepicker
 */
function dpUpdate() {
	
	var numDays = dpDaysInMonth(dpCurrentMonth,dpCurrentYear);
	var selectedClass;
	
	var dayContainer = document.getElementById("dpDayContainer_" + dpContainerId);
	
	var html = "";
	
	// Generate weekdays
	for(var i = 0; i < 7; i++)
		html += "<div class=\"dpDay dpDayHeader\">" + dpDays[i] + "</div>"
	
	// Generate empty days
	var firstDayOfMonth = new Date(dpCurrentYear,dpCurrentMonth,1);
	var weekDay = firstDayOfMonth.getDay();
	
	// Sunday
	if(weekDay == 0)
		weekDay = 7;
	
	for(var i = 1; i < weekDay; i++)
		html += "<div class=\"dpDay\"></div>";
	
	// Generate day numbers
	for(var i = 1; i <= numDays; i++) {
		if(i == dpCurrentDate.getDate() && dpCurrentMonth == dpCurrentDate.getMonth() && dpCurrentYear == dpCurrentDate.getFullYear())
			selectedClass = " class=\"dpDaySelected\"";
		else
			selectedClass = "";
		
		html += "<div class=\"dpDay\" onclick=\"dpSelectDay(" + i + "); return false;\"><a href=\"\"" + selectedClass + ">" + i + "</a></div>";
		
	}
	
	html += '<div class="dpClearer"><!-- --></div>';
	
	dayContainer.innerHTML = html;
}

/**
 * Selects the day and closes the datepicker
 */
function dpSelectDay(day) {
	dpClose();
	
	dpCurrentDate = new Date(dpCurrentYear,dpCurrentMonth,day);
	
	// Input
	/*dpDateInput.value = dateToDisplay(dpCurrentDate);*/
	
	// Select
	dpDayInput.selectedIndex = dpGetOptionIndexByValue(dpDayInput,dpCurrentDate.getDate());
	dpMonthInput.selectedIndex = dpGetOptionIndexByValue(dpMonthInput,(dpCurrentDate.getMonth() + 1));
	dpYearInput.selectedIndex = dpGetOptionIndexByValue(dpYearInput,dpCurrentDate.getFullYear());
}

/**
 * Moves to previous month
 */
function dpPrevMonth() {
	dpSetMonth(dpCurrentMonth - 1);
}

/**
 * Moves to next month
 */
function dpNextMonth() {
	dpSetMonth(dpCurrentMonth + 1);
}

/**
 * Updates month
 */
function dpSetMonth(month) {
	// Year limits
	if(dpCurrentYear == dpMaxYear && month == 11) {
		document.getElementById("dpNext_" + dpContainerId).style.visibility = "hidden";
	}
	else
		document.getElementById("dpNext_" + dpContainerId).style.visibility = "visible";
	
	if(dpCurrentYear == dpMinYear && month == 0) {
		document.getElementById("dpPrev_" + dpContainerId).style.visibility = "hidden";
	}
	else
		document.getElementById("dpPrev_" + dpContainerId).style.visibility = "visible";
		
	// Month limits
	if(month > 11) {
		month = 0;
		
		dpSetYear(++dpCurrentYear);
	}
	else if(month < 0) {
		month = 11;
		dpSetYear(--dpCurrentYear);
	}
	
	dpCurrentMonth = month;
	
	var monthDiv = document.getElementById("dpBrowserMonth_" + dpContainerId);
	
	monthDiv.innerHTML = dpMonths[month] + " " + dpCurrentYear;
	dpUpdate();
}

/**
 * Updates year
 */
function dpSetYear(year) {
	dpCurrentYear = year;
}

/**
 * Converts the time key to a date object
 */
function dpKeyToDate(key) {
	var arr = key.split(".");
	
	var day = Number(arr[0]);
	var month = Number(arr[1]) - 1;
	var year = Number(arr[2]);
	
	return new Date(year,month,day);
}

/**
 * Converts a date object to the time key
 */
function dpDateToKey(date) {
	var day = date.getDate() < 10 ? "0" + String(date.getDate()) : String(date.getDate());
	var month = date.getMonth() + 1 < 10 ? "0" + String(date.getMonth() + 1) : String(date.getMonth() + 1);
	var year = String(date.getFullYear());
	
	var key = year + "-" + month + "-" + day + " 00:00:00";
	
	return key;
}

/**
 * Converts a date object to display format
 */
function dateToDisplay(date) {
	var day = date.getDate() < 10 ? "0" + String(date.getDate()) : String(date.getDate());
	var month = date.getMonth() + 1 < 10 ? "0" + String(date.getMonth() + 1) : String(date.getMonth() + 1);
	var year = String(date.getFullYear());
	
	var key = day + "." + month + "." + year;
	
	return key;
}

/**
 * Gets the number of days in any given month
 */
function dpDaysInMonth(month,year) {
	return 32 - new Date(year, month, 32).getDate();
}

/**
 * Gets an option index by value
 */
function dpGetOptionIndexByValue(list,value) {
	for(var i = 0; i < list.length; i++) {
		if(list.options[i].value == value)
			return i;
	}
		
	return -1;
}
