/**
 * Teliad AJAX Class
 *
 * @category   AJAX
 * @author     Holger Szüsz <holger.szuesz@teliad.de>
 * @copyright  2010 teliad Internetmarketing GmbH
 * @license    teliad Internetmarketing GmbH license
 * @version    SVN: $Id:$
 */

/**
 * Teliajax constructor
 *
 * @param String target Target URL of request
 * @param String callbackQuery Function in target
 * @param String args String von Argumenten (php like)
 * @param String method Method of request
 * @param String callback Callback function of response
 * 
 * @return teliajax Object
 */
function teliajax(target, callbackQuery, args, method, callback) {
	
	var that					= this;
	
	this.strTarget				= target;
	this.strCallbackQuery		= callbackQuery;
	this.args					= args;
	this.strMethod				= method;
	this.strRegistedCallback	= callback;
	this.readyState				= 0;
	
	this.objRequest				= false;
	
	/**
	 * Start ajax request
	 */
	this.start = function()
	{
		//Firefox, Opera, Safari
		if(window.XMLHttpRequest && !(window.ActiveXObject)) {
			try {
				this.objRequest = new XMLHttpRequest();
	        } catch(e) {
				this.objRequest = false;
	        }
		//Internet Explorer
		} else if(window.ActiveXObject) {
			try {
	        	this.objRequest = new ActiveXObject("Microsoft.XMLHTTP");
	      	} catch(e) {
	        	try {
	          		this.objRequest = new ActiveXObject("Microsoft.XMLHTTP");
	        	} catch(e) {
	          		this.objRequest = false;
	        	}
			}
		}
	
		if(this.objRequest) {
			this.objRequest.open(this.strMethod, this.strTarget, true);
			this.objRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			this.objRequest.onreadystatechange = function() {
				if (that.objRequest.readyState == 4) {
					eval(that.strRegistedCallback);
				}
			}

			this.objRequest.send(this.builtQuery(this.strCallbackQuery, args));
		} else {
			return false;
		}
	};
	
	/**
	 * build ajax query
	 * 
	 * @param {Object} callback
	 * @param {Object} args
	 * 
	 * @return string query
	 */
	this.builtQuery = function(callback, args)
	{
		var query = '';

		if(callback != '') {
			query = 'callmethod=ajax&function=' + callback;
		}
	
		if (args != '') {
			if (query != '') {
				query = query + '&' + args;
			} else {
				query = args;
			}
		}
	
		return query;
	};
	
	/**
	 * parse xml response into an array
	 * 
	 * @return array
	 */
	this.xml2array = function()
	{
		if(this.objRequest.readyState == 4) {
	        // Ausgabe nur dann verarbeiten, wenn der Server sein "OK" gegeben hat
	        if(teliajax_objRequest.status == 200) {
	            // XML-String in JavaScript-Array umwandeln
				var data = new Array();
				var xmlData = this.objRequest.responseXML;
	
				data = passXMLRec(xmlData.firstChild, data);
	
				//return array;
				return data;
	        } else {
	            alert("XML-String konnte nicht geladen werden:\n" +
						this.objRequest.statusText);
	        }
	    } else {
			return false;
		}
	};
	
	/**
	 * parse string into json object
	 * 
	 * @return json
	 */
	this.str2json = function()
	{
		if(this.objRequest.readyState == 4) {
	        // Ausgabe nur dann verarbeiten, wenn der Server sein "OK" gegeben hat
	        if(this.objRequest.status == 200) {
	            // JSON-String in JavaScript-Datentyp umwandeln
				var response = eval(this.objRequest.responseText);
	
				return response;
	        } else {
	            alert("JSON-String konnte nicht geladen werden:\n" +
						this.objRequest.statusText);
	        }
	    } else {
			return false;
		}
	};
	
	/**
	 * parse HTML
	 * 
	 */
	this.modifyHTML = function()
	{
		if(this.objRequest.readyState == 4) {
			// Ausgabe nur dann verarbeiten, wenn der Server sein "OK" gegeben hat
			if(this.objRequest.status == 200) {
				// Process JSON string
				arrModifyHTML = eval(this.objRequest.responseText);
				modifyHTMLstep(0);
			} else {
				// alert("JSON-String konnte nicht geladen werden:\n" + teliajax_objRequests.statusText);
			}
		}
	}
}

var arrModifyHTML;
/**
 * parse HTML step by step
 * 
 * @param {Object} i
 */
function modifyHTMLstep(i) 
{
	if(i < arrModifyHTML.length) {
		// Modify element
		if(arrModifyHTML[i]['element'] != undefined) {
			// Retrieve element
			var element = document.getElementById(arrModifyHTML[i]['element']);
			if(element !== null) {
				// Change visibility
				if(arrModifyHTML[i]['visibility'] != undefined) {
					if(arrModifyHTML[i]['visibility']) {
						element.style.visibility = 'visible';
						element.style.display = '';
					}
					else {
						element.style.visibility = 'hidden';
						element.style.display = 'none';
					}
				}
				
				// Change HTML
				if(arrModifyHTML[i]['html'] != undefined) {
					element.innerHTML = arrModifyHTML[i]['html'];
				}
				
				// Change value
				if(arrModifyHTML[i]['value'] != undefined) {
					element.value = arrModifyHTML[i]['value'];
				}
			}
		}
		
		// Delay (! must be last option in this if-statement !)
		if(arrModifyHTML[i]['delay'] != undefined) {
			var flag = true;
			j = i + 1;
			setTimeout('modifyHTMLstep(j)', arrModifyHTML[i]['delay']);
		} else {
			modifyHTMLstep(++i);
		}
	}
}

function passXMLRec(xml, arr) {
	if(xml.childNodes.length != 0) {
		for(var i = 0; i < xml.childNodes.length; i++) {
			with(xml.childNodes[i]) {
				if(childNodes.length > 1) {
					arr[i] = new Array();
					var arrTmp = new Object();

					arrTmp = (passXMLRec(xml.childNodes[i], arrTmp));
					arr[i] = arrTmp;
				} else {
					if (firstChild != null) {
						//alert(firstChild.nodeValue + ' Wert von ' + nodeName);
						arr[nodeName] = firstChild.nodeValue;
					} else {
						//alert(nodeValue + ' Wert von ' + nodeName);
						arr[nodeName] = nodeValue;
					}
				}
			}
		}
	} else {
		return false;
	}

	return arr;
}

/**
 * Callback functions for AJAX
 * NOTE: only test
 */
function postingCart(objTeliajax) {
	var objResponse = '';
	var content = '';

	objResponse = objTeliajax.str2json();

	if (objResponse === false) {

	} else {
		if (objResponse[0] > "0") {
			document.getElementById('cart_count').innerHTML = objResponse[0];
			document.getElementById('cart_sum').innerHTML = objResponse[1];
			document.getElementById('cartBox').style.visibility = 'visible';
			document.getElementById('cartBox').style.display = '';
			if(objResponse[0] > "1") {
				document.getElementById('cart_produkte').style.visibility = 'visible';
				document.getElementById('cart_produkte').style.display = '';
			}else{
				document.getElementById('cart_produkt').style.visibility = 'visible';
				document.getElementById('cart_produkt').style.display = '';
			}
		} else {
			document.getElementById('cartBox').style.display = 'none';
		}
	}
}

function fillCartList(objTeliajax) {
	var content = '';
	var cart_list = new Array();
	cart_list = objTeliajax.xml2array();

	if (cart_list) {
		if(document.getElementById('cart_more_sum').innerHTML.search(/euro/)) {
			var code = '&euro;';
		} else {
			var code = '$';
		}
		content = '<table>\n';
		for (var i = 0; i < cart_list.length; i++) {
			content = content + '<tr><td style="border-bottom-style:dashed;border-bottom-width:1px;border-bottom-color:#000000;">' + cart_list[i]["offerTitle"] + '<\/td><td style="border-bottom-style:dashed;border-bottom-width:1px;border-bottom-color:#000000;">' + (Math.round((cart_list[i]["offerPrice"] * 100)) / 100) + '&nbsp;' + code + '<\/td><\/tr>\n';
		}
		content = content + '<\/table>\n';

		document.getElementById('cart_list').innerHTML = content;
	}
}

function getFormData(obj) {
	var getstr = "";
	for (i=0; i<obj.childNodes.length; i++) {
		if (obj.childNodes[i].tagName == "INPUT") {
			if (obj.childNodes[i].type == "text" || obj.childNodes[i].type == "hidden") {
				getstr += obj.childNodes[i].name + "=" + obj.childNodes[i].value + "&";
			}
			if (obj.childNodes[i].type == "checkbox") {
				if (obj.childNodes[i].checked) {
					getstr += obj.childNodes[i].name + "=" + obj.childNodes[i].value + "&";
				} else {
					getstr += obj.childNodes[i].name + "=&";
				}
			}
			if (obj.childNodes[i].type == "radio") {
				if (obj.childNodes[i].checked) {
					getstr += obj.childNodes[i].name + "=" + obj.childNodes[i].value + "&";
				}
			}
		}   
		if (obj.childNodes[i].tagName == "SELECT") {
			var sel = obj.childNodes[i];
			getstr += sel.name + "=" + sel.options[sel.selectedIndex].value + "&";
		}
	}

	return getstr;
}
