var splitChar = '-';
var changeYearMethod = 'select'; // select or link

function positionInfo(object) {

	var p_elm = object;

	this.getElementLeft = getElementLeft;
	function getElementLeft() {
		var x = 0;
		var elm;
		if(typeof(p_elm) == "object"){
			elm = p_elm;
		} else {
			elm = document.getElementById(p_elm);
		}
		while (elm != null) {
			x+= elm.offsetLeft;
			elm = elm.offsetParent;
		}
		return parseInt(x);
	}

	this.getElementWidth = getElementWidth;
	function getElementWidth(){
		var elm;
		if(typeof(p_elm) == "object"){
			elm = p_elm;
		} else {
			elm = document.getElementById(p_elm);
		}
		return parseInt(elm.offsetWidth);
	}

	this.getElementRight = getElementRight;
	function getElementRight(){
		return getElementLeft(p_elm) + getElementWidth(p_elm);
	}

	this.getElementTop = getElementTop;
	function getElementTop() {
		var y = 0;
		var elm;
		if(typeof(p_elm) == "object"){
			elm = p_elm;
		} else {
			elm = document.getElementById(p_elm);
		}
		while (elm != null) {
			y+= elm.offsetTop;
			elm = elm.offsetParent;
		}
		return parseInt(y);
	}

	this.getElementHeight = getElementHeight;
	function getElementHeight(){
		var elm;
		if(typeof(p_elm) == "object"){
			elm = p_elm;
		} else {
			elm = document.getElementById(p_elm);
		}
		return parseInt(elm.offsetHeight);
	}

	this.getElementBottom = getElementBottom;
	function getElementBottom(){
		return getElementTop(p_elm) + getElementHeight(p_elm);
	}
}

function CalendarControl() {

	var calendarId = 'CalendarControl';
	var currentYear = 0;
	var currentMonth = 0;
	var currentDay = 0;
	//var yearViewType = 'present'; // weergave van jaartelling

	var selectedYear = 0;
	var selectedMonth = 0;
	var selectedDay = 0;

	var months = ['January','February','March','April','May','June','July','August','September','October','November','December'];
	var dateField = null;

	function getProperty(p_property){
		var p_elm = calendarId;
		var elm = null;
		if(typeof(p_elm) == "object"){
			elm = p_elm;
		} else {
			elm = document.getElementById(p_elm);
		}
		if (elm != null){
			if(elm.style){
				elm = elm.style;
				if(elm[p_property]){
					return elm[p_property];
				} else {
					return null;
				}
			} else {
				return null;
			}
		}
	}

	function setProperty(p_property, p_value){
		var p_elm = calendarId;
		var elm = null;
		if(typeof(p_elm) == "object"){
			elm = p_elm;
		} else {
			elm = document.getElementById(p_elm);
		}
		if((elm != null) && (elm.style != null)){
			elm = elm.style;
			elm[ p_property ] = p_value;
		}
	}

	function getDaysInMonth(year, month) {
		return [31,((!(year % 4 ) && ( (year % 100 ) || !( year % 400 ) ))?29:28),31,30,31,30,31,31,30,31,30,31][month-1];
	}

	function getDayOfWeek(year, month, day) {
		var date = new Date(year,month-1,day)
		return date.getDay();
	}

	this.setDate = setDate;
	function setDate(year, month, day) {
		if (dateField) {
			if (month < 10) {month = "0" + month;}
			if (day < 10) {day = "0" + day;}
			var dateString = day+splitChar+month+splitChar+year;
			var tmp = dateField.value;
			dateField.value = dateString;
			if (typeof(dateField.onchange ) == 'function')
				if (!dateField.onchange())
					dateField.value = tmp;
			hide();
		}
		return;
	}

	this.changeMonth = changeMonth;
	function changeMonth(change) {
		currentMonth += change;
		currentDay = 0;
		if(currentMonth > 12) {
			currentMonth = 1;
			currentYear++;
		} else if(currentMonth < 1) {
			currentMonth = 12;
			currentYear--;
		}

		calendar = document.getElementById(calendarId);
		calendar.innerHTML = calendarDrawTable();
	}

	this.changeYear = changeYear;
	function changeYear(change) {
		currentYear = parseInt(change);
		currentDay = 0;
		calendar = document.getElementById(calendarId);
		calendar.innerHTML = calendarDrawTable();
	}

	function getCurrentYear() {
		var year = new Date().getYear();
		if(year < 1900) year += 1900;
		return year;
	}

	function getCurrentMonth() {
		return new Date().getMonth() + 1;
	} 

	function getCurrentDay() {
		return new Date().getDate();
	}

	function calendarDrawTable() {

		var dayOfMonth = 1;
		var validDay = 0;
		var startDayOfWeek = getDayOfWeek(currentYear, currentMonth, dayOfMonth);
		var daysInMonth = getDaysInMonth(currentYear, currentMonth);
		var css_class = null; //CSS class for each day
		
		if(changeYearMethod=='select') {

		var selectBox = "  <select onchange='changeCalendarControlYear(this.value)' style='width: 60px;' id='CalendarControlSelectyear'>";
		for(var i=getCurrentYear(); i<getCurrentYear() + 3; i++ ) {
			if(i==currentYear) {
				selectBox = selectBox + "    <option value='"+(i)+"' selected='selected'>"+parseInt(i)+"</option>";
			} else {
				selectBox = selectBox + "    <option value='"+(i)+"'>"+parseInt(i)+"</option>";
			}
		}
		selectBox = selectBox + "  </select>";

		var table = "<table cellspacing='0' cellpadding='0' border='0' id='calenderTable'>";
		table = table + "<tr class='header'>";
		table = table + "  <td colspan='1' class='previous'><a href='javascript:changeCalendarControlMonth(-1);' style='display:block; height:100%; width:100%;'>&lsaquo;</a></td>";
		table = table + "  <td colspan='5' class='title'>"
		table = table + months[currentMonth-1];
		table = table + "&nbsp;";
		table = table + selectBox;
		table = table + "  </td>";
		table = table + "  <td colspan='1' class='next'><a href='javascript:changeCalendarControlMonth(1);' style='display:block; height:100%; width:100%;'>&rsaquo;</a></td>";
		table = table + "</tr>";
		table = table + "<tr><th>S</th><th>M</th><th>T</th><th>W</th><th>T</th><th>F</th><th>S</th></tr>";

		} else {

		var table = "<table cellspacing='0' cellpadding='0' border='0' id='calenderTable'>";
		table = table + "<tr class='header'>";
		table = table + "  <td colspan='1' class='previous'><a href='javascript:changeCalendarControlYear(-1);'>&laquo;</a> <a href='javascript:changeCalendarControlMonth(-1);'>&lsaquo;&nbsp;</a></td>";
		table = table + "  <td colspan='5' class='title'>"
		table = table + months[currentMonth-1] + "&nbsp;" + currentYear;
		table = table + "</td>";
		table = table + "  <td colspan='1' class='next'><a href='javascript:changeCalendarControlMonth(1);'>&nbsp;&rsaquo;</a> <a href='javascript:changeCalendarControlYear(1);'>&raquo;</a></td>";
		table = table + "</tr>";
		table = table + "<tr><th>S</th><th>M</th><th>T</th><th>W</th><th>T</th><th>F</th><th>S</th></tr>";

		}

		for(var week=0; week < 6; week++) {
			table = table + "<tr>";
			for(var dayOfWeek=0; dayOfWeek < 7; dayOfWeek++) {
				if(week == 0 && startDayOfWeek == dayOfWeek) {
					validDay = 1;
				} else if (validDay == 1 && dayOfMonth > daysInMonth) {
					validDay = 0;
				}

				if(validDay) {
					if (dayOfMonth == selectedDay && currentYear == selectedYear && currentMonth == selectedMonth) {
						css_class = 'current';
					} else if (dayOfWeek == 0 || dayOfWeek == 6) {
						css_class = 'weekend';
					} else {
						css_class = 'weekday';
					}


					valid = true;
					if ( currentYear < getCurrentYear () )
						valid = false;
					else if ( currentYear == getCurrentYear () && currentMonth < getCurrentMonth () )
						valid = false;
					else if ( currentYear == getCurrentYear () && currentMonth == getCurrentMonth () && dayOfMonth < getCurrentDay () )
						valid = false;
					
					if ( valid )
						table = table + "<td class='"+css_class+"'><a href=\"javascript:setCalendarControlDate("+currentYear+","+currentMonth+","+dayOfMonth+")\">"+dayOfMonth+"</a></td>";
					else
						table = table + "<td class='notSelectable'>"+dayOfMonth+"</td>";

					dayOfMonth++;
				} else {
					table = table + "<td class='empty'>&nbsp;</td>";
				}
			}
			table = table + "</tr>";
		}

		table = table + "<tr class='header'><th colspan='7' style='padding: 3px;'><a href='javascript:hideCalendarControl();' style='display:block; height:100%; width:100%;'>Sluiten</a></td></tr>";
		table = table + "</table>";

		return table;
	}

	this.show = show;
	//function show(field, yearViewType) {
	function show(field) {
		//this.yearViewType = yearViewType;
		// If the calendar is visible and associated with
		// this field do not do anything.
		if (dateField == field) {
			return;
		} else {
			dateField = field;
		}

		if(dateField) {
			try {
				var dateString = new String(dateField.value);
				var dateParts = dateString.split(splitChar);
				
				selectedMonth = parseInt(dateParts[1],10);
				selectedDay = parseInt(dateParts[0],10);
				selectedYear = parseInt(dateParts[2],10);
			} catch(e) {}
		}

		if (!(selectedYear && selectedMonth && selectedDay)) {
			selectedMonth = getCurrentMonth();
			selectedDay = getCurrentDay();
			selectedYear = getCurrentYear();
		}

		currentMonth = selectedMonth;
		currentDay = selectedDay;
		currentYear = selectedYear;

		if(document.getElementById){

			calendar = document.getElementById(calendarId);
			calendar.innerHTML = calendarDrawTable(currentYear, currentMonth);

			setProperty('display', 'block');

			var position = new positionInfo(dateField);

			var x = position.getElementLeft();
			var y = position.getElementBottom();

			setProperty('left', x + "px");
			setProperty('top', y + "px");

			var calPos = new positionInfo(calendarId);
			objSelect = document.getElementsByTagName("select");
			var debug = "";
			for(var i=0 ; i<objSelect.length ; i++ )
			{
				if(objSelect[i].id != 'CalendarControlSelectyear') {
					var selectPos = new positionInfo(objSelect[i]);

					if(	(selectPos.getElementRight() > calPos.getElementLeft() && selectPos.getElementRight() < calPos.getElementRight() ) ||
							(selectPos.getElementTop() < calPos.getElementBottom() && selectPos.getElementBottom() > calPos.getElementTop() )
						) {
						objSelect[i].style.visibility = 'hidden';
					}
				}
			}

		}
	}

	this.hide = hide;
	function hide() {
		if(dateField) {
			setProperty('display', 'none');

			objSelect = document.getElementsByTagName("select");
			for(var i=0 ; i<objSelect.length ; i++ )
			{
				objSelect[i].style.visibility = 'visible';
			}

			dateField = null;
		}
	}

}

var calendarControl = new CalendarControl();

function showCalendarControl(textField) {
	calendarControl.show(textField);
}

function hideCalendarControl() {
	calendarControl.hide();
}

function setCalendarControlDate(year, month, day) {
	calendarControl.setDate(year, month, day);
}

function changeCalendarControlYear(change) {
	calendarControl.changeYear(change);
}

function changeCalendarControlMonth(change) {
	calendarControl.changeMonth(change);
}

document.write("<div style='zindex:10; display:none;' id='CalendarControl'></div>");


