/*
 * IE does not know anything about XMLHttpRequest, therefor we create a Wrapper
 */
if(!window.XMLHttpRequest) {
	var XMLHttpRequest = function() {
		var xmlhttp = false;
		try {
			xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			try {
				xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(e) {
				xmlhttp = false;
			}
		}
		return xmlhttp;
	}
}

/*
 * This is sending the HTTP Request either with GET or with POST
 * All StatusChanges are reported to a ResponseObject
 */
function HTTP() {
	this.init();
}

HTTP.prototype = {
	init: function() {
		window.xmlHttpObjList = new Array();
	},
	
	connect: function() {
		var xmlhttp = new XMLHttpRequest();
		
		if(!xmlhttp) {
			return false;
		}
		
		var id = xmlHttpObjList.length;
		window.xmlHttpObjList[id] = xmlhttp;
	
		return {
			xmlhttp: xmlHttpObjList[id],
			id: id
		}
	},
	
	send: function(url, responseObjName, method) {
		var con = this.connect();
		var xmlhttp = con.xmlhttp;
		var id = con.id;

		var data = null;
		if(method == "POST") {
			var parts = url.split("?");
			for(var i = 0; i < parts.length; i++) {
				if(i == 0) {
					url = parts[i];
				} else if(i == 1) {
					data = parts[i];
				} else {
					data += "?" + parts[i];
				}
			}
		}

		xmlhttp.open(method, url, true);
		xmlhttp.onreadystatechange = function() {
			responseObjName.xmlhttp = xmlhttp;
			responseObjName.onStateChange();
		}

		if(method == "POST") {
			xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		}

		xmlhttp.send(data);

		return xmlhttp;
	},
	
	post: function(url, responseObjName) {
		return this.send(url, responseObjName, "POST");
	},
	
	get: function(url, responseObjName) {
		return this.send(url, responseObjName, "GET");
	}
}

/*
 * This Obj is Handling Responses coming from a HTTP (XMLHttpRequest) Object
 * Userdefined success and failure routines can be defined
 */
function Response(onSuccess, onFailure, objParent) {
	this.onSuccess = onSuccess || function() { };
	this.onFailure = onFailure || function() {
		alert(this.getText());
	};
	this.parent = objParent || false;
}

Response.prototype = {
	xmlhttp: false,
	headers: [],
	parent: false,

	onStateChange: function() {
		switch(this.xmlhttp.readyState) {
			case 0:
			case 1:
				break;
			case 2:
				this.onHeaders();
				break;
			case 3:
				break;
			case 4:
				this.onComplete();
				break;
			default:
				break;
		}
	},
	
	onComplete: function() {
		if(this.headers.length == 0) {
			this.parseHeaders(this.xmlhttp.getAllResponseHeaders());
		}

		if(this.xmlhttp.status == 200) {
			this.onSuccess();
		} else {
			this.onFailure();
		}
	},
	
	onHeaders: function() {
		var isfunc = typeof(this.xmlhttp.getAllResponseHeaders);
		if(isfunc != "function") {
			return false;
		}
		this.parseHeaders(this.xmlhttp.getAllResponseHeaders());

		// One could check the Response Header here and
		// stop the request before downloading the Body
	},
	
	parseHeaders: function(strHeaders) {
		var headers = strHeaders.split("\n");
		
		for(var i = 0; i < headers.length; i++) {
			var keyval = headers[i].split(": ", 2);
			this.headers[keyval[0]] = keyval[1];
		}
	},			
	getHeader: function(headerName) {
		return this.headers[headerName] || false;
	},
	setHeader: function(headerName, headerValue) {
		this.headers[headerName] = headerValue;
	},
	
	getXml: function() {
		if(!this.xmlhttp.responseXML || !this.xmlhttp.responseXML.hasChildNodes()) {
			return this.getText();
		}
		return this.xmlhttp.responseXML;
	},
	getText: function() {
		return this.xmlhttp.responseText;
	}
}

/* 
	Clean up running HTTP Requests, when the Page is left 
	Returning void stops the default confirmBox to show up !
*/
var cleanUpXmlHttpRequests = function() {
	if(!window.xmlHttpObjList) {
		return void(0);
	}
	
	for(key in xmlHttpObjList) {
		xmlHttpObjList[key].onreadystatechange = function() { };
		xmlHttpObjList[key].abort();
	}
	
	return void(0);
}

if(window.Events) {
	Events.add(window, "beforeunload", cleanUpXmlHttpRequests);
} else {
	window.onbeforeunload = cleanUpXmlHttpRequests;
}