diff options
author | alonso <alonso@us.es> | 2009-11-04 12:41:19 +0000 |
---|---|---|
committer | alonso <alonso@us.es> | 2009-11-04 12:41:19 +0000 |
commit | b0dc2e4f68d239ce72f138c47d5762973dfa851e (patch) | |
tree | 8b22fe4101e8e527f474291ed19f4446f02a2343 /admin/WebConsole/clases | |
parent | a7fa603b2d3bb05c60c61265f2bf4b561bb00ba3 (diff) |
git-svn-id: https://opengnsys.es/svn/trunk@489 a21b9725-9963-47de-94b9-378ad31fedc9
Diffstat (limited to 'admin/WebConsole/clases')
-rw-r--r-- | admin/WebConsole/clases/AdoPhp.php | 648 | ||||
-rw-r--r-- | admin/WebConsole/clases/ArbolVistaXML.php | 272 | ||||
-rw-r--r-- | admin/WebConsole/clases/EncripDescrip.php | 56 | ||||
-rw-r--r-- | admin/WebConsole/clases/MenuContextual.php | 164 | ||||
-rw-r--r-- | admin/WebConsole/clases/SockHidra.php | 120 | ||||
-rw-r--r-- | admin/WebConsole/clases/XmlPhp.php | 285 | ||||
-rw-r--r-- | admin/WebConsole/clases/jscripts/ArbolVistaXML.js | 565 | ||||
-rw-r--r-- | admin/WebConsole/clases/jscripts/MenuContextual.js | 395 |
8 files changed, 2505 insertions, 0 deletions
diff --git a/admin/WebConsole/clases/AdoPhp.php b/admin/WebConsole/clases/AdoPhp.php new file mode 100644 index 00000000..6f75c120 --- /dev/null +++ b/admin/WebConsole/clases/AdoPhp.php @@ -0,0 +1,648 @@ +<?php +/*================================================================================ +Clase para conectar con una base de datos. + +Especificaciones: + - Estado de la conexión($estado) + 0: No conectado + 1: Conectado + 2: Se est�intentando conectar + +================================================================================*/ + +class Conexion{ + var $basedatos; // Base de datos + var $servidor; // Servidor de Base de datos + var $usuario; // Nombre de usuario + var $password; // Clave de usuario + var $controlador; // Controlador + var $estado; // Estado de la conexion + var $proveedor; // Proveedor de BD + var $error; // Colecci� de errores ocurridos durante el proceso (C�igo de error) + var $ultimoerror; // Ultimo error detectado + var $inderror; // Nmero de errores ocurridos durante el proceso + var $msgerrores=array( + "No se ha producido ningn error", + "001 : conexiónError - La conexion no se pudo establecer", + "002 : conexiónError - Se estableci� la conexióncon el servidor pero la base de datos no responde", + "003 : conexiónError - No se ha podido cerrar la actual conexi�", + "004 : conexiónError - El objeto est�ocupado intentando establecer una conexiónanterior", + "005 : conexiónError - La conexiónya est�cerrada", + "006 : conexiónError - No se ha especificado ningn servidor de base de datos", + "007 : conexiónError - No se ha especificado ningn usuario de la base de datos", + "008 : conexiónError - No se ha especificado password de usuario", + "009 : conexiónError - No se ha especificado ninguna base de datos", + "010 : conexiónError - No se ha especificado ningn proveedor de bases de datos", + ); + /*--------------------------------------------------------------------------------------------*/ + function Conexion(){ // Constructor de la clase + $this->inderror=0; + $this->ultimoerror=0; + $this->estado=0; + } + /* ------------------------------------------------------------------------------------------- + Adquiere o actualiza los datos necesarias para establecer conexiones + + Par�etros de entrada: + servidor: Servidor donde se ubica la base de datos + usuario : Un usuario con acceso al servidor + passwor : Clave de usuario + basedato: Base de datos a la se quiere acceder + proveedor: Proveedor de Base de datos + + Devuelve : + true : Si los datos aportadospara establecer conexiones son correctos + false: En caso contrario + + En el caso de devolver false, la funci� TomaUltimoError() devuelve el error ocurrido + ----------------------------------------------------------------------------------------------*/ + function CadenaConexion($servidor,$usuario,$password,$basedatos,$proveedor){ + $this->servidor=$servidor; + $this->usuario=$usuario; + $this->password=$password; + $this->basedatos=$basedatos; + $this->proveedor=$proveedor; + if (!$this->_cadena_conexion()) return(false); else return(true); + } + /* ------------------------------------------------------------------------------------------- + Abre una conexión + + Devuelve : + true : Si la apertura de la conexiónha sido satisfactoria + false: En caso contrario + + En el caso de devolver false, la funci� TomaUltimoError() devuelve el error ocurrido + ----------------------------------------------------------------------------------------------*/ + function Abrir(){ + $this->inderror=-1; // Inicializar contador de errores + $this->ultimoerror=-1; + $MAXIMOS_INTENTOS_DE_CONECCION=10; + if (!$this->_cadena_conexion()) return(false); // Comprueba si los datos necesarios para conexiones se han aportado + switch ($this->estado) { + case 1: // Existe actualmente una conexiónabierta que se sustituir�por la nueva + if (mysql_close($this->controlador)){ // Se cierra la conexion actual + $this->estado=0; + $intentos_de_conexion=0; + while(true){ + $intentos_de_conexion++; + $resul=($this->_nueva_conexion()); + if ($resul || $intentos_de_conexion>$MAXIMOS_INTENTOS_DE_CONECCION) return($resul); + sleep(1); // Espera 1 segundo para intentar la conexiónde nuevo + } + } + else{ // Error al cerrar la conexi� + $this->error[$this->inderror++]=3; + $this->ultimoerror=3; + return(false); + } + break; + case 2: // Actualmente est�objeto est�ocupado intentando establecer otra conexi� + $this->error[$this->inderror++]=4; + $this->ultimoerror=4; + return(false); + break; + default : // No existe actualmente ninguna conexiónabierta, se abrir�una nueva + $intentos_de_conexion=0; + while(true){ + $intentos_de_conexion++; + $resul=($this->_nueva_conexion()); + if ($resul || $intentos_de_conexion>$MAXIMOS_INTENTOS_DE_CONECCION) return($resul); + sleep(1); // Espera 1 segundo para intentar la conexiónde nuevo + } + } + } + /* ------------------------------------------------------------------------------------------- + Cierra una conexión + + Devuelve : + true : Si la conexiónse ha cerrado satisfactoriamente + false: En caso contrario + + En el caso de devolver false, la funci� TomaUltimoError() devuelve el error ocurrido + ----------------------------------------------------------------------------------------------*/ + function Cerrar(){ + $this->inderror=-1; // Inicializar contador de errores + $this->ultimoerror=-1; + switch ($this->estado) { + case 1: // Actualmente la conexion est�abierta + if (mysql_close($this->controlador)){ // Se cierra la conexion actual + $this->estado=0; + $this->error[$this->inderror++]=0; + $this->ultimoerror=0; + return(true); + } + else{ // Error al cerrar la conexi� + $this->error[$this->inderror++]=3; + $this->ultimoerror=3; + return(false); + } + break; + case 2: // Actualmente est�objeto est�ocupado intentando establecer otra conexi� + $this->error[$this->inderror++]=4; + $this->ultimoerror=4; + return(false); + break; + + default : // Actualmente la conexiónest�ya cerrada + $this->error[$this->inderror++]=5; + $this->ultimoerror=5; + return(false); + } + } + /* ------------------------------------------------------------------------------------------- + Establece una nueva conexi�. Este m�odo es privado y s�o lo puede ejecutar la propia + clase desde el m�odo pblico Abrir. + ----------------------------------------------------------------------------------------------*/ + function _nueva_conexion(){ + $this->estado=2;// Intenta la conexion + if ($this->controlador=mysql_connect($this->servidor,$this->usuario,$this->password)){// Conexion O.K. + $this->estado=1; // La conexion con el servidor se estableci� + if (mysql_select_db($this->basedatos, $this->controlador)){// Base datos O.K. + $this->error[$this->inderror++]=0; + $this->ultimoerror=0; + return(true); + } + else{ // Problemas con la base de datos + $this->error[$this->inderror++]=2; + $this->ultimoerror=2; + if (mysql_close ($this->controlador)) $this->estado=0; // Se cierra la conexion + return(false); + } + } + else{ // Problemas con la conexion + $this->estado=0; + $this->error[$this->inderror++]=1; + $this->ultimoerror=1; + return(false); + } + } + /* ------------------------------------------------------------------------------------------- + Revisa y detecta las condiciones que deben cumplir los datos necesarios para establecer + conexiones + + Devuelve : + true : Si los datos aportados son correctos + false: Si algn dato NO ha sido aportado o es incorrecto + + Este m�odo es privado y s�o lo ejecutan m�odos pblicos de la propia clase + ----------------------------------------------------------------------------------------------*/ + function _cadena_conexion(){ + + if ($this->servidor==null){ + $this->error[$this->inderror++]=6; // Servidor no establecido + $this->ultimoerror=6; + return(false); + } + if ($this->usuario==null){ + $this->error[$this->inderror++]=7;// usuario no establecido + $this->ultimoerror=7; + return(false); + } + if ($this->password==null){ + $this->error[$this->inderror++]=8; // password no establecido + $this->ultimoerror=8; + return(false); + } + if ($this->basedatos==null){ + $this->error[$this->inderror++]=9; // base de datos no establecido + $this->ultimoerror=9; + return(false); + } + if ($this->proveedor==null){ + $this->error[$this->inderror++]=10; // proveedor no establecido + $this->ultimoerror=10; + return(false); + } + $this->error[$this->inderror++]=0; // Datos de conexióncorrectos + $this->ultimoerror=0; + return(true); + } + /* ------------------------------------------------------------------------------------------- + Devuelve el c�igo del ltimo error ocurrido durante el proceso anterior. + ----------------------------------------------------------------------------------------------*/ + function UltimoError(){ + return($this->ultimoerror); + } + /* ------------------------------------------------------------------------------------------- + Devuelve una cadena con el mensage del ltimo error ocurrido durante el proceso anterior. + ----------------------------------------------------------------------------------------------*/ + function DescripUltimoError(){ + return($this->msgerrores[$this->ultimoerror]); + } +} +/*========================================================================================= + Clase para usarla con la clase comando. + + Especificaciones: + + Esta clase tiene dos propiedades que definen su contenido + nombre=nombre del parametro + valor = valor de dicho par�etro + tipo = tipo de parametro: + 0: El valor del par�etro debe ir encerrado entre comillas simples + 1: El valor del par�etro no necesita ir entre comillas simples +========================================================================================*/ +class parametro{ + var $nombre; + var $valor; + var $tipo; + /*--------------------------------------------------------------------------------------------*/ + function parametro($nombre="SinNombre",$valor="",$tipo="0"){ // Constructor de la clase + $this->SetParametro($nombre,$valor,$tipo); + } + /* ------------------------------------------------------------------------------------------- + Modifica los valores de las propiedades de la clase + ----------------------------------------------------------------------------------------------*/ + function SetParametro($nombre,$valor,$tipo){ + $this->nombre=$nombre; + $this->valor=$valor; + $this->tipo=$tipo; + if($tipo==1 && empty($valor)) $this->valor=0; + } +} +/*========================================================================================== + Clase para manipular bases de datos a traves de una conexiónprevia. + + Especificaciones: + + Las sentencias SQL pueden contener par�etros que pueden ser sustituidos por el valor + de los objetos par�etro. Estos par�etros tendr� la forma:@nombre_del_parametro +==================================================================================================*/ +class Comando{ + var $texto; + var $Conexion; + var $parametros=array(); + var $Recordset; + var $resul; + var $error; // Error + var $ultimoerror; // Ultimo error detectado + var $inderror; // Contador de errores + var $msgerrores=array( + "No se ha producido ningn error", + "001 : Comando Error - No se ha establecido el texto del comando", + "002 : Comando Error - No se ha establecido la conexióndel comando", + "003 : Comando Error - No se ha abierto la conexi�", + "004 : Comando Error - La sentencia SQl del comando no es correcta", + "005 : Comando Error - No se ha podido recuperar el valor @@identity de la ltima clave insertada", + ); + /*--------------------------------------------------------------------------------------------*/ + function Comando(){ // Constructor de la clase + $this->inderror=0; + $this->ultimoerror=0; + $this->Recordset=new Recordset; + } + /* ------------------------------------------------------------------------------------------- + Devuelve el c�igo del ltimo error ocurrido durante el proceso anterior. + ----------------------------------------------------------------------------------------------*/ + function UltimoError(){ + return($this->ultimoerror); + } + /* ------------------------------------------------------------------------------------------- + Devuelve una cadena con el mensage del ltimo error ocurrido durante el proceso anterior. + ----------------------------------------------------------------------------------------------*/ + function DescripUltimoError(){ + return($this->msgerrores[$this->ultimoerror]); + } + /* ------------------------------------------------------------------------------------------- + A�de un par�etro a la colecci� de parametros. La matriz que implementa la colecci� + es una matriz asociativa cuyo indice asociativo es el nombre del par�etro + + Par�etros de entrada: + objparam: Un objeto parametro + ---------------------------------------------------------------------------------------------*/ + function AddParametro($objparam){ + $tbparametro["nombre"]=$objparam->nombre; + $tbparametro["valor"]=$objparam->valor; + $tbparametro["tipo"]=$objparam->tipo; + $this->parametros[]=$tbparametro; + } + /* ------------------------------------------------------------------------------------------- + A�de un par�etro a la colecci� de parametros. La matriz que implementa la colecci� + es una matriz asociativa cuyo indice asociativo es el del par�etro + + Par�etros de entrada: + nombre: El nombre del par�etro + valor : El valor del par�etro + tipo = tipo de parametro: + 0: El valor del par�etro debe ir encerrado entre comillas simples + 1: El valor del par�etro no necesita ir entre comillas simples + + + ---------------------------------------------------------------------------------------------*/ + function CreaParametro($nombre,$valor,$tipo){ + for($i=0;$i<sizeof($this->parametros);$i++){ + if($this->parametros[$i]["nombre"]==$nombre){ + $this->parametros[$i]["valor"]=$valor; + return; + } + } + $p = new parametro($nombre,$valor,$tipo); + $this->AddParametro($p); + } + + /* ------------------------------------------------------------------------------------------- + Sustituye el valor de un par�etro existente por otro + Par�etros de entrada: + nombre: El nombre del par�etro + valor : El nuevo valor del par�etro + ---------------------------------------------------------------------------------------------*/ + function ParamSetValor($nombre,$valor){ + for($i=0;$i<sizeof($this->parametros);$i++){ + if($this->parametros[$i]["nombre"]==$nombre) + $this->parametros[$i]["valor"]=$valor; + } + } + /* ------------------------------------------------------------------------------------------- + Establece la conexiónque se usar�para ejecutar las acciones pertinentes + + Par�etros de entrada: + objconexion: Un objeto conexion + ---------------------------------------------------------------------------------------------*/ + function EstableceConexion($objconexion){ + $this->Conexion= $objconexion; + } + /* ------------------------------------------------------------------------------------------- + Establece la conexiónque se usar�para ejecutar las acciones pertinentes + + Par�etros de entrada: + textocomando: Un texto con la sentencia SQL (Puede contener par�etros) + ---------------------------------------------------------------------------------------------*/ + function EstableceTexto($textocomando){ + $this->texto=$textocomando; + } + /* ------------------------------------------------------------------------------------------- + Sustituye el valor de los parametros en la expresi� que forma el texto del Comando + ---------------------------------------------------------------------------------------------*/ + function Traduce(){ + $execomando=$this->texto; + if (sizeof($this->parametros)>0){ // Hay par�etros que sustituir + foreach($this->parametros as $parametro){ + if ($parametro["tipo"]==0) // Tipo alfanum�ico + $execomando=str_replace($parametro["nombre"],"'".$parametro["valor"]."'",$execomando); + else + $execomando=str_replace($parametro["nombre"],$parametro["valor"],$execomando); + } + } + $this->texto=$execomando; + } + /* ------------------------------------------------------------------------------------------- + Ejecuta la sentencia SQL contenida en la propiedad texto + ---------------------------------------------------------------------------------------------*/ + function Ejecutar(){ + $this->inderror=-1; // Inicializar contador de errores + $this->ultimoerror=-1; + if ($this->texto==null){ + $this->error[$this->inderror++]=1; // Texto no especificado + $this->ultimoerror=1; + return(false); + } + else{ + if ($this->Conexion==null){ + $this->error[$this->inderror++]=2; // conexiónNO establecida + $this->ultimoerror=2; + return(false); + } + else{ + if ($this->Conexion->estado==0){ + $this->error[$this->inderror++]=3; // conexiónNO abierta + $this->ultimoerror=3; + return(false); + } + } + } + $this->Traduce(); + if (!$this->resul=mysql_query($this->texto,$this->Conexion->controlador)){ + $this->error[$this->inderror++]=4; // Error en la sentencia SQL del comando + $this->ultimoerror=4; + return(false); + } + if (stristr($this->texto,"select")){ + $this->Recordset->Inicializar(); + $this->Recordset->filas=$this->resul; + $this->Recordset->numerodecampos=mysql_num_fields($this->Recordset->filas); + $this->Recordset->numeroderegistros=mysql_num_rows($this->Recordset->filas); + if ($this->Recordset->numeroderegistros>0){ + $this->Recordset->BOF=false; + $this->Recordset->EOF=false; + $this->Recordset->campos=mysql_fetch_array($this->Recordset->filas); + } + } + + $this->error[$this->inderror++]=0; // Comando ejecutado correctamante + $this->ultimoerror=0; + return(true); + } + /* ------------------------------------------------------------------------------------------- + Esta funci� recupera el ltimo nmero asignado a una clave autonum�ica de una tabla + ---------------------------------------------------------------------------------------------*/ + function Autonumerico(){ + $ulreg=mysql_insert_id(); + return($ulreg); + } +} +/*========================================================================================= + Clase para consultar tablas y vistas de una base de datos. + + Especificaciones: + - Estado del recordset ($estado) + 0: Cerrado + 1: Abierto +=========================================================================================*/ +class Recordset{ + var $Comando; + var $filas= array(); + var $BOF,$EOF,$estado; + var $campos; + var $numeroderegistros,$numerodecampos,$posicion; + + var $error; // Error + var $ultimoerror; // Ultimo error detectado + var $inderror; // Contador de errores + var $msgerrores=array( + "No se ha producido ningn error", + "001 : Recordset Error - Comando no establecido", + "002 : Recordset Error - No se ha establecido la conexióndel comando", + "003 : Recordset Error - No se ha abierto la conexi�", + "004 : Recordset Error - No se pudo abrir la consulta", + "005 : Recordset Error - La sentencia SQl del comando no contiene la clausula SELECT", + "006 : Recordset Error - No se puede liberar la consulta", + ); + /*--------------------------------------------------------------------------------------------*/ + function Recordset(){ // Constructor de la clase + $this->Inicializar(); + } + /* ------------------------------------------------------------------------------------------- + Inicializa propiedades de las clase + ----------------------------------------------------------------------------------------------*/ + function Inicializar(){ + $this->BOF=true; + $this->EOF=true; + $this->posicion=0; + $this->numeroderegistros=0; + $this->numerodecampos=0; + $this->estado=0; + } + /* ------------------------------------------------------------------------------------------- + Devuelve el c�igo del ltimo error ocurrido durante el proceso anterior. + ----------------------------------------------------------------------------------------------*/ + function UltimoError(){ + return($this->ultimoerror); + } + /* ------------------------------------------------------------------------------------------- + Devuelve una cadena con el mensage del ltimo error ocurrido durante el proceso anterior. + ----------------------------------------------------------------------------------------------*/ + function DescripUltimoError(){ + return($this->msgerrores[$this->ultimoerror]); + } + /* ------------------------------------------------------------------------------------------- + Establece el comando que se usar�para ejecutar las consultas pertinentes + + Par�etros de entrada: + objcomando: Un objeto comando con la sentencia SQL (Puede contener par�etros) + + Devuelve : + true : Si el texto del comando contiene la clausula SELECT + false: En caso contrario + + En el caso de devolver false, la funci� TomaUltimoError() devuelve el error ocurrido + ---------------------------------------------------------------------------------------------*/ + function EstableceComando($objcomando){ + $this->inderror=-1; // Inicializar contador de errores + $this->ultimoerror=-1; + if (stristr($objcomando->texto,"select")){ + $this->Comando=$objcomando; + $this->error[$this->inderror++]=0; // Comando v�ido, contiene "SELECT" + $this->ultimoerror=0; + return(true); + } + else{ + $this->error[$this->inderror++]=5; // Comando no valido, NO contiene "SELECT" + $this->ultimoerror=5; + return(false); + } + } + /* ------------------------------------------------------------------------------------------- + Sustituye el valor de los parametros en la expresi� que forma el texto del Comando + ---------------------------------------------------------------------------------------------*/ + function Traduce(){ + $execomando=$this->Comando->texto; + if (sizeof($this->Comando->parametros)>0){ // Hay par�etros que sustituir + foreach($this->Comando->parametros as $parametro){ + if ($parametro["tipo"]==0) // Tipo alfanum�ico + $execomando=str_replace($parametro["nombre"],"'".$parametro["valor"]."'",$execomando); + else + $execomando=str_replace($parametro["nombre"],$parametro["valor"],$execomando); + } + } + $this->Comando->texto=$execomando; + } + /* ------------------------------------------------------------------------------------------- + Recupera registros de la base de datos + ---------------------------------------------------------------------------------------------*/ + function Abrir(){ + $this->inderror=-1; // Inicializar contador de errores + $this->ultimoerror=-1; + if ($this->Comando==null){ + $this->error[$this->inderror++]=1; // Comando no especificado + $this->ultimoerror=1; + return(false); + } + else{ + if ($this->Comando->Conexion==null){ + $this->error[$this->inderror++]=2; // conexiónNO establecida + $this->ultimoerror=2; + return(false); + } + else{ + if ($this->Comando->Conexion->estado==0){ + $this->error[$this->inderror++]=3; // conexiónNO abierta + $this->ultimoerror=3; + return(false); + } + } + } + $this->Traduce(); + $this->Inicializar(); + if (!$this->filas=mysql_query($this->Comando->texto,$this->Comando->Conexion->controlador)){ + $this->error[$this->inderror++]=4; // Error en la sentencia SQL del comando o al abrir la consula + $this->ultimoerror=4; + return(false); + } + $this->numeroderegistros=mysql_num_rows($this->filas); // La consulta se ha realizado con �ito + $this->numerodecampos=mysql_num_fields($this->filas); + if ($this->numeroderegistros>0){ + $this->BOF=false; + $this->EOF=false; + $this->campos=mysql_fetch_array($this->filas); + } + $this->estado=1; // Recordset abierto + $this->error[$this->inderror++]=0; // Recuperaci� de registros correcta + $this->ultimoerror=0; + return(true); + } + /* ------------------------------------------------------------------------------------------- + Libera los registros de una consulta de la base de datos + ---------------------------------------------------------------------------------------------*/ + function Cerrar(){ + $this->inderror=-1; // Inicializar contador de errores + $this->ultimoerror=-1; + if (!mysql_free_result($this->filas)){ + $this->error[$this->inderror++]=6; // Error al cerrar la consulta (Al liberar memoria) + $this->ultimoerror=6; + return(false); + } + $this->Inicializar(); + $this->error[$this->inderror++]=0; // Recuperaci� de registros correcta + $this->ultimoerror=0; + return(true); + } + /* ------------------------------------------------------------------------------------------- + Mueve el puntero de lectura al siguiente registro del recordset + ---------------------------------------------------------------------------------------------*/ + function Siguiente(){ + if (!$this->EOF){ + $this->posicion++; + if ($this->posicion==$this->numeroderegistros) + $this->EOF=true; + else{ + if (mysql_data_seek($this->filas,$this->posicion)) + $this->campos=mysql_fetch_array($this->filas); + } + } + } + /* ------------------------------------------------------------------------------------------- + Mueve el puntero de lectura al anterior registro del recordset + ---------------------------------------------------------------------------------------------*/ + function Anterior(){ + if (!$this->BOF){ + $this->posicion--; + if ($this->posicion<0) + $this->BOF=true; + else{ + if (mysql_data_seek($this->filas,$this->posicion)); + $this->campos=mysql_fetch_array($this->filas); + } + } + } + /* ------------------------------------------------------------------------------------------- + Mueve el puntero de lectura al primer registro del recordset + ---------------------------------------------------------------------------------------------*/ + function Primero(){ + if ($this->numeroderegistros>0){ + $this->posicion=0; + if (mysql_data_seek($this->filas,$this->posicion)) + $this->campos=mysql_fetch_array($this->filas); + } + } + /* ------------------------------------------------------------------------------------------- + Mueve el puntero de lectura al ltimo registro del recordset + ---------------------------------------------------------------------------------------------*/ + function Ultimo(){ + if ($this->numeroderegistros>0){ + $this->posicion=$this->numeroderegistros-1; + if (mysql_data_seek($this->filas,$this->posicion)) + $this->campos=mysql_fetch_array($this->filas); + } + } +} +?>
\ No newline at end of file diff --git a/admin/WebConsole/clases/ArbolVistaXML.php b/admin/WebConsole/clases/ArbolVistaXML.php new file mode 100644 index 00000000..05ef00a0 --- /dev/null +++ b/admin/WebConsole/clases/ArbolVistaXML.php @@ -0,0 +1,272 @@ +<? +include_once("XmlPhp.php"); +/*=============================================================== +Esta clase implementa la apariencia y comportamiento de un treeview en código HTML y javascript. +La clase utiliza la clase XmlPhp.php para acceder al documento XML. + + Parámetros del constructor: + -fXML=Fichero XML + -fileocade=Indica si el dato anterior es un fichero o una variable con el contenido del árbol + 0: Es una cadena + 1: Es un fichero + -baseurlimg= Url base de las imágenes de los nodos de contracción-expansión + -clasedefault=Clase por defecto de los literales de los nodos + -nivelexp= Máximo nivel que aparecera expandido + -x= Posición x donde aparecerá la tabla + -y= Posición y donde aparecerá la tabla +=================================================================*/ +class ArbolVistaXML{ + var $baseurlimg; // Base de la URL de las imágenes de los nodos de contracción-expansión + var $clasedefault; // Clase por defecto de los literales de los nodos + var $gXML; // Objeto gestor del documento XML + var $nivelexp; // Nivel máximo que aprecerá visible + var $x; // Posición x donde aparecerá la tabla + var $y; // Posición y donde aparecerá la tabla + var $c_imgnivel=array(); // Imagenes de expansión y contracción para los distintos niveles + var $v_imgnivel=array(); // Valores de expansión y contracción para los distintos niveles + var $nodos_count; // Contador de nodo + + Function ArbolVistaXML($fXML,$fileocade,$baseurlimg="/.images/",$clasedefault,$nivelexp=0,$x=0,$y=0,$tipotabla=0,$titulotabla=""){ + // Constructor + $this->gXML=new XmlPhp($fXML,$fileocade); + $this->baseurlimg=$baseurlimg; + $this->clasedefault=$clasedefault; + $this->nivelexp=$nivelexp; + $this->x=$x; + $this->y=$y; + $this->tipotabla=$tipotabla; + $this->titulotabla=$titulotabla; + + // Anchura de los distibtos tipos de tablas + if($this->tipotabla>0){ + $this->anchoM=" width=100% "; + $this->ancho=" width=100% "; + } + else{ + $this->anchoM=" width=1024 "; + $this->ancho=""; + } + for($i=0;$i<=5;$i++){ // Inicializar + $this->c_imgnivel[$i]=$this->baseurlimg.'/nada.gif'; + $this->v_imgnivel[$i]="nada"; + } + $this->nodos_count=0; + } + /*------------------------------------------------------------------------------------------------ + Esta función devuelve una cadena con el contenido de un treeview en código HTML + ------------------------------------------------------------------------------------------------*/ + Function CreaArbolVistaXML(){ + if (!$this->gXML->NodoRaiz()) return; // No existe documento XML que analizar + $arbol_total='<TABLE border=0 '.$this->anchoM.' class="'.$this->clasedefault. '" style="POSITION:absolute;TOP:'.$this->y.'px;LEFT:'.$this->x.'px" class=texto_arbol cellspacing=0 cellpadding=0 border=0>'; + if($this->tipotabla>0) $arbol_total.='<TR><TH>'. $this->titulotabla .'</TH></TR>'; + $arbol_total.='<TR style="display:block">'; + $arbol_total.='<TD>'; + $arbol_total.='<TABLE id=tablanivel-0 border=0 cellspacing=0 cellpadding="0">'; + $arbol_total.=$this->_arbolXmlrecur(0); + $arbol_total.='</TABLE>'; + $arbol_total.='</TD>'; + $arbol_total.='</TR>'; + $arbol_total.='</TABLE>'; + return($arbol_total); + } + // ------------------------------------------------------------------------------------- + // Recorrido recursivo del arbol XML + // Parámetros: + // nivel: nivel del nodo + // ------------------------------------------------------------------------------------- + function _arbolXmlrecur($nivel){ + $arbol_total=""; + if ($nivel+1>$this->nivelexp) $displai="none"; else $displai="block"; + do{ + $gnptr=$this->gXML->nptr; + $arbol_total.='<TR style="display:block" id=TRNodo-'.$this->nodos_count.'>'; + $arbol_total.='<TD>'; + $arbol_total.=$this->_dibujo_nodo($this->gXML->Nodo(),$nivel,$this->gXML->NumerodeHijos(),$this->gXML->EsUltimoHermano()); + $arbol_total.='</TD>'; + $arbol_total.='</TR>'; + $this->nodos_count++; + if ($this->gXML->PrimerNodoHijo()){ + $arbol_total.='<TR id="TRNodoHijo-'.$this->nodos_count.'" style="display:'.$displai.'">'; + $arbol_total.='<TD>'; + $arbol_total.='<TABLE id="tablanivel-'.($nivel+1).'" border=0 cellspacing=0 cellpadding=0>'; + $arbol_total.=$this->_arbolXmlrecur($nivel+1); + $arbol_total.='</TABLE>'; + $arbol_total.='</TD>'; + $arbol_total.='</TR>'; + } + $this->gXML->nptr=$gnptr; + }while($this->gXML->SiguienteNodoHermano()); + return($arbol_total); + } + // ------------------------------------------------------------------------------------- + // Crea un nodo + // Parámetros: + // nivel: nivel del nodo + // ------------------------------------------------------------------------------------- + function CreaNodo($nivel){ + $nodo=$this->_dibujo_nodo($this->gXML->Nodo(),$nivel,0,true); + return($nodo); + } + /*------------------------------------------------------------------------------------------------ + Dibuja los nodos del árbol + parámetros: + nodo: La información del nodo + nivel: Nivel del nodo + nhijos: numero de hijos + uhermano: Es true si el nodo es el último de sus hermanos + + Especificaciones: + Los atributos de los nodos pueden ser HTML o especificos de + esta aplicación. Lso atributos del nodo propios de ésta son: + + - clicksupimg: Función suplementaria de la imagen de signo + - imagenid: Identificador de la imagen de signo + - clickimg: La función que se ejecutará al hacer click sobre la imagen de nodo + - downimg: La función que se ejecutará al pulsar el ratón sobre la imagen de nodo + - clickcontextualimg: Función que se ejecutara al hacer click con el boton derecho sobre la imagen del nodo + - imagenodo: Es la url de la imagen de nodo + - infonodo: Es texto que se visualiza del nodo + - mouseovernodo: La función a ejecutar cuando se posa el ratón sobre el literal del nodo + - clicksupnodo: Función suplementaria del literal del nodo + - clickcontextualnodo: Función que se ejecutara al hacer click con el boton derecho sobre el nodo + - classnodo: Clase (style) a la que pertenece el nodo + - nodoid: identificador del nodo + - nodovalue: parametro value del nodo + ------------------------------------------------------------------------------------------------*/ + function _dibujo_nodo($nodo,$nivel,$nhijos,$uhermano){ + // Comprobar descendencia y posición dentro de los hermanos + $swu=false; // switch para saber si el nodo es el último hermano + $swh=false; // switch para saber si el nodo tiene hijos + if ($nhijos>0) $swh=true; + $swu=$uhermano; + if ($swh){ // Si tiene hijos .. + if ($swu){ // Si es el último de sus hermanos .. + if ($nivel<$this->nivelexp){ + $this->c_imgnivel[$nivel]=$this->baseurlimg.'/menos_c.gif'; + $this->v_imgnivel[$nivel]="menos_c"; + } + else{ + $this->c_imgnivel[$nivel]=$this->baseurlimg.'/mas_c.gif'; + $this->v_imgnivel[$nivel]="mas_c"; + } + } + else{ // Si NO lo es .. + if ($nivel<$this->nivelexp){ + $this->c_imgnivel[$nivel]=$this->baseurlimg.'/menos_t.gif'; + $this->v_imgnivel[$nivel]="menos_t"; + } + else{ + $this->c_imgnivel[$nivel]=$this->baseurlimg.'/mas_t.gif'; + $this->v_imgnivel[$nivel]="mas_t"; + } + } + if ($nivel==0){ + if ($this->nivelexp>0) + $this->c_imgnivel[$nivel]=$this->baseurlimg.'/menos_root.gif'; + else + $this->c_imgnivel[$nivel]=$this->baseurlimg.'/mas_root.gif'; + } + } + else{ // Si NO tiene hijos .. + if ($swu){ // Si es el último de sus hermanos .. + $this->c_imgnivel[$nivel]=$this->baseurlimg.'/nada_c.gif'; + $this->v_imgnivel[$nivel]="nada_c"; + } + else{ // Si no lo es .. + $this->c_imgnivel[$nivel]=$this->baseurlimg.'/nada_t.gif'; + $this->v_imgnivel[$nivel]="nada_t"; + } + } + // Fin Comprobar descendencia y posición dentro de los hermanos + if($this->tipotabla==0) + $arbol='<TABLE border=0 cellspacing=0 cellpadding=0>'; + else + $arbol='<TABLE style="BORDER-BOTTOM:#000000 1px solid;" border=0 cellspacing=0 cellpadding=0>'; + $arbol.='<TR height="16px">'; + $atributosHTML=" "; + $atributosHTML=$this->gXML->Atributos($nodo); + $colornodo=""; + $fondonodo=""; + $estilo=""; + $atributosHTML=$this->gXML->TomaAtributoEspecial("colornodo",$colornodo,$atributosHTML); + $atributosHTML=$this->gXML->TomaAtributoEspecial("fondonodo",$fondonodo,$atributosHTML); + if ($colornodo!="" ) $colornodo=' COLOR:'.$colornodo.";"; + if ($fondonodo!="" ) $fondonodo=' BACKGROUND-COLOR:'.$fondonodo.";"; + $estilo=$colornodo || $fondonodo; + if ($estilo!="" ) $estilo='style="'.$colornodo.$fondonodo.'"'; + + for ($i=0;$i<$nivel;$i++){ // Niveles previos + $arbol.='<TD '.$estilo.'width="3px"></TD>'; + $arbol.='<TD '.$estilo.' width="16px"><IMG src="'.$this->c_imgnivel[$i].'" width="16px" height="16px" ></TD>'; + } + $arbol.='<TD '.$estilo.' width="3px"></TD>'; // Desplazamiento de la imagen + $arbol.='<TD '.$estilo.' width="16px">'; + + $imagenid=""; + $clicksupimg=""; + $atributosHTML=$this->gXML->TomaAtributoEspecial("imagenid",$imagenid,$atributosHTML); + $atributosHTML=$this->gXML->TomaAtributoEspecial("clicksupimg",$clicksupimg,$atributosHTML); + if ($clicksupimg!="") $clicksupimg.=';'; + if ($swh){ // El nodo tiene hijos + $arbol.='<A href="#"><IMG border=0 '.$estilo.' id="'.$imagenid.'" onclick="clickImagenSigno(this,' ."'".$this->baseurlimg."'".','.$nivel.');'.$clicksupimg.'" src="'.$this->c_imgnivel[$nivel].'" width="16px" height="16px" value="'.$this->v_imgnivel[$nivel].'"></A></TD>'; + } + else + $arbol.='<SPAN><IMG '.$estilo.' id="'.$imagenid.'" src="'.$this->c_imgnivel[$nivel].'" width="16px" height="16px" value="'.$this->v_imgnivel[$nivel].'"></SPAN></TD>'; + + $imagenodo=""; + $clickimg=""; + $downimg=""; + $clickcontextualimg=""; + $styleimg=""; + + $atributosHTML=$this->gXML->TomaAtributoEspecial("imagenodo",$imagenodo,$atributosHTML); + $atributosHTML=$this->gXML->TomaAtributoEspecial("clickimg",$clickimg,$atributosHTML); + $atributosHTML=$this->gXML->TomaAtributoEspecial("downimg",$downimg,$atributosHTML); + $atributosHTML=$this->gXML->TomaAtributoEspecial("clickcontextualimg",$clickcontextualimg,$atributosHTML); + if ($clickimg!="" ) $clickimg=' onclick="'.$clickimg.'" '; + if ($downimg!="" ) $downimg=' onmousedown="'.$downimg.'" '; + if ($clickcontextualimg!="" ) $clickcontextualimg=' oncontextmenu=" '.$clickcontextualimg.'" '; + + if ($clickimg!="" || $downimg!="" || $clickcontextualimg!="" ) $styleimg=' style="cursor:hand"'; + + $arbol.='<TD '.$estilo.' width=16px><IMG '.$styleimg.' src="'.$imagenodo.'"'.$clickimg.$downimg.$clickcontextualimg.' width="16px" height="16px"></TD>'; + $arbol.='<TD '.$estilo.' width="4px"></TD>'; + + $clicksupnodo=""; + $clickcontextualnodo=""; + $classnodo=""; + $nodoid=""; + $nodovalue=""; + $mouseovernodo=""; + $infonodo=""; + + $atributosHTML=$this->gXML->TomaAtributoEspecial("clickcontextualnodo",$clickcontextualnodo,$atributosHTML); + $atributosHTML=$this->gXML->TomaAtributoEspecial("clicksupnodo",$clicksupnodo,$atributosHTML); + $atributosHTML=$this->gXML->TomaAtributoEspecial("classnodo",$classnodo,$atributosHTML); + $atributosHTML=$this->gXML->TomaAtributoEspecial("nodoid",$nodoid,$atributosHTML); + $atributosHTML=$this->gXML->TomaAtributoEspecial("nodovalue",$nodovalue,$atributosHTML); + $atributosHTML=$this->gXML->TomaAtributoEspecial("colornodo",$colornodo,$atributosHTML); + $atributosHTML=$this->gXML->TomaAtributoEspecial("fondonodo",$fondonodo,$atributosHTML); + $atributosHTML=$this->gXML->TomaAtributoEspecial("mouseovernodo",$mouseovernodo,$atributosHTML); + $atributosHTML=$this->gXML->TomaAtributoEspecial("infonodo",$infonodo,$atributosHTML); + if ($clickcontextualnodo!="" ) $clickcontextualnodo=' oncontextmenu="'.$clickcontextualnodo.'" '; + if ($mouseovernodo!="" ) $mouseovernodo=' onmouseover="'.$mouseovernodo.'" '; + if ($nodovalue!="" ) $nodovalue=' value="'.$nodovalue.'" '; + if (!$classnodo) $classnodo=$this->clasedefault; + + $arbol.='<TD width="1024px" '.$estilo.' class="'.$classnodo.'">'; + $arbol.='<A href="#" class="'.$this->clasedefault. '" style="text-decoration: none"><SPAN id="'.$nodoid.'" '; + if($this->tipotabla<2){ + $arbol.=' onclick="clickLiteralNodo(this ,' ."'".$this->baseurlimg."'".');'; + $arbol.=" ".$clicksupnodo.'"'.$nodovalue.$mouseovernodo.$clickcontextualnodo; + } + $arbol.=' >'.$infonodo.'</SPAN></A></TD>'; + $arbol.='</TR>'; + $arbol.='</TABLE>'; + if ($swu) + $this->c_imgnivel[$nivel]=$this->baseurlimg.'/nada.gif'; + else + $this->c_imgnivel[$nivel]=$this->baseurlimg.'/nada_l.gif'; + return($arbol); + } +} // Fin de la clase
\ No newline at end of file diff --git a/admin/WebConsole/clases/EncripDescrip.php b/admin/WebConsole/clases/EncripDescrip.php new file mode 100644 index 00000000..893bf48f --- /dev/null +++ b/admin/WebConsole/clases/EncripDescrip.php @@ -0,0 +1,56 @@ +<?php + +/*================================================================================ + Clase para encriptar y desencriptar cadenas cadenas +================================================================================*/ +class EncripDescrip{ + var $cadena; // La cadena encriptada o desencriptada que ser�devuelta + var $clave; // La clave de la cadena encriptada o desencriptada que ser�devuelta + //________________________________________________________________________________________ + // + // Constructor + //________________________________________________________________________________________ + function EncripDescrip($clave=12){ + $this->cadena=""; + $this->clave=$clave; + } + // ____________________________________________________________________________ + // + // Encripta una cadena + //_____________________________________________________________________________ + function Encriptar($cadena){ + + return( $cadena); + + $clave=(int)$this->clave; + $clave = (int)$clave & 0xFF; + $lon=strlen($cadena); + $this->cadena=""; + for($i=0;$i<$lon;$i++){ + $ch=(int)ord($cadena[$i]); + $pot=(int)$ch^(int)$clave; + $this->cadena.=chr($pot); + } + return( $this->cadena); + } + // ____________________________________________________________________________ + // + // Desencripta una cadena + //_____________________________________________________________________________ + function Desencriptar($cadena){ + + return( $cadena); + + $clave=(int)$this->clave; + $clave = (int)$clave & 0xFF; + $lon=strlen($cadena); + $this->cadena=""; + for($i=0;$i<$lon;$i++){ + $ch=(int)ord($cadena[$i]); + $pot=(int)$ch^(int)$clave; + $this->cadena.=chr($pot); + } + return( $this->cadena); + } +} +?>
\ No newline at end of file diff --git a/admin/WebConsole/clases/MenuContextual.php b/admin/WebConsole/clases/MenuContextual.php new file mode 100644 index 00000000..baa9aa33 --- /dev/null +++ b/admin/WebConsole/clases/MenuContextual.php @@ -0,0 +1,164 @@ +<?php +/*================================================================================================== +Clase para trabajar con menús contextuales. + + Especificaciones de las etiquetas XML: + - MENUCONTEXTUAL: Elemento raiz en el se especifican los atributos del <DIV> + - ITEM: Especificaciones de cada item. + - SEPARADOR: Indica una linea divisoria entre items + + Especificaciones de atributos: + - idctx: Identificador del menu contextual (DIV) + - imgitem: La url de la imagen que acompañará al literal + - alignitem: La alineación del texto del item (por defecto left) + - textoitem: El literal del item + - subflotante: Si el item despliega otro menu contextual. El valor es el id de ése + - maxanchu: Máxima anchura del menu contextual + - swimg: Vale 1 si el menu tiene algún item con imagen y 0 en caso contrario + - alpulsar: Nombre de la función javascript que se ejecutará en respuesta al evento onclick + - clase: Estilo CSS que tendrán los item menu contextual + - origen_x: Posición de origen, coordenada x + - origen_y: Posición de origen, coordenada y + + + Especificaciones de eventos: + - Los eventos onmouseover y onmouseout están implicitos en la clase por defecto + Especificaciones de submenus: + - Si una opción lleva un submenu asociado el id de éste va en el atributo name del <TR> + + +==================================================================================================*/ +class MenuContextual{ + Function MenuContextual($urlImages="../images/flotantes"){ + $this->urlImg=$urlImages; + } + /*--------------------------------------------------------------------------------------------- + Devuelve una cadena en formato HTML de un layer para usarlo como menu contextual + Parametros: + - cadenaXML: Una cadena en formato XML con los atributos de cada item + ---------------------------------------------------------------------------------------------*/ + function CreaMenuContextual($cadenaXML){ + $idx=0; + $layer=""; + $idctx=""; + $maxanchu=100; + $swimg=0; + $imgitem=""; + $alignitem=""; + $textoitem=""; + $clase=""; + $subflotante=""; + $origen_x="0"; + $origen_y="0"; + + $gXML=new XmlPhp($cadenaXML,0); + $gXML->NodoRaiz(); + $atributosHTML=$gXML->Atributos(); + $atributosHTML=$gXML->TomaAtributoEspecial("maxanchu",$maxanchu,$atributosHTML); + $atributosHTML=$gXML->TomaAtributoEspecial("swimg",$swimg,$atributosHTML); + $atributosHTML=$gXML->TomaAtributoEspecial("clase",$clase,$atributosHTML); + $atributosHTML=$gXML->TomaAtributoEspecial("idctx",$idctx,$atributosHTML); + $atributosHTML=$gXML->TomaAtributoEspecial("origen_x",$origen_x,$atributosHTML); + $atributosHTML=$gXML->TomaAtributoEspecial("origen_y",$origen_y,$atributosHTML); + if(empty($origen_x)) $origen_x=0; + if(empty($origen_y)) $origen_y=0; + if (!$clase) $clase="menu_contextual"; + $layer.='<DIV class="'.$clase.'" id="'.$idctx.'" width='.$maxanchu.' style="visibility:hidden;position:absolute;top:'.$origen_y.';left:'.$origen_x.'" >'; + $nuitems=2; + if ($gXML->PrimerNodoHijo()){ + $layer.='<TABLE border=0 width='.$maxanchu.' border=0 cellspacing=0 cellpadding=0>'; + $layer.='<TR width='.$maxanchu.' height=3>'; // Primera linea + $layer.='<TD width=3 background="'.$this->urlImg.'/esi.gif"></TD>'; + $layer.='<TD colspan=6 background="'.$this->urlImg.'/lsu.gif"></TD>'; + $layer.='<TD width=3 background="'.$this->urlImg.'/esd.gif"></TD>'; + $layer.='</TR>'; + + $layer.='<TR width='.$maxanchu.' height=3>'; // Linea de relleno + $layer.='<TD width=3 background="'.$this->urlImg.'/liz.gif"></TD>'; + $layer.='<TD width=3></TD>'; + $layer.='<TD colspan=4></TD>'; + $layer.='<TD width=3></TD>'; + $layer.='<TD width=3 background="'.$this->urlImg.'/ldr.gif"></TD>'; + $layer.='</TR>'; + do{ + $nuitems++; + $atributosHTML=$gXML->Atributos(); + $tiponodo=$gXML->NombreNodo(); + if ($tiponodo=="ITEM"){ + $atributosHTML=$gXML->TomaAtributoEspecial("imgitem",$imgitem,$atributosHTML); + $atributosHTML=$gXML->TomaAtributoEspecial("textoitem",$textoitem,$atributosHTML); + $atributosHTML=$gXML->TomaAtributoEspecial("subflotante",$subflotante,$atributosHTML); + $atributosHTML=$gXML->TomaAtributoEspecial("alpulsar",$alpulsar,$atributosHTML); + $atributosHTML=$gXML->TomaAtributoEspecial("alignitem",$alignitem,$atributosHTML); + + if ($alignitem==null) $alignitem="left"; + + $clickcontextual=' onclick="'.$alpulsar.'" '; + $oncontextual=' onmouseover="sobre_contextual(this)" '; + $offcontextual=""; + + $idx++; + $layer.='<TR id='.$idx.' name="'.$subflotante.'" width='.$maxanchu.' '.$clickcontextual.' '.$oncontextual.' '.$offcontextual.' height=20>'; // Linea de item + $layer.='<TD width=3 background="'.$this->urlImg.'/liz.gif"></TD>'; + $layer.='<TD width=3></TD>'; + + if ($imgitem!=null){ // Item con imagen + $imgonclick=""; + $layer.='<TD width=20 align=center id="TDimg-'.$idx .'"><IMG width=16 src="'.$imgitem.'"></TD>'; + $layer.='<TD width=3></TD>'; + $layer.='<TD align='.$alignitem.' id="TDLit-'.$idx .'" width='.($maxanchu-38).' '.$atributosHTML.'><A href="#" style="text-decoration: none"><SPAN>'.$textoitem.'</SPAN></A></TD>'; + } + else{ + if ($swimg==1){ // Hay algún item con imagen + $layer.='<TD width=20></TD>'; + $layer.='<TD width=3></TD>'; + $layer.='<TD align='.$alignitem.' width='.($maxanchu-38).' '.$atributosHTML.'><A href="#" style="text-decoration: none"><SPAN>'.$textoitem.'</SPAN></A></TD>'; + } + else{ + $layer.='<TD width=10></TD>'; + $layer.='<TD colspan=2 align='.$alignitem.' width='.($maxanchu-25).' ' .$atributosHTML.' ><A href="#" style="text-decoration: none"><SPAN>'.$textoitem.'</SPAN></A></TD>'; + } + } + if ($subflotante!=null) + $layer.='<TD valign=middle><IMG width=3 name="swsbfn" align=left src="'.$this->urlImg.'/swsbfn.gif">'; + else + $layer.='<TD width=3 >'; + $layer.='</TD>'; + $layer.='<TD width=3></TD>'; + $layer.='<TD width=3 background="'.$this->urlImg.'/ldr.gif"></TD>'; + $layer.='</TR>'; + } + if ($tiponodo=="SEPARADOR"){ // Separadores + $layer.='<TR width='.$maxanchu.' height=16>'; // Linea de separación + $layer.='<TD width=3 background="'.$this->urlImg.'/liz.gif"></TD>'; + $layer.='<TD width=3></TD>'; + $layer.='<TD colspan=4 background="'.$this->urlImg.'/sep.gif"></TD>'; + $layer.='<TD width=3></TD>'; + $layer.='<TD width=3 background="'.$this->urlImg.'/ldr.gif"></TD>'; + $layer.='</TR>'; + } + + }while($gXML->SiguienteNodoHermano()); + + $layer.='<TR width='.$maxanchu.' height=3>'; // Linea de relleno + $layer.='<TD width=3 background="'.$this->urlImg.'/liz.gif"></TD>'; + $layer.='<TD width=3></TD>'; + $layer.='<TD colspan=4></TD>'; + $layer.='<TD width=3></TD>'; + $layer.='<TD width=3 background="'.$this->urlImg.'/ldr.gif"></TD>'; + $layer.='</TR>'; + + + $layer.='<TR width='.$maxanchu.' height=3>'; // Última linea + $layer.='<TD width=3 background="'.$this->urlImg.'/eii.gif"></TD>'; + $layer.='<TD colspan=6 background="'.$this->urlImg.'/lin.gif"></TD>'; + $layer.='<TD width=3 background="'.$this->urlImg.'/eid.gif"></TD>'; + $layer.='</TR>'; + $layer.='</TABLE>'; + $layer.='<INPUT type=hidden value="-1">'; // Representará el Ãndice seleccionado + $layer.='</DIV>'; + } + return($layer); + } +} +?>
\ No newline at end of file diff --git a/admin/WebConsole/clases/SockHidra.php b/admin/WebConsole/clases/SockHidra.php new file mode 100644 index 00000000..66223e47 --- /dev/null +++ b/admin/WebConsole/clases/SockHidra.php @@ -0,0 +1,120 @@ +<?php + +include_once("EncripDescrip.php"); + +/*================================================================================ + Clase para conectarse con el servidor hidra y enviar comandos + Cualquier error producido en los procesos se puede recuperar con los m�odos +================================================================================*/ +class SockHidra{ + var $ultimoerror; // Ultimo error detectado + var $descripultimoerror; // Descripción del ltimo error detectado + var $socket; // Stream socket + var $servidor; // El servidor hidra + var $puerto; // El puerto odnde se conectar� + var $timeout; // El tiempo de espera para la conexi� + var $encripdescrip; // El encriptador + var $LONGITUD_TRAMA; // M�ima longitud de la trama + + //________________________________________________________________________________________ + // + // Constructor + // Par�etros: + // - servidor: El nombre o la IP del servidor + // - puerto: El puerto usado para las comunicaciones + // - timeout: El tiempo de espera para la conexi� + //________________________________________________________________________________________ + function SockHidra($servidor,$puerto,$timeout=30){ + $this->servidor=$servidor; + if (!$this->_esIP($this->servidor)) + $this->servidor = gethostbyname ($servidor); + $this->puerto=$puerto; + $this->timeout=$timeout; + $this->LONGITUD_TRAMA=4048; + + $this->encripdescrip=new EncripDescrip(); + } + //________________________________________________________________________________________ + // + // Averigua si el parametro pasado es una IP. devuelve true en caso afirmativo + //________________________________________________________________________________________ + function _esIP(){ + return(false); + } + //________________________________________________________________________________________ + // + // Conecta con el servidor + // Devuelve: + // - false: Si falla la conexi� + // - true: En caso contrario + //________________________________________________________________________________________ + function conectar(){ + $this->socket = socket_create (AF_INET, SOCK_STREAM, 0); + if ($this->socket < 0) { + $this->ultimoerror=socket_strerror($socket); + $this->descripultimoerror="socket_create() fallo"; + return(false); + } + $result = socket_connect ($this->socket,$this->servidor,$this->puerto); + if ($result < 0) { + $this->ultimoerror=socket_strerror($result); + $this->descripultimoerror="socket_connect() fallo"; + return(false); + } + return(true); + } + //________________________________________________________________________________________ + // + // Cerrar la conexióncon el servidor + // Devuelve: + // - false: Si falla la conexi� + // - true: En caso contrario + //________________________________________________________________________________________ + function desconectar(){ + socket_close ($this->socket); + } + //________________________________________________________________________________________ + // + // Devuelve el c�igo del ltimo error ocurrido durante el proceso anterior. + //________________________________________________________________________________________ + function UltimoError(){ + return($this->ultimoerror); + } + //________________________________________________________________________________________ + // + // Devuelve una cadena con el mensage del ltimo error ocurrido durante el proceso anterior. + //________________________________________________________________________________________ + function DescripUltimoError(){ + return($this->descripultimoerror); + } + //________________________________________________________________________________________ + // + // Envia una trama de comando al servidor + // Par�etros: + // - trama: Trama a enviar + //________________________________________________________________________________________ + function envia_comando($parametros){ + $trama="@JMMLCAMDJ".$parametros; + $resul=socket_write($this->socket, $this->encripdescrip->Encriptar($trama), strlen($trama)); + if (!$resul) { + $this->ultimoerror=socket_strerror($resul); + $this->descripultimoerror="socket_write() fallo"; + return(false); + } + return(true); + } + //________________________________________________________________________________________ + // + // Recibe una trama del servidor + // Par�etros: + // - lon: Longitud de la trama + // Devuelve: + // La trama recibida + //________________________________________________________________________________________ + function recibe_respuesta(){ + $trama = socket_read ($this->socket,$this->LONGITUD_TRAMA); + $cadenaret=$this->encripdescrip->Desencriptar($trama); + return($cadenaret); + } + } +?>
\ No newline at end of file diff --git a/admin/WebConsole/clases/XmlPhp.php b/admin/WebConsole/clases/XmlPhp.php new file mode 100644 index 00000000..190fe84a --- /dev/null +++ b/admin/WebConsole/clases/XmlPhp.php @@ -0,0 +1,285 @@ +<? +/*================================================================================ +Esta clase implementa funciones de utilidad para tratar ficheros XML + + Parametros del constructor: + fxml=Fichero XML que contiene los atributos de los nodos + fileocade=Indica si el dato anterior es un fichero o una variable con el contenido del árbol: + 0: Es una cadena + 1: Es un fichero + + Especificaciones: + Se le llama información del nodo al nombre del nodo + sus atributos eliminando los marcadores + de comienzo:"<" y fin:">" +================================================================================*/ +class XmlPhp{ + var $buffer; + var $nptr; + + Function XmlPhp($fxml,$fileocade){ // Constructor + if ($fileocade==0){ + $this->nptr=1; + $this->buffer=trim($fxml); + } + else{ + $tbuffer=filesize($fxml); // Calcula tamaño del fichero + if ($tbuffer>0){ // EL fichero tiene contenido + $fd=fopen($fxml, "r"); + $this->buffer=fread ($fd,$tbuffer); + fclose ($fd); + $this->nptr=1; + $this->buffer=trim($this->buffer); + } + } + $this->buffer=ereg_replace( "[\n\r\t]"," ", $this->buffer ); + } + /* ------------------------------------------------------------------------------------------- + Recupera la información del primer nodo (nodo raiz) del arbol.Devuelve false en caso de que + no tenga hijos o bien no exista documento XML que analizar. + ---------------------------------------------------------------------------------------------*/ + function InfoNodoRaiz(){ + if (!$this->NodoRaiz()) // No existe documento XML + return(false); + return($this->Infonodo()); + } + /* ------------------------------------------------------------------------------------------- + Establece el puntero de nodos al primer nodo del árbol (nodo raiz). Devuelve false en caso + de que no exista documento XML que analizar. + ---------------------------------------------------------------------------------------------*/ + function NodoRaiz(){ + if ($this->buffer==null) return(false); // No existe documento XML + $this->nptr=0; + while ($this->nptr<strlen($this->buffer)) + if ('<'==substr($this->buffer,$this->nptr++,1)) return(true); + return(false); + } + /* ------------------------------------------------------------------------------------------- + Recupera la información del primer nodo hijo del nodo actual. Devuelve false en caso de que + no tenga hijos o bien no exista documento XML que analizar. + ---------------------------------------------------------------------------------------------*/ + function InfoPrimerNodoHijo(){ + if (!$this->PrimerNodoHijo()) // No tiene hijos o no existe documento XML + return(false); + return($this->Infonodo()); + } + /* ------------------------------------------------------------------------------------------- + Establece el puntero de nodos al primer nodo hijo del nodo actual. Devuelve false en caso + de que no tenga hijos o bien no exista documento XML que analizar. + ---------------------------------------------------------------------------------------------*/ + function PrimerNodoHijo(){ + if ($this->buffer==null) return(false); // No existe documento XML + $gnptr=$this->nptr; + while ($this->nptr<strlen($this->buffer)) + if ('<'==substr($this->buffer,$this->nptr++,1)) break; + $lon=$this->nptr; + if ('/'==substr($this->buffer,$lon,1)){ // No tiene hijos + $this->nptr=$gnptr; + return(false); + } + return(true); + } + /* ------------------------------------------------------------------------------------------- + Recupera la información del siguiente nodo hermano del actual. Devuelve false en caso de que + el nodo actual sea el último de sus hermanos o bien no exista documento XML que analizar. + ---------------------------------------------------------------------------------------------*/ + function InfoSiguienteNodoHermano(){ + if (!$this->SiguienteNodoHermano()) // No tiene hermanos o no existe documento XML + return(false); + return($this->Infonodo()); + } + /* ------------------------------------------------------------------------------------------- + Establece el puntero de nodos al siguiente nodo hermano del nodo actual. Devuelve false en + caso de que el nodo actual sea el último de los hermanos o bien no exista documento XML que analizar. + ---------------------------------------------------------------------------------------------*/ + function SiguienteNodoHermano(){ + if ($this->buffer==null) return(false); // No existe documento XML + $gnptr=$this->nptr; + $resul=$this->_siguiente_hermano(); + if (!$resul){ + $this->nptr=$gnptr; // Es el último hermano + return(false); + } + return(true); + } + /* ------------------------------------------------------------------------------------------- + Establece el puntero de nodos al siguiente nodo hermano del actual + ---------------------------------------------------------------------------------------------*/ + function _siguiente_hermano(){ + $lon=$this->nptr; + $sw=1; + $nombrenodo=$this->NombreNodo(); + while (1){ + $lon = strpos($this->buffer,'<',++$lon); + if (substr($this->buffer,++$lon,1)=='/') + $sw--; + else + $sw++; + if ($sw==0){ + while ($lon<strlen($this->buffer)){ + if (substr($this->buffer,$lon++,1)=='<'){ + if (substr($this->buffer,$lon,1)=='/') + return(false); // Es el último hermano + else{ + $this->nptr=$lon; + return(true); + } + } + } + return(false); // Se trata del nodo raiz + } + } + } + /* ------------------------------------------------------------------------------------------- + Recupera el número de hijos del nodo actual + ---------------------------------------------------------------------------------------------*/ + function NumerodeHijos(){ + $gnptr=$this->nptr; + $nh=0; + if ($this->PrimerNodoHijo()){ + $nh++; + while ($this->SiguienteNodoHermano()) $nh++; + } + $this->nptr=$gnptr; + return($nh); + } + /* ------------------------------------------------------------------------------------------- + Devuelve true si el nodo es el último de sus hermanos + ---------------------------------------------------------------------------------------------*/ + function EsUltimoHermano(){ + $gnptr=$this->nptr; + if (!$this->SiguienteNodoHermano()){ + $this->nptr=$gnptr; + return(true); + } + $this->nptr=$gnptr; + return(false); + } + /* ------------------------------------------------------------------------------------------- + Devuelve los atributos del nodo. + Prámetros: + Si se aporta el puntero del nodo se devolverán los atributos del nodo apuntado + pero si no se especifican argumentos se devuelven los atributos del nodo actual. + ---------------------------------------------------------------------------------------------*/ + function Atributos($ptrnodo=-1){ + if ($ptrnodo!=-1) + $this->_setnodo($ptrnodo); + $atributosHTML=""; + $info=$this->Infonodo(); + $pos=strpos($info," "); + if ($pos) // El nodo tiene atributos + $atributosHTML=" ".substr($info,$pos); + return($atributosHTML); + } + /* ------------------------------------------------------------------------------------------- + Posiciona el puntero de nodos + ---------------------------------------------------------------------------------------------*/ + function _setnodo($ptrnodo){ + $this->nptr=$ptrnodo; + } + /* ------------------------------------------------------------------------------------------- + Devuelve el puntero del nodo actual + ---------------------------------------------------------------------------------------------*/ + function Nodo(){ + return($this->nptr); + } + /* ------------------------------------------------------------------------------------------- + Recupera el nombre del nodo + ---------------------------------------------------------------------------------------------*/ + function NombreNodo(){ + $infonodo=$this->Infonodo(); + $trozos=split(" ",$infonodo); + return ($trozos[0]); + } + /* ------------------------------------------------------------------------------------------- + Recupera la información del nodo actual + ---------------------------------------------------------------------------------------------*/ + function Infonodo(){ + if ($this->buffer==null) return(false); // No existe documento XML + $lon=$this->nptr; + while ($lon<strlen($this->buffer)) + if ('>'==substr($this->buffer,++$lon,1)) break; + $info=trim(substr($this->buffer,$this->nptr,$lon-$this->nptr)); + $info=str_replace("[","<",$info); + $info=str_replace("]",">",$info); + return $info; + } + /* ------------------------------------------------------------------------------------------- + Recorre el arbol de nodos del documento XML y para cada nodo genera un evento que se + puede capturar a través de una funcion que tiene esta forma: + fNodoXML(nivel,infonodo) donde: + - nivel es el nivel de profundidad del nodo (en base 0) + - infonodo es toda la información contenida en el nodo. + ---------------------------------------------------------------------------------------------*/ + function RecorreArboXML(){ + if (!$this->NodoRaiz()) return; // No existe documento XML que analizar + $this->_arbolXmlrecur(0); + } + // ------------------------------------------------------------------------------------- + // Recorrido recursivo del arbol XML + // ------------------------------------------------------------------------------------- + function _arbolXmlrecur($nivel){ + do{ + $infonodo=$this->Infonodo(); + fNodoXML($nivel,$infonodo); + $gnptr=$this->nptr; + if ($this->PrimerNodoHijo()) + $this->_arbolXmlrecur($nivel+1); + $this->nptr=$gnptr; + }while($this->SiguienteNodoHermano()); + } + /*------------------------------------------------------------------------------------------------ + Elimina un atributo de la información del nodo + Parametros: + - nombreatributo:El nombre del atributo + - info: La información del Nodo + ------------------------------------------------------------------------------------------------*/ + function EliminaAtributo($nombreatributo,$info){ + $nada=""; + return($this->TomaAtributo($nombreatributo,&$nada,$info,true)); + } + /*------------------------------------------------------------------------------------------------ + Recupera el valor del atributo y lo elimina de la información del nodo + Parametros: + - nombreatributo:El nombre del atributo + - puntero: Referencia a la variable que contendrá el valor del atributo + - info: La información del Nodo + ------------------------------------------------------------------------------------------------*/ + function TomaAtributoEspecial($nombreatributo,&$puntero,$info){ + return($this->TomaAtributo($nombreatributo,&$puntero,$info,true)); + } + /*------------------------------------------------------------------------------------------------ + Recupera el valor del atributo + Parametros: + - nombreatributo:El nombre del atributo + - puntero: Referencia a la variable que contendrá el valor del atributo + - info: La información del Nodo + - sw: Si vale true el atributo se eliminará de la información del nodo + ------------------------------------------------------------------------------------------------*/ + function TomaAtributo($nombreatributo,&$puntero,$info,$swkill=false){ + $doblescomillas='"'; + $strAtributo=" ".$nombreatributo."="; + $pos=strpos($info,$strAtributo); + if (!$pos){ + $puntero=null; + return($info); + } + $pos+=strlen($strAtributo); // Avanza hasta el signo igual + $posa=$pos; // Primera posición del valor del atributo + $swcomillas=false; + while ($pos<strlen($info)){ + if ($doblescomillas==substr($info,$pos,1)) $swcomillas=!$swcomillas; + if (' '==substr($info,$pos,1) || '> '==substr($info,$pos,1)) + if (!$swcomillas) break; + $pos++; + } + $posb=$pos; + $valoratributo=substr($info,$posa,$posb-$posa); + if ($swkill) // Eliminar el atributo de la la cadena + $info=str_replace($strAtributo.$valoratributo,"",$info); // Elimina el atributo de la información + if ($doblescomillas==substr($valoratributo,0,1)) // Elimina las comillas + $valoratributo=str_replace($doblescomillas,"",$valoratributo); + $puntero=$valoratributo; + return($info); + } +} // Fin de la clase +?>
\ No newline at end of file diff --git a/admin/WebConsole/clases/jscripts/ArbolVistaXML.js b/admin/WebConsole/clases/jscripts/ArbolVistaXML.js new file mode 100644 index 00000000..249abb29 --- /dev/null +++ b/admin/WebConsole/clases/jscripts/ArbolVistaXML.js @@ -0,0 +1,565 @@ +// ************************************************************************************************ +// Libreria de scripts de Javascript +// Autor: José Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla + +// Fichero: ArbolVistaXML.js +// Este fichero implementa las funciones javascript de la clase ArbolVistaXML.php +// ************************************************************************************************* +var botonraton=null; // Botón presionado +var currentNodo=""; // Nodo actual +var currentpathimg=""; // Path por defecto de las imágenes de signo +var gLiteralcolor; // Color nodo vista para restablecer +var gLiteralbackground; // Fondo color nodo vista para restablecer +//________________________________________________________________________________________________________ +// definicion dela clase triada +//________________________________________________________________________________________________________ + function NodoVista(){ + this.nivel=0; // Profundidad del nodo + this.imgsigno=null; // Objeto IMG (Imagen de signo de la celda vista) O SPAN si el nodo vista no tiene hijos + this.literal=null; // Objeto SPAN (Literal de la celda vista) + + this.CeldaVista=null; // El objeto TABLE que contiene la imagen de signo y el literal) + this.Nodo=null; // El nodo en si (Objeto TR que contiene el objeto TABLE celda vista final) + this.ArbolHijos=null; // El arbol conteniendo todos los nodos hijos ( Si nulo no tiene hijos)(Objeto TR) + this.NodoPadre=null; // El nodo padre (Objeto TR que contiene el objeto TABLE celda vista final, del padre) + this.ArbolHijosNodoPadre=null; // El arbol del padre conteniendo los nodos hijos(Objeto TR) + this.siguienteHermano=null; // El nodo hermano siguiente ( Si nulo es el último hermano)(Objeto TR) + //____________________________________________________________________________ + // + // Devuelve el estado del nodo 0: Contraido 1:Desplegado + //____________________________________________________________________________ + this.estadoNodo= function(){ + var signoimg=this.imgsigno.getAttribute("value"); + var estado; + switch(signoimg){ + case "menos_t" : + case "menos_c" : + estado=1; + break; + case "mas_t" : + case "mas_c" : + estado=0; + break; + default: + estado=-1; + } + return(estado); + } + //____________________________________________________________________________ + // + // Devuelve el segundo dato de una cadena con formato xxxxx-xxx que es id del nodo vista + //____________________________________________________________________________ + this.toma_identificador= function(){ + if(this.literal==null) return(null); + var cadena=this.literal.getAttribute("id"); + var iditem=cadena.split("-") // Toma el identificador + return(iditem[1]); + } + //____________________________________________________________________________ + // + // Devuelve el primer dato de una cadena con formato xxxxx-xxx que es sufijo del nodo vista + //____________________________________________________________________________ + this.toma_sufijo= function(){ + if(this.literal==null) return(null); + var cadena=this.literal.getAttribute("id"); + var iditem=cadena.split("-") // Toma el identificador + return(iditem[0]); + } + //____________________________________________________________________________ + // + // Devuelve el literal de un nodo vista + //____________________________________________________________________________ + this.toma_infonodo= function(){ + if(this.literal==null) return(null); + return(this.literal.innerHTML); + } + //____________________________________________________________________________ + // + // Devuelve el literal de un nodo vista + //____________________________________________________________________________ + this.pone_infonodo= function(lit){ + this.literal.innerHTML=lit; + } + //____________________________________________________________________________ + // + // Devuelve true si el nodo tiene hijos,false en caso contrario + //____________________________________________________________________________ + this.TieneHijos= function(){ + return(this.ArbolHijos!=null); + } + //____________________________________________________________________________ + // + // Devuelve true si el nodo es el último, false en caso contrario + //____________________________________________________________________________ + this.UltimoHermano= function(){ + return(this.siguienteHermano==null); + } + //____________________________________________________________________________ + // + // Devuelve el nodo vista padre + //____________________________________________________________________________ + this.PapaNodo= function(){ + if(this.NodoPadre==null) return(null); + var oTABLE=this.NodoPadre.getElementsByTagName('TABLE')[0]; + return(TomaDatosNodo(oTABLE)); + } + // Fin de la clase +} +//________________________________________________________________________________________________________ +// +// Devuelve un nodo vista +// Parametro: +// o: Objeto que puede ser la imagen de signo o el literal de una de las lineas del arbolVista +//________________________________________________________________________________________________________ + function TomaDatosNodo(o){ + var nodo=new NodoVista(); + + while(o.tagName!="TABLE" ) + o=o.parentNode; + nodo.CeldaVista=o; + var TAnchor=nodo.CeldaVista.getElementsByTagName('A'); + if(TAnchor.length==2){ // Imagen de signo pulsable + nodo.imgsigno=TAnchor[0].childNodes[0]; + nodo.literal=TAnchor[1].childNodes[0]; + } + else{ + var TSpan=nodo.CeldaVista.getElementsByTagName('SPAN'); + nodo.imgsigno=TSpan[0].childNodes[0]; + nodo.literal=TAnchor[0].childNodes[0]; + } + while(o.tagName!="TR" ) + o=o.parentNode; + nodo.Nodo=o; + + while(o.tagName!="TABLE" ) + o=o.parentNode; + var Mnivel=o.getAttribute("id").split("-") + nodo.nivel=Mnivel[1] + + while(o.tagName!="TR" ) + o=o.parentNode; + nodo.ArbolHijosNodoPadre=o; + + if(parseInt(nodo.nivel)>0){ + o=o.previousSibling; + while(o.nodeType!=1 ) + o=o.previousSibling + nodo.NodoPadre=o; + } + else + nodo.NodoPadre=null; // Es el primer nodo + var o=nodo.Nodo; + var auxsplit=o.getAttribute("id"); + var idTR=auxsplit.split("-") [0]; + o=o.nextSibling + while(o!=null && o.nodeType!=1 ) + o=o.nextSibling + if(o==null){ // Es el último hermano y no tiene hijos + nodo.ArbolHijos=null; + nodo.siguienteHermano=null; + return(nodo); + } + var auxsplit=o.getAttribute("id"); + var idTRhijo=auxsplit.split("-") [0]; + if(idTR==idTRhijo) { // El nodo no tiene hiijos y no es último hermano + nodo.ArbolHijos=null; + nodo.siguienteHermano=o; + return(nodo); + } + nodo.ArbolHijos=o; + o=o.nextSibling + while(o!=null && o.nodeType!=1) + o=o.nextSibling + if(o==null){ // El nodo tiene hijos y es ultimo hermano + nodo.siguienteHermano=null; + return(nodo); + } + nodo.siguienteHermano=o; // El nodo tiene hijos y no es último hermano + return(nodo); + } +//----------------------------------------------------------------------------------------------------------------------- +// Gestiona el despliegue y contracción de nodovs +//----------------------------------------------------------------------------------------------------------------------- +function clickNodo(nodov,pathimg){ + var signoimg=nodov.imgsigno.getAttribute("value"); + switch(signoimg){ + case "menos_t" : + nodov.imgsigno.setAttribute("value","mas_t",null); + nodov.imgsigno.setAttribute("src",pathimg+"/mas_t.gif",null); + nodov.ArbolHijos.style.display="none" + break; + case "menos_c" : + nodov.imgsigno.setAttribute("value","mas_c",null); + nodov.imgsigno.setAttribute("src",pathimg+"/mas_c.gif",null); + if (nodov.nivel==0) + nodov.imgsigno.setAttribute("src",pathimg+"/mas_root.gif",null); + nodov.ArbolHijos.style.display="none" + break; + case "mas_t" : + nodov.imgsigno.setAttribute("value","menos_t",null); + nodov.imgsigno.setAttribute("src",pathimg+"/menos_t.gif",null); + nodov.ArbolHijos.style.display="block" + break; + case "mas_c" : + nodov.imgsigno.setAttribute("value","menos_c",null); + nodov.imgsigno.setAttribute("src",pathimg+"/menos_c.gif",null); + if (nodov.nivel==0) + nodov.imgsigno.setAttribute("src",pathimg+"/menos_root.gif",null); + nodov.ArbolHijos.style.display="block" + break; + } +} +//----------------------------------------------------------------------------------------------------------------------- +// Gestiona el despliegue y contracción de nodos a través de la imagen del nodo +//----------------------------------------------------------------------------------------------------------------------- +function clickImagenSigno(oIMG,pathimg){ + currentpathimg=pathimg; + var nodov=TomaDatosNodo(oIMG); + clickNodo(nodov,pathimg); + if (EsAncestro(nodov,currentNodo)) + resalta(nodov); +} +//----------------------------------------------------------------------------------------------------------------------- +// Gestiona el despliegue y contracción de nodos a través del literal del nodo +//----------------------------------------------------------------------------------------------------------------------- +function clickLiteralNodo(oLIT,pathimg){ + var nodov=TomaDatosNodo(oLIT); + resalta(nodov); + if(nodov.imgsigno==null) return; + + if(pathimg==null){ + var signoimg=nodov.imgsigno.getAttribute("src"); + var p=signoimg.lastIndexOf("/"); + var pathimg=signoimg.substring(0,p); + currentpathimg=pathimg; + } + var signoimg=nodov.imgsigno.getAttribute("value"); + var signo=signoimg.split("_") + if(botonraton==1){ + if (signo[0]=="mas" || signo[0]=="menos" ) clickNodo(nodov,pathimg); + } + else{ + if (signo[0]=="mas" ) clickNodo(nodov,pathimg); + } +} +//----------------------------------------------------------------------------------------------------------------------- +// Resalta el nodo vista seleccionado y lo pone como nodo vista actual +//----------------------------------------------------------------------------------------------------------------------- +function resalta(nodov){ + if(currentNodo==nodov) return; + if (currentNodo){ + currentNodo.literal.style.color=gLiteralcolor; + currentNodo.literal.style.backgroundColor=gLiteralbackground; + } + gLiteralcolor=nodov.literal.style.color; // Guarda el color del nodo + gLiteralbackground=nodov.literal.style.backgroundColor; // Guarda el background del nodo + + nodov.literal.style.color="#FFFFFF"; // Blanco + nodov.literal.style.backgroundColor="#0a266a"; // Azul marino + currentNodo=nodov; +} +//----------------------------------------------------------------------------------------------------------------------- +// Deja de resaltar un nodo vista +//____________________________________________________________________________ +function desresalta(nodov){ + nodov.literal.style.color=nodov.Literalcolor; + nodov.literal.style.backgroundColor=nodov.Literalbackground; +} +//----------------------------------------------------------------------------------------------------------------------- +// Averigua si el primer nodo vista es ancestro del segundo +//____________________________________________________________________________ +function EsAncestro(nodoA,nodoH){ + if(nodoH==null) return(false); + var NodoAncestro=nodoA.ArbolHijos; + var NodoHijo=nodoH.Nodo; + while(NodoHijo!=null){ + if(NodoHijo==NodoAncestro) return(true); + NodoHijo=NodoHijo.parentNode; + } + return(false); +} +//----------------------------------------------------------------------------------------------------------------------- +// Despliega un nivel el nodo indicado +//----------------------------------------------------------------------------------------------------------------------- +function despliega(o,pathimg){ + var nodov=TomaDatosNodo(o); + clickNodo(nodov,pathimg); +} +//----------------------------------------------------------------------------------------------------------------------- +// Despliega el nodo indicado ( desde la pagina +//----------------------------------------------------------------------------------------------------------------------- +function DespliegaNodo(lit,id){ + var o=document.getElementById(lit+"-"+id); + if(o!=null){ + var ancestro= TomaDatosNodo(o); + resalta(ancestro); + while(ancestro!=null){ + if(ancestro.estadoNodo()==0) // Nodo contraido + clickNodo(ancestro,currentpathimg); + ancestro=ancestro.PapaNodo(); + } + } +} +//____________________________________________________________________________ +// +// Inserta un nodo en el árbol +// Especificaciones: +// Los parámetros recibidos son: +// - nodov: Nodo vista +// - tablanodo: Tabla nodo generada para la nueva celda vista +//____________________________________________________________________________ +function InsertaNodo(nodov,tablanodo){ + var nwceldavista=CreaCeldaVista(nodov,tablanodo); + var nwTR = document.createElement('TR'); + nwTR.id="TRNodo-0"; + var nwTD = document.createElement('TD'); + nwTD.innerHTML=nwceldavista; + nwTR.appendChild(nwTD); + + if(!nodov.TieneHijos()){ + CreaNodoHijo(nodov); + if(parseInt(nodov.nivel)==0){ // Nodo raiz + nodov.imgsigno.setAttribute("value","menos_c",null); + nodov.imgsigno.setAttribute("src",currentpathimg+"/menos_root.gif",null); + } + else{ + if(nodov.UltimoHermano()){ + nodov.imgsigno.setAttribute("value","menos_c",null); + nodov.imgsigno.setAttribute("src",currentpathimg+"/menos_c.gif",null); + } + else{ + nodov.imgsigno.setAttribute("value","menos_t",null); + nodov.imgsigno.setAttribute("src",currentpathimg+"/menos_t.gif",null); + } + } + var ATTonclick='clickImagenSigno(this,' + "'"+currentpathimg+"'"+','+nodov.nivel+');'; + nodov.imgsigno.setAttribute("onclick",ATTonclick,null); + nodov.imgsigno.setAttribute("border","0",null); + var oSPAN=nodov.imgsigno.parentNode; + var htmlIMG=oSPAN.innerHTML; + TDpadre=oSPAN.parentNode; + TDpadre.innerHTML='<A href="#">'+htmlIMG+'</A>'; + } + var pivoteNodo=nodov.ArbolHijos; + var nodoTD = pivoteNodo.childNodes[0];; + var nodoTABLE=nodoTD.childNodes[0]; + var nodoTBODY=nodoTABLE.childNodes[0]; + var nodoTR=nodoTBODY.childNodes[0]; + if(nodoTR!=null) + nodoTBODY.insertBefore(nwTR,nodoTR); + else + nodoTBODY.appendChild(nwTR); +} +//____________________________________________________________________________ +// +// Monta y devuelve el código HTML de la estructura de una celda vista +// Los parámetros recibidos son: +// - pivoteNodo: Nodo vista +// - tablanodo: Tabla nodo generada para la nueva celda vista +//____________________________________________________________________________ +function CreaCeldaVista(nodov,tablanodo){ + var nodoTD = document.createElement('TD'); + nodoTD.innerHTML=tablanodo; + var nodoTABLE=nodoTD.childNodes[0]; + var nodoTBODY=nodoTABLE.childNodes[0]; + var nodoTBODYTR=nodoTBODY.childNodes[0]; + var oIMG=nodoTBODYTR.getElementsByTagName('IMG')[0]; + var HTMLinner=nodoTBODYTR.innerHTML; + + if(nodov.TieneHijos()){ + var patron = new RegExp("nada_c","gi") + HTMLinner=HTMLinner.replace(patron,"nada_t"); + } + else{ + var patron = new RegExp("nada_t","gi") + HTMLinner=HTMLinner.replace(patron,"nada_c"); + } + var auxnodo=nodov; + var nwHTMLinner=""; + var img=""; + while(auxnodo!=null){ + (auxnodo.UltimoHermano())? img="nada.gif" : img="nada_l.gif"; + nwHTMLinner='<TD width="3px"></TD><TD width="16px"><IMG src="../images/signos/'+img+'" width="16px" height="16px" ></TD>'+nwHTMLinner; + auxnodo=auxnodo.PapaNodo(); + } + nwHTMLinner='<TABLE border=0 cellspacing=0 cellpadding=0><TR height="16px">'+nwHTMLinner+HTMLinner+"</TR></TABLE>"; // Contenido de la tabla del nodo literal + return(nwHTMLinner); +} +//____________________________________________________________________________ +// +// Crea un nuevo nodo Hijo (objeto TABLE) +// Parámetros: +// - nodov: Un nodo vista +//____________________________________________________________________________ +function CreaNodoHijo(nodov){ + var nivel=parseInt(nodov.nivel)+1; + var nTR=document.createElement('TR'); + nTR.id="TRNodoHijo-0"; + var nTD=document.createElement('TD'); + nTD.innerHTML='<TABLE with="100%"id="tablanivel-'+nivel+'" border="0" cellspacing="0" cellpadding="0"><TBODY></TBODY></TABLE>'; + nTR.appendChild(nTD); + + var pivoteNodo=nodov.Nodo.parentNode; + if(nodov.UltimoHermano()){ + pivoteNodo.appendChild(nTR); // Para insertar al final + } + else{ + pivoteNodo.insertBefore(nTR,nodov.siguienteHermano) + } + nodov.ArbolHijos=nTR; +} +//____________________________________________________________________________ +// +// Inserta un nodo en el árbol +// Especificaciones: +// Los parámetros recibidos son: +// - nodov: Nodo vista +//____________________________________________________________________________ +function EliminaNodo(nodov){ + var swuh=nodov.UltimoHermano(); + var pn=nodov.Nodo.parentNode; // Nodo padre + var papa=nodov.PapaNodo(); // Nodo vista padre + + if(nodov.TieneHijos()) + pn.removeChild(nodov.ArbolHijos); // Elimina arbol hijo + pn.removeChild(nodov.Nodo); // Elimina Nodo + + var antHermano=pn.lastChild + if(antHermano==null){ // El nodo padre no tiene más hijos + var pn=papa.ArbolHijos.parentNode; // Nodo padre + pn.removeChild(papa.ArbolHijos); // Elimina arbol hijo + ChgSignoPadreEliminaNodo(papa.imgsigno); + } + else{ + if(swuh){ // Si era el último hermano ... + var auxsplit=antHermano.getAttribute("id"); + var idTR=auxsplit.split("-") [0]; + if(idTR=="TRNodoHijo"){ + antHermano=antHermano.previousSibling; + while(antHermano.nodeType!=1 ) + antHermano=antHermano.previousSibling + var TAnchor=antHermano.getElementsByTagName('A'); + if(TAnchor.length==2) // Imagen de signo pulsable + var oIMG=TAnchor[0].childNodes[0]; + } + else{ + var TSpan=antHermano.getElementsByTagName('SPAN'); + var oIMG=TSpan[0].childNodes[0]; + } + var nh=TomaDatosNodo(oIMG); + ChgSignoEliminaNodo(oIMG); + if(nh.TieneHijos()) + ChgSignoNivel(nh.ArbolHijos,nh.nivel); + } + } +} +//----------------------------------------------------------------------------------------------------------------------- +// Cambia la imagen de signo del hermano anterior de un nodo eliminado +//----------------------------------------------------------------------------------------------------------------------- +function ChgSignoEliminaNodo(imgsigno){ + var signoimg=imgsigno.getAttribute("value"); + switch(signoimg){ + case "menos_t" : + imgsigno.setAttribute("value","menos_c",null); + imgsigno.setAttribute("src",currentpathimg+"/menos_c.gif",null); + break; + case "mas_t" : + imgsigno.setAttribute("value","mas_c",null); + imgsigno.setAttribute("src",currentpathimg+"/mas_c.gif",null); + break; + case "nada_t" : + imgsigno.setAttribute("value","nada_c",null); + imgsigno.setAttribute("src",currentpathimg+"/nada_c.gif",null); + break; + } +} +//----------------------------------------------------------------------------------------------------------------------- +// Cambia la imagen de signo del nodo padre de un nodo eliminado ( unico hijo) +//----------------------------------------------------------------------------------------------------------------------- +function ChgSignoPadreEliminaNodo(imgsigno){ + var signoimg=imgsigno.getAttribute("value"); + switch(signoimg){ + case "menos_t" : + imgsigno.setAttribute("value","nada_t",null); + imgsigno.setAttribute("src",currentpathimg+"/nada_t.gif",null); + QuitaANCHOR(imgsigno); + break; + case "menos_c" : + imgsigno.setAttribute("value","nada_c",null); + imgsigno.setAttribute("src",currentpathimg+"/nada_c.gif",null); + QuitaANCHOR(imgsigno); + break; + case "mas_t" : + imgsigno.setAttribute("value","nada_t",null); + imgsigno.setAttribute("src",currentpathimg+"/nada_t.gif",null); + QuitaANCHOR(imgsigno); + break; + case "mas_c" : + imgsigno.setAttribute("value","nada_c",null); + imgsigno.setAttribute("src",currentpathimg+"/nada_c.gif",null); + QuitaANCHOR(imgsigno); + break; + } +} +//----------------------------------------------------------------------------------------------------------------------- +// Cambia la imagen de un determinado nivel +//----------------------------------------------------------------------------------------------------------------------- +function QuitaANCHOR(oIMG){ + var TAnchor=oIMG.parentNode; + var oHTML=TAnchor.innerHTML; + var oTD=TAnchor.parentNode; + oTD.innerHTML="<SPAN>"+oHTML+"</SPAN>"; +} +//----------------------------------------------------------------------------------------------------------------------- +// Cambia la imagen de un determinado nivel +//----------------------------------------------------------------------------------------------------------------------- +function ChgSignoNivel(arbolv,n){ + if(arbolv==null) return + var nodoTD =arbolv.childNodes[0]; + var nodoTABLE=nodoTD.childNodes[0]; + var nodoTBODY=nodoTABLE.childNodes[0]; + var oTRs=nodoTBODY.childNodes; + for(var i=0;i<oTRs.length;i++){ + var auxsplit=oTRs[i].getAttribute("id"); + var idTR=auxsplit.split("-") [0]; + if(idTR=="TRNodoHijo"){ + ChgSignoNivel(oTRs[i],n) + } + else{ + var oTABLE=oTRs[i].getElementsByTagName('TABLE'); + var oIMGs=oTABLE[0].getElementsByTagName('IMG'); + oIMGs[n].setAttribute("src",currentpathimg+"/nada.gif",null); + } + } +} +//____________________________________________________________________________ +// +// Se ejecuta cada vez que se mueve el puntero del ratón. Se usa para desmarca +// cualquier item de menu contextual que estuviese activo +//____________________________________________________________________________ +function click_de_raton_prov(e){ + if(IE){ + botonraton=event.button + event.returnValue=true; + return; + } + if(NS){ + botonraton=e.which; + e.returnValue=true; + return; + } +} +//____________________________________________________________________________ +// +// Recupera el navegador utilizado +//____________________________________________________________________________ +var IE=(navigator.appName=="Microsoft Internet Explorer"); +var NS=(navigator.appName=="Netscape"); +//____________________________________________________________________________ +// +// Redirecciona el evento onmousedown a la función de usuario especificada. +//____________________________________________________________________________ +document.onmousedown = click_de_raton_prov; // Redefine el evento onmousedown + if(NS) document.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE | Event.MOUSEUP) + + diff --git a/admin/WebConsole/clases/jscripts/MenuContextual.js b/admin/WebConsole/clases/jscripts/MenuContextual.js new file mode 100644 index 00000000..e63ffa51 --- /dev/null +++ b/admin/WebConsole/clases/jscripts/MenuContextual.js @@ -0,0 +1,395 @@ +// *************************************************************************** +// Libreria de scripts de Javascript +// Autor: José Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla + +// Fichero: menucontextual.js +// Este fichero implementa las funciones javascript de la clase MenuContextual +// *************************************************************************** +var ctx_grissistema="#d4d0c8" +var ctx_azulmarino="#0a266a"; +var ctx_blanco="#ffffff"; +var ctx_negro="#000000"; +var ctx_grissombra="#808080"; + +gmenuctx=new Array(); // Guarda el último menu flotante +var idxmnu=0 // Indice de los menus flotantes +var currentItem=null; +var currentPadresubmenu; +var currentPadreY; + +var ClickX=null // Coordenada x del evento click del boton derecho +var ClickY=null // Coordenada y del evento click del boton derecho +var botonraton=null; +//____________________________________________________________________________ +// +// Esta función muestra un menu contextual +// Parámetros: +// - x: Coordenada x de referencia +// - y: Coordenada y de referencia +// - menuctx: Objeto DIV contenedor del menu contextual +//____________________________________________________________________________ +function muestra_contextual(x,y,menuctx){ + var margen=0 + dpzx=16 + dpzy=16 + wtop=calculatop_ctx(y,dpzy,margen,menuctx) // Calcula posición del menu contextual + wleft=calculaleft_ctx(x,dpzx,margen,menuctx) + ftop=wtop+parseInt(document.body.scrollTop) // Tiene en cuenta el scrolling + fleft=wleft+parseInt(document.body.scrollLeft) + menuctx.style.top=ftop + menuctx.style.left=fleft + menuctx.style.visibility="visible" + menuctxSetSelectedIndex(menuctx,-1) // Coloca el nuevo indice + gmenuctx[idxmnu++]=menuctx; +} +//____________________________________________________________________________ +// +// Calcula coordenada top para el menu contextual que se mostrará. +// Parametros: +// - oriy : Coordenada Y del objeto que provoca el evento +// - dpzy : Desplazamiento sobre el eje y +// - margen : Margen para que el menu aparezca un poco separado del ese objeto +// - menuctx: El menu (objeto DIV) que se mostrará +//____________________________________________________________________________ +function calculatop_ctx(oriy,dpzy,margen,menuctx){ // Calcula Y del menu contextual + largodiv=parseInt(menuctx.offsetHeight); + var wtop=oriy+dpzy+margen + if (wtop+largodiv>parseInt(document.body.clientHeight)){ + var nwtop=oriy-dpzy-margen-largodiv + if (nwtop>0) wtop=nwtop + } + return(wtop) +} +//____________________________________________________________________________ +// +// Calcula coordenada left para el menu contextual que se mostrará. +// Parametros: +// - orix : Coordenada X del objeto que provoca el evento +// - dpzx : Desplazamiento sobre el eje x +// - margen : Margen para que el menu aparezca un poco separado del ese objeto +// - menuctx: El menu (objeto DIV) que se mostrará +//____________________________________________________________________________ +function calculaleft_ctx(orix,dpzx,margen,menuctx){ // Calcula Y del menu contextual + anchodiv=parseInt(menuctx.offsetWidth) + var wleft=orix+dpzx+margen + var maximodpl=parseInt(document.body.clientWidth) + if (wleft+anchodiv>maximodpl){ // Si no cabe a la derecha + var nwleft=orix-dpzx-margen-anchodiv // lo intenta a la izda. + if (nwleft>0) wleft=nwleft + else{ + wleft=maximodpl-dpzx-margen-anchodiv; + if(wleft<document.body.scrollLeft) wleft=document.body.scrollLeft+16 + } + } + return(wleft) +} +//____________________________________________________________________________ +// +// Esta función devuelve el objeto DIV al que pertenece el item <TR> +// Parametros: +// - o: El objeto <TR> +//____________________________________________________________________________ +function contextual(o){ + while(o.tagName!="DIV") + o=o.parentNode + return(o) +} +//____________________________________________________________________________ +// +// Esta función devuelve el objeto <TR> apuntado por el indice +// Parametros: +// - o: El objeto TR +// - idx: el indice del item, si es nulo se devuelve el item(objeto TR), seleccionado +//____________________________________________________________________________ +function menuctxSelectedItem(o,idx){ + var oDIV=contextual(o); // Se asegura que el objeto de inicio es DIV + var oTABLE=oDIV.childNodes[0]; // objeto TABLE + var oINPUT=oDIV.childNodes[1]; // objeto INPUT + var oTBODY=oTABLE.getElementsByTagName('TBODY')[0]; + if(idx==null) // No se especificó indice, devuelve el item seleccionado + idx=oINPUT.getAttribute("value"); + var oTRS=oTBODY.getElementsByTagName('TR'); + for (var i=0;i<oTRS.length;i++){ + var oTR=oTRS[i]; + if(oTR.getAttribute("id")==idx) return(oTR); + } + return(null); +} +//____________________________________________________________________________ +// +// Esta función actualiza el nuevo el indice del item seleccionado +// Parametros: +// - o: El objeto DIV que contiene el menu contextual o un item(objeto TR) de él +// - i: El valor del indice +//____________________________________________________________________________ +function menuctxSetSelectedIndex(o,idx){ + var oDIV=contextual(o); // Se asegura que el objeto de inicio es DIV + var oINPUT=oDIV.childNodes[1]; + oINPUT.value=idx; +} +//____________________________________________________________________________ +// +// Esta función devuelve el indice del item seleccionado +// Parametros: +// -o : El objeto DIV que contiene el menu contextual o un item(objeto TR) de él +//____________________________________________________________________________ +function menuctxSelectedIndex(o){ + var oDIV=contextual(o); // Se asegura que el objeto de inicio es DIV + var oINPUT=oDIV.childNodes[1]; + return(oINPUT.value); +} +//____________________________________________________________________________ +// Se ejecuta cuando se posiciona el cursor dentro de un item de algún menú contextual. +// Parámetros: +// - o: El item (objeto TR) donde se ha colocado el ratón +//____________________________________________________________________________ +function sobre_contextual(o){ + var oDIV=contextual(o) // Se asegura que el objeto de inicio es DIV + var idx=menuctxSelectedIndex(oDIV) // Indice del Item anterior seleccionado + var nwid=o.getAttribute("id"); + if (parseInt(idx)!=parseInt(nwid)){ // Si cambio de item + if(idx>0){ // Si existÃa item anterior seleccionado + desmarcar_item(oDIV,idx) // Desmarca item anterior + } + marcar_item(o); // Marca el actual item + currentItem=o; + } +} +//____________________________________________________________________________ +// +// Hace resaltar el item del menu contextual donde se coloca el cursor. +// Si este item tuviese un submenu contextual,éste también aparecerÃa. +// Además, inicializa el campo oculto de cada DIV donde se guarda el Ãndice +// del item selecionado. +// +// Parametros: +// - item: El objeto <TR> +//____________________________________________________________________________ +function marcar_item(item){ + marca_desmarca(item,true) // Marca el item + if (item.getAttribute("name")!=""){ // Existe submenu contextual + currentPadresubmenu=item + currentPadreY=ClickY + setTimeout ("muestra_submenu();", 300); + } + menuctxSetSelectedIndex(contextual(item),item.getAttribute("id")); // Coloca el nuevo indice +} +//____________________________________________________________________________ +// +// Quita el resalte de un item y oculta los posibles submenus que tuviera +// Parametros: +// -o : El objeto DIV que contiene el menu contextual +// - idx: el indice del item, si es nulo desmarca el item(objeto TR), seleccionado +//____________________________________________________________________________ +function desmarcar_item(o,idx){ + var oDIV=contextual(o) // Se asegura que el objeto de inicio es DIV + if(idx==null) // No se especificó indice + idx=menuctxSelectedIndex(oDIV) // Indice del Item seleccionado + var item=menuctxSelectedItem(oDIV,idx) + if(item==null) return // No hay item seleccionado + marca_desmarca(item,false); + var nomsub=item.getAttribute("name"); + if (nomsub!=null &&nomsub!=""){ // Tiene submenu + var submenuctx=document.getElementById(nomsub); + desmarcar_item(submenuctx); // Desmarca submenu + submenuctx.style.visibility="hidden"; + } +} +//____________________________________________________________________________ +// +// Marca o desmarca items dependiendo del parametro sw. +// Parámetros: +// - o: El item (objeto TR) +// Si sw=true marca, si sw=false demarca +//____________________________________________________________________________ +function marca_desmarca(o,sw){ + if(sw){ // Marca + var wfondo=ctx_azulmarino; + var wcolor=ctx_blanco; + } + else{ // Desmarca + var wfondo=ctx_grissistema; + var wcolor=ctx_negro; + } + (MenuconImagen(contextual(o)) ? i0=2:i0=1); + var nh=o.childNodes.length; + for (var i=i0;i<nh-1;i++){ + var oTD=o.childNodes[i]; + var oIMGS=oTD.getElementsByTagName('IMG'); + if (oIMGS.length>0){ + var oIMG=oIMGS[0]; + if (oIMG.getAttribute("name")=="swsbfn"){ // imagen switch submenu + oTD.style.backgroundColor=wfondo + oTD.style.color=wcolor + if (sw) + oIMG.setAttribute("src","../images/flotantes/swsbfb.gif",null); + else + oIMG.setAttribute("src","../images/flotantes/swsbfn.gif",null); + } + else{ // imagen del item + if (sw){ // Marcar + oIMG.style.border="1px"; + oIMG.style.borderStyle="outset"; + + } + else{ // Desmarcar + oIMG.style.borderStyle="none"; + } + } + } + else{ + oTD.style.backgroundColor=wfondo + var oSPAN=oTD.getElementsByTagName('SPAN'); + if (oSPAN.length>0) + oSPAN[0].style.color=wcolor + } + } +} +//____________________________________________________________________________ +// +// Detecta si el menu contextual tiene items con imágenes asociadas +// Devuelve true en caso afirmativo y false en caso contrario. +//____________________________________________________________________________ +function MenuconImagen(o){ + var oDIV=contextual(o); + var oIMGS=oDIV.getElementsByTagName('IMG'); + return(oIMGS.length>0); +} +//____________________________________________________________________________ +function reset_contextual(x,y){ + var swm=false; + for (var i=0;i<idxmnu;i++ ){ + if (gmenuctx[i].style.visibility=="visible") + swm=swm || EnContextual(x,y,gmenuctx[i]) + } + if (!swm){ // No se ha hecho click en ningún menu contextual + for (var i=0;i<idxmnu;i++ ){ + desmarcar_item(gmenuctx[i]); + gmenuctx[i].style.visibility="hidden"; + gmenuctx[i]=null + } + idxmnu=0; + } +} +//____________________________________________________________________________ +// +// Detecta si ha hecho fuera del menu contextual pasado como parametro +// Parametros: +// - x : Coordenada X de la pantalla donde se hizo click +// - y : Coordenada Y de la pantalla donde se hizo click +// - menuctx: El submenu (objeto DIV) +//____________________________________________________________________________ +function EnContextual(x,y,menuctx){ + origen_x=parseInt(menuctx.offsetLeft)-parseInt(document.body.scrollLeft) + origen_y=parseInt(menuctx.offsetTop)-parseInt(document.body.scrollTop) + anchodiv=parseInt(menuctx.offsetWidth) + largodiv=parseInt(menuctx.offsetHeight) + + if ( x>=origen_x && x<=origen_x+anchodiv && y>=origen_y && y<=origen_y+largodiv ) return true + return(false) +} +//____________________________________________________________________________ +// +// Muestra un submenu +// Parametros: +// - item: El objeto <TR> padre del submenu +//____________________________________________________________________________ +function muestra_submenu(){ + if(currentPadresubmenu==currentItem){ + var objdiv=contextual(currentPadresubmenu) + var menuctx=document.getElementById(currentPadresubmenu.getAttribute("name")); // Obtiene el submenu + //desmarcar_item(menuctx) // Desmarca el submenu por si se ha usado anteriormente + wleft=subcalculaleft_ctx(objdiv,menuctx) // La x en función del padre + wtop=subcalculatop_ctx(currentPadreY,menuctx) // La y depende de la longitud del submenu + menuctx.style.top=wtop + menuctx.style.left=wleft + menuctx.style.visibility="visible"; + menuctxSetSelectedIndex(menuctx,-1) // Coloca el nuevo indice + gmenuctx[idxmnu++]=menuctx; + } +} +//____________________________________________________________________________ +// +// Calcula coordenada top para el submenu contextual que se mostrará. +// Parametros: +// - y : Coordenada Y de la pantalla donde se hizo click +// - menuctx: El submenu (objeto DIV) que se mostrará +//____________________________________________________________________________ +function subcalculatop_ctx(y,menuctx){ // Calcula el posicionamiento (y) del DIV ( SUBmenu contextual) + var dpl=0 + largodiv=parseInt(menuctx.offsetHeight) + var wtop=y+dpl+parseInt(document.body.scrollTop) + if (parseInt(wtop+largodiv)>parseInt(document.body.clientHeight+parseInt(document.body.scrollTop))){ + var nwtop=y+parseInt(document.body.scrollTop)-16-largodiv + if (nwtop>0) wtop=nwtop + } + return(wtop) +} +//____________________________________________________________________________ +// +// Calcula coordenada left para el submenu contextual que se mostrará. +// Parametros: +// - padrediv : Objeto DIV padre del submenu a mostrar +// - menuctx: El submenu (objeto DIV) que se mostrará +//____________________________________________________________________________ +function subcalculaleft_ctx(padrediv,menuctx){ // Calcula el posicionamiento (x) del DIV ( SUBmenu contextual) + anchopadrediv=parseInt(padrediv.offsetWidth) // Ancho del div padre + anchomenuctx=parseInt(menuctx.offsetWidth) // Ancho del div + if(IE) + leftpadrediv=padrediv.style.pixelLeft // Coordenada x del div padre + else + if(NS) + leftpadrediv=parseInt(padrediv.style.left) // Coordenada x del div padre + desplazamiento=leftpadrediv+anchopadrediv-4 // Desplazamiento + var wleft=parseInt(desplazamiento) + var maximodpl=parseInt(document.body.clientWidth)+parseInt(document.body.scrollLeft) + if (wleft+anchomenuctx>maximodpl){ + var nwleft=leftpadrediv-anchomenuctx + if (nwleft>0) wleft=nwleft + else{ + wleft=maximodpl-anchomenuctx; + if(wleft<document.body.scrollLeft) wleft=document.body.scrollLeft+18 + } + } + return(wleft) +} +//____________________________________________________________________________ +// +// Se ejecuta cada vez que se hace click con el puntero del ratón. Se usa para desmarca +// cualquier item de menu contextual que estuviese activo +//____________________________________________________________________________ +function click_de_raton(e){ + if(IE){ + botonraton=event.button + event.returnValue=true; + } + if(NS){ + botonraton=e.which; + e.returnValue=true; + } + if (gmenuctx.length>0){ + reset_contextual(ClickX,ClickY); + } +} +//____________________________________________________________________________ +// +// Se ejecuta cada vez que se mueve el puntero del ratón. Se usa para capturar coordenadas +//____________________________________________________________________________ +function move_de_raton(e){ + if(IE){ + ClickX=event.clientX + ClickY=event.clientY + event.returnValue=true; + } + if(NS){ + ClickX=e.clientX + ClickY=e.clientY + e.returnValue=true; + } +} +//____________________________________________________________________________ +// +// Redirecciona el evento onmousedown a la función de usuario especificada. +//____________________________________________________________________________ +document.onmousedown = click_de_raton; // Redefine el evento onmousedown +document.onmousemove = move_de_raton; // Redefine el evento onmousedown |