/*
addLoadEvent(nameOfSomeFunctionToRunOnPageLoad);
http://simon.incutio.com/archive/2004/05/26/addLoadEvent
*/
function addLoadEvent(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	} else {
		window.onload = function() {
			oldonload();
			func();
		}
	}
}


function toggleVisibility(elementId)
{
	var elm = document.getElementById(elementId);
	if( typeof(elm) != 'undefined' )
	{
		elm.style.display = ( elm.style.display == 'none' ? 'block' : 'none' );
	}
}
function toggleVisible(elementId)
{
	var elm = document.getElementById(elementId);
	if( typeof(elm) != 'undefined' )
	{
		elm.style.visibility = ( elm.style.visibility == 'hidden' ? 'visible' : 'hidden' );
	}
}

/*
	Positions the given posElm next to the given refElm connecting the given corners
	* refCorner: The corner of the refElm to place the posElm by ('topleft', 'topright', 'bottomleft', 'bottomrigt')
	* posCorner: The corner of the posElm to place by the refElm (same options as refCorner)
*/
function positionAtElm(refElm, posElm, refCorner, posCorner)
{
	// Find the position of the reference element
	var refX = findPosX(refElm);
	var refY = findPosY(refElm);
	
	//alert(refElm);
	//alert('refX=' + refX + ' refY=' + refY);
	
	// Determine the position of the element to position
	var posX, posY;
	switch(refCorner)
	{
		case 'topleft':
			posX = refX;
			posY = refY;
			break;
		case 'topright':
			posX = refX + refElm.offsetWidth;
			posY = refY;
			break;
		case 'bottomleft':
			posX = refX;
			posY = refY + refElm.offsetHeight;
			break;
		case 'bottomright':
			posX = refX + refElm.offsetWidth;
			posY = refY + refElm.offsetHeight;
			break;
	}
	switch(posCorner)
	{
		case 'topleft':
			// No action, this is the default corner used by css
			break;
		case 'topright':
			posX -= posElm.offsetWidth;
			break;
		case 'bottomleft':
			posY -= posElm.offsetHeight;
			break;
		case 'bottomright':
			posX -= posElm.offsetWidth;
			posY -= posElm.offsetHeight;
			break;
	}

	//alert('posX=' + posX + ' posY=' + posY);
	
	// Move the element
	posElm.style.left = posX + 'px';
	posElm.style.top = posY + 'px';
}

// http://www.quirksmode.org/js/findpos.html
function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

// http://www.quirksmode.org/js/findpos.html
function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}



/***************************************************************
Non-generic, page-specific javascript methods
***************************************************************/

function toggleCalendar(refID, calID, refCorner, calCorner, type, hiddenID)
{
	var calendar = document.getElementById(calID);
	if( typeof(calendar) != 'undefined' )
	{
		var hiddenField = document.getElementById(hiddenID);
	
		// Show or hide the calendar - if this is a new type, it must be visible
		if( hiddenField.value != type )
			calendar.style.visibility = 'visible';
		else
			toggleVisible(calID);
		
		// Only take further action if the calendar is now visible
		if( calendar.style.visibility == 'visible' )
		{
			// Place the calendar at correct place
			positionAtElm(document.getElementById(refID), calendar, refCorner, calCorner);
			
			// Put the type into the hidden field for server-side reference
			hiddenField.value = type;
		}
	}
}
