/**
 * @alias DateChooser.class
 * @author WilC <wilz04@gmail.com>
 * @since 2008
 */

function DateChooser(id) {
	
	var sDate = document.createElement("select");
	var sMonth = document.createElement("select");
	var sYear = document.createElement("select");
	
	var cbDate;
	var cbMonth;
	var cbYear;
	
	sDate.setAttribute("name", id + "_date");
	sMonth.setAttribute("name", id + "_month");
	sYear.setAttribute("name", id + "_year");
	
	sDate.setAttribute("id", id + "_date");
	sMonth.setAttribute("id", id + "_month");
	sYear.setAttribute("id", id + "_year");
	
	var timmer = new Date();
	var firstYear = timmer.getFullYear();
	var lastYear = timmer.getFullYear();
	var format = "d-m-y";
	
	var args = arguments[1];
	if (args) {
		timmer = args.date ? args.date : timmer;
		firstYear = args.firstYear ? args.firstYear : firstYear;
		lastYear = args.lastYear ? args.lastYear : lastYear;
		format = args.format ? args.format : format;
	}
	var year = timmer.getFullYear();
	var month = timmer.getMonth();
	var date = timmer.getDate();
	
	function isLeap() {
		return (!(year%4) && ((year%100) || !(year%400)));
	}
	
	function getMonthLengths() {
		if (isLeap()) {
			return [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
		} else {
			return [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
		}
	}
	
	function setDates() {
		var dates = getMonthLengths()[month];
		var index = cbDate.getSelectedIndex();
		if (index == null) {
			index = 0;
		}
		cbDate.removeAllItems();
		var tmpdate;
		var option;
		for (tmpdate=1; tmpdate<=dates; tmpdate++) {
			option = new Option(tmpdate.toString());
			option.value = tmpdate;
			cbDate.addItem(option);
		}
		if (index >= --tmpdate) {
			index = tmpdate - 1;
		}
		cbDate.setSelectedIndex(index);
	}
	
	function update() {
		month = cbMonth.getSelectedIndex();
		year = cbYear.getValue();
		
		setDates();
	}
	
	this.addInto = function (container) {
		var parent = document.getElementById(container);
		var spacer = document.createElement("label");
		
		spacer.innerHTML = "&nbsp;";
		
		var aformat = format.split("-");
		var index;
		var length = aformat.length;
		for (index=0; index<length; index++) {
			switch (aformat[index]) {
				case "d":
					parent.appendChild(sDate);
					if (index < length-1) {
						parent.appendChild(spacer.cloneNode(true));
					}
					break;
				case "m":
					parent.appendChild(sMonth);
					if (index < length-1) {
						parent.appendChild(spacer.cloneNode(true));
					}
					break;
				case "y":
					parent.appendChild(sYear);
					if (index < length-1) {
						parent.appendChild(spacer.cloneNode(true));
					}
					break;
				default:
					throw new Error("Date format exception");
			}
		}
		
		cbDate = new ComboBox(id + "_date");
		cbMonth = new ComboBox(id + "_month");
		cbYear = new ComboBox(id + "_year");
		
		cbMonth.onChange(update);
		cbYear.onChange(update);
		
		var months = [	"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"	];
		var option;
		for (index=0; index<12; index++) {
			option = new Option(months[index]);
			option.value = index;
			cbMonth.addItem(option);
		}
		
		for (index=firstYear; index<=lastYear; index++) {
			option = new Option(index.toString());
			option.value = index;
			cbYear.addItem(option);
		}
		if (year < firstYear) {
			cbYear.setSelectedIndex(0);
			throw "DateChooser: Error, current year < first year!";
		} else if (year > lastYear) {
			cbYear.setSelectedIndex(index);
			throw "DateChooser: Error, current year > last year!";
		} else {
			cbYear.setSelectedIndex(year - firstYear);
		}
		
		cbMonth.setSelectedIndex(month);
		
		setDates();
		sDate.selectedIndex = date - 1;
	};
	
}
