// dHttp 1.0
// - www.imaginacom.com
// - supports and optimizes multiple simultaneous ajax calls
// - http://www.devguru.com/Technologies/xmldom/QuickRef/xmldom_methods.html

function dHttp(){}
dHttp.init              = function(){
	if(!dHttp.started){
		dHttp.started = true;
		dHttp.xhtList = new Array();
		dHttp.debug   = false;
		dHttp.method  = "POST";
		dHttp.assync  = true;
	}
}
dHttp.call       = function(url, parameters, callback, id, xml){
	(!id)?
		id=false:
		dHttp.abort(id);
	
	dHttp.init();
	var xht     = dHttp._FindAvailableXHT();
	var xhtInst = dHttp._GetXHTInstance(xht, id);
	
	
	xhtInst.open(dHttp.method, url, dHttp.assync);
	xhtInst.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=iso-8859-1');
	xhtInst.onreadystatechange = function(){
		if (xhtInst.readyState == 4){
			dHttp._SetXHTInUse(xht, false);
			if(!xhtInst.status) // Aborted
				return;
			
			if(dHttp.debug)
				alert("[dAjax2 - Response]:\n\n"+xhtInst.responseText);
			
			if(xml)
				callback(xhtInst.responseXML, xhtInst.status);
			else
				callback(xhtInst.responseText, xhtInst.status);
		}
	}
	
	if(!parameters)
		parameters = '';
	
	xhtInst.send(parameters);
	dHttp._SetXHTInUse(xht, true);
	return id;
}
dHttp.callXML    = function(url, parameters, callback, id){
	dHttp.call(url, parameters, callback, id, true);
}
dHttp.abort      = function(id){
	if(!this.started)
		return;
	
	if(id){
		for(var i = 0; i < dHttp.xhtList.length; i++)
			if(dHttp.xhtList[i]['id'] && dHttp.xhtList[i]['id'] == id){
				dHttp.xhtList[i]['instance'].abort();
				break;
			}
	}
	else{
		for(var i = 0; i < dHttp.xhtList.length; i++){
			dHttp.xhtList[i]['instance'].abort();
		}
	}
}
dHttp.loadForm   = function(form_name){
	if(typeof form_name == 'object')
		var foo = form_name;
	else
		var foo = document.forms[form_name]?
			document.forms[form_name]:
			document.getElementById(form_name);
	
	if(!foo){
		aler("Formulário "+form_name+" não encontrado.");
		return false;
	}
	
	var els = foo.elements;
	var obj = false;
	var str = "";
	
	for(var i = 0; i < els.length; i++){
		obj = els[i];
		if(obj.type.toLowerCase() == 'radio'
		|| obj.type.toLowerCase() == 'checkbox'){
			if(!obj.checked)
				continue;
		}
		
		if(i != 0)
			str += "&";
		
		str += encodeURI(obj.name)+"="+encodeURI(obj.value);
	}
	return str;
}

dHttp._CreateXHT        = function(){
	var xhtInst = false;
	if(typeof XMLHttpRequest != "undefined"){
		xhtInst = new XMLHttpRequest();
	}
	
	if(!xhtInst){
		var msxmlhttp = new Array(
			'Msxml2.XMLHTTP.5.0',
			'Msxml2.XMLHTTP.4.0',
			'Msxml2.XMLHTTP.3.0',
			'Msxml2.XMLHTTP',
			'Microsoft.XMLHTTP');
		
		for(var i = 0; i < msxmlhttp.length; i++){
			try{
				xhtInst = new ActiveXObject(msxmlhttp[i]);
			}
			catch(e){
				xhtInst = null;
			}
		}
	}
	
	var lastItem = dHttp.xhtList.length;
	dHttp.xhtList[lastItem] = {};
	dHttp.xhtList[lastItem]['inUse']    = false;
	dHttp.xhtList[lastItem]['instance'] = xhtInst;
	
	return lastItem;
}
dHttp._SetXHTInUse      = function(XHT, inUse){
	dHttp.xhtList[XHT]['inUse'] = inUse;
}
dHttp._GetXHTInstance   = function(XHT, id){
	if(id)
		dHttp.xhtList[XHT]['id'] = id;
	
	return dHttp.xhtList[XHT]['instance'];
}
dHttp._FindAvailableXHT = function(){
	for(var i = 0; i < dHttp.xhtList.length; i++)
		if(!dHttp.xhtList[i]['inUse'])
			return i;
	return dHttp._CreateXHT();
}

