SimpleFetch = {
	requests		: 	{}
}

SimpleFetch.FetchAndEval = function (url) {
	var xro = SimpleFetch.BuildRequest(url);
	if (xro) {
		xro.eventRequestRecieved = SIMPLEFETCH_HANDLEEVALRETURN;
		xro.Open();
	}
}

SimpleFetch.FetchAndExecuteFunction = function (url, func, postData) {
	var xro = SimpleFetch.BuildRequest(url, postData);
	if (xro) {
		xro.eventRequestRecieved = func;
		xro.Open();
	}
}

SimpleFetch.BuildRequest = function (url, postData) {
	var obj = {
		eventSocketOpened		:	function(){},
		eventRequestSent		:	function(){},
		eventRequestIncomming	:	function(){},
		eventRequestRecieved	:	function(){},
		eventRequestError		:	function(){},
		Open					: 	function(){},
		requestedUrl				: 	url,
		postData				: 	postData,
	 	
		reqObject				: 	null
	}
	
	if (window.XMLHttpRequest) { // Non-IE browsers
		obj.reqObject = new XMLHttpRequest();
	} else if (window.ActiveXObject) { // IE
		obj.reqObject = new ActiveXObject("Microsoft.XMLHTTP");
	}
	if (obj.reqObject) {
		//req.onreadystatechange = SIMPLEFETCH_READYSTATECHANGE;
		obj.reqObject.onreadystatechange = function () {
			switch (obj.reqObject.readyState) {
				// usually, these steps happen too fast to see
				case 1: //Request: Open (send not called)
					obj.eventSocketOpened();
					break;
				case 2: //Request: Sent (send called)
					obj.eventRequestSent();
					break;
				case 3: //Request: Receiving (some content received)
					obj.eventRequestIncomming();
					break;
				// The only case we usually care about is 4 (Complete)
				case 4:
					if (obj.reqObject.status == 200) { // OK response
						obj.responseText = obj.reqObject.responseText;
						obj.responseXML = obj.reqObject.responseXML;
						obj.eventRequestRecieved();
					} else {
						obj.eventRequestError();
					}
					break;
			}
		}
	}
	
	obj.Open = function () {
//		try {
			if (this.postData) {
				if (this.postData.nodeType == 1) var formData = SimpleFetch._getFormData(postData);
				else var formData = postData;
				
				this.reqObject.open("POST", this.requestedUrl, true);
				this.reqObject.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
				this.reqObject.setRequestHeader("Content-length", formData.length);
				this.reqObject.setRequestHeader("Connection", "close");
				this.reqObject.send(formData);
			} else {
				this.reqObject.open("GET", this.requestedUrl, true);
				this.reqObject.send('');
			}
//		} catch (e) {
//			alert(e);
//		}
			
			
	}
	return obj;
}

SimpleFetch._getFormData = function (form) {//needs more form type support
	var data = '';
	for (var i=0;i<form.elements.length;i++) {
		var e = form.elements[i];
		switch (e.type) {
			case 'text':
			case 'hidden':
				data += e.name + '=' + (encodeURI(e.value)) + '&';
				break;
			case 'checkbox':
				if (e.checked) data += e.name + '=' + (encodeURI(e.value)) + '&';
				else data += e.name + '=&';
				break;
			case 'radio':
				if (e.checked) data += e.name + '=' + (encodeURI(e.value)) + '&';
				break;
		}
	}
	return data;
}

/*
SimpleFetch._getRequestObject = function () {
	var req;
	if (window.XMLHttpRequest) { // Non-IE browsers
		req = new XMLHttpRequest();
	} else if (window.ActiveXObject) { // IE
		req = new ActiveXObject("Microsoft.XMLHTTP");
	}
	if (req) {
		//req.onreadystatechange = SIMPLEFETCH_READYSTATECHANGE;
		req.onreadystatechange = function () {
			switch (req.readyState) {
				// usually, these steps happen too fast to see
				case 1: //Request: Open (send not called)
					req.eventSocketOpened();
					break;
				case 2: //Request: Sent (send called)
					req.eventRequestSent();
					break;
				case 3: //Request: Receiving (some content received)
					req.eventRequestIncomming();
					break;
				// The only case we usually care about is 4 (Complete)
				case 4:
					if (req.status == 200) { // OK response
						req.eventRequestRecieved();
					} else {
						req.eventRequestError();
					}
					break;
			}
		}
		return req;
	} else return null;
}
*/

function SIMPLEFETCH_HANDLEEVALRETURN () {
	if (this.getResponseHeader("Content-Type") == "application/x-javascript") eval(this.responseText);
	else alert(this.responseText);
}

/*
function SIMPLEFETCH_OPENCONNECTION_POST (requestedUrl) {
	try {
		this.open("POST", requestedURL, true);
		this.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		this.setRequestHeader("Content-length", this.formData.length);
		this.setRequestHeader("Connection", "close");
		this.send(this.formData);
	} catch (e) {
		alert(e);
	}
}
function SIMPLEFETCH_OPENCONNECTION_GET (requestedUrl) {
	try {
		this.open("GET", requestedURL, true);
		this.send('');
	} catch (e) {
		alert(e);
	}
}
*/
