/*
 * httpRequest.js
 * Copyright (c) 2005 Smartsite Software BV
 * Written by Marc van Neerven
 * Last Modified: 27 july 2005
 */

function HTTPRequest() {}
HTTPRequest.create = function (safe) {
	
	try {
		if (!safe && window.XMLHttpRequest) {
			var req = new XMLHttpRequest();
			if (req.readyState == null) { // Implement readyState+onreadystate (older versions of Moz)
				req.readyState = 1;
				req.addEventListener("load", function () {
					req.readyState = 4;
					if (typeof req.onreadystatechange == "function") req.onreadystatechange();
				}, false);
			}
			return req;
		}
		if (!safe && window.ActiveXObject) return new ActiveXObject(getXmlHttpPrefix() + ".XmlHttp");
	}
	catch (ex) {}
	
	// fallback
	var x = this;
	
	
	this.open = function(method, url, async){x.url = url};
	
	this.send = function(form){
		var _url;
		if(form){_url = x.url; x.url = "/res/blank.html";};
			
		var f = document.createElement("span");
		var name = escape(x.url + "_" + new Date().getMilliseconds().toString());
		f.done = function(s){
			x.readyState=4;
			if(s==null){
				x.status=501;x.statusText="Cross domain calls not allowed in safe mode";
			}
			else{	
				x.status=200;x.statusText="Ok";
			}
			x.responseText=s;x.onreadystatechange();document.body.removeChild(f)
			if(form){
				form.action=form.oAction;
				form.target=form.oTarget;
			}
		};
		x.readyState=1;
		f.innerHTML = '<iframe name="'+ name +'" onload="try{var s = window.frames[\'' + 
			name + '\'].document.body.innerHTML}catch(ex){s=null}; var p=this.parentNode;p.done(s);" src="'+ x.url +'"></iframe>';
		
		f.style.display="none";
		
		document.body.appendChild(f);
		
		if(form){
			form.oMethod=form.method;form.oAction=form.action;form.oTarget=form.target;
			form.method="POST"; form.action = _url; form.target=name;
			form.submit();
		}
	}
	return this;
}

// create xmlhttp object and start loading
function executeHTTPRequest(url, el, timeout, safe, errcallback, form) {	
	if(typeof(el)=="string"){
		var t=document.getElementById(el);
		if(t)el=t;else el = new Function(t);
	}
	var startTime=new Date();
	var isf = (typeof(el)=="function");
	if(el){
		if(!isf){if(el.loading)return;
		el.loading = true};
	}
	var _method = "GET", _data=null;
	if(form){
		_method = "POST"
		if(typeof(form)=="string"){
			safe=false; // force activex/xmlhttp
		}
		else{
			safe=true; // post form in iframe
		}
		_data = form;
	}

	var xmlHttp = HTTPRequest.create(safe), _tmr;

	if(typeof(errcallback)!="function"){
		if(errcallback==undefined){
			errcallback = function(c,m){throw new Error(c, m)}
		}
		else if(errcallback==null){
			errcallback = function(c,m){}
		}
	}
	
	var _ex = function(c, m){
		try{
			xmlHttp.onreadystatechange = function(){};xmlHttp = null;
		}
		catch(ex){};
		errcallback(c, m);
	}
	
  
	try{
		xmlHttp.open(_method, url, true); // async
				
	}
	catch(ex){
			errcallback(ex.number, "Error opening '" + url + "':\n" + ex.description);
			return;
	}
	
	
	xmlHttp.onreadystatechange = function () {
		if (xmlHttp.readyState == 4){
			if(_tmr) clearTimeout(_tmr);

			if(xmlHttp.status==200){
				if(isf){
										
					if(el.returnObject){ // MvN 2006.01.30
						el(xmlHttp);
					}
					else{
						el(xmlHttp.responseText);
					}
					
				}
				else if(el){
					el.loaded=true;	el.loading=false;

					if(el.value!=null) {
						try{
							el.value=xmlHttp.responseText;
						}
						catch(ex){_ex(3452, "Error setting element value after HTTP Request to '" + url + "':\n" + ex.description)}
					}
					else{
						try{
							el.innerHTML=xmlHttp.responseText;
						}
						catch(ex){_ex(3453, "Error setting element innerHTML after HTTP Request to '" + url + "':\n" + ex.description)}
					}
				}
				else{
					try{
				 		eval(xmlHttp.responseText);
				 	}
				 	catch(ex){_ex(3454, "Error executing return value of HTTP Request to '" + url + "':\n" + ex.description)}
				}
			}else{_ex(3455, "Error executing HTTP Request to '" + url + "':\nResponse status is '" + xmlHttp.status + " " + xmlHttp.statusText + "'")};
		}
	}

	if(timeout) {
		var _err = function(){_ex(3450,  "Timeout expired for HTTP Request to '" + url + "'")};
		_tmr = setTimeout(_err, timeout);
	}
	window.setTimeout(function () {xmlHttp.send(_data)}, 1);
}

function getXmlHttpPrefix() {
	if (getXmlHttpPrefix.prefix) return getXmlHttpPrefix.prefix;
	var o, prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	for (var i = 0; i < prefixes.length; i++) {
		try {
			o = new ActiveXObject(prefixes[i] + ".XmlHttp");
			return getXmlHttpPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}
	throw new Error("Could not find an installed XML parser");
}

