

//Set Hidden Input On Form
function SHV(hiddenInput, hiddenValue)
{
	f = document.forms[0];
	f[hiddenInput].value = hiddenValue;
}
//sets hidden value of input from id
function SID(hiddenInput, guidArrayIndex)
{
	SHV(hiddenInput, GuidArray[guidArrayIndex]);
}
//Generic Link Creator Makes ReturnUrl and Scroll Position
function L(scriptPath, excludeReturnUrl)
{
	//alert(Root + scriptPath);
	//alert(AppendReturnUrl(Root + scriptPath));
	var hyperLink = AppendAdditionalHiddenElementNamesToHyperLink(Root + scriptPath);

	if(excludeReturnUrl)
	{
		window.location.href = hyperLink;
	}
	else
	{
		window.location.href = AppendReturnUrl(hyperLink);
	}
}

//generic link object, takes script path and concatenates id to path.
function LO(scriptPath, guidArrayIndex, optionalNameString)
{
	
	if(scriptPath.indexOf("?") >= 0)
	{
		scriptPath += "&";
	}
	else
	{
		scriptPath += "?";
	}
	
	if(!optionalNameString)
	{
		optionalNameString = "Id";
	}
	
	L(scriptPath + optionalNameString + "=" + GuidArray[guidArrayIndex]);
	
}
//Appends the ReturnUrl to the Link
function AppendReturnUrl(scriptPath, returnUrl)
{
	if(!returnUrl)
	{
		returnUrl = ReturnUrl;
	}
		
	returnUrl = AppendScrollLocation(returnUrl);
	
	if(scriptPath.indexOf("?") >= 0)
	{
		scriptPath += "&";
	}
	else
	{
		scriptPath += "?";
	}
	scriptPath += "ReturnUrl=" + escape(returnUrl);
	
	return scriptPath;	
}
//Appends the Scroll Position to the ReturnUrl
function AppendScrollLocation(returnUrl)
{
	f = document.forms[0];
	if(f["__sx"])
	{
		if(returnUrl.indexOf("?") >= 0)
		{
			returnUrl += "&_sx=" + f["__sx"].value;
		}
		else
		{
			returnUrl += "?_sx=" + f["__sx"].value;
		}
	}
	if(f["__sy"])
	{
		returnUrl += "&_sy=" + f["__sy"].value;
	}
	
	if(AdditionalHiddenElementNamesToAppendToReturnUrl != null)
	{
		for(var i = 0; i < AdditionalHiddenElementNamesToAppendToReturnUrl.length; i++)
		{
			var elementName = AdditionalHiddenElementNamesToAppendToReturnUrl[i]
			var element = GetElementById(elementName);
			if(element)
			{
				if(element.value != "")
				{
					//add extra "_" for these columns (backward from scrolling);
					//we may want to move the prefix out of here and into the base and supply the prefix
					//in the element name, this prevents it from being added continuously into the return url.
					returnUrl += "&" + "_00_" + elementName + "=" + element.value;
				}
			}
		}	
	}
	
	return returnUrl;
}
//appends additional parameters to the hyperlink before adding the return url.
function AppendAdditionalHiddenElementNamesToHyperLink(hyperLink)
{
	if(AdditionalHiddenElementNamesToAppendToHyperLink != null)
	{
		for(var i = 0; i < AdditionalHiddenElementNamesToAppendToHyperLink.length; i++)
		{
			var elementName = AdditionalHiddenElementNamesToAppendToHyperLink[i];
			var element = GetElementById(elementName);
			if(element)
			{
				var elementValue = element.value;
				if(elementValue != "")
				{
					//add extra "_" for these columns (backward from scrolling);
					//we may want to move the prefix out of here and into the base and supply the prefix
					//in the element name, this prevents it from being added continuously into the return url
					//and also helps the program tell the difference between parameters of control sent from
					//another script vs. the current script.
					if(hyperLink.indexOf("?") >= 0)
					{
						hyperLink += "&" + "_00_" + elementName + "=" + element.value;
					}
					else
					{
						hyperLink += "?" + "_00_" + elementName + "=" + element.value;
					}
				}
			}
		}
	}
	return hyperLink;
}


//takes checkbox name and creates a comma separated list of the ids of these checkboxes.
function CreateGuidStringFromCheckBoxIndexes(checkBoxName)
{
	f = document.forms[0];
	var ids = "";


	if(f[checkBoxName])
	{
		if(f[checkBoxName].length)
		{
			for(i=0; i < f[checkBoxName].length; i++)
			{
				if(f[checkBoxName][i].checked)
				{
					if(ids != "")
					{
						ids += ",";
					}
					
					ids += GuidArray[f[checkBoxName][i].value];
				}
			}
		}
		else
		{
			if(f[checkBoxName].checked)
			{
				ids = GuidArray[f[checkBoxName].value];
			}
		}
	}
	
	return ids;
}

function CreateGuidStringFromIndexArray(indexArray)
{
	var ids = "";
	
	for(i=0; i < indexArray.length; i++)
	{
		if(ids != "")
		{	
			ids += ",";
		}
		if(GuidArray[indexArray[i]])
		{
			ids += GuidArray[indexArray[i]];
		}
	}
	return ids;
}
function CreateCommaSeparatedStringFromArrayMembers(array)
{
	var s = "";
	
	if(array)
	{
		for(var i = 0; i < array.length; i++)
		{
			if(s != "")
			{
				s += ",";
			}
			var a = array[i];
			
			if(a != null)
			{
				s += a;
			}
		}
	}
	return s;
}

/**********************************************************
On Load Hookup
**********************************************************/
var OnLoad  =   
{
	aFunctions :
		[],
	AddFunction :
		function(oFunctionPointer)
		{
			if(!this.Loaded)
			{
				this.aFunctions[this.aFunctions.length] = oFunctionPointer;
			}
			else
			{
				oFunctionPointer();
			}
		},
	CallFunctions :
		function()
		{
			for(oFunctionPointer in this.aFunctions)
			{
				this.aFunctions[oFunctionPointer]();
			}
			this.Loaded = true;
		},
	Loaded :
		false
};
onload = function(){ OnLoad.CallFunctions(); };
/**********************************************************
On Scroll Hookup
**********************************************************/
var OnScrollFunctions  =   
{
	aFunctions :
		[],
	AddFunction :
		function(oFunctionPointer)
		{
			if(!this.Loaded)
			{
				this.aFunctions[this.aFunctions.length] = oFunctionPointer;
			}
			else
			{
				oFunctionPointer();
			}
		},
	CallFunctions :
		function()
		{
			for(oFunctionPointer in this.aFunctions)
			{
				this.aFunctions[oFunctionPointer]();
			}
			this.Loaded = true;
		},
	Loaded :
		false
};

window.onscroll = function(){ OnScrollFunctions.CallFunctions(); };
/**********************************************************
On Window Resize
***********************************************************/

var OnWindowResizeFunctions  =   
{
	aFunctions :
		[],
	AddFunction :
		function(oFunctionPointer)
		{
			if(!this.Loaded)
			{
				this.aFunctions[this.aFunctions.length] = oFunctionPointer;
			}
			else
			{
				oFunctionPointer();
			}
		},
	CallFunctions :
		function()
		{
			for(oFunctionPointer in this.aFunctions)
			{
				this.aFunctions[oFunctionPointer]();
			}
			this.Loaded = true;
		},
	Loaded :
		false
};
function WindowResize()
{
	OnWindowResizeFunctions.CallFunctions();
}
window.onresize = function(){ OnWindowResizeFunctions.CallFunctions(); };

/***********************************************************
Get Element By Id (Cross Browser)
************************************************************/
function GetElementById(elementId)
{
	var element = document.getElementById(elementId)

	if(!element)
	{
		element = document.forms[0][elementId];
	}
	return element;
}

/**********************************************************
Get Element Document/Page Coordinates
***********************************************************/
function GetPageXCoordinate(element)
{
	if(element)
	{
		var offsetParent = element.offsetParent;
		var offsetLeft = element.offsetLeft;
		
		while(offsetParent != null && offsetParent != "BODY")
		{
			offsetLeft += offsetParent.offsetLeft;
			offsetParent = offsetParent.offsetParent;
		}
		return offsetLeft;
	}
}
function GetPageYCoordinate(element)
{
	if(element)
	{
		var offsetParent = element.offsetParent;
		var offsetTop = element.offsetTop;
	
		
		while(offsetParent != null && offsetParent != "BODY")
		{
			offsetTop += offsetParent.offsetTop;
			offsetParent = offsetParent.offsetParent;
		}
		return offsetTop;
	}
}

/**********************************************************
Get window width and height
***********************************************************/
function GetWindowHeight()
{
	if(IsSafari())
	{
		return window.innerHeight;
	}
	else
	{
		return document.body.clientHeight;
	}
}
function GetWindowWidth()
{
	if(IsSafari())
	{
		return window.innerWidth;
	}
	else
	{
		return document.body.clientWidth;
	}
}
/**********************************************************
Change element class name
***********************************************************/
function ChangeElementClassName(element, className)
{
	if(element)
	{
		element.className = className;
	}
}
/**********************************************************
Image Changing Functions (Depricate?)
**********************************************************/

//STW 2003-04-27 override the previous one, which does not work on Tree's for whatever reason.  
function ChangeImage(sImageId, sImageName)
{
	if(document.images && document[sImageId] && eval("window."+sImageName))
	{
		document[sImageId].src = eval(sImageName + ".src");
	}
}
function ChangeInputImage(inputImage,imgObjName)
{
	//If the browser supports rollovers then change the image.
	if (document.getElementById)
	{
		inputImage.src = eval(imgObjName + ".src");
	}
}
//swaps an image inside a hyperlink
function HyperLinkSwapImage(element, imageUrl)
{
	if(element)
	{
		element.src = imageUrl;
	}
}
/**********************************************************
Enter Postback Functions
**********************************************************/
function IsEnterKey(localEvent)
{

	if(navigator.appName == "Netscape" && parseInt(navigator.appVersion) >= 4) 
	{	
		if(localEvent.which)
		{
			return (localEvent.which == 13)
		}
		else
		{
			return false;
		}
	}
	else
	{
		if (!localEvent)
		{
			localEvent = window.event;
		}
		return (localEvent.keyCode == 13);
	}
}

function EKH(localEvent, key)
{
	if(IsEnterKey(localEvent))
	{
		var e = GetElementById(key);
		
		if(e)
		{
			SubmitUsingSetTimeout(key);
		}
		return false;
	}
	
	return true;
}


/**********************************************************
Context Help Functions
**********************************************************/
//show context help
function SHlp(localEvent, helpText, helpWidth, offsetX, offsetY)
{
	
	if(!localEvent)
	{
		return;
	}
	if(helpText != "")
	{
		var contextHelp = GetElementById("ContextHelp");
		var helpHtml;
		
		if(helpWidth)
		{
			helpHtml = "<table width=\"" + helpWidth + "\"><tr><td>" + helpText + "</td></tr></table>";
		}
		else
		{
			helpHtml = "<table><tr><td>" + helpText + "</td></tr></table>";
		}
		contextHelp.innerHTML = helpHtml;
		contextHelp.style.display = "";
		contextHelp.style.visibility = "visible";
		
		var x;
		var y;
		
		if(navigator.appName == "Netscape" && parseInt(navigator.appVersion) >= 4) 
		{
			x = localEvent.pageX;
			y = localEvent.pageY;
			
			contextHelp.style.left = x + offsetX;
			contextHelp.style.top = y + offsetY;
		}
		else
		{
			x = event.clientX;
			y = event.clientY;
			
			contextHelp.style.left = x + document.body.scrollLeft + offsetX;
			contextHelp.style.top = y + document.body.scrollTop + offsetY;
		}
		
		if(IsBrowserInternetExplorer())
		{
			var contextHelpDivShim = GetElementById("ContextHelpDivShim");
			contextHelpDivShim.display = "";
			contextHelpDivShim.style.width = contextHelp.offsetWidth;
			contextHelpDivShim.style.height = contextHelp.offsetHeight;
			contextHelpDivShim.style.top = contextHelp.style.top;
			contextHelpDivShim.style.left = contextHelp.style.left;
			contextHelpDivShim.style.zIndex = contextHelp.style.zIndex - 1;
			contextHelpDivShim.style.display = "";
		
			/*
		
			DivRef.style.display = "block";
			IfrRef.style.width = DivRef.offsetWidth;
			IfrRef.style.height = DivRef.offsetHeight;
			IfrRef.style.top = DivRef.style.top;
			IfrRef.style.left = DivRef.style.left;
			IfrRef.style.zIndex = DivRef.style.zIndex - 1;
			IfrRef.style.display = "block";
			*/
		}

		
	}
}
//hide context help
function HHlp()
{
	var contextHelp = GetElementById("ContextHelp");
	if(contextHelp)
	{
		contextHelp.style.display = "none";
	}
	if(IsBrowserInternetExplorer())
	{
		var contextHelpDivShim = GetElementById("ContextHelpDivShim");
		if(contextHelpDivShim)
		{
			contextHelpDivShim.style.display = "none";
		}
	}
}

function FocusOnElement(elementToFocusName)
{

	if(elementToFocusName)
	{
		if(elementToFocusName != "")
		{
			var focusElement = GetElementById(elementToFocusName);
			if(focusElement)
			{
				if(focusElement.style)
				{
					if(focusElement.style.display != "none")
					{
						focusElement.focus();
					}
				}
			}
		}
	}
}

//disables an element (tested on link button on TaskAddEdit)
function DisableElement(elementNameToDisable)
{
	ToggleElementDisable(elementNameToDisable, false);
}
//enables an element (tested on link button on TaskAddEdit)
function EnableElement(elementNameToEnable)
{
	ToggleElementDisable(elementNameToEnable, true);
}

function ToggleElementDisable(elementName, enable)
{
	if(elementName)
	{
		if(elementName != "")
		{
			var element = GetElementById(elementName);
			if(element)
			{
				if(enable)
				{
					element.disabled = false;
				}
				else
				{
					element.disabled = true;
				}
			}
		}
	}
}

/*********************************************************************
Anchor elements to window sides
**********************************************************************/
function AnchorElementOnRight(elementName)
{
	var element = GetElementById(elementName);
	if(element)
	{
		var scrollLeft;
		var elementWidth;
		if(navigator.appName == "Netscape")
		{
			element.style.position = "fixed";
		}
		else
		{
			scrollLeft = document.body.scrollLeft;	
			var windowWidth = GetWindowWidth();
			//var left = (document.body.clientWidth - element.offsetWidth) + scrollLeft;
			var left = (windowWidth - element.offsetWidth) + scrollLeft;
			
			//window.status = left;
			element.style.position = "absolute";
			element.style.left = left;
		}
		
	}
}


/**********************************************************
Round (Javascript used for Tree)
**********************************************************/
function Round(dNumber, iDecimalPlaces, includeTrailingZeros)
{
	var iSign = 1;
          
	if(dNumber < 0)
	{
		iSign = -1;
	}        
	dNumber = Math.abs(dNumber);
	if(arguments.length == 1)
	{
		iDecimalPlaces = 0;
	}
	iDecimalPlaces = parseInt(iDecimalPlaces);
	
	var n = new Number(iSign * Math.round(dNumber * Math.pow(10, iDecimalPlaces)) / Math.pow(10, iDecimalPlaces));
	
	if(includeTrailingZeros && iDecimalPlaces > 0)
	{
		var s = new String(n.toString());
		var stringArray = s.split(".");
		
		if(stringArray[1] && stringArray[1].length < iDecimalPlaces)
		{
			var stringAfterDecimals = new String(stringArray[1]);
			
			for(var i = stringArray[1].length; i < iDecimalPlaces; i++)
			{
				stringAfterDecimals += "0"; 
			}
				
			//don't convert to a number because it will strip the trailing 0's
			n =  stringArray[0] + "." + stringAfterDecimals;
			return n;
		}
		else
		{
			return n;
		}
	}
	else
	{
		return n;
	}
	
	
}

/*
* 
*/
//parses the string testing for 1 or 0 to return, otherwise returns the supplied value
function ParseBoolValueFromShortString(s)
{
	if(s.toString() == "1")
	{
		return true;
	}
	else if(s.toString() == "0")
	{
		return false;
	}
	else
	{
		return s;
	}
}

//Ensures whole number
function EnsureWholeNumber(element)
{
	if(element)
	{
		var elementId = element.id;
		
		
		var v = new Number();
		v = parseFloat(element.value);
		v = Round(v, 0);
		
		if(v.toString() == "NaN")
		{
			SetValueUsingSetTimeout(elementId, "");
			
		
		}
		else if(v < 0)
		{
			var absNumber = Math.abs(v);
			SetValueUsingSetTimeout(elementId, absNumber.toString());
			
		}
		else if(v.toString() != element.value.toString())
		{
			SetValueUsingSetTimeout(elementId, v.toString());
		}
	}
	
}
//ensures positive decimal to specified decimal places (default = 2)
function EnsurePositiveDecimal(element, decimalPlaces, setNanToZero)
{
	if(element)
	{
		var elementId = element.id;
		
		if(!decimalPlaces)
		{
			decimalPlaces = 2;
		}
		
		var v = new Number();
		v = parseFloat(element.value);
		
		if(v.toString() == "NaN")
		{
			if(setNanToZero)
			{
				SetValueUsingSetTimeout(elementId, "0");
			}
			else
			{
				SetValueUsingSetTimeout(elementId, "");
			}
			return
		}
		
		v = Round(v, decimalPlaces, true);
		
		if(v < 0)
		{
			var roundedValue = Round(Math.abs(v),decimalPlaces, true);
			SetValueUsingSetTimeout(elementId, roundedValue.toString());
		}
		else if(v.toString() != element.value.toString())
		{
			SetValueUsingSetTimeout(elementId, v.toString());
		}
	}
}
//ensure a percentage (0 - 100) with specified decimal places
function EnsurePercent(element, decimalPlaces)
{
	if(element)
	{
		var elementId = element.id;
		
		if(!decimalPlaces)
		{
			decimalPlaces = 2;
		}

		var v = new Number();
		v = parseFloat(element.value);
		
		if(v.toString() == "NaN")
		{
			SetValueUsingSetTimeout(elementId, "");
			return
		}
		
		v = Round(v, decimalPlaces, true);
		
		if(v < 0)
		{
			SetValueUsingSetTimeout(elementId, "0");
		}
		else if(v > 100)
		{
			SetValueUsingSetTimeout(elementId, "100");
		}
		else if(v.toString() != element.value.toString())
		{
			SetValueUsingSetTimeout(elementId, v.toString());
		}
	}
}
function IsNumeric(sInputString)
{
	var sNumber;
	var fNumber;
	if(sInputString != null)
	{
		sNumber = sInputString.toString();
		fNumber = parseFloat(sInputString);
		if(sNumber == fNumber && fNumber != Number.POSITIVE_INFINITY && fNumber != Number.NEGATIVE_INFINITY)
		{
			return true;
		}
	}
	return false;
}
function SetValueUsingSetTimeout(elementId, value)
{
	if(elementId)
	{
		
		if(elementId != "")
		{
			if(GetElementById(elementId))
			{
				var s = new String("");
				
				if(value)
				{
					s = value.toString();
				}
					
				setTimeout("GetElementById('" + elementId + "').value=\"" + s.replace(/\"/g, "\\\"") + "\"", 0);
			}
			
		}
	}
}

function SubmitUsingSetTimeout(elementId)
{
	if(elementId)
	{
		if(elementId != "")
		{
			if(GetElementById(elementId))
			{
				
				setTimeout("GetElementById('" + elementId + "').focus()", 0);
				//delay here so that javascript functions can get completed before submitting
				setTimeout("GetElementById('" + elementId + "').click()", 200);
			}
			
		}
	}
}



//----------------------------------------------------------------------->

function IsNetscape(){return IsBrowserNetscape();}
function IsBrowserNetscape()
{
	if(IsSafari())
	{
		return false;
	}
	else
	{
		if(navigator.appName.toLowerCase().indexOf("netscape") > -1)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}
function IsSafari(){return IsBrowserSafari();}
function IsBrowserSafari()
{
	if(navigator.userAgent.toLowerCase().indexOf("safari") > -1)
	{
		return true;
	}
	else
	{
		return false;
	}
}
function IsBrowserInternetExplorer()
{
	if(navigator.userAgent.indexOf("MSIE") >= 0)
	{
		return true;
	}
	else
	{
		return false;
	}
}

//toggle display of a layer
function ToggleDisplay(element, hide)
{
	if(element)
	{
		if(hide)
		{
			if(element.style.display == "")
			{
				element.style.display = "none";
			}
		}
		else
		{
			if(element.style.display == "none")
			{
				element.style.display = "";
			}
		}
	}
}
function ParseFloatReturnsZeroIfNaN(inValue)
{
	var floatNum = parseFloat(inValue.replace(/[^\.\d]/g, ""));
	
	if(isNaN(floatNum))
	{
	
		return 0;
	}
	else
	{
		return floatNum;
	}	
}
function FormatCurrency(num) 
{
	num = num.toString().replace(/\$|\,/g,'');
	if(isNaN(num))
	num = "0";
	sign = (num == (num = Math.abs(num)));
	num = Math.floor(num*100+0.50000000001);
	cents = num%100;
	num = Math.floor(num/100).toString();
	if(cents<10)
	cents = "0" + cents;
	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
	num = num.substring(0,num.length-(4*i+3))+','+
	num.substring(num.length-(4*i+3));
	return (((sign)?'':'-') + '$' + num + '.' + cents);
}

function ListBoxCheckNoneSelected(element)
{
	if(element.length)
	{
		if(element[0].selected == true)
		{
			for(var i = 1; i < element.length; i++)
			{
				element[i].selected = false;
			}
		}
	}
}



//delay javascript execution in milliseconds
function Delay(milliseconds)
{
	d = new Date() //today's date
	while (1)
	{
		mill=new Date() // Date Now
		diff = mill-d //difference in milliseconds
		if( diff > milliseconds) 
		{
			break;
		}
	}
}


/***************************
//dump properties for dev
*****************************/
function __Dump(object)
{
	alert(__GetObjectProperties(object))
}

function __GetObjectProperties(obj) {
   // Go through all the properties of the passed-in object 
  
	var properties = new String();
  
	for(var i in obj) 
	{
		var msg = i + ": " + obj[i] + "\t";
		var msgString = new String();
		msgString = msg.toString()
		msgString = msgString.substring(0,100);
		
		properties += msgString;	
	}
	
	return properties;
}




//currently only works for IE and Netscape (Not safari)
/*
function ClickElement(element) 
{
	if(element.click)
	{
		element.click();
	}
	else if(element.dispatchEvent) 
	{
		var evt = document.createEvent('MouseEvents');
		evt.initMouseEvent('click',true,true,window,1,0,0,0,0,false,false,false,false,0,null);
		element.dispatchEvent(evt);
	}
}
*/

/*
function ChangeCssValue(theClass,element,value) 
{

	var cssRules;
	if (document.all) 
	{
		cssRules = 'rules';
	}
	else if (document.getElementById) 
	{
		cssRules = 'cssRules';
	}
	
	for (var i = 0; i < document.styleSheets.length; i++)
	{
		for (var ii = 0; ii < document.styleSheets[i][cssRules].length; ii++) 
		{
			if (document.styleSheets[i][cssRules][ii].selectorText == theClass) 
			{
				document.styleSheets[i][cssRules][ii].style[element] = value;
			}
		}
	}
}
*/

