/**
* Call this to open a popupwindow with a datechooser in it.
*/
function nanoDatePickerWindow(titleText,format,inputField,nanoDatePickerPath) {
	if (!nanoDatePickerPath) {
		nanoDatePickerPath = '';
	}
	// Open in nice window if IE.
	var url = nanoDatePickerPath + 'datepopup.html?title=' + escape(titleText);
	var options = new Array();		

	var inputField = document.getElementsByName(inputField);
	inputField = inputField[0];
	
	var resizable = false;
	var status = false;
	var scrollbars = false;
	var menubar = false;
	var address = false;
	var toolbar = false;

	if (window.showModalDialog) {
		var width = 218;
		var height = 260;
		
		options[0] = 'dialogWidth: ' + width + 'px';
		options[1] = 'dialogHeight: ' + height + 'px';
		// options[2] = 'dialogTop: ' + top + 'px';
		// options[3] = 'dialogLeft: ' + left + 'px';
		// options[4] = 'edge: ' + edge;
		options[5] = 'center: ' + "Yes";
		options[6] = 'help: ' + "No";
		options[7] = 'resizable: ' + (resizable ? "Yes" : "No");
		options[8] = 'status: ' + (status ? "Yes" : "No");
		window.showModalDialog(url,new Array(titleText,format,inputField),options.join(';'));
	}
	else {
		var width = 212;
		var height = 240;
	
		options[0] = 'status=' + (status ? "1" : "0");
		options[1] = 'scrollbars=' + (scrollbars ? "1" : "0");
		options[2] = 'menubar=' + (menubar ? "1" : "0");
		options[3] = 'address=' + (address ? "1" : "0");
		options[4] = 'toolbar=' + (toolbar ? "1" : "0");
		options[5] = 'resizable=' + (resizable ? "1" : "0");
		options[6] = 'width=' + width;
		options[7] = 'height=' + height;
			
		var calendarWindow = window.open(url,name,options.join(','));
		calendarWindow.inputField = inputField;
		calendarWindow.format = format;
	}
}
/**
* The datepicker object.
*/
function NanoDatePicker() {
	this.inputField = null;
	this.format = 'YYYY-MM-DD';
	this.startDate = new Date();
	this.assignedToElement = null;
	
	this.selectedDay = new Date().getDate();
	this.selectedDayElement = null;
	
	this.calendarDiv = null;
	
	this.dateString = 'Dato';
	this.submitButtonText = 'Vælg dato';

	// this.monthArray = new Array('January','February','March','April','May','June','July','August','September','October','November','December');
	this.monthArray = new Array('Januar','Februar','Marts','April','Maj','Juni','Juli','August','September','Oktober','November','December');
	this.dayArray = new Array('M','T','O','T','F','L','S');

	this.setInputField = function(inputField) {
		this.inputField = inputField;
	}
	this.setInputFieldByName = function(inputFieldName) {
		var inputField = document.getElementsByName(inputFieldName);
		this.inputField = inputField[0];
	}
	this.getInputField = function() {
		return this.inputField;
	}
	this.setFormat = function(format) {
		this.format = format;
	}
	this.getFormat = function() {
		return this.format;
	}
	this.setStartDate = function(startDate) {
		this.startDate = startDate;
		this.selectedDay = startDate.getDate();
	}
	this.getSelectedDate = function() {
		var day = this.selectedDay;
		
		var monthSelectBox = document.getElementById('nanoDatePickerMonthSelect');
		var month = monthSelectBox.options[monthSelectBox.selectedIndex].value;
		
		var year = document.getElementById('nanoDatePickerYearInput').value;
		
		var hourSelectBox = document.getElementById('nanoDatePickerHourSelect');
		var hour = 0;
		if (hourSelectBox) {
			hour = hourSelectBox.options[hourSelectBox.selectedIndex].value;
		}
		
		var minuteSelectBox = document.getElementById('nanoDatePickerMinuteSelect');
		var minute = 0;
		if (minuteSelectBox) {
			minute = minuteSelectBox.options[minuteSelectBox.selectedIndex].value;
		}
		
		return new Date(year,month,day,hour,minute);
	}
	this.putIntoElement = function(element) {
		this.assignedToElement = element;
		var inputField = this.getInputField();
	
		if (inputField.value) {
			this.startDate = this.parseInputFieldDate();
			this.selectedDay = this.startDate.getDate();
		}
		this.redraw(this.startDate);
	}
	this.parseInputFieldDate = function() {
		var inputField = this.getInputField();
		var format = this.getFormat();
		var currentValue = inputField.value;
		
		// The length is the same as the format, that's cool, then we can parse the date.
		if (currentValue.length == format.length) {
			var yearpos = format.indexOf('YYYY');
			var monthpos = format.indexOf('MM');
			var daypos = format.indexOf('DD');
			var hourpos = format.indexOf('HH');
			var minpos = format.indexOf('mm');
			
			var year = currentValue.substring(yearpos,yearpos + 4);
			var month = currentValue.substring(monthpos,monthpos + 2) - 1;
			var day = currentValue.substring(daypos,daypos + 2);
			var hour = currentValue.substring(hourpos,hourpos + 2);
			var mins = currentValue.substring(minpos,minpos + 2);
			
			return new Date(year,month,day,hour,mins);
		}
		else {
			return new Date();
		}
		
		
	}
	this.redraw = function(date) {
		// If the Calendar already have content, remove it :)
		if (this.assignedToElement.hasChildNodes()) {
			this.assignedToElement.removeChild(this.assignedToElement.childNodes[0]);
		}
		var calendarDiv = document.createElement('DIV');

		var fieldset = document.createElement('FIELDSET');
		var legend = document.createElement('LEGEND');

		calendarDiv.id = 'nanoDatePickerMainDiv';		
		fieldset.id = 'nanoDatePickerFieldset';
		legend.id = 'nanoDatePickerLegend';
		
		legend.appendChild(document.createTextNode(this.dateString));
		
		var monthSelect = this.__createMonthDropDown(date);
		var yearInput = document.createElement('INPUT');
		yearInput.type = 'TEXT';
		yearInput.id = 'nanoDatePickerYearInput';
		yearInput.value = date.getFullYear();
		yearInput.onkeydown = function(event) {
			if (window.event) {
				event = window.event;
			}
			if ((event.keyCode >= 48 && event.keyCode <= 57) || (event.keyCode == 8) || (event.keyCode == 9) || (event.keyCode == 46) || (event.keyCode == 37) || (event.keyCode == 39) || (event.keyCode == 36) || (event.keyCode == 35)) {
				return true;
			}
			else {
				return false;
			}
		}

		var dayBorder = document.createElement('DIV');
		dayBorder.id = 'nanoDatePickerDayBorder';

		var dayContainer = document.createElement('DIV');
		dayContainer.id = 'nanoDatePickerDayContainer';

		var dayTable = this.__createDayTable(date);
		
		dayContainer.appendChild(dayTable);
		
		dayBorder.appendChild(dayContainer);
		
		var submitButtonDiv = document.createElement('DIV');
		submitButtonDiv.id = 'nanoDatePickerSubmitButtonDiv';
		
		var showHour = (this.getFormat().indexOf('H') != -1 ? true : false);
		var showMinute = (this.getFormat().indexOf('m') != -1 ? true : false);
		
		if (showHour) {
			var hourSelect = this.__createHourDropDown(date);
			submitButtonDiv.appendChild(hourSelect);
		}
		if (showHour && showMinute) {
			var timeDivider = document.createElement('SPAN');
			timeDivider.id = 'nanoDatePickerTimeDivider'
			timeDivider.appendChild(document.createTextNode(':'));
			submitButtonDiv.appendChild(timeDivider);
		}
		if (showMinute) {
			var minuteSelect = this.__createMinuteDropDown(date);
			submitButtonDiv.appendChild(minuteSelect);
		}
		
		var submitButton = document.createElement('INPUT');
		submitButton.hideFocus = true;
		submitButton.id = 'nanoDatePickerSubmitButton';
		submitButton.type = 'SUBMIT';
		submitButton.value = this.submitButtonText;
		
		var thisObject = this;
		submitButton.onclick = function() {
			thisObject.insertDate();
		}
		
		submitButtonDiv.appendChild(submitButton);
		
		fieldset.appendChild(legend);
		fieldset.appendChild(monthSelect);
		fieldset.appendChild(yearInput);
		fieldset.appendChild(dayBorder);
		fieldset.appendChild(submitButtonDiv);
		calendarDiv.appendChild(fieldset);
				
		this.assignedToElement.appendChild(calendarDiv);
		this.calendarDiv = calendarDiv;
	}
	this.recalculateDate = function() {
		var day = this.selectedDay;
		
		var monthSelectBox = document.getElementById('nanoDatePickerMonthSelect');
		var month = monthSelectBox.options[monthSelectBox.selectedIndex].value;
		
		var year = document.getElementById('nanoDatePickerYearInput').value;
		
		var testDate = new Date(year,month,day);
		
		if (testDate.getMonth() != month) {
			i = 1;
			while(testDate.getMonth() != month) {
				testDate = new Date(year,month,day - i);
				i++;
			}
			this.selectedDay = this.selectedDay - i + 1;
		}
		this.redraw(this.getSelectedDate());
	}
	this.insertDate = function() {
		var insertDate = this.getSelectedDate();
		
		
		var year = insertDate.getFullYear();
		var month = insertDate.getMonth() + 1;
		var day = insertDate.getDate();
		var hour = insertDate.getHours();
		var mins = insertDate.getMinutes();
		
		var monthtext = (month < 10 ? '0' + month : month);
		var daytext = (day < 10 ? '0' + day : day);
		var hourtext = (hour < 10 ? '0' + hour : hour);
		var minstext = (mins < 10 ? '0' + mins : mins);
		
		var inputField = this.getInputField();
		var insertString = this.getFormat();
		
		insertString = insertString.replace(/YYYY/g,year);
		insertString = insertString.replace(/MM/g,monthtext);
		insertString = insertString.replace(/DD/g,daytext);
		insertString = insertString.replace(/HH/g,hourtext);
		insertString = insertString.replace(/mm/g,minstext);
		
		inputField.value = insertString;
		
		window.close();
	}
	/**
	* Private
	*/
	this.__createHourDropDown = function(date) {
		var selectElement = document.createElement('SELECT');
		selectElement.id = 'nanoDatePickerHourSelect';
		
		var hour = date.getHours();
		
		for(i=0;i<24;i++) {
			var option = document.createElement('OPTION');
			option.className = 'nanoDatePickerMonthOption';
			option.value = i;

			var text = (i < 10 ? '0' + i : i);
			option.appendChild(document.createTextNode(text));
			
			if (hour == i) {
			 	option.selected = true;
			}
			
			selectElement.appendChild(option);
		}
		return selectElement;
	}
	/**
	* Private
	*/
	this.__createMinuteDropDown = function(date) {
		var selectElement = document.createElement('SELECT');
		selectElement.id = 'nanoDatePickerMinuteSelect';
		
		var minute = date.getMinutes();
		
		for(i=0;i<60;i = i + 5) {
			var option = document.createElement('OPTION');
			option.className = 'nanoDatePickerMonthOption';
			option.value = i;

			var text = (i < 10 ? '0' + i : i);
			option.appendChild(document.createTextNode(text));
			
			if (minute == i || minute == i + 1 || minute == i + 2 || minute == i + 3 || minute == i + 4) {
			 	option.selected = true;
			}
			
			selectElement.appendChild(option);
		}
		return selectElement;
	}
	/**
	* Private
	*/
	this.__createMonthDropDown = function(date) {
		var monthNumber = date.getMonth();
		var selectElement = document.createElement('SELECT');
		selectElement.id = 'nanoDatePickerMonthSelect';
		for(i=0;i<12;i++) {
			var option = document.createElement('OPTION');
			option.className = 'nanoDatePickerMonthOption';
			option.value = i;
			option.appendChild(document.createTextNode(this.monthArray[i]));
			
			if (monthNumber == i) {
				option.selected = true;
			}
			
			selectElement.appendChild(option);
		}
		
		var thisObject = this;
		
		selectElement.onchange = function() { thisObject.recalculateDate(); };
		return selectElement;
	}
	/**
	* Private
	*/
	this.__createDayTable = function(date) {
		var table = document.createElement('TABLE');
		table.style.width = '100%';
		table.cellSpacing = 0;
		table.cellPadding = 0;
		table.border = 0;
		
		var tbody = document.createElement('TBODY');
		
		var dayNameTR = document.createElement('TR');
		
			for(i=0;i<7;i++) {
				var dayNameTD = document.createElement('TD');
				dayNameTD.className = 'nanoDatePickerDayNameTD';
				dayNameTD.appendChild(document.createTextNode(this.dayArray[i]));
				dayNameTR.appendChild(dayNameTD);
			}
			tbody.appendChild(dayNameTR);
			
			var checkDate = new Date(date.getFullYear(),date.getMonth(),1);
			var startDay = checkDate.getDay();

			var usedDaysInRow = 0;
			var dayRow = document.createElement('TR');
			
			var currentDay = 1;
			
			var month = date.getMonth();
			var year = date.getFullYear();

			if (startDay == 0) { startDay = 7; }
			for(i=0;i<startDay-1;i++) {
				var fillerTD = document.createElement('TD');
				dayRow.appendChild(fillerTD);
				usedDaysInRow++;
			}
			
			while(this.isValidDate(currentDay,month,year)) {
				if (usedDaysInRow == 0) {
					dayRow = document.createElement('TR');
				}
				var dayTD = document.createElement('TD');
				dayTD.appendChild(document.createTextNode(currentDay));
				
				if (date.getDate() == currentDay) {
					dayTD.className = 'nanoDatePickerDayTDSelected';
					this.selectedDayElement = dayTD;
				}
				else {
					dayTD.className = 'nanoDatePickerDayTD';
				}

				var thisObject = this;

				dayTD.onclick = function() {
					thisObject.__selectDay(this);
				}
				dayRow.appendChild(dayTD);
				usedDaysInRow++;
				
				if (usedDaysInRow == 7) {
					tbody.appendChild(dayRow);
					usedDaysInRow = 0;
				}
				currentDay++;
			}
			// If we didn't just add the row, then fill it up and add it :)
			if (usedDaysInRow != 0) {
				for(i=usedDaysInRow;i<7;i++) {
					var fillerTD = document.createElement('TD');
					dayRow.appendChild(fillerTD);
				}
				tbody.appendChild(dayRow);
			}
		table.appendChild(tbody);
		return table;
	}
	this.__selectDay = function(element) {
		if (element && element.childNodes[0] && element.childNodes[0].nodeValue) {
			this.selectedDay = element.childNodes[0].nodeValue;
			this.selectedDayElement.className = 'nanoDatePickerDayTD'
			element.className = 'nanoDatePickerDayTDSelected';
			this.selectedDayElement = element;
		}
	}
	// checks if date passed is valid
	// will accept dates in following format:
	// isDate(dd,mm,ccyy), or
	// isDate(dd,mm) - which defaults to the current year, or
	// isDate(dd) - which defaults to the current month and year.
	// Note, if passed the month must be between 1 and 12, and the
	// year in ccyy format.
	this.isValidDate = function(day,month,year) {
		var today = new Date();
		year = ((!year) ? today.getFullYear() : year);
		month = ((!month) ? today.getMonth(): month);
		if (!day) {
			return false;
		}
		var test = new Date(year,month,day);
		if ((test.getFullYear() == year) && (month == test.getMonth()) && (day == test.getDate()) ) {
			return true;
		}
		else {
			return false
		}
	}
}

