/*
	Expressivetek Calander - Written by Daniel Ostrander
	May 6 2008
	Version 3.0
	
	New Features 3.0
		No longer Read Only ( allows users to type into field directly )
		Minor bug fixes with Date entry.
		Supports Font and Field Width Settings
		Allows you to set ID and Name of fields independently.
		Moves it self into visible space.
		
	New Features 2.0
		Header Configuration
		Bug Fixes
		Year and Month Selectors
*/

var MakeDatePicker_Set=null;
var MakeDatePicker_TimeTool=null;

function MakeDatePicker_Err(err)
{
	try
	{
		console.debug( err );
	}
	catch(e)
	{
		alert( err );
	}
}

function HideDatePickers()
{
	try
	{
		if ( MakeDatePicker_Set != null )
		{ MakeDatePicker_Set.parentNode.removeChild( MakeDatePicker_Set ); }
		MakeDatePicker_Set=null;
	}
	catch( e )
	{
		MakeDatePicker_Err( e );
	}
}

//General Settings
var MakeDatePicker_Header_White = true;
var MakeDatePicker_ExtraPath = ""; // Use this to point the real pages to the calander graphics... ( use a blank string if you just copied the images into your images folder ) 
var MakeDatePicker_Color = "#00427b";

//Field Settings
var MakeDatePicker_FieldWidth = null;// ex "80px";

//Font Settings
var MakeDatePicker_FontSize = null;// ex "11px";
var MakeDatePicker_FontFamily = null;// ex "Verdana";

// Day / Month, Name Settings
var MakeDatePicker_Months_Long	= ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
var MakeDatePicker_Days_Long	= ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var MakeDatePicker_Days_Short	= ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];

function daysInMonth(iMonth, iYear)
{
	return 32 - new Date(iYear, iMonth, 32).getDate();
}

function DatePicker_SetFont( Ele )
{
	if ( MakeDatePicker_FontSize != null ) 
		Ele.style.fontSize = MakeDatePicker_FontSize;
		
	if ( MakeDatePicker_FontFamily != null ) 
		Ele.style.fontFamily = MakeDatePicker_FontFamily;
}

function DateTimeCalander_Cell( DayCell , color )
{
	DayCell.style.backgroundColor=color;
	DayCell.align='center';
	DayCell.style.width='222px';
	DayCell.style.height='14px';
	DatePicker_SetFont( DayCell );
}

function YearDropList( c , update , cvg )
{
	var cv=null;
	if ( cvg )
	{
		cv=cvg;
	}
	else
	{
		cv = document.createElement( 'div' );
	}
	
	var TDiv = document.createElement( 'div' );
	var Table = document.createElement( 'table' );
	var TBody = document.createElement( 'tbody' );
	
	TDiv.appendChild( Table );
	Table.appendChild( TBody );
	
	Table.border="0";
	Table.cellPadding="0";
	Table.cellSpacing="0";
	
	var Row = document.createElement( 'tr' );
	var td = document.createElement( 'td' );
	var img = document.createElement( 'img' );
	img.src=MakeDatePicker_ExtraPath+"images/up.gif";
	img.style.cursor="pointer";
	img.onclick=function() { YearDropList( c - 1 , update , cv ) };
	Row.appendChild( td );
	td.align="center";
	td.appendChild( img );
	Row.appendChild( td );
	TBody.appendChild( Row );
	
	var x;
	for ( x=-3; x<=3; x++ )
	{
		var d = c+x;
		var Row = document.createElement( 'tr' );
		var td = document.createElement( 'td' );
		td.onclick= function() { TDiv.style.display="none"; update( this.idxYear );  }
		td.idxYear = d;
		td.style.cursor="pointer";
		td.appendChild( document.createTextNode( d ) );

		DatePicker_SetFont( td );
		
		TBody.appendChild( Row );
		Row.appendChild( td );
	}
	
	var Row = document.createElement( 'tr' );
	var td = document.createElement( 'td' );
	var img = document.createElement( 'img' );
	img.src=MakeDatePicker_ExtraPath+"images/down.gif";
	img.style.cursor="pointer";
	img.onclick=function() { YearDropList( c + 1 , update , cv ) };
	Row.appendChild( td );
	td.align="center";
	td.appendChild( img );
	Row.appendChild( td );
	TBody.appendChild( Row );
	
	
	TDiv.style.position="absolute";
	TDiv.style.display='none';
	TDiv.style.backgroundColor="white";
	TDiv.style.border="1px solid black";
	TDiv.style.padding="4px";
	TDiv.style.marginTop="-6px";

	
	if ( cvg )
	{
		TDiv.style.display="block";
		cv.deleteDiv( TDiv );
		cv.deleteDiv = function(G) { cv.replaceChild( G , TDiv ) };
	}
	else
	{
		cv.appendChild( TDiv );
		cv.appendChild( document.createTextNode( c ) );
		
		cv.onclick= function() { cv.HideOther(); TDiv.style.display='block'; };
		
		cv.deleteDiv = function(G) { cv.replaceChild( G , TDiv ); };
		cv.Hide = function() { TDiv.style.display="none"; };
			
		return cv;
	}
}

function MonthDropList( c , update )
{
	var cv= document.createElement( 'div' );
	
	var TDiv = document.createElement( 'div' );
	var Table = document.createElement( 'table' );
	var TBody = document.createElement( 'tbody' );
	
	TDiv.appendChild( Table );
	Table.appendChild( TBody );
	
	Table.border="0";
	Table.cellPadding="0";
	Table.cellSpacing="3";

	var x=0;
	var Row = document.createElement( 'tr' );
	for ( x=0; x<12; x++ )
	{
		var d = x;
		var td = document.createElement( 'td' );
		td.onclick= function() { TDiv.style.display="none"; update( this.idxMonth );  }
		td.idxMonth = d;
		td.style.cursor="pointer";
		td.appendChild( document.createTextNode( MakeDatePicker_Months_Long[x] ) );

		DatePicker_SetFont( td );
	
		Row.appendChild( td );
		if ( x == 1 || x==3 || x==5 || x==7 || x==9 || x == 11 )
		{
			TBody.appendChild( Row );
			Row = document.createElement( 'tr' );
		}
	}	
	
	TDiv.style.position="absolute";
	TDiv.style.display='none';
	TDiv.style.backgroundColor="white";
	TDiv.style.border="1px solid black";
	TDiv.style.padding="4px";
	TDiv.style.marginLeft="1px";
	TDiv.style.marginTop="-5px";
	
	gDiv = document.createElement( 'div' );
	gDiv.appendChild( document.createTextNode( MakeDatePicker_Months_Long[c] ) );
	gDiv.style.textAlign='right';

	
	//cv.appendChild( TDiv );
	cv.appendChild( gDiv );
	
	cv.onclick= function() { cv.HideOther(); TDiv.style.display='block'; };
	
	cv.Hide = function() { TDiv.style.display="none"; };
	
	cv.deleteDiv = function(G) { cv.replaceChild( G , TDiv ); };
	
	var cvC = new Array();
	cvC[0] = cv;
	cvC[1] = TDiv;
	return cvC;
}

function CalanderControls( target, div , cell , SObj , img )
{
	try
	{
		var next_month= ( 2 + SObj.getMonth() ) + '/' + SObj.getDate() + '/' + SObj.getFullYear();
		var prev_month= ( SObj.getMonth() ) + '/' + SObj.getDate() + '/' + SObj.getFullYear();
		
		var DayTab = document.createElement( 'table' );
		var DayBod = document.createElement( 'tbody' );
		var DayRow = document.createElement( 'tr' );
		
		DayTab.appendChild( DayBod );
		DayBod.appendChild( DayRow );
		
		DayTab.width="100%";
		
		var CurMon = document.createElement( 'td' );
		var NextMon = document.createElement( 'td' );
		var PrevMon = document.createElement( 'td' );
		var MonthMount = document.createElement( 'td' );
		
		CurMon.align="center";
		NextMon.width="1";
		PrevMon.width="1";
		
		
		var CurMonTable = document.createElement( 'table' );
		var CurMonTBody = document.createElement( 'tbody' );
		var CurMonRow = document.createElement( 'tr' );
		
		var CurMonA = document.createElement( 'td' );
		var CurMonB = document.createElement( 'td' );
		var CurMonC = document.createElement( 'td' );
		
		var MDLg=MonthDropList( SObj.getMonth() , function(g_month) { ShowDatePicker( img , target , (g_month+1) + '/' + SObj.getDate() + '/' + SObj.getFullYear() ); } );
		var YDL=YearDropList( SObj.getFullYear() , function(g_year) { ShowDatePicker( img , target , (SObj.getMonth()+1) + '/' + SObj.getDate() + '/' + g_year ); } );

		var MDL=MDLg[0];
		
		MDL.style.cursor="pointer";
		YDL.style.cursor="pointer";
		
		var HideOther= function() { MDL.Hide() , YDL.Hide() };
		MDL.HideOther = HideOther;
		YDL.HideOther = HideOther;
		
		CurMonA.appendChild( MDL ); 
		CurMonB.appendChild( document.createTextNode( '-' ) );
		CurMonC.appendChild( YDL );

		DatePicker_SetFont( CurMonA );
		DatePicker_SetFont( CurMonB );
		DatePicker_SetFont( CurMonC );
		
		
		CurMon.appendChild( CurMonTable );
		CurMonTable.appendChild( CurMonTBody );
		CurMonTBody.appendChild( CurMonRow );
		CurMonRow.appendChild( CurMonA );
		CurMonRow.appendChild( CurMonB );
		CurMonRow.appendChild( CurMonC );

		
		NextMon.style.cursor="pointer";
		NextMon.onclick=function() { ShowDatePicker( img , target , next_month ); };
		NextMon.appendChild( document.createTextNode( '>' ) );
		
		PrevMon.style.cursor="pointer";
		PrevMon.onclick=function() { ShowDatePicker( img , target , prev_month ); };
		PrevMon.appendChild( document.createTextNode( '<' ) );
		
		MonthMount.width="1";
		MonthMount.appendChild( MDLg[1] );
		
		DayRow.appendChild( PrevMon );
		DayRow.appendChild( MonthMount );
		DayRow.appendChild( CurMon );
		DayRow.appendChild( NextMon );
		
		cell.appendChild( DayTab );
	}
	catch( e )
	{
		MakeDatePicker_Err( e );
	}
}

function CreateCalander( target , div , replace_target, img  )
{
	try
	{
		var cDate = document.getElementById( target ).value;

		
		var toDay = new Date();

		var MDY = cDate.split( '/' );
		
		var DObj = new Date();
		if ( !isNaN( MDY[2] ) )
			DObj.setFullYear( MDY[2] );
		
		if ( !isNaN( MDY[0] ) )
			DObj.setMonth( MDY[0]-1 );
		
		if ( !isNaN( MDY[1] ) )
			DObj.setDate( MDY[1] );
			
		cDate = ( 1 + DObj.getMonth() ) + '/' + DObj.getDate() + '/'  +DObj.getFullYear();
		MDY[0]=DObj.getMonth()+1;
		MDY[1]=DObj.getDate();
		MDY[2]=DObj.getFullYear();
		
		if ( replace_target != null )
		{
			MDY = replace_target.split( '/' );
		}
		
		var SObj = new Date();
		SObj.setFullYear( MDY[2] );
		SObj.setMonth( MDY[0]-1 );
		SObj.setDate( MDY[1] );
		
		var DObjM = new Date();
		DObjM.setFullYear( MDY[2] );
		DObjM.setMonth( MDY[0]-1 );
		DObjM.setDate( 1 );

		var sday= DObjM.getDay();
		
		DObjM.setDate( -sday + 1 );
		
		DaysMin = daysInMonth( MDY[0]-1 , MDY[2] ) + sday;
		DaysMax = Math.ceil(DaysMin / 7.0) * 7.0;
		
		
		/* Main Table Elements */
		MainTab = document.createElement( 'table' );
		MainTab.width=188;
		MainBod = document.createElement( 'tbody' );
		MainRowA = document.createElement( 'tr' );
		MainRowB = document.createElement( 'tr' );
		MainCellA = document.createElement( 'td' );
		MainCellB = document.createElement( 'td' );
		
		/* Main Table Structure */
		MainRowA.appendChild( MainCellA );
		MainRowB.appendChild( MainCellB );
		MainBod.appendChild( MainRowA );
		MainBod.appendChild( MainRowB );
		MainTab.appendChild( MainBod );
		
		/* Day Table... */
		DayTab = document.createElement( 'table' );
		DayBod = document.createElement( 'tbody' );
		DayRow = document.createElement( 'tr' );
		
		DayTab.appendChild( DayBod );
		DayBod.appendChild( DayRow );

		for ( x=0; x<MakeDatePicker_Days_Short.length; x++ )
		{
			DayCell = document.createElement( 'td' );
			DayCell.title=MakeDatePicker_Days_Long[ x ];
			DayCell.appendChild( document.createTextNode( MakeDatePicker_Days_Short[ x ] ) );
			DateTimeCalander_Cell( DayCell , MakeDatePicker_Color );
			if ( MakeDatePicker_Header_White )
			{
				DayCell.style.color='white';
			}
			
			DayRow.appendChild( DayCell );
		}
		
		for ( x = 0; x<DaysMax; x++ )
		{
			if ( x % 7 == 0 )
			{
				DayRow = document.createElement( 'tr' );
				DayBod.appendChild( DayRow );
			}
			
			DayCell = document.createElement( 'td' );
			DayCell.style.cursor='pointer';
			DayCell.appendChild( document.createTextNode( DObjM.getDate() ) );
			var values = ( DObjM.getMonth() + 1 ) + '/' +  DObjM.getDate() + '/' + DObjM.getFullYear();
			
			try
			{
				DayCell.xValue=values;
				DayCell.onclick = function() 
										{
											try
											{
												document.getElementById( target ).value=this.xValue;
												HideDatePickers();
											}
											catch(e)
											{
												MakeDatePicker_Err( e );
											}
										};
			}
			catch( e )
			{
				MakeDatePicker_Err( e );
			}

			if ( toDay.getDate() == DObjM.getDate() && toDay.getMonth() == DObjM.getMonth() && toDay.getFullYear() == DObjM.getFullYear() )
				{	DateTimeCalander_Cell( DayCell , '#e0e0f0' ); }
			else
				{	DateTimeCalander_Cell( DayCell , 'white' ); }
				
			if ( DObj.getDate() == DObjM.getDate() && DObj.getMonth() == DObjM.getMonth() && DObj.getFullYear() == DObjM.getFullYear() )
				{	DayCell.style.border='solid 1px '+MakeDatePicker_Color; }
				
			DayRow.appendChild( DayCell );
			
			DObjM.setDate( DObjM.getDate() + 1 );
		}
		
		CalanderControls( target, div , MainCellA , SObj , img )
		MainCellB.appendChild( DayTab );
		
		DatePicker_SetFont( MainTab );
		
		div.appendChild( MainTab );
	}
	catch( e )
	{
		MakeDatePicker_Err( e );
	}
}

function ETDP_findPos(obj) 
{
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft;
		curtop = obj.offsetTop;
	
		var oobj=obj;
		while (obj = obj.offsetParent) 
		{
			
			try
			{
				curtop += obj.offsetTop;
				curleft += obj.offsetLeft;
			}
			catch(e) { }
			
		}
		
		while (oobj = oobj.parentNode) 
		{
			try
			{
				if ( oobj.scrollTop )
				{
					curtop -= oobj.scrollTop;
				}
				if ( oobj.scrollLeft )
				{
					curleft -= oobj.scrollLeft;
				}
			}
			catch(e) { }
		}
		
	}
	return [curleft,curtop];
}

function ShowDatePicker( img , target , replace_target )
{
	HideDatePickers();
	try
	{
		divE = document.createElement( 'div' );
		
		/* These Two Events handle the problems with hover/unhover mouse events, so the calander goes away if you leave it */
		divE.onmouseout = function() 
								{ 
									window.clearTimeout( MakeDatePicker_TimeTool );
									MakeDatePicker_TimeTool=window.setTimeout( 'HideDatePickers();' , 500 );
								};
		divE.onmouseover = function() 
								{ 
									window.clearTimeout( MakeDatePicker_TimeTool );
								};
		
		divE.style.position="absolute";
		divE.style.backgroundColor = 'white';
		divE.style.border = 'solid 1px '+MakeDatePicker_Color;
		
		MakeDatePicker_Set=divE;
		img.parentNode.insertBefore( divE , img );
		CreateCalander(target,divE,replace_target, img );
		
		//Push the calander into view
		var myWidth = 0, myHeight = 0;		
		if( typeof( window.innerWidth ) == 'number' ) 
		{
			//Non-IE
			myWidth = window.innerWidth;
			myHeight = window.innerHeight;
		}
		else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) 
		{
			//IE 6+ in 'standards compliant mode'
			myWidth = document.documentElement.clientWidth;
			myHeight = document.documentElement.clientHeight;
		}
		else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) 
		{
			//IE 4 compatible
			myWidth = document.body.clientWidth;
			myHeight = document.body.clientHeight;
		}
		pos = ETDP_findPos( divE );
		if ( pos[0] + divE.offsetWidth+20 > myWidth )
			divE.style.marginLeft = ( myWidth - ( pos[0] + divE.offsetWidth+20 ) ) + 'px';
		if ( pos[1] + divE.offsetHeight+20 > myHeight )
					divE.style.marginTop = ( myHeight - ( pos[1] + divE.offsetHeight+20 ) ) + 'px';
			
	}
	catch(e)
	{
		MakeDatePicker_Err( e );
	}
}

function MakeDatePicker( id , ele_id, ele_nam , value  )
{
	try
	{
		inputE = document.createElement( 'input' );
		imgE = document.createElement( 'img' );
		divE = document.createElement( 'div' );

		DatePicker_SetFont( inputE );
		try { inputE.style.width = MakeDatePicker_FieldWidth; } catch(e) { }
		
		var today=new Date();
		var h=today.getHours();
		var m=today.getMinutes();
		var s=today.getSeconds();
			
		if ( value == null )
		{
			inputE.value= ( 1 + today.getMonth() ) + '/' + today.getDate() + '/'  +today.getFullYear()
		}
		else
		{
			var MDY = value.split( '-' );
			if ( MDY.length == 3 )
			{ value = MDY[1] + '/' + MDY[2] + '/' + MDY[0]; }
				
			inputE.value=value;
		}
		
		inputE.size=10;
		inputE.name = ele_nam;
		inputE.id= ele_id;
		inputE.readOnly=false;

		imgE.style.cursor="pointer";
		imgE.onclick = function() { ShowDatePicker(this, ele_id ); };
		imgE.src=MakeDatePicker_ExtraPath+"images/cal.gif";
		
		div = document.getElementById( id );

		Tab = document.createElement( 'table' );
		TabB = document.createElement( 'tbody' );
		RA = document.createElement( 'tr' );
		CA = document.createElement( 'td' );
		CB = document.createElement( 'td' );
		
		CB.align='center';
		CB.valign='middle';
		CA.padding = 0 + "px";
		
		divE.appendChild( imgE );
		
		CA.appendChild( inputE );
		CB.appendChild( divE );

		RA.appendChild( CA );
		RA.appendChild( CB );
		TabB.appendChild( RA );
		Tab.appendChild( TabB );
		div.appendChild( Tab );
	}
	catch( e )
	{
		MakeDatePicker_Err( e );
	}
}
