//==============================================================================
// Set up global variables
//==============================================================================

/// <summary>
/// Disables a button from being clicked twice
/// </summary>
function voidClick(obj)
{
	obj.onclick = function onclick(event){return false}

	//if(obj.src != "")
		obj.style.filter = "progid:DXImageTransform.Microsoft.BasicImage(grayscale=1), progid:DXImageTransform.Microsoft.Alpha(Opacity=25)";
	//else
	//	obj.disabled = true;

	return true;
}

//======================================================================
// BEGIN SPELL CHECK FUNCTIONS
//======================================================================

/// <summary>
/// Checks spelling for current form
/// </summary>
var spellPath = null;
var arrSpellFields = new Array();

function writeTime(e)
{
	//var obj = (e.target) ? e.target : e.srcElement;

	var objHour = getFormElement(e + "_hour");
	var objMinute = getFormElement(e + "_minute");
	var objSecond = getFormElement(e + "_second");
	var objTemp = getFormElement(e + "_ampm");
	var objHidden = getFormElement(e);

	var hour = objHour.options[objHour.selectedIndex].value;
	var min = objMinute.options[objMinute.selectedIndex].value;
	var sec;
	
	if(objSecond == null)
		sec = "00";
	else
		sec = objSecond.options[objSecond.selectedIndex].value;

	if(hour!="" && min!="" && sec!="")
	{
		if(objTemp != null)
		{
			var objAm = document.getElementsByName(objTemp.name);
			hour = parseInt(hour);
			if(objAm[1].checked)
			{
				if(hour != 12)
					hour += 12;
			}
			else
			{
				if(hour == 12)
					hour = 0;
			}
		}
	
		var time = hour + ":" + min + ":" + sec;
		objHidden.value = time;
	}
	else
	{
		objHidden.value = "";
	}
	
	//alert(time);
}

function checkSpelling(strFormID)
{
	// Limit the controls, through which we shall iterate, to TEXTAREA types.
	var textAreas = document.getElementsByTagName( "TEXTAREA" );	
	
	// arrSpellFields[] current index tracking
	var j = 0;
		
	for( var i = 0; i < textAreas.length; i++ ) {			
		var elem = textAreas[i];

		// Query the formID using getAttribute, rather
		// that by simply referencing it as a property
		// of the element.		
		var formId = elem.getAttribute( "formID" );
		
		if( formId == strFormID ) {
			// This is the TEXTAREA we are looking for...
			arrSpellFields[j++] = elem.id;
			
			// Keep iterating, there may be multiple 
			// TEXTAREA types that use the same "formID"
		}
	}
	
	// If there are controls to spell-check...
	if( arrSpellFields.length > 0 )
		// ...then do so, starting at the 0th element.
		checkSpellingNext( 0 );	
}

function checkSpellingNext(intIndex)
{
	var objField = document.getElementById(arrSpellFields[intIndex]);
	
	var spellerObj = document.getElementById( "speller" );
	var spellFrame = document.getElementById( "spellframe" );
	
	//We're done
	if(intIndex >= arrSpellFields.length)
	{
		spellerObj.style.visibility = "hidden";
		alert("Spell Check Complete!");
		return;
	}
	
	if(objField.value == "")
	{
		checkSpellingNext(intIndex + 1);
		return;	
	}
		
	objField = document.getElementById(arrSpellFields[intIndex]);
	
	strPath = spellPath + "/spell.asp?field=" + objField.id + "&index=" + intIndex;
	
	spellerObj.style.left = getLeftCoordinate(objField) + objField.clientWidth + 25;
	spellerObj.style.top = getTopCoordinate(objField);
	
	objField.style.backgroundColor = "#E4EDED";
	spellFrame.src = strPath;
}

/// <summary>
/// Closes the spelling layer
/// </summary>
function closeSpellLayer()
{
	speller.style.visibility = "hidden";
}

//======================================================================
// END SPELL CHECK FUNCTIONS
//======================================================================


//======================================================================
// BEGIN XTFORM VALIDATION FUNCTIONS
//======================================================================

/// <summary>
/// Validates email addresses
/// </summary>
function validateIsEmail(objSource, objArgs)
{
	var blnValid = false;
	var strMatch = null;
	var strValue = objArgs.Value;
	
	//var objRegEx = new RegExp("^\\w+@\\w+?\\.[a-zA-Z]{2,4}$", "ig");
	var objRegEx = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	strMatch = strValue.match(objRegEx);
	
	if(strMatch != null)
		blnValid = true;

	objArgs.IsValid = blnValid;
	return;
}

/// <summary>
/// Validates US Zip codes
/// </summary>
function validateIsUSZip(objSource, objArgs)
{
	var blnValid = false;
	var strMatch = null;
	var strValue = objArgs.Value;
	
	var objRegEx = new RegExp("^\\d{5}$|^\\d{5}[\\-\\s]?\\d{4}$", "ig");
	strMatch = strValue.match(objRegEx);
	
	if(strMatch != null)
		blnValid = true;

	objArgs.IsValid = blnValid;
	return;
}

/// <summary>
/// Validates URI's
/// </summary>
function validateIsUri(objSource, objArgs)
{
	var blnValid = false;
	var strMatch = null;
	var strValue = objArgs.Value;
	
	var objRegEx = new RegExp("(http|https|ftp)://([0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%#]+)+$", "ig");
	//var objRegEx = new RegExp("(([a-zA-Z][0-9a-zA-Z+\\-\\.]*:)?/{0,2}[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?(#[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?", "ig");
	strMatch = strValue.match(objRegEx);
	
	if(strMatch != null)
		blnValid = true;

	objArgs.IsValid = blnValid;
	return;
}

/// <summary>
/// Validates Social Security Numbers
/// </summary>
function validateIsSsn(objSource, objArgs)
{
	var blnValid = false;
	var strMatch = null;
	var strValue = objArgs.Value;
	
	var objRegEx = new RegExp("(http|ftp):\\/\\/\w+?\\.", "ig");
	strMatch = strValue.match(objRegEx);
	
	if(strMatch != null)
		blnValid = true;

	objArgs.IsValid = blnValid;
	return;
}

/// <summary>
/// Validates hexidecimal colors
/// </summary>
function validateIsColor(objSource, objArgs)
{
	var blnValid = false;
	var strMatch = null;
	var strValue = objArgs.Value;

	var objRegEx = new RegExp("[a-zA-Z0-9]{6,6}", "ig");
	strMatch = strValue.match(objRegEx);
	
	if(strMatch != null)
		blnValid = true;

	objArgs.IsValid = blnValid;

	return;
}

//======================================================================
// END XTFORM VALIDATION FUNCTIONS
//======================================================================
//======================================================================
// BEGIN CUSTOM VALIDATION FUNCTIONS
//======================================================================

function ValidateHiddenField(val)
{
    var field = document.getElementById(val.controltovalidate);
	var blnValid = false;

	if(ValidatorTrim(field.value) != "")
		blnValid = true;

	return blnValid;
}

function ValidateCheckbox(val)
{
    var field = document.getElementById(val.controltovalidate);
	var blnValid = false;
	var intChecked = 0;

	if(field.checked)
		blnValid = true;

	return blnValid;
}

function ValidateCheckboxList(val)
{
    var list = document.getElementById(val.controltovalidate);
	var blnValid = false;
	var intChecked = 0;
	
	var intMin = val.minchecked;
	var intMax = val.maxchecked;
	
    for(var i = 0; i < list.all.length; i++)
    {
		var item = list.all[i];
		if(item.tagName.toLowerCase() == "input")
		{
			if(item.checked)
			{
				intChecked++;
				blnValid = true;
			}
		}
    }
    
    if(intMax > 0)
    {
		if(intChecked <= intMax)
			blnValid = true;
		else
			blnValid = false;
    }
    
    if(intMin > 0)
    {
		if(intChecked >= intMin)
			blnValid = true;
		else
			blnValid = false;
    }
    
	return blnValid;
}

function UpdateLabelCell(val)
{
    var objField = document.getElementById(val.controltovalidate);
    var objLabel = GetLabelObject(objField);

	if(objLabel == null)
		return;
}

function GetLabelObject(objField)
{
	var objTemp = objField;
	
	while(objTemp != null)
	{
		if(objTemp.fieldCell == "true")
			break;
			
		objTemp = objTemp.offsetParent;
	}
	
	if(objTemp == null)
		return null;
	
	objTemp = objTemp.previousSibling
	var objLabel = null;
	
	for(var i = 0; i < objTemp.children.length; i++)
	{
		var objChild = objTemp.children[i];
		
		if(objChild.tagName == "label")
		{
			objLabel = objChild;
			break;
		}
	}

	return objLabel;
}


//======================================================================
// END CUSTOM VALIDATION FUNCTIONS
//======================================================================

/// <summary>
/// Expands the vertical size of a textarea object on a double click
/// </summary>
/// <param name="strID">The ID of textarea object</param>
/// <param name="intMultiply">The amount of lines to expand</param>
function expandTextAreaDbl(strID, intMultiply)
{
	expandTextArea(strID, 2);
}

/// <summary>
/// Contracts the vertical size of a textarea object on a double click
/// </summary>
/// <param name="strID">The ID of textarea object</param>
function contractTextAreaDbl(strID)
{
	contractTextArea(strID, 0);
}

/// <summary>
/// Expands the vertical size of a textarea object
/// </summary>
/// <param name="strID">The ID of textarea object</param>
/// <param name="intMultiply">The amount of lines to expand</param>
function expandTextArea(strID, intMultiply)
{
	var objArea = document.getElementById(strID);
	
	if(objArea.originalRows == null)
		objArea.originalRows = objArea.rows;
	
	var intDiff = Math.round(objArea.originalRows / 2);
	
	intDiff *= intMultiply;
	
	objArea.rows += intDiff;
}

/// <summary>
/// Contracts the vertical size of a textarea object
/// </summary>
/// <param name="strID">The ID of textarea object</param>
/// <param name="intMultiply">The amount of lines to reduce</param>
function contractTextArea(strID, intMultiply)
{
	var objArea = document.getElementById(strID);
	var intDiff = Math.round(objArea.originalRows / 2);

	if(objArea.originalRows == null)
		objArea.originalRows = objArea.rows;

	if(intMultiply > 0)
	{
		intDiff *= intMultiply;
		
		if((objArea.rows - intDiff) > objArea.originalRows)
			objArea.rows -= intDiff;
	}
	else
	{
		objArea.rows = objArea.originalRows;
	}
}

/// <summary>
/// Updates the characters remaining text counter
/// <param name="fieldID">The ID of the text field</param>
/// <param name="counterID">The ID of the counter field</param>
/// <param name="maxlimit">The maximum number of characters allowed</param>
function textCounter(fieldID, counterID, maxlimit)
{
	var objArea = document.getElementById(fieldID);
	var objCnt = document.getElementById(counterID);
	
	var value = objArea.value;

	// Firefox only keeps \n in the dom instead of \r\n
	if(navigator.appName.indexOf("Netscape") != -1)
	{
		value = value.replace(/\n/g, "\r\n");
	}

	var length = value.length;

	// Limit no. of chars in a textarea & provide count of chars remaining.
	if (length > maxlimit) // if too long...trim it!
	{
		value = value.substring(0, maxlimit);

		// Make sure we don't split a crlf
		if(value.charAt(maxlimit-1)=='\r')
			value = value.substring(0, maxlimit-1);

		objArea.value = value;
	}
	// otherwise, update 'characters remaining' counter
	else 
		objCnt.innerHTML = (maxlimit - length);
}
			
			
/// <summary>
/// Unchecks a radio button based on the ID passed in
/// </summary>
/// <param name="disableID">The ID of the control to uncheck</param>
function DisablePermissions(disableID) 
{
	var objVal = document.getElementById(disableID);  
	objVal.checked = false;
}

/// <summary>
/// Toggles the specific permissions to show
/// </summary>
/// <param name="radio">The radio object being clicked</param>
/// <param name="blnShow">True to show, false to hide</param>
function ToggleSpecificPermissions(radio, blnShow)
{
	var table = radio.offsetParent.offsetParent;
	var row = table.rows[1];
	
	if(blnShow)
		row.style.display = "";
	else
		row.style.display = "none";
}

/// <summary>
/// Unchecks a check box list based on the ID passed in
/// </summary>
/// <param name="disableID">The ID of the control to uncheck</param>
function ToggleCheckListStatus(disableID, count, blnDisabled) 
{	
	var objVal;
	for(i = 0; i < count; i++)
	{
		objVal = document.getElementById(disableID + "_" + i);

		if(objVal.initialDisabled == null)
		{
			if(objVal.disabled)
				objVal.initialDisabled = true;
			else
				objVal.initialDisabled = false;
		}

		if(blnDisabled)
			objVal.disabled = true;
		else
		{
			if(!objVal.initialDisabled)
				objVal.disabled = false;
		}
	}
}



/// <summary>
/// Navigates the page to a new destination
/// </summary>
/// <param name="strUrl">The current URL</param>
/// <param name="txtID">The ID of the text object</param>
function SearchNavigateTo(strUrl, txtID)
{
	var objVal = document.getElementById(txtID); 
	document.location = queryStringSwapVariable("UserName", objVal.value, strUrl);
}

/// <summary>
/// ???
/// </summary>
function TextNavigateTo(strVariable, strUrl, txtID)
{
	var objVal = document.getElementById(txtID); 
	document.location = queryStringSwapVariable(strVariable, objVal.value, strUrl);
}

/// <summary>
/// Sets the value of a control
/// </summary>
function SetControlValue(controlID, controlValue)
{
	var obj = document.getElementById(controlID);
	obj.value = controlValue;
}

/// <summary>
/// ???
/// </summary>
function SelectCheckBoxColumn(controlIDs, bChecked)
{
	for (i=0,n=document.pageform.elements.length;i<n;i++)
    {
		if (document.pageform.elements[i].name.indexOf(controlIDs) !=-1)
			document.pageform.elements[i].checked = bChecked;
	}
}

/// <summary>
/// Closes out the help window
/// </summary>
function CloseHelp(win)
{
	var height = screen.availHeight;	
	var width = screen.availWidth;
	opener.window.moveTo(0,0);
	opener.window.resizeTo(width, height);
}

/// <summary>
/// ???
/// </summary>
function toggleField(fieldBaseID, fieldID)
{
	var objYes;
	objYes = document.getElementById(fieldID + "_ctl0_0"); 
	
	var objNo;
	objNo = document.getElementById(fieldID + "_ctl0_1"); 

	var objVal;
	objVal = document.getElementById(fieldBaseID);
	
	if(objYes.checked)
		objVal.disabled = false;
	if(objNo.checked)
		objVal.disabled = true;		
}

/// <summary>
/// Toggles the discussion field to show
/// </summary>
function toggleDiscussionField(nameFieldID, emailFieldID, fieldID)
{
	var objYes = document.getElementById(fieldID + "_0"); 
	var objNo = document.getElementById(fieldID + "_1"); 

	var objName = document.getElementById(nameFieldID);
	var objEmail = document.getElementById(emailFieldID);
	
	if(objYes.checked)
	{
		objName.disabled = true;
		objEmail.disabled = true;
	}
	if(objNo.checked)
	{
		objName.disabled = false;
		objEmail.disabled = false;
	}			
}

/// <summary>
/// Opens a pop-up window of a specified size
/// </summary>
function open_Window(filedestination, fileparam, title, scroll, status, height, width, windowparam)
{
  var HelpWindow
  
  if (fileparam.length > 0) {
	  fileparam = "?" + fileparam
  }

  var destination = filedestination + fileparam
  HelpWindow = window.open(destination,title,"scrollbars=" + scroll + ",status=" + status + ",height=" + height + ",location=0,width=" + width + windowparam + ",left=50,top=50");
  HelpWindow.window.focus()
}

/// <summary>
/// Opens a new window
/// </summary>
function OpenNewWindow(navUrl)
{
	window.open(navUrl, "lnk","resizable=yes,location=yes,toolbar=yes,status=yes,directories=yes,menubar=yes,scrollbars=yes");
}

/// <summary>
/// ???
/// </summary>
function ParentWindowNav(navUrl)
{
	opener.window.location=navUrl;
}

/// <summary>
/// Mirrors scrolling between 2 scrollable elements
/// </summary>
function mirrorScroll(objSource, strCompareID)
{
	var objCompareTo = document.getElementById(strCompareID);

	var intSoureHeight = objSource.scrollHeight;
	var intCompLines = objCompareTo.scrollHeight;
	
	objCompareTo.scrollTop = objSource.scrollTop;
}

/// <summary>
/// Moves an option up in a sort control
/// </summary>
function moveOptionUp(strSortID, strHiddenID)
{
    var objField, i, strSelectedText, strSelectedValue;
    var strTempText, strTempValue;

    objField = document.getElementById(strSortID);
    i = objField.selectedIndex;

    if(i > 0) {
        strSelectedText     = objField.options[i].text;
        strSelectedValue    = objField.options[i].value;
        strTempText         = objField.options[i - 1].text;
        strTempValue        = objField.options[i - 1].value;

        objField.options[i - 1].text    = strSelectedText;
        objField.options[i - 1].value   = strSelectedValue;

        objField.options[i].text    = strTempText;
        objField.options[i].value   = strTempValue;

        objField.selectedIndex = i - 1;
    }
    cashOutSort(strSortID, strHiddenID);
}

/// <summary>
/// Moves an option down in a sort control
/// </summary>
function moveOptionDown(strSortID, strHiddenID)
{
    var objField, i, strSelectedText, strSelectedValue;
    var strTempText, strTempValue;

    objField = document.getElementById(strSortID);
    i = objField.selectedIndex;

    if(i < (objField.options.length - 1) && i >= 0) {
        strSelectedText     = objField.options[i].text;
        strSelectedValue    = objField.options[i].value;
        strTempText         = objField.options[i + 1].text;
        strTempValue        = objField.options[i + 1].value;

        objField.options[i + 1].text    = strSelectedText;
        objField.options[i + 1].value   = strSelectedValue;

        objField.options[i].text    = strTempText;
        objField.options[i].value   = strTempValue;

        objField.selectedIndex = i + 1;
    }
    cashOutSort(strSortID, strHiddenID);
}

/// <summary>
/// Cashes out the sorting for a sort control to a hidden field
/// </summary>
function cashOutSort(strSortID, strHiddenID)
{
    var objFieldSort, objFieldRep, strValue, strOption;

    objFieldSort = document.getElementById(strSortID);
    objFieldRep = document.getElementById(strHiddenID);
    strValue = "";

    for(var i = 0; i < objFieldSort.options.length; i++) {
        if(objFieldSort.options[i].value != "") {
            strOption = objFieldSort.options[i].value;
        } else {
            strOption = objFieldSort.options[i].text;
        }

        if(i > 0) strValue += ","
        strValue += strOption
    }

    objFieldRep.value = strValue;
}


// SORT CONTROL FUNCTIONS
var col1 = 40;  //temp for now, needs to be moved in future
var col2 = 20;

/// <summary>
/// Cashes out the sorting for a sort control to a hidden field
/// </summary>
function cashOutArray(arH, strHiddenID)
{
    var objFieldSort, objFieldRep, strValue, strOption;

    objFieldRep = document.getElementById(strHiddenID);

	// get hidden field, put into array, change selected value, write back out to string
    objFieldRep.value = arH.join(",");
}

/// <summary>
/// returns array from hidden field
/// </summary>
function getHArray(strHiddenID)
{
	objFieldRep = document.getElementById(strHiddenID);
	var arr = objFieldRep.value.split(",");

	// in order to make sure numeric need to parse each item	
	for(i=0;i<arr.length;i++) 
		arr[i] = parseInt(arr[i])
			
	return arr;
}

/// <summary>
/// Moves an option down in a sort indent control
/// </summary>
function moveIndentOptionDown(strSortID, strHiddenID, strArrayID)
{
    var objField, i, strSelectedText, strSelectedValue;
    var strTempText, strTempValue;

    objField = document.getElementById(strSortID);
    i = objField.selectedIndex;

    if(i < (objField.options.length - 1) && i >= 0) {
        indentPositionDown(i, objField, strArrayID);
        
        strSelectedText     = objField.options[i].text;
        strSelectedValue    = objField.options[i].value;
        strTempText         = objField.options[i + 1].text;
        strTempValue        = objField.options[i + 1].value;
        var arH = getHArray(strArrayID);
        intSelectedLevel	= arH[i];
        intTempLevel		= arH[i+1];
        
        objField.options[i + 1].text    = strSelectedText;
        objField.options[i + 1].value   = strSelectedValue;
		
        objField.options[i].text    = strTempText;
        objField.options[i].value   = strTempValue;

        arH[i]	= intTempLevel;
        arH[i + 1] = intSelectedLevel;
        cashOutArray(arH, strArrayID);
         
        objField.selectedIndex = i + 1;
        

    }
    cashOutSort(strSortID, strHiddenID);
}

/// <summary>
/// Moves an option up in a sort indent control
/// </summary>
function moveIndentOptionUp(strSortID, strHiddenID, strArrayID)
{
    var objField, i, strSelectedText, strSelectedValue;
    var strTempText, strTempValue;

    objField = document.getElementById(strSortID);
    i = objField.selectedIndex;

    if(i > 0) {
		indentPositionUp(i, objField, strArrayID);
        strSelectedText     = objField.options[i].text;
        strSelectedValue    = objField.options[i].value;
        strTempText         = objField.options[i - 1].text;
        strTempValue        = objField.options[i - 1].value;
		var arH = getHArray(strArrayID);
        intSelectedLevel	= arH[i];
        intTempLevel		= arH[i - 1];
        
        objField.options[i - 1].text    = strSelectedText;
        objField.options[i - 1].value   = strSelectedValue;

        objField.options[i].text    = strTempText;
        objField.options[i].value   = strTempValue;

        arH[i]	= intTempLevel;
        arH[i - 1] = intSelectedLevel;
        cashOutArray(arH, strArrayID);

        objField.selectedIndex = i - 1;
        
    }
    cashOutSort(strSortID, strHiddenID);
}

/// <summary>
/// Moves an option left (outdent) in a sort indent control
/// </summary>
function moveIndentOptionLeft(strSortID, strHiddenID)
{
    var objField, i, strSelectedText, strSelectedValue;
    var strTempText, strTempValue;

    objField = document.getElementById(strSortID);
    i = objField.selectedIndex;

    if(i > 0) {
        strSelectedText     = objField.options[i].text;
        strSelectedValue    = objField.options[i].value;

	if(!canOutdent(i, objField, strHiddenID))
		return;
		
    }
//    cashOutSort(strSortID, strHiddenID);
}

/// <summary>
/// indents and moves selected item down
/// </summary>
function indentPositionDown(sIndex, object, strHiddenID)
{
	var val = object.options[sIndex].value;
	// split value in order to modify text in first column	
	var arr = val.split("##");
	
	arH = getHArray(strHiddenID);
	
	// if this was the last child, should move to 0
	if(sIndex > 0 && (arH[sIndex-1] < arH[sIndex]))
	{
		intLevel = 0;
		
		if(arH[sIndex+1] == arH[sIndex])
			intLevel = arH[sIndex];
	}	
	else
	{
		intLevel = 0;
	}
	
	arH[sIndex] = intLevel;
	cashOutArray(arH, strHiddenID);	
		
	var strText = TrimPad(fillString(arH[sIndex], '-') + arr[0], col1) + ' ' + TrimPad(arr[1], col2) + ' ' + arr[2];
	object.options[sIndex].text = strText;
	
	// only change the position of children		
	if(arH[sIndex+1] > arH[sIndex])
		indentChildren(sIndex +1, object, intLevel, strHiddenID)
	
	return true;
}

/// <summary>
/// moves selected item up and corrects indenting
/// </summary>
function indentPositionUp(sIndex, object, strHiddenID)
{	
	var val = object.options[sIndex].value;
	// split value in order to modify text in first column	
	var arr = val.split("##");
	
	arH = getHArray(strHiddenID);
	
	// if this was the last child, should move to 0
	if(sIndex > 0 && (arH[sIndex-1] < arH[sIndex]))
	{
		intLevel = 0;
		
		if(arH[sIndex+1] == arH[sIndex])
			intLevel = arH[sIndex];
	}	
	else
	{
		intLevel = 0;
	}
	
	arH[sIndex] = intLevel;	
	cashOutArray(arH, strHiddenID);	
	
	var strText = TrimPad(fillString(arH[sIndex], '-') + arr[0], col1) + ' ' + TrimPad(arr[1], col2) + ' ' + arr[2];
	object.options[sIndex].text = strText;
			
	if(sIndex+1 <= arH.length && arH[sIndex+1] > arH[sIndex])
		indentChildren(sIndex +1, object, intLevel, strHiddenID)
	
	return true;
}

/// <summary>
/// handles correcting indention called recursively
/// </summary>
function indentChildren(sIndex, object, position, strHiddenID)
{
	var val = object.options[sIndex].value;
	// split value in order to modify text in first column	
	var arr = val.split("##");

	arH = getHArray(strHiddenID);
	arH[sIndex] = position;	
	cashOutArray(arH, strHiddenID);
	
	var strText = TrimPad(fillString(arH[sIndex], '-') + arr[0], col1) + ' ' + TrimPad(arr[1], col2) + ' ' + arr[2];
	object.options[sIndex].text = strText;
	
	if(arH[sIndex+1] > arH[sIndex])
		indentChildren(sIndex +1, object, position, strHiddenID)

	return true;
}

/// <summary>
/// handles moving indention
/// </summary>
function canIndent(sIndex, object, strHiddenID)
{
	if(sIndex > 0)
	{
		arH = getHArray(strHiddenID);
		
		if(arH[sIndex-1] >= arH[sIndex])
		{
			var val = object.options[sIndex].value;
			// split value in order to modify text in first column	
			var arr = val.split("##");

			arH[sIndex] += 1;
			cashOutArray(arH, strHiddenID);
						
			var strText = TrimPad(fillString(arH[sIndex], '-') + arr[0], col1) + ' ' + TrimPad(arr[1], col2) + ' ' + arr[2];
			object.options[sIndex].text = strText;
			
			if(sIndex+1 <= arH.length && arH[sIndex+1] >= arH[sIndex])
				canIndent(sIndex +1, object, strHiddenID)

			return true;
		}
	}
		return false;
}

/// <summary>
/// handles moving indention out
/// </summary>
function canOutdent(sIndex, object, strHiddenID)
{
	arH = getHArray(strHiddenID);
	
	if(sIndex > 0 && arH[sIndex] > 0)
	{
		var val = object.options[sIndex].value;
		
		// split value in order to modify text in first column	
		var arr = val.split("##");
		
		arH[sIndex] += -1;
		cashOutArray(arH, strHiddenID);
		
		var strText = TrimPad(fillString(arH[sIndex], '-') + arr[0], col1) + ' ' + TrimPad(arr[1], col2) + ' ' + arr[2];
		object.options[sIndex].text = strText;

		if(sIndex+1 <= arH.length && arH[sIndex+1] > arH[sIndex])
			canOutdent(sIndex +1, object, strHiddenID)

		return true;
	}
	return false;
	
}

/// <summary>
/// fills a string with the specified number of characters
/// </summary>
function fillString(len,chr){
	return new Array(len+1).join(chr);
}

/// <summary>
/// trims and pads characters to a determined length
/// </summary>
function TrimPad(str, len)
{
	
	var dif = len - str.length;	
	
	if (str.length <= len)
	{
		for(i=0;i<dif;i++) 
			str=str+' ';                               
    }
    else
    {
		str = str.substring( 0, len)
    }
    
	return str;
}

/// <summary>
/// Moves an option right (indent) in a sort indent control
/// </summary>
function moveIndentOptionRight(strSortID, strHiddenID)
{
	var objField, i, strSelectedText, strSelectedValue;
    var strTempText, strTempValue;

    objField = document.getElementById(strSortID);
    i = objField.selectedIndex;

    if(i > 0) {
        strSelectedText     = objField.options[i].text;
        strSelectedValue    = objField.options[i].value;
        
        if(!canIndent(i, objField, strHiddenID))
		return;
    }
}

/// <summary>
/// Gets the corresponding value from a mapping array
/// </summary>
/// <param name="strValue">The value whose sibling you want</param>
/// <param name="intCol">The column in the multi-d</param>
/// <returns>The sibling value found, null if EOF</returns>
function getMapValue(strValue, intCol)
{
	//Get the mapping ID	
	for(var i = 0; i < array_mapping.length; i++)
	{
		if(array_mapping[i][intCol] == strValue)
		{
			return array_mapping[i];
			break;
		}
	}
	return null;
}

/// <summary>
/// Gets the selected option from a select list
/// </summary>
/// <param name="objSelect">The select element</param>
/// <returns>The value of said select element</returns>
function getSelectedOption(objSelect)
{
	return str = objSelect.options[objSelect.options.selectedIndex]
}

/// <summary>
/// Used for hierarchal selects. Finds the parent array
/// </summary>
/// <param name="strID">The child ID</param>
/// <returns>The ID of the parent, null if none</returns>
function getParentArrayID(strID)
{
	for(var i = 0; i < array_mapping.length; i++)
	{
		if(strID == array_mapping[i][1])
			return array_mapping[i][2];
	}
	
	return null;
}

/// <summary>
/// Removes all options from an array
/// </summary>
/// <param name="objSelect">The main element</param>
function removeOptionsFromSelect(objSelect)
{
	//Remove all previous options
	for (i = objSelect.options.length - 1; i >= 0; i--)
         objSelect.options[i] = null;
}

/// <summary>
/// Populates a select list with options from an array
/// </summary>
/// <param name="objSelect">The main element</param>
/// <param name="arrOptions">The array of options to add</param>
function addOptionsFromArrayToSelect(objSelect, arrOptions)
{
	if(arrOptions.length > 0)
	{
		//Add the new options to the next tiered select
		var objOption = document.createElement("option");
		objSelect.options.add(objOption);
		objOption.innerText = "Please select";
		objOption.value = "";

		for(var i = 0; i < arrOptions.length; i++)
		{
			objOption = document.createElement("option");
			objSelect.options.add(objOption);
			objOption.innerText = arrOptions[i][0];
			objOption.value = arrOptions[i][1];
		}
		objSelect.disabled = false;
	}
	else
		objSelect.disabled = true;
}

/// <summary>
/// Actually sets the selectedIndex property of a select object
/// </summary>
/// <param name="objSelect">The main element</param>
/// <param name="strValue">The initial farthest-most value</param>
function chooseValueInSelect(objSelect, strValue)
{
	//message("CHOOSING FROM " + objSelect.options.length + " ON TIER " + objSelect.tier);
	for(var i = 0; i < objSelect.options.length; i++)
	{
		//message(objSelect.options[i].value + " == " + strValue);
		if(objSelect.options[i].value == strValue)
		{
			objSelect.selectedIndex = i;
			//message("SELECTION FOUND");
			break;
		}
	}
	return;
}

/// <summary>
/// Runs through a hierarchal array tree and sets the selected value of all
/// related select boxes
/// </summary>
/// <param name="strFieldName">The name of the hidden field</param>
/// <param name="intLayers">The layer depth</param>
function selectInitialValues(strFieldName, intLayers)
{
	var arrFamily = new Array();
	var objSelect = getFormElement(strFieldName + "tier_1");
	var strValue = getFormElement(objSelect.hidden).value;
	var strSelectedValue;
	var j = 0;
	var intTier = 2;
	
	var curParent = objSelect.initialParent;
	while(curParent != null)
	{
		arrFamily[j] = curParent;
		curParent = getParentArrayID(curParent);
		j++;
	}

	for(var h = arrFamily.length - 2; h >= 0; h--)
	{
		objSelect = getFormElement(strFieldName + "tier_" + intTier);
		removeOptionsFromSelect(objSelect);
		
		var arrOptions = eval("array_" + arrFamily[h]);
		addOptionsFromArrayToSelect(objSelect, arrOptions, strSelectedValue);

		var arrTemp = getMapValue(arrFamily[h], 1);
		
		if(arrTemp != null)
		{
			var objPrev = getFormElement(strFieldName + "tier_" + (intTier - 1));
			strSelectedValue = arrTemp[0];
			chooseValueInSelect(objPrev, strSelectedValue);
		}
	
		intTier++;
	}
	
	intTier--;
	objSelect = getFormElement(strFieldName + "tier_" + intTier);
	chooseValueInSelect(objSelect, strValue);

	if(intTier < intLayers)
		populateTierSelect(objSelect);
}

/// <summary>
/// Populates a host of hierarchal select objects
/// </summary>
/// <param name="strID">The select object whose onchange event was fired</param>
function populateTierSelect(objSelect)
{
	var strSelectedValue = getSelectedOption(objSelect).value;
	
	//Get the next tiered object
	var intCurTier = parseInt(objSelect.tier);
	var intDepth = parseInt(objSelect.depth);
	var strFieldName = objSelect.fieldName;
	var strTierName = strFieldName + "tier_" + (intCurTier + 1);
	var objTier = getFormElement(strTierName);
	var objHidden = getFormElement(objSelect.hidden);
	
	//alert(objTier);
	objHidden.value = strSelectedValue;
	
	//Need to make initial message multilingual
	for(var i = intCurTier + 2; i < intDepth + 1; i++)
	{
		var objTemp = getFormElement(strFieldName + "tier_" + i);
		
		if(!objTemp.disabled)
		{
			objTemp.options[objTemp.selectedIndex].text = "Please select an option above";
			objTemp.disabled = true;
		}
	}

	var strMapID = getMapValue(strSelectedValue, 0)
	if(strMapID == null)
		return;
	
	strMapID = strMapID[1];
	
	//If no map ID, no children - all done, let's go home, call it a week
	if(strMapID == null)
		return;
	
	//Get the array of child options
	var arrOptions = eval("array_" + strMapID);
	
	removeOptionsFromSelect(objTier);
	addOptionsFromArrayToSelect(objTier, arrOptions);
}

function a()
{
	alert("Here");
}

function textMask(event, sMask) {
        //var sMask = "**?##?####";
        var KeyTyped = String.fromCharCode(getKeyCode(event));
        var targ = getTarget(event);
        
        keyCount = targ.value.length;
        //alert(sMask.charAt(keyCount));
        
        if (sMask.charAt(keyCount) == '*')
                return true;
 
        if (sMask.charAt(keyCount) == KeyTyped)
        {
                return true;
        }
        
        if ((sMask.charAt(keyCount) == '#') && isNumeric(KeyTyped)) 
           return true; 
        
        if ((sMask.charAt(keyCount) == 'A') && isAlpha(KeyTyped))
         return true; 
    
      if ((sMask.charAt(keyCount) == '?') && isPunct(KeyTyped))
         return true; 
        if (KeyTyped.charCodeAt(0) < 32) return true;
    
    return false;          
   
        
}

 function getTarget(e) {
  // IE5
   if (e.srcElement) {
        return e.srcElement;
   }
    if (e.target) {
        return e.target;
   }    
 }

  function getKeyCode(e) {
 //IE5
 if (e.srcElement) {
        return e.keyCode
 }
  // NC5
  if (e.target) {
   return e.which
  }
 }

/// <summary>
/// Checks to see if a char is numeric
/// </summary>
function isNumeric(c)
{
        var sNumbers = "01234567890";
        if (sNumbers.indexOf(c) == -1)
                return false;
        else return true;
        
}  

/// <summary>
/// Checks to see if a char is alpha
/// </summary>
function isAlpha(c)
{
        var lCode = c.charCodeAt(0);
        if (lCode >= 65 && lCode <= 122 )
          {     
                return true;
         }
        else 
        return false;
}  

/// <summary>
/// Checks to see if a char is punctuation
/// </summary>
function isPunct(c)
{
        var lCode = c.charCodeAt(0);
        if (lCode >= 32 && lCode <= 47 )
          {     
                return true;
         }
        else 
        return false;
}

/// <summary>
/// Social Security Number mask
/// </summary>
function ssnMask()
  {
        var sMask = "01234567890";
        var KeyTyped = String.fromCharCode(window.event.keyCode);
        var srcObject = window.event.srcElement;
        if (sMask.indexOf(KeyTyped.toString()) == -1)
                {
                        window.event.keyCode = 0;
                        _ret = false;
                } 
   srcText = document.getElementById(window.event.srcElement.id);
   keyCount = srcText.value.length;
    var tmpStr = "";
    
    keyEntered = KeyTyped;
    keyCount++;
    switch (keyCount)
    {
    case 2: 
      tmpStr += srcObject.value;
      srcObject.value = tmpStr;
      break;
    case 4:
      srcObject.value += "-";
      break;
    case 8:
      srcObject.value += "-";
      break;
      }
 }
 
 ///<summary>
 ///Changes the form's target to the new location
 ///</summary>
 function changeFormTarget(target)
 {
	var pageForm = document.getElementById('pageForm');
	pageForm.target = target;
	window.onblur = resetFormTarget;
 }
 
  ///<summary>
 ///Changes the form's target to the new location
 ///</summary>
 function resetFormTarget()
 {
	var pageForm = document.getElementById('pageForm');
	pageForm.target = "_self";
 }

/// <summary>
/// ???
/// </summary>
function setSelectedRadio(radioButton, fieldName)
{
	for (i = 0, n = document.pageform.elements.length; i < n; i++)
    {
		var formElement = document.pageform.elements[i];
		if(formElement.tagName.toLowerCase() == "input" && formElement.type.toLowerCase() == "radio")
		{
			if (formElement.name.indexOf(":" + fieldName) != -1)
				formElement.checked = false;
		}
	}
	radioButton.checked = true;
}

function XTPage_ClientValidate(formID) {
    if (typeof(Page_Validators) == "undefined")
        return;
    var i;
    for (i = 0; i < Page_Validators.length; i++) {
		vall = Page_Validators[i];
		if(vall.getAttribute("controltovalidate").indexOf(formID) >= 0)
	        ValidatorValidate(Page_Validators[i]);
    }
    ValidatorUpdateIsValid();    
    XTValidationSummaryOnSubmit(formID);
    Page_BlockSubmit = !Page_IsValid;
    return Page_IsValid;
}

function XTValidationSummaryOnSubmit(formID) {
    if (typeof(Page_ValidationSummaries) == "undefined") 
        return;
    var summary, sums, s;
    for (sums = 0; sums < Page_ValidationSummaries.length; sums++) {
        summary = Page_ValidationSummaries[sums];
        summary.style.display = "none";
        if (!Page_IsValid) {
            if (summary.showsummary != "False" && summary.id.indexOf(formID) >= 0) {
                summary.style.display = "";
                if (typeof(summary.displaymode) != "string") {
                    summary.displaymode = "BulletList";
                }
                switch (summary.displaymode) {
                    case "List":
                        headerSep = "<br>";
                        first = "";
                        pre = "";
                        post = "<br>";
                        fin = "";
                        break;
                    case "BulletList":
                    default: 
                        headerSep = "";
                        first = "<ul>";
                        pre = "<li>";
                        post = "</li>";
                        fin = "</ul>";
                        break;
                    case "SingleParagraph":
                        headerSep = " ";
                        first = "";
                        pre = "";
                        post = " ";
                        fin = "<br>";
                        break;
                }
                s = "";
                if (typeof(summary.headertext) == "string") {
                    s += summary.headertext + headerSep;
                }
                s += first;
                for (i=0; i<Page_Validators.length; i++) {
                    if (!Page_Validators[i].isvalid && typeof(Page_Validators[i].errormessage) == "string") {
                        s += pre + Page_Validators[i].errormessage + post;
                    }
                }   
                s += fin;
                summary.innerHTML = s; 
                window.scrollTo(0,0);
            }
            if (summary.showmessagebox == "True") {
                s = "";
                if (typeof(summary.headertext) == "string") {
                    s += summary.headertext + "<BR>";
                }
                for (i=0; i<Page_Validators.length; i++) {
                    if (!Page_Validators[i].isvalid && typeof(Page_Validators[i].errormessage) == "string") {
                        switch (summary.displaymode) {
                            case "List":
                                s += Page_Validators[i].errormessage + "<BR>";
                                break;
                            case "BulletList":
                            default: 
                                s += "  - " + Page_Validators[i].errormessage + "<BR>";
                                break;
                            case "SingleParagraph":
                                s += Page_Validators[i].errormessage + " ";
                                break;
                        }
                    }
                }
                span = document.createElement("SPAN");
                span.innerHTML = s;
                s = span.innerText;
                alert(s);
            }
        }
    }
}
