/**
 * 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);
	
}
/**
 * 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();

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

			if (add == '1') {
				// Füge zu vorhandenen html hinzu
				jQuery('#' + id).append(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;
}



