// Function to submit the page
function submitForm (  ) {
    document.forms[0].submit();
    return true;
}

function disableControls ( ) {
    var formElems = document.getElementsByTagName("input");
    for ( var i = 0; i < formElems.length; i++ ) {
        formElems[i].disabled=true;
    }
    formElems = document.getElementsByTagName("button");
    for ( var i = 0; i < formElems.length; i++ ) {
        formElems[i].disabled=true;
    }
    formElems = document.getElementsByTagName("select");
    for ( var i = 0; i < formElems.length; i++ ) {
        formElems[i].disabled=true;
    }
}

function enableControls ( ) {
    var formElems = document.getElementsByTagName("input");
    for ( var i = 0; i < formElems.length; i++ ) {
        formElems[i].disabled=false;
    }
    formElems = document.getElementsByTagName("button");
    for ( var i = 0; i < formElems.length; i++ ) {
        formElems[i].disabled=false;
    }
    formElems = document.getElementsByTagName("select");
    for ( var i = 0; i < formElems.length; i++ ) {
        formElems[i].disabled=false;
    }
}

function extractKeyCode ( event ) {
    var theEvent = event;
    var keyCode = 0;
    
    if ( !theEvent ) {
        theEvent = window.event;
    }
    if ( theEvent.keyCode ) {
        keyCode = theEvent.keyCode;
    } else if ( theEvent.which ) {
        keyCode = theEvent.which;
    }
    
    return keyCode;

}

function isSysKeyCode ( keyCode ) {
    switch ( keyCode ) {
        case 8:  // Delete/Backspace
        case 13: // Return/Enter
        case 46: // Forward Delete
        case 9:  // Tab
        case 37: // Left Arrow
        case 38: // Up Arrow
        case 39: // Right Arrow
        case 40: // Down Arrow
        case 36: // Home
        case 35: // End
        case 33: // Page Up
        case 34: // Page Down
        case 16: // Shift
        case 17: // Control
        case 192: // Option/Alt
        case 20: // Caps
        case 27: // Escape
        case 45: // Insert
        case 44: // Print Screen
        case 145: // Scroll Lock
        case 19: // Pause
        case 144: // Num Lock
        
        // F1 -> F12
        case 112:
        case 113:
        case 114:
        case 115:
        case 116:
        case 117:
        case 118:
        case 119:
        case 120:
        case 121:
        case 122:
        case 123:
        
        // Macintosh Specific Keys
        case 18: // Option key
        case 224: // Command Key
        case 12:    // Clear Key
        case 6: // Help
        
        // Windows Specific Keys
        case 92: // Window
        case 93: // Menu

        
        
            return true;
            break;
        default:
            return false;
            break;

    }
    
    return false;
    
}

function valKeysNumsOnly ( event ) {
    var keyCode = extractKeyCode ( event );
    
    // alert ( keyCode );
    if ( ( keyCode >= 48 ) && ( keyCode <= 57 ) ) {
        return true;
    } else if ( ( keyCode >= 96 ) && ( keyCode <= 105 ) ) {
        return true;
    } else {
        return isSysKeyCode ( keyCode );
    }
}

function valFieldNumsOnly ( fieldId, msgId ) {
    var isValid = false;
    var re = /\d/
    if ( document.getElementById ( fieldId ).value== "" ) {
        isValid = true;
    } else {
        isValid = re.test ( document.getElementById ( fieldId ).value );
    }
    if ( isValid ) {
        document.getElementById ( msgId ).style.display="none";
        updateCtlStates ( );
    } else {
        disableControls ( );
        document.getElementById ( fieldId ).disabled=false;
        document.getElementById ( msgId ).style.display="block";
        document.getElementById ( fieldId ).focus ( );
        
    }
    return isValid;
}

function valFieldNumRange ( fieldId, msgId, min, max ) {
    var isValid = valFieldNumsOnly ( fieldId, msgId );
    
    if ( isValid ) {
        if ( document.getElementById ( fieldId ).value != "" ) {
            if ( document.getElementById ( fieldId ).value >= min ) {
                if ( max == null ) {
                    isValid = true;
                } else if ( document.getElementById ( fieldId ).value <= max ) {
                    isValid = true;
                } else {
                    isValid = false;
                }
            } else {
                isValid = false;
            }
        } else {
            isValid = false;
        }
        if ( isValid ) {
            document.getElementById ( msgId ).style.display="none";
            updateCtlStates ( );
        } else {
            disableControls ( );
            document.getElementById ( fieldId ).disabled=false;
            document.getElementById ( msgId ).style.display="block";
            document.getElementById ( fieldId ).focus ( );
            
        }
    }

    return isValid;
}


function getCookie ( name ) {
    var prefix = name + "=";
    var cookieStartIndex = document.cookie.indexOf ( prefix );
    
    if ( cookieStartIndex == -1 ) {
        return null;
    }
    
    var cookieEndIndex = document.cookie.indexOf ( ";", cookieStartIndex + prefix.length );
    
    if ( cookieEndIndex == -1 ) {
        cookieEndIndex = document.cookie.length;
    }
    
    return unescape ( document.cookie.substring ( cookieStartIndex + prefix.length, cookieEndIndex ) );
    
}


function updateCtlStates ( ) {
    enableControls ( );
    for ( var i = 0; i < disabledCtlIds.length; i++ ) {
        document.getElementById ( disabledCtlIds[i] ).disabled=true;
    }
}

function setCtlStateDisabled ( ctlId ) {
    dbgMsg ( ctlId );
    disabledCtlIds[disabledCtlIds.length]=ctlId;
    if ( document.getElementById ( ctlId ) != null ) {
        document.getElementById ( ctlId ).disabled=true;
    } else {
        dbgMsg ( "setCtlStateDisabled: Null Control" );
    }
}

function setCtlStateEnabled ( ctlId ) {
    var found = false;
    var tmpArray = new Array ( );
    var i = 0;
    dbgMsg ( ctlId );
    for ( var i = 0; i < disabledCtlIds.length; i++ ) {
        if ( disabledCtlIds[i] != ctlId ) {
            tmpArray[tmpArray.length] = disabledCtlIds[i];
        }
    }
    disabledCtlIds = tmpArray;
    if ( document.getElementById ( ctlId ) != null ) {
        document.getElementById ( ctlId ).disabled=false;
    } else {
        dbgMsg ( "setCtlStateEnabled: Null Control" );
    }
}


// Make/Model Select Control Functions
function getSelectedOptionData ( selectElement ) {
    var selectedOptionData = "";
    if ( selectElement != null ) {
        selectedOptionData = selectElement.value;
        if ( selectedOptionData == "" ) {
            selectedOptionData = selectElement[selectElement.selectedIndex].firstChild.data;
        }
    }
    return selectedOptionData;
    
}

function getCurrentModelListSelectElementId ( makeSelectId, modelSelectPrefix, noMakeModelListId ) {
    var mcMake = document.getElementById ( makeSelectId );
    var selectedMake = getSelectedOptionData ( mcMake );
    var selectElemId = null;
    if ( selectedMake == "" ) {
        selectedMake = initiallySelectedMake;
        if ( ( selectedMake == "" ) && ( noMakeModelListId == "" ) ) {
            selectedMake = makeArray[0];
        } else {
            selectedMake = noMakeModelListId;
        }
    }
    var MsgStr = "";
        
    var requiredSelectElemId = modelSelectPrefix + selectedMake;
    for ( var i = 0; i < modelIdArray.length; i++ ) {
        MsgStr =  MsgStr + modelIdArray[i] + ", " + modelArray[i] + ", " + makeArray[i] + ", " + requiredSelectElemId + ".\n";
    
        if ( makeArray[i] == requiredSelectElemId  ) {
            selectElemId = modelIdArray[i];
            break;
        }
    }
    return selectElemId;
    
}

function updateModelList ( makeSelectId, modelSelectPrefix, noMakeModelListId ) {
    var mcMake = document.getElementById ( makeSelectId );
    var selectedMake = getSelectedOptionData ( mcMake );
    if ( selectedMake == "" ) {
        selectedMake = initiallySelectedMake;
        if ( selectedMake == "" ) {
            selectedMake = makeArray[0];
        }
    }
    
    
    for ( var i = 0; i < modelIdArray.length; i++ ) {
        var modelSelectId = modelIdArray[i];
        var requiredSelectElemId = modelSelectPrefix + selectedMake;
        if (  makeArray[i] == requiredSelectElemId ) {
            document.getElementById ( modelSelectId ).style.display="inline";
        } else {
            document.getElementById ( modelSelectId ).style.display="none";
        }
    }
    
    if ( getSelectedOptionData ( mcMake ) == "** Please Select a Make **" ) {
        document.getElementById ( noMakeModelListId ).style.display="inline";
    } else if ( ( selectedMake == "" ) && ( noMakeModelListId != "" ) ) {
        document.getElementById ( noMakeModelListId ).style.display="inline";
        setCtlStateDisabled ( noMakeModelListId );
    } else if ( noMakeModelListId != '' ) {
        document.getElementById ( noMakeModelListId ).style.display="none";
    }
    
    
}

function validateModelList ( makeSelectId, modelDataId, modelSelectPrefix, errMsgId, noMakeModelListId ) {
    var modelSelect = document.getElementById ( getCurrentModelListSelectElementId ( makeSelectId, modelSelectPrefix, noMakeModelListId )  );
    var modelSelectData = getSelectedOptionData ( modelSelect );
    if ( modelSelectData != "** Please Select a Model **" ) {
        document.getElementById ( errMsgId ).style.display="none";
        updateCtlStates ( );
    } else {
        disableControls ( );
        modelSelect.disabled=false;
        document.getElementById ( errMsgId ).style.display="inline";
        modelSelect.focus ( );
    }      
    document.getElementById ( modelDataId ).value = getSelectedOptionData ( modelSelect );
}

function validateMakeList ( makeSelectId, errMsgId ) {
    var makeSelect = document.getElementById ( makeSelectId );
    var makeSelectData = getSelectedOptionData ( makeSelect );
    if ( makeSelectData != "** Please Select a Make **" ) {
        document.getElementById ( errMsgId ).style.display="none";
        updateCtlStates ( );
    } else {
        disableControls ( );
        makeSelect.disabled=false;
        document.getElementById ( errMsgId ).style.display="inline";
        makeSelect.focus ( );
    }           
}


// Track the expanded state of collapasble div elements
function restoreExpandedDivState (  )   {
    var theDivIds = document.getElementById ( 'expandedDivs' ).value.split ( "_" );
    var theHideBtnIds = document.getElementById ( 'hideBtns' ).value.split ( "_" );
    var theShowBtnIds = document.getElementById ( 'showBtns' ).value.split ( "_" );
    
    
    for ( var i = 0; i < theDivIds.length - 1; i++ )   {
        /* Expanded div */
        if ( document.getElementById ( theDivIds[i] ) != null ) {
            document.getElementById ( theDivIds[i] ).style.display="block";
            document.getElementById ( theHideBtnIds[i] ).style.display="inline";
            document.getElementById ( theShowBtnIds[i] ).style.display="none";
        }
        
     }
}

function isDivExpanded ( theDivId )   {
    if ( document.getElementById ( 'expandedDivs' ).value.indexOf ( theDivId ) >= 0 ) {
        return true;
    } else  {
        return false;
    }
}

function expandDiv ( theDivId, hideBtnId, showBtnId )    {
    if ( !isDivExpanded ( theDivId ) )    {
        document.getElementById ( 'expandedDivs' ).value = document.getElementById ( 'expandedDivs' ).value + theDivId + "_";
        document.getElementById ( 'hideBtns' ).value = document.getElementById ( 'hideBtns' ).value + hideBtnId + "_";
        document.getElementById ( 'showBtns' ).value = document.getElementById ( 'showBtns' ).value + showBtnId + "_";
        
        if ( document.getElementById ( theDivId ) != null ) {
            document.getElementById ( theDivId ).style.display="block";
            document.getElementById ( hideBtnId ).style.display="inline";
            document.getElementById ( showBtnId ).style.display="none";
        }
        
    }
}

function collapseDiv ( theDivId, hideBtnId, showBtnId )   {
    var reStr = "(" + theDivId + ")_?";
    var re = new RegExp ( reStr, "gi" );
    document.getElementById ( 'expandedDivs' ).value = document.getElementById ( 'expandedDivs' ).value.replace ( re, "" );
    
    var reStr = "(" + hideBtnId + ")_?";
    var re = new RegExp ( reStr, "gi" );
    document.getElementById ( 'hideBtns' ).value = document.getElementById ( 'hideBtns' ).value.replace ( re, "" );
    
    var reStr = "(" + showBtnId + ")_?";
    var re = new RegExp ( reStr, "gi" );
    document.getElementById ( 'showBtns' ).value = document.getElementById ( 'showBtns' ).value.replace ( re, "" );
    
    if ( document.getElementById ( theDivId ) != null ) {
        document.getElementById ( theDivId ).style.display="none";
        document.getElementById ( hideBtnId ).style.display="none";
        document.getElementById ( showBtnId ).style.display="inline";
    }
    
}

// Control state maintenance
function initCtlStates ( ) {
    updateCtlStates ( );
}

// Function to change the option values in a select element
function updateSelect ( destElem, selectName, optionData, optionValues, selectedOption, selectId ) {
    
    // Remove any old nodes from the destination element
    while ( document.getElementById ( destElem ).hasChildNodes ( ) ) {
        document.getElementById ( destElem ).removeChild ( document.getElementById ( destElem ).firstChild );
    }
    
    // Create new select element
    var selectElem = document.createElement ( 'select' );
    selectElem.setAttribute ( 'name', selectName );
    if ( selectId != null ) {
        selectElem.setAttribute ( 'id', selectId );
    }
    
    // Create the option elements
    for ( var i = 0; i < optionData.length; i++ ) {
        var optionElem = document.createElement ( 'option' );
        var textNode = document.createTextNode ( optionData[i] );
        optionElem.setAttribute ( 'value', optionValues[i] );
        if ( i == selectedOption ) {
            optionElem.setAttribute ( 'selected', 'selected' );
        }
        optionElem.appendChild ( textNode );
        selectElem.appendChild ( optionElem );
    }
    
    // Remove undefined element that is created with the select
    selectElem.removeChild ( selectElem.firstChild );
    
    // Add the new select element to the document
    document.getElementById ( destElem ).appendChild ( selectElem );
    
    return;
}

// Global variables
var makeArray = new Array ( );
var modelArray = new Array ( );
var modelIdArray = new Array ( );
var disabledCtlIds = new Array ( );
var enableDebugMsgs = false;

// Client side debugging message
function dbgMsg ( msg ) {
    var supportedBrowser = false;
    
    if ( isAppleWebKit ( ) ) {
        var wkVers = get_webkit_version ( );
        if ( wkVers['major'] > 528 ) {
            supportedBrowser = true;
        } else if ( ( wkVers['major'] == 528 ) && ( wkVers['minor'] >= 1 ) ) {
            supportedBrowser = true;
        }
    }
    
    if ( ( enableDebugMsgs ) && ( supportedBrowser ) ) {
        console.info ( new String ( msg ) );
    }
}

// Functions used to determine version of Apple WebKit, taken from Safari Developer FAQ
function parse_webkit_version ( version ) {
    var bits = version.split ( "." );
    var is_nightly = ( version[version.length - 1] == "+" );
    if ( is_nightly ) {
        var minor = "+";
    } else {
        var minor = parseInt(bits[1]);
        // If minor is Not a Number (NaN) return an empty string
        if ( isNaN ( minor ) ) {
            minor = "";
        }
    }
    return { major: parseInt ( bits[0] ), minor: minor, is_nightly: is_nightly };
}

// Functions used to determine version of Apple WebKit, taken from Safari Developer FAQ
function get_webkit_version ( ) {
    var regex = new RegExp ( "\\(.*\\) AppleWebKit/(.*) \\((.*)" );
    var matches = regex.exec ( navigator.userAgent );
    if ( matches ) {
        var webkit_version = parse_webkit_version ( matches[1] );    
    } 
    return { major: webkit_version['major'], minor: webkit_version['minor'], is_nightly: webkit_version['is_nightly'] };
}  

// Functions used to determine Apple WebKit is in use, adapted from Safari Developer FAQ
function isAppleWebKit ( ) {
    
    // String found if this is a AppleWebKit based product
    var kitName = "applewebkit/";
    var tempStr = navigator.userAgent.toLowerCase();
    var pos = tempStr.indexOf ( kitName );
    var isAppleWebkit = ( pos != -1 );
    
    return isAppleWebkit;
}

