
var isIE		= ( document.all ) ? true : false;
var dateControl	= "";
var eventX		= 0;
var eventY		= 0;

/**
 * Displays the calendar that can be used to select a date value
 *
 * @param	dateFieldID		HTML ID of the date form field
 * @param	e				The triggering event.  This is required
 *							for Mozilla/NN, but ignored by IE.
 * @return	void
 */
function showCalendar ( dateFieldID, mask, e )
{
	var dateField	= document.getElementById ( dateFieldID );
	var calendar	= document.getElementById ( "dateselector_calendar" );
	var calPosition	= new Object();
	var targetURL	= "";

	if ( isIE ) {
		eventY	= event.clientY + document.body.scrollTop;
		eventX	= event.clientX + document.body.scrollLeft;
	}
	else {
		eventY	= e.pageY;
		eventX	= e.pageX;
	}
	
	if ( dateFieldID != dateControl ) {
		targetURL		= "/se/editor/selectors/datetime/calendar.cfm?field=" + dateField.id + "&value=" + dateField.value + "&datemask=" + mask;		
		calendar.src	= targetURL;
		dateControl		= dateFieldID;
	}
	else {
		setCalendarPosition ( calendar );
	}
}

function getCalElementPosition ( element )
{
	var currNode	= element;
	var posObj		= new Object();

	posObj.left		= 0;
	posObj.top		= 0;
	posObj.height	= currNode.offsetHeight;
	posObj.width	= currNode.offsetWidth;								

	while ( currNode && currNode.nodeName != "BODY" ) {
		posObj.left	+= currNode.offsetLeft;
		posObj.top	+= currNode.offsetTop;
		
		currNode	 = currNode.offsetParent;
	}

	return posObj;
}

/**
 * Updates the date form field with the value selected
 * within the calendar
 *
 * @param	dateFieldID		The HTML ID of the date file whose
 *							value will be updated
 */
function setDateValue ( dateFieldID, value )
{
	var dateField	= document.getElementById ( dateFieldID );
	
	dateField.value = value;
	hideCalendar ( dateFieldID );
}

function setTimeValue ( timeFieldID, clock )
{
	var timeField	= document.getElementById ( timeFieldID );
	var hourField	= document.getElementById ( timeFieldID + "_hour" );
	var minField	= document.getElementById ( timeFieldID + "_min" );
	var markerField	= document.getElementById ( timeFieldID + "_marker" );
	
	var timeValue	= hourField.value + ( ( clock == 12 ) ? ":" : "" ) + minField.value + ( ( clock == 12 && markerField ) ? " " + markerField.value : "" );
	
	timeField.value =  ( !isNaN ( parseInt ( timeValue ) ) ) ? timeValue : "";
}

/**
 * Clears the current date and/or datetime value
 *
 * @param	dateFieldID		The HTML ID of the date field
 *							whose value will be cleared
 * @param	timeFieldID		The HTML ID of the time field
 *							whose value will be cleared
 * @return	void
 *
 * @notes	Clearing the time field includes clearing
 *			the hidden field that contains the complete
 * 			time value as well as each time component field.
 */
function clearValue ( dateFieldID, timeFieldID )
{
	var dateField	= document.getElementById ( dateFieldID );
	var timeField	= document.getElementById ( timeFieldID );
	var hourField	= document.getElementById ( timeFieldID + "_hour" );
	var minField	= document.getElementById ( timeFieldID + "_min" );
	var markerField	= document.getElementById ( timeFieldID + "_marker" );
	
	if ( dateField ) {
		dateField.value = "";
	}
	if ( timeField ) {
		timeField.value				= "";
		hourField.selectedIndex		= 0;
		minField.selectedIndex		= 0;
		markerField.selectedIndex	= 0;
	}
}

/**
 * Hides the calendar for a specified date selector
 *
 * @param	dateFieldID		The HTML ID of the date field whose
 * 							calendar is to be hidden
 * @return	void
 */
function hideCalendar()
{
	var calendar	= document.getElementById ( "dateselector_calendar" );
	
	dateControl					= "";
	eventX						= 0;
	eventY						= 0;
	calendar.src				= "about:blank";
	calendar.style.visibility	= "hidden";
	calendar.style.left			= 0;
	calendar.style.top			= 0;
}

function resizeCalendar (srcDocument)
{
	var calendar	= document.getElementById ( "dateselector_calendar" );

	if ( isIE ) {	
		calendar.style.height		= srcDocument.body.scrollHeight;
		calendar.style.width		= srcDocument.body.scrollWidth;
	}
	else {
		calendar.style.height		= srcDocument.body.offsetHeight;
		calendar.style.width		= srcDocument.body.offsetWidth;
	}	
	
	setCalendarPosition ( calendar );
	
	calendar.style.visibility	= "visible";
}

function setCalendarPosition ( element )
{
	/** 
	 * In an ideal world the calendar will drop down from the top, left
	 * corner of the image.  If that will place it (or any part of it)
	 * outside the viewable body, though, we need to re-position.
	 */	
	var calPosition		= getCalElementPosition ( element );
	
	calPosition.left	= eventX;
	calPosition.top		= eventY;
	
	var screenRight		= document.body.scrollLeft + document.body.clientWidth;
	var foldPosition	= document.body.scrollTop + document.body.clientHeight;
	var calRight		= calPosition.left + calPosition.width;
	var calBottom		= calPosition.top + calPosition.height;

	if ( foldPosition < calBottom ) {
		calPosition.top	-= ( calBottom - foldPosition ) + 5;
		/** 
		 * But what if the new top location is negative?  Then we'll just
		 * set the top to 0 and let the scrollbar do its job.
		 */
		calPosition.top	= ( calPosition.top > 0 ) ? calPosition.top : 0;
	}
	if ( screenRight < calRight ) {
		calPosition.left -= ( calRight - screenRight ) + 5;
		/** 
		 * But what if the new left location is negative?  Then we'll just
		 * set the top to 0 and let the scrollbar do its job.
		 */
		calPosition.left = ( calPosition.left > 0 ) ? calPosition.left : 0;
	}
	
	element.style.top	= calPosition.top;
	element.style.left	= calPosition.left;
}