
	/***********************************\
	|*	System.Xml.js				   	  *|
	|*  Functions for Working with XML *|
	\***********************************/

	this.Tag = function( NodeID ) //Imitation of our CSharp Code
	{
		return document.getElementById( NodeID );
	}

	this.TagsByName = function( Name )
	{
		return document.body.getElementsByTagName( Name );
	}
	
	this.HideXmlNode = function( NodeID )
	{
		if(Tag(NodeID)!=null)
		Tag(NodeID).style.display = "none";
	}
	
	this.ShowXmlNode = function( NodeID )
	{
		if(Tag(NodeID)!=null)
		Tag(NodeID).style.display = "block";
	}

	this.ToggleNodeVisibility = function( NodeID )
	{
		if( Tag(NodeID).style.display == "none" )
		{
			Tag(NodeID).style.display = "";			
		}
		else
		{
			Tag(NodeID).style.display = "none";
		}
	}
	
	/************* Deprecated *************/
	var req;
	var doneInit;
	function XMLReqInit()
	{
		if( !doneInit || !req )
		{
			try
			{
				req = new XMLHttpRequest();
			}
			catch(e)
			{
				req = new ActiveXObject("Msxml2.XMLHTTP");
			}
			
			try
			{	//Needed for Mozilla if local file tries to access an http URL
				netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
			}
			catch(e)
			{
				//alert( "Error: XML over HTTP Init Failed" );
			}
			
			if( req == null || typeof req == 'undefined' )
			{ 
				alert('Error: XML over HTTP Init Failed');
				return false;	
			}
			else
			{
				doneInit = true;
				return true;
			}
		}
	}
	/************* End Deprecation *************/
	
		/* XmlHttpClient */
	function XmlHttpClient()
	{
		var XmlObj;
		
		if( window.XMLHttpRequest ) // Create Firefox Object
		{
			XmlObj = new XMLHttpRequest();
			return XmlObj;
		}
		else if ( window.ActiveXObject ) // Create IE XMLHTTP Object
		{
			XmlObj = new ActiveXObject( "Microsoft.XMLHTTP" );
			if ( XmlObj )
			{
				return XmlObj;
			}
		}
	}
	
	var XmlClientArray = new Array();
	
	function XmlClient( OnResponseComplete, OnResponseError )
	{
		//QueryString, OnResponseComplete
		var	MyClient			= new XmlHttpClient();
		this.Index				= XmlClientArray.push( MyClient ) - 1;
		
		this.HttpTransferComplete = function()
		{
			if ( MyClient.readyState == 4 )
			{
				if ( MyClient.status == 200 )
				{
					if( OnResponseComplete )
					{
						OnResponseComplete();						
					}
				}
				else
				{
					if( OnResponseError )
					{
						OnResponseError();
					}
				}
			}
		}
		XmlClientArray[this.Index].onreadystatechange = this.HttpTransferComplete;
		//End of Object Initialization
		
		this.Abort = function()
		{
			XmlClientArray[this.Index].abort();
		}
		
		this.GetResponseText = function()
		{
			return XmlClientArray[this.Index].responseText;
		}

		this.GetResponseXml = function()
		{
			return XmlClientArray[this.Index].responseXML;
		}
		
		this.GetResponseXML = this.GetResponseXml;		
		
		this.SendNVC = function( inNVC, optionalURL )
		{
			if( optionalURL )
			{
				XmlClientArray[this.Index].open( "POST", optionalURL, true );
			}
			else
			{
				XmlClientArray[this.Index].open( "POST", location.pathname, true );
			}
			XmlClientArray[this.Index].setRequestHeader( "Content-Type", "application/x-www-form-urlencoded" );
			XmlClientArray[this.Index].send( inNVC.URLEncode() );
		}
	}//End XmlClient
		
	/* public static string */
	/* One time Xml over Http Request */
	function PostNVC( inNVC, optionalURL )
	{
		var httpClient = new XmlHttpClient();
		if( optionalURL )
		{
			httpClient.open( "POST", optionalURL, false );
		}
		else
		{
			httpClient.open( "POST", location.pathname, false );
		}
		httpClient.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded" );
		httpClient.send( inNVC.URLEncode() );
		return httpClient.responseText;
	}
	
	function PostQueryString( QueryString, optionalURL )
	{
		var httpClient = new XmlHttpClient();
		if( optionalURL )
		{
			httpClient.open( "POST", optionalURL, false );
		}
		else
		{
			httpClient.open( "POST", location.href, false );
		}
		httpClient.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded" );
		httpClient.send( QueryString );
		return httpClient.responseText;
	}
	
	SendNVC = PostNVC;
	SendQueryString = PostQueryString;
	
// SELECT TAG //
var SelectTag = 
{
	//    XmlNode SelectTagNode, string inValueToSelect
	SelectOption: function(SelectTagNode, inValueToSelect)
	{
		for(var i = 0; i < SelectTagNode.options.length; i++)
		{
			if(SelectTagNode.options[i].value == inValueToSelect)
			{
				SelectTagNode.selectedIndex = i;
				return true;
			}
		}
		return false;
	},
	
	//XmlNode SelectTagNode, string OptionValue, string OptionText, (bool Selected)
	AddOption: function(SelectTagNode, OptionValue, OptionText, Selected)
	{
		if(SelectTagNode == null)
			return SelectTag.AddOptionPrompt;
		var newOption = document.createElement("OPTION");
		SelectTagNode.options.add(newOption);
		newOption.innerText = OptionText;
		newOption.value = OptionValue;
		if(Selected != null) //optional
			newOption.selected = Selected;
	},

	AddOptionPrompt: function()
	{
		var NewOption=prompt('Enter new option:','');
		if(NewOption != null && NewOption.length > 0)
		{ 	SelectTag.AddOption(event.srcElement, NewOption, NewOption, true);
			//SelectTag.Sort();
		}
		else
		{
			event.srcElement.selectedIndex = 0;
		}
	},
	
	HandleOther: function()
	{
		var SelectedText = event.srcElement.options[event.srcElement.selectedIndex].innerText
		if(SelectedText == 'Other' || SelectedText == 'Other...')
			SelectTag.AddOptionPrompt();
	},
	
	//TODO: See if it can be reimplemented using F(M) framework
	Sort: function(select) 
	{
		if(select == null)
		{
			select = event.srcElement;
		}
			
		compareFunction = compareText;
		var options = new Array(select.options.length);
		//var NoValueOptions = ''; //CSV
		for (var i = 0; i < options.length; i++) {
			if(typeof(select.options[i].value) != 'nothing' && select.options[i].value != null && select.options[i].value != '') {
				options[i] =
					new Option
						(
							select.options[i].text,
							select.options[i].value,
							select.options[i].defaultSelected,
							select.options[i].selected
						);
			}
		}
		options.sort(compareFunction);
		select.options.length = 0;
		for (var i = 0; i < options.length; i++) {
			try {
				select.options[i] = options[i];
			}
			catch(e) {
				//Nothing to do
			}
		}
	}
};

	/* Form */
	function Form()
	{
		/* Instance Methods */
	}
	
	/* Class Methods */
	Form.Validate = function( MyForm )
	{
		//James Wilson 
		//Aug 15, 2005
		//Cory Dambach
		//May 19, 2005
		if( MyForm == null || typeof( MyForm ) == "undefined" )
		{
			MyForm = event.srcElement.form;
		}
		
		var numOfElements = MyForm.elements.length;
		var ArrInputs = MyForm.elements;
		
		for( var i = 0; i < ArrInputs.length; i++ )
		{
			if(IsElementVisible(ArrInputs[i]))
			{
				if( ArrInputs[i].value == "" && (ArrInputs[i].required == "true" || ArrInputs[i].required == "required"))
					{	//<input name="fubar" id="fubar" type="text" required="true" />
							alert( ArrInputs[i].name + " is a required field" );
						ArrInputs[i].focus();
						return false;
					}
			
				if( ArrInputs[i].dbtype != null && ArrInputs[i].value != "" )
				{	//<input name="fubar" id="fubar" type="text" dbtype="int" />
					switch( ArrInputs[i].dbtype )
					{
						case "int":
						
							if(isNaN(parseInt( ArrInputs[i].value)))
							{
								alert( "Form Input: " + ArrInputs[i].name + " should be a Integer Number" );
								ArrInputs[i].focus();
								return false;
							}
							break;
							
						case "double":
						case "single":
						case "float":
						case "long":
						case "decimal":
							//if(ArrInputs[i].value != '0')
							if(isNaN(parseFloat( ArrInputs[i].value)))
							{
								alert( "Form Input: " + ArrInputs[i].name + " should be a number" );
								ArrInputs[i].focus();
								return false;
							}
							break;

						case "datetime":
						case "smalldatetime":
							if( !IsDate( ArrInputs[i].value ) )
							{
								return false;
							}
							break;

						case "email":

							var str = ArrInputs[i].value;
							
							if(str.match(/\b[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}\b/i))
								break;
							else
							{
								alert("Form Input:  " + str + " is an invalid email address");
								return false;
							}
								
							break;
							
						case "varchar":
						case "varbinary":
						case "text":
						case "char":
						default:
							//Pretty much anything they enter will be fine
							//Should be used in conjunction with dblength attribute
							break;
					}
				}
			}
				
			if( ArrInputs[i].dblength != null )
			{
				if( ArrInputs[i].value.length > ArrInputs[i].dblength )
				{
					alert("The value in " + ArrInputs[i].name + " is longer than the expected length." );
					return false;
				}
			}
		}
		return true;
	}
	
	//string LookingForID
	Form.FindLabelTextFor = function(LookingForID)
	{
		var labelElements = document.getElementsByTagName("label");
		for(var a=0; a<labelElements.length; a++)
		{
			if(labelElements[a].htmlFor == LookingForID)
			{
				return labelElements[a].innerText;
			}
		}
		return null;
	}
	
	//bool bEnabled
	Form.EnableAllFormElements = function(bEnabled)
	{
		var	selectBoxes=document.getElementsByTagName("select");
		for	(var i=0; i<selectBoxes.length;	i++)
		{
			selectBoxes[i].disabled	= !bEnabled;
		}	
		var	inputBoxes=document.getElementsByTagName("input");
		for	(var i=0; i<inputBoxes.length; i++)
		{
			inputBoxes[i].disabled = !bEnabled;
			
		}
		var	buttonBoxes=document.getElementsByTagName("button");
		for	(var i=0; i<buttonBoxes.length;	i++)
		{
			buttonBoxes[i].disabled	= !bEnabled;
		}
	}
	
	//(XmlNode frmObj)
	Form.ToNVC = function(frmObj)
	{
		if( frmObj == null || typeof(frmObj) == "undefined" )
		{	//optional
			frmObj = event.srcElement.form;
		}
	
		var q;
		var el = frmObj.elements;
		var resultNVC = new NameValueCollection();
		
		var ElementValue = new String();			
		var ElementName = new String();
		var ElementType = new String();
		
		for( var i=0; i < el.length; i++ )
		{
			ElementValue = "";
			ElementName  = "";
			ElementType  = "";
			
			if(el[i].getAttribute("name") != null)
				ElementName = el[i].getAttribute("name");
			if(el[i].getAttribute("value") != null)
				ElementValue = el[i].getAttribute("value");
			if(el[i].getAttribute("type") != null)
				ElementType = el[i].getAttribute("type");
				
			if( (ElementName.length > 0 ) && ( ElementValue.length >= 0 ) )
			{
				switch( ElementType )
				{
					case "radio":
					case "checkbox":
						if( el[i].checked )
						{ 
							resultNVC.Add(el[i].name, el[i].value);
						}
						break;
					default:
						resultNVC.Add(el[i].name, el[i].value);
						break;
				}
			}
		}
		return resultNVC;
	}

	/*
	function SortTableByColumn()
	{
		var cols			= Tag("DivBugTable").getElementsByTagName("col");
		var rowsOne			= Tag("DivBugTable").getElementsByTagName( "tr" );
		var slSpanValues	= new Array( rowsOne.length );
		for( var i = 0; i < rowsOne.length; i++ )
		{
			ArrSpans = rowsOne[i].getElementsByTagName("span");
			for( var j = 0; j < ArrSpans.length; j++ )
			{
				if ( ArrSpans[j].getAttribute("id") == "BugShortDesc" )
				{
					slSpanValues.push( ArrSpans[j].innerText );
				}
			}
		}
		var ResultXml	= new String();
		var ResultCols	= new String();
		
		for( var i = 0; i < cols.length; i++ )
		{
			ResultCols = ResultCols + cols[i].outerHTML;
		}
		Tag("DivBugTable").innerHTML = "";
		alert( "BoutToChange" );
		try
		{
			Tag("DivBugTable").innerHTML = "<table id=\"BugTable\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\" border=\"0\">" + ResultCols + ResultXml + "</table>";
		}
		catch( e )
		{
			alert(e);
		}
		return;
	}*/
	
	function compareText (option1, option2)
	{
		return option1.text < option2.text ? -1: option1.text > option2.text ? 1 : 0;
	}

	/* Functions Relating to Web Page User Interfaces */
	/*
		Show			( Url, width, height );	//Displays a popup in the center of the screen.
		ShowDialog	( Url, width, height );	//Shows a Modal Dialog
	*/
	
	var winModalWindow
	
	function HandleFocus()
	{
		if ( winModalWindow )
		{
			if (!winModalWindow.closed)
			{
				winModalWindow.focus();
			}
			else
			{
				window.top.releaseEvents ( Event.CLICK | Event.FOCUS );
				window.top.onclick = "";
			}
		}
		return false;
	}
	
	function IgnoreEvents(e)
	{
		return false;
	}
	
	function Show( vURL, w, h)
	{
		var LeftPos	=	( screen.availWidth		/ 2	) - ( w / 2 );
		var TopPos	=	( screen.availHeight		/ 2	) - ( h / 2 );
		return window.open( vURL, "_blank", "scrollbars=yes,height=" + h + ",width=" + w + ",statusbar=no,resizable=yes,left=" + LeftPos + ",top=" + TopPos );
	}
	
	function __firefox_ShowDependant( vURL, w, h)
	{
		//Gives a sorta modal window in FireFox however gives a modeless dialog in IE though... 
		//Property "_blank" works in both for the sName of the window strange thought it may be...
		var LeftPos	=	( screen.availWidth		/ 2	) - ( w / 2 );
		var TopPos	=	( screen.availHeight		/ 2	) - ( h / 2 );
		return window.open( vURL, "_blank", "dependent=yes,scrollbars=yes,height=" + h + ",width=" + w + ",statusbar=no,resizable=yes,left=" + LeftPos + ",top=" + TopPos );
	}
	
	function __firefox_ShowDialog( vURL, w, h )
	{
		//TODO: Implement __firefox_ShowDialog( vURL, w, h )
	}
	
	//Recieved from James Wilson, Creator Unknown
	//Changed by Cory Dambach June 30, 2005: call to __firefox_ShowDependant() added
	function ShowDialog(vURL,w,h)
	{
		if ( window.showModalDialog )
		{
			var LeftPos	=	( screen.availWidth	/ 2	) - ( w / 2 );
			var TopPos	=	( screen.availHeight	/ 2	) - ( h / 2 );
			
			var returnValue= window.showModalDialog( vURL, null, "scroll:yes;dialogLeft:" + LeftPos + "px;dialogTop:" + TopPos + "px;dialogHeight:" + h + "px;dialogWidth:" + w + "px;status:no;" );
			if(returnValue==null) return false;
			else return returnValue;
		}
		else
		{
			return FakeOpenModal(vURL,w,h);
			//return __firefox_ShowDependant( vURL, w, h);
		}
	}
	
	
	function HourGlass(bWantItOn) //Last Modified by James Wilson, Date Unknown
	{
		document.body.style.cursor = (bWantItOn) ? "wait" : "default";
	}
	
	function FakeOpenModal(vURL,w,h) //not for IE.
	 {
		window.top.captureEvents( Event.CLICK | Event.FOCUS );
		window.top.onclick	= IgnoreEvents;
		window.top.onfocus	= HandleFocus;
		var LeftPos	=	( screen.availWidth	/ 2	) - ( w / 2 );
		var TopPos	=	( screen.availHeight	/ 2	) - ( h / 2 );
		winModalWindow = __firefox_ShowDialog( vURL, w, h );
		winModalWindow.focus();
		return winModalWindow.returnVal;
	}

	function DateClick(selObj) //Creator Unknown, Date Unknown
	{
		window.dateField = selObj;
		calendar = window.open('/scripts/calendar.htm','cal','WIDTH=200,HEIGHT=250');
	}

	function DateClickModal(selObj) //Creator Unknown, Date Unknown
	{
		var sFeatures="scroll:no;dialogHeight:300px;dialogWidth:250px;";
		Args = selObj.value;
		CheckVal = window.showModalDialog('/scripts/calendar2.htm', Args, sFeatures);
		if(CheckVal === undefined)
		{
			//nothing to do
		}
		else
		{
			selObj.value = CheckVal;
			selObj.focus();
			selObj.blur();
		}
	}
	
	function DatePopUp() //Creator Unknown, Date Unknown, widely established
	{
		var EventSource = event.srcElement;
		var NameToUpdate = EventSource.name.replace( /_cal/i, "" );
		DateClickModal(document.all.item(NameToUpdate));
	}
		
	function DatePopUp2(SpanName) //Creator Unknown, Date Unknown, Not in use
	{
		var EventSource = event.srcElement;
		var SpanElement = document.all[SpanName];
		var NameToUpdate = EventSource.name.replace(/_cal/i, "");
		DateClickModal(SpanElement.all.item(NameToUpdate));
	}
	
		function Cookies()
	{
		//Member Methods...
	}

	//TODO: Create emulation of overloading 
	Cookies.SaveCookie = function( name, value, days )
	{
		if (days) {
			var date = new Date();
			date.setTime( date.getTime() + ( days*24*60*60*1000) )
			var expires = "; expires="+date.toGMTString();
		}
		else expires = "";
		document.cookie = name+"="+value+expires+"; path=/";
	}
	
	Cookies.ReadCookie = function( name )
	{
		var nameEQ = name + "="
		var ca = document.cookie.split(';')
		for(var i=0;i<ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length)
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length)
		}
		return null
	}

	Cookies.DeleteCookie = function( name )
	{
		saveCookie( name, "", -1 )
	}

	Cookies.Enabled = function()
	{
		var _cookieEnabled=(navigator.cookieEnabled) ? true : false
		//if not IE4+ nor NS6+
		if ( typeof navigator.cookieEnabled=="undefined" && !_cookieEnabled){ 
				document.cookie="testcookie"
				_cookieEnabled=(document.cookie.indexOf("testcookie")!=-1)? true : false
				deleteCookie("testcookie");
		}
		return _cookieEnabled;
	}
	
	
	/*		JavaScript.Net											*/
	/*		System.Collections.Specialized.js						*/
	/*		An Implementation of the NameValueCollection Class		*/
	/*		Last Modified by Cory Dambach June 16th, 2005			*/
	
	function NameValueCollection()
	{
		this.Keys		= new Array();
		this.Values		= new Array();
		this.Type		= "NameValueCollection";

		this.Add = function( Key, Value )
		{
			if( arguments.length == 2 )
			{
				var KeyIndex = this.IndexOfKey( Key );
				if( KeyIndex == -1 ) //The Key Doesn't exist
				{
					this.Keys.push		( Key	);
					this.Values.push	( Value	);
				}
				else
				{
					this.Values[KeyIndex] = this.Values[KeyIndex] + "," + Value;
				}
			}
			else if ( arguments.length != 2 )
			{
				throw( "Incorrect Number of arguments in " + this.GetType() + ":Add( Key, Value )" );
			}
			return;
		}
	
		this.Set = function( Key, Value )
		{
			if( arguments.length == 2 )
			{
				var KeyIndex = this.IndexOfKey( Key );
				if( KeyIndex == -1 ) //if Key does not already exist
				{
					this.Keys.push	( Key   );
					this.Values.push( Value );
				}
				else
				{
					this.Values[KeyIndex] = Value
				}
			}
			else if ( arguments.length != 2 )
			{
				throw( "Incorrect Number of arguments in " + this.GetType() + ":Add( Key, Value )" );
			}
			return;
		}
		
		this.GetValues = function( Key )
		{
			if( this.ContainsKey( Key ) )
			{			
				return this.Values[this.IndexOfKey( Key )].split(',');
			}
			else
			{
				return null;
			}
		}
		
		this.Get = function( Key )
		{
			var PairIndex = this.IndexOfKey( Key );
			if( PairIndex > -1 )			
			{
				return this.Values[PairIndex];
			}
			else
			{
				throw( "Key does not exist: " + Key );
			}
		}
		
		this.GetKeys	= function()		{ return this.Keys;	}
		this.GetValue	= function( Key )	{ return this.Get( Key ); }
		this.GetKeyAt	= function( Index )	{ return this.Keys[Index]; }
		this.GetValueAt	= function( Index ) { return this.Values[Index]; }
		this.GetType	= function()		{ return this.Type; }
		
		this.URLEncode = function()
		{
			var QueryString = new String();
			for( var i = 0; i < this.Keys.length; i++ )
			{
				QueryString = QueryString + escape( this.GetKeyAt( i ) ) + "=" + escape( this.GetValueAt( i ) );
				if( (i+1) != this.Keys.length )
				{
					QueryString = QueryString + "&";
				}
			}
			return QueryString;
		}
		
		this.ToString = function()
		{
			var myKeys = this.GetKeys();
			var Result = new String();
			for( var i = 0; i < myKeys.length; i++ )
			{
				Result = Result + myKeys[i] + " = " + this.Get( myKeys[i] ) + "\n";
			}
			return Result;
		}
		
		this.ContainsKey = function( Key )		
		{
			for( var i = 0; i < this.Keys.length; i++ )
			{
				if( this.Keys[i] == Key )
				{
					return true;
				}
			}
			return false;
		}
		
		this.IndexOfKey = function( Key )
		{
			for( var i = 0; i < this.Keys.length; i++ )
			{
				if( this.Keys[i] == Key )
				{
					return i;
				}
			}
			return -1;
		}
	}//End Class: NameValueCollection
	
	/* Static Methods */
	NameValueCollection.PrintNVC = function( pNVC )
	{
		var myKeys = pNVC.GetKeys();
		for( var i = 0; i < myKeys.length; i++ )
		{
			document.write( myKeys[i] + " = " + pNVC.Get( myKeys[i] ) + "<br />" );
		}
	}
	
	NameValueCollection.CreateFromQueryString = function( QueryString )
		{
			var outNVC				= new NameValueCollection();
			var arrQueryString	= QueryString.split( '&' );
			for( var i = 0; i < arrQueryString.length; i++ )
			{
				var arrPair	= arrQueryString[i].split('=');
				var Name		= arrPair[0];
				var Value	= arrPair[1];			
				outNVC.Add( unescape(Name), unescape(Value) );
			}
			return outNVC;
		}
		
			
	/* ACT.Web.UI.js Version 0.3 | Very Unstable											*/
	/*	ACT.Web.UI.js Last Modified by Cory Dambach 										*/
	/*	Added to 1.0 Release on June 30, 2005												*/
	/*
		This is a code module developed on top of the JsDotNet Library:
		It can be used to develop dynamic forms that show or hide 
		things when a certain value is selected
	*/
	
	//Requires System.Xml.js
	//Requires System.Collections.Specialized.js
	function ToggleDisplayInit()
	{
		MonitorIfFutureDate(); //Iniate Checking for Future Date Entered. 
								//We are using it here because we have ToggleDisplayInit in almost all the pages
								//and we need monitor of future date for almost all the pages.
		var AllElements = document.getElementsByTagName("*");
		var EventHandler = new Function('Caller', 'ToggleDisplay(this)');
		for(var i = 0; i < AllElements.length; i++)
		{
			if(AllElements[i].getAttribute("ShowNodes"))
			{
				var TagName = AllElements[i].tagName.toLowerCase();
				ActiveElement = AllElements[i];
				switch(TagName)
				{
					case "select":
						AllElements[i].attachEvent("onchange", EventHandler);
						AllElements[i].fireEvent("onchange");
					break;
					case "input":
					{
						var InputType = AllElements[i].getAttribute("type");
						switch(InputType)
						{
							case "radio":
							case "checkbox":
								var radioElementName = AllElements[i].getAttribute( "name" );
								var radioElements = document.getElementsByName(radioElementName);
								//Who added these lines?
								for(var m=0; m<radioElements.length; m++)
								{
									radioElements[m].attachEvent("onclick", EventHandler);
									if(m==0)
										radioElements[m].fireEvent("onclick");
								}
								break;
						}
					}
					break;
				}
			}
		}
	}
	
	//Created by Cory Dambach June 28, 2005
	//Changed by Cory Dambach June 29, 2005: Added some variable checking. 
	//Changed by Cory Dambach June 29, 2005: The Function EvaluateShowNodeNVC was changed to require 2 params, the calls to it inside this function were changed accordingly */
	function ToggleDisplay( objXmlNode )
	{
		if( objXmlNode == null || typeof(objXmlNode) == "undefined" || objXmlNode.length == 0 || Tag(objXmlNode) == null )
		{
			objXmlNode = event.srcElement
		}
		
		if( objXmlNode.getAttribute( "type" ) != null && (objXmlNode.getAttribute( "type" ) == "radio" || objXmlNode.getAttribute( "type" ) == "checkbox") )
		{
			
			var RadioGroup =  document.getElementsByName(objXmlNode.getAttribute( "name" ));
			
			var QueryString = new String();
			for( var i = 0; i < RadioGroup.length; i++ )
			{
				var attShowNodes = RadioGroup[i].getAttribute( "ShowNodes" );
				if( attShowNodes != null ) /* && attShowNodes.indexOf("=") == -1 ) */
				{
					QueryString = QueryString + "&" + RadioGroup[i].getAttribute( "ShowNodes" );
				}
			}
			var repAmp = new RegExp("&amp;");
			repAmp.global = true;
			QueryString.replace( repAmp, '&' );
			var inNVC = NameValueCollection.CreateFromQueryString( QueryString );
			
			for( var i = 0; i < RadioGroup.length; i++ )
			{
				if(!RadioGroup[i].checked) 
					EvaluateShowNodeNVC( inNVC, RadioGroup[i] );
			}
			for( var i = 0; i < RadioGroup.length; i++ )
			{
				if(RadioGroup[i].checked) 
					EvaluateShowNodeNVC( inNVC, RadioGroup[i] );
			}
		}
		else
		{
			var attShowNodes = objXmlNode.getAttribute( "ShowNodes" );
			if(attShowNodes != null)
			{
				var repAmp = new RegExp("&amp;");
				repAmp.global = true;
				attShowNodes.replace( repAmp, '&' );
				var inNVC = NameValueCollection.CreateFromQueryString( attShowNodes );
				EvaluateShowNodeNVC( inNVC, objXmlNode );
			}
		}
	}

	
	//Created by Cory Dambach June 28, 2005
	function EvaluateShowNodeNVC( inNVC, objXmlNode )
	{
		for( var i = 0; i < inNVC.Keys.length; i++ )
		{
			if ( inNVC.GetKeyAt(i) != objXmlNode.getAttribute( "value" ) && inNVC.GetKeyAt(i) != "" )
			{
				var idArray = inNVC.GetValues( inNVC.GetKeyAt( i ) );
				for( var j = 0; j < idArray.length; j++ )
				{
					HideXmlNode( idArray[j] );
				}
			}
		}
		for( var i = 0; i < inNVC.Keys.length; i++ )
		{
			if( inNVC.GetKeyAt(i) == objXmlNode.getAttribute( "value" ) )
			{
				var idArray = inNVC.GetValues( inNVC.GetKeyAt( i ) );
				for( var j = 0; j < idArray.length; j++ )
				{
					ShowXmlNode( idArray[j] );
				}
			}
		}
	}
	
	//Created by Cory Dambach June 28, 2005
	Form.ToShowNodesNVC = function( frmObj )
	{
		if( frmObj == null || typeof(frmObj) == "undefined" )
		{	//optional
			frmObj = event.srcElement.form;
		}
		var q;
		var el = frmObj.elements;
		var resultNVC = new NameValueCollection();
		for( var i=0; i < el.length; i++ )
		{
			if( (el[i].name.length > 0) && (el[i].value != null))
			{
				resultNVC.Add( el[i].name, el[i].getAttribute( "ShowNodes" ) );
			}
		}
		return resultNVC;
	}

// Function is used to Monitor the count in the input fields and Display the current count and alert on max limit
	var _IDsToDisplayCountCur = new Array(100);
	function MonitorFieldLength()
	{
		var _IDsToDisplayCountMax = new Array(100);
		var TempArrayCount = 0;
		var TempIDsToDisplay = new Array(100);
		var AllElements = document.getElementsByTagName("*");
		var EventHandler = new Function('Caller', 'CheckFieldLength(event.srcElement)');
		for(var i = 0; i < AllElements.length; i++)
		{
			if(AllElements[i].getAttribute("dblength") && (AllElements[i].id != null || AllElements[i].id != ""))
			{
				TempIDsToDisplay[TempArrayCount] = AllElements[i].id;
				TempArrayCount++;

				AllElements[i].attachEvent("onkeyup", EventHandler);
				AllElements[i].fireEvent("onkeyup");
			}
		}
		var MaxArrayCount = 0;
		var CurArrayCount = 0;
		for (var j = 0; j < TempArrayCount; j++)
		{
			if (TempIDsToDisplay[j] != null && TempIDsToDisplay[j] != "")
			{
				if (Tag(TempIDsToDisplay[j] + "Max") != null)
				{
					_IDsToDisplayCountMax[MaxArrayCount] = TempIDsToDisplay[j];
					MaxArrayCount++;
				}
				if (Tag(TempIDsToDisplay[j] + "Cur") != null)
				{
					_IDsToDisplayCountCur[CurArrayCount] = TempIDsToDisplay[j];
					CurArrayCount++;
				}
			}
		}
		for (var k = 0; k < _IDsToDisplayCountMax.length; k++)
			if (_IDsToDisplayCountMax[k] != null && _IDsToDisplayCountMax[k] != "")
				Tag(_IDsToDisplayCountMax[k] + "Max").innerText = Tag(_IDsToDisplayCountMax[k]).dblength;
				
		for (var k = 0; k < _IDsToDisplayCountCur.length; k++)
			if (_IDsToDisplayCountCur[k] != null && _IDsToDisplayCountCur[k] != "")
				CheckFieldLength(Tag(_IDsToDisplayCountCur[k]));
				
	}
	
	function CheckFieldLength(CallerField)
	{
		for (var i = 0; i < _IDsToDisplayCountCur.length; i++)
		{
			if (_IDsToDisplayCountCur[i] == CallerField.id)
			{
				if (CallerField.value.length <= CallerField.dblength)
					Tag(_IDsToDisplayCountCur[i] + "Cur").innerText = CallerField.value.length;
				else if (CallerField.value.length > CallerField.dblength)
				{
					CallerField.value = CallerField.value.slice(0, parseInt(CallerField.dblength));
					Tag(_IDsToDisplayCountCur[i] + "Cur").innerText = CallerField.value.length;
					alert("You Have Reached The Maximum Limit Of " + CallerField.dblength + " Characters.");
				}
			}
		}
	}
//End of Charlength Monitor

//Used to Monitor if the date entered is a future date, if so.. then prompts the user for confirmation
// Looks for "_cal" and uses the name before that
var ExecuteFutureDate = 0;
function MonitorIfFutureDate()
{
	var AllElements = document.getElementsByTagName("*");
	var EventHandler = new Function('Caller', 'CheckIfFutureDate(event.srcElement)');
	for(var i = 0; i < AllElements.length; i++)
	{
		if(AllElements[i].id != null && AllElements[i].id != "" && AllElements[i].id.length > 4)
		{
			if (AllElements[i].id.slice(AllElements[i].id.length - 4, AllElements[i].id.length) == "_cal")
			{
				try{
				Tag(AllElements[i].id.slice(0, AllElements[i].id.length - 4)).attachEvent("onblur", EventHandler);
				Tag(AllElements[i].id.slice(0, AllElements[i].id.length - 4)).fireEvent("onblur");
				}
				catch(e)
				{}
			}
		}
	}
	ExecuteFutureDate = 1;
}
function CheckIfFutureDate(Caller)
{
	if (ExecuteFutureDate == 1)
	{
		if (Caller.value != null && Caller.value != "")
		{
			try{
				DateEntered= new Date(Caller.value);
				DateToday= new Date();
				if (DateEntered > DateToday)
				{
					if (!confirm("You have selected a date that will occur in the future. Are you sure you would like to select this date?"))
						Caller.value = "";
				}
			}
			catch(e)
			{}
		}
	}
}

//End of Date Monitor

function FolderImg()
{
		var ImgPath = '/images/icons/';
		var Open = ImgPath +  'open.gif';
		var Close = ImgPath + 'close.gif';		
		var IsOpen = (event.srcElement.src.indexOf(Open) != -1);
		if(IsOpen)
			event.srcElement.src = Close;
		else
			event.srcElement.src = Open;
}
	
var dtCh= "/";
var minYear=1900;
var maxYear=2100;

function isInteger(s){
	var i;
    for (i = 0; i < s.length; i++)
	 {
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    return true;
}

function stripCharsInBag(s, bag)
{
	var i;
	var returnString = "";
	// Search through string's characters one by one.
	// If character is not in bag, append to returnString.
	for (i = 0; i < s.length; i++)
	{
		var c = s.charAt(i);
		if (bag.indexOf(c) == -1)
		{
			returnString += c;
		}
	}
	return returnString;
}

function daysInFebruary( year )
{
    return ( ( ( year % 4 == 0 ) && ( ( !( year % 100 == 0 )) || ( year % 400 == 0 ) ) ) ? 29 : 28 );
}
function DaysArray(n)
{
	for (var i = 1; i <= n; i++)
	{
		this[i] = 31;
		if (i==4 || i==6 || i==9 || i==11)
		{
			this[i] = 30;
		}
		if (i==2)
		{
			this[i] = 29;
		}
	}
	return this;
}

function IsDate(dtStr)
{
	var daysInMonth = DaysArray(12);
	var pos1=dtStr.indexOf(dtCh);
	var pos2=dtStr.indexOf(dtCh,pos1+1);
	var strMonth=dtStr.substring(0,pos1);
	var strDay=dtStr.substring(pos1+1,pos2);
	var strYear=dtStr.substring(pos2+1)
	strYr = strYear;
	if (strDay.charAt(0)=="0" && strDay.length>1)
	{	strDay=strDay.substring(1);	}
	if (strMonth.charAt(0)=="0" && strMonth.length>1)
	{	strMonth=strMonth.substring(1);	}
	
	for (var i = 1; i <= 3; i++)
	{
		if (strYr.charAt(0)=="0" && strYr.length>1)
		strYr=strYr.substring(1);
	}
	
	month=parseInt(strMonth)
	day=parseInt(strDay)
	year=parseInt(strYr)
	
	if (pos1==-1 || pos2==-1){
		alert("The date format should be : mm/dd/yyyy")
		return false
	}
	
	if (strMonth.length<1 || month<1 || month>12)
	{
		alert("Please enter a valid month")
		return false;
	}
	
	if( strDay.length < 1 || day < 1 || day > 31 || ( month == 2 && day > daysInFebruary( year ) ) || day > daysInMonth[month] )
	{
		alert("Please enter a valid day");
		return false;
	}
	
	if( strYear.length != 4 || year == 0 || year < minYear || year > maxYear )
	{
		alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear);
		return false;
	}
	
	if( dtStr.indexOf( dtCh, pos2+1 ) != -1 || isInteger( stripCharsInBag( dtStr, dtCh ) ) == false )
		{
		alert("Please enter a valid date");
		return false;
	}
	return true;
}

function IsElementVisible(elObj)
{
	if(elObj == null) //if they pass us a null object, immediatley reject.
	{
		return false; 
	}
	
	var pEl = elObj; //parent Element 
	while(pEl != null)
	{
			if(typeof(pEl.style) != 'undefined' && pEl.style.display == "none")
			{
				return false;
			}
			else
			{
				pEl = pEl.parentNode;
			}
	}
	return true;
}

function FormatName(name)
{
	name = Trim(name);
	return name.substring(0,1).toUpperCase()+name.substring(1, name.length);
}

function AutoTab(NextFieldId)
{    
	if (event.srcElement.value.length == event.srcElement.maxLength)
	{
			if((event.keyCode>=48 && event.keyCode<=57) || (event.keyCode>=96 && event.keyCode<=105) )
			{
				try { Tag(NextFieldId).focus(); } catch(e) {} //if the element to focus to is invisible, error will be thrown
			}
			return true;
	}
	return false;
}


function ValidDate()
{
	inputDate=event.srcElement.value;

	if(inputDate=="") { return(true); }
	
	var regDate = new RegExp("^(([1-9])|([0][1-9])|([1][0-2]))/(([1-9])|([0][1-9])|([1-2][0-9])|([3][0-1]))/((19|20)[0-9]{2})$");
	if(!regDate.test(inputDate))
	{
		alert("Please input valid Date in format MM/DD/YYYY like 11/30/2002");
		event.srcElement.select();
		event.srcElement.focus();
		return false;
		
	}
	else
	{
		var month, day, year;
		var dateSplits=inputDate.split("/");
		month=parseInt(dateSplits[0],10);
		day=parseInt(dateSplits[1],10);
		year=parseInt(dateSplits[2],10);
		var objInputDate=new Date(inputDate);
		if(objInputDate.getDate() == day)
		{
			if((objInputDate.getMonth()+1)==month)
			{
				if(objInputDate.getFullYear()==year)
				{
					return true;
				}
				else alert("Invalid Year entry");
			}
			else
				alert("Invalid Month entry");
		}
		else
			alert("Invalid Date entry");
		event.srcElement.select();
		event.srcElement.focus();
		return false;
	}
}


var nav = window.Event ? true : false;
if (nav) {
   window.captureEvents(Event.KEYDOWN);
   window.onkeydown = NetscapeEventHandler_KeyDown;
} else {
   document.onkeydown = MicrosoftEventHandler_KeyDown;
}

function NetscapeEventHandler_KeyDown(e) {
  if (e.which == 13 && e.target.type != 'textarea' && e.target.type != 'submit' 
  && e.target.type!='button' && e.target.type!='image')
  
   { PressSubmit(); return false; }
  return true;
}

function MicrosoftEventHandler_KeyDown() {
   if(event.keyCode == 9)
   {
	  if (window.event.shiftKey)
	  {
		FocusPreviousElement();
	  }
	  else
		FocusNextElement();
      return false;
   }
  if (  event.keyCode == 13 && event.srcElement.type != 'textarea'
			 && 
		event.srcElement.type != 'submit' &&
		 event.srcElement.type!='button' && 
		 event.srcElement.type!='image'
	 )
   {  
	 PressSubmit();
     return false; 
   }
   return true;
}

function PressSubmit()
{
	var Inputs = TagsByName("input");
	for(var i=0;i<Inputs.length;i++)
	{
		if(Inputs[i].getAttribute("type") == "submit")
		{
			if(Inputs[i].getAttribute("noauto") != null && Inputs[i].getAttribute("noauto") == "true"){}
			else
			{
				Inputs[i].click();
				break;
			}
		}
	}
}

function FocusPreviousElement()
{
//alert(document.forms.length);
	for(i=0; i<document.forms.length; i++)
	{
	
		formElements = document.forms[i].elements;
		//alert(formElements.length)
		for(j=formElements.length-1; j>=0; j--)
		{
			if( typeof(formElements[j].tagName)!= 'undefined' && 
				( formElements[j].tagName =="INPUT" || formElements[j].tagName =="SELECT" || 
				formElements[j].tagName =="TEXTAREA" ))
				
			{
						
				if( formElements[j].sourceIndex < event.srcElement.sourceIndex && typeof(formElements[j].type)!="undefined" && formElements[j].type!="hidden")
				{
					//alert(formElements[j].outerHTML);
					if(IsElementVisible(formElements[j]))
					{
					//	alert(formElements[j].outerHTML);
						try{
						return formElements[j].focus();	
						}catch(e){return;}
					}
				}
			}
		}
		for(j=formElements.length-1; j>=0; j--)
		{
			if( typeof(formElements[j].tagName)!= 'undefined' && 
				( formElements[j].tagName =="INPUT" || formElements[j].tagName =="SELECT" || 
				formElements[j].tagName =="TEXTAREA" ))
			{
				if( typeof(formElements[j].type)!="undefined" && formElements[j].type!="hidden")
				{
					try{
						return formElements[j].focus();	
						}catch(e){return;}
				}
			}
		}
		
	}
}

function FocusNextElement()
{
//alert(document.forms.length);
	for(i=0; i<document.forms.length; i++)
	{
		formElements = document.forms[i].elements;
		//alert(formElements.length)
		for(j=0; j<formElements.length; j++)
		{
			if( typeof(formElements[j].tagName)!= 'undefined' && 
				( formElements[j].tagName =="INPUT" || formElements[j].tagName =="SELECT" || 
				formElements[j].tagName =="TEXTAREA" ))
				
			{
						
				if( formElements[j].sourceIndex > event.srcElement.sourceIndex && typeof(formElements[j].type)!="undefined" && formElements[j].type!="hidden")
				{
					//alert(formElements[j].outerHTML);
					if(IsElementVisible(formElements[j]))
					{
					//	alert(formElements[j].outerHTML);
						try{
						return formElements[j].focus();	
						}catch(e){return;}
					}
				}
			}
		}
		for(j=0; j<formElements.length; j++)
		{
			if( typeof(formElements[j].tagName)!= 'undefined' && 
				( formElements[j].tagName =="INPUT" || formElements[j].tagName =="SELECT" || 
				formElements[j].tagName =="TEXTAREA" ))
			{
				if( typeof(formElements[j].type)!="undefined" && formElements[j].type!="hidden")
				{
					try{
						return formElements[j].focus();	
						}catch(e){return;}
				}
			}
		}
		
	}
}


function IsElementVisible(elObj)
{

	if(elObj == null) //if they pass us a null object, immediatley reject.
	{
		return false; 
	}

	var pEl = elObj; //parent Element 
	var n=0;
	while(pEl != null)
	{
		if(typeof(pEl.style) != 'undefined' && pEl.style.display=="none")
		{
			return false;
		}
		pEl = pEl.parentNode;
	}
	//alert(n);
	return true;
}