var xmlhttp    = getXmlHttpRequestObject();
var myElement  = '';
var requestURL = '';
var mTimer;

// Gets the browser specific XmlHttpRequest Object //
function getXmlHttpRequestObject () {
        if (window.XMLHttpRequest) {
           return new XMLHttpRequest();
        } else if (window.ActiveXObject) {
           return new ActiveXObject("Microsoft.XMLHTTP");
        } else {
           var msg = "Sorry, your browser does not support AJAX, which is required for this application. " +
                     "Consider upgrading your browser, or using another one such as " +
                     "<a href=\"http://www.mozilla.com/firefox\" target=\"blank\">Firefox</a>.";
           debugMessage(msg, 0);
        }
} // getXmlHttpRequestObject


function loadFragmentInToElement (fragment_url, element_id, loading) {
        if (xmlhttp.readyState == 4 || xmlhttp.readyState == 0) {
            myElement  = document.getElementById(element_id);
            requestURL = fragment_url;

           if (loading) {
              myLoader(myElement);
           } else {
              myElement.innerHTML = 'Loading ...';
           }

           xmlhttp.open('GET', requestURL, true);
           xmlhttp.onreadystatechange = handleFragmentInToElement;
           xmlhttp.send(null);
        }
} // loadFragmentInToElement

function handleFragmentInToElement () {
        if (xmlhttp.readyState == 4) {
           if (xmlhttp.status == 200) {
              myElement.innerHTML = resultStatus(xmlhttp.responseText, true, false);
           } else if (xmlhttp.status == 404) {
              debugMessage("The requested URL [" + requestURL + "] was not found on this server.", 0);
           } else {
              debugMessage("Fail process your request, unknown status code found - " + xmlhttp.status, 0);
           }
        }
} // handleFragmentInToElement


function resultStatus (text, returnResult, debugResponse) {

        if (!text) {
           if (returnResult && debugResponse) {
              debugMessage("Empty content had returned back.", 0);
              return false;
           }

           return;
        }


        //
        // NORMAL STATUS: no SPECIAL message back from server
        //
        if (text.substr(0, 1) != '#') {
           if (debugResponse) {
              // display returned content for debugging //
              debugMessage(text, 2);
           }

           if (returnResult == 'xml') {
              // return boolean (true) and xml parser will be processed later //
              return true;
           } else if (returnResult) {
              // return plain text //
              return text;
           }

           // no need return anything even request is succuessful //
           return;
        }


        //
        // ERROR/NOTE: some SPECIAL messages need to be displayed on browser
        //
        var index = text.indexOf(';');

        if (index) {
           var type = text.substr(0, index);
           var mesg = text.substr(index+1);

           mesg = (mesg) ? mesg : "Sorry... failed to execute your request.";

           if (type == '#ERR') {
              debugMessage(mesg, 0);
              return false; // something wrong happens, process halt //
           } else if (type == '#WARN') {
              debugMessage(mesg, 1);
           } else if (type == '#NOTE') {
              debugMessage(mesg, 2);
           } else if (type == '#DEBG') {
              debugMessage(mesg, 3);
           } else if (type == '#SQL') {
              debugMessage(mesg, 4);
              return false; // sql return error, process halt //
           } else { // unknown message type? //
              debugMessage(text, -1);
           }
        } else {
           debugMessage(text, -1);
        }

        return;
} // resultStatus


function killMessage (element_id) {
        var element_id = (typeof(element_id) == 'undefined') ? "div_messageBox" : element_id;
        document.getElementById('div_messageBox').style.display = "none";
} // killMessage

function switchDisplay (element_id, value) {
        document.getElementById(element_id).style.display = value;
} // switchDiplay


function disabledObject (element_id, status, value) {
        document.getElementById(element_id).disabled = status;
        document.getElementById(element_id).value    = value;
} // disabledObject

function disabledFormObjects (formname, status) {
         var elementList = document.form1.elements;
         var list = "";

         for (x=0; x<elementList.length; x++) {
            e = elementList[x];

            if (e.name != "onback") {
               list += e.name + "\n";

               if (status == true) {
                  e.className = "fm_disabled";
               } else {
                  e.className = null;
               }

               e.disabled = status;
            }
         }

         //alert(list);
} // disabledFormObjects


function createElement (element_id, styleName, value) {
        if (document.createElement){
           var el = document.createElement('DIV');
            el.id        = element_id;
            el.className = styleName;
            el.innerHTML = value;

           document.body.appendChild(el);
        } else {
           debugMessage("Fail create element.", 2);
        }
} // createElement


function slideElement (element_id) {
        var el = document.getElementById(element_id);

        //docWidth = document.body.clientWidth;
        //el.style.left = docWidth;
        //switchDisplay(element_id, 'block');

        if (parseInt(el.style.left) > 1) {
           el.style.left = parseInt(el.style.left) - 20;
           mTimer = setTimeout("slideElement()", 30);
        } else if (parseInt(el.style.left) < 50) {
           el.style.left = parseInt(el.style.left) - 20;
           mTimer = setTimeout("slideElement()", 30);
        } else {
           clearTimeout(mTimer);
        }
} // slideElement


function deleteRow (element_id, i) {
        document.getElementById(element_id).deleteRow(i)
} // deleteRow


function debugMessage (msg, type) {
        switch (type) {
           case 0:
           type = 'Error: ';
           break;

           case 1:
           type = 'Warning: ';
           break;

           case 2:
           type = 'Notice: ';
           break;

           case 3:
           type = 'Debug: ';
           break;

           case 4:
           type = 'SQL Error: ';
           break;

           default:
           type = 'Unknown error: ';
        }

        alert(type+msg);
} // debugMessage