summaryrefslogtreecommitdiffstats
path: root/admin/WebConsole/clases
diff options
context:
space:
mode:
Diffstat (limited to 'admin/WebConsole/clases')
-rw-r--r--admin/WebConsole/clases/AdoPhp.php648
-rw-r--r--admin/WebConsole/clases/ArbolVistaXML.php272
-rw-r--r--admin/WebConsole/clases/EncripDescrip.php56
-rw-r--r--admin/WebConsole/clases/MenuContextual.php164
-rw-r--r--admin/WebConsole/clases/SockHidra.php120
-rw-r--r--admin/WebConsole/clases/XmlPhp.php285
-rw-r--r--admin/WebConsole/clases/jscripts/ArbolVistaXML.js565
-rw-r--r--admin/WebConsole/clases/jscripts/MenuContextual.js395
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