/**
 * ajax client functions
 *
 * Diese Datei enth???lt die Scripte f???r die clientseitigen Ajax-Ansteuerungen
 *
 * @category common
 * @package main
 * @subpackage ajax
 * @author Martin Specht
 * @copyright 2005 - KP3 Medien GmbH, Berlin
 * @filesource
 **/

// globale Ajax-Variablen
var int_ajaxHandlerCount = 0;
//var obj_http = getHTTPObject(); // We create the HTTP Object
var obj_http = getRequestObject(); // We create the HTTP Object


/**
 * this function handles the xmlResponse-Object
 *
 * Die Funktion arbeitet mit dem xml-Objekt und steuert die
 * Abarbeitung des Frameworks
 *
 * @author Martin Specht
 * @copyright 2005 - KP3 Medien GmbH, Berlin
 * @param string str_post post value for sending
 * @param string str_get get-value for sending
 * @return boolean true = ok false = failed
 **/

function cls_000_xmlHttpRequest () {

	// Replacement class for XMLHttpRequest

	// members of original XMLHttpRequest object
	this.readyState = null;
	this.responseXML = null;
	this.responseText = null;
	this.status = null;
	this.statusText = null;
	this.abort = function () { };
	this.getAllResponseHeaders = function () { };
	this.overrideMimeType = function () { };
	this.multipart = false;
	this.onload = null;
	this.onerror = null;
	this.onprogress = null;
	this.onreadystatechange = null;
	this.addEventListener = function () { };
	this.removeEventListener = function () { };
	this.dispatchEvent = function () { };
	this.getInterface = function () { };

	// new (internal) members
	this.__str_method = null;
	this.__str_url = null;
	this.__boo_asynchronous = null;
	this.__arr_requestHeader = new Array();
	this.__str_content = null;
	this.__iframeDocument = null;
	this.__str_frameName = 'ajaxIframe';
	this.__int_responseCheckTimeout = 100;
	this.__int_responseMaxTimeout = 30000;
	this.__int_responseCurrentRuntime = 0;


	this.open = function(str_method, str_url, boo_asynchronous) {
		// alert('open: ' + str_method + " " + str_url);
		this.__str_method = str_method;
		this.__str_url = str_url;
		this.__boo_asynchronous = boo_asynchronous;
	};

	this.setRequestHeader = function(str_fieldname, str_value) {
		// headers are not used
		this.__arr_requestHeader[str_fieldname] = str_value;
	};

	this.send = function(str_content) {

		this.__str_content = str_content;

		// create and append iframe
		var obj_iframe = document.createElement('iframe');
		obj_iframe.setAttribute('name', this.__str_frameName);
		obj_iframe.setAttribute('id', this.__str_frameName);
		obj_iframe.style.display = 'none';
		document.body.appendChild(obj_iframe);

		this.__iframeDocument = parent.frames[this.__str_frameName].document;
		this.__iframeDocument.onreadystatechange = obj_http.__sendPhase2;

	};

	this.__sendPhase2 = function() {

		if (obj_http.__iframeDocument.readyState == 'complete') {
			// iframe was initialized

			obj_http.__iframeDocument.onreadystatechange = null;

			// create form element
			var obj_formElement = obj_http.__iframeDocument.createElement('form');
			obj_formElement.setAttribute('method', 'post');
			obj_formElement.setAttribute('action', obj_http.__str_url);

			// append values
			var arr_content = obj_http.__str_content.split('&');

			for (var i = 0; i < arr_content.length; i++) {

				var arr_contentCurrent = arr_content[i].split('=');

				// create and append input fields
				var obj_formField = obj_http.__iframeDocument.createElement('input');
				obj_formField.setAttribute('type', 'text');
				obj_formField.setAttribute('name', arr_contentCurrent[0]);
				obj_formField.setAttribute('value', arr_contentCurrent[1]);
				obj_formElement.appendChild(obj_formField);

			}

			// this field is used to tell the ajax handler to send this fake-ajax response
			var obj_formField = obj_http.__iframeDocument.createElement('input');
			obj_formField.setAttribute('type', 'text');
			obj_formField.setAttribute('name', '__boo_activexDisabled');
			obj_formField.setAttribute('value', '1');
			obj_formElement.appendChild(obj_formField);

			obj_http.__iframeDocument.body.appendChild(obj_formElement);

			// submit form
			obj_formElement.submit();
			window.setTimeout('obj_http.__sendPhase3()', obj_http.__int_responseCheckTimeout);

		}

	}

	this.__sendPhase3 = function() {

		if (frames[obj_http.__str_frameName].document.readyState == 'complete') {

			this.__int_responseCurrentRuntime = 0;

			obj_http.readyState = 4;
			obj_http.status = 200;
			obj_http.responseXML = frames[obj_http.__str_frameName].document.getElementById('ajaxResponse').XMLDocument;

			document.body.removeChild(document.getElementById(obj_http.__str_frameName));

			obj_http.onreadystatechange();

		}
		else {
			this.__int_responseCurrentRuntime += obj_http.__int_responseCheckTimeout;
			if (this.__int_responseCurrentRuntime < this.__int_responseMaxTimeout) {
				window.setTimeout('obj_http.__sendPhase3()', obj_http.__int_responseCheckTimeout);
			}
			else {

				obj_http.readyState = 4;
				obj_http.status = 404;

				obj_http.responseXML = null;
				document.body.removeChild(document.getElementById(obj_http.__str_frameName));
				obj_http.onreadystatechange();

			}
		}

	}

}


function handleHttpResponse() {

	window.status = 'Receiving request (readyState '+obj_http.readyState+') ...';


	if (obj_http.readyState == 4) {

  	try {

	  	window.status = 'Receiving request (readyState '+obj_http.readyState+', HTTP-Status '+obj_http.status+') ...';

	  	if (obj_http.status == 0 || obj_http.status == 200) {
	  		// if resut is no xml-response, return error-popup
	  		if (obj_http.responseXML == undefined) {
	  			str_ajaxDebugWin = window.open('about:blank', 'ajaxDebugWin');
	  			str_ajaxDebugWin.document.write('<html><head><title>Ajax Debug Window</title></head><body>');
	  			str_ajaxDebugWin.document.write('Ajax lieferte ein leeres Response-Objekt<hr>')
	  			str_ajaxDebugWin.document.write('<quote>'+ obj_http.responseText +'</quote>');
	  			str_ajaxDebugWin.document.write('</body></html>');

	  			int_ajaxHandlerCount -= 1;
	  			if (setPageAlreadySent != undefined) {
	  				setPageAlreadySent(false);
	  			}

	  		} else {
	  			//@INFO error output has to be implemented
					//showProperty(obj_http.responseXML.childNodes[0]);
					//showProperty(obj_http.responseXML.getElementsByTagName('result'));
	  			// do function with xml-result

		  		var xmlDocumentResponse	= obj_http.responseXML.getElementsByTagName('response')[0];
			    var xmlDocumentResult		= obj_http.responseXML.getElementsByTagName('result')[0];
	 				var str_functionName 		= xmlDocumentResponse.getElementsByTagName('functionName')[0].firstChild.data;

					window.status = 'Receiving request (readyState '+obj_http.readyState+', HTTP-Status '+obj_http.status+') ... Call function \''+str_functionName+'\'';
	 				int_ajaxHandlerCount -= 1;
	 				eval(str_functionName+ "(xmlDocumentResult, 2)");
					window.status = '';

	  		}
				// FIX DFR
				if(document.getElementsByTagName('body') && document.getElementsByTagName('body').item(0)){
					document.getElementsByTagName('body').item(0).style.cursor = "default";
				}
			} else {
				// if page has any errors (404 etc ...)
				window.status = 'Receiving request failed (readyState '+obj_http.readyState+', HTTP-Status '+obj_http.status+') ... Call function \''+str_functionName+'\'';
				int_ajaxHandlerCount -= 1;
				if (setPageAlreadySent != undefined) {
					setPageAlreadySent(false);
				}
			}
			delete obj_http;
  	} catch(e) {
  		if (boo_debug) {
  			showProperty(e);
  		}
  	}
  }
}

/**
 * this function creates the xmlResponse-Object
 *
 * Die Funktion erzeugt das globale xmlResponse-Objekt.
 * Abh???ngig vom Browser werden dabei die unterschiedlichen
 * Typen (ActiveX/Browserobjekt) angesprochen und initialisiert.
 *
 * @author Martin Specht
 * @copyright 2005 - KP3 Medien GmbH, Berlin
 * @return mixed false = failed, else HTTP-Object
 **/

function getHTTPObject() {

  /*@cc_on
  @if (@_jscript_version >= 5)
    try {
    	var obj_xmlHttp;
      obj_xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
      	var obj_xmlHttp;
        obj_xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
        obj_xmlHttp = false;
      }
    }
  @else
  obj_xmlHttp = false;
  @end @*/

  if (!obj_xmlHttp && typeof XMLHttpRequest != 'undefined') {
    try {
    	var obj_xmlHttp;
      obj_xmlHttp = new XMLHttpRequest();
    } catch (e) {
      obj_xmlHttp = false;
    }
  }
  return obj_xmlHttp;
}




function getRequestObject(){

	var req;
	try {
		req = new ActiveXObject("Msxml2.XMLHTTP");
	}
	catch (e) {
		try	{
			req=new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch (e2) {
			req=null;
		}
	}
	if(!req && typeof XMLHttpRequest != "undefined") {
		req = new XMLHttpRequest();
	}
	if (!req) {

//		if (window && window.status) {
//			window.status("Request Object Instantiation failed.");
//		}
//		else {
//			alert("Request Object Instantiation failed.");
//		}
			req = new cls_000_xmlHttpRequest();

	}
	// showProperty(req);
	return req;
}


/**
 * this function creates the xmlResponse-Object
 *
 * Die Funktion setzte einen Request mit den ???bergebenen Parametern ab
 * und stellt des Event f???r die vollst???ndige R???ckgabe ein.
 *
 * @author Martin Specht
 * @copyright 2005 - KP3 Medien GmbH, Berlin
 * @param string str_post post value for sending
 * @param string str_get get-value for sending
 * @return boolean true = ok false = failed
 **/

function ajaxSendHttpRequest() {

	var str_post 	= null;
	var str_get		= null;

	if (arguments.length > 0) {

		var str_handler = document.location.protocol + '//' + document.location.hostname + '/ajaxHandler.php';

		if (int_ajaxHandlerCount == 0) {

			// restart http-object because mozilla has some internal bugs with used objects
			// obj_http = getHTTPObject();
			str_post = arguments[0];

			if (arguments.length > 1) {
				// send with get
				str_get = arguments[1];
				obj_http.open('POST', str_handler+'?'+str_get, true);
				var uri = str_handler + "&ts=" + new Date().getTime();
			} else {
				obj_http.open('POST', str_handler, true);
				var uri = (str_handler.indexOf("?") == -1) ? str_handler + "?ts=" + new Date().getTime() : str_handler + "&ts=" + new Date().getTime();
			}

			obj_http.onreadystatechange = handleHttpResponse;

			obj_http.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
			obj_http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
			//obj_http.setRequestHeader("Content-length", str_post.length);
			obj_http.setRequestHeader("Connection", "close");
			obj_http.send(str_post);

			int_ajaxHandlerCount += 1;
			// FIX by DFR
			if(document.getElementsByTagName('body') && document.getElementsByTagName('body').item(0)){
				document.getElementsByTagName('body').item(0).style.cursor = "wait";
			}

			window.status = 'Sending request ...';

			return true;

		}	else {
			// get
			if (arguments.length > 1) {
				var str_post	= arguments[0].replace(/\x22/g, '\\'+'"');
				var str_get		= arguments[1].replace(/\x22/g, '\\'+'"');

				window.setTimeout('ajaxSendHttpRequest(\'' + str_post + ', ' + str_get + '\')' , 250);
			}	else {

				//var str_post	= arguments[0].replace(/\x22/g, '\\'+'"');
				//window.setTimeout('ajaxSendHttpRequest("' + str_post + '")' , 3000);

				var str_post	= encodeURIComponent(arguments[0]); //.replace(/\x22/g, '\\'+'"');
				window.setTimeout('ajaxSendHttpRequest("'+decodeURIComponent(str_post)+'")' , 250);
			}
		}
	} else {
		return false;
	}

}
