function onLoad()
{
	call('onPageLoad()');
	call('onControlLoad()');
}

function getEvent(evt)
{
	return (evt ? evt : (window.event ? window.event : null));
}

function getParent(ctrl)
{
	if (ctrl)
		return (ctrl.parentNode ? ctrl.parentNode : (ctrl.parentElement ? ctrl.parentElement : null));
	return null;
}

function getAncestor(ctrl, tagName)
{
	tagName = (tagName ? tagName.toLowerCase() : null);
	var parent = ctrl;
	while (parent && (!parent.tagName || (parent.tagName.toLowerCase() != tagName)))
		parent = getParent(parent);
	return parent;
}

function getTableRow(ctrl)
{
	var parent = getParent(ctrl);
	while (parent && (!parent.tagName || (parent.tagName.toLowerCase() != "tr")))
		parent = getParent(parent);
	return parent;
}

function keyCode(evt)
{
	return (evt.charCode ? evt.charCode : (evt.which ? evt.which : evt.keyCode));
}

function isEnter(key)
{
	return (key == 13);
}

function isEscape(evt)
{
	evt = getEvent(evt);
	return (evt && (keyCode(evt) == 27));
}

function isDigit(key)
{
	return ((key >= 48) && (key <= 57));
}

function eatEnterKey(evt)
{
	evt = getEvent(evt);
	if (evt && isEnter(keyCode(evt)))
	{
		cancelEvent(evt);
		return true;
	}
	return false;
}

function cancelEvent(evt)	// cancels an event & prevents further event bubbling
{
	if (evt)
	{
		if (evt.preventDefault)
		{
			evt.preventDefault();
			evt.stopPropagation();
		}
		else	// IE
		{
			evt.returnValue = false;
			evt.cancelBubble = true;
		}
	}
	return false;
}

function click(ctrl)
{
	if (!ctrl)
		return;

	if (isString(ctrl))
	{
		ctrl = getById(ctrl);
		if (!ctrl)
			return;
	}

	if (ctrl.click)
		ctrl.click();
	else
	{
		var evt = document.createEvent('MouseEvents');
		evt.initEvent('click', true, true);
		ctrl.dispatchEvent(evt);
	}
}

function digitFilter(evt)
{
	evt = getEvent(evt);
	if (!evt)
		return true;

	if (!isIE() && isNavigation(evt.keyCode))
		return true;

	var key = keyCode(evt);
	var cancel = (evt.shiftKey || !isDigit(key));
	return (cancel ? cancelEvent(evt) : true);
}

function IsValidHexDigit(keyCode)
{
	if (keyCode == 35 || (keyCode >= 65 && keyCode <= 70))
		return true;
	if (keyCode >= 97 && keyCode <= 102)
		return true;
	    
	return false;
}

function IsValidNumericKey(keyCode, el, shiftKey)
{
	if (keyCode >= 48 && keyCode <= 57)
		return true;
	if (keyCode >= 96 && keyCode <= 105)
	{
		return true;
	}

	return isNavigation(keyCode);
}

function isNavigation(key)
{
	switch (key)
	{
		case 9:   // tab
		case 16:  // shift
		case 46:  // Delete
		case 8:   // Backspace
		case 33:  // page up
		case 34:  // page down
		case 35:  // end
		case 36:  // home
		case 37:  // up
		case 38:  // right
		case 39:  // down
		case 40:  // left
			return true;
		default:
			return false;
	}
}

function ColorEditKeyDown(evt)
{
		evt = (evt) ? evt : ((this.document.parentWindow.event) ? this.document.parentWindow.event : null);
		if (evt) 
		{
			var elem = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
			if (elem)
			{
				// Hex Value cannot be longer that 6 characters
				if(document.selection)
				{
					//IE
					if(!(isNavigation(evt.keyCode)) && (elem.value.length - document.selection.createRange().text.length) >= 6)
						return false;
				}
				else
				{
					//FF
					if(!(isNavigation(evt.keyCode)) && (elem.value.length - document.getSelection().length) >= 6)
						return false;
				}
					
				var charCode = (evt.charCode) ? evt.charCode : ((evt.which) ? evt.which : evt.keyCode);
	            
				if (evt.shiftKey && !IsValidHexDigit(charCode))
				{
					if (evt.returnValue)
						evt.returnValue  = false;
					if (evt.cancelBubble)
						evt.cancelBubble = true;
					if (evt.preventDefault) 
						evt.preventDefault();
					if (evt.stopPropagation) 
						evt.stopPropagation();
					return false;
				}
				else if (!IsValidNumericKey(charCode, elem, evt.shiftKey) && !IsValidHexDigit(charCode))
				{
					if (evt.returnValue)
						evt.returnValue  = false;
					if (evt.cancelBubble)
						evt.cancelBubble = true;
					if (evt.preventDefault) 
						evt.preventDefault();
					if (evt.stopPropagation) 
						evt.stopPropagation();
					return false;
				}
			}
			else 
			{
				if (evt.returnValue)
					evt.returnValue  = false;
				if (evt.cancelBubble)
					evt.cancelBubble = true;
				if (evt.preventDefault) 
					evt.preventDefault();
				if (evt.stopPropagation) 
					evt.stopPropagation();
				return false;
			}
		}
	}

function enableButton(buttonID, enable)
{
	var restartButton = getById(buttonID);
	restartButton.disabled = !enable;
	restartButton.className = (enable ? "button" : "buttonDisabled");
}
