/**
 * Copyright © 2001-2010 plentySystems GmbH  http://www.plentysystems.de/
 * All rights reserved.
 */

/**
 * @param url = zieladresse der Abfrage
 * @param fctAfterRequest = optional javascript function - execute after xml-request (4, 200)
 * 
 * in JavaScript all parameters are optional
 */
function plentyAjaxRequest(url, fctAfterRequest) {

    waitScreen();
    
    var http_request = false;
    
    if (window.XMLHttpRequest) { // Mozilla, Safari,...
        http_request = new XMLHttpRequest();
        if (http_request.overrideMimeType) {
            http_request.overrideMimeType('text/xml');
        }
    } else if (window.ActiveXObject) { // IE
        try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
        }
    }

    if (!http_request) {
        //alert('Internal Server Error (Code: AJAX 002)');
        
        waitScreenClose();
        
        return false;
    }

    http_request.onreadystatechange = function() {

        if (http_request.readyState == 4 ) {
            if (http_request.status == 200) {


              if (window.ActiveXObject) {
                 var xml = new ActiveXObject("Microsoft.XMLDOM");
                 //The LoadXML method always takes a Unicode BSTR that is encoded in UCS-2 or UTF-16 only. If you pass in anything other than a valid Unicode BSTR to LoadXML, it will fail to load.
                 //responseText is ISO-8859-1!    http://msdn.microsoft.com/en-us/library/aa468560.aspx#xmlencod_topic2
                 //wir senden das XML jetzt einfach per UTF-8 und dann funzt es
                 xml.loadXML(http_request.responseText);
              } else if (document.implementation) {
                 var xml = (new DOMParser()).parseFromString(http_request.responseText, "text/xml");
              }

                /**
                 * get root
                 */
                var root = xml.getElementsByTagName('block')[0];
                var blocks = root.getElementsByTagName("blockNumIndex");

                    for (var i = 0 ; i < blocks.length ; i++) {
                        var block = blocks[i];
                        
                        if(block.getElementsByTagName("data")[0].getAttribute("base64")==1 ){
                            //block.getElementsByTagName("data")[0].firstChild.nodeValue = base64_decode( block.getElementsByTagName("data")[0].firstChild.nodeValue );
                        }
                                                    
                        if (block.getElementsByTagName("add")[0].firstChild.nodeValue == '1') {
                            document.getElementById( block.getElementsByTagName("id")[0].firstChild.nodeValue ).innerHTML =
                            document.getElementById( block.getElementsByTagName("id")[0].firstChild.nodeValue ).innerHTML + block.getElementsByTagName("data")[0].firstChild.nodeValue;
                        } else {
                            document.getElementById( block.getElementsByTagName("id")[0].firstChild.nodeValue ).innerHTML = 
                            block.getElementsByTagName("data")[0].firstChild.nodeValue;
                        }
                    }
                    
                    //PrŸfen ob es eine †bergebene Funktion gibt wenn ja wird sie ausgefŸhrt
                    if(fctAfterRequest)
                    {
                        fctAfterRequest();                  
                    }

            } else {
                //alert('Internal Server Error (Code: AJAX 002)');
            }
            
            waitScreenClose();
        }
    };
    http_request.open('GET', url, true);
    http_request.send(null);
    
}

function openWaitScreen()
{
    var waitScreen = $("#jQueryPageWaitScreen");
    if(waitScreen.data("isLoaded") !== true)
    {
        waitScreen = $('<div id="jQueryPageWaitScreen" style="display:none; position:fixed; top:0px; left:0px; right:0px; bottom:0px; z-index:500000; text-align:center; background-image:url(/images/icons/silk/loading_screen_background.gif)">'+
'               <div id="jQueryPageWaitInnerPane" style="position:absolute; top:45%; left:45%; z-index:500001;">'+
'                   <img src="/images/icons/silk/loading.gif" border="0" title="Bitte warten..." alt="Bitte warten...">'+
'               </div>'+
'           </div>');
        $(document.body).prepend(waitScreen);
        waitScreen.data("isLoaded",true).data("countOpened",0);
    }
    waitScreen.data("countOpened",waitScreen.data("countOpened")+1);
    waitScreen.show();
}

function closeWaitScreen()
{
    var waitScreen = $("#jQueryPageWaitScreen");
    if(waitScreen.data("isLoaded") === true && waitScreen.data("countOpened")==1)
    {
        waitScreen.hide();
    }
    waitScreen.data("countOpened",waitScreen.data("countOpened")-1);
}

function plentyAjaxRequest2(target_url, fctAfterRequest, fctBeforeRequest)
{
    jQuery.ajax({
        url : target_url,
        type : "post",
        dataType : "xml",
        beforeSend :
            function()
            {
                openWaitScreen();
                if(fctBeforeRequest)
                {
                    fctBeforeRequest();
                }
                
            },
        error : 
            function(XMLHttpRequest, textStatus, errorThrown)
            {
                if (typeof(window["console"]) != "undefined") 
                {
                    window.console.log(XMLHttpRequest);
                }
            },
        success: 
            function(xml)
            {
                successXML(xml);
                if(fctAfterRequest)
                {
                    fctAfterRequest();  
                }
            },
        complete: 
            function()
            {
                closeWaitScreen();
            }
    });
}


function plentyAjaxRequest3(target_url, data, fctAfterRequest, fctBeforeRequest, conf)
{
    if(typeof conf == "undefined")
    {
        conf = new Object();
    }
    
    var bFctBeforeRequestResult = true;
    
    jQuery.ajax({
        async: (    conf.async != "undefined"
                        ? conf.async
                        : true),
        url : target_url,           // Nur die nackte URL z.B. "gui_call.php"
        type : "post",              // POST Methode zum Senden der Daten
        dataType : "xml",           // Rückgabe ist XML (was der Server liefert)
        data : data,                // Die Daten (z.B. von einem Formular), die übermittelt werden sollen
        processData : false,        // Die Daten haben das richtige Format und sollen nicht weiter von jQuery bearbeitet werden.
        beforeSend :
            function()
            {
                if(     typeof conf.waitScreen == "undefined"
                    ||  conf.waitScreen == true)
                {
                    openWaitScreen();
                }
                
                if(fctBeforeRequest)
                {
                    bFctBeforeRequestResult = fctBeforeRequest();
                    
                    if(bFctBeforeRequestResult === false)
                    {
                        closeWaitScreen();
                        
                        return false;
                    }
                }
                
            },
        error : 
            function(XMLHttpRequest, textStatus, errorThrown)
            {
                if (typeof(window["console"]) != "undefined") 
                {
                    window.console.log(XMLHttpRequest);
                }
            },
        success: 
            function(xml)
            {
                successXML(xml);
                if(fctAfterRequest)
                {
                    fctAfterRequest();  
                }
            },
        complete: 
            function()
            {
                if(     typeof conf.waitScreen == "undefined"
                    ||  conf.waitScreen == true)
                {
                    closeWaitScreen();
                }
            }
    });
}


/**
 * Liest aus dem reponse xml die Daten aus und fügt sie in das html ein
 * 
 * @param xml
 * @return void
 */
function successXML(xml) {
    jQuery("blockNumIndex", xml).each(function()
    {
        var text = jQuery("data", this).text();
        var id = jQuery("id", this).text();
        var add = jQuery("add", this).text();

        if(id.length > 0)
        {
            // Wichtig da jQuery mit . nicht zurecht kommt nur wenn mans excaped
            id = id.replace(".", "\\.");

            if (add == '1')
            {
                // Füge zu vorhandenen html danach
                jQuery('#' + id).append(text);
            }
            else if(add == '2')
            {
                // Füge zu vorhandenen html davor
                jQuery('#' + id).prepend(text);
            }
            else
            {
                // Ersetze html
                jQuery('#' + id).html(text);
            }
        }
    });
}


var timeout = 0;
/**
 * Diese Methode läd per Ajax den Ladebalken in die GUI
 *
 * @param target_url Ajax request URL
 * @param fctBeforeRequest Java-Funktion, die vor dem Request ggf. ausgeführt werden muss
 * @param fctAfterRequest Java-Funktion, die nach dem Request ggf. ausgeführt werden muss
 * @return
 */
function loadbar(target_url, fctBeforeRequest, fctAfterRequest) {

    var res = 0;

    var fn = new Date();

    var fn = fn.getTime() + (Math.floor(Math.random() * 1000000));

    var loadbar_id = url_param("loadbar_id", target_url);

    var SDOM = url_param("SDOM", target_url);

    jQuery.ajax( {
        url : target_url,
        type : "post",
        beforeSend : function() {
            jQuery("#button_" + loadbar_id).css("display", "none");
            jQuery("#load_" + loadbar_id).css("display", "block");
            jQuery("#bar_" + loadbar_id).progressBar( {
                value : 0
            });
            if(fctBeforeRequest)
            {
                fctBeforeRequest();
            }
        },

        data : {
            fn : fn
        },

        error : function(XMLHttpRequest, textStatus, errorThrown) {
            if (typeof (window["console"]) != "undefined") {
                clearTimeout(timeout);
                window.console.log(XMLHttpRequest);
            }
        },

        success : function(xml) {
            clearTimeout(timeout);
            jQuery("#bar_" + loadbar_id).progressBar(100);
            successXML(xml);
            jQuery("#load_" + loadbar_id).css("display", "none");
            jQuery("#button_" + loadbar_id).css("display", "block");
            if(fctAfterRequest)
            {
                fctAfterRequest();
            }
        }

    });

    setTimeout(function() {
        getLoadbarProgress(fn, loadbar_id, SDOM,0);
    }, 2000);

}

/**
 * Diese Methode muss nicht manuell aufgerufen werden
 * wird von loadbar() aufgerufen, um per Ajax den aktuellen Status der Aktion (z.B. 50%) in die GUI zu laden
 * 
 * @param fn
 * @param loadbar_id
 * @param SDOM
 * @param errorCount
 * @return
 */
function getLoadbarProgress(fn, loadbar_id, SDOM, errorCount) {
    
    jQuery.ajax( {
        
        //load status in percent from text file
        url : SDOM + "/plenty/api/ajax_loadbar_status.php?filename=remote-bar-" + fn + ".txt",

        cache : false,

        //dataType : "text",

        error : function(xhr, ajaxOptions, thrownError) {
            
        
            if(errorCount < 2)
            {
               if (xhr.status == 404) {
                timeout = setTimeout(function() {
                    errorCount++;
                    getLoadbarProgress(fn, loadbar_id, SDOM,errorCount);
                }, 2000);
            }
            }

        },

        success : function(response) {
            
            var zahl = parseInt(response);
            
            jQuery("#bar_" + loadbar_id).progressBar(zahl,null);

            if (response < 100) {
                timeout = setTimeout(function() {
                    getLoadbarProgress(fn, loadbar_id, SDOM,errorCount);
                }, 2000);
            }
        }

    });

}

function url_param(strParamName, target_url) {
    var strReturn = "";
    var strHref = target_url;
    var bFound = false;

    var cmpstring = strParamName + "=";
    var cmplen = cmpstring.length;

    if (strHref.indexOf("?") > -1) {
        var strQueryString = strHref.substr(strHref.indexOf("?") + 1);
        var aQueryString = strQueryString.split("&");
        for ( var iParam = 0; iParam < aQueryString.length; iParam++) {
            if (aQueryString[iParam].substr(0, cmplen) == cmpstring) {
                var aParam = aQueryString[iParam].split("=");
                strReturn = aParam[1];
                bFound = true;
                break;
            }

        }
    }
    if (bFound == false)
        return null;
    return strReturn;
}


