

if (typeof XMLHttpRequest == "undefined") {
	XMLHttpRequest = function() {
		try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch(e) {};
		try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch(e) {};
		try { return new ActiveXObject("Msxml2.XMLHTTP"); }		 catch(e) {};
		try { return new ActiveXObject("Microsoft.XMLHTTP"); }	catch(e) {};
 
		throw new Error("This browser does not support XMLHttpRequest or XMLHTTP.");
	};
}

function ajaxEvent(vars, callbackFunction) {
	ajax('/eventhandler.php', vars, callbackFunction);
}

function ajax(url, vars, callbackFunction) {

	var request = new XMLHttpRequest();
	
	var d = new Date();
	url += ((url.indexOf("?") == -1) ? "?" : "&") + "tz=" +(d.getTime()/1000 + d.getTimezoneOffset()*60);
	
	//request.open("POST", "http://"+location.host+url, true);
	request.open("POST", url, true);
	request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

	if(callbackFunction) {
		request.onreadystatechange = function() {
			if (request.readyState == 4 && request.status == 200) {
				if(request.responseXML && request.responseXML.childNodes.length != 0 && request.responseText.length != 0){
					if(request.responseXML.childNodes.length == 2) // IE
						callbackFunction(xml2obj(request.responseXML.childNodes[1]));
					else
						callbackFunction(xml2obj(request.responseXML.childNodes[0]));
				}else{
					callbackFunction(request.responseText);
				}
			}
		};
	}
	
	var varstr = '';
	var sep = '';
	if(typeof(vars) == 'object') {
		for(var ename in vars) {
			varstr += sep+ename+'='+escape(vars[ename]);
			sep = '&';
		}
	}
	else varstr = vars;
	
	request.send(varstr);
}

function ajaxSecure(url, vars, callbackFunction) {

	var request = new XMLHttpRequest();
	
	var d = new Date();
	url += ((url.indexOf("?") == -1) ? "?" : "&") + "d=" + d.getTime();
	
	request.open("POST", "https://"+location.host+url, true);
	request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

	if(callbackFunction) {
		request.onreadystatechange = function() {
			if (request.readyState == 4 && request.status == 200) {
				if(request.responseXML && request.responseXML.childNodes.length != 0 && request.responseText.length != 0){
					if(request.responseXML.childNodes.length == 2) // IE
						callbackFunction(xml2obj(request.responseXML.childNodes[1]));
					else
						callbackFunction(xml2obj(request.responseXML.childNodes[0]));
				}else{
					callbackFunction(request.responseText);
				}
			}
		};
	}
	
	var varstr = '';
	var sep = '';
	if(typeof(vars) == 'object') {
		for(var ename in vars) {
			varstr += sep+ename+'='+escape(vars[ename]);
			sep = '&';
		}
	}
	else varstr = vars;
	
	request.send(varstr);
}

function xml2obj(node) {
	
	if(typeof(node) == 'string') {
		try { //Internet Explorer
			xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
			xmlDoc.async="false";
			xmlDoc.loadXML(node);
			xmlDoc.normalize();
		}
		catch(e) {
			try { //Firefox, Mozilla, Opera, etc.
				parser=new DOMParser();
				xmlDoc=parser.parseFromString(node,"text/xml");
				xmlDoc.normalize();
			}
			catch(e) {
				alert(e.message);
				return;
			}
		}
		return xml2obj(xmlDoc.childNodes[0]);
	}
	
	if(node.nodeName == 'S') {
		return (node.hasChildNodes()) ? unescape(node.childNodes[0].nodeValue) : '';
	}

	else if(node.nodeName == 'N') {
		return (node.hasChildNodes()) ? Number(unescape(node.childNodes[0].nodeValue)) : 0;
	}

	else if(node.nodeName == 'O' || node.nodeName == 'A') {

		var obj = (node.nodeName == 'O') ? new Object() : new Array();

		for(var i=0;i<node.childNodes.length;i++) {
			var subnode = node.childNodes[i];

			if(subnode.attributes && subnode.getAttribute('n')){
				obj[subnode.getAttribute('n')] = xml2obj(subnode);
			}

		}
		
		return obj;
	}

	else if(node.nodeName == 'P') {
		var str = '';
		for(var i=0;i<node.childNodes.length;i++) {
			var subnode = node.childNodes[i];
			str += (subnode.hasChildNodes()) ? unescape(subnode.childNodes[0].nodeValue) : '';
		}
		return str;
	}

	else if(node.nodeName == 'B') {
		var bval = '';
		if(node.hasChildNodes()) bval = unescape(node.childNodes[0].nodeValue).toUpperCase();
		return (bval == 'T' || bval == 'TRUE' || bval == '1');
	}

	else if(node.nodeName == 'X') {
		return null;
	}

	else if(node.nodeName == 'U') {
		return undefined;
	}
	return null;
}


function obj2xml(obj, name) {

	var namestr = (name != '' && name != undefined && name != null) ? ' n="'+name+'"' : '';
	var typestr = 'U';
	var nodeval = '';
	var objtype = typeof(obj);

	if(objtype == 'string') { typestr = 'S'; nodeval = escape(obj); }
	else if(objtype == 'number') { typestr = 'N'; nodeval = escape(obj); }
	else if(objtype == 'boolean') { typestr = 'B'; nodeval = obj.toString(); }
	else if(objtype == 'object') {
		if(obj == null) { typestr = 'X'; }
		else {
			typestr = (obj.length != undefined) ? 'A' : 'O';
			for(var ename in obj) 
				nodeval += obj2xml(obj[ename], ename);
		}
	}
	return '<'+typestr+namestr+'>'+nodeval+'</'+typestr+'>';
}


