// vEmergente hija de xfenster r9, Copyright 2004-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

/* vEmergente prototipo del objeto

 * Parametros:
    clienteId   - cadena, id del elemento cliente (DIV). Este elemento no deberia tener relleno (padding).
    tituloInicial - Titulo inicial de la ventana.
    iniX        - posicion horizontal (x) inicial.
    iniY        - posicion vertical (y) inicial.
    anchoInicial - Ancho inicial, en pixeles, de la ventana. Si es cero debe ser suministrado como 'width'.
                   La propiedad width de CSS debe ser dos (2) pixeles menos. El valor predeterminado es 100.
    altoInicial - Alto inicial, en pixeles, de la ventana. Si es cero debe ser suministrado como 'height'.
                  La propiedad height de CSS debe ser dos (2) pixeles menos. El valor predeterminado es 90.
    permiteMover - Boolean. False: no se puede mover la ventana; true, si se puede.
    permiteRedimensionar - Boolean. False: no se puede redimensionar la ventana; true, si se puede.
    permiteMaxRestaurar - Boolean. False: no se puede maximizar/restaurar la ventana; true, si se puede.
    permiteCerrar - Boolean. False: no se puede cerrar la ventana; true, si se puede.
    fnMover     - Arreglo [...], donde fnMover[0] = funcion a ejecutarse despues de moverse la ventana.
                  El resto de los elementos del arreglo son los argumentos a ser usados por la funcion.
                  En el cuerpo de la funcion la variable 'this' representa este objeto.
                  Se le agrega a los argumentos las posiciones 'x' y 'y'.
    fnRedimensionar - Arreglo [...], donde fnMover[0] = funcion a ejecutarse despues de redimensionar la ventana.
                      El resto de los elementos del arreglo son los argumentos a ser usados por la funcion.
                      En el cuerpo de la funcion la variable 'this' representa este objeto.
                      Se le agrega a los argumentos las dimensiones 'w' y 'h' (ancho y alto).
    fnMaxRestaurar - Arreglo [...], donde fnMover[0] = funcion a ejecutarse despues de maximizar/restaurar la ventana.
                     El resto de los elementos del arreglo son los argumentos a ser usados por la funcion.
                     En el cuerpo de la funcion la variable 'this' representa este objeto.
                     Se le agrega a los argumentos las dimensiones 'w' y 'h' (ancho y alto).
    fnCerrar - Arreglo [...], donde fnMover[0] = funcion a ejecutarse antes de cerrar la ventana.
               El resto de los elementos del arreglo son los argumentos a ser usados por la funcion.
               En el cuerpo de la funcion la variable 'this' representa este objeto.
               Debe devolver 'true' (cierra la ventana) o 'false' (no cierra la ventana).
    fnEnfocar - Arreglo [...], donde fnMover[0] = funcion a ejecutarse despues de enfocarse la ventana.
                El resto de los elementos del arreglo son los argumentos a ser usados por la funcion.
                En el cuerpo de la funcion la variable 'this' representa este objeto.

 * Dependencias:
    xGetElementById(x_core.js)
    xGetElementByTagName(x_core.js)
    xDisableDrag(x_drag.js)
    xMoveTo(x_core.js)
    xWidth(x_core.js)
    xHeight(x_core.js)
    xResizeTo(x_core.js)
    xZIndex(x_core.js)
    xEnableDrag(x_drag.js)
    xLeft(x_core.js)
    xTop(x_core.js)
    xStopPropagation(x_event.js)
    xPageX(x_core.js)
    xPageY(x_core.js)

 * Ejemplo del elemento DIV:
    <div id='vent' class='vent'>
        ................contenido..............
    </div>
*/

function vEmergente(clienteId, tituloInicial, xInicial, yInicial, anchoInicial, altoInicial, permiteMover, permiteRedimensionar, permiteMaxRestaurar, permiteCerrar, fnMover, fnRedimensionar, fnMaxRestaurar, fnCerrar, fnEnfocar)
{
  var este = this;

  // Metodos Publicos
  
  //Agregado para centrar la ventana cuando no se especifican las coordenadas X,Y
  if ((!xInicial) || (!yInicial)) 
  {
		var centrar = true;
       	var posVemergente = centrarVentana(anchoInicial, altoInicial);
        xInicial = posVemergente[0];
        yInicial = posVemergente[1];
   }
   //-- Fin centrar ventana
    

	//-------------------------------------------------------------------------------------------------------------------------------------------
	//Descripción: Función que permite centrar en la pantalla una capa creada a través de vEmergente
	//Entrada: anchoCapa: Cantidad de píxeles utilizados como ancho de la capa, altoCapa: Cantidad de píxeles utilizados como alto de la capa
	//Salida: posicion: Arreglo que contiene en la primera posición el valor de la X y en la segunda posición el valor de la Y
	//Programador(es): Dennis Castillo, José Leandro Villaroel (18/08/2008)
	//-------------------------------------------------------------------------------------------------------------------------------------------
	function centrarVentana(anchoCapa,altoCapa)
	{
	    //Calculamos el ancho y alto de la ventana del navegador
	    var anchoPantalla = xClientWidth();
	    var altoPantalla = xClientHeight();
	    
	    //Calculamos la posicion de X,Y restando las mitades del ancho y alto de la pantalla respecto al de la capa
	    var posicionX = (parseInt(anchoPantalla)/2) - (parseInt(anchoCapa)/2);
	    var posicionY = (parseInt(altoPantalla)/2) - (parseInt(altoCapa)/2);
	    
	    //Sumamos la cantidad de pixeles desplazados hacia abajo usando la barra de desplazamiento
	    posicionY = posicionY + window.pageYOffset;
	    
	    //Creamos un arreglo con los valores resultantes de X y Y
	    var posicion = new Array(posicionX, posicionY);
	    
	    return posicion;
	}


  este.pintar = function(dw, dh)
  {
    var m = 1, b = 1;
    var m2 = 2*m, b2 = 2*b;
    W += dw;                // Ancho de la ventana a pintar
    H += dh;                // Alto de la ventana a pintar
    xResizeTo(con, W, H);
// Se activa la compilacion condicional. Se coloca entre comentarios, para los exploradores que no la soportan.
    /*@cc_on
    @if (@_jscript_version <= 5.6)
      xMoveTo(este.tbar, m, m);
      xWidth(este.tbar, W - m2 - b2);
      xLeft(este.sbar, m);
      xWidth(este.sbar, W - m2 - b2);
      xTop(este.sbar, H - xHeight(este.sbar) - m - b2);
    @end @*/
    xMoveTo(este.cliente, m, m + xHeight(este.tbar));
    xResizeTo(este.cliente, W - m2 - b2, H - xHeight(este.tbar) - xHeight(este.sbar) - m2 - b2);
  };
  este.enfocar = function(e) // no use 'this' aqui
  {
//if (vEmergente.instancias['capa1']) alert(vEmergente.instancias['capa1'].cliente.id + '.enfoque: ' +  vEmergente.instancias['capa1'].enfoque);
//if (vEmergente.instancias['capa1'] == este) alert ('Iguales');
//else alert('Diferentes')
//if (e) alert(e.type + '{' + arguments.length + '}:' + este.cliente.id + '-' + este.enfoque);
//else alert('Sin evento:' + este.cliente.id + '-' + este.enfoque);
    if (false === este.enfoque) {
      este.enfoque = true;
      return;
    }
    con.style.zIndex = vEmergente.z++;
    for (var i in vEmergente.instancias) {
      vEmergente.instancias[i].tbar.className = 'veBarraTitulo';
      vEmergente.instancias[i].sbar.className = 'veBarraEstatus';
    }
    este.tbar.className = 'veBarraTituloEnf';
    este.sbar.className = 'veBarraEstatusEnf';
    /*@cc_on manejarSelect(); @*/       // PC 14-06-2007. Solo para IE.
    if (fnEnfocar) {llamarFuncion(fnEnfocar);}                                // PC 20-06-2007
  };
  este.esconder = function(e) // no use 'this' aqui
  {
    var c = true;
    if (fnCerrar) {
      c = llamarFuncion(fnCerrar);                                          // PC 20-06-2007
    }
    if (c) {
      con.style.display = 'none';
      mostrada = false;
      xStopPropagation(e);
    /*@cc_on manejarSelect(); @*/       // PC 14-06-2007. Solo para IE.
    }
  };
  este.mostrar = function()
  {
    con.style.display = 'block';
    mostrada = true;
    este.enfocar();
  };
  este.estatus = function(s)
  {
    if (s) {este.sbar.firstChild.data = s;}
    return este.sbar.firstChild.data;
  };
  este.titulo = function(s)
  {
    if (s) {este.tbar.firstChild.data = s;}
    return este.tbar.firstChild.data;
  };
  este.estaMostrada = function()
  {
    return mostrada;
  };

  // Metodos Privados para IE
    /*@cc_on            // PC 14-06-2007. Solo para IE. Funciones para esconder los campos select.
  function rectIntersectados(vCon, sel, idDelCliente)
  {
      var vx0 = xLeft(vCon), vx1 = vx0 + xWidth(vCon), vy0 = xTop(vCon), vy1 = vy0 + xHeight(vCon);
      var sx0 = xPageX(sel), sx1 = xPageX(sel) + xWidth(sel), sy0 = xPageY(sel), sy1 = xPageY(sel) + xHeight(sel);
      return ((vy1 > sy0) && (vy0 < sy1) && (vx1 > sx0) && (vx0 < sx1));
  }

  function manejarSelect()
  {
      var esconder = false;
      var entrada = xGetElementsByTagName('select');
      for (var i = 0, largo = entrada.length; i < largo; i++)
      {
        entrada[i].style.display = "inline";
        for (var id in vEmergente.instancias)
        {
          if (id == 'alertar') continue;
          if (selects[entrada[i]] == este.cliente.id) continue;     // Si es la ventana actual, no esconda cualquier 'select'.
          if (rectIntersectados(vEmergente.instancias[id].con, entrada[i], id) && (vEmergente.instancias[id].con.style.display != 'none'))
          {
            esconder = true; break;
          }
        }
        entrada[i].style.display = (esconder)?"none":"inline";
      }
  }
 @*/                    // PC 14-06-2007. Solo para IE. Fin de las funciones para esconder los campos select.

  function llamarFuncion(arrFuncion, XoW, YoH)                              // PC 20-06-2007
  {
    if (arrFuncion && (tipode (arrFuncion) === 'array'))
    {
        var funcion = arrFuncion[0];
        var argumentos = [];
        if (arrFuncion.length > 1) {argumentos = arrFuncion.slice(1, arrFuncion.length - 1);}
        if ((funcion) && (typeof funcion === 'function'))
        {
            if (XoW) {argumentos.push(XoW);}
            if (YoH) {argumentos.push(YoH);}
            return funcion.apply(este, argumentos);
        }
        else {return false;}
    }
    else if ((arrFuncion) && (typeof arrFuncion === 'function')) {return arrFuncion();}
    else {return false;}
  }

  // Eventos Listeners privados
  function dragStart()
  {
    este.enfocar();
  }
  function barDrag(e, mdx, mdy)
  {
    var x = xLeft(con) + mdx;
    var y = xTop(con) + mdy;
    if (x < 0) {x = 0;}                   // PC 14-06-2007. Evita valores negativos (perder la ventana).
    if (y < 0) {y = 0;}                   // PC 14-06-2007. Evita valores negativos (perder la ventana).
    xMoveTo(con, x, y);
    if (fnMover) {llamarFuncion(fnMover, x, y);}                              // PC 20-06-2007
  }
  function resDrag(e, mdx, mdy)
  {
    este.pintar(mdx, mdy);
    if (fnRedimensionar) {llamarFuncion(fnRedimensionar, xWidth(este.cliente), xHeight(este.cliente));} // PC 20-06-2007
  }
  function maxClick()
  {
    if (maximizada) { // restaurar
      maximizada = false;
      W = w; H = h;
      xMoveTo(con, x, y);
    }
    else { // maximizar
      w = xWidth(con);
      h = xHeight(con);
      x = xLeft(con);
      y = xTop(con);
      xMoveTo(con, xScrollLeft(), xScrollTop());
      maximizada = true;
      W = xClientWidth() - 2;
      H = xClientHeight() - 2;
    }
    este.pintar(0, 0);
    /*@cc_on manejarSelect(); @*/       // PC 14-06-2007. Solo para IE.
    if (fnMaxRestaurar) {llamarFuncion(fnMaxRestaurar, W, H);}                              // PC 20-06-2007
  }

  // Codigo Constructor

  este.tbar = null;         // Titulo
  este.sbar = null;         // Estatus
  este.cliente = xGetElementById(clienteId);
  if (!este.cliente) {      // Si no existe el Id del cliente (ventana del usuario), se crea.
    este.cliente = document.createElement('div');
    este.cliente.id = clienteId;
  }
  este.cliente.className += ' veCliente';
  este.cliente.style.display = 'block';     // Despliega como nivel de bloque, con salto de linea antes y despues.
  var x, y, w, h, maximizada = false;       // x, y, ancho y alto cuando no esta maximixada.
  var mostrada = false;                     // PC 21-06-2007.
  var enfoque;                              // PC 27-12-2008. Permite decidir si enfoca.
  este.enfoque = true;                      // PC 27-12-2008. Permite decidir si enfoca.
  vEmergente.instancias[clienteId] = este;
  // crea elementos
  var con = document.createElement('div');  // PC 15-06-2007. El contenedor mas externo
  con.className = 'veContenedorExterno';
  este.con = con;                           // PC 14-06-2007. Solo para conocer las coordenadas 'x' y 'x'.
  if (permiteRedimensionar) {
    var rbtn = document.createElement('div');
    rbtn.className = 'veIconoRedim';
    rbtn.title = 'Arrastre para redimensionar';
  }
  if (permiteMaxRestaurar) {
    var mbtn = document.createElement('div');
    mbtn.className = 'veIconoMR';
    mbtn.title = 'Click para Maximizar/Restaurar';
  }
  if (permiteCerrar) {
    var cbtn = document.createElement('div');
    cbtn.className = 'veIconoCie';
    cbtn.title = 'Click para cerrar';
  }
  este.tbar = document.createElement('div');
  este.tbar.className = 'veBarraTitulo';
  if (permiteMover) {
    este.tbar.title = 'Arrastre para Mover';
    if (permiteMaxRestaurar) {este.tbar.title += ', ';}
  }
  if (permiteMaxRestaurar) {este.tbar.title += 'Double-Click para Maximizar/Restaurar';}
  este.tbar.appendChild(document.createTextNode(tituloInicial));
  este.sbar = document.createElement('div');
  este.sbar.className = 'veBarraEstatusEnf';
  este.sbar.title = 'Click para Enfocar';
  este.sbar.appendChild(document.createTextNode('VisualSat-Clima'));
  // agrega elementos
  con.appendChild(este.tbar);
  if (permiteMaxRestaurar) {este.tbar.appendChild(mbtn);}
  if (permiteCerrar) {este.tbar.appendChild(cbtn);}
  con.appendChild(este.cliente);
  con.appendChild(este.sbar);
  if (permiteRedimensionar) {este.sbar.appendChild(rbtn);}
  document.body.appendChild(con);
  // inicializaciones finales
  var W = (anchoInicial)?anchoInicial:xWidth(este.cliente), H = (altoInicial)?altoInicial:xHeight(este.cliente);
  W = (W<100)?100:W; H = (H<90)?90:H;
  xMoveTo(con, xInicial, yInicial);
  este.pintar(0, 0);
  if (permiteMover) {xEnableDrag(este.tbar, dragStart, barDrag);}
  if (permiteRedimensionar) {xEnableDrag(rbtn, dragStart, resDrag);}
  con.onclick = este.enfocar; // don't like this but can't use onmousedown here - it prevents dragging thumbnail on native scrollbar!
  if (permiteMaxRestaurar) {mbtn.onclick = este.tbar.ondblclick = maxClick;}
  if (permiteCerrar) {
    cbtn.onclick = este.esconder;
    cbtn.onmousedown = xStopPropagation;
  }
  con.style.visibility = 'visible';
  este.enfocar();
  mostrada = true;
  xAddEventListener(window, 'unload',
    function () {
      if (permiteMover) {xDisableDrag(este.tbar);}
      if (rbtn) {xDisableDrag(rbtn);}
      con.onmousedown = con.onclick = null;
      if (mbtn) {mbtn.onclick = este.tbar.ondblclick = null;}
      if (cbtn) {cbtn.onclick = cbtn.onmousedown = null;}
      vEmergente.instancias[clienteId] = null;
      este = null;
    }, false
  );
} // fin del prototipo de objeto vEmergente

// propiedades estaticas de vEmergente
vEmergente.z = 100;
vEmergente.instancias = {};
/*@cc_on var selects = new Array(); @*/       // PC 14-06-2007. Solo para IE.

if ( typeof ventanaSiga==='undefined') {
    function ventanaSiga(eleId, iniX, iniY, barId, resBtnId, maxBtnId, eliBtnId, funcion, argumentos)
    {
        vEmergente(eleId, 'titulo', iniX, iniY, 0, 0, true, true, true, true, null, null, null, funcion, null);
    }
}