//--********************************************************************-->
//--                                                                    -->
//--   Frontier Software Pty Ltd                                        -->
//--                                                                    -->
//--   File Name     : ftroptns.js                                      -->
//--                                                                    -->
//--   History       :                                                  -->
//--   005876 - 02.07.00 - JavaScript Rewrite.                          -->
//--   009317 - 12.08.03 - optnsFindIndex() added to allow default      -->
//--                       table entries.                               -->
//--   009389 - 26.01.04 - bSearch - allows for list table search field -->
//--   009445 - 27.04.04 - Remove extra parameters from functions.      -->
//--                       Also add code for Utility pages.             -->
//--   009585 - 23.06.04 - Table lookups by description                 -->
//--   010415 - 23.02.05 - Load the same table more than once           -->
//--   010408 - 01.03.05 - Add new starters                             -->
//--   008780 - 01.04.05 - Status message now configurable              -->
//--   010408 - 15.03.05 - Format of filters enhanced                   -->
//--   008834 - 07.04.05 - View self checkbox enhanced                  -->
//--   009745 - 07.04.05 - Introduced translation                       -->
//--   010462 - 03.03.05 - Tables load in correct sequence              -->
//--   010537 - 03.08.05 - TR Election                                  -->
//--   010745 - 01.09.05 - Enhance Training Module                      -->
//--   011214 - 03.11.05 - Appraisal Page Corrected                     -->
//--   011389 - 28.03.06 - Correct the Draft TR Election display.       -->
//--   011927 - 29.05.06 - Only call initPage if it exits               -->
//--   013577 - 16.01.07 - Add Country code                             -->
//--   013704 - 23.02.07 - Make TXA code available to SPI               -->
//--   011907 - 17.01.07 - Single Sign-On                               -->
//--   013901 - 10.05.07 - loadPageCurrent function created             -->
//--   013976 - 04.06.07 - Correcting sheet when appendix file removed  -->
//--********************************************************************-->

// *********************************************************************
function optnsDict(sSelectName) {
    // 9445 Allow for search field and a utility page
    var oTemp = new Object();
    if ((oDataPage.oDict) && (oDataPage.oDict[sSelectName])) {
        oTemp = new Object(oDataPage.oDict);
    } else if ((oDataPage.oDictUtl) && (oDataPage.oDictUtl[sSelectName])) {
        oTemp = new Object(oDataPage.oDictUtl);
    } else if ((oDataPage.oSearch) && (oDataPage.oSearch[sSelectName])) {
        oTemp = new Object(oDataPage.oSearch);
    }
    return oTemp;
}

// *********************************************************************
// Returns the value (as a string) of the selectedIndex.
function optnsSet(sSelectName, iSelectCount) {
    var oNewOption = optnsFind(sSelectName, iSelectCount);
    if ((oNewOption) && (oNewOption.tagName.toLowerCase() != "select")) {
        if (oNewOption.text) {
            return oNewOption.text;
        } else {
            return oNewOption.value;
        }
    } else {
        if (bDisabledUpdate) {
            if (oNewOption) {
                return oNewOption[sSelectName].value;
            } else {
                return "";
            }
        } else {
            if ((oNewOption) && (oNewOption.selectedIndex != -1)) {
                return oNewOption.options[oNewOption.selectedIndex].value;
            } else {
                return "";
            }
        }
    }
}

// *********************************************************************
// Function to find out which option element is to be shown after a GTR 
// has been received. Returns -1 if match not found.
function optnsGet(oSelection, sSelectName, sElementName) {
    var sTemp, iSquarePos, iSelectLength;
    // Strip out forward slashes
    var rExp = new RegExp("/","g");
    var sSelectDict = sSelectName.replace(rExp,"");
    // Make sure the field is able to be updated and its a select object
    if ((bDisabledUpdate) || (oDataPage.oDict[sSelectDict] && oDataPage.oDict[sSelectDict]["datatype"] != 9)) {
        var bSelection = oGlob.getGTRType(oSelection,sSelectName + ".trn",false);
        if (bSelection) {
            var sSelection = eval("oSelection['" + sSelectName + ".trn']");
            return sSelection;
        } else {
            return oSelection[sSelectName];
        }
    } else {
        if ((oSelection == "") || (oSelection == null)) return 0;
        // 010745 - In case the form element doesn't have the same name as the data dictionary item
        if (sElementName) sTemp = sElementName;
        else {
            // Code around the fact that an array value in the GTR 
            // could be setup to be a select object
            if ((iSquarePos = sSelectName.toString().indexOf("[")) == -1) sTemp = sSelectDict;
            else sTemp = sSelectDict.substr(0, iSquarePos) + sSelectDict.substr(iSquarePos+1, 1);
        }
        // Check the data dictionary object exists in the configuration
        if (oDataPage.oForm[sTemp]) {
            iSelectLength = oDataPage.oForm[sTemp].options.length;
            // Scan through looking for a match, set iIndex and return value
            for (var iIndex=0; iIndex<iSelectLength; iIndex++) {
                if ((oDataPage.oForm[sTemp].options[iIndex].value == oSelection[sSelectName]) || (oDataPage.oForm[sTemp].options[iIndex].value == oSelection)) {
                    oDataPage.oForm[sTemp].options[iIndex].selectedIndex = iIndex;
                    return oDataPage.oForm[sTemp].options[iIndex].value;
                }
            }
        }
    }
    return "";
}

// *********************************************************************
function optnsGetShortNm(iIndex, sSelectType) {
    if ((iIndex == -1) || (iIndex == null)) {
        return "";
    }
    if (aOptions[sSelectType] != null) {
        return aOptions[sSelectType][iIndex]["description"];
    } else {
        return "";
    }
}

// *********************************************************************
// ZBG 9000: If no value present on the page then return empty string
function optnsSetDescription(sSelectName) {
    if (oDataPage.oForm[sSelectName] != null) {
        var iIndex = oDataPage.oForm[sSelectName].selectedIndex;
        if ((iIndex == 0) || (isNaN(iIndex))) {
            return "";
        } else {
            return oDataPage.oForm[sSelectName].options[iIndex].text;
        }
    } else {
        return "";
    }
}

// *********************************************************************
function optnsGetDescription(iIndex, sSelectType) {
    if ((iIndex == -1) || (iIndex == null)) {
        return "";
    }
    if (aOptions[sSelectType] != null) {
        return aOptions[sSelectType][iIndex]["translation"];
    } else {
        return "";
    }
}

// *********************************************************************
// Introduced for 2.06.00
function optnsFind(sSelectName, iSelectCount) {
    for (var i=0; i<oDataPage.oForm.length; i++) {
        var sName = oDataPage.oForm[i].name;
        if (sName == sSelectName + iSelectCount) return oDataPage.oForm[i];
        else if (sName == sSelectName) return oDataPage.oForm[i];
    }
    return;
}

// *********************************************************************
function optnsPick(sSelectName) {
    var aOptions = new Array();
    for (var i=0; i<oDataPage.oForm.length; i++) {
        var sName = oDataPage.oForm[i].name;
        if (sName.indexOf(sSelectName) != -1) aOptions[aOptions.length] = oDataPage.oForm[i];
    }
    return aOptions;
}

// ********************************************************************
// 009445 Remove unnecessary parameter from functions.
// 008834 Only load tables when the select object actually exists
function optnsLoad(sOptionName, sSelectName, iSelectNumber) {
    var iPoint = 0, iSelectLimit = isNaN(iSelectNumber) ? 1 : iSelectNumber;
    var aNewOptions = optnsPick(sSelectName);
    for (var iSelectCount=1;iSelectCount<=iSelectLimit;iSelectCount++) {
        // Ensure correct loading for certain objects
        if (aNewOptions.length) {
            var oNewOption = aNewOptions[iSelectCount-1];
            switch (oNewOption.tagName.toLowerCase()) {
                case "select":
                    // Set first choice to be sNotSelected but not on balances page
                    if (sSelectName != "laclvetype") {
                        iPoint = 1;
                        // Set up the Not Selected string setting
                        var oOption = oDataPage.document.createElement("OPTION");
                        oOption.text = (sNotSelected) ? sNotSelected : "";
                        oOption.value = "";
                        //add option to select box in other frame
                        if (oNewOption.options) oNewOption.options[0] = oOption;
                    }
                    for (var iIndex=0; iIndex<aOptions[sOptionName].length; iIndex++) {
                        // The following if gets around a bug in IE that does not allow 
                        // option lists to be populated from data in another frame.
                        var oOption = oDataPage.document.createElement("OPTION");
                        oOption.text = aOptions[sOptionName][iIndex]["description"];
                        oOption.value = aOptions[sOptionName][iIndex]["code"];
                        //add option to select box in other frame
                        if (oNewOption.options) oNewOption.options[iIndex+iPoint] = oOption;
                    }
                    // 010462 - Set a loaded attribute for the Select element
                    oNewOption.loaded = true;
                    break;
                case "input":
                    var iTemp = iSelectCount - 1;
                    if (iTemp < aOptions[sOptionName].length) {
                        oNewOption.value = aOptions[sOptionName][iTemp]["description"];
                        oNewOption.text = aOptions[sOptionName][iTemp]["code"];
                    }
                    break;
            }
            if ((oNewOption.tagName.toLowerCase() == "select") && (isNaN(iSelectNumber)) && (!bDisabledUpdate)) oNewOption.disabled = false;
        }
    }
    return true;
}

// *********************************************************************
// Function to send all GTR for a form related to drop-down select boxes
// 009585 - Add usekey keyward so that tables are ordered by description.
// 009745 - ZOV setting bTableSort controls if table sorted by description or code.
// 013557 - Country Code added.                                                    
function optnsCreate(sOptionName, sOptionType) {
    var gtrHolder = new Object();
    // Save a bit of string checking
    setGTRField(gtrHolder,"cbr",sOptionType + "lst");
    switch (sOptionType) {
        case "ktf":
            setGTRField(gtrHolder,"field01","ktfcode");
            setGTRField(gtrHolder,"field02","ktfdescr");
            break;
        case "loc":
            setGTRField(gtrHolder,"field01","loccode");
            setGTRField(gtrHolder,"field02","locdescr");
            setGTRField(gtrHolder,"countrycode",sEmpCountry);
            break;
        case "pta":
            setGTRField(gtrHolder,"field01","ptacode");
            setGTRField(gtrHolder,"field02","ptadescr");
            setGTRField(gtrHolder,"countrycode",sEmpCountry);
            break;
        case "ptf":
            setGTRField(gtrHolder,"field01","ptfcode");
            setGTRField(gtrHolder,"field02","ptfdescr");
            break;
        case "pts":
            setGTRField(gtrHolder,"field01","ptscode");
            setGTRField(gtrHolder,"field02","ptsdescr");
            setGTRField(gtrHolder,"countrycode",sEmpCountry);
            break;
        case "tab":
            setGTRField(gtrHolder,"cbr","tablelist");
            setGTRField(gtrHolder,"tablename",sOptionName);
            setGTRField(gtrHolder,"countrycode",sEmpCountry);
            if (bTableSort) setGTRField(gtrHolder,"usekey","2");
            break;
        case "tpc":
            setGTRField(gtrHolder,"field01","tpcconfcd");
            setGTRField(gtrHolder,"field02","tpcdescript");
            setGTRField(gtrHolder,"countrycode",sEmpCountry);
            break;
    }
    setGTRField(gtrHolder,"currentonly");
    sendGTR(gtrHolder,0);
    return false;
}

// *********************************************************************
// 009445 Remove unnecessary parameter from functions.
function optnsSend(sOptionName, sSelectName, iSelectNumber, sOptionType) {
    // Set up the temporary varaibles for later processing
    var sTemp = sSelectName;
    var bTemp = (sSelectName == "laclvetype") ? true : false;
    if (isNaN(iSelectNumber)) bTemp = false;
    else bTemp = true;
    // Work out which field to check in the configuration if number entered
    if ((!bTemp) && (!isNaN(iSelectNumber))) sTemp = sSelectName + iSelectNumber;
    var oTemp = new Object(optnsDict(sTemp));
    // Ensure the table is only built if specified in configuration file
    if (aDictDetail[sTemp] || oTemp[sTemp] || oDataPage.document.getElementById(sTemp)) {
        // ZBG 8933: Reworked logic to avoid creating the table contents
        if ((bDisabledUpdate) && (!bTemp)) {
            return true;
        } else if ((oTemp[sTemp] && oTemp[sTemp]["datatype"] == 10) && (!bTemp)) {
            return true;
        } else {
            if (aOptions[sOptionName] == null) {
                // 010408 - We've already sent the GTR for this table on this page
                if (oDataPage[sOptionName]) {
                    return true;
                } else {
                    // This table hasn't been requested for this page before
                    return optnsCreate(sOptionName,sOptionType);
                }
            } else {
                return optnsLoad(sOptionName,sSelectName,iSelectNumber);
            }
        }
    } else {
        return true;
    }
}

// *********************************************************************
// 009745 - Creates the description string to be loaded into the select 
// object according to the ZOV setting bTableStyle
function optnsLoadDescription(oSelection,sCode,sDesc) {
    var sDescription = "";
    switch (bTableStyle) {
        case "B":
            // Both: description (code)
            sDescription = getGTRField(oSelection,sDesc) + " (" + getGTRField(oSelection,sCode) + ")";
            break;
        case "C":
            // Code only
            sDescription = getGTRField(oSelection,sCode);
            break;
        case "J":
            // Joined: code - description
            sDescription = getGTRField(oSelection,sCode) + " - " + getGTRField(oSelection,sDesc);
            break;
        default:
            // Description only
            sDescription = getGTRField(oSelection,sDesc);
            break;
    }
    return sDescription;
}

// *********************************************************************
// 011214 - Appraisal Page Corrected 
function optnsCallInitPage() {
    var sTempPage = oGlob.loadPageCurrent();
    switch (sTempPage) {
        case "erkp1det":
        case "mrkp1det":
            if (optnsCheckTableLoaded()) oDataPage.sendGTR("kp1enq");
            break;
        case "erkp3det":
        case "mrkp3det":
            if (optnsCheckTableLoaded()) oDataPage.sendGTR("kp3enq");
            break;
        default:
            if (oDataPage.initPage && optnsCheckTableLoaded()) oDataPage.initPage();
            break;
    }
    return;
}

// *********************************************************************
// 011389 - Find a match for the dataval based on the GTR type 
// The last 3 char of the dataval need to match the first 3 char from the GTR
function optnsFindTableMatch(sGtrType) {
    var aReturnMatches = new Array ();
    var oDataPageDict = oDataPage.oDictUtl ? oDataPage.oDictUtl : oDataPage.oDict;
    var oTemp;
    var aCombinedDict = new Array();
    aCombinedDict = aCombinedDict.concat(oDataPageDict,oDataPage.oSearch);
    for (var i in aCombinedDict) {
        var aTempDict = aCombinedDict[i];
        for (var sDict in aTempDict) {
            oTemp = aTempDict[sDict];
            if (oTemp.datatype == 9) {
                var sTemp = oTemp.dataval;
                sTemp = sTemp.substr(2,3);
                sTemp = sTemp.toUpperCase();
                if (sGtrType.toUpperCase() == sTemp) return oTemp.dataval;
            }
        }
    }
    return;
}

// *********************************************************************
// 009445 Remove unnecessary parameter from functions.
function optnsInterpret(oSelection, sOptionName, sSelectName, iSelectNumber) {
    if (!sOptionName) {
        sOptionName = getGTRField(oSelection,"tablename");
        // No match for the tablename, must be building from a list
        if (sOptionName == "") {
            sOptionName = optnsFindTableMatch(getGTRField(oSelection,"cbr").substr(0,3));
        }
    }
    if (!sSelectName) sSelectName = optnsFindSelectName(sOptionName);
    if (!iSelectNumber) iSelectNumber = optnsGetSelectNumber(sSelectName);
    // Work out which field to check in the configuration if number entered
    var sTemp = sSelectName;
    var bTemp = (sSelectName == "laclvetype" || sSelectName == "kp1label") ? true : false;
    if (isNaN(iSelectNumber)) bTemp = false;
    else bTemp = true;
    // Work out which field to check in the configuration if number entered
    if ((!bTemp) && (!isNaN(iSelectNumber))) sTemp = sSelectName + iSelectNumber;
    var oTemp = new Object(optnsDict(sTemp));
    // Ensure the table is only built if specified in activation key file and
    // not currently running in manager mode viewing somebodys leave balances
    if (aDictDetail[sTemp] || oTemp[sTemp]) {
        var gtrType = getGTRField(oSelection,"cbr").substr(0,3);
        var sListDesc = null;
        // Interpreting the returned values 
        switch (oSelection["i_listposition"]) {
            case "i_start":
                iDrop = 0;
                oOptionIndex = new Array();
                break;
            case "i_end":
                // 11907 - moved from optnsSend()
				oDataPage[sOptionName] = true;
                if (iDrop > 0) {
                    optnsLoadMultipleTables(sOptionName, sSelectName, iSelectNumber);
                }
                optnsCallInitPage();
                break;
            default:
                switch (gtrType) {
                    case "ktf":
                        sListDesc = getGTRField(oSelection,"ktfdescr");
                        break;
                    case "loc":
                        sListDesc = getGTRField(oSelection,"locdescr");
                        break;
                    case "pta":
                        sListDesc = getGTRField(oSelection,"ptadescr");
                        break;
                    case "ptf":
                        sListDesc = getGTRField(oSelection,"ptfdescr");
                        break;
                    case "pts":
                        sListDesc = getGTRField(oSelection,"ptsdescr");
                        break;
                    case "tab":
                        sListDesc = getGTRField(oSelection,"description");
                        break;
                    case "tpc":
                        sListDesc = getGTRField(oSelection,"tpcdescript");
                        break;
                }
                if (sListDesc != null) {
                    var oOptionType = new CreateOptions();
                    switch (gtrType) {
                        case "ktf":
                            oOptionType["code"] = getGTRField(oSelection,"ktfnovcde");
                            oOptionType["description"] = optnsLoadDescription(oSelection,"ktfnovcde","ktfdescr");
                            break;
                        case "loc":
                            oOptionType["code"] = getGTRField(oSelection,"loccode");
                            oOptionType["description"] = optnsLoadDescription(oSelection,"loccode","locdescr");
                            break;
                        case "pta":
                            oOptionType["code"] = getGTRField(oSelection,"ptacode");
                            oOptionType["description"] = optnsLoadDescription(oSelection,"ptacode","ptadescr");
                            break;
                        case "ptf":
                            oOptionType["code"] = getGTRField(oSelection,"ptfcode");
                            oOptionType["description"] = optnsLoadDescription(oSelection,"ptfcode","ptfdescr");
                            break;
                        case "pts":
                            oOptionType["code"] = getGTRField(oSelection,"ptscode");
                            oOptionType["description"] = optnsLoadDescription(oSelection,"ptscode","ptsdescr");
                            break;
                        case "tab":
                            oOptionType["code"] = getGTRField(oSelection,"code");
                            oOptionType["description"] = optnsLoadDescription(oSelection,"code","description");
                            break;
                        case "tpc":
                            oOptionType["code"] = getGTRField(oSelection,"tpcconfcd");
                            oOptionType["description"] = optnsLoadDescription(oSelection,"tpcconfcd","tpcdescript");
                            break;
                    }
                    // 10415 - only add code if it doesn't exist 
                    if (!optnsCodeExists(oOptionIndex, oOptionType["code"])) {
                        oOptionIndex[iDrop] = oOptionType;
                        aOptions[sOptionName] = oOptionIndex;
                        iDrop++;
                    }
                }
                break;
        }
        return false;
    } else {
        return false;
    }
}

// *********************************************************************
// 10415 - returns true if code has already been loaded into the object
function optnsCodeExists(oOptionIndex, sCode) {
    for (var i = 0; i < oOptionIndex.length; i++) {
        if (oOptionIndex[i]["code"] == sCode) return true;
    }
    return false;
}

// *********************************************************************
// 9317 Finds and returns a listbox item
function optnsFindIndex(iIndexVal, sItem, sElementNm) {
    for (var x = 0; x < iIndexVal; x++) {
        if (eval("oDataPage.oForm." + sElementNm + ".options[x].value == sItem")) return x;
    }
    return;
}

// *********************************************************************
// 010462 - Send GTRs for all tables on a page
// aCombinedDict is an Array of the 2 data dictionary arrays - oDict and oSearch.
// We cycle through aCombinedDict and check for any entries with datatype of 9.
// If any are found and there is a Table name associated with it (dataval) then we
// send the GTR for the table via optnsSend.
function optnsLoadTable() {
    if (sDataPage.indexOf("ellacdet") != -1) {
        optnsSend("KKLAC","laclvetype",oDataPage.oDict["laclvetype"]["label"],"tab")
    }
    if (!optnsCheckTableLoaded()) {
        var oDataPageDict = oDataPage.oDictUtl ? oDataPage.oDictUtl : oDataPage.oDict;
        var oTemp;
        var aCombinedDict = new Array();
        aCombinedDict = aCombinedDict.concat(oDataPageDict,oDataPage.oSearch);
        for (var i in aCombinedDict) {
            var aTempDict = aCombinedDict[i];
            for (var sDict in aTempDict) {
                oTemp = aTempDict[sDict];
                if (oTemp.datatype == "9" && oTemp.dataval) {
                    var iSelectNumber = optnsGetSelectNumber(sDict);
                    var sTemp = oTemp.dataval.substr(2,3).toLowerCase();
                    switch (sTemp) {
                        case "ktf":
                        case "loc":
                        case "pta":
                        case "ptf":
                        case "pts":
                        case "tpc":
                            break;
                        default:
                            sTemp = "tab";
                            break;
                    }
                    optnsSend(oTemp.dataval,sDict,iSelectNumber,sTemp);
                }
            }
        }
        // Return control to oDataPage once all the tables are completely loaded
        if ((optnsCheckTableLoaded()) && (oDataPage.initPage)) oDataPage.initPage();
    }
    else if (oDataPage.initPage) oDataPage.initPage();
    return;
}

// *********************************************************************
// 010462 - Call optnsLoad() for each separate table on the page
function optnsLoadMultipleTables(sOptionName, sSelectName, iSelectNumber) {
    var oDataPageDict = oDataPage.oDictUtl ? oDataPage.oDictUtl : oDataPage.oDict;
    var oTemp;
    var aCombinedDict = new Array();
    aCombinedDict = aCombinedDict.concat(oDataPageDict,oDataPage.oSearch);
    for (var i in aCombinedDict) {
        var aTempDict = aCombinedDict[i];
        for (var sDict in aTempDict) {
            oTemp = aTempDict[sDict];
            if (oTemp.dataval == sOptionName) {
                optnsLoad(sOptionName, sDict, iSelectNumber);
            }
        }
    }
    return;
}

// *********************************************************************
// 010462 - Check to see if all the drop-downs have been loaded on a page
function optnsCheckTableLoaded() {
    var sName = "";
    var bDataDict = false;
    var aSelectElements = oDataPage.document.getElementsByTagName("select"); 
    for (var iSelect = 0; iSelect < aSelectElements.length; iSelect++) {
        sName = aSelectElements[iSelect].name;
        bDataDict = optnsCheckDictExists(sName);
        if ((!aSelectElements[iSelect].loaded) && (bDataDict)) return false;
    }
    return true;
}

// *********************************************************************
// 010462 - Work out how many instances of a table on a page
function optnsGetSelectNumber(sSelectName) {
    var iCount = 0;
    var aSelectElements = oDataPage.document.getElementsByTagName("select"); 
    for (var i = 0; i < aSelectElements.length; i++) {
        var sName = aSelectElements[i].name;
        if (sName.indexOf(sSelectName) != -1) iCount++;
    }
    if (sSelectName == "laclvetype") iCount = oDataPage.oDict["laclvetype"]["label"];
    return iCount;
}

// *********************************************************************
// 010462 - Find the data dictionary name for a table than has been returned.
// eg, we pass in CNTRY as the table name, and try to match it with a SELECT
// html element on the page.
function optnsFindSelectName(sTable) {
    var oDataPageDict = oDataPage.oDictUtl ? oDataPage.oDictUtl : oDataPage.oDict;
    var oTemp;
    var aCombinedDict = new Array();
    aCombinedDict = aCombinedDict.concat(oDataPageDict,oDataPage.oSearch);
    for (var i in aCombinedDict) {
        var aTempDict = aCombinedDict[i];
        for (var sDict in aTempDict) {
            oTemp = aTempDict[sDict];
            if (oTemp.dataval == sTable) return sDict;
        }
    }
    return false;
}

// *********************************************************************
// 010462 - Check to see if a select element is associated with a data dictionary entry
// on a page.
function optnsCheckDictExists(sName) {
    var oDataPageDict = oDataPage.oDictUtl ? oDataPage.oDictUtl : oDataPage.oDict;
    aCombinedDict = new Array();
    aCombinedDict = aCombinedDict.concat(oDataPageDict,oDataPage.oSearch);
    for (var i in aCombinedDict) {
        var aTempDict = aCombinedDict[i];
        for (var sDict in aTempDict) {
            if ((aTempDict[sDict].datatype == "9") && (sName.indexOf(sDict) != -1)) return true;
        }
    }
    return false;
}

// *********************************************************************
// 010537 - Allows a drop down table to be constructed from a source
// other than a table list. Accepts the in the element name, text 
// and code value for each option to create the list. Also stores
// these values in aOptions for future use.
function optnsAddOption(sSelectName, sText, sValue) {
    var oTemp = oDataPage.document.getElementById(sSelectName);
    if (oTemp) {
        // Create the initial entry
        if (oTemp.options.length == 0) {
            var oOption = oDataPage.document.createElement("option");
            oOption.text = sNotSelected;
            oOption.value = "";
            oOption.selected = true;
            oTemp.options[oTemp.options.length] = oOption;
        } 
        // Create subsequent entries & store the values for future use
        var oOption = oDataPage.document.createElement("option");
        var oOptionType = new Array();
        oOptionType["description"] = oOption.text = sText;
        oOptionType["code"] = oOption.value = sValue;
        oOptionIndex[iDrop++] = oOptionType;
        oTemp.options[oTemp.options.length] = oOption;
    }
    return;
}

// *********************************************************************