/*
clase Xajax

//EVENTOS
PreRequest()
Error()
Callback()

//REQUEST
SendGet(url, asincrono)
SendPost(url, asincrono)
SendForm(form, url, asincrono)
Abort()

//FORMATOS SOPORTADOS
isText()//default=true
isJson()//default=false
isAjaj()//default=false
AjajResponse(idObj);

//PARAMETROS
setParameter(name,value)
getParameter(n)
dropParameter(n)
clearParameters()

//PROPIEDADES
getRespuesta()

//ERRORES
hayError()
getError()
clearError()
*/

Xajax=function(){
//VARIABLES
	this._xmlHttpRequest = null;
	this._parametros = null;
	this._errores = null;
	this._isText = true;
	this._isJson = false;
	this._isAjaj = false;
	this._AjajResponse=null;
	this._charset = null;
//LLAMADA AL CONSTRUCTOR
	this.__initialize();
}

Xajax.prototype = {
	//EVENTOS
		PreRequest : function(){},
		Error : function(){},
		Callback : function(){},
	//CONSTRUCTORES
		__initialize : function(){
			this._parametros = new Array();
			this._charset = String("UTF-8");
			this._xmlHttpRequest = this.__xmlHttpRequestInit();
			if(this._xmlHttpRequest == null) return(false);
			if(this._xmlHttpRequest.overrideMimeType) this._xmlHttpRequest.overrideMimeType('text/xml');
			return(true);
		},
		__xmlHttpRequestInit : function(){
			var xmlHttpRequest = null;
			try{xmlHttpRequest = new XMLHttpRequest();
			}catch(seraMicrosoft){
				try{xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
				}catch(seraViejoMicrosoft){
					try{xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
					}catch(error){
					}
				}
			}
			return xmlHttpRequest;
		},
	//REQUEST
		__ControlStateChange : function(){
			if(this._xmlHttpRequest.readyState == 4){
				if(this._xmlHttpRequest.status >= 400 && this._xmlHttpRequest.status < 500){
					this.__setErrors("Error del Request / Sintaxis Incorrecta");
				}else if(this._xmlHttpRequest.status >= 500 && this._xmlHttpRequest.status < 600){
					this.__setErrors("Error del Servidor");
				}
				if(!this.hayError()){
					this.Callback();//EVENTO
					if(this._isAjaj && this._AjajResponse!=null){
						document.getElementById(this._AjajResponse).innerHTML=this.getRespuesta();
					}
				}
			}
		},
		__Request : function(method, url, asincrono){
			var args="",cant;
			method=String(method).toUpperCase();
			url=String(url);
			this.PreRequest();//EVENTO
			if(this._parametros!=null){
				args = this.__ParametrosTraer();
				cant=this._parametros.length;
			}
			if(method == 'GET'){
				if(url.indexOf('?') == -1){//si no tiene ningun parametro
					url += '?' + args;
				}else if(url.indexOf('?')==url.length-1){//si no tiene ningun parametro pero tiene el '?' al final
					url += args;
				}else if(url.indexOf('&')==url.length-1){//si ya tiene parametro/s y ademas ya le pusieron el '&' al final
					url += args;
				}else{//ya tiene parametros pero falta el '&'
					url += '&' + args;
				}
				args=null;
			}else if(method == 'POST'){
				//incluir verificacion de navegadores, para ver cuales soportan el asincrono o no, cuando se usa el metodo post
			}else{
				this.__setErrors("Methods soportados: GET y POST.");
				return;
			}
			/************************************************************/
			this._xmlHttpRequest.open(method, url, asincrono);
			if(method == 'POST'){
				this._xmlHttpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
				this._xmlHttpRequest.setRequestHeader("Content-length", cant);
			}
			var self = this;
			this._xmlHttpRequest.onreadystatechange = function(){
				self.__ControlStateChange();
			}
			this._xmlHttpRequest.send(args);
		},
		SendGet : function(url, asincrono){
			this.__Request("GET",url, asincrono);
		},
		SendPost : function(url, asincrono){
			this.__Request("POST",url, asincrono);
		},
		SendForm : function(form, url, asincrono){
			for(var i=0; i < form.elements.length ; i++){
				if(form.elements[i].name && String(form.elements[i].name)!=''){
					this.setParameter(form.elements[i].name,form.elements[i].value);
				}
			}
			this.__Request(form.method, url, asincrono);
		},
		getRespuesta : function(){
			if(this.hayError()){
				return(this._xmlHttpRequest.status + ": " + this._errores);
			}else{
				if(this._isText || this._isAjaj){
					return(this._xmlHttpRequest.responseText);
				}else if(this._isJson){
					eval("var obj=" + this._xmlHttpRequest.responseText + ";");
					return(obj);
				}
			}
		},
		Abort : function(){
			this._xmlHttpRequest.abort();
		},
	//FORMATOS SOPORTADOS
		isText : function(){
			this._isText = true;
			this._isJson = false;
			this._isAjaj = false;
		},
		isJson : function(){
			this._isText = false;
			this._isJson = true;
			this._isAjaj = false;
		},
		isAjaj : function(){
			this._isText = false;
			this._isJson = false;
			this._isAjaj = true;
		},
		AjajResponse : function(domObjId){
			this._AjajResponse=domObjId;
		},
	//PARAMETROS
		__ParametrosTraer : function(){
			var a = "";
			for(var i in this._parametros){
					if(a != "") a += "&";
					a += this._parametros[i].name + "=" + escape(this._parametros[i].value);
			}
			return a;
		},
		__createParameter : function(n,v){
			return({name:String(n),value:String(v)});//estan en ingles para no perder la costumbre XD
		},
		setParameter : function(n,v){//sino existe lo creo, si ya eistia lo sobreescribo
			var pos=this._parametros.length;
			n=String(n);
			for(var i=0;i<this._parametros.length;i++){
				if(this._parametros[i].name.toLowerCase()==n.toLowerCase()) pos=i;
			}
			this._parametros[pos] = this.__createParameter(n,v);
		},
		getParameter : function(n){
			for(var i=0;i<this._parametros.length;i++){
				if(this._parametros[i].name.toLowerCase()==n.toLowerCase()) return(this._parametros[i].value);
			}
			return(null);//no existia dicho parametro
		},
		dropParameter : function(n){
			for(var i=0;i<this._parametros.length;i++){
				if(this._parametros[i].name.toLowerCase()==n.toLowerCase()){
					var val=this._parametros[i].value;
					this._parametros.splice(i,1);
					return(val);
				}
			}
			return(null);//no existia dicho parametro
		},
		clearParameters : function(){
			this._parametros = new Array();
		},
	//ERRORES
		__setErrors : function(e){
			if(this._errores==null){this._errores=e;}else{this._errores+=e;}
			this.Error();//EVENTO
		},
		hayError : function(){
			if(this._errores != null){return true;}else{return false;}
		},
		getError : function(){
			return this._errores;
		},
		clearError : function(){
			this._errores=null;
		}
}

