if(!String.prototype.trim){ String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ""); }; }

/////////////////////////////////////////////////////////////////////////
// function to return the customized screen when session expiration
// is detected on the client-side
/////////////////////////////////////////////////////////////////////////
function SessionExpired_CustomizedScreenGet()
{
  return '<br><h3>Session Expired/Timeout</h3><br>Due to user inactivity, your session expired. Click the following link to start a new session.<br><br><table id="IHoptions"><tr><td><a href="[SESSION_RESTART_URL]" class="option"><img src="/public/images/sq-positive.gif" ></a><a href="[SESSION_RESTART_URL]">Start a new session</a></td></tr></table>';
}

var globalRestartOnSubmit = false;

function sessionTimedOut()
{
    // restart session automatically upon "submit" for edge-like clients if logon form is compatibile
    if (("undefined" != typeof(window.external)) && (undefined != window.external.WebLogonResetSession) && (null != globalInputs)) {
       globalRestartOnSubmit = true;
    }
    else {
       // display session expired msg for non-compatible forms or
       // non-edge clients
       showSplashLayer("MessageDIV", SessionExpired_CustomizedScreenGet());
    }
}

/**
 * Place the focus and init the form fields
 */

if(self != top) { top.location = self.location; }
window.onerror=function(){ return function(){ return; } }

//--------------------------------------------------------------------
var doNotAutoSubmit = false;

var globalFormId = 'formAuthenticate';
var globalTableId = 'credentials_table';
var globalSubmitTrId = 'submit_row';

var globalSavePasswordCheckbox = null;
var globalInputs = null;

var softTokenInput = null;
var softTokenFieldId = "";
var softTokenState = "";
var softTokenNewPIN = "";
if( !softTokenState ) {
    softTokenState = "SECURID_AUTH_STATE_START";}

function getSoftTokenInput()
{
    var form = document.getElementById( globalFormId );
    if( form == null ){
        return null;
    }

    var inputs = form.getElementsByTagName("input");
    for( var i=0; i<inputs.length; i++ ){
        if(  inputs[i].name == softTokenFieldId ){
            return inputs[i];
        }
    }

    return null;
}

function edgeClientSoftTokenSupport()
{
    try {
        if( window.external ) {
            if( undefined != window.external.WebLogonSoftTokenSupport ) {
                return true;
            } else {
                return false;
            }
        }
    } catch(e) {}
    return false;
}

function getSoftTokenPrompt()
{
    if ( softTokenFieldId != "" && edgeClientSoftTokenSupport()) {
        var div = document.getElementById("formHeaderSoftToken");
        if (div)  {
            return div.innerHTML;
        }
    }
    return  null;
}

function OnSubmitEdgeRSASoftToken()
{
    var support = edgeClientSoftTokenSupport();
    if( true != support ) {
        return;
    }

    var challengeMode = null;
    var form = document.getElementById( globalFormId );
    if( form == null ){
        return;
    }
    var inputs = form.getElementsByTagName("input");
    if( inputs.length >= 2 && inputs[0].name == "_F5_challenge" && inputs[0].type == "password" ){
         //ignore 'set password' input tag, its not valid in RSA Soft token auth
         challengeMode = inputs[0];
    }
    
    var hiddenInput = document.createElement("input");
    hiddenInput.setAttribute("type", "hidden");
        hiddenInput.setAttribute("name", "softTokenError");
    //append to form element that you want .
    form.appendChild(hiddenInput);

    try{
        window.external.WebLogonSoftTokenState  = softTokenState;

        if(softTokenInput != null) { //normal mode
            window.external.WebLogonSoftTokenPIN  = softTokenInput.value;
            var passcode = window.external.WebLogonSoftTokenPasscode;
            if( passcode ) {
                softTokenInput.value = passcode;
            }
        } else if( challengeMode ) { //challenge mode
            window.external.WebLogonSoftTokenPIN  = inputs[0].value;
            var passcode = window.external.WebLogonSoftTokenPasscode;
            if( passcode ) {
                inputs[0].value = passcode;
            }
        }
        hiddenInput.value = window.external.WebLogonSoftTokenError;
    } catch(e) { }

    return;
}



// compatibily function, works only with input[0] text username and input[1] text password
function getFormCompatibility()
{
    var form = document.getElementById( globalFormId );
    if( form == null ){
        return null;
    }

    // check if form suites
    var inputs = [];
    var inputsTemp = form.getElementsByTagName("input");
    // filter submit, reset, hidden and little green men
    for( var i=0; i<inputsTemp.length; i++ ){
        if( inputsTemp[i].type == "text" || inputsTemp[i].type == "password" ||  inputsTemp[i].type == "checkbox" ){
            inputs[ inputs.length ] = inputsTemp[i]
        }
    }
    // is it compatible
    if( inputs.length != 2 || inputs[0].type != "text" || inputs[0].name != "username" || inputs[1].type != "password" || inputs[1].name != "password" ){
        return null;
    }

    return inputs;
}

function OnLoad()
{
    var header = document.getElementById("credentials_table_header");
    var softTokenHeaderStr = getSoftTokenPrompt();
    if ( softTokenFieldId != "" && softTokenHeaderStr && edgeClientSoftTokenSupport()) {
        header.innerHTML = softTokenHeaderStr;
    }

    // check if form suites
    var form = document.getElementById( globalFormId );
    if( form == null ){
        return;
    }

    // check if form suites
    var inputs = form.getElementsByTagName("input");
    // filter submit, reset, hidden and little green men
    for( var i=0; i<inputs.length; i++ ){
        if( ( inputs[i].type == "text" || inputs[i].type == "password" ) && inputs[i].value == "" ){
            inputs[i].focus();
            if (inputs[i].type == "password") {
                window.setTimeout( function(elem){ return function(){ elem.blur(); elem.focus(); } }(inputs[i]) , 266 );
            }
            return;
		}
    }
}

// support for autologon from Client API
function checkExternalAddCheckbox()
{
    var checkbox_txt = 'Save Password';

    if( globalInputs == null ){
        try {
            if (("undefined" != typeof(window.external)) && ("unknown" != typeof(window.external))
                && ("undefined" != typeof(window.external.WebLogonNotifyUser)) && ("unknown" != typeof(window.external.WebLogonNotifyUser))){
                window.external.WebLogonNotifyUser();
            }
        } catch(e){};
        return;
    }

    // find form
    var form = document.getElementById( globalFormId );
    if( form == null ){
        return;
    }

    // find table
    var table = document.getElementById( globalTableId );
    if( table == null ){
        return;
    }

    // find tr
    var submitTr = document.getElementById( globalSubmitTrId );
    if( submitTr == null ){
        return;
    }

    try {
		if(window.external){
            // push values
			if( window.external.WebLogonUserName && globalInputs[0].value == ""){
				globalInputs[0].value = window.external.WebLogonUserName;
            }

            // push data to cells
			if(window.external.WebLogonSavePasswordAvailable){
                // right - text

                // create cells
                var newTr = table.insertRow( submitTr.rowIndex );
                var leftTd = newTr.insertCell( 0 );
                var rightTd = newTr.insertCell( 1 );

                leftTd.className = "credentials_table_label_cell";
                rightTd.className = "credentials_table_field_cell credentials_table_field_checkbox_fix";

                rightTd.innerHTML = checkbox_txt;
                // left - checkbox
                globalSavePasswordCheckbox = document.createElement("input");
                globalSavePasswordCheckbox.type = "checkbox";
                globalSavePasswordCheckbox.className = "credentials_input_checkbox";
                globalSavePasswordCheckbox.value = 1;
                globalSavePasswordCheckbox = leftTd.appendChild( globalSavePasswordCheckbox );
                globalSavePasswordCheckbox.checked = window.external.WebLogonSavePasswordChecked;
                if( globalSavePasswordCheckbox.autocomplete ) {
                    globalSavePasswordCheckbox.autocomplete = "off";
                }
            }

            // autosubmit check
            if(window.external.WebLogonAutoLogon && !doNotAutoSubmit){
                doAutoSubmit = true;
                form.onsubmit();
                form.submit();
                return;
            }
        }
    } catch (e) { }
}

function disableSubmit(form)
{
    // disable!
    var inputs = form.getElementsByTagName( "input" );
    for( var i=0; i<inputs.length; i++ ){
        if( inputs[i].type == "submit" || inputs[i].type == "reset" ){
            inputs[i].disabled = true;
        }
    }

    return true;
}

function OnSubmit()
{
    // find form
    var form = document.getElementById( globalFormId );
    if( form == null ){
        return;
    }

    try{
      if( window.external ){
          if( globalInputs != null ){
              if( undefined != window.external.WebLogonUserName ){
                  window.external.WebLogonUserName = globalInputs[0].value;
              }

              if( undefined != window.external.WebLogonPassword ){
                  window.external.WebLogonPassword = globalInputs[1].value;
              }

              if( undefined != window.external.WebLogonSavePasswordChecked && null != globalSavePasswordCheckbox ){
                  window.external.WebLogonSavePasswordChecked = globalSavePasswordCheckbox.checked;
              }
          }

          if (softTokenFieldId != "") {
              OnSubmitEdgeRSASoftToken();
          }
      }
    } catch(e) { }

    return;
}

function verifyNewPassword()
{
    var form = document.getElementById( globalFormId );
    if( form == null ){
        return true;
    }

    var inputs = form.getElementsByTagName("input");
    if( inputs.length >= 2 && inputs[0].name == "_F5_challenge" && inputs[0].type == "password" && inputs[1].name == "_F5_verify_password" && inputs[1].type == "password" ){
        if( inputs[0].value != inputs[1].value ){
            alert("Password and confirmation do not match.");
            inputs[0].focus();
            return false;
        } else {
            // Not sending the second field.
            inputs[1].disabled = true;

            try{
                if( window.external ){
                    if( undefined != window.external.WebLogonPassword ){
                        window.external.WebLogonPassword = inputs[0].value;
                    }
                }
            } catch(e) { }
        }
    }
    return true;
}

function masterSubmit(form)
{
    if( !verifyNewPassword() /* || ... */){
        return false;
    }

    OnSubmit(); // this required by edge

    if (globalRestartOnSubmit) {
        try {
            window.external.WebLogonAutoLogon = (("" != globalInputs[0].value) && ("" != globalInputs[1].value));
        }
        catch (e) {}
        // restart session
        window.external.WebLogonResetSession();
        return false;
    }

    disableSubmit(form);
    return true;
}