/*  Ajaxcall
 *  Autor: Pau Ruiz Pérez    Fecha: 2006-11-21
 *  Inspiraciones: Ajaxination, ajax.js (no se autor)
 *  Modificaciones: Detección IE/Mozilla, carga simultanea de varios DIV
 * 
 * Para ocultar/mostrar un DIV:    
 * elem.style.display = checked ? "block" : "none";
 * 
 * Known issues: No funciona el POST
 *
 * Funciones:
 *  ajaxcall
 *  createXMLHttpRequest
 *  dhtmlLoadScript
 *  TagHandler
 *  responseHandler
/*--------------------------------------------------------------------------*/

var ajax = createXMLHttpRequest(); 
var contentHandler = new TagHandler(null); 
var ArrAjaxQueue = new Array();

function ajaxcall(param, tagName, url, mode){ 
// You can even pass the action mode = post/get  and act is the parameter u wanted to pass with the url.
	var i;
	if (mode==null) mode = 'get';
	//alert(ajax.readyState & ~4);
	if ((ajax.readyState & ~4) == 0){ // Solo en estado 0 (inicial) o 4 (finalizado)
		if (param!=null){
		var StrTmp = param;
		var StrParam = '';
		var ArrTmp, ArrTmp2;

			ArrTmp = param.split(':::');
			for (i=0; i<ArrTmp.length; i++){
				ArrTmp2 = ArrTmp[i].split('::');
				if(ArrTmp2.length>1)
					StrParam = StrParam + ArrTmp2[0].concat('=').concat(ArrTmp2[1]) + '&';
			}
			StrParam = StrParam.substring(0, StrParam.length - 1);
			url += '?' + StrParam;
		}
		contentHandler.tagName = tagName;
		ajax.open(mode, url);
		ajax.onreadystatechange = responseHandler;
//	ajax.AjaxRequestBegin = responseHandler;
		ajax.send(null);
	}else{ // Si no encolamos las peticiones para utilizarlas después.
		ArrAjaxQueue.push(new Array(param, tagName, url, mode));
	}
}

function createXMLHttpRequest(){
	//	Usuario inteligente...
	if (window.XMLHttpRequest) {
		try { return new XMLHttpRequest(); } catch(e) {}
	//		y usuario de Internet Explorer Windows
	} else if (window.ActiveXObject) {
		// No funciona dinámicamente más que el genérico.
		// Primero probamos con la version 5.0 (El generico Microsoft.XMLHTTP nunca seleccionara versiones 4 ó 5)
		//try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch (e) {}
		// Después con la versión 5.0
		//try { return new ActiveXObject("Msxml2.XMLHTTP.5.0"); } catch (e) {}
		// Después con la versión 4.0
		//try { return new ActiveXObject("Msxml2.XMLHTTP.4.0"); } catch (e) {}
		try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
	}
	alert("XMLHttpRequest not supported");
	return null;
//  try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {}
}

// dhtmlLoadScript -> Carga un fichero javascript como código para su ejecución
function dhtmlLoadScript(url){
var e = document.createElement("script");
	e.src = url;
	e.type = 'text/javascript';
	document.getElementsByTagName("head")[0].appendChild(e);
}

function TagHandler(tagName){
	//var tagName;
	return tagName;
}

function responseHandler(){

	//alert(contentHandler.tagName);
	if(ajax.readyState == 0) { document.getElementById(contentHandler.tagName).innerHTML = "<h3><img src='/img/loading.gif' alt='Loading' />Enviando petici&oacute;n...</h3>"; }
	else if(ajax.readyState == 1) { document.getElementById(contentHandler.tagName).innerHTML = "<h3><img src='/img/loading.gif' alt='Loading' />Conexión establecida...</h3>"; }
	else if(ajax.readyState == 2) { document.getElementById(contentHandler.tagName).innerHTML = "<h3><img src='/img/loading.gif' alt='Loading' />Enviando respuesta...</h3>"; }
	else if(ajax.readyState == 3) { document.getElementById(contentHandler.tagName).innerHTML = "<h3><img src='/img/loading.gif' alt='Loading' />Recibiendo respuesta...</h3>"; }
	else if(ajax.readyState == 4) {
		if(ajax.status == 200){
			var updateContent = ajax.responseText;
			if(updateContent) {
				var match;
				var re = /<script.*?>(.*?)<\//igm;
				// Actualizamos contenido
				document.getElementById(contentHandler.tagName).innerHTML = updateContent;
				// Ejecutamos el código Javascript interno
				while ((match = re.exec(updateContent))!=null)
					eval(match[1]);
			}
		}else if(ajax.status == 404){
			// Retrive error message or redirect to error page
			document.getElementById(contentHandler.tagName).innerHTML = "File not found";
		}else{
			document.getElementById(contentHandler.tagName).innerHTML = "There was a problem with server connection.";
		}
		if(ArrAjaxQueue.length > 0){
		var AjaxTmp;
			AjaxTmp = ArrAjaxQueue.shift(); // Modificado de pop a shift para que no se reordenen en el array pop - ultimo, shift - primero
			ajaxcall(AjaxTmp[0], AjaxTmp[1], AjaxTmp[2], AjaxTmp[3]);
		}
	}
}

// *********************************
// * Permite ejecutar javascript en el código cargado dinámicamente
// *********************************
//function setAndExecute(divId, innerHTML){
//  var div = document.getElementById(divId);
//  div.innerHTML = innerHTML;
//  var x = div.getElementsByTagName("script"); 
//  for(var i=0;i<x.length;i++)
//    eval(x[i].text); // x[0] Solo tiene item y namedItem
//  //document.getElementsByTagName('script')[0].setAttribute("src", thelink)
//}
