/*
 * Static Class VentanaModal
 * 
 * Creado por Victor Manuel Merino Martinez
 * Version: 1.3
 * Fecha: 15/04/2009
 *
 *
 * Metodos "publicos":
 *		- getInstancia()
 *		- setSize(Number: ancho, Number: alto)
 *		- setClaseVentana(String: nombreClase)
 *		- setSombra(Boolean: sombra)
 *		- setSombraSize(Number: sombraSize)
 *		- setScrollPadre(Boolean: spadre)
 *		- setSeguimientoScroll(Boolean: sScroll)
 *		- setClaseSombra(String: nombreClase)
 *		- setIdVentana(String: idVentana)
 *		- setClaseFondo(String: nombreClase)
 *		- setContenido(String: contenidoHtml)
 *		- mostrar()
 *		- cerrar()
 *
 * Metodos "privados":
 *		- inicializar()
 *		- redimensionar()
 *		- crear()
 *
 * Metodos de utilidades:
 *		- medio()
 *      - getAnchoAlto()
 *
 *
 * Notas de la nueva versión (1.3): Se han añadido funciones que
 * parametrizan VentanaModal para poder personalizarla aún más. Las
 * funciones nuevas son: setSeguimientoScroll() y setScrollPadre().
 * 
 * setScrollPadre() nos permite eliminar o mantener el scroll en la
 * ventana padre (la que está detrás de VentanaModal). Recibirá un
 * boolean que será <true> si queremos que se muestre el scroll o 
 * <false> si no queremos que se muestre el scroll. Por defecto será
 * <false>.
 * 
 * setSeguimientoScroll() nos permite que la ventana persiga el centro
 * actual de la pantalla aún cuando se hace scroll en la ventana padre
 * (la que está detrás de VentanaModal) de tal forma que nunca perdemos
 * de vista la ventana que genera VentanaModal. Esta función recibe un
 * boolean que debe ir inicializado a <false> para que no haga el
 * seguimiento del scroll o bien a <true> si queremos que haga dicho
 * seguimiento. Por defecto será <true>.
 * 
 *
 */

var VentanaModal = {
	
	inicializado	: false,
	creado			: false,
	ancho			: 0,
	alto			: 0,
	sombra			: false,
	csombra			: null,
	tsombra			: 0,
	claseSombra		: "",
	ventana			: null,
	idVentana		: "",
	claseVentana	: "",
	MSIE			: false,
	fondo			: null,
	iframe			: null, 
	claseFondo		: "",
	scrollPadre		: false,
	seguimiento		: true,
	cerrarOnClickFondo: false,
	
	getInstancia: function() {
		this.inicializar();
		this.crear();
		return this;
	},
	
	setSize: function(ancho, alto) {
		this.alto = parseInt(alto);
		this.ancho = parseInt(ancho);
		this.ventana.style.width = this.ancho + "px";
		this.ventana.style.height = this.alto + "px";
		this.csombra.style.width = this.ancho + "px";
		this.csombra.style.height = this.alto + "px";
		this.redimensionar();
		
	},
	
	setClaseVentana: function(nombreClaseVentana) {
		this.claseVentana = nombreClaseVentana;
		this.ventana.className = this.claseVentana;
	},
	
	setSombra: function(sombra) {
		if (sombra == true) {
			this.sombra = true;
			this.csombra.style.display = "inline";
		}
		else {
			this.sombra = false;
			this.csombra.style.display = "none";
		}
	},
	
	setScrollPadre: function(spadre) {
		if (spadre == true) {
			this.scrollPadre = true;
		} else {
			this.scrollPadre = false;
		}
	},
	
	setSeguimientoScroll: function(sScroll) {
		if (sScroll == true) {
			this.seguimiento = true;
		}
		else {
			this.seguimiento = false;
		}
	},
	
	setSombraSize: function(tsombra) {
		this.tsombra = tsombra;
		this.redimensionar();
	},
	
	setClaseSombra: function(claseSombra) {
		this.claseSombra = claseSombra;
		this.csombra.className = this.claseSombra;
	},
	
	setIdVentana: function(id) {
		this.idVentana = id;
		this.ventana.id = this.idVentana;
	},
	
	setClaseFondo: function(claseFondo) {
		this.claseFondo = claseFondo;
		this.fondo.className = this.claseFondo;
		if (this.MSIE)
			this.iframe.className = this.claseFondo;
	},
	
	setContenido: function(html) {
		this.ventana.innerHTML = html;
	},
	
	mostrar: function() {
		if (!this.scrollPadre) {
			//document.body.style.overflow = "hidden";
		}
		this.fondo.style.display = "inline";
		this.fondo2.style.display = "block";
		this.ventana.style.display = "inline";
		if (this.sombra)
			this.csombra.style.display = "inline";
	},
	
	cerrar: function() {
		if (this.oncerrando)
		{
			var ok = this.oncerrando.call(this);
			if (!ok)
				return false;
		}
	
		if (!this.scrollPadre) {
			document.body.style.overflow = "auto";
		}
		this.ventana.style.display = "none";
		this.csombra.style.display = "none";
		this.fondo.style.display = "none";
		this.fondo2.style.display = "none";
		
		if (this.oncerrar)
		{
			this.oncerrar.call(this);
		}
	},
	
	medio: function(v1, v2) {
		if (isNaN(v1) && v1.indexOf && v1.indexOf("px") != -1)
			v1 = v1.replace("px", "");
		if (isNaN(v2) && v2.indexOf && v2.indexOf("px") != -1)
			v2 = v2.replace("px", "");
		var aux = parseInt(v1) / 2;
		aux = aux - (parseInt(v2) / 2);
		return parseInt(aux) * (+1);
	},
	
	inicializar: function() {
		if (this.inicializado) 
			return;
		window.onresize = function() {
			VentanaModal.redimensionar();
		};
		
		if (this.seguimiento) {
			window.onscroll = function() {
				VentanaModal.redimensionar();
			};
		}
		
		this.ancho = 300;
		this.alto = 200;
		this.sombra = true;
		this.tsombra = 5;
		this.claseSombra = "ventana-modal-sombra";
		this.claseFondo = "ventana-modal-fondo";
		this.claseVentana = "ventana-modal-ventana";
		
		if (navigator.userAgent.indexOf('MSIE') >= 0) 
			this.MSIE = true;
			
		this.inicializado = true;
		this.crear();
	},
	
	redimensionar: function() {
		var top = 0;
		var left = 0;
		var alto = 0;
		var ancho = 0;
		var array = this.getAnchoAlto();
		var anchoVentana = array[0];
		var anchoDocumento = array[2];
		var altoVentana = array[1];
		var altoDocumento = array[3];
		
		if (this.MSIE) ancho = anchoVentana + "px";
		else ancho = "100%";
		
		alto = altoVentana + "px";
		
		this.fondo.style.width = ancho;
		this.fondo.style.height = alto;
		this.fondo2.style.width = ancho;
		this.fondo2.style.height = alto;

		if (this.MSIE) {
			this.iframe.style.width = ancho;
			this.iframe.style.height = alto;	
		}
		
		if (this.MSIE) {
			top = this.medio(altoDocumento, this.alto);
			left = this.medio(anchoVentana, this.ancho);
		}
		else {
			top = this.medio(altoDocumento, this.alto);
			left = this.medio(anchoVentana, this.ancho);
		}
		//top = top + this.getScrollAlto();
	
		if (top<0) top = 0;
		if (left<0) left = 0;

		this.ventana.style.top = top + "px";
		this.ventana.style.left = left + "px";
		this.csombra.style.top = (parseInt(top) + this.tsombra) + "px";
		this.csombra.style.left = (parseInt(left) + this.tsombra) + "px";
		
		this.ventana.style.overflow="auto"; 
	},
	
	forceSize: function(ancho, alto)
	{
		this.setSize(ancho, alto);
		this.redimensionar();
	
		//Cambiamos además el tamaño de la ventana
 		this.ventana.style.width = this.ancho + "px";
		this.ventana.style.height = this.alto + "px";
		this.csombra.style.width = this.ancho + "px";
		this.csombra.style.height = this.alto + "px";
		this.ventana.style.overflow="hidden"; 	
	},
	
	crear: function() {
		if (this.creado) 
			return;
		this.fondo = document.createElement("div"); // con "div" no funciona en IE
		this.fondo.style.position = "absolute";
		this.fondo.style.left = "0px";
		this.fondo.style.top = "0px";
		this.fondo.style.display = "none";
		this.fondo.className = this.claseFondo;
		this.fondo.style.zIndex = 90000;
		this.fondo.style.textAlign = "center";
		//this.fondo.style.backgroundColor="yellow";
		this.fondo.onclick = function(){
			if (VentanaModal.cerrarOnClickFondo)
				VentanaModal.cerrar();
		};
		
		document.body.appendChild(this.fondo);
		
		//añado este div ya que con el onclick sobre "this.fondo" no funciona en IE (añadiendo este sí, ¿pq? misterios de IE)
		this.fondo2 = document.createElement("div"); 
		this.fondo2.style.position = "absolute";
		this.fondo2.style.left = "0px";
		this.fondo2.style.top = "0px";
		//this.fondo2.style.display = "none";
		this.fondo2.className = this.claseFondo;
		this.fondo2.style.zIndex = 91000;
		this.fondo2.style.textAlign = "center";
		//this.fondo2.style.backgroundColor="yellow";
		this.fondo2.onclick = this.fondo.onclick;
		
		document.body.appendChild(this.fondo2);
		
		if (this.MSIE) {
			this.iframe = document.createElement("iframe");
			this.fondo.appendChild(this.iframe);
			this.iframe.src = "about:blank";
			this.iframe.frameBorder = "0";
			this.iframe.className = this.claseFondo;
		}
		
		this.ventana = document.createElement("div");
		document.body.appendChild(this.ventana);
		this.ventana.style.display = "none";
		this.ventana.style.position = "absolute";
		this.ventana.style.zIndex = 100000;
		this.ventana.style.width = this.ancho + "px";
		this.ventana.style.height = this.alto + "px";
		this.ventana.className = this.claseVentana;
		
		this.csombra = document.createElement("DIV");
		document.body.appendChild(this.csombra);
		this.csombra.style.display = "none";
		this.csombra.style.position = "absolute";
		this.csombra.style.zIndex = 95000;
		this.csombra.style.width = this.ancho + "px";
		this.csombra.style.height = this.alto + "px";
		this.csombra.className = this.claseSombra;
		this.csombra.onclick = this.fondo.onclick;
		
		this.creado = true;
		this.redimensionar();
	}, 
	
	getScrollAlto: function() {
		var scrollAlto;
		
		if (self.pageYOffset) {
			scrollAlto = self.pageYOffset;
		} else if (document.documentElement && document.documentElement.scrollTop) {
			scrollAlto = document.documentElement.scrollTop;
		} else if (document.body) {
			scrollAlto = document.body.scrollTop;
		}
	
		return scrollAlto;
	}, 
	
	getAnchoAlto: function() {
		var xScroll, yScroll;
		
		if (window.innerHeight && window.scrollMaxY) {	
			xScroll = document.body.scrollWidth;
			yScroll = window.innerHeight + window.scrollMaxY;
		} else if (document.body.scrollHeight > document.body.offsetHeight) {
			xScroll = document.body.scrollWidth;
			yScroll = document.body.scrollHeight;
		} else {
			xScroll = document.body.offsetWidth;
			yScroll = document.body.offsetHeight;
		}
		
		var ventanaAncho, ventanaAlto;
		if (self.innerHeight) {
			ventanaAncho = self.innerWidth;
			ventanaAlto = self.innerHeight;
		} else if (document.documentElement && document.documentElement.clientHeight) {
			ventanaAncho = document.documentElement.clientWidth;
			ventanaAlto = document.documentElement.clientHeight;
		} else if (document.body) {
			ventanaAncho = document.body.clientWidth;
			ventanaAlto = document.body.clientHeight;
		}	
		
		if(yScroll < ventanaAlto) {
			paginaAlto = ventanaAlto;
		} else { 
			paginaAlto = yScroll;
		}
		
		if(xScroll < ventanaAncho) {	
			paginaAncho = ventanaAncho;
		} else {
			paginaAncho = xScroll;
		}
		
		
		arrayAnchoAltoPagina = new Array(paginaAncho, paginaAlto, ventanaAncho, ventanaAlto);
		return arrayAnchoAltoPagina;
	},
	
	toString: function()
	{
		return "[VentanaModal]";
	},
	
	oncerrar: function()
	{
		return true;
	},
	
	oncerrando: function()
	{
		return true;
	}
};

function abrirVentanaModal(pagina, ancho, alto, nombre, anchoMax, altoMax, cssEspecial) {
    VentanaModal.inicializar();
	
	if (typeof(getViewportSize)=="function")
	{
		var size = getViewportSize();

		if (ancho == null)
			ancho = 0;
		if (alto == null)
			alto = 0;
		if (ancho <= 0)
			ancho = size.width + ancho;
		if (alto <= 0)
			alto = size.height + alto;
	}
	
	if (typeof(anchoMax)!="undefined" && ancho > anchoMax)
		ancho = anchoMax;
	if (typeof(altoMax)!="undefined" && alto > altoMax)
		alto = altoMax;
	
    var html = "<div>";
	if (cssEspecial != null && cssEspecial != "" && typeof(cssEspecial) != "undefined" )
	{
		html  =  "<div class=\""+cssEspecial+"\">";
	}
	
	html +=
    "<table width='100%' align='center' cellpadding='0' cellspacing='0' border='0' class='ventana-modal-ventana'>" 
	+ "<tr><td class='ventana-modal-barra-sup-izq'>&nbsp;</td>" 
	+ "<td class='ventana-modal-barra-sup' align='right'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
	+ "<img class='ventana-modal-cerrar' src='images/modal-cerrar2.gif' title='Cerrar ventana' onclick='VentanaModal.cerrar()'>"
    + "</td><td class='ventana-modal-barra-sup-der'>&nbsp;</td>"
	+ "</tr><tr>" 
	+ "<td colspan='3' class='ventana-modal-contenido'>"
    + "<iframe name='" + nombre + "' id='"+nombre+"_iframe' src='" + pagina + "' width='100%' height='" + (parseInt(alto) - 30) + "' frameborder='0'></iframe>"
    + "</td></tr>" 
	+ "<tr><td class='ventana-modal-barra-inf-izq'>&nbsp;</td>" 
	+ "<td class='ventana-modal-barra-inf'>&nbsp;</td>"
	+ "<td class='ventana-modal-barra-inf-der'>&nbsp;</td>"
	+ "</tr>" 
	+ "</table></div>";
    	
	scrollTo(0, 0); //añadido
	VentanaModal.setIdVentana(nombre); //añadido
    VentanaModal.setSize(ancho, alto);
    VentanaModal.setClaseVentana("");
    VentanaModal.setContenido(html);
    VentanaModal.mostrar();
}

function abrirVentanaModalAdmin(pagina, ancho, alto, nombre) {
    VentanaModal.inicializar();

	if (typeof(getViewportSize)=="function")
	{
		var size = getViewportSize();

		if (ancho == null)
			ancho = 0;
		if (alto == null)
			alto = 0;
		if (ancho <= 0)
			ancho = size.width - ancho;
		if (alto <= 0)
			alto = size.height - alto;
	}	
	
    var html = ""
    + "<table cellpadding='0' cellspacing='0' border='0' class='ventana-modal-ventana'>" 
	+ "<tr><td class='ventana-modal-barra-sup-izq'>&nbsp;</td>" 
	+ "<td class='ventana-modal-barra-sup' align='right'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
	+ "<img class='ventana-modal-cerrar' src='../images/modal-cerrar2.gif' title='Cerrar ventana' onclick='VentanaModal.cerrar()'>"
    + "</td><td class='ventana-modal-barra-sup-der'>&nbsp;</td>"
	+ "</tr><tr>" 
	+ "<td colspan='3' class='ventana-modal-contenido'>"
    + "<iframe name='" + nombre + "' id='"+nombre+"_iframe' src='" + pagina + "' width='100%' height='" + (parseInt(alto) - 30) + "' frameborder='0'></iframe>"
    + "</td></tr>" 
	+ "<tr><td class='ventana-modal-barra-inf-izq'>&nbsp;</td>" 
	+ "<td class='ventana-modal-barra-inf'>&nbsp;</td>"
	+ "<td class='ventana-modal-barra-inf-der'>&nbsp;</td>"
	+ "</tr>" 
	+ "</table>";
	
	scrollTo(0, 0); //añadido
	VentanaModal.setIdVentana(nombre); //añadido
    VentanaModal.setSize(ancho, alto);
    VentanaModal.setClaseVentana("");
    VentanaModal.setContenido(html);
    VentanaModal.mostrar();
}

function cerrarVentanaModal()
{
	if (parent && (parent!=self) && typeof(parent.VentanaModal)!="undefined")
	{
		var w = parent.VentanaModal;
		w.cerrar();
	}
}

function forzarTamVentana(ancho, alto, anchoMin, altoMin, anchoMax, altoMax)
{

//document.body.style.backgroundColor="yellow";
	if (isNaN(parseInt(ancho)))
	{
		if (ancho == null)
		{
			ancho = $(document).width()+30;
			alto = $(document).height()+30;
		}
		else
		{
			var e = document.getElementById(ancho);
			if (e)
			{
				ancho = e.offsetWidth+30;
				alto = e.offsetHeight+30;
			}
		}
	}
	if (!isNaN(anchoMin) && (anchoMin > ancho))
		ancho = anchoMin;
		
	if (!isNaN(altoMin) && (altoMin > alto))
		alto = altoMin;
		
	if (!isNaN(anchoMax) && (anchoMax < ancho))
		ancho = anchoMax;
		
	if (!isNaN(altoMax) && (altoMax < alto))
		alto = altoMax;

	if (parent && (parent!=self) && typeof(parent.VentanaModal)!="undefined")
	{
		var w = parent.VentanaModal;
		w.forceSize(ancho+20, alto+20);
		var idVentana = w.idVentana;
		
		var iframe = parent.document.getElementById(idVentana+"_iframe");
//		iframe.style.border="10px solid red";
		iframe.style.width=(ancho)+"px";
		iframe.style.height=(alto-10)+"px";
	}
}
