dojo.provide("epages.widget.Timeselector");
dojo.require("epages.localize");
dojo.require("epages.widget");
dojo.require("dojo.date");

dojo.declare(
	"epages.widget.Timeselector",
	[dijit._Widget, dijit._Templated],
	{

		/**
		 * public properties
		 */
		templatePath    : dojo.moduleUrl("epages.widget", "templates/Timeselector.html"),
		delta:     '5', // String - increment is 5 minutes by default
		value:     '',

		_selected: undefined,

		valuePattern:   epages.vars.Locale.datetimeFormat || "%d.%m.%y %H:%M", // String - epages datetime pattern
		displayPattern: epages.vars.Locale.timeFormat     || "%H:%M", // String - epages time pattern

		postMixInProperties: function() {
			// create dojo datetime pattern
			if (typeof this.value == 'string'){
				this.value = epages.localize.parseDateTime(this.value, this.valuePattern);
			}
			if (typeof this.delta == 'string'){
				this.delta = new Number(this.delta);
			}
			if (this.delta<=0){
				this.delta=30;
			}
		},

		postCreate: function() {
			this.inherited('postCreate', arguments);
			var date = this.value;
			this.value = null;
			this.setValue('value',date);
		},

		getValue: function() {
			// summary:
			//    returns the value as a date object, day is 1970-01-01
			return this.value;
		},

		setValue: function(/*Date*/date) {
			if (date === undefined){
				date = new Date();
			}else if (typeof date == "string"){
				date = epages.localize.parseDateTime(date, this.valuePattern);
			}

			if(!this.value || dojo.date.compare(date, this.value)){
				this.value = new Date(date);
				this.fillTimes(date);
				this.domNode.value = date == null ? undefined : date.valueOf();
			}
			if(this.value){
				this.dateNode.innerHTML = epages.localize.formatDateTime(this.value);
			}
		},

		fillTimes: function (date) {
			// summary: fill new options
			var date = new Date(this.value);
			date.setHours(0,0,0,0);
			this.dateNode.innerHTML = epages.localize.formatDateTime(date);
			var end = dojo.date.add(date, 'day', 1);
			var dates = [];
			while (date<end) {
				dates.push(date);
				date = dojo.date.add(date,'minute',this.delta);
			}
			this.setTimes(dates);
		},

		setTimes: function (opts) {
			this.dateNode.innerHTML = epages.localize.formatDateTime(this.value);
			var node = this.timesNode;
			// remove children
			while(node.firstChild){ node.removeChild(node.firstChild); }
			// add new options
			var lastCompare = undefined;
			var selected = false;
			var alternate = 0;
			dojo.forEach(opts, function (date) {
				o=document.createElement("div");
				o.innerHTML = epages.localize.formatDateTime(date, this.displayPattern);
				o.setAttribute('value',date.valueOf());
				if (!dojo.date.compare(this.value, date)){
					dojo.addClass(o,'Selected');
					this._selected = o;
					selected = true;
				}
				if(lastCompare == 1 && dojo.date.compare(this.value, date) == -1){
					dojo.addClass(o,'Selected');
					this._selected = o;
					this.value = date;
					selected = true;
				}
				lastCompare = dojo.date.compare(this.value, date);
				if(alternate){
					dojo.addClass(o,'Alternate');
				}
				node.appendChild(o);
				this.connect(o,'onclick', 'onChange');
				alternate=1-alternate;
			}, this);
			if(selected == false && lastCompare){
				if(lastCompare == 1){
					node.lastChild.selected = true;
					dojo.addClass(node.lastChild,'Selected');
					this._selected = node.lastChild;
					this.value = opts[opts.length-1];
				}
				else{
					dojo.addClass(node.firstChild,'Selected');
					this._selected = node.firstChild;
					node.firstChild.selected = true;
					this.value = opts[0];
				}
			}
		},

		onChange: function (evt) {
			var target = evt.currentTarget;
			dojo.removeClass(this._selected,'Selected');
			dojo.addClass(target,'Selected');
			this._selected = target;
			this.value = new Date(Number(target.getAttribute('value')));
			dojo.publish(this.id + '/onChange', [this.value]);
		}
	}
);