/**
 * @author Fernando Reig Aparicio
 * @copyright 2006
*/
var myajax_js = true;


function MyAjax(sMethod, sURL, bAsync, responseHandler, queryString, responseType){
	var m_responseType = (!responseType)?'xml':responseType;
	var m_responseHandler = responseHandler;
	var m_responseHandlerParams = new Array();
	var m_xmlHttpRequest = null;
	var m_sMethod = sMethod;
	var m_sURL = sURL;
	var m_bAsync = bAsync;
	var m_queryString = "";
		
	this.setQueryString = 
	function (source){
		var querystring = "ajax=1&";
		for(var k=0; k<arguments.length; k++){
			source = arguments[k];

			if (typeof(source)=="string"){
				querystring+=(source+"&");
				continue;
			}
			var frm = source;
			if (new String(source.tagName).toLowerCase()!="form")
			    var frm = document.forms[0];		

		    var numberElements =  frm.elements.length;
		    var e = null;
		    for(var i = 0; i < numberElements; i++){
		    	e = frm.elements[i];
		    	if ((e.name=='') ||
		    	  ((e.type=="checkbox") && !e.checked))
		    		continue;
	            querystring += (e.name+"="+encodeURIComponent(e.value)+"&");
		    }
		}

	    m_queryString = querystring;	      
	}
	
	this.setHandlerParams = 
	function(/*param0, ...*/){
		var v = [];
		for(var i=0; i<arguments.length;i++)
			v.push(arguments[i]);
		m_responseHandlerParams = v;	
	}
	
	/**
	 * 
	 */
	this.send = 
	function (){
//		alert(m_queryString);
	    //mozilla
	    if(window.XMLHttpRequest){
	        m_xmlHttpRequest = new XMLHttpRequest(  );
	    } else if (window.ActiveXObject){ //iexplorer
	        m_xmlHttpRequest=new ActiveXObject("Msxml2.XMLHTTP");
	        if (! m_xmlHttpRequest){
	            m_xmlHttpRequest=new ActiveXObject("Microsoft.XMLHTTP");
	        }
	    }
		if (m_xmlHttpRequest.overrideMimeType)
			m_xmlHttpRequest.overrideMimeType("text/html; charset=ISO-8859-1");

		//si el navegador soporta AJAX
	    if(m_xmlHttpRequest) {
		    try{
		        //manejador del objeto XMLHttpRequest
		        m_xmlHttpRequest.onreadystatechange = this.responseHandler;

		        if(m_sMethod.toLowerCase() == "post") {
			        m_xmlHttpRequest.open(m_sMethod, m_sURL, m_bAsync);	        	
		            m_xmlHttpRequest.setRequestHeader("Content-Type",
		                    "application/x-www-form-urlencoded; charset=windows-1252");
		            m_xmlHttpRequest.send(m_queryString);
		        }  else {
							        m_xmlHttpRequest.open(m_sMethod, m_sURL+"?"+m_queryString, m_bAsync);
		            m_xmlHttpRequest.send(null);
		        }
				//prompt("",m_sURL+"?"+m_queryString);
		    } catch (errv) {
		        alert(
		        "Lo sentimos, no se pudo contactar con el servidor. "+
		        "Por favor, inténtelo de nuevo en unos instantes.\n"+
		        "Error: "+errv.message);
		    }
	    } else {
	        alert("Su navegador no soporta la tecnología AJAX.");
	    }
	}	
		//manejador por defecto para XMLHttpRequest
		this.responseHandler = 
		function (){
			
		    if(m_xmlHttpRequest.readyState == 4){
				if(m_xmlHttpRequest.status == 404){
					alert("error de XMLHttpRequest: no se encuentra el recurso solicitado ("+m_sURL+").");
				}else
		        if(m_xmlHttpRequest.status == 200){
       				//alert(m_xmlHttpRequest.getAllResponseHeaders(  ));
		            var x = null;
		        	switch(m_responseType){
					case MyAjax.RESPONSE_STRING:
						x = m_xmlHttpRequest.responseText;
						break;
					case MyAjax.RESPONSE_NUMBER:
						x = parseFloat(m_xmlHttpRequest.responseText);
						if (isNaN(x)){
							alert("Error en el tipo de datos obtenido. Se esperaba un número.");
							return null;
						}
						break;
					case MyAjax.RESPONSE_XML:
						x = m_xmlHttpRequest.responseXML;
						break;
					case MyAjax.RESPONSE_BOOL:
						x = (m_xmlHttpRequest.responseText=="true");
						break;
					case MyAjax.RESPONSE_OBJECT:
						var funcion = new Function("return "+m_xmlHttpRequest.responseText); 
						x = funcion();
//						alert(m_xmlHttpRequest.responseText);
						break;
		        	}
					
					if (typeof(m_responseHandler)=='function'){
						m_responseHandlerParams.unshift(x);
						//scan (m_responseHandlerParams);
						m_responseHandler.apply(this, m_responseHandlerParams);
					}
						            
		        } else {
					if (MyAjax.ShowErrors)
						prompt("Ocurrió un error al contactar con el servidor.", sURL+"?"+queryString);
		        }
		    }
		}
		
	this.setQueryString(queryString);		
}

MyAjax.RESPONSE_STRING = "string";
MyAjax.RESPONSE_NUMBER = "number";
MyAjax.RESPONSE_XML = "xml";
MyAjax.RESPONSE_BOOL = "bool";
MyAjax.RESPONSE_OBJECT = "object"; //objeto en formato JSON


/**
 * @param string data
 * @param object params 
 * 		{element: elemento HTML donde cargar el HTML recogido y el id del mismo}
 * @static
 * @public
 */
MyAjax.handlerLoadHTML = 
function (data, element){
	var e = element;

	if (typeof(e)=="string"){
		e = document.getElementById(e);		
	}
	
	if (!e){
		alert("No existe el elemento donde cargar el HTML.");		
	}
	
	e.innerHTML = data;
}

/**
 * @param xml data
 * @param HTMLSelectElement selectElement: elemento SELECT donde cargar las opciones o el id del mismo,
 * @param String valueAttr: nombre del atributo de donde se obtiene el valor de la opcion (option)
 * @param String textAttr: nombre del atributo de donde se obtiene el texto de la opcion (option)}
 * @param String xmlElement: nombre del elemento en el documento xml de donde se obtienen los datos
 * @static
 * @public
 */
MyAjax.handlerChangeSelectOptions = 
function(doc, selectElement, valueAttr, textAttr, xmlElement){
	var e = selectElement;
	
	if (typeof(e)=="string"){
		e = document.getElementById(e);		
	}	
	while(e.hasChildNodes()){
		e.removeChild(e.firstChild);		
	}
	var root;
	if (xmlElement)
		root = xmlElement;
	else
		root = doc.documentElement;
    if(root.hasChildNodes()) {
    	var vNodos = root.childNodes;
    	var option = null;
    	for(var i=0; i<vNodos.length; i++ ){
			if (vNodos[i].nodeType!=1)//si no son elementos
				continue;
    		option = document.createElement("option");
    		option.value = vNodos[i].getAttribute(valueAttr);
    		option.text = vNodos[i].getAttribute(textAttr);
			
			if (navigator.isIExplorer())
				e.add(option, e.options.length);
			else
				e.add(option, null);    		
    	}
		e.disabled=false;
    }else{
    	alert("No se han encontrado datos.");    	
    }
	
}


MyAjax.loadHTML = 
function (sUri, element, loadingClass){
	var v = sUri.split("?");	
	var sUrl = v[0];
	var sQuerystring;
	if (v[1]==undefined)
		sQuerystring = "";
	else
		sQuerystring = v[1];
	if (!element)
		return false;

	if (typeof(element)=="string"){
		element = document.getElementById(element);		
	}		
		
	if (loadingClass!=undefined)
	{
			//alert(element);
		var e1 = document.createElement('div');
		e1.className = loadingClass;
		e1.innerHTML = "CARGANDO...";
		
		element.insertBefore(e1,element.firstChild);
	}	
		
	var x1 = new MyAjax("get", sUrl, true, MyAjax.handlerLoadHTML, sQuerystring, MyAjax.RESPONSE_STRING);
	x1.setHandlerParams(element);
	x1.send();	
	return true;
}

MyAjax.ShowErrors = false;