
var TIME_ICON = "/icons/famfamfam/clock.png";
var TIME_ICON_ALT = "Choose Time";

function timePicker( el )
{
	var self = this;
	self.el = false;
	self.button = false;
	self.timediv = false;

	self.selectedHour = false;
	self.selectedMinute = false;

	self.hour = false;
	self.minute = false;
	self.ampm = false;

	self.init = function( el )
	{
		self.el = $(el);
		
		// create the icon
		self.button = create("a").set("href", "javascript:void(0)");
		self.button.onclick = function()
		{
			if( self.timediv === false )
			{
				self.redrawTime();
			}
			else
			{
				self.closeTimeDiv();
			}
		};
		self.button.append( create("img").set("src", TIME_ICON).set("alt", TIME_ICON_ALT).set("title", TIME_ICON_ALT) );
		insertAfter( self.el.parentNode, self.button, self.el );
/*		
		self.el.onfocus = self.el.onclick = function()
		{
			if( self.timediv === false )
				{ self.redrawTime(); }
		};
*/
		self.el.onkeyup = self.updateDropdowns;

		// set the initial date.
		if( self.el.value.length != 0 )
		{
			var originalDate = self.el.value.match( /^([0-9]*):([0-9]*)/ );
			self.selectedHour = ( originalDate[1] != '00' ) ? parseInt(originalDate[1]) : self.selectedHour;
			self.selectedMinute = ( originalDate[2] != '00' ) ? parseInt(originalDate[2]) : self.selectedMinute;

			if( self.el.value.match( /[pm|p.m.]/i ) )
				{ self.selectedHour += 12; }
		}

		self.el.setAttribute('timepicker', 1);
	}
	
	self.closeTimeDiv = function()
	{
		self.setSelectedTime();
		delById( self.timediv );
		self.timediv = false;
	}

	/**
	 * redraw the time div for the currently selected time
	 */
	self.redrawTime = function()
	{
		if( self.timediv !== false )
			{ delById( self.timediv ); }
		
		var pos = getElementPosition( self.el );
		self.timediv = self.generateTimediv( self.selectedHour, self.selectedMinute );

		self.timediv.style.top = (pos.y + 22) + "px";
		self.timediv.style.left = pos.x + "px";
	
		self.updateDropdowns();

		document.body.appendChild( self.timediv );	
	};

	self.updateDropdowns = function()
	{
	try {
		var originalTime = self.el.value.match( /^([0-9]{1,2}):([0-9]{2,2})/ );
		
		if( !originalTime || !originalTime[1] || !originalTime[2] )
			{ return; }

		originalTime[1] = parseInt( originalTime[1], 10 );
		originalTime[2] = parseInt( originalTime[2], 10 );

		// update hour
		for( var i=0; i<self.hour.childNodes.length; i++ )
		{
			if( self.hour.childNodes[i].innerHTML == originalTime[1] )
				{ self.hour.childNodes[i].selected = true; }
			else
				{ self.hour.childNodes[i].selected = false; }

		}

		// update minute
		for( var i=0; i<self.minute.childNodes.length; i++ )
		{
			var o1 = parseInt(self.minute.childNodes[i].innerHTML,10);
			var o2 = (self.minute.childNodes[i+1]) ? parseInt(self.minute.childNodes[i+1].innerHTML,10) : 60;

			if( o1 == originalTime[2] || (o1 < originalTime[2] && originalTime[2] < o2 ))
			{ 
				self.minute.childNodes[i].selected = true; 
//				alert( parseInt(originalTime[2])+'('+originalTime[2]+') between '+o1+' and '+o2); 
			}
			else
				{ self.minute.childNodes[i].selected = false; }

		}

		var isPM = ( self.el.value.match( /pm/i ) ) ? true : false;
		for( var i=0; i<self.ampm.childNodes.length; i++ )
		{
			if( (isPM && self.ampm.childNodes[i].innerHTML == 'pm') || (!isPM && self.ampm.childNodes[i].innerHTML == 'am') )
				{ self.ampm.childNodes[i].selected = true; } 
			else
				{ self.ampm.childNodes[i].selected = false; } 
		}
	} catch(e) {}
	};

	self.generateTimediv = function( hour, minute )
	{	
		var timediv = create('div');
//		timediv.className = "lawCal";

		timediv.style.position='absolute';
		timediv.style.width='16em';
		timediv.style.height='3.5em';
		timediv.style.border='5px solid #900';
		timediv.style.backgroundColor='#fff';
		timediv.style.zIndex = '100';
	
		// hours dropdown
		self.hour = create("select");
		for( var i=1; i<=12; i++ )
			{ self.hour.append( create('option').append(i).set('value', i)); }

		// minutes dropdown
		self.minute = create("select");
		var pad = '0';
		for( var i=0; i<=55; i+=5 )
		{
			if( i >= 10 ) { pad = ''; }

			self.minute.append( create('option').append(pad+i).set('value', pad+i) ); 
		}
		
		// ampm dropdown
		self.ampm = create("select");
		self.ampm.append( create('option').append('am').set('value','am') );
		self.ampm.append( create('option').append('pm').set('value','pm') );
		self.ampm.childNodes[1].selected = true;

		var dismiss = create('input').set('type', 'button').set('value','close').set('onclick', self.closeTimeDiv );

		// wrap it in a p
		var p = create('p');
		p.style.margin = "1.45em 0";
		p.style.textAlign = "center";
		p.append( self.hour ).append(':').append( self.minute ).append( self.ampm ).append( dismiss );
		timediv.append( p );
			

		self.ampm.onchange = self.minute.onchange = self.hour.onchange = self.setSelectedTime;

		return timediv;
	};

	self.setSelectedTime = function()
	{
		self.el.value = self.hour.getValue() + ':' + self.minute.getValue() + ' ' + self.ampm.getValue();

		// fire the onchange event if it's needed
		if( self.el.onchange )
			{ self.el.onchange(); }
	};

	self.init( el );
}

/**
 * findTimePickerItems
 *   loop through all input items and find any ones that need the time picking code added
 * 
 * @access public
 * @return void
 */
function findTimePickerItems()
{
	var inputs = document.getElementsByTagName('input');
	var tps = new Array();

	for (var i=0; i < inputs.length; i++) 
	{
		var attr = inputs[i].getAttribute('rel');
		if ( !attr || attr != 'timePicker' )
			{ continue; }

		// don't reprocess ones
		if( inputs[i].getAttribute('timepicker') )
			{ continue; }

		if( inputs[i].getAttribute('type') != 'text' )
			{ continue; }

		// create a new datePicker and push it onto the array.  it may not be needed to keep track of these
		tps.push( new timePicker( inputs[i] ) );
	}
}

// window.onload
addWindowOnload( function() { findTimePickerItems(); } );

/**
 *  
 */
