/**
 * Archivo JavaScript con utilidades comunes
 */

var 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;

// ==== Cargador contenidos b�sico ============================================
// Constructor
net.CargadorContenidos = function(url, funcion, funcionError) {
	this.url = url;
	this.req = null;
	this.onload = funcion;
	this.onerror = (funcionError) ? funcionError : this.defaultError;
	this.cargaContenidoXML(url);
}

net.CargadorContenidos.prototype = {
	cargaContenidoXML: 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"
				+ "\n\nreadyState:" + this.req.readyState
				+ "\nstatus: " + this.req.status
				+ "\nheaders: " + this.req.getAllResponseHeaders());
	}
}

// ==== Cargador contenidos completo ==========================================
// Constructor
net.CargadorContenidosCompleto = function(url, funcion, funcionError, metodo, parametros, contentType, sincrona) {
	this.url = url;
	this.req = null;
	this.onload = funcion;
	this.onerror = (funcionError) ? funcionError : this.defaultError;
	this.cargaContenidoXML(url, metodo, parametros, contentType, sincrona);
}

net.CargadorContenidosCompleto.prototype = {
	cargaContenidoXML: 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"
				+ "\n\nreadyState:" + this.req.readyState
				+ "\nstatus: " + this.req.status
				+ "\nheaders: " + this.req.getAllResponseHeaders());
	}
}

// ==== Utilidad para eventos =================================================
var EventUtil = new Object();

EventUtil.addEventHandler = function(elTarget, tipoEvento, funcion) {
	if(elTarget.addEventListener) { // navegadores DOM
		elTarget.addEventListener(tipoEvento, funcion, false);
	} else if(elTarget.attachEvent) { // Internet Explorer
		elTarget.attachEvent("on"+tipoEvento, funcion);
	} else { // resto de navegadores
		elTarget["on"+tipoEvento] = funcion;
	}
};

EventUtil.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 { // resto de navegadores
			elTarget["on"+tipoEvento] = null;
	}
};

EventUtil.getEvent = function() {
	if(window.event) { // Internet Explorer
		return this.formatEvent(window.event);
	} else { // navegadores DOM
		return EventUtil.getEvent.caller.arguments[0];
	}
};

EventUtil.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;
}

