// JavaScript Document
/***
 *	Crea una instancia del componente ajax
 *	@example:
 *		function f1(intNumStatus){
 *			//mostrar los estados
 *			alert(intNumStatus);//imprime de 0 a 4
 *	    }
 *		function f2(objResponse){
 *      	//muestra la informacion devuelta por el proceso
 *			alert(objResponse);
 *		}
 *		function f3(intNumError){
 *	 		//muestra el error si lo hubo
 *			alert(intNumError);//imprime el numero de error
 *		}
 *
 *		var obj= Ajax();
 *		obj.sendData("index.php","&name=txtName&app=txtApp",f1,f2,f3);
 *		
 *		Suponiendo que existe un text de nombre txtName y un text de nombre txtApp
 *		obj.send intenta procesar la informacion en index.php
 *		Los estados de este proceso se pueden ir visualizando en la funcion f1
 *		Si salio todo ok, se puede mostrar la informacion devuelta en f2
 *		Si hubo un error se puede mostrar el mensaje de error en f3
 *		
 *		f1, f2 y f3 tienen una estructura que tiene que ser respetada.
 *		Puede ver el formato de estas funciones en sendData_
 *
 */

 function Ajax(){
	  this.objAjax=false;
	  this.fState=null;
	  this.fSuccess=null;
	  this.fError=null;
	  
	  this.sendData=sendData_;
	  
	  //init
	  try {
		  this.objAjax = new ActiveXObject("Msxml2.XMLHTTP");
	  }catch (exception1){
		 try {
			this.objAjax = new ActiveXObject("Microsoft.XMLHTTP");
		 }catch (exception2) {
			this.objAjax = false;
		 }
	  }
	  if (!this.objAjax && typeof XMLHttpRequest!='undefined')
			this.objAjax = new XMLHttpRequest();
	  return this;		
 }



/**
 * sendData_ envia informacion en background
 * @param
 *		url - la url que procesa la informacion en background
 *		vars - las variables que se pasan por la url
 *		fState - funcion que mostrara los estados del proceso.
 *				 Tiene que ser de la forma func_name(intNumStatus)
 *		fSuccess - funcion que se invocara si sale todo ok.
 *				 Tiene que ser de la forma func_name(objResponse)
 *				 Donde objResponse es la informacion que devuelve el proceso
 *		fError - funcion que se invocara si hubo algun error en la pagina.
 *				 Tiene que ser de la forma func_name(intNumError)
 */
function sendData_(url,vars,fState,fSuccess,fError){
	try{
		
		
		this.fState=fState;
		this.fSuccess=fSuccess;
		this.fError=fError;
		
		if(this.fState!= null && this.fState.length!=1)
			throw 0xFFFF;
			
		if(this.fSuccess!= null && this.fSuccess.length!=1)
			throw 0xFFFE;
		
		if(this.fError!= null && this.fError.length!=1)
			throw 0xFFFD;
			
		arrayData=new Array(2);
		arrayData=url.split("?");
		strUrl=arrayData[0]+"?";
		
		if(this.fState!=null) this.fState(0);
		this.objAjax.open("POST",strUrl,true);
		this.objAjax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		this.objAjax.onreadystatechange=handlerHttpResponse.create(this); 
		this.objAjax.send(vars);
	}catch(e){
		if(e==0xFFFF)
			alert("Error sendData() :: Funcion que mostrara estados debe tener un unico parametro");
		else if(e==0xFFFE)
			alert("Error sendData() :: Funcion que se invocara si hubo exito debe tener un unico parametro");
		else if(e==0xFFFD)
			alert("Error sendData() :: Funcion que se invocara si hubo un error debe tener un unico parametro");	
		else
			alert("Error sendData() :: Ajax no soportado");
	}
}

/**
 *	handlerHttpResponse es el manejador de los eventos del explorer, por defecto.
 *	Invocada por defecto por send.
 */
handlerHttpResponse = {
	create: function (ajaxObj){
			return function(){
				try{
					intState=ajaxObj.objAjax.readyState;
					switch(intState){
						case 1:
						case 2:
						case 3:if(ajaxObj.fState!=null) ajaxObj.fState(intState);
							   break;
						case 4:	if(ajaxObj.fState!=null) ajaxObj.fState(intState);
								if(ajaxObj.objAjax.status==200)
									if(ajaxObj.fSuccess!=null) ajaxObj.fSuccess(ajaxObj.objAjax.responseText);
								else
									if(ajaxObj.fError!=null) ajaxObj.fError(ajaxObj.objAjax.status);
								break;	
						default:
					}//fin del swicth
				}catch(e){
					alert("Error handlerHttpResponse() :: Ajax no soportado");
				}
			};
	}
}