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 valKeysFracNumsOnly ( event ) {
    var keyCode = extractKeyCode ( event );
    
    // alert ( keyCode );
    if ( ( keyCode >= 48 ) && ( keyCode <= 57 ) ) {
        return true;
    } else if ( ( keyCode >= 96 ) && ( keyCode <= 105 ) ) {
        return true;
    } else if ( ( keyCode == 46 ) || ( keyCode == 190 ) || ( keyCode == 110 ) ) {
        return true;
    } else {
        return isSysKeyCode ( keyCode );
    }
    return true
}

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 valFieldFracNumsOnly ( fieldId, msgId ) {
    var isValid = !isNaN ( 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 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 ) {
    disabledCtlIds[disabledCtlIds.length]=ctlId;
    document.getElementById ( ctlId ).disabled=true;
}

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


// 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 */
        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 + "_";
        
        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, "" );
    
    document.getElementById ( theDivId ).style.display="none";
    document.getElementById ( hideBtnId ).style.display="none";
    document.getElementById ( showBtnId ).style.display="inline";
    
}

