Bw.Widgets.Timefield =
{
	superclassName: "Bw.Widgets.Editable",
	selfclassName: "Bw.Widgets.Timefield",
	
	create: function (val, minHours, maxHours, stepHours, minMinutes, maxMinutes, stepMinutes)
	{
		var obj = document.createElement ("div");
		
		if (val) obj.setAttribute ("value", val);
		
		var params = (typeof minHours != "undefined");
		
		obj.setAttribute ("minHours", (params) ? minHours : 7);
		obj.setAttribute ("maxHours", (params) ? maxHours : 21);
		obj.setAttribute ("stepHours", (params) ? stepHours : 1);
		obj.setAttribute ("minMinutes", (params) ? minMinutes : 0);
		obj.setAttribute ("maxMinutes", (params) ? maxMinutes : 30);
		obj.setAttribute ("stepMinutes", (params) ? stepMinutes : 30);
		
		Bw.Core.bootstrap (obj, "Bw.Widgets.Timefield");
		
		return obj;
	},

	initialize: function ()
	{
		Bw.Widgets.Widget.initialize.call (this);
		
		this.minHours = this.getAttribute ("minHours") || 7;
		this.maxHours = this.getAttribute ("maxHours") || 21;
		this.stepHours = this.getAttribute ("stepHours") || 1;
		this.minMinutes = this.getAttribute ("minMinutes") || 0;
		this.maxMinutes = this.getAttribute ("maxMinutes") || 30;
		this.stepMinutes = this.getAttribute ("stepMinutes") || 30;
		
		this.draw();
		
		var v = this.getAttribute ("value");
		if (v) this.setValue (v);
	
		var self = this;
		
		this.onupdate = this.getAttribute ("onupdate");
		this.hours.onupdate = function () { self.hoursChanged(); }; 
		this.minutes.onupdate = function () { self.minutesChanged(); }; 
		
		this.onfocus = this.getAttribute ("onfocus");
		this.hours.onfocus = function () { self.focused(); }; 
		this.minutes.onfocus = function () { self.focused(); }; 
	},
	
	clear: function ()
	{
		this.hours.clear();
		this.minutes.clear();
	},
	
	hoursChanged: function ()
	{
		var h = this.hours.getValue();
		var m = this.minutes.getValue();
		
		if (h == this.hours.max && m > this.minutes.min)
		{
			this.hours.setValue (this.hours.max - 1);
		}
		
		this.changed();
	},
	
	minutesChanged: function ()
	{
		var h = this.hours.getValue();
		var m = this.minutes.getValue();
		
		if (m == this.minutes.min && this.minutes.isUp)
		{
			if (h == this.hours.max)
			{
				this.minutes.setValue (this.minutes.max);
			}
			else
			{
				this.hours.setValue(h + 1);
			}
		}
		else if (m == this.minutes.max && !this.minutes.isUp)
		{
			if (h == this.hours.min)
			{
				this.minutes.setValue (this.minutes.min);
			}
			else
			{
				this.hours.setValue (h - 1);
			}
		}
		this.changed();
	},
	
	changed: function ()
	{
		if (this.onupdate) Bw.Util.call (this, this.onupdate);
	},
	
	focused: function ()
	{
		if (this.onfocus) Bw.Util.call (this, this.onfocus);
	},
	
	draw: function ()
	{
		var c = document.createElement ("div");
		
		var h = Bw.Widgets.SpinButton.create (this.minHours, this.maxHours, this.stepHours, "", 2);
		var m = Bw.Widgets.SpinButton.create (this.minMinutes, this.maxMinutes, this.stepMinutes, "", 2);
		m.canWrap = true;
		var s = Bw.Widgets.Label.create (":");
		
		with (h.style)
		{
			width = "45%";
			cssFloat = styleFloat = "left";
		}
		
		with (m.style)
		{
			width = "45%";
			cssFloat = styleFloat = "right";
		}
		
		with (s.style)
		{
			display = "block";
			paddingTop = "3px";
			width = "10%";
			cssFloat = styleFloat = "left";
			textAlign = "center";
		}
		
		s.innerHTML = ":";
		
		c.appendChild (h);
		c.appendChild (s);
		c.appendChild (m);
		
		this.appendChild (c);
		
		s = document.createElement ("div");
		s.style.clear = "both";
		this.appendChild (s);
		
		this.hours = h;
		this.minutes = m;
	},
	
	setValue: function (val)
	{
		if (typeof val == "string") // hh:mm
		{
			var p = val.indexOf (':');
			if (p == -1) return;
						
			var h = val.substring (0, p);
			var m = val.substring (p + 1);
			
			this.hours.setValue (parseInt (h, 10));
			this.minutes.setValue (parseInt (m, 10));
		}
		else
		{
			this.hours.setValue (val.getHours());
			this.minutes.setValue (val.getMinutes());
		}
	},
	
	getValue: function ()
	{
		var d = new Date ();
		d.setHours (this.hours.getValue());
		d.setMinutes (this.minutes.getValue());
		d.setSeconds (0);
		d.setMilliseconds (0);
		return d;
	},
	
	disable: function()
	{
		this.disabled = true;
		this.hours.disable();
		this.minutes.disable();
	},
	
	enable: function ()
	{
	    this.disabled = false;
	 	this.hours.enable();
		this.minutes.enable();
	}
};

