//==============================================================================
// Set up global variables
//==============================================================================
window.RichTextEditorHash = {};

/// <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 it is the CuteEditor control, the formId is rendered on its table control following the textarea.
        //Fix for CuteEditor
        if (elem.className == "CuteEditorTextArea"
			&& elem.nextSibling != null && elem.nextSibling.nextSibling != null && elem.nextSibling.nextSibling.nextSibling != null
			&& elem.nextSibling.nextSibling.nextSibling.nextSibling != null && elem.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling != null
			&& elem.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.getAttribute) {

                if (window.RichTextEditorHash[elem.id] === undefined) 
            {
                window.RichTextEditorHash[elem.id] = elem.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling;
            }

            formId = elem.nextSibling.nextSibling.nextSibling.nextSibling.nextSibling.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);

    return false;
}

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.aspx?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);
            }
        }
    }
}

