var SPD = {

	initDatePickers : function() {
		$$('input.SPD_datePicker').each(function(el) {
			el.observe('click', SPD.getDatePicker);
		});
	},

	getDatePicker : function(eve) {
		/**
		*	remember
		*	with Date, month is 0 - 11
		*	and weekday 0 = sun, 1 = mon, ...
		*/
		var el = eve.element();
		el.stopObserving('click', SPD.getDatePicker);

		var date = el.value.split(' ')[0] || '';
		var time = el.value.split(' ')[1] || '';
		var dateParts = date.split('-');
		var timeParts = time.split(':');
		if (!dateParts || dateParts.length != 3) {
			var year = new Date().getFullYear();
			var month = new Date().getMonth() + 1;
			var day = new Date().getDate();
		}
		else {
			var year = dateParts[0];
			var month = parseInt(dateParts[1], 10);
			var day = parseInt(dateParts[2], 10);
		}
		if (!timeParts || timeParts.length < 2) {
			var hour = 9;
			var mins = 0;
		}
		else {
			var hour = parseInt(timeParts[0], 10);
			var mins = parseInt(timeParts[1], 10);
		}
		var cal = SPD.makeDatePicker(el, year, month, day, hour, mins);
		el.up().insert({after : cal});
		el.hide();
		eve.stop();
	},

	datePickerPrevMonth : function(eve) {
		var dateParts = this.readAttribute('curDate').split('-');
		var timeParts = this.readAttribute('curTime').split(':');
		var year = dateParts[0];
		var month = parseInt(dateParts[1], 10) - 1;
		var day = dateParts[2];
		if (month == 0) {
			month = 12;
			year--;
		}
		var hour = parseInt(timeParts[0], 10);
		var mins = parseInt(timeParts[1], 10);
		var cal = SPD.makeDatePicker(this, year, month, day, hour, mins);
		this.up().next().remove();
		this.up().insert({after : cal});
		eve.stop();
	},

	datePickerNextMonth : function(eve) {
		var dateParts = this.readAttribute('curDate').split('-');
		var timeParts = this.readAttribute('curTime').split(':');
		var year = dateParts[0];
		var month = parseInt(dateParts[1], 10) + 1;
		var day = dateParts[2];
		if (month == 13) {
			month = 1;
			year++;
		}
		var hour = parseInt(timeParts[0], 10);
		var mins = parseInt(timeParts[1], 10);
		var cal = SPD.makeDatePicker(this, year, month, day, hour, mins);
		this.up().next().remove();
		this.up().insert({after : cal});
		eve.stop();
	},

	makeDatePicker : function(inpElement, year, month, day, hour, mins) {
		inpElement.writeAttribute('curDate', year + '-' + month + '-' + day);
		inpElement.writeAttribute('curTime', hour + ':' + mins);

		var firstOfMonth = new Date(year, month - 1, 1).getDay();
		firstOfMonth = firstOfMonth ? firstOfMonth : 7; // make sunday 7, not 0;
		var firstWeekDays = 8 - firstOfMonth;
		var daysInMonth = (month == 12 ?
			new Date(year + 1, 1, 0)
			:
			new Date(year, month, 0)).getDate();
		var weeksInMonth = ((daysInMonth - firstWeekDays) / 7).ceil() + 1;
		var weekDayNames = ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'];
		var monthNames = ['', 'tammi', 'helmi', 'maalis', 'huhti', 'touko', 'kesä', 'heinä', 'elo', 'syys', 'loka', 'marras', 'joulu'];

		var div = new Element('div', { className : 'SPD_calendar'});
		var cal = new Element('table', { className : 'SPD_calendar'});
		div.appendChild(cal);
		var calH = cal.appendChild(new Element('thead'));
		var calB = cal.appendChild(new Element('tbody'));


		var tr = new Element('tr');
		var td = new Element('td');
		var inp = new Element('input', {
			type : 'button',
			value : '<'
		});
		inp.observe('click', SPD.datePickerPrevMonth.bindAsEventListener(inpElement));
		td.appendChild(inp);
		tr.appendChild(td);
		var td = new Element('td', { colspan : 5 });
		td.appendChild(document.createTextNode(year + ' - ' + monthNames[month]));
		tr.appendChild(td);
		var td = new Element('td');
		var inp = new Element('input', {
			type : 'button',
			value : '>'
		});
		td.appendChild(inp);
		tr.appendChild(td);
		calB.appendChild(tr);
		inp.observe('click', SPD.datePickerNextMonth.bindAsEventListener(inpElement));

		//	date
		var tr = new Element('tr');
		for (var i = 1; i < firstOfMonth; i++) {
			var td = new Element('td');
			td.appendChild(document.createTextNode(' '))
			tr.appendChild(td);
		}
		for (var i = 1; i <= firstWeekDays; i++) {
			var td = new Element('td');
			td.appendChild(document.createTextNode(i));
			td.observe('click', SPD.setDatePickerDate.bindAsEventListener(inpElement));
			if (i == day) {
				td.addClassName('selected');
			}
			tr.appendChild(td);
		}
		calB.appendChild(tr);
		var w = 0;
		for (var i = firstWeekDays + 1; i <= daysInMonth; i++) {
			w = w == 7 ? 0 : w;
			if (!w) {
				var tr = new Element('tr');
				calB.appendChild(tr);
			}
			w++;
			var td = new Element('td');
			td.appendChild(document.createTextNode(i));
			td.observe('click', SPD.setDatePickerDate.bindAsEventListener(inpElement));
			if (i == day) {
				td.addClassName('selected');
			}
			tr.appendChild(td);
		}
		for (var i = w; i < 7; i++) {
			var td = new Element('td');
			td.appendChild(document.createTextNode(' '));
			tr.appendChild(td);
		}

		/**	time */
		var hourSel = new Element('select', {
			name : 'hour'
		});
		for (var i = 0; i < 24; i++) {
			hourSel.options[i] = new Option((i < 10 ? '0' + i : i), i);
		}
		hourSel.selectedIndex = hour;
		hourSel.observe('change', SPD.setDatePickerTime.bindAsEventListener(inpElement));
		div.appendChild(hourSel);
		var minsSel = new Element('select', {
			name : 'mins'
		});
		for (var i = 0; i < 60; i++) {
			minsSel.options[i] = new Option((i < 10 ? '0' + i : i), i);
		}
		minsSel.selectedIndex = mins;
		minsSel.observe('change', SPD.setDatePickerTime.bindAsEventListener(inpElement));
		div.appendChild(minsSel);

		//	save & close buttons
		var btnX = new Element('input', {
			type : 'button',
			value : 'X',
			className : 'SPD_cal_close'
		});
		btnX.observe('click', SPD.cancelDatePicker.bindAsEventListener(inpElement));
		div.appendChild(btnX);

		var btnOK = new Element('input', {
			type : 'button',
			value : 'OK',
			className : 'SPD_cal_ok'
		});
		btnOK.observe('click', SPD.saveDatePicker.bindAsEventListener(inpElement));
		div.appendChild(btnOK);
		return div;
		//return cal;
	},

	setDatePickerDate : function(eve) {
		var el = eve.element();
		var dateParts = this.readAttribute('curDate').split('-');
		var year = dateParts[0];
		var month = dateParts[1];
		var day = el.childNodes[0].nodeValue;
		this.writeAttribute('curDate', year + '-' + month + '-' + day);
		el.up().up().descendants().each(function(el) {
			el.removeClassName('selected');
		});
		el.addClassName('selected');
		eve.stop();
	},

	setDatePickerTime : function(eve) {
		var el = eve.element();
		if (el.name =='hour') {
			var hour = $F(el);
			var mins = $F(el.next());
		}
		else {
			var hour = $F(el.previous());
			var mins = $F(el);
		}
		this.writeAttribute('curTime', hour + ':' + mins);
	},

	saveDatePicker : function(eve) {
		var dateParts = this.readAttribute('curDate').split('-');
		var timeParts = this.readAttribute('curTime').split(':');
		this.writeAttribute('curDate', '');
		this.writeAttribute('curTime', '');
		var year = dateParts[0];
		var month = dateParts[1];
		var day = dateParts[2];
		var hour = timeParts[0];
		var mins = timeParts[1];
		month = month < 10 ? '0' + month : month;
		day = day < 10 ? '0' + day : day;
		hour = hour < 10 ? '0' + hour : hour;
		mins = mins < 10 ? '0' + mins : mins;
		this.value = (year + '-' + month + '-' + day + ' ' + hour + ':' + mins);
		this.up().next().remove();
		this.show();
		this.observe('click', SPD.getDatePicker);
		eve.stop();
	},

	cancelDatePicker : function(eve) {
		this.writeAttribute('curDate', '');
		this.writeAttribute('curTime', '');
		this.up().next().remove();
		this.show();
		this.observe('click', SPD.getDatePicker);
		eve.stop();
	}
}
