/** Net - XMLHTTP Interface - bfults@gmail.com - 2006-02-05                 **
 ** Code licensed under Creative Commons Attribution-ShareAlike License     **
 ** http://creativecommons.org/licenses/by-sa/2.5/                          **/

Net = function(){
	this.Request = Net._createRequestObject();
}

Net.get = function(sURL, sVars, fnCallback, fnError){
	var tArg = typeof sVars;
	switch (tArg)	{
		case "string":
		sVars = '?'+ sVars;
		break;
		case "function":
		fnError = fnCallback;
		fnCallback = sVars;
		sVars = '';
		break;
		case "object":
		sVars = '?'+ Net._serializeObject(sVars);
		break;
		default:
		sVars = '';
	}
	fnError = fnError || Net._fnErrorDefault;
	try {
		var N = new Net();
		N.Request.open("GET", sURL + sVars, true);
		N._setCallback(fnCallback, fnError);
		N.Request.send('');
	}
	catch (e) { fnError("initialization"); }
	return true;
}

Net.post = function(sURL, sVars, fnCallback, fnError){
	var tArg = typeof sVars;
	switch (tArg)	{
		case "string":
		break;
		case "object":
		sVars = Net._serializeObject(sVars);
		break;
		default:
		sVars = '';
	}
	fnError = fnError || Net._fnErrorDefault;
	try {
		var N = new Net();
		N.Request.open("POST", sURL, true);
		N._setCallback(fnCallback, fnError);
		N.Request.setRequestHeader("Method", "POST "+sURL+" HTTP/1.1");
		N.Request.setRequestHeader("Content-Type",
			"application/x-www-form-urlencoded");
		N.Request.send(sVars);
	}
	catch (e) { fnError("initialization"); }
	return true;
}

Net._fnErrorDefault = function(sType, Request){
	switch (sType) {
		case "timeout":
		showAlert("Venci&oacute; el temporizador");
		break;
		case "initialization":
		showAlert("Error de inicializaci&oacute;n");
		break;
		default:
		showAlert("Error");
	}
}

Net._serializeObject = function(oFrom){
	var aTemp = [];
	for (var i in oFrom){
		aTemp.push(encodeURIComponent(i) +"="+ encodeURIComponent(oFrom[i]));
	}
	return aTemp.join('&');
}

Net.prototype._setCallback = function(fnCallback, fnError){
	this.Request.onreadystatechange = (function (oNet)	{
		return function()		{
			if (oNet.Request.readyState == 4){
				window.clearTimeout(oNet.timeout);

				if (oNet.Request.status === undefined
					|| oNet.Request.status === 0
					|| (oNet.Request.status >= 200 && oNet.Request.status < 300)
					|| oNet.Request.status == 304){
					fnCallback(oNet.Request);
				} else {
					fnError("other", oNet.Request);
				}
			}
		}
	})(this);

	this.timeout = window.setTimeout((function(oNet) {
		return function() {
			oNet.Request.onreadystatechange = function() {};
			oNet.Request = null;
			fnError("timeout"); }})(this), 30000);
}

Net._createRequestObject = function(){
	var xmlhttp;
	try {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); 
	} catch (e) {
		try {
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (e) {
			try {
				xmlhttp = new XMLHttpRequest();
			} catch (e) {
				xmlhttp = null;
			}
		}
	}
	return xmlhttp;
}