/* ---------------------------------------------------------------------------------------------------
   ePages 5 - Scripts
   presentation_intelligentforms.js $Revision: 1.10 $
   ---------------------------------------------------------------------------------------------------
   Required JavaScript Packages:
   epages_scripts.js
   --------------------------------------------------------------------------------------------------- */

//globals
var PageChanged=0;                                  // 0= nothing changed; 1= input, select or textarea value changed
var aryDialogSaveButtons=new Array();
var DialogFormChanged=new Array;                    // array item 0= nothing changed ; 1= input, select or textarea value changed
var aryDialogRunButtons=new Array();
var DialogRunButtonActive=new Array;                // array item 0= run button not active; 1= run button inactive
var aryDialogExtraButtons=new Array();
var DialogExtraButtonActive=new Array;              // array item 0= extra button not active; 1= extra button inactive

function getFormIndex(oNode) {
    var FormIndex = null;
    try {
        FormIndex=oNode.getAttribute("formindex");
    } catch(ex) {
        FormIndex=-1;
    }
    return FormIndex;
}

function disableHideElementClass() {
    if(browser.isIE) {
        var oStyleSheet=document.styleSheets[0];
        oStyleSheet.addRule("div.HideElement","display: block !important;");
    } else {
        var oTempStyle=document.createElement("style");
        oTempStyle.id="TempStyle";
        var oCSS = document.createTextNode("div.HideElement { display: block !important;}");
        oTempStyle.appendChild(oCSS);
        document.getElementsByTagName("body")[0].appendChild(oTempStyle);
    }
}

function enableHideElementClass() {
    if(browser.isIE) {
        var oStyleSheet=document.styleSheets[0];
        oStyleSheet.removeRule(oStyleSheet.rules.length-1);
    } else {
        var oTempStyle=document.getElementById("TempStyle");
        document.getElementsByTagName("body")[0].removeChild(oTempStyle);
    }
}

function redrawButton(oButton) {
    var ButtonWidth=oButton.clientWidth;
    var RedrawButton=null;
    try {
      RedrawButton=oButton.getAttribute("redrawbutton");
    } catch (ex) {
      RedrawButton=0;
    }
    if(RedrawButton==null) {
        if(ButtonWidth<100 && ButtonWidth>0) oButton.style.width="100px";
        if(ButtonWidth>=100 && ButtonWidth<130) {
            oButton.className=oButton.className.replace(/Button/g,"ButtonMedium");
        }
        if(ButtonWidth>=130 && ButtonWidth<150) {
            oButton.className=oButton.className.replace(/Button/g,"ButtonWide");
        }
        if(ButtonWidth>=150) {
            oButton.className=oButton.className.replace(/Button/g,"ButtonXWide");
        }

        // mark redrawed button
        var atrRedrawButton=document.createAttribute("redrawbutton");
        atrRedrawButton.nodeValue=1;
        oButton.setAttributeNode(atrRedrawButton);
    }
}

function initializeFormsAndButtons() {
    disableHideElementClass();    // disable hide class for calculating button sizes (the width property is available in visible buttons only)

    var oAllForms=document.getElementsByTagName("form");

    for(i=0; i<oAllForms.length; i++) {
        DialogFormChanged.push(0);                      // form x not changed
        DialogRunButtonActive.push(0);                  // form x not changed
        DialogExtraButtonActive.push(0);                  // form x not changed

        // create attribute formindex containing the form index number
        var attrFormIndex=document.createAttribute("formindex");
        attrFormIndex.nodeValue=i;
        oAllForms[i].setAttributeNode(attrFormIndex);

        if(!oAllForms[i].className.match(/SearchForm/)) {    // ignore search forms
            var oFormInputFields=oAllForms[i].getElementsByTagName("input");
            var oFormTextareas=oAllForms[i].getElementsByTagName("textarea");
            var oFormSelectsFields=oAllForms[i].getElementsByTagName("select");
            var FormSaveButton=0;     // 0=no save button found   1=save button found
            var FormRunButton=0;      // 0=no run button found    1=run button found
            var FormExtraButton=0;    // 0=no run button found    1=run button found

            for(ii=0; ii< oFormInputFields.length; ii++) {
                var InputType;            // input type
                try{
                    InputType=oFormInputFields[ii].getAttribute("type").toLowerCase();
                } catch(ex) {
                    InputType="text";
                }

                // register save button
                if((oFormInputFields[ii].name.toLowerCase()=="save" ||
                    oFormInputFields[ii].className.match(/SaveButton/)||
                    oFormInputFields[ii].className.match(/ImportButton/)) &&
                   FormSaveButton==0) {
                    FormSaveButton=1;

                    if(oFormInputFields[ii].disabled){
                        //  remember default disabled button
                        var DefaultDisabled=document.createAttribute("defaultdisabled");        // 1= disabled by default ; 0= not disabled by default
                        DefaultDisabled.nodeValue=1;
                        oFormInputFields[ii].setAttributeNode(DefaultDisabled);
                    }

                    // assign button id
                    oFormInputFields[ii].id="SaveButton"+i;
                    aryDialogSaveButtons.push(oFormInputFields[ii].id);
                    oFormInputFields[ii].disabled=true;
                    if(oFormInputFields[ii].className.match(/ImportButton/)) {
                        oFormInputFields[ii].className=oFormInputFields[ii].className.replace(/ImportButton/,"SaveInactiveButton");
                    } else {
                        if(oFormInputFields[ii].className.match(/SaveButton/)) {
                            oFormInputFields[ii].className=oFormInputFields[ii].className.replace(/SaveButton/,"SaveInactiveButton");
                        } else {
                            oFormInputFields[ii].className=oFormInputFields[ii].className+=" SaveInactiveButton";
                        }
                    }
                }

                // register run button
                if(oFormInputFields[ii].className.match(/RunButton/)&&
                   (InputType=="button"||InputType=="submit")) {
                    if(oFormInputFields[ii].disabled){
                        //  remember default disabled button
                        var DefaultDisabled=document.createAttribute("defaultdisabled");        // 1= disabled by default ; 0= not disabled by default
                        DefaultDisabled.nodeValue=1;
                        oFormInputFields[ii].setAttributeNode(DefaultDisabled);
                    }

                    oFormInputFields[ii].id="RunButton"+i;
                    FormRunButton=1;
                    aryDialogRunButtons.push(oFormInputFields[ii].id);
                }

                // register extra button
                if(oFormInputFields[ii].className.match(/ExtraButton/)&&
                   (InputType=="button"||InputType=="submit")) {
                    if(oFormInputFields[ii].disabled){
                        //  remember default disabled button
                        var DefaultDisabled=document.createAttribute("defaultdisabled");        // 1= disabled by default ; 0= not disabled by default
                        DefaultDisabled.nodeValue=1;
                        oFormInputFields[ii].setAttributeNode(DefaultDisabled);
                    }

                    oFormInputFields[ii].id="ExtraButton"+i;
                    FormExtraButton=1;
                    aryDialogExtraButtons.push(oFormInputFields[ii].id);
                }

                // check button width / assign stylesheet class
                if((InputType=="submit" || InputType=="button" || InputType=="reset")&&
                   oFormInputFields[ii].className!="NoJsResize") {
                    redrawButton(oFormInputFields[ii]);
                }

                // create attribute formindex containing the form index number
                var FormIndex=document.createAttribute("formindex");        // save form index in attribute
                FormIndex.nodeValue=i;
                oFormInputFields[ii].setAttributeNode(FormIndex);


                // assign change events to inputs
                if((InputType == "text") ||
                   (InputType == "password") ||
                   (InputType == "file")) {
                    if(document.all) {   //MSIE
                        oFormInputFields[ii].attachEvent('onpaste',triggerButton);
                        oFormInputFields[ii].attachEvent('onchange',triggerButton);
                        oFormInputFields[ii].attachEvent('onkeydown',triggerButton);
                    } else {             //Other
                        oFormInputFields[ii].addEventListener('paste',triggerButton,false);
                        oFormInputFields[ii].addEventListener('keydown',triggerButton,false);
                        oFormInputFields[ii].addEventListener('change',triggerButton,false);
                    }
                }
                if((InputType == "checkbox") ||
                   (InputType == "radio")) {
                    if(document.all) {   //MSIE
                        oFormInputFields[ii].attachEvent('onclick',triggerButton);
                        oFormInputFields[ii].attachEvent('onkeydown',triggerButton);
                        oFormInputFields[ii].attachEvent('onchange',triggerButton);
                    } else {             //Other
                        oFormInputFields[ii].addEventListener('change',triggerButton,false);    // in firefox onchange is fast engough
                    }
                }
            }
            if(FormSaveButton==0) aryDialogSaveButtons.push("empty");  //push empty entry
            if(FormRunButton==0) aryDialogRunButtons.push("empty");    //push empty entry
            if(FormExtraButton==0) aryDialogExtraButtons.push("empty");    //push empty entry

            for(ii=0; ii< oFormTextareas.length; ii++) {
                // create attribute formindex containing the form index number
                var FormIndex=document.createAttribute("formindex");
                FormIndex.nodeValue=i;
                oFormTextareas[ii].setAttributeNode(FormIndex);

                // assign change events to textareas

                if(document.all) {   //MSIE
                    oFormTextareas[ii].attachEvent('onchange',triggerButton);
                    oFormTextareas[ii].attachEvent('onkeydown',triggerButton);
                } else {             //Other
                    oFormTextareas[ii].addEventListener('keydown',triggerButton,false);
                    oFormTextareas[ii].addEventListener('change',triggerButton,false);
                }
            }

            for(ii=0; ii< oFormSelectsFields.length; ii++) {
                // create attribute formindex containing the form index number
                var FormIndex=document.createAttribute("formindex");
                FormIndex.nodeValue=i;
                oFormSelectsFields[ii].setAttributeNode(FormIndex);

                // assign change events to select fields
                if(document.all) {   //MSIE
                    oFormSelectsFields[ii].attachEvent('onchange',triggerButton);
                    oFormSelectsFields[ii].attachEvent('onkeydown',triggerButton);
                } else {             //Other
                    oFormSelectsFields[ii].addEventListener('keydown',triggerButton,false);
                    oFormSelectsFields[ii].addEventListener('change',triggerButton,false);
                }

            }

        }else {
            aryDialogSaveButtons.push("empty");  //push empty entry
            aryDialogRunButtons.push("empty");   //push empty entry
            aryDialogExtraButtons.push("empty");    //push empty entry
        }
    }
    enableHideElementClass();
}

function triggerButton(Event) {
// event function / executed by onchange / onkeydown /... events of form fields
    // get event / target
  	var oTarget;
  	if (!Event) var Event = window.event;
  	if (Event.target) oTarget = Event.target;
  	else if (Event.srcElement) oTarget = Event.srcElement;

    //get form index
    var FormIndex = oTarget.getAttribute("formindex");

    if(oTarget.className.match(/RunButtonTrigger/)) {
        highlightRunButton(FormIndex);
    } else if(oTarget.className.match(/ExtraButtonTrigger/)) {
        highlightExtraButton(FormIndex);
    } else if(oTarget.className.match(/NoButtonTrigger/)) {
        // do nothing
    } else {
        activateSaveButton(FormIndex);
    }
}

function activateSaveButton(ButtonNumber) {
    if(DialogFormChanged[ButtonNumber]==0) {
        if(PageChanged==0)document.title+="*";
        DialogFormChanged[ButtonNumber]=1;
        PageChanged=1;
        try {
            var oSaveButton=document.getElementById(aryDialogSaveButtons[ButtonNumber]);
        } catch(ex) {
          // no save button
          var oSaveButton=null;
        }
        if(oSaveButton) {
            var DisabledByDefault;
            try{
                DisabledByDefault=oSaveButton.getAttribute("defaultdisabled");
            } catch(ex) {
                DisabledByDefault=0;
           }
            if(!DisabledByDefault) {
                oSaveButton.className=oSaveButton.className.replace(/SaveInactiveButton/,"SaveActiveButton");
                oSaveButton.disabled=false;
            }
        }

    }
}

function highlightRunButton(ButtonNumber) {
    if(DialogRunButtonActive[ButtonNumber]==0) {
        try {
            var oRunButton=document.getElementById(aryDialogRunButtons[ButtonNumber]);
        } catch(ex) {
          // no run button
          var oRunButton=null;
        }

        if(oRunButton) {
            var DisabledByDefault;
            try{
                DisabledByDefault=oRunButton.getAttribute("defaultdisabled");
            } catch(ex) {
                DisabledByDefault=0;
            }
            if(!DisabledByDefault) {
                DialogRunButtonActive[ButtonNumber]=1;
                oRunButton.className=oRunButton.className.replace(/RunButton/,"RunActiveButton");
            }
        }
    }
}

function highlightExtraButton(ButtonNumber) {
    if(DialogExtraButtonActive[ButtonNumber]==0) {
        try {
            var oExtraButton=document.getElementById(aryDialogExtraButtons[ButtonNumber]);
        } catch(ex) {
          // no extra button
          var oExtraButton=null;
        }
        if(oExtraButton) {
            var DisabledByDefault;
            try{
                DisabledByDefault=oExtraButton.getAttribute("defaultdisabled");
            } catch(ex) {
                DisabledByDefault=0;
            }
            if(!DisabledByDefault) {
                DialogExtraButtonActive[ButtonNumber]=1;
                oExtraButton.className=oExtraButton.className.replace(/ExtraButton/,"ExtraActiveButton");
            }
        }
    }
}


// init forms and buttons
if(browser.isIE) {   //MSIE
    window.attachEvent('onload',initializeFormsAndButtons);
} else {             //Other
    window.addEventListener('load',initializeFormsAndButtons,false);
}
