/* ======= Net: Network ================================= */
Net = new Object();
 
Net.READY_STATE_UNINITIALIZED=0; 
Net.READY_STATE_LOADING=1; 
Net.READY_STATE_LOADED=2; 
Net.READY_STATE_INTERACTIVE=3; 
Net.READY_STATE_COMPLETE=4;

 
 /* ======= AJAX: Basic Asyncronius JavaScript XML ================================= */
Net.AJAX = function(url, funcion, funcionError){
	 this.url = url;
	 this.req = null;
	 this.onload = funcion;
	 this.onerror = (funcionError) ? funcionError : this.defaultError;
	 this.loadXmlContent(url);
 }
 
Net.AJAX.prototype = {
	 loadXmlContent : function(url) {
		 if (window.XMLHttpRequest) {
		      this.req = new XMLHttpRequest(); 
		 } else if (window.ActiveXObject) {
			  this.req = new ActiveXObject("Microsoft.XMLHTTP"); 
		 } 
		
		 if(this.req) { 
			  try {
			       var loader = this; 
				   this.req.onreadystatechange = function() { 
				        loader.onReadyState.call(loader); 
				   } 
				   this.req.open('GET', url, true);
				   this.req.send(null);
			  } catch (err) { 
			       this.onerror.call(this);
			  } 
		 }
	 },
	 onReadyState: function() {
		 var req = this.req; 
		 var ready = req.readyState; 
		 if (ready == Net.READY_STATE_COMPLETE) { 
		      var httpStatus = req.status; 
			  if(httpStatus == 200 || httpStatus == 0) { 
			       this.onload.call(this);
			  }else { 
				   this.onerror.call(this);
			  } 
		 }
	 },
	 defaultError: function() {
		 alert("Se ha producido un error al obtener los datos");
	 }
 }
 
 /* ======= AJAX: Extend Asyncronius JavaScript XML ================================= */
Net.AJAXExtend = function(url, funcion, funcionError, metodo, parametros, contentType, sincrona){
	 this.url = url;
	 this.req = null;
	 this.onload = funcion;
	 this.onerror = (funcionError) ? funcionError : this.defaultError;
	 this.loadXMLContent(url, metodo, parametros, contentType, sincrona);
 }
 
Net.AJAXExtend.prototype = {
	 loadXMLContent: function(url, metodo, parametros, contentType, sincrona) {
		 if (window.XMLHttpRequest) {
		      this.req = new XMLHttpRequest(); 
		 } else if (window.ActiveXObject) {
			  this.req = new ActiveXObject("Microsoft.XMLHTTP"); 
		 } 
		
		 if(this.req) { 
		      try {
			       var loader = this;
				   this.req.onreadystatechange = function() { 
				        loader.onReadyState.call(loader); 
			       } 
				   this.req.open(metodo, url, (sincrona===false)?false:true);
				
				   if(contentType) {
				        this.req.setRequestHeader("Content-Type", contentType);
				   }
				   this.req.send(parametros);
			  } catch(err) { 
			       this.onerror.call(this);
			  } 
		 }
	 },
	 onReadyState: function() {
		 var req = this.req; 
		 var ready = req.readyState; 
		 if(ready == Net.READY_STATE_COMPLETE) { 
		      var httpStatus = req.status; 
			  if(httpStatus == 200 || httpStatus == 0) { 
			       this.onload.call(this);
			  }else { 
			       this.onerror.call(this);
			  } 
		 }
	 },
	 defaultError: function() {
		 alert("Se ha producido un error al obtener los datos");
	 }
 }
 
  /* ======= Event: Manipulate events ================================= */
Event = {
	 addEventHandler : function(elTarget, tipoEvento, funcion){
		 if(elTarget.addEventListener) {
			 elTarget.addEventListener(tipoEvento, funcion, false);
		 }else if(elTarget.attachEvent) {
			 elTarget.attachEvent("on"+tipoEvento, funcion);
		 }else {
			 elTarget["on"+tipoEvento] = funcion;
		 }
	 },
	 removeEventHandler : function(elTarget, tipoEvento, funcion){
		 if(elTarget.removeEventListener) { // navegadores DOM
		     elTarget.removeEventListener(tipoEvento, funcion, false);
	     }else if(elTarget.detachEvent) { // Internet Explorer
			 elTarget.detachEvent("on"+tipoEvento, funcion);
	     }else { // otros navegadores
			 elTarget["on"+tipoEvento] = null;
	     }
	 },
	 getEvent : function(){
		 if(window.event) { // Internet Explorer
		      return this.formatEvent(window.event);
	     } else { // navegadores DOM
		      return EventUtil.getEvent.caller.arguments[0];
	     }
	 },
	 formatEvent : function(elEvento){
		 elEvento.charCode = (elEvento.type=="keypress") ? elEvento.keyCode : 0;
		 elEvento.eventPhase = 2;
		 elEvento.isChar = (elEvento.charCode > 0);
		 elEvento.pageX = elEvento.clientX + document.body.scrollLeft;
		 elEvento.pageY = elEvento.clientY + document.body.scrollTop;
		 elEvento.preventDefault = function() {
			  this.returnValue = false;
		 };
		 if(elEvento.type == "mouseout") {
		      elEvento.relatedTarget = elEvento.toElement;
		 }else if(elEvento.type == "mouseover") {
			  elEvento.relatedTarget = elEvento.fromElement
		 }
		 elEvento.stopPropagation = function() {
			  this.cancelBuble = true;
		 };
		 elEvento.target = elEvento.srcElement;
		 elEvento.time = (new Date).getTime();
		
	     elEvento.isAlphanumeric = (elEvento.keyCode >= 48 && elEvento.keyCode <= 57 ) ||  ( elEvento.keyCode >= 65 && elEvento.keyCode <= 90 );
	     return elEvento;
	 }
 };
 
 function addOnload(newFunction){
	var oldOnload = window.onload;
	if(typeof oldOnload == "function"){
		window.onload = function(){
			if(oldOnload){
				oldOnload();
			}
			newFunction();
		}
	}else{
		window.onload = newFunction;
	}
}