//!-----------------------------------------------------------------------
//! Copyright (C) EDS All rights reserved.
//!-----------------------------------------------------------------------
//! CommonFunctions.js
//! INBO.Flora script

/// <reference name="MicrosoftAjax.js"/>
/// <reference name="EDSSystemLibAjax.js"/>


/* 
--- Double Submit BugFix ---
When you click the Delete icon in a grid, the page is submitted twice, which causes 2 rows to be deleted.
This is fixed by running a function 'EDSSL_DoubleSubmitBugFix_SubmitFnc' when the form is submitted: the second submit is then prevented.
This function replaces the onsubmit function of the 'theForm' variable which is a standard variable of ASP.NET.
If an onsubmit function was present, this is stored in 'EDSSL_DoubleSubmitBugFix_OriginalOnSubmitFnc' and rerun on the first submit only.
*/

var EDSSL_DoubleSubmitBugFix_IsBeingSubmitted = false;
var EDSSL_DoubleSubmitBugFix_OriginalOnSubmitFnc = null;

/*
Function called on each submit of the page
Only allows the first submit
*/
function EDSSL_DoubleSubmitBugFix_SubmitFnc() {
    if (EDSSL_DoubleSubmitBugFix_IsBeingSubmitted) {
        window.status = "Your request is being processed, please wait...";
        return false;
    }
    else {
        if (EDSSL_DoubleSubmitBugFix_OriginalOnSubmitFnc == null) {
            if (EDSSL_FindEventInfo() != null) {
                EDSSL_DoubleSubmitBugFix_IsBeingSubmitted = true;
                setTimeout(EDSSL_DoubleSubmitBugFix_Unlock, 2000);
            }
            return true;
        }
        else {
            /* Original Onsubmit Logic can still prevent the submit */
            if (EDSSL_DoubleSubmitBugFix_OriginalOnSubmitFnc() == false) {
                return false;
            }
            else {
                if (EDSSL_FindEventInfo() != null) {
                    EDSSL_DoubleSubmitBugFix_IsBeingSubmitted = true;
                    setTimeout(EDSSL_DoubleSubmitBugFix_Unlock, 2000);
                }
                return true;
            }
        }
    }
}

function EDSSL_DoubleSubmitBugFix_Unlock() {
    window.status = "...";
    EDSSL_DoubleSubmitBugFix_IsBeingSubmitted = false;
}

/*
Attach function to submit event of the form
*/
/* done by the scriptmanager now....
function EDSSL_DoubleSubmitBugFix_ApplyFix()
{     
try
{ 
var lForm = document.forms['aspnetForm'];
if (!lForm) lForm = document.aspnetForm;
     
if(lForm != undefined)
{
if(lForm.onsubmit != null)
{
EDSSL_DoubleSubmitBugFix_OriginalOnSubmitFnc = lForm.onsubmit;
}
lForm.onsubmit = EDSSL_DoubleSubmitBugFix_SubmitFnc;        
}
}
catch(e)
{
}
}
*/


/*                
Code for setting MaxLength on textbox  -------------------------------------------------------------------------------
*/
function EDSSL_TextAreaMaxLength(pUniqueID, pLength) {
    var lField = document.getElementById(pUniqueID);
    if (lField != undefined && !lField.disabled && !lField.readOnly) {
        lField.EDSSL_MaxLength = pLength;
        EDSSL_AddEvent(lField, 'onkeyup', EDSSL_TextAreaMaxLength_onKeyUp);
        EDSSL_AddEvent(lField, 'onkeydown', EDSSL_TextAreaMaxLength_onKeyDown);
        EDSSL_AddEvent(lField, 'onblur', EDSSL_TextAreaMaxLength_onBlur);
    }
}

function EDSSL_TextAreaMaxLength_onKeyDown() {
    var lEvent = EDSSL_FindEventInfo();
    var lKeyCode = lEvent.keyCode;
    // Allow BackSpace, Tab, Delete, Home, End and Arrow keys
    if (lKeyCode == 8 || lKeyCode == 9 || lKeyCode == 46 || (lEvent.keyCode >= 35 && lEvent.keyCode <= 40)) return;
    var lField = lEvent.srcElement;
    var lMaxLength = lField.EDSSL_MaxLength;
    if (lField.value.length >= lMaxLength) {
        return false;
    }
}

function EDSSL_TextAreaMaxLength_onKeyUp() {
    var lEvent = EDSSL_FindEventInfo();
    var lKeyCode = lEvent.keyCode;
    // Allow BackSpace, Tab, Delete, Home, End and Arrow keys
    if (lKeyCode == 8 || lKeyCode == 9 || lKeyCode == 46 || (lEvent.keyCode >= 35 && lEvent.keyCode <= 40)) return;
    var lField = lEvent.srcElement;
    var lMaxLength = lField.EDSSL_MaxLength;
    if (lField.value.length >= lMaxLength) {
        lField.value = lField.value.substr(0, lMaxLength);
    }
}

function EDSSL_TextAreaMaxLength_onBlur() {
    var lEvent = EDSSL_FindEventInfo();
    var lField = lEvent.srcElement;
    var lMaxLength = lField.EDSSL_MaxLength;
    if (lField.value.length >= lMaxLength) {
        lField.value = lField.value.substr(0, lMaxLength);
    }
}

/* Function to add event */
/* TODO: change to
case EDSSL_Browsers_IE:
if(pEvent.substr(0,2) != "on") pEvent = "on" + pEvent;                 
pElement.attachEvent(pEvent, pFunction);
break;
case EDSSL_Browsers_Netscape:
if(pEvent.substr(0,2) == "on") pEvent = pEvent.substr(2);                 
pElement.addEventListener(pEvent, pFunction, false);
break; 
default:
alert('EDSSL_GetBrowserType: Cannot resolve Brower Type ""' + lType + '""');
break;

*/
function EDSSL_AddEvent(pElement, pEvent, pFunction) {
    var lEvent = pEvent;
    switch (EDSSL_GetBrowserType()) {
        case EDSSL_Browsers_IE:
            pElement.attachEvent(lEvent, pFunction);
            break;
        case EDSSL_Browsers_Netscape:
            if (lEvent == "onload") lEvent = "DOMContentLoaded";
            pElement.addEventListener(lEvent, pFunction, false);
            break;
    }
}

/*
Stops an Event from bubbling up to the containing elements
*/
function EDSSL_CancelBubble(pEventInfo) {
    switch (EDSSL_GetBrowserType()) {
        case EDSSL_Browsers_IE:
            pEventInfo.cancelBubble = true;
            break;
        case EDSSL_Browsers_Netscape:
            pEventInfo.stopPropagation();
            break;
    }
}
/*
Code for ShortCutKeyControl  -------------------------------------------------------------------------------
*/
/* Array for storing ShortCut Keys */
var EDSSL_ShortCutKeys = new Array();

/* Check Browser Type */
var EDSSL_Browsers_IE = 'Microsoft Internet Explorer';
var EDSSL_Browsers_Netscape = 'Netscape';
function EDSSL_GetBrowserType() {
    var lType = navigator.appName;
    switch (lType) {
        case EDSSL_Browsers_IE:
            return EDSSL_Browsers_IE;
        case EDSSL_Browsers_Netscape:
            return EDSSL_Browsers_Netscape;
        default:
            alert('EDSSL_GetBrowserType: Cannot resolve Brower Type ""' + lType + '""');
            return '';
    }
}

function EDSSL_IsDisabled(pControl) {
    switch (EDSSL_GetBrowserType()) {
        case EDSSL_Browsers_IE:
            return pControl.disabled;
        case EDSSL_Browsers_Netscape:
            return (pControl.attributes['disabled'] != undefined) && (pControl.attributes['disabled'].value == 'disabled');
    }
}

/* Function to find the Event information cross browser */
function EDSSL_FindEventInfo(pEvent) {
    if (typeof (pEvent) != 'undefined') return pEvent;
    else if (typeof (event) != 'undefined') return event;
    else return null; //alert('Could not find Event info');
}

function EDSSL_ChangeCheckedStatesMultiSelect(pGridClientID, pHeaderCheckBoxClientID, pGridCheckBoxID) {

    var lGrid = document.getElementById(pGridClientID);
    if (!lGrid) {
        throw EDSSL.Exceptions.parameterInvalidException('GridClientID', pGridClientID, 'HTML Element does not exist.');
    }

    var lHeaderCheckBox = document.getElementById(pHeaderCheckBoxClientID);
    if (!lHeaderCheckBox) {
        throw EDSSL.Exceptions.parameterInvalidException('HeaderCheckBoxClientID', pHeaderCheckBoxClientID, 'HTML Element does not exist.');
    }

    var lAllElements = lGrid.getElementsByTagName('*');

    for (var i = 0; i < lAllElements.length; i++) {
        if (lAllElements[i].type == "checkbox" && lAllElements[i].id.indexOf(pGridCheckBoxID) > 0) {
            lAllElements[i].checked = lHeaderCheckBox.checked;
        }
    }
}

/*
Code for stopping event bubbling for Textareas -------------------------------------------------------------------------------
*/
function EDSSL_DisableEventBubblingForTextAreas() {
    var i = 0, lLength, lSubject;
    lSubject = document;
    lAllTags = lSubject.getElementsByTagName("body")[0].getElementsByTagName("*");
    lLength = lAllTags.length;
    for (i = 0; i < lLength; i++) {
        if (lAllTags[i].tagName == "TEXTAREA") {
            EDSSL_DisableEventBubblingForTextArea(lAllTags[i]);
        }
    }

}
EDSSL_AddEvent(window, 'onload', EDSSL_DisableEventBubblingForTextAreas);

function EDSSL_DisableEventBubblingForTextArea(pTextArea) {
    EDSSL_AddEvent(pTextArea, "onkeypress", EDSSL_DisableEventBubbling);
    EDSSL_AddEvent(pTextArea, "onkeydown", EDSSL_DisableEventBubbling);
}

function EDSSL_DisableEventBubbling(pEvent) {
    var lEventInfo = EDSSL_FindEventInfo(pEvent);
    EDSSL_CancelBubble(lEventInfo);
}

/*
Code for ShortCutKeyControl  -------------------------------------------------------------------------------
*/
/* Array for storing ShortCut Keys */
var EDSSL_ShortCutKeys = new Array();
/* Function for registering a new ShortCut Key */
function EDSSL_RegisterShortCutKey(pObjectID, pKey, pAlt, pControl, pShift, pDescription) {
    //debugger;                  
    EDSSL_ShortCutKeys[EDSSL_ShortCutKeys.length] = new Array(pObjectID, pKey, pAlt, pControl, pShift, pDescription);
}

function EDSSL_AddShortCutToolTips() {
    var lControl, i;
    /* alert('EDSSL_AddShortCutToolTips'); */
    for (i = 0; i < EDSSL_ShortCutKeys.length; i++) {
        lControl = document.getElementById(EDSSL_ShortCutKeys[i][0]);
        if (lControl != undefined) {
            lControl.title += ' ' + EDSSL_ShortCutKeys[i][5];
        }
    }
}


/* Set varible to true, to show keycode for each keystroke */
var EDSSL_ShowKeyCodes = false;

/* Function which listens for keystrokes */
function EDSSL_ListenForShortCutKeys(pEvent) {
    var i, lEvent;
    lEvent = EDSSL_FindEventInfo(pEvent);
    //debugger;
    if (EDSSL_ShowKeyCodes) window.status = 'Keycode: ' + lEvent.keyCode;
    for (i = 0; i < EDSSL_ShortCutKeys.length; i++) {
        if (lEvent.keyCode == EDSSL_ShortCutKeys[i][1]) {
            if (lEvent.altKey == EDSSL_ShortCutKeys[i][2] && lEvent.ctrlKey == EDSSL_ShortCutKeys[i][3] && lEvent.shiftKey == EDSSL_ShortCutKeys[i][4]) {
                //debugger;
                if (document.getElementById(EDSSL_ShortCutKeys[i][0]) != null) {
                    var lControl = document.getElementById(EDSSL_ShortCutKeys[i][0]);
                    if (lControl != undefined) {
                        var lToolTip = lControl.title;
                        if (EDSSL_IsDisabled(lControl)) {
                            alert(lToolTip);
                        }
                        else {
                            window.status = 'Performing shortcut key action ""' + lToolTip + '""...';
                            if (EDSSL_GetBrowserType() == EDSSL_Browsers_Netscape && lControl.tagName == 'A') {
                                document.location.href = lControl.href;
                            }
                            else {
                                lControl.click();
                            }
                        }
                    }
                }
                else if (typeof (eval(EDSSL_ShortCutKeys[i][0])) == 'function') {
                    /* Execute function */
                    eval(EDSSL_ShortCutKeys[i][0] + '()');
                }
                return false;
            }
        }
    }
}


if (EDSSL_GetBrowserType() == EDSSL_Browsers_IE) {
    EDSSL_AddEvent(window, 'onload', EDSSL_AddShortCutToolTips);
    EDSSL_AddEvent(document, 'onkeydown', EDSSL_ListenForShortCutKeys);
}


///////////////////////////////////////////////////////////////////////////////
// Call notifyScriptLoaded at the end of the script file
//
if (typeof (Sys) !== 'undefined')
    Sys.Application.notifyScriptLoaded();

