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");
	        }
	    }
		//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);
		        }
		    } 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);
						m_responseHandler.apply(this, m_responseHandlerParams);
					}
						            
		        } else {
		            alert("Ocurrió un error al contactar con el servidor.");
		        }
		    }
		}
		
	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, selectedValue){
	var e = selectElement;
	
	if (typeof(e)=="string"){
		e = document.getElementById(e);		
	}
	while(e.hasChildNodes()){
		e.removeChild(e.firstChild);		
	}

   	var option = null;	
	if (doc.documentElement){
		var root;
		if (xmlElement)
			root = xmlElement;
		else
			root = doc.documentElement;
	    if(root.hasChildNodes()) {
	    	var vNodos = root.childNodes;

	    	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.");    	
	    }
	}else{
		for(var key in doc){
			option = document.createElement("option");
			option.value = key;
			option.text = doc[key];
			//alert(key+"="+doc[key]);
			if (navigator.isIExplorer())
				e.add(option, e.options.length);
			else
				e.add(option, null);    						
		}
	}
	if (typeof(selectedValue)!="undefined"){
		e.value=selectedValue;

	}
	
}
