﻿//control.js
var m_oServiceProxy = null;
var m_oServiceObjectProvider = null;
var m_strBenchTriggerID = "";
var m_strBenchHiddenID = "";
var m_strTrayTriggerID = "";
var m_strTrayHiddenID = "";
var m_strDivTrayHeaderID = "";
var m_strDivTrayListID = "";
var m_strDivBenchHeaderID = "";
var m_strDivBenchTabsID = "";
var m_strModeContainerID = "";
var m_strBenchContainerID = "";
//var m_ControlUpdateProceedListeners = new Array();
var m_ControlPreTriggerListeners = new Array();
var m_ControlCellClickListeners = new Array();
var m_ToolbarInitializeHandler = null;
var m_GridResultHandler = null;
var m_ToolbarResultHandler = null;
//var m_GridLoadHandler = null;
//var m_ToolbarLoadHandler = null;
//var m_LocalInitializeHandler = null;
var m_ChooseFormHandler = null;
var m_ProcessIDListeners = new Array();

var m_MenuSelectHandler = null;
var m_InfoPaneltemHandler = null;

var m_FormSets = new Array();
var m_GallerySets = new Array();
var m_strActiveFormSet = "";
var m_DataAssociations = new Array();
var m_ServiceQ = new Array();
var m_PostInitializationQ = new Array();
var m_strCurrentTrayListID = "";
var m_strLoggedInUser = "";
var m_strRelocate = "";
var m_PendingTrigger = null;
var m_bGlobalFocusAllowed = false;
var m_GlobalFocusElement = null;
var m_bPageLoaded = false;

Type.registerNamespace('TabDocWebLib');


TabDocWebLib.PageBoundsControl = function(element)
{
    TabDocWebLib.PageBoundsControl.initializeBase(this, [element]);
};

TabDocWebLib.PageBoundsControl.prototype = {
    initialize: function()
    {
        TabDocWebLib.PageBoundsControl.callBaseMethod(this, 'initialize');



    },

    dispose: function()
    {
        $clearHandlers(this.get_element());
        TabDocWebLib.PageBoundsControl.callBaseMethod(this, 'dispose');
    }
};

TabDocWebLib.PageBoundsControl.registerClass('TabDocWebLib.PageBoundsControl', Sys.UI.Control);


if (typeof (Sys) !== "undefined")
{
    Sys.Application.add_init(SysApplicationInit);
    Sys.Application.add_load(SysApplicationLoad);
}

function SysApplicationInit()
{
    if (typeof (Sys) !== "undefined")
    {
        if (!IsNullOrEmpty(Sys.WebForms.PageRequestManager))
        {
            var pageRequestManager = Sys.WebForms.PageRequestManager.getInstance();
            if (!IsNullOrEmpty(pageRequestManager))
            {
                pageRequestManager.add_initializeRequest(InitializeRequestHandler);
                pageRequestManager.add_endRequest(EndRequestHandler);
            }
        }
    }
}

function SysApplicationLoad()
{


}

function InitializeRequestHandler(sender, args)
{
    //    var bProceed = UpdateProceed(args._postBackElement);
    //    args.set_cancel(!bProceed);
    //    if (bProceed)
    //    {
    SetActivityOn();
    //    }
}

function EndRequestHandler(sender, args)
{
    //    if ( typeof( args.get_error() ) != "undefined" )
    //    {
    //        if (args.get_response().get_statusCode() == '12030')
    //        {
    //            window.location = window.document.location;
    //        }
    //        if (args.get_response().get_statusCode() == '503')
    //        {
    //            args.set_errorHandled(true);
    //        }
    //    }
    SetActivityOff();
}


function pageLoad()
{
    if (!IsNullOrEmpty(m_strRelocate))
    {
        window.location = m_strRelocate;
        m_strRelocate = null;
        return;
    }

    if (!m_bPageLoaded)
    {
        m_bPageLoaded = true;
        OnLocalToolbarPageLoad();
        OnLocalBenchHeaderPageLoad();
        OnLocalBenchTabsPageLoad();
        OnLocalTrayHeaderPageLoad();
        OnLocalTrayListPageLoad();

        OnLocalControlPageLoad();


        ToolbarControlInitialize();
        if (!IsNullOrEmpty(m_ToolbarInitializeHandler))
        {
            m_ToolbarInitializeHandler();
        }
    }

    window.onresize = DoResize;
    DoResize();

    m_bGlobalFocusAllowed = true;

    DoFormInitialisation();

    if (!IsNullOrEmpty(m_strCurrentTrayListID))
    {
        var trayTrigger = document.getElementById(m_strTrayTriggerID);
        var trayHidden = document.getElementById(m_strTrayHiddenID);
        if (!IsNullOrEmpty(trayTrigger) && !IsNullOrEmpty(trayHidden))
        {
            trayHidden.value = m_strCurrentTrayListID;
            m_strCurrentTrayListID = "";
            UpdatePanelUpdate("benchUpdatePanel_modeTray");
        }
    }

    ProcessServiceQueue();
}

function pageUnload()
{
    m_bPageLoaded = false;
    if (!IsNullOrEmpty(Sys.WebForms.PageRequestManager))
    {
        var pageRequestManager = Sys.WebForms.PageRequestManager.getInstance();
        if (!IsNullOrEmpty(pageRequestManager))
        {
            pageRequestManager.remove_initializeRequest(InitializeRequestHandler);
            pageRequestManager.remove_endRequest(EndRequestHandler);
        }
    }

    //    Sys.Application.remove_load(SysApplicationLoad);
    //    Sys.Application.remove_init(SysApplicationInit);
}




function IsNullOrEmpty(value)
{
    var bReturn = false;

    if (value === null || typeof (value) === "undefined")
    {
        bReturn = true;
    }
    else
    {
        var test = typeof (value);
        if (test !== "object")
        {
            var stop = true;
        }
        if (typeof (value) === "string")
        {
            if (value.toString() === "")
            {

                bReturn = true;
            }
        }
    }
    return bReturn;
}




function AssertProxy()
{
    if (IsNullOrEmpty(m_oServiceProxy))
    {
        if (!IsNullOrEmpty(m_oServiceObjectProvider))
        {
            m_oServiceProxy = m_oServiceObjectProvider();
            if (!IsNullOrEmpty(m_oServiceProxy))
            {

                m_oServiceProxy.set_defaultSucceededCallback(SucceededCallback);
                m_oServiceProxy.set_defaultFailedCallback(FailedCallback);
            }
        }
    }
}

function DoServiceCall(methodSig, oContext)
{
    AssertProxy();
    if (!IsNullOrEmpty(m_oServiceProxy))
    {
        m_oServiceProxy.set_defaultUserContext(oContext);
        var strEval = "m_oServiceProxy." + methodSig;
        eval(strEval);
    }
}

// Callback function invoked when the call to the Web service methods succeeds.
function SucceededCallback(result, userContext, methodName)
{
    var aTargetTokens = userContext.TargetID.split("|");

    if (userContext.TargetID == "associated.values")
    {
        ProcessCallBackResult(userContext.FormSetID, "associated.values", "", result);
    }
    else if (userContext.TargetID == "validation.results")
    {
        OnValidationServiceCallResult(userContext.FormSetID, userContext.Cargo, result);
    }
    else if (aTargetTokens.length > 0 && aTargetTokens[0] == "grid.resultset")
    {
        ProcessCallBackResult(userContext.FormSetID, "grid.resultset", aTargetTokens[1], result);
    }
    else if (aTargetTokens.length > 0 && aTargetTokens[0].substring(0, 8) == "toolbar.")
    {
        ProcessCallBackResult(userContext.FormSetID, "toolbar.resultset", aTargetTokens[0], result);
    }
    else
    {
        var element = document.getElementById(userContext.TargetID);
        if (!IsNullOrEmpty(element))
        {
            switch (element.tagName)
            {
                case "INPUT":
                case "TEXTAREA":
                    {
                        if (element.type == "checkbox")
                        {
                            element.checked = result.toLowerCase() == "true" ? true : false;
                        }
                        else
                        {
                            element.value = result;
                        }
                    }
                    break;
                case "SELECT":
                    {
                        ClearSelectOptions(element);

                        LoadSelectOptions(element, result);

                        var initInfoItem = GetInitInfoItem(userContext.FormSetID, aTargetTokens[0], "associated.values");
                        if (!IsNullOrEmpty(initInfoItem))
                        {
                            var value = GetAssociatedValue(initInfoItem.SourceKey);
                            if (!IsNullOrEmpty(value))
                            {
                                var bTextValueCompare = initInfoItem.TargetInfo === "text" ? true : false;
                                var nSelectedIndex = GetSelectOptionIndex(element, value, bTextValueCompare);
                                element.options.selectedIndex = nSelectedIndex;
                            }
                        }

                        //if a value change on this element updates another
                        var formSet = GetFormSet(userContext.FormSetID);
                        if (!IsNullOrEmpty(formSet))
                        {
                            if (!IsNullOrEmpty(formSet.ValueChangeInfo))
                            {
                                if (formSet.ValueChangeInfo.length > 0)
                                {
                                    for (var j = 0; j < formSet.ValueChangeInfo.length; j++)
                                    {
                                        if (formSet.ValueChangeInfo[j].ColumnName === aTargetTokens[0])
                                        {
                                            var e = document.getElementById(formSet.ValueChangeInfo[j].ColumnName);
                                            ProcessValueChangeInfoItem(formSet, e, formSet.ValueChangeInfo[j]);
                                        }
                                    }
                                }
                            }
                        }
                    }
                    break;
                default:
                    break;
            }
        }
    }
    ProcessServiceQueue();
}

// Callback function invoked when the call to the Web service methods fails.
function FailedCallback(error, userContext, methodName)
{
    if (!IsNullOrEmpty(error))
    {
        var strError = error.get_message();
    }
    m_oServiceProxy = null;

}


function ControlSetAssociatedValue(key, value)
{
    this[key] = value;
}

function ControlGetAssociatedValue(key)
{
    var returnValue = null;
    if (!IsNullOrEmpty(this[key]))
    {
        returnValue = this[key];
    }
    return returnValue;
}

//function ControlUpdateProceedAddListener(callback)
//{
//    m_ControlUpdateProceedListeners.push(callback);
//}

function ControlPreTriggerAddListener(callback)
{
    m_ControlPreTriggerListeners.push(callback);
}

function ControlCellClickAddListener(callback)
{
    m_ControlCellClickListeners.push(callback);
}

function ProcessIDAddListener(callback)
{
    m_ProcessIDListeners.push(callback);
}

function GridResultHandler(callback)
{
    m_GridResultHandler = callback;
}

function ToolbarResultHandler(callback)
{
    m_ToolbarResultHandler = callback;
}

function MenuSelectHandler(callback)
{
    m_MenuSelectHandler = callback;
}

function InfoPaneltemHandler(callback)
{
    m_InfoPaneltemHandler = callback;
}

function ToolbarInitializeHandler(callback)
{
    m_ToolbarInitializeHandler = callback;
}


function GridLoadHandler(callback)
{
    m_GridLoadHandler = callback;
}

//function ToolbarLoadHandler(callback)
//{
//    m_ToolbarLoadHandler = callback;
//}

function LocalInitializeHandler(callback)
{
    m_LocalInitializeHandler = callback;
}

function ChooseFormHandler(callback)
{
    m_ChooseFormHandler = callback;
}


function ServiceObjectProvider(callback)
{
    m_oServiceObjectProvider = callback;
}



function ProcessMenu( evtObj, strTopic )
{
    if ( !IsNullOrEmpty(m_MenuSelectHandler ) )
    {
        m_MenuSelectHandler( evtObj, strTopic );
    }

}

function ProcessInfoPaneltem( evtObj, id )
{
    if ( !IsNullOrEmpty( m_InfoPaneltemHandler ))
    {
        m_InfoPaneltemHandler(evtObj, id);
    }
}




function FireBenchTrigger(details)
{
    var trigger = document.getElementById(m_strBenchTriggerID);
    var hidden = document.getElementById(m_strBenchHiddenID);
    var bFireTrigger = true;

    if (!IsNullOrEmpty(trigger) && !IsNullOrEmpty(hidden))
    {
        var strAppend = PreTrigger(details);
        if (!IsNullOrEmpty(strAppend))
        {
            if (strAppend == "CancelTrigger")
            {
                bFireTrigger = false;
            }
            else
            {
                hidden.value = details + "|" + strAppend;
            }
        }
        else
        {
            hidden.value = details;
        }

        if (bFireTrigger)
        {
            UpdatePanelUpdate("benchUpdatePanel_workBench");
        }
    }
}

function ProcessBenchHeaderItem(headerID)
{
    var processID = headerID;

    for (var i = 0; i < m_ProcessIDListeners.length; i++)
    {
        var cb = m_ProcessIDListeners[i];
        var strToken = cb(headerID);

        if (!IsNullOrEmpty(strToken))
        {
            processID = strToken;
            break;
        }
    }
    FireBenchTrigger(processID);
}

function ProcessTrayHeaderItem(headerID)
{
}

//function ProcessBenchTabItem(tabID)
//{
//    FireBenchTrigger(tabID);
//}

function PrepareSubmission()
{
    var strReturn = "CancelTrigger";
    var bErrorsDetected = false;
    var strXML = BeginXMLReturn();
    strXML += "&lt;FORMSUBMISSION ACTIVEFORMSET=\"" + m_strActiveFormSet + "\"&rt;";
    var element = null;
    var value = null;

    var formSet = GetActiveFormSet();
    if (!IsNullOrEmpty(formSet))
    {
        //        var enumerator = new Enumerator(formSet.PostInfo);
        //        for (; !enumerator.atEnd(); enumerator.moveNext())
        //        {

        for (var j = 0; j < formSet.PostInfo.length; j++)
        {
            var postInfoItem = formSet.PostInfo[j];
            if (!IsNullOrEmpty(postInfoItem))
            {
                if (!IsNullOrEmpty(postInfoItem.Source))
                {
                    switch (postInfoItem.Source)
                    {
                        case "associated.values":
                            {
                                value = GetAssociatedValue(postInfoItem.SourceKey);
                            }
                            break;
                        default:
                            {
                                element = document.getElementById(postInfoItem.Source);
                                if (!IsNullOrEmpty(element))
                                {
                                    if (!ValidateField(element))
                                    {
                                        bErrorsDetected = true;
                                    }
                                    if (postInfoItem.TextValue == "true")
                                    {
                                        if (element.tagName == "SELECT")
                                        {
                                            if (element.options.length > 0)
                                            {
                                                var option = element.options[element.selectedIndex];
                                                value = option.text;
                                            }
                                        }
                                        else
                                        {
                                            //value = element.innerText;
                                            value = element.value;
                                        }
                                    }
                                    else
                                    {
                                        if (element.type == "checkbox")
                                        {
                                            value = element.checked.toString();
                                        }
                                        else
                                        {
                                            value = element.value;
                                        }
                                    }
                                }
                            }
                            break;
                    }
                    if (IsNullOrEmpty(value))
                    {
                        value = "";
                    }
                    else
                    {
                        value = value.replace(/&/g, "&amp;");
                        if (postInfoItem.EmbeddedXML === "true")
                        {
                            value = value.replace(/</g, "&lt;");
                            value = value.replace(/>/g, "&rt;");
                        }
                    }
                    strXML += "&lt;FORMFIELD COLUMNNAME=\"" + postInfoItem.Target + "\"&rt;";
                    strXML += "&lt;VALUE&rt;";
                    strXML += value;
                    strXML += "&lt;/VALUE&rt;";
                    strXML += "&lt;/FORMFIELD&rt;";
                }
            }

        }
    }
    strXML += "&lt;/FORMSUBMISSION&rt;";
    if (!bErrorsDetected)
    {
        strReturn = strXML;
    }
    return strReturn;
}

function SetClientSideBenchTriggerID(idTrigger)
{
    m_strBenchTriggerID = idTrigger;
}

function SetClientSideBenchHiddenID(idHidden)
{
    m_strBenchHiddenID = idHidden;
}

function SetClientSideTrayTriggerID(idTrigger)
{
    m_strTrayTriggerID = idTrigger;
}

function SetClientSideTrayHiddenID(idHidden)
{
    m_strTrayHiddenID = idHidden;
}

function SetClientSideTrayContentContainerId(contentContainerId)
{
    m_strModeContainerID = contentContainerId;
}

function SetClientSideBenchContentContainerId(contentContainerId)
{
    m_strBenchContainerID = contentContainerId;
}

function SetClientSideBenchTabsId(benchTabsId)
{
    m_strDivBenchTabsID = benchTabsId;
}

function SetClientSideBenchHeaderId(benchHeaderId)
{
    m_strDivBenchHeaderID = benchHeaderId;
}

function SetClientSideTrayHeaderId(trayHeaderID)
{
    m_strDivTrayHeaderID = trayHeaderID;
}

function SetClientSideTrayListId(trayListId)
{
    m_strDivTrayListID = trayListId;
}

//function UpdateProceed(postBackElement)
//{
//    var bProceed = true;
//    var aDetails = "";
//    var name = postBackElement.getAttribute("name");

//    if (!IsNullOrEmpty(name))
//    {
//        aDetails = name.split("$");
//    }
//    var strMessage = "";
//    var strPrefix = "";
//    var i = 0;

//    if (aDetails.length > 0)
//    {
//        strMessage = aDetails[aDetails.length - 1].trim();
//        for (i = 0; i < aDetails.length - 1; i++)
//        {
//            strPrefix += aDetails[i] + "_";
//        }
//    }

//    if (strMessage !== "BenchTrigger_modeTray" && strMessage !== "BenchTrigger_workBench")
//    {
//        for (i = 0; i < m_ControlUpdateProceedListeners.length; i++)
//        {
//            var cb = m_ControlUpdateProceedListeners[i];
//            var bReturn = cb(strMessage, strPrefix);

//            if (!IsNullOrEmpty(bReturn) && !bReturn)
//            {
//                bProceed = false;
//            }
//        }
//    }
//    return bProceed;
//}


function PreTrigger(details)
{
    var returnValue = null;
    if (!IsNullOrEmpty(details))
    {
        var aDetails = details.split("|");
        var strMessage = "";

        if (aDetails.length > 0)
        {
            strMessage = aDetails[0];
        }
        else
        {
            strMessage = details;
        }

        var t = typeof (strMessage);
        if (t === "string")
        {

            for (var i = 0; i < m_ControlPreTriggerListeners.length; i++)
            {
                var cb = m_ControlPreTriggerListeners[i];
                var strToken = cb(strMessage, aDetails);



                if (!IsNullOrEmpty(strToken))
                {
                    returnValue = strToken;
                    break;
                }
            }
        }
    }
    return returnValue;
}


function DoResize()
{
    var e = document.getElementById(m_strDivTrayListID);
    if (!IsNullOrEmpty(e))
    {
        ResizeModeTray();
    }

    e = document.getElementById(m_strDivBenchTabsID);
    if (!IsNullOrEmpty(e))
    {
        ResizeWorkspace();
    }
}

function ResizeWorkspace()
{
    if (!IsNullOrEmpty(m_strBenchContainerID) && !IsNullOrEmpty(m_strDivBenchTabsID) && !IsNullOrEmpty(m_strDivBenchHeaderID))
    {
        var nContentHeight = 0;

        var oContentContainer = document.getElementById(m_strBenchContainerID);
        var oDivBenchTabs = document.getElementById(m_strDivBenchTabsID);
        var oDivBenchHeader = document.getElementById(m_strDivBenchHeaderID);

        if (!IsNullOrEmpty(oContentContainer) && !IsNullOrEmpty(oDivBenchTabs) && !IsNullOrEmpty(oDivBenchHeader))
        {
            var oContainer = oDivBenchTabs.parentNode;
            var nAvailableHeight = oContainer.clientHeight;
            nAvailableHeight -= parseInt(oDivBenchHeader.style.height, 10);
            nAvailableHeight -= parseInt(oDivBenchTabs.style.height, 10);
            if (nAvailableHeight < 0)
            {
                nAvailableHeight = 0;
            }
            oContentContainer.style.top = (parseInt(oDivBenchHeader.style.top, 10) + parseInt(oDivBenchHeader.style.height, 10)) + "px";
            oContentContainer.style.height = nAvailableHeight + "px";
        }
    }
}

function ResizeModeTray()
{
    if (!IsNullOrEmpty(m_strModeContainerID) && !IsNullOrEmpty(m_strDivTrayListID) && !IsNullOrEmpty(m_strDivTrayHeaderID))
    {
        var nTrayItemCount = GetTrayListItemCount();
        if (nTrayItemCount > 0)
        {
            var nModeContentHeight = 0;
            var nTrayListHeight = 31 * nTrayItemCount;

            var oModeContentContainer = document.getElementById(m_strModeContainerID);
            var oDivTrayList = document.getElementById(m_strDivTrayListID);
            var oDivTrayHeader = document.getElementById(m_strDivTrayHeaderID);


            if (!IsNullOrEmpty(oModeContentContainer) && !IsNullOrEmpty(oDivTrayList) && !IsNullOrEmpty(oDivTrayHeader))
            {
                var oContainer = oDivTrayList.parentNode;
                oDivTrayList.style.height = nTrayListHeight + "px";
                var nAvailableHeight = oContainer.clientHeight;
                nAvailableHeight -= parseInt(oDivTrayHeader.style.height, 10);
                nAvailableHeight -= parseInt(oDivTrayList.style.height, 10);

                if (nAvailableHeight < 0)
                {
                    nAvailableHeight = 0;
                }
                oModeContentContainer.style.top = (parseInt(oDivTrayHeader.style.top, 10) + parseInt(oDivTrayHeader.style.height, 10)) + "px";
                oModeContentContainer.style.height = nAvailableHeight + "px";
            }
        }
    }
}

function RegisterPanel(id)
{

}

function GetFormField(formSet, id)
{
    var formField = null;
    for (var i = 0; i < formSet.FormFields.length; i++)
    {
        var formFieldFind = formSet.FormFields[i];
        if (!IsNullOrEmpty(formFieldFind))
        {
            if (formFieldFind.ColumnName === id)
            {
                formField = formFieldFind;
                break;
            }
        }
    }
    return formField;
}

function ValidateField(element)
{
    var bValid = true;
    var strValue = element.value;
    var formSet = GetActiveFormSet();
    var formField = GetFormField(formSet, element.id);

    if (!IsNullOrEmpty(formField))
    {
        if (IsNullOrEmpty(strValue))
        {
            if (formField.Required === "True")
            {
                bValid = false;
                formField.ErrorMessage = "Value is required";
            }
            formField.CurrentValue = "";
        }
        else
        {
            if (bValid)
            {
                if (element.type === "checkbox")
                {
                    if (formField.Required === "True")
                    {
                        if (!element.checked)
                        {
                            bValid = false;
                            formField.ErrorMessage = "Checkbox tick is required";
                        }
                    }
                }
            }
            if (bValid)
            {
                if (formField.MaxLength > 0)
                {
                    if (strValue.length > formField.MaxLength)
                    {
                        bValid = false;
                        formField.ErrorMessage = "Value exceeds limit of " + formField.MaxLength.toString();
                    }
                }
            }
            if (bValid)
            {
                if (!IsNullOrEmpty(formField.ValidationItems))
                {
                    for (var i = 0; i < formField.ValidationItems.length; i++)
                    {
                        if (IsNullOrEmpty(formField.ValidationItems[i].Validated) || formField.ValidationItems[i].Validated === false)
                        {
                            formField.ErrorMessage = "Item fails validation";
                            bValid = false;
                            break;
                        }
                    }
                }
            }


            formField.CurrentValue = strValue;
        }
    }

    if (!bValid)
    {
        element.className = formField.ControlErrorClass;
    }
    else
    {
        element.className = formField.ControlClass;
    }
    return bValid;
}


function BeginXMLReturn()
{
    var strHeader = "&lt;?xml version=\"1.0\" encoding=\"utf-8\" ?&rt;";
    return strHeader;
}

function SetActiveFormSet(strFormSet)
{
    m_strActiveFormSet = strFormSet;
}

function GetActiveFormSet()
{
    return GetFormSet(m_strActiveFormSet);
}



function GetFormSet(strFormSet)
{
    var formSet = null;
    for (var i = 0; i < m_FormSets.length; i++)
    {
        var formSetFind = m_FormSets[i];
        if (!IsNullOrEmpty(formSetFind))
        {
            if (formSetFind.FormID == strFormSet)
            {
                formSet = formSetFind;
                break;
            }
        }
    }
    return formSet;
}

function RecurseFindID(id, element)
{
    var objReturn = null;

    for (var i = 0; i < element.childNodes.length; i++)
    {
        if (id == element.childNodes[i].id)
        {
            objReturn = element.childNodes[i];
            break;
        }
        else
        {
            objReturn = RecurseFindID(id, element.childNodes[i]);
            if (!IsNullOrEmpty(objReturn))
            {
                break;
            }
        }
    }
    return objReturn;
}

function RecurseFindParent(potentialParent, potentialChild)
{
    var bReturn = false;

    if (!IsNullOrEmpty(potentialParent.childNodes))
    {
        for (var i = 0; i < potentialParent.childNodes.length; i++)
        {
            if (potentialParent.childNodes[i] == potentialChild)
            {
                bReturn = true;
                break;
            }
            else
            {
                bReturn = RecurseFindParent(potentialParent.childNodes[i], potentialChild);
                if (bReturn === true)
                {
                    break;
                }
            }
        }
    }
    return bReturn;
}


function AddTraySection(strTray, strName, strId)
{

}

function AddTraySectionItem(strTray, strSectionId, strItemName, strItemId)
{

}


function FormSet(strFormID, strLabel, strHeaderSet, strTabSet, strDefaultTabSetItem, strDefaultFocusItem)
{
    this.FormID = strFormID;
    this.Label = strLabel;
    this.HeaderSet = strHeaderSet;
    this.TabSet = strTabSet;
    this.DefaultTabSetItem = strDefaultTabSetItem;
    this.DefaultFocusItem = strDefaultFocusItem;
    this.SubmissionAction = null;
    this.FormFields = new Array();
    this.FormGrids = new Array();
    this.FormToolbarItems = new Array();
    this.InitInfo = new Array();
    this.ProcInfo = new Array();
    this.PostInfo = new Array();
    this.ValidationInfo = new Array();
    this.SideButtonInfo = new Array();
    this.ValueChangeInfo = new Array();
    this.State = "initial";


}

function SubmissionAction(strSubmissionFormSet, strSubmissionHeaderSet, strSubmissionTabSet, strSubmissionTabSetItem)
{
    this.SubmissionFormSet = strSubmissionFormSet;
    this.SubmissionHeaderSet = strSubmissionHeaderSet;
    this.SubmissionTabSet = strSubmissionTabSet;
    this.SubmissionTabSetItem = strSubmissionTabSetItem;
    this.ServiceCalls = new Array();
    this.NewLocation = "";
}

function DeclareFormSet(strFormID, strLabel, strHeaderSet, strTabSet, strDefaultTabSetItem, strDefaultFocusItem)
{
    var formSet = new FormSet(strFormID, strLabel, strHeaderSet, strTabSet, strDefaultTabSetItem, strDefaultFocusItem);
    m_FormSets.push(formSet);
}


function AddFormSetField(strFormID, columnName, maxLength, required, controlClass, controlErrorClass)
{
    var formField = new FormField(columnName, maxLength, required, controlClass, controlErrorClass);

    var formSet = GetFormSet(strFormID);
    if (!IsNullOrEmpty(formSet))
    {
        formSet.FormFields.push(formField);
    }
}

function GetSideButtonInfo(formSet, id)
{
    var sideButtonInfo = null;

    if (!IsNullOrEmpty(formSet))
    {
        for (var i = 0; i < formSet.FormFields.length; i++)
        {
            var sideButtonInfoFind = formSet.SideButtonInfo[i];
            if (!IsNullOrEmpty(sideButtonInfoFind))
            {
                if (sideButtonInfoFind.ColumnName == id)
                {
                    sideButtonInfo = sideButtonInfoFind;
                    break;
                }
            }
        }
    }
    return sideButtonInfo;
}

function AddSideButtonInfoItem(strFormID, strSideButtonValueTarget, strSideButtonValueKey, strSideButtonDisplayKey, strColumn)
{
    var sideButtonInfoItem = new SideButtonInfoItem(strSideButtonValueTarget, strSideButtonValueKey, strSideButtonDisplayKey, strColumn);
    var formSet = GetFormSet(strFormID);
    if (!IsNullOrEmpty(formSet))
    {
        formSet.SideButtonInfo.push(sideButtonInfoItem);
    }
}

function AddValueChangeInfoItem(strFormID, strValueChangeAction, strValueChangeActionSource, strValueChangeActionParameter, strValueChangeActionDefaultParameter, strValueChangeActionTarget, strColumn)
{
    var valueChangeInfoItem = new ValueChangeInfoItem(strValueChangeAction, strValueChangeActionSource, strValueChangeActionParameter, strValueChangeActionDefaultParameter, strValueChangeActionTarget, strColumn);
    var formSet = GetFormSet(strFormID);
    if (!IsNullOrEmpty(formSet))
    {
        formSet.ValueChangeInfo.push(valueChangeInfoItem);
    }

}

function AddProcInfoItem(strFormID, strSource, strSourceKey, strTarget, strParameters, strCommands)
{
    var procInfoItem = new ProcInfoItem(strSource, strSourceKey, strTarget, strParameters, strCommands);
    var formSet = GetFormSet(strFormID);
    if (!IsNullOrEmpty(formSet))
    {
        formSet.ProcInfo.push(procInfoItem);
    }
}

function AddInitInfoItem(strFormID, strSource, strSourceKey, strTarget, strParameters, strTargetInfo)
{
    var initInfoItem = new InitInfoItem(strSource, strSourceKey, strTarget, strParameters, strTargetInfo);
    var formSet = GetFormSet(strFormID);
    if (!IsNullOrEmpty(formSet))
    {
        formSet.InitInfo.push(initInfoItem);
    }
}

function AddPostInfoItem(strFormID, strSource, strSourceKey, strTarget, strEmbeddedXML, strTextValue)
{
    var postInfoItem = new PostInfoItem(strSource, strSourceKey, strTarget, strEmbeddedXML, strTextValue);
    var formSet = GetFormSet(strFormID);
    if (!IsNullOrEmpty(formSet))
    {
        formSet.PostInfo.push(postInfoItem);
    }
}

function AddDataValidationItem(strFormID, strSource, strSourceKey, strRuleType, strRuleOperator, strRequirement, strErrorMessage, strExtraInfo)
{
    var validationInfoItem = new ValidationInfoItem(strSource, strSourceKey, strRuleType, strRuleOperator, strRequirement, strErrorMessage, strExtraInfo);
    var formSet = GetFormSet(strFormID);
    if (!IsNullOrEmpty(formSet))
    {
        formSet.ValidationInfo.push(validationInfoItem);
    }
}



function DataAssociation(strKey, strValue)
{
    this.Key = strKey;
    this.Value = strValue;
}

function ProcInfoItem(strSource, strSourceKey, strTarget, strParameters, strCommands)
{
    this.Source = strSource;
    this.SourceKey = strSourceKey;
    this.Target = strTarget;
    this.Parameters = strParameters;
    this.Commands = strCommands;
}

function InitInfoItem(strSource, strSourceKey, strTarget, strParameters, strTargetInfo)
{
    this.Source = strSource;
    this.SourceKey = strSourceKey;
    this.Target = strTarget;
    this.Parameters = strParameters;
    this.TargetInfo = strTargetInfo;
}

function PostInfoItem(strSource, strSourceKey, strTarget, strEmbeddedXML, strTextValue)
{
    this.Source = strSource;
    this.SourceKey = strSourceKey;
    this.Target = strTarget;
    this.EmbeddedXML = strEmbeddedXML;
    this.TextValue = strTextValue;
}

function ValidationInfoItem(strSource, strSourceKey, strRuleType, strRuleOperator, strRequirement, strErrorMessage, strExtraInfo)
{
    this.Source = strSource;
    this.SourceKey = strSourceKey;
    this.RuleType = strRuleType;
    this.RuleOperator = strRuleOperator;
    this.Requirement = strRequirement;
    this.ErrorMessage = strErrorMessage;
    this.ExtraInfo = strExtraInfo;
}


function SideButtonInfoItem(strSideButtonValueTarget, strSideButtonValueKey, strSideButtonDisplayKey, strColumn)
{
    this.SideButtonValueTarget = strSideButtonValueTarget;
    this.SideButtonValueKey = strSideButtonValueKey;
    this.SideButtonDisplayKey = strSideButtonDisplayKey;
    this.ColumnName = strColumn;
}

function ValueChangeInfoItem(strValueChangeAction, strValueChangeActionSource, strValueChangeActionParameter, strValueChangeActionDefaultParameter, strValueChangeActionTarget, strColumn)
{
    this.ValueChangeAction = strValueChangeAction;
    this.ValueChangeActionSource = strValueChangeActionSource;
    this.ValueChangeActionParameter = strValueChangeActionParameter;
    this.ValueChangeActionDefaultParameter = strValueChangeActionDefaultParameter;
    this.ValueChangeActionTarget = strValueChangeActionTarget;
    this.ColumnName = strColumn;
}

function FormField(strColumnName, nMaxLength, bRequired, strControlClass, strControlErrorClass)
{
    this.ColumnName = strColumnName;
    this.MaxLength = nMaxLength;
    this.Required = bRequired;
    this.ControlClass = strControlClass;
    this.ControlErrorClass = strControlErrorClass;
    this.CurrentValue = "";
    this.ErrorMessage = "";
    this.ValueList = null;
    this.TextList = null;
    this.ValidationItems = new Array();
}

function ValidationItem()
{
    this.Id = null;
    this.Validated = null;
    this.ErrorMessage = null;
}




function FormGrid(strGridId)
{
    this.Id = strGridId;
    this.Columns = new Array();
    this.CurrentColumn = -1;
    this.CurrentRow = -1;
    this.ColumnCount = -1;
    this.RowCount = -1;
    this.QueryRowIndex = -1;
    this.QueryRowIncrement = -1;
    this.QueryFilter = "";
    this.EntireCount = -1;

}

function FormGridColumn(strCssClass, strSelectedCssClass, strColumnId, strText, strType, strSource, strWidth)
{
    this.CssClass = strCssClass;
    this.SelectedCssClass = strSelectedCssClass;
    this.ColumnId = strColumnId;
    this.Text = strText;
    this.Type = strType;
    this.Source = strSource;
    this.Width = strWidth;
    this.Data = new Array();

}


function SetAssociatedValue(strKey, strValue)
{
    var bSet = true;
    for (var i = 0; i < m_DataAssociations.length; i++)
    {
        if (m_DataAssociations[i].Key == strKey)
        {
            m_DataAssociations[i].Value = strValue;
            bSet = false;
            break;
        }
    }
    if (bSet)
    {
        var dataAssociation = new DataAssociation(strKey, strValue);
        m_DataAssociations.push(dataAssociation);
    }
}

function GetAssociatedValue(strKey)
{

    var returnValue = null;
    if (!IsNullOrEmpty(m_DataAssociations))
    {
        for (var i = 0; i < m_DataAssociations.length; i++)
        {
            if (m_DataAssociations[i].Key == strKey)
            {
                returnValue = m_DataAssociations[i].Value;
                break;
            }
        }
    }
    return returnValue;
}

function ClearDown()
{
    for (var i = 0; i < m_FormSets.length; i++)
    {
        var formSet = m_FormSets[i];
        if (!IsNullOrEmpty(formSet))
        {
            formSet.State = "initial";
            var formField = null;
            for (var j = 0; j < formSet.FormFields.length; j++)
            {
                formField = formSet.FormFields[j];
                if (!IsNullOrEmpty(formField))
                {
                    formField.CurrentValue = "";
                    formField.ErrorMessage = "";
                }
            }

            var formGrid = null;
            for (var k = 0; k < formSet.FormGrids.length; k++)
            {
                formGrid = formSet.FormGrids[k];
                for (var h = 0; h < formGrid.Columns.length; h++)
                {
                    formGrid.Columns[h].Data = new Array();
                }
                formGrid.CurrentRow = -1;
                formGrid.CurrentColumn = -1;
                formGrid.RowCount = -1;
            }
        }
    }

    //    var benchHidden = document.getElementById(m_strBenchHiddenID);
    //    var trayHidden = document.getElementById(m_strTrayHiddenID);

    //    benchHidden.innerText = "";
    //    trayHidden.innerText = "";



    SetActiveFormSet("");


    var oBenchHeader = $find(m_strDivBenchHeaderID);
    if (!IsNullOrEmpty(oBenchHeader))
    {
        oBenchHeader.BenchHeaderAssertHeaderSet("");
    }

    var oBenchTabs = $find(m_strDivBenchTabsID);
    if (!IsNullOrEmpty(oBenchTabs))
    {
        oBenchTabs.BenchTabsAssertTabSet("");
        oBenchTabs.SetSelectedTabItem("");
    }



    //    BenchTabsAssertTabSet("");
    //    SetSelectedTabItem("");

    //      var divBenchControlsPanel = document.getElementById(m_strBenchContainerID);
    //        if ( !IsNullOrEmpty(divBenchControlsPanel ))
    //        {
    //            divBenchControlsPanel.innerText = "";
    //        }


}






function DateComboOnChange(event, ID, ClientID)
{
    //this is an AJAX control and needs to update the formset values itself
    var formSet = GetActiveFormSet();

    if (!IsNullOrEmpty(formSet))
    {
        for (var i = 0; i < formSet.FormFields.length; i++)
        {
            var formFieldItem = formSet.FormFields[i];
            if (!IsNullOrEmpty(formFieldItem))
            {
                if (formFieldItem.ColumnName == ID)
                {
                    var element = document.getElementById(ClientID);
                    if (!IsNullOrEmpty(element))
                    {
                        switch (element.tagName)
                        {
                            case "INPUT":

                                {
                                    formFieldItem.CurrentValue = element.value;
                                    formFieldItem.ColumnName = ClientID;
                                }
                                break;
                            default:
                                break;

                        }
                    }
                }
            }
        }
    }


}

function PanelInputOnBeforeActivate(evtObj)
{
    //    if ( !IsNullOrEmpty(evtObj  ))
    //    {
    //        var eSrc = evtObj.srcElement;

    //        if ( !IsNullOrEmpty(eSrc ))
    //        {

    //            switch (eSrc.id)
    //            {

    //                case "requestee.firstname":
    //                    {
    //                    }
    //                    break;
    //            }
    //        }
    //        //evtObj.cancelBubble = true;
    //    }
}





function DoFormInitialisation()
{
    var value = null;
    var element = null;
    var formSet = GetActiveFormSet();

    if (!IsNullOrEmpty(formSet))
    {
        if (formSet.State == "initial")
        {
            for (var i = 0; i < formSet.InitInfo.length; i++)
            {
                var initInfoItem = formSet.InitInfo[i];
                if (!IsNullOrEmpty(initInfoItem))
                {
                    if (!IsNullOrEmpty(initInfoItem.Source))
                    {
                        switch (initInfoItem.Source)
                        {
                            case "associated.values":
                                {
                                    TryPlaceAssociatedValue(initInfoItem);
                                }
                                break;
                            case "service.call":
                                {
                                    var oServiceCallInfo = new ServiceCallInfo(formSet.FormID, initInfoItem.SourceKey, initInfoItem.Parameters, initInfoItem.Target, null);
                                    m_ServiceQ.push(oServiceCallInfo);
                                    //ProcessServiceQueue();
                                }
                                break;
                            case "gallery.set":
                                {
                                    LoadGallery(initInfoItem.SourceKey, "first");
                                }
                                break;
                            default:
                                break;
                        }
                    }
                }
            }
            formSet.State = "initialized";
        }
        else if (formSet.State == "initialized")
        {
            for (i = 0; i < formSet.FormFields.length; i++)
            {
                var formFieldItem = formSet.FormFields[i];
                if (!IsNullOrEmpty(formFieldItem))
                {
                    element = document.getElementById(formFieldItem.ColumnName);
                    if (!IsNullOrEmpty(element))
                    {
                        switch (element.tagName)
                        {
                            case "INPUT":
                            case "TEXTAREA":
                                {
                                    if (element.type == "checkbox")
                                    {
                                        //                                        element.checked = formFieldItem.CurrentValue;

                                        element.checked = formFieldItem.CurrentValue === true ? true : false;
                                    }
                                    else
                                    {
                                        //element.innerText = formFieldItem.CurrentValue;
                                        element.value = formFieldItem.CurrentValue;
                                    }
                                }
                                break;
                            case "SELECT":
                                {
                                    if (!IsNullOrEmpty(formFieldItem.ValueList))
                                    {
                                        for (var j = 0; j < formFieldItem.ValueList.length; j++)
                                        {
                                            var oOption = document.createElement("OPTION");
                                            oOption.text = formFieldItem.TextList[j];
                                            oOption.value = formFieldItem.ValueList[j];
                                            element.options.add(oOption);
                                        }
                                    }
                                    element.selectedIndex = formFieldItem.CurrentValue;
                                }
                                break;
                            default:

                                break;
                        }
                    }
                }
            }

            if (!IsNullOrEmpty(formSet.FormGrids))
            {

                for (i = 0; i < formSet.FormGrids.length; i++)
                {
                    HandleGridLoad(formSet.FormID, formSet.FormGrids[i].Id);
                }

            }
            if (!IsNullOrEmpty(formSet.FormToolbarItems))
            {
               
                    for (i = 0; i < formSet.FormToolbarItems.length; i++)
                    {
                        HandleToolbarLoad (formSet.FormID, formSet.FormToolbarItems[i].Id);
                    }
                
            }
            for (i = 0; i < formSet.InitInfo.length; i++)
            {
                initInfoItem = formSet.InitInfo[i];
                if (!IsNullOrEmpty(initInfoItem))
                {
                    if (!IsNullOrEmpty(initInfoItem.Source))
                    {
                        switch (initInfoItem.Source)
                        {
                            case "gallery.set":
                                {
                                    LoadGallery(initInfoItem.SourceKey, ""); //default to current
                                }
                                break;
                            default:
                                break;
                        }
                    }
                }
            }


        }
        if (!IsNullOrEmpty(formSet.DefaultFocusItem))
        {
            element = document.getElementById(formSet.DefaultFocusItem);
            if (!IsNullOrEmpty(element))
            {
                m_bGlobalFocusAllowed = false;
                element.focus();
            }
            else
            {
                m_bGlobalFocusAllowed = true;
            }

        }
        else
        {
            m_bGlobalFocusAllowed = true;
        }
    }
}

function TryPlaceAssociatedValue(initInfoItem)
{
    var element = null;
    var value = GetAssociatedValue(initInfoItem.SourceKey);
    if (IsNullOrEmpty(value))
    {
        m_PostInitializationQ.push(initInfoItem);
    }
    else
    {
        element = document.getElementById(initInfoItem.Target);
        if (!IsNullOrEmpty(element))
        {
            switch (element.tagName)
            {
                case "TABLE":

                    break;
                case "INPUT":
                case "TEXTAREA":
                    {
                        if (element.type == "checkbox")
                        {
                            element.checked = value;
                        }
                        else
                        {
                            //element.innerText = value;
                            element.value = value;
                        }
                    }
                    break;
                case "SELECT":
                    //                    {
                    //                        var nOptionCount = element.options.length;
                    //                        if (nOptionCount > 0)
                    //                        {
                    //                            for (var j = 0; j < nOptionCount; j++)
                    //                            {
                    //                                var option = element.options[j];
                    //                                //element.options.remove(j);
                    //                            }
                    //                        }
                    //                    }
                    break;
                default:
                    {
                        //element.innerText = value;
                        element.value = value;
                    }
                    break;
            }
        }
    }
}

function UpdateFormValues()
{
    var formSet = GetActiveFormSet();

    if (!IsNullOrEmpty(formSet))
    {
        for (var i = 0; i < formSet.FormFields.length; i++)
        {
            var formFieldItem = formSet.FormFields[i];
            if (!IsNullOrEmpty(formFieldItem))
            {
                var element = document.getElementById(formFieldItem.ColumnName);
                if (!IsNullOrEmpty(element))
                {
                    switch (element.tagName)
                    {
                        case "INPUT":
                        case "TEXTAREA":
                            {
                                if (element.type === "checkbox")
                                {
                                    formFieldItem.CurrentValue = element.checked;
                                }
                                else
                                {
                                    formFieldItem.CurrentValue = element.value;
                                }

                            }
                            break;
                        case "SELECT":
                            {
                                formFieldItem.ValueList = new Array();
                                formFieldItem.TextList = new Array();

                                for (var j = 0; j < element.options.length; j++)
                                {
                                    formFieldItem.ValueList.push(element.options[j].value);
                                    formFieldItem.TextList.push(element.options[j].text);

                                }
                                formFieldItem.CurrentValue = element.options.selectedIndex;
                            }
                            break;
                        default:

                            break;
                    }
                }
            }
        }
    }
}


function ServiceCallInfo(strFormSetID, strMethod, strParameters, strTargetID, oCargo)
{
    this.FormSetID = strFormSetID;
    this.Method = strMethod;
    this.Parameters = strParameters;
    this.TargetID = strTargetID;
    this.Cargo = oCargo;
}





function OnXmlListPageLoad(ctrlXmlListClientID)
{
    m_strClientID = ctrlXmlListClientID;
    var element = document.getElementById(ctrlXmlListClientID);
    if (!IsNullOrEmpty(element))
    {
        DisplayParents(element);
    }
}

function DisplayParents(elem)
{
    if (!IsNullOrEmpty(elem))
    {
        var element = XslListRecurseFindClass("listXslParentTopic", elem);
        if (!IsNullOrEmpty(element))
        {
            element.style.display = "block";

            do
            {
                var sibling = element.parentElement.ParentNode;
                if (!IsNullOrEmpty(sibling))
                {
                    element = XslListRecurseFindClass("listXslParentTopic", sibling);
                    if (!IsNullOrEmpty(element))
                    {
                        element.style.display = "block";
                    }

                }
            }
            while (!IsNullOrEmpty(sibling) && !IsNullOrEmpty(element));
        }
    }
}

function XslListRecurseFindClass(className, element)
{
    var objReturn = null;

    for (var i = 0; i < element.childNodes.length; i++)
    {
        if (className === element.childNodes[i].className)
        {
            objReturn = element.childNodes[i];
            break;
        }
        else
        {
            return XslListRecurseFindClass(className, element.childNodes[i]);
        }
    }
    return objReturn;
}

function XslListGetChildElem(eSrc, sTagName)
{

    for (var i = 0; i < eSrc.childNodes.length; i++)
    {
        if (sTagName === eSrc.childNodes[i].tagName) return eSrc.childNodes[i];
    }
    return false;
}

function XslListContainerOnLoad(evtObj)
{

    for (var i = 0; i < evtObj.srcElement.childNodes.length; i++)
    {
        if ("listXslParentTopic" === evtObj.srcElement.childNodes[i].className)
        {
            evtObj.srcElement.childNodes[i].style.display = "block";
        }
    }
}

function XslListRecurseToggleDisplay(oChildren)
{
    for (var i = 0; i < oChildren.length; i++)
    {
        if ("listXslChildTopic" === oChildren.className || "listXslParentTopic" === oChildren.className)
        {
            oChildren.style.display = ("block" === oChildren.style.display ? "none" : "block");
        }
        else if ("listXslChildTopic" === oChildren[i].className || "listXslParentTopic" === oChildren[i].className)
        {
            oChildren[i].style.display = ("block" === oChildren[i].style.display ? "none" : "block");
        }
        else
        {
            XslListRecurseToggleDisplay(oChildren[i].childNodes);
        }
    }
}

function XslListShowAll(sTagName)
{
    var cElems = document.all.tags[sTagName];
    var iNumElems = cElems.length;
    for (var i = 1; i < iNumElems; i++) cElems[i].style.display = "block";
}

function XslListHideAll(sTagName)
{
    var cElems = document.all.tags[sTagName];
    var iNumElems = cElems.length;
    for (var i = 1; i < iNumElems; i++) cElems[i].style.display = "none";
}




//select specific
function ClearSelectOptions(element)
{
    var nOptionCount = element.options.length;
    if (nOptionCount > 0)
    {
        for (var j = nOptionCount - 1; j >= 0; j--)
        {
            element.remove(element.options[j]);
        }
    }
}


function LoadSelectOptions(element, result)
{
    var aResults = result.split("~");
    for (var i = 0; i < aResults.length; i++)
    {
        var aResultRow = aResults[i].split("=");

        if (aResultRow[0] === "column.data")
        {
            var aColumns = aResultRow[1].split("|");

            var oOption = document.createElement("OPTION");

            oOption.text = aColumns[0];
            oOption.value = aColumns[1];

            element.options.add(oOption);
        }
    }

}


function GetSelectOptionIndex(element, value, bTextValueCompare)
{
    var nIndex = 0;
    var nOptionCount = element.options.length;
    var j = 0;
    var option = null;

    if (nOptionCount > 0)
    {
        if (bTextValueCompare)
        {
            for (j = 0; j < nOptionCount; j++)
            {
                option = element.options[j];
                if (option.text === value)
                {
                    nIndex = option.index;
                    break;
                }
            }
        }
        else
        {
            for (j = 0; j < nOptionCount; j++)
            {
                option = element.options[j];
                if (option.value === value)
                {
                    nIndex = option.index;
                    break;
                }
            }
        }
    }
    return nIndex;
}



function GetInitInfoItem(formSetID, targetID, source)
{
    var returnValue = null;
    var formSet = GetFormSet(formSetID);
    if (!IsNullOrEmpty(formSet))
    {
        for (var i = 0; i < formSet.InitInfo.length; i++)
        {
            var initInfoItem = formSet.InitInfo[i];
            if (!IsNullOrEmpty(initInfoItem))
            {
                if (initInfoItem.Target === targetID && initInfoItem.Source === source)
                {
                    returnValue = initInfoItem;
                    break;
                }
            }
        }
    }
    return returnValue;
}





function FormInputKeyDown(sender, e)
{
    if (navigator.userAgent.match("Gecko"))
    {
        c = e.which;
    }
    else
    {
        c = e.keyCode;
    }
    if (c === 13)
    {

        BenchHeaderClicked("toolbar.form.submit", e);
    }

}

function FeedbackKeyDown(sender, e, href)
{
    if (navigator.userAgent.match("Gecko"))
    {
        c = e.which;
    }
    else
    {
        c = e.keyCode;
    }
    if (c === 13)
    {
        window.location = href;
    }
}

function FeedbackOnLoad(sender, event)
{
    if (!IsNullOrEmpty(sender))
    {
        var element = document.getElementById("feedBackIMG");
        if (!IsNullOrEmpty(element))
        {
            //            element.parentElement.focus();

            m_GlobalFocusElement = element.parentNode;
            //m_GlobalFocusElement = element.parentElement;
            window.setTimeout("GlobalFocus()", 500);
        }
    }
}

function GlobalFocus()
{

    if (m_bGlobalFocusAllowed)
    {
        if (!IsNullOrEmpty(m_GlobalFocusElement) && typeof (m_GlobalFocusElement) !== "undefined")
        {
            m_GlobalFocusElement.focus();

        }
    }
}

function FormToolbarItem(strToolbarItemId)
{
    this.Id = strToolbarItemId;
    this.SelecetedIndex = 0;
    this.Data = "";
}

function AddFormSetToolbarItem(strFormID, strToolbarItemID)
{
    var formToolbarItem = new FormToolbarItem(strToolbarItemID);

    var formSet = GetFormSet(strFormID);
    if (!IsNullOrEmpty(formSet))
    {
        formSet.FormToolbarItems.push(formToolbarItem);
    }
}

function GetFormToolbarItem(strFormID, strToolbarItemID)
{
    var toolbarItem = null;
    var formSet = GetFormSet(strFormID);
    if (!IsNullOrEmpty(formSet))
    {
        for (var i = 0; i < formSet.FormToolbarItems.length; i++)
        {
            if (formSet.FormToolbarItems[i].Id === strToolbarItemID)
            {
                toolbarItem = formSet.FormToolbarItems[i];
                break;
            }
        }
    }
    return toolbarItem;
}

function AddFormSetGrid(strFormID, strGridID)
{
    var formGrid = new FormGrid(strGridID);

    var formSet = GetFormSet(strFormID);
    if (!IsNullOrEmpty(formSet))
    {
        formSet.FormGrids.push(formGrid);
    }
}

function AddFormSetGridColumn(strFormID, strGridId, strCssClass, strSelectedCssClass, strColumnId, strText, strType, strSource, strWidth)
{
    var formGridColumn = new FormGridColumn(strCssClass, strSelectedCssClass, strColumnId, strText, strType, strSource, strWidth);
    var formGrid = GetFormGrid(strFormID, strGridId);

    if (!IsNullOrEmpty(formGrid))
    {
        formGrid.Columns.push(formGridColumn);
    }
}

function GetFormGrid(strFormID, strGridId)
{
    var formGrid = null;
    var formSet = GetFormSet(strFormID);
    if (!IsNullOrEmpty(formSet))
    {
        for (var i = 0; i < formSet.FormGrids.length; i++)
        {
            if (formSet.FormGrids[i].Id === strGridId)
            {
                formGrid = formSet.FormGrids[i];
                break;

            }
        }

    }
    return formGrid;
}

function ProcessCallBackResult(strFormID, strContext, strTargetId, strResult)
{
    var i = 0;

    switch (strContext)
    {
        case "associated.values":
            {
                var aParameters = strResult.split("|");
                if (aParameters.length > 0)
                {
                    for (i = 0; i < aParameters.length; i++)
                    {
                        var aInfo = aParameters[i].split("=");
                        if (aInfo.length === 2)
                        {
                            SetAssociatedValue(aInfo[0], aInfo[1]);
                        }
                    }
                }
                var nQueueLength = m_PostInitializationQ.length;
                if (nQueueLength > 0)
                {
                    for (i = 0; i < nQueueLength; i++)
                    {
                        var initInfoItem = m_PostInitializationQ.pop();
                        TryPlaceAssociatedValue(initInfoItem);
                    }
                }
            }
            break;
        case "grid.resultset":
            {
                if (!IsNullOrEmpty(m_GridResultHandler))
                {
                    m_GridResultHandler(strFormID, strTargetId, strResult);


                    HandleGridLoad(strFormID, strTargetId);

                }
            }
            break;
        case "toolbar.resultset":
            {
                if (!IsNullOrEmpty(m_ToolbarResultHandler))
                {
                    m_ToolbarResultHandler(strFormID, strTargetId, strResult);

                    HandleToolbarLoad(strFormID, strTargetId);
                    
                }
            }
            break;
        default:
            break;
    }
}


function HandleToolbarLoad(strFormID, strToolbarId)
{
    var toolbarItem = GetFormToolbarItem(strFormID, strToolbarId);
    if (!IsNullOrEmpty(toolbarItem))
    {
        var element = document.getElementById(toolbarItem.Id);
        if (!IsNullOrEmpty(element))
        {

            ClearSelectOptions(element);

            LoadSelectOptions(element, toolbarItem.Data);

            var initInfoItem = GetInitInfoItem(strFormID, strToolbarId, "associated.values");
            if (!IsNullOrEmpty(initInfoItem))
            {
                var value = GetAssociatedValue(initInfoItem.SourceKey);
                if (!IsNullOrEmpty(value))
                {
                    var bTextValueCompare = initInfoItem.TargetInfo === "text" ? true : false;

                    var nSelectedIndex = GetSelectOptionIndex(element, value, bTextValueCompare);
                    element.options.selectedIndex = nSelectedIndex;
                }
            }

            //if a value change on this element updates another
            var formSet = GetFormSet(strFormID);
            if (!IsNullOrEmpty(formSet))
            {
                if (formSet.ValueChangeInfo.length > 0)
                {
                    for (var j = 0; j < formSet.ValueChangeInfo.length; j++)
                    {
                        if (formSet.ValueChangeInfo[j].ColumnName === strToolbarId)
                        {
                            var e = document.getElementById(formSet.ValueChangeInfo[j].ColumnName);
                            ProcessValueChangeInfoItem(formSet, e, formSet.ValueChangeInfo[j]);
                        }
                    }
                }
            }
        }
    }
}

function HandleGridLoad(strFormID, strGridId)
{
    var formGrid = GetFormGrid(strFormID, strGridId);
    if (!IsNullOrEmpty(formGrid))
    {
        formGrid.ColumnCount = formGrid.Columns.length;
        if (formGrid.ColumnCount > 0)
        {
            var gridBody = document.getElementById(formGrid.Id + ".grid.body");
            if (!IsNullOrEmpty(gridBody))
            {
                if (gridBody.rows.length > 0)
                {
                    for (var iRow = gridBody.rows.length - 1; iRow >= 0; iRow--)
                    {
                        gridBody.deleteRow(iRow);
                    }
                }

                var benchHeaderExtra = document.getElementById("divBenchHeaderExtra");
                if (!IsNullOrEmpty(benchHeaderExtra))
                {
                    //var strHTML = "<div >";
                    var strHTML = "";
                    for (var n = 0; n < formGrid.ColumnCount; n++)
                    {
                        strHTML += "<span " +
                         "style='" +
                         "position:relative" +
                         "; " +
                         "display:inline-block" +
                         "; " +
                         "text-align:center" +
                         "; " +
                         "margin-left: 5px" +
                         "; " +
                         "margin-top: 5px" +
                         "; " +
                         "width:" + formGrid.Columns[n].Width +
                         "; " +
                         "' " +
                         ">" +
                         formGrid.Columns[n].Text +
                         "</span>";
                    }
                    //strHTML += "</div>";
                    benchHeaderExtra.innerHTML = strHTML;
                }

                for (var i = 0; i < formGrid.RowCount; i++)
                {
                    var row = gridBody.insertRow(-1);
                    for (var j = 0; j < formGrid.ColumnCount; j++)
                    {
                        var cell = row.insertCell(-1);
                        cell.id = i + "." + j;
                        cell.className = formGrid.Columns[j].CssClass;
                        cell.style.width = formGrid.Columns[j].Width;
                        cell.style.cursor = "arrow";
                        cell.innerHTML = "<p style='cursor:hand;' onclick='CellOnClick( event, &quot;" + cell.id + "&quot;,&quot;" + strFormID + "&quot;,&quot;" + strGridId + "&quot;);'>" + formGrid.Columns[j].Data[i] + "</p>";
                    }
                }
            }
        }
    }
}

function RefreshGridStyles(formGrid)
{
    var gridBody = document.getElementById(formGrid.Id + ".grid.body");
    if (!IsNullOrEmpty(gridBody))
    {
        for (var i = 0; i < formGrid.RowCount; i++)
        {
            for (var j = 0; j < formGrid.ColumnCount; j++)
            {
                var cell = document.getElementById(i + "." + j);
                if (!IsNullOrEmpty(cell))
                {
                    if (i === formGrid.CurrentRow)
                    {
                        cell.className = formGrid.Columns[j].SelectedCssClass;
                    }
                    else
                    {
                        cell.className = formGrid.Columns[j].CssClass;
                    }

                }
            }
        }
    }

}


function CellOnClick(event, strCellId, strFormID, strGridId)
{
    if (!IsNullOrEmpty(event))
    {
        var formGrid = GetFormGrid(strFormID, strGridId);
        if (!IsNullOrEmpty(formGrid))
        {
            var aTokens = strCellId.split(".");
            if (aTokens.length === 2)
            {
                formGrid.CurrentRow = parseInt(aTokens[0], 10);
                formGrid.CurrentColumn = parseInt(aTokens[1], 10);
            }
            RefreshGridStyles(formGrid);

            for (var i = 0; i < m_ControlCellClickListeners.length; i++)
            {
                var cb = m_ControlCellClickListeners[i];
                cb(strFormID, strGridId);
            }
        }
    }
}


function AddGallerySetPiece(strGalleryId, strTitle, strImage, strBodyText)
{
    var galleryPiece = new GalleryPiece(strTitle, strImage, strBodyText);
    if (!IsNullOrEmpty(galleryPiece))
    {
        var gallerySet = GetGallerySet(strGalleryId);
        if (!IsNullOrEmpty(gallerySet))
        {
            gallerySet.GalleryPieces.push(galleryPiece);
        }
    }
}


function DeclareGallerySet(strGalleryId, strTitleId, strImageId, strBodyTextId)
{
    var gallerySet = new GallerySet(strGalleryId, strTitleId, strImageId, strBodyTextId);
    m_GallerySets.push(gallerySet);

}


function GallerySet(strGalleryId, strTitleId, strImageId, strBodyTextId)
{
    this.GalleryId = strGalleryId;
    this.TitleId = strTitleId;
    this.ImageId = strImageId;
    this.BodyTextId = strBodyTextId;
    this.GalleryPieces = new Array();
    this.CurrentIndex = 0;
}

function GalleryPiece(strTitle, strImage, strBodyText)
{
    this.Title = strTitle;
    this.Image = strImage;
    this.BodyText = strBodyText;
}

function GetGallerySet(strGalleryId)
{
    var gallerySet = null;
    for (var i = 0; i < m_GallerySets.length; i++)
    {
        var gallerySetFind = m_GallerySets[i];
        if (!IsNullOrEmpty(gallerySetFind))
        {
            if (gallerySetFind.GalleryId === strGalleryId)
            {
                gallerySet = gallerySetFind;
                break;
            }
        }
    }
    return gallerySet;
}

function LoadGallery(strGalleryId, strCommand)
{
    var gallerySet = GetGallerySet(strGalleryId);
    if (!IsNullOrEmpty(gallerySet))
    {
        if (!IsNullOrEmpty(gallerySet.GalleryPieces) && gallerySet.GalleryPieces.length > 0)
        {
            switch (strCommand)
            {
                case "first":
                    {
                        gallerySet.CurrentIndex = 0;
                    }
                    break;
                case "last":
                    {
                        if (gallerySet.CurrentIndex !== (gallerySet.GalleryPieces.length - 1))
                        {
                            gallerySet.CurrentIndex = gallerySet.GalleryPieces.length - 1;
                        }
                    }
                    break;
                case "next":
                    {
                        if (gallerySet.CurrentIndex < gallerySet.GalleryPieces.length - 1)
                        {
                            ++gallerySet.CurrentIndex;
                        }
                    }
                    break;
                case "previous":
                    {
                        if (gallerySet.CurrentIndex > 0)
                        {
                            --gallerySet.CurrentIndex;
                        }
                    }
                    break;
                default:
                    break;
            }
            var galleryPiece = gallerySet.GalleryPieces[gallerySet.CurrentIndex];

            var oSpanTitle = document.getElementById(gallerySet.TitleId);
            if (!IsNullOrEmpty(oSpanTitle))
            {
                oSpanTitle.innerText = galleryPiece.Title;
            }
            var oSpanImage = document.getElementById(gallerySet.ImageId);
            if (!IsNullOrEmpty(oSpanImage))
            {
                oSpanImage.src = galleryPiece.Image;
            }
            var oSpanBodyText = document.getElementById(gallerySet.BodyTextId);
            if (!IsNullOrEmpty(oSpanBodyText))
            {
                oSpanBodyText.innerText = galleryPiece.BodyText;
            }

            if (gallerySet.CurrentIndex > 0)
            {
                SetHeaderSetItemEnabled("toolbar.gallery", "toolbar.gallery.first", true);
                SetHeaderSetItemEnabled("toolbar.gallery", "toolbar.gallery.previous", true);
            }
            else
            {
                SetHeaderSetItemEnabled("toolbar.gallery", "toolbar.gallery.first", false);
                SetHeaderSetItemEnabled("toolbar.gallery", "toolbar.gallery.previous", false);
            }
            if ((gallerySet.GalleryPieces.length - 1) - gallerySet.CurrentIndex > 0)
            {
                SetHeaderSetItemEnabled("toolbar.gallery", "toolbar.gallery.last", true);
                SetHeaderSetItemEnabled("toolbar.gallery", "toolbar.gallery.next", true);
            }
            else
            {
                SetHeaderSetItemEnabled("toolbar.gallery", "toolbar.gallery.last", false);
                SetHeaderSetItemEnabled("toolbar.gallery", "toolbar.gallery.next", false);
            }



        }
    }
}

function DeclareFormSubmissionAction(strFormID, strSubmissionFormSet, strSubmissionHeaderSet, strSubmissionTabset, strSubmissionTabSetItem)
{
    var formSet = GetFormSet(strFormID);
    if (!IsNullOrEmpty(formSet))
    {
        formSet.SubmissionAction = new SubmissionAction(strSubmissionFormSet, strSubmissionHeaderSet, strSubmissionTabset, strSubmissionTabSetItem);
    }
}

function AddFormSubmissionActionServiceCall(strFormID, strMethod, strParameters, strTarget)
{
    var formSet = GetFormSet(strFormID);
    if (!IsNullOrEmpty(formSet))
    {
        if (!IsNullOrEmpty(formSet.SubmissionAction))
        {
            if (!IsNullOrEmpty(formSet.SubmissionAction.SubmissionFormSet))
            {
                var serviceCallInfo = new ServiceCallInfo(formSet.SubmissionAction.SubmissionFormSet, strMethod, strParameters, strTarget, null);
                formSet.SubmissionAction.ServiceCalls.push(serviceCallInfo);
            }
        }
    }
}


function AddFormSubmissionActionRelocateCall(strFormID, strLocation)
{

    var formSet = GetFormSet(strFormID);
    if (!IsNullOrEmpty(formSet))
    {
        if (!IsNullOrEmpty(formSet.SubmissionAction))
        {
            if (!IsNullOrEmpty(formSet.SubmissionAction.SubmissionFormSet))
            {

                formSet.SubmissionAction.NewLocation = strLocation;
            }
        }
    }

}
function SynchForm(strRequiredFormSet, strHeaderSet, strTabSet, strDefaultTabSetItem)
{
    var strCurrentFormSet = "";
    var formSet = GetActiveFormSet();
    if (!IsNullOrEmpty(formSet))
    {
        strCurrentFormSet = formSet.FormID;
        UpdateFormValues();
    }

    if (strCurrentFormSet !== strRequiredFormSet)
    {
        SetActiveFormSet(strRequiredFormSet);
        formSet = GetActiveFormSet();

    }

    if (!IsNullOrEmpty(formSet))
    {
        if (IsNullOrEmpty(strHeaderSet))
        {
            strHeaderSet = formSet.HeaderSet;
        }
        if (IsNullOrEmpty(strTabSet))
        {
            strTabSet = formSet.TabSet;
        }
        if (IsNullOrEmpty(strDefaultTabSetItem))
        {
            strDefaultTabSetItem = formSet.DefaultTabSetItem;
        }
    }




    var oBenchHeader = $find(m_strDivBenchHeaderID);
    if (!IsNullOrEmpty(oBenchHeader))
    {
        oBenchHeader.BenchHeaderAssertHeaderSet(strHeaderSet);
    }

    var oBenchTabs = $find(m_strDivBenchTabsID);
    if (!IsNullOrEmpty(oBenchTabs))
    {
        oBenchTabs.BenchTabsAssertTabSet(strTabSet);
        oBenchTabs.SetSelectedTabItem(strDefaultTabSetItem);
    }


}



function ProcessServiceQueue()
{
    var nQueueLength = m_ServiceQ.length;
    if (nQueueLength > 0)
    {
        var aParameters = null;
        var strParameter = "";
        var oServiceCallInfo = m_ServiceQ.pop();
        var strCall = oServiceCallInfo.Method + "(";

        if (!IsNullOrEmpty(oServiceCallInfo.Parameters))
        {
            aParameters = oServiceCallInfo.Parameters.split("|");
            if (!IsNullOrEmpty(aParameters) && aParameters.length > 0)
            {
                for (var j = 0; j < aParameters.length; j++)
                {
                    if (aParameters[j] === "stringEmpty")
                    {
                        strParameter = "";
                    }
                    else if (aParameters[j].substring(0, 1) === "$")
                    {
                        var str = aParameters[j].substring(1, aParameters[j].length - 1);
                        var aInfo = str.split("=");
                        if (aInfo.length === 2)
                        {
                            switch (aInfo[0])
                            {
                                case "associated.values":
                                    {
                                        strParameter = GetAssociatedValue(aInfo[1]);

                                    }
                                    break;
                                default:
                                    break;
                            }
                        }
                    }
                    else
                    {
                        strParameter = aParameters[j];
                    }

                    strCall += "'" + strParameter + "'";
                    if (j <= aParameters.length - 2)
                    {
                        strCall += ",";
                    }
                }
            }
        }

        strCall += ");";
        DoServiceCall(strCall, oServiceCallInfo);
    }
}

function PanelInputOnChange(evtObj)
{
    if (!IsNullOrEmpty(evtObj))
    {
        var eSrc = evtObj.srcElement;
        if (!IsNullOrEmpty(eSrc))
        {

            var strText = null;
            var value = eSrc.value;

            switch (eSrc.tagName)
            {
                case "INPUT":
                case "TEXTAREA":
                    {
                        if (eSrc.type === "checkbox")
                        {
                            strText = eSrc.checked;
                        }
                        else
                        {
                            strText = eSrc.value;
                        }

                    }
                    break;
                case "SELECT":
                    {
                        strText = eSrc.innerText;
                        //                        value = element.options.selectedIndex;
                    }
                    break;
                default:

                    break;
            }

            var id = eSrc.id;
            var i = 0;
            var strParameter = null;
            var oServiceCallInfo = null;
            var formSet = GetActiveFormSet();
            if (!IsNullOrEmpty(formSet))
            {
                if (!IsNullOrEmpty(formSet.ValidationInfo))
                {
                    var bValidated = null;
                    var validationInfoItem = null;
                    var elementPanelErrorLabel = null;
                    var strSourceKey = null;
                    var aSourceKeys = null;
                    var strSource = null;
                    var aSource = null;
                    var strValueSource = eSrc.value.toString();

                    for (i = 0; i < formSet.ValidationInfo.length; i++)
                    {
                        validationInfoItem = formSet.ValidationInfo[i];
                        if (!IsNullOrEmpty(validationInfoItem))
                        {
                            if (validationInfoItem.RuleType === "value.comparison")
                            {
                                aSourceKeys = validationInfoItem.SourceKey.split("|");
                                if (aSourceKeys.length === 2)
                                {
                                    strSourceKey = aSourceKeys[1];
                                }
                                aSource = validationInfoItem.Source.split("|");
                                if (aSource.length === 2)
                                {
                                    strSource = aSource[1];
                                }

                                //if this is the first of a pair 
                                if (eSrc.id === aSource[0])
                                {
                                    //clear the panel
                                    elementPanelErrorLabel = document.getElementById(aSourceKeys[0] + ".error.label");
                                    if (!IsNullOrEmpty(elementPanelErrorLabel))
                                    {
                                        ClearFormErrorDiv(elementPanelErrorLabel);
                                    }
                                    //clear any second value
                                    var element2 = document.getElementById(aSource[1]);
                                    if (!IsNullOrEmpty(element2))
                                    {
                                        element2.value = "";
                                    }
                                }
                            }
                            else
                            {
                                strSourceKey = validationInfoItem.SourceKey;
                                strSource = validationInfoItem.Source;
                            }
                            if (!IsNullOrEmpty(strSourceKey) && eSrc.id === strSource)
                            {

                                var formField = GetFieldInfoRef(formSet, strSource);
                                if (!IsNullOrEmpty(formField))
                                {
                                    if (formField.CurrentValue !== strValueSource)
                                    {
                                        ClearArray(formField.ValidationItems);

                                        formField.CurrentValue = strValueSource;

                                    }

                                    elementPanelErrorLabel = document.getElementById(strSourceKey + ".error.label");
                                    if (!IsNullOrEmpty(elementPanelErrorLabel))
                                    {
                                        var validationItem = AssertValidationItem(validationInfoItem.RuleType, formField);
                                        if (!IsNullOrEmpty(validationItem))
                                        {
                                            bValidated = false;
                                            switch (validationInfoItem.RuleType)
                                            {
                                                case "value.comparison":
                                                    {

                                                        var aElements = validationInfoItem.Source.split("|");
                                                        var elementCompare = null;
                                                        if (aElements.length === 2)
                                                        {
                                                            //                                                            if (eSrc.id == aElements[0])
                                                            //                                                            {
                                                            //                                                                elementCompare = document.getElementById(aElements[1]);
                                                            //                                                            }
                                                            //                                                            else 
                                                            if (eSrc.id == aElements[1])
                                                            {
                                                                elementCompare = document.getElementById(aElements[0]);
                                                            }
                                                        }
                                                        if (!IsNullOrEmpty(elementCompare))
                                                        {
                                                            //                                                             if (!IsNullOrEmpty(elementCompare.value) && !IsNullOrEmpty(eSrc.value))
                                                            if (!IsNullOrEmpty(eSrc.value))
                                                            {
                                                                var strValueCompare = elementCompare.value.toString();
                                                                var evalBlock = "{'" + strValueSource + "'" + validationInfoItem.RuleOperator + "'" + strValueCompare + "'};";
                                                                var bResult = eval(evalBlock);
                                                                if (bResult.toString() == validationInfoItem.Requirement)
                                                                {

                                                                    bValidated = true;
                                                                }
                                                                validationItem.Validated = bValidated;
                                                                UpdateFormErrorDiv(elementPanelErrorLabel, validationInfoItem.ErrorMessage, bValidated);
                                                            }
                                                            else
                                                            {
                                                                //one or both is empty - don't validate and remove any current message by calling with true
                                                                UpdateFormErrorDiv(elementPanelErrorLabel, validationInfoItem.ErrorMessage, true);
                                                            }
                                                        }

                                                    }
                                                    break;
                                                case "value.pattern.match":
                                                    {
                                                        var strPattern = validationInfoItem.RuleOperator;
                                                        var strAttributes = validationInfoItem.ExtraInfo;
                                                        if (!IsNullOrEmpty(eSrc.value))
                                                        {
                                                            try
                                                            {
                                                                var regExp = new RegExp(strPattern, strAttributes);
                                                                var match = regExp.exec(strValueSource);
                                                                if (!IsNullOrEmpty(match))
                                                                {
                                                                    bValidated = true;
                                                                }
                                                            }
                                                            catch (e)
                                                            {
                                                            }
                                                            validationItem.Validated = bValidated;
                                                            UpdateFormErrorDiv(elementPanelErrorLabel, validationInfoItem.ErrorMessage, bValidated);
                                                        }
                                                        else
                                                        {
                                                            //value is empty - don't validate and remove any current message by calling with true
                                                            UpdateFormErrorDiv(elementPanelErrorLabel, validationInfoItem.ErrorMessage, true);
                                                        }
                                                    }
                                                    break;
                                                case "service.call":
                                                    {
                                                        if (!LocalValidationErrors(formField))
                                                        {
                                                            strParameter = strValueSource;
                                                            if (!IsNullOrEmpty(strParameter))
                                                            {
                                                                oServiceCallInfo = new ServiceCallInfo(formSet.FormID, validationInfoItem.RuleOperator, strParameter, "validation.results", validationInfoItem);
                                                                m_ServiceQ.push(oServiceCallInfo);
                                                                ProcessServiceQueue();
                                                            }
                                                        }
                                                    }
                                                    break;
                                                default:
                                                    break;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                if (!IsNullOrEmpty(formSet.ValueChangeInfo))
                {
                    if (!IsNullOrEmpty(value))
                    {
                        for (i = 0; i < formSet.ValueChangeInfo.length; i++)
                        {
                            var bLocalProblems = false;
                            var valueChangeInfoItem = formSet.ValueChangeInfo[i];

                            if (!IsNullOrEmpty(valueChangeInfoItem))
                            {
                                if (valueChangeInfoItem.ColumnName == id)
                                {
                                    var element = document.getElementById(valueChangeInfoItem.ColumnName);


                                    ProcessValueChangeInfoItem(formSet, element, valueChangeInfoItem);
                                }
                            }
                        }
                    }
                }
            }
        }
        evtObj.cancelBubble = true;
    }
}


function ProcessValueChangeInfoItem(formSet, eSrc, valueChangeInfoItem)
{

    var strParameter = null;
    var oServiceCallInfo = null;



    switch (valueChangeInfoItem.ValueChangeAction)
    {
        case "service.call":
            {
                strParameter = null;
                if (valueChangeInfoItem.ValueChangeActionParameter == "text")
                {
                    var strText = eSrc.innerText;
                    var nPos = strText.indexOf(",");
                    if (nPos > -1)
                    {
                        var aParameters = strText.split(",");

                        if (aParameters.length > 0)
                        {
                            strParameter = aParameters[0].trim();
                        }
                    }
                }
                else if (valueChangeInfoItem.ValueChangeActionParameter == "value")
                {
                    if (!IsNullOrEmpty(eSrc.value))
                    {
                        strParameter = eSrc.value.trim();
                    }

                    if (IsNullOrEmpty(strParameter))
                    {
                        strParameter = "";
                        if (!IsNullOrEmpty(valueChangeInfoItem.ValueChangeActionDefaultParameter))
                        {
                            strParameter = valueChangeInfoItem.ValueChangeActionDefaultParameter;
                        }
                    }
                }

                if (!IsNullOrEmpty(strParameter))
                {
                    oServiceCallInfo = new ServiceCallInfo(formSet.FormID, valueChangeInfoItem.ValueChangeActionSource, strParameter, valueChangeInfoItem.ValueChangeActionTarget, null);
                    m_ServiceQ.push(oServiceCallInfo);
                    ProcessServiceQueue();
                }
            }
            break;
        default:
            break;
    }


}



function OnValidationServiceCallResult(strFormID, validationInfoItem, result)
{
    var formSet = GetFormSet(strFormID);
    if (!IsNullOrEmpty(formSet))
    {
        var bValidated = false;

        if (result == validationInfoItem.Requirement)
        {
            bValidated = true;
        }

        for (var i = 0; i < formSet.FormFields.length; i++)
        {
            if (formSet.FormFields[i].ColumnName == validationInfoItem.Source)
            {
                for (var j = 0; j < formSet.FormFields[i].ValidationItems.length; j++)
                {
                    if (formSet.FormFields[i].ValidationItems[j].Id == validationInfoItem.RuleType)
                    {
                        formSet.FormFields[i].ValidationItems[j].Validated = bValidated;
                        formSet.FormFields[i].ValidationItems[j].ErrorMessage = validationInfoItem.ErrorMessage;
                        break;
                    }

                }
                break;
            }
        }

        elementPanelErrorLabel = document.getElementById(validationInfoItem.SourceKey + ".error.label");

        if (!IsNullOrEmpty(elementPanelErrorLabel))
        {
            UpdateFormErrorDiv(elementPanelErrorLabel, validationInfoItem.ErrorMessage, bValidated);
        }



    }

}



function UpdateFormErrorDiv(oDiv, strErrorText, bValidated)
{
    if (!IsNullOrEmpty(oDiv))
    {
        var listContainer = oDiv.childNodes[0];
        if (IsNullOrEmpty(listContainer))
        {
            listContainer = document.createElement('ul');
            oDiv.appendChild(listContainer);
        }

        var listItem = null;
        var bFound = false;

        for (var j = 0; j < listContainer.childNodes.length; j++)
        {
            listItem = listContainer.childNodes[j];
            if (!IsNullOrEmpty(listItem))
            {
                if (listItem.innerText == strErrorText)
                {
                    bFound = true;
                    break;
                }
            }
        }

        //        var enumerator = new Enumerator(listContainer.childNodes);
        //        if ( !IsNullOrEmpty(enumerator ))
        //        {
        //            for (; !enumerator.atEnd(); enumerator.moveNext())
        //            {
        //                listItem = enumerator.item();
        //                if ( !IsNullOrEmpty(listItem ))
        //                {
        //                    if (listItem.innerText == strErrorText)
        //                    {
        //                        bFound = true;
        //                        break;
        //                    }
        //                }
        //            }
        //        }


        if (bValidated)
        {
            //remove this error message if it exists

            if (bFound)
            {
                listContainer.removeChild(listItem);
            }

        }
        else
        {
            if (!bFound)
            {
                listItem = document.createElement('li');
                var textNode = document.createTextNode(strErrorText);
                listItem.appendChild(textNode);
                listContainer.appendChild(listItem);
            }


        }

        var strClassName = oDiv.getAttribute("className");


        if (listContainer.childNodes.length > 0)
        {
            if (IsNullOrEmpty(strClassName) || strClassName !== "formErrorText")
            {
                //oDiv.setAttribute("className", "formErrorText");
                oDiv.className = "formErrorText";

            }

        }
        else
        {
            oDiv.className = "";
        }


    }

}

function ClearFormErrorDiv(oDiv)
{
    if (!IsNullOrEmpty(oDiv))
    {
        var listContainer = oDiv.childNodes[0];
        if (!IsNullOrEmpty(listContainer))
        {

            oDiv.removeChild(listContainer);
            oDiv.removeAttribute("className");

        }
    }
}


function GetFieldInfoRef(formSet, strSource)
{
    var formField = null;

    var formFieldTest = null;


    for (var j = 0; j < formSet.FormFields.length; j++)
    {
        formFieldTest = formSet.FormFields[j];
        if (!IsNullOrEmpty(formFieldTest) && formFieldTest.ColumnName == strSource)
        {
            formField = formFieldTest;
            break;
        }
    }



    //    var enumerator = new Enumerator(formSet.FormFields);
    //    for (; !enumerator.atEnd(); enumerator.moveNext())
    //    {
    //        formFieldTest = enumerator.item();
    //        if ( !IsNullOrEmpty(formFieldTest  )&& formFieldTest.ColumnName == strSource)
    //        {
    //            formField = formFieldTest;
    //            break;
    //        }
    //    }



    return formField;

}

function AssertValidationItem(strRuleOperator, formField)
{
    var validationItem = null;
    var validationItemTest = null;

    for (var j = 0; j < formField.ValidationItems.length; j++)
    {
        validationItemTest = formField.ValidationItems[j];
        if (!IsNullOrEmpty(validationItemTest) && validationItemTest.Id == strRuleOperator)
        {
            validationItem = validationItemTest;
            break;
        }
    }

    //    var enumerator = new Enumerator(formField.ValidationItems);
    //    for (; !enumerator.atEnd(); enumerator.moveNext())
    //    {
    //        validationItemTest = enumerator.item();
    //        if ( !IsNullOrEmpty(validationItemTest  )&& validationItemTest.Id == strRuleOperator)
    //        {
    //            validationItem = validationItemTest;
    //            break;
    //        }
    //    }

    if (IsNullOrEmpty(validationItem))
    {
        validationItem = new ValidationItem();
        validationItem.Id = strRuleOperator;
        formField.ValidationItems.push(validationItem);
    }

    return validationItem;

}

function LocalValidationErrors(formField)
{
    var bReturn = false;

    var validationItem = null;

    for (var j = 0; j < formField.ValidationItems.length; j++)
    {
        validationItem = formField.ValidationItems[j];
        if (!IsNullOrEmpty(validationItem) && validationItem.Id !== "service.call")
        {
            if (IsNullOrEmpty(validationItem.Validated) || validationItem.Validated === false)
            {
                bReturn = true;
                break;
            }
        }
    }

    //    var enumerator = new Enumerator(formField.ValidationItems);
    //    for (; !enumerator.atEnd(); enumerator.moveNext())
    //    {
    //        validationItem = enumerator.item();
    //        if ( !IsNullOrEmpty(validationItem  )&& validationItem.Id !== "service.call")
    //        {
    //            if (validationItem.Validated == null || validationItem.Validated == false)
    //            {
    //                bReturn = true;
    //                break;
    //            }
    //        }
    //    }


    return bReturn;

}


function ClearArray(array)
{
    //    var o = typeof (array);

    if (!IsNullOrEmpty(array))
    {
        while (array.length > 0)
        {
            array.pop();
        }

    }
}

function ProcessXHTMLDocumentRequest(evtObj, strPagePath)
{
    if (!IsNullOrEmpty(evtObj))
    {
        var oBenchHeader = $find(m_strDivBenchHeaderID);
        if (!IsNullOrEmpty(oBenchHeader))
        {
            oBenchHeader.BenchHeaderAssertHeaderSet("");
        }

        var oBenchTabs = $find(m_strDivBenchTabsID);
        if (!IsNullOrEmpty(oBenchTabs))
        {
            oBenchTabs.BenchTabsAssertTabSet("");
        }


        //        BenchTabsAssertTabSet("");

        var trigger = document.getElementById(m_strBenchTriggerID);
        var hidden = document.getElementById(m_strBenchHiddenID);

        if (!IsNullOrEmpty(trigger) && !IsNullOrEmpty(hidden))
        {
            hidden.value = "xhtmldoc|" + strPagePath;
            UpdatePanelUpdate("benchUpdatePanel_workBench");
        }
    }
}

function UserLogout()
{

    var trigger = document.getElementById(m_strBenchTriggerID);
    var hidden = document.getElementById(m_strBenchHiddenID);

    if (!IsNullOrEmpty(trigger) && !IsNullOrEmpty(hidden))
    {
        m_strRelocate = "Default.aspx";
        hidden.value = "user.logged.out";
        UpdatePanelUpdate("benchUpdatePanel_workBench");
        //trigger.click();
    }



}

function UpdatePanelUpdate(id)
{
    var trigger = null;
    var controlId = "";

    if (id === "benchUpdatePanel_workBench")
    {
        controlId = m_strBenchTriggerID;


    }
    else if (id === "benchUpdatePanel_modeTray")
    {
        controlId = m_strTrayTriggerID;

    }
    trigger = document.getElementById(controlId);
    if (!IsNullOrEmpty(trigger))
    {
        //        trigger.click();

        try
        {

            if ($get(controlId).dispatchEvent)
            {
                var evt = document.createEvent("MouseEvents");
                evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
                var cb = document.getElementById(controlId);
                var canceled = !cb.dispatchEvent(evt);
            }
            else
            {
                trigger.click();
            }
        }
        catch (e)
        {
        }

    }


    //    if ($get("buttonName").dispatchEvent)
    //    {

    //        var e = document.createEvent("MouseEvents");
    //        e.initEvent("click", true, true);

    //        $get("buttonName").dispatchEvent(e);
    //    }

    //    else
    //    {

    //        $get("buttonName").click();
    //    }



    //    if (id == "rightUpdatePanel")
    //    {
    //        __doPostBack(m_strBenchTriggerID, "");
    //    }
    //    else if (id == "leftUpdatePanel")
    //    {
    //        __doPostBack(m_strTrayTriggerID, "");
    //    }




    //    var temp = "ctl06_" + id;
    //    var updatePanel = document.getElementById(temp);
    //    var pageRequestManager = Sys.WebForms.PageRequestManager.getInstance();
    //    if ( !IsNullOrEmpty(pageRequestManager ))
    //    {
    //        pageRequestManager._doPostBack(temp, "");
    //    }
}

function ProcessXmlListItem(strId, strType, strFormSet, strHeaderSet, strTabSet, strSelectedTabItem)
{

    var bContinue = true;
    var formSet = GetActiveFormSet();
    if (!IsNullOrEmpty(formSet) && formSet.FormID === strFormSet)
    {
        bContinue = false;
    }

    if (bContinue === true)
    {

        ClearDown();
        SetActiveFormSet(strFormSet);

        var oBenchHeader = $find(m_strDivBenchHeaderID);
        if (!IsNullOrEmpty(oBenchHeader))
        {
            oBenchHeader.BenchHeaderAssertHeaderSet(strHeaderSet);
        }
        var oBenchTabs = $find(m_strDivBenchTabsID);
        if (!IsNullOrEmpty(oBenchTabs))
        {
            oBenchTabs.BenchTabsAssertTabSet(strTabSet);
            oBenchTabs.SetSelectedTabItem(strSelectedTabItem);
        }
        var trigger = document.getElementById(m_strBenchTriggerID);
        var hidden = document.getElementById(m_strBenchHiddenID);

        if (!IsNullOrEmpty(trigger) && !IsNullOrEmpty(hidden))
        {
            hidden.value = strId;
            UpdatePanelUpdate("benchUpdatePanel_workBench");
        }
    }

}


function InitializeTrayListItem(trayListID)
{
    ClearDown();

    m_strCurrentTrayListID = trayListID;


    var oTrayList = $find(m_strDivTrayListID);
    if (!IsNullOrEmpty(oTrayList))
    {
        oTrayList.SetSelectedTrayItem(m_strCurrentTrayListID);


        //SetSelectedTrayItem(trayListID);



        var traySetItem = oTrayList.GetTraySetItem(m_strCurrentTrayListID);
        if (!IsNullOrEmpty(traySetItem))
        {
            ResetTrayHeader();
            SetTrayHeader(traySetItem.Name, traySetItem.Text, traySetItem.Image);
            DoDrawTrayHeader();


            //            SetActiveFormSet(traySetItem.FormSet);



            //            

            //            var oBenchHeader = $find(m_strDivBenchHeaderID);
            //            if (!IsNullOrEmpty(oBenchHeader))
            //            {
            //                oBenchHeader.BenchHeaderAssertHeaderSet(traySetItem.Toolbar);
            //            }

            //            var oBenchTabs = $find(m_strDivBenchTabsID);
            //            if (!IsNullOrEmpty(oBenchTabs))
            //            {
            //                oBenchTabs.BenchTabsAssertTabSet(traySetItem.TabSet);
            //                oBenchTabs.SetSelectedTabItem(traySetItem.TabSetItem);
            //            }



        }
    }
}

function ProcessDefaultTrayListItem(trayListID)
{
    var oTrayList = $find(m_strDivTrayListID);
    if (!IsNullOrEmpty(oTrayList))
    {
        var traySetItem = oTrayList.GetTraySetItem(trayListID);
        if (!IsNullOrEmpty(traySetItem))
        {
            ProcessXmlListItem(":=derive|" + traySetItem.FormSet, "formset", traySetItem.FormSet, traySetItem.Toolbar, traySetItem.TabSet, traySetItem.TabSetItem);
        }
    }
}

function OnXmlListItem(xmlListID)
{
    ClearDown();

    switch (xmlListID)
    {

        default:
            {
                SetActiveFormSet("");
            }
            break;
    }

    //var trigger = document.getElementById ( m_strTrayTriggerID );
    //var hidden = document.getElementById(m_strTrayHiddenID);
    var trigger = document.getElementById(m_strBenchTriggerID);
    var hidden = document.getElementById(m_strBenchHiddenID);

    if (!IsNullOrEmpty(trigger) && !IsNullOrEmpty(hidden))
    {
        hidden.value = xmlListID;
        UpdatePanelUpdate("benchUpdatePanel_workBench");
        //trigger.click();
    }
}

function XslListContainerOnClick(evtObj)
{
    if (!IsNullOrEmpty(evtObj))
    {
        var eSrc = evtObj.srcElement;
        if ("listXslParentTopic" == eSrc.className)
        {
            var cKids = eSrc.childNodes;
            XslListRecurseToggleDisplay(cKids);
        }
        evtObj.cancelBubble = true;
    }
}



if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();