
//// CONSTANTS ////

var DEFAULT_HANDLER_SUFIX = "Default";


//// VARIABLES ////

// Taula de referencia externa per objectes XmlHttp. 
// Contenidor d'entrades i sortides de les distintes crides.
var mTxh = new Map();


////////////////////////////////////////////////////////////////////////////////////////////////

//// XmlHttp ////

function XmlHttp() {
	this.urlc = null;
	this.xmlhttp = null; 
	try { 
		this.xmlhttp = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
	} catch (e) { 
		//alert("ERR XmlHttp : "+e);
	}
	this.setURL(arguments[0], arguments[1], arguments[2]);
}

// SET
XmlHttp.prototype.setURL = function() {
	var url = arguments[0];
	var type = arguments[1];
	var interval = arguments[2];
	this.urlc = new URLCached(url, type, interval);
}

// GET
XmlHttp.prototype.getURL = function() {
	return this.urlc.getURL();
}

// 0 : NULL		{ crida sincrona al capturador per defecte  } | 
//	   String	{ crida sincrona a un capturador especific }
// ------ usos ----------
// 0=NULL		: crida sincrona al capturador per defecte
// 0=String		: crida sincrona a un capturador especific
XmlHttp.prototype.doGet = function() {
	var handlerSufix = arguments[0]==null ? DEFAULT_HANDLER_SUFIX : arguments[0];
	try {
		this.xmlhttp.open("GET", this.getURL(), false);
		this.xmlhttp.send(null);
	} catch (e) { 
		//alert("ERR XmlHttp : "+e);
	}
	eval("synchronousHandler" + handlerSufix + "(this.xmlhttp)");
}

// 0 : NULL		{ crida sincrona al capturador per defecte  } | 
//	   String	{ crida [sincrona|asincrona] a un capturador especific } |
//     Boolean	{ crida [sincrona|asincrona] al capturador per defecte }
// 1 : NULL		{ per defecte false:sincron } | 
//     Boolean	{ false:sincron | true:asincron }
// ------ usos ----------
// 0=String		+ 1=*		: crida [sincrona|asincrona] a un capturador específic
// 0=Boolean	+ 1=*		: crida [sincrona|asincrona] al capturador per defecte
XmlHttp.prototype.doPost = function() {
	var handlerSufix = arguments[0];
	var bAsync = arguments[1];
	if ( handlerSufix!=null && (handlerSufix==true || handlerSufix==false) ) {
		bAsync = handlerSufix;
		handlerSufix = DEFAULT_HANDLER_SUFIX;
	} else {
		handlerSufix = handlerSufix==null ? DEFAULT_HANDLER_SUFIX : handlerSufix;
		bAsync = bAsync!=null && bAsync;
	}
	try { 
		if (bAsync) { 
			eval("this.xmlhttp.onreadystatechange = asynchronousHandler" + handlerSufix);
		}
		this.xmlhttp.open("POST", this.getURL(), bAsync);
		this.xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=ISO-8859-1");
		this.xmlhttp.send("");
	} catch (e) { 
		//alert("ERR XmlHttp : "+e);
	}	
	if (!bAsync) { 
		eval("synchronousHandler" + handlerSufix + "(this.xmlhttp)");
	}
}

//// MÈTODES ////

// Capturador sincron per defecte
// Es poden definir diversos ('synchronousHandlerXXX')
function synchronousHandlerDefault(req) {

	if (req.readyState==4 && req.status==200) {

		var buff = "synchronousHandlerDefault [ req:" + req;
		buff += ", readyState:" + req.readyState + ", status:" + req.status;
		buff += ", statusText:" + req.statusText + " ]\n";
		buff += "handled!\n";

		// S'estableix 'XXX.return' com la resposta del mètode (opcional)
		mTxh.put("Default.return", buff);

		alert(buff);

	}

}

// Capturador asincron per defecte
// Es poden definir diversos ('asynchronousHandlerXXX')
function asynchronousHandlerDefault() {

	// Cal establir 'XXX.txh' com objecte XmlHttp extern 
	var req = mTxh.get("Default.txh").xmlhttp;

    if (req.readyState==4 && req.status==200) {
		var result = req.responseXML;
		var buff = "asynchronousHandlerDefault [ req:" + req;
		buff += ", readyState:" + req.readyState + ", status:" + req.status;
		buff += ", statusText:" + req.statusText + " ]\n";
		buff += "handled!\n";

		// S'estableix 'XXX.return' com la resposta del mètode (opcional)
		// NO es garanteix el retorn en cas de ser asincron!
		mTxh.put("Default.return", buff);

		alert(buff);
	}
}

/* 

// Exemple de mètode que fa ús de crides sincrones i asincrontes 'Default'

MyClass.prototype.getDefault = function() {

	var url = arguments[0];
	
	// Creació d'objecte XmlHttp
	mTxh.put("Default.txh", new XmlHttp(url));
	
	// Crida [ sync | async ]
	mTxh.get("Default.txh").doPost("Default");  // sync
	//mTxh.get("Default.txh").doPost("Default", true); // async

	// Resposta del mètode (NO es garanteix el retorn en cas de ser asincron!)
	return mTxh.get("Default.return");

}

...

// Ús

var x = new MyClass();
alert(x.getDefault("http://www.domain.es/one.xml"));

*/
