* @author Keka: * @author Vero: * @author Raquel: * @author Toni: * @package gvHIDRA **/ class IgepSmarty { var $preScript; var $v_eventosPesos; var $v_eventos; var $postScript; var $scriptLoadIgep; var $scriptLoadUsuario; function IgepSmarty() { //REVIEW: David. Referencia a documento desde iFrame normal y oculto $cadenaJs = "var documento = document; //Documento será siempre una referencia al document 'visible'\n"; $cadenaJs .= "if (document.getElementById('oculto') == null) documento = parent.document; \n"; $this->preScript=$cadenaJs; $this->postScript=''; $this->v_eventos = array(); $this->v_eventosPesos = array(); } //FIN constructor function addPreScript($script) { $this->preScript .= $script."\n"; } //FIN addPreScript function getPreScript($conCabecera=true) { $retorno =''; if ($this->preScript!='') { if ($conCabecera) { $retorno.="\n"; } else { $retorno.= $this->preScript; } } return ($retorno); } //FIN getPreScript function addPostScript($script) { $this->postScript .= $script."\n"; } //FIN addPostScript function getPostScript($conCabecera=true) { $retorno =''; if ($this->postScript!='') { if ($conCabecera) { $retorno.="\n"; } else { $retorno.=$this->postScript; } } return($retorno); } //FIN getPostScript /** * Esta función se encarga de almacenar el script que se ejecutará en el evento onLoad. * @param string $script String el codigo que se quiere añadir al evento OnLoad * @param string $escIni Indica el tipo de Script. Por definición de IGEP tenemos dos tipos: IGEP y USUARIO. * El primero corresponde con los scripts puntuales que IGEP tiene que inyectar en la ventana. El segundo * responde a los scripts que el usuario quiere que se carguen en la ventana durante toda su ejecución. * @access public */ function addScriptLoad($script, $tipo='IGEP') { //$script = 'alert(document.lis_paginacion.nom_variable)'.$script; if($tipo=='USUARIO') $this->scriptLoadUsuario.=$script; else $this->scriptLoadIgep.=$script; }//Fin addScriptLoad function getScriptLoad($conCabecera=true) { $script=''; if (($this->scriptLoadUsuario!='')or($this->scriptLoadIgep!='')) { if ($conCabecera) { $script .="\n"; } else $script .= $this->scriptLoadIgep."\n".';'.$this->scriptLoadUsuario; $this->scriptLoadIgep = ''; return $script; } else return ''; }//Fin de getScriptLoad /** * _validaEvento: Esta función se asegura de que el evento Javascript exista y este correctamente escrito * @param string $evento Cadena de texto con el nombre del evento * @access private */ function _validaEvento(&$evento) { $v_eventos = array ( 'onblur' => 'onBlur', 'onchange' => 'onChange', 'onabort' => 'onAbort', 'onclick' => 'onClick', 'ondragdrop' => 'onDragDrop', 'onerror' => 'onError', 'onfocus' => 'onFocus', 'onkeydown' => 'onKeyDown', 'onkeypress' => 'onKeyPress', 'onkeyup' => 'onKeyUp', 'onload' => 'onLoad', 'onmousedown' => 'onMouseDown', 'onmousemove' => 'onMouseMove', 'onmouseout' => 'onMouseOut', 'onmouseover' => 'onMouseOver', 'onmouseup' => 'onMouseUp', 'onmove' => 'onMove', 'onresize' => 'onResize', 'onreset' => 'onReset', 'onselect' => 'onSelect', 'onsubmit' => 'onSubmit', 'onunload' => 'onUnLoad' ); if (array_key_exists(trim(strtolower($evento)), $v_eventos)) { $evento = $v_eventos[trim(strtolower($evento))]; return true; } else { $evento ='EVENTOINEXISTENTE'; return false; } } /** * addAccionEvento: Esta función registra una llamada a una función * javaScript en un evento determinado, opcionalmente puede introducirse * "importancia" o peso que servira para ordenar las distintas invocaciones * asociadas a un mismo evento * @param string $evento Cadena de texto con el nombre del Evento * @param string $script Cadena de texto con el nombre del Evento * @param int $pesoAccion Importancia o peso del script. Ordena los scrips asociados a un evento * @access public */ function addAccionEvento($evento, $script, $pesoAccion=-1) { if (!$this->_validaEvento($evento)) die ('Error JAVASCRIPT, evento '.$evento.' inexistente.'); if ($pesoAccion== -1) { if (!is_array($this->v_eventos[$evento])) { $this->v_eventos[$evento] = array(); } array_push($this->v_eventos[$evento], $script); } else { while (isset($this->v_eventosPesos[$evento][$pesoAccion])) { ++$pesoAccion; } $this->v_eventosPesos[$evento][$pesoAccion] = $script; } } //FIN addAccionEvento function _getAccion($nombreEvento, $v_Scripts) { $script=' '; if (is_array($v_Scripts) ) { foreach($v_Scripts as $accion) { $script.= $accion.';'; } //Añadimos la comprobacion de estado, si soy READONLY no disparo acciones: $iniScriptEstado = "if (this.readOnly != true) {"; $script = $nombreEvento.'="javascript:'.$iniScriptEstado.$script.'};" '; } return($script); } //FIN _getAccion function getAcciones() { $script = ' '; $v_eventosFinal = array(); foreach($this->v_eventosPesos as $evento=>$vScriptPesos) { krsort($vScriptPesos); $v_eventosFinal[$evento] = $vScriptPesos; } foreach($this->v_eventos as $evento=>$valor) { foreach($valor as $scriptEjecutable){ if(empty($v_eventosFinal[$evento])) $v_eventosFinal[$evento] = array(); array_push($v_eventosFinal[$evento], $scriptEjecutable); } } $numEventos = count($v_eventosFinal); if ($numEventos>0) $v_nombreEvento = array_keys($v_eventosFinal); for($i=0; $i<$numEventos; $i++) { $nombreEvento = $v_nombreEvento[$i]; $script.=$this->_getAccion($nombreEvento,$v_eventosFinal[$nombreEvento]); } return($script); } //FIN getAcciones /** * escapeIgep: Funcion para sustituir carácteres especiales. * La funcion sustituye los carácteres problemáticos por una cadena * formada por un prefijo ($escIni), la raiz (letra de representación * del carácter) y un sufijo ($escFin) * Los carácteres a sustituir son: * \b Backspace raíz: b * \f Form feed raíz: f * \r Retorno de carro raíz: r * \n Linea Nueva raíz: n * \t Tabulador raíz: t * \' Comilla simple raíz: cs * \" Comilla doble raíz: cd * \\ Contrabarra raíz: cb * * La funcion antagónica es desescapeIGEP. * Existen funciones similares en javascript para poder enviar * o recibir cadenas problemáticas en entre los dos lenguajes * @access public * @param string $cadena String donde se realiza el reemplazo * @param string $escIni Prefijo de sustitución para el caracter * @param string $escFin Sufijo de sustitución para el caracter */ function escapeIGEP(&$cadena, $escIni="!_", $escFin="_!") { $cadena = str_replace("\b", $escIni.'b'.$escFin, $cadena); $cadena = str_replace("\f", $escIni.'f'.$escFin, $cadena); $cadena = str_replace("\r", $escIni.'r'.$escFin, $cadena); $cadena = str_replace("\n", $escIni.'n'.$escFin, $cadena); $cadena = str_replace('\t', $escIni.'t'.$escFin, $cadena); $cadena = str_replace("'", $escIni.'cs'.$escFin, $cadena); $cadena = str_replace("\"", $escIni.'cd'.$escFin, $cadena); $cadena = str_replace("\\", $escIni.'cb'.$escFin, $cadena); return($cadena); } //FIN escapeIGEP /** * deescapeIgep: Funcion para restablecer los carácteres especiales. * La funcion restablece los carácteres problemáticos de una cadena donde * se ha llevado acabo una sustituyción especial de escapeIgep() * Los carácteres remplazados son: * \b Backspace raíz: b * \f Form feed raíz: f * \r Retorno de carro raíz: r * \n Linea Nueva raíz: n * \t Tabulador raíz: t * \' Comilla simple raíz: cs * \" Comilla doble raíz: cd * \\ Contrabarra raíz: cb * * La funcion antagónica es escapeIGEP. * Existen funciones similares en javascript para poder enviar * o recibir cadenas problemáticas en entre los dos lenguajes * * @access public * @param string $cadena String donde se realiza el reemplazo * @param string $escIni Prefijo de sustitución para el caracter * @param string $escFin Sufijo de sustitución para el caracter */ function desescapeIGEP(&$cadena, $escIni="!_", $escFin="_!") { $cadena = str_replace($escIni.'b'.$escFin, "\b", $cadena); $cadena = str_replace($escIni.'f'.$escFin, "\f", $cadena); $cadena = str_replace($escIni.'r'.$escFin, "\r", $cadena); $cadena = str_replace($escIni.'n'.$escFin, "\n", $cadena); $cadena = str_replace($escIni.'t'.$escFin, "\t", $cadena); $cadena = str_replace($escIni.'cs'.$escFin, "'", $cadena); $cadena = str_replace($escIni.'cd'.$escFin, "\"", $cadena); $cadena = str_replace($escIni.'cb'.$escFin, "\\", $cadena); return($cadena); } //FIN escapeIGEP //A partir de un resultado genera el JavaScript necesario para que la lista se recargue por el oculto static function getJsLista($campoDestinoJs, $resultado){ $opciones = ''; //Si no tiene resultado hay que indicar que el seleccionado de la lista es uno vacio if(count($resultado['lista'])==0) $opciones.="insertar_opcion(\"\",\"\",1);\n"; else { foreach($resultado['lista'] as $fila) { if($resultado['seleccionado']==$fila['valor']) $opciones.="insertar_opcion(\"".$fila["valor"]."\",desescapeIGEPjs('".IgepSmarty::escapeIGEP($fila["descripcion"])."'),1);\n"; else $opciones.="insertar_opcion(\"".$fila["valor"]."\",desescapeIGEPjs('".IgepSmarty::escapeIGEP($fila["descripcion"])."'),0);\n"; } } $opciones.= "cambia(formulario,'".$campoDestinoJs."',opciones);\n"; $opciones .= "opciones.length = 0;\n"; //Insertamos este código para que se copie el valor en el lins o lcam $actualizarCampoOculto = "eval('parent.document.forms[\"'+formulario+'\"]."; $actualizarCampoOculto.= 'l'.$campoDestinoJs.".value=desescapeIGEPjs(\""; $actualizarCampoOculto.= IgepSmarty::escapeIGEP($resultado['seleccionado'])."\")');\n"; $opciones.= $actualizarCampoOculto; return $opciones; }//Fin de getJsLista /** * iGepSmarty::getJsMensaje Genera un mensaje HTML/Js a partir de un objeto mensaje de * REVIEW Queda pendiente de discutir con el equipo de negocio si se deja aquí, * o se lleva a otra clase intermedia (IgepPantalla... etc...) * * @access public * @param Object $objMensaje Objeto Mansaje de gvHidra * @return string Cadena JavaScrip HTML correspondiente al mensaje */ static function getJsMensaje(&$objMensaje) { $cadenaJS =""; $cadenaJS .="aviso=parent.aviso;"; $cadenaJS .="aviso.set('aviso', 'capaAviso'"; $cadenaJS .=", '"; $cadenaJS .=$objMensaje->getTipo(); $cadenaJS .="', '"; $cadenaJS .=$objMensaje->getCodigo(); $cadenaJS .="', desescapeIGEPjs('"; $descripcion = $objMensaje->getDescripcionCorta(); $cadenaJS .=IgepSmarty::escapeIGEP($descripcion); $cadenaJS .="'), desescapeIGEPjs('"; $descripcion = $objMensaje->getDescripcionLarga(); $cadenaJS .=IgepSmarty::escapeIGEP($descripcion); $cadenaJS .="')"; $cadenaJS .=");aviso.mostrarAviso();"; return $cadenaJS; } static function getJsSetCampoTexto($campoDestino, $valor='') { $cadenaJs = "eval('parent.document.forms[\"'+formulario+'\"]."; $cadenaJs.= $campoDestino.".value=desescapeIGEPjs(\""; $cadenaJs.= IgepSmarty::escapeIGEP($valor)."\")');\n"; return $cadenaJs; } static function getJsSetSelected($nombreCampoDestino, $valor='') { $cadenaJs ="if (document.getElementById('oculto') == null) // estoy en el oculto\n"; $cadenaJs.="miFormulario = eval('parent.document.forms[\"'+formulario+'\"]');\n"; $cadenaJs.="else miFormulario = eval('document.forms[\"'+formulario+'\"]');\n"; $cadenaJs.="miSelector = miFormulario.$nombreCampoDestino;\n"; $cadenaJs.= "if(miSelector.type=='select-one')\n"; $cadenaJs.= "{\n"; $cadenaJs.= "setSelectedOption(formulario,'$nombreCampoDestino', desescapeIGEPjs(\"".IgepSmarty::escapeIGEP($valor)."\"));\n"; $cadenaJs.= "}\n"; $cadenaJs.="else if ((miSelector.length>1) && (miSelector[0].type=='radio')) \n"; $cadenaJs.="{\n"; $cadenaJs.= "setSelectedRadio(formulario,'$nombreCampoDestino', desescapeIGEPjs(\"".IgepSmarty::escapeIGEP($valor)."\"));\n"; $cadenaJs.="}\n"; return $cadenaJs; } static function getJsSetVisible($campoDestino, $valor='') { //Inicializamos las variables $cadenaJs = "\n"; if($valor===false) { //ocultamos el campo $cadenaJs .="var capaVi = documento.getElementById('"; $cadenaJs .='IGEPVisible'.$campoDestino."');\n"; $cadenaJs .="capaVi.style.visibility ='hidden';\n"; } elseif ($valor===true) { //hacemos visible el campo $cadenaJs .="var capaVi = documento.getElementById('"; $cadenaJs .='IGEPVisible'.$campoDestino."');\n"; $cadenaJs .="capaVi.style.visibility ='visible';\n"; } else return ''; return $cadenaJs; }//Fin getJsSetVisible static function getJsSetEnable($campoDestino, $valor='') { $cadenaJs = "\n"; if($valor===false) { //ocultamos el campo $cadenaJs .="var campo = documento.getElementById('"; $cadenaJs .=$campoDestino."');\n"; $cadenaJs .="if ((campo.type=='button')) "; $cadenaJs .="campo.style.display = 'none';"; $cadenaJs .="if ((campo.type=='select-one') || (campo.type=='select-multiple') || (campo.type=='checkbox')) \n{"; $cadenaJs .="eval('campo.disabled = true');"; $cadenaJs .="\n}"; $cadenaJs .="else \n{"; $cadenaJs .="campo.readOnly = 1;\n"; $cadenaJs .="campo.className=\"formularios noEditable\"; "; // Comprobación de si es un campo fecha y tiene un botón calendario asociado $cadenaJs .= "if ( eval('documento.getElementById(\"cal_".$campoDestino."\")') )\n {"; // Ocultamos el botón del calendario $cadenaJs .= "cal = eval('documento.getElementById(\"cal_".$campoDestino."\")');"; $src = "igep/images/botones/17off.gif"; $cadenaJs .= "cal.src = '$src'"; $cadenaJs .= "}"; $cadenaJs .="\n}"; } elseif($valor===true) { //hacemos visible el campo ANTES de activarlo $cadenaJs .="var campo = documento.getElementById('"; $cadenaJs .=$campoDestino."');\n"; $cadenaJs .="if ((campo.type=='button')) "; $cadenaJs .="if (IE4)"; $cadenaJs .="campo.style.display='inline';\n"; $cadenaJs .="else "; $cadenaJs .="campo.style.display='-moz-inline-box';\n"; //$cadenaJs .="campo.style.display = 'inline';"; $cadenaJs .="if ((campo.type=='select-one') || (campo.type=='select-multiple') || (campo.type=='checkbox')) \n{"; $cadenaJs .="eval('campo.disabled = false');"; $cadenaJs .="eval('campo.className = \"formularios modificable\"');"; $cadenaJs .="\n}"; $cadenaJs .="else \n{"; $cadenaJs .="campo.readOnly = 0;\n"; $cadenaJs .="campo.className=\"formularios modificable\"; "; // Comprobación de si es un campo fecha y tiene un botón calendario asociado $cadenaJs .= "if ( eval('documento.getElementById(\"cal_".$campoDestino."\")') )\n {"; // Ocultamos el botón del calendario $cadenaJs .= "cal = eval('documento.getElementById(\"cal_".$campoDestino."\")');"; $src = "igep/images/botones/17.gif"; $cadenaJs .= "cal.src = '$src'"; $cadenaJs .= "}"; $cadenaJs .="\n}"; } return $cadenaJs; }//Fin getJsSetEnable static function getJsChecksMarcados($checksMarcados) { $js=''; foreach ($checksMarcados as $check) $js.="documento.getElementById('".$check."').checked='true';"; return $js; } static function getJsSetEstadoModificado($p_campoOrigen) { // El campo puede tener prefijo (cam__ , ins__) o nada si está en un panel de busqueda. //Si tiene prefijo count(descCampoOrigen)>1 sino no $descCampoOrigen = explode('___', $p_campoOrigen); if(count($descCampoOrigen)<2) return; if ($descCampoOrigen[0]=='cam') $valor = 'modificada'; else if ($descCampoOrigen[0]=='ins') $valor = 'insertada'; else $valor = 'nada'; //Jamás llego aquí, pero.... $campo='est_'.$descCampoOrigen[2]; $cadenaJs= "eval('documento.forms[\"'+formulario+'\"].".$campo; $cadenaJs.= ".value=\"".$valor."\"');\n"; $campoAnt = str_replace('cam','ant',$p_campoOrigen); $cadenaJs .= "aux = documento.getElementById('".$p_campoOrigen."').value;\n"; $cadenaJs .= "auxAnt = documento.getElementById('".$campoAnt."').value;\n"; $cadenaJs .= "vTonkens = formulario.split('_');\n"; $cadenaJs .= "if (vTonkens.length > 1);\n"; $cadenaJs .= "{\n"; $cadenaJs .= "idFormulario = vTonkens[1];\n"; $cadenaJs .= "};\n"; $cadenaJs .= "nomObj = idFormulario+'_comp';\n"; $cadenaJs .= "var objComp = eval('documento.'+nomObj);"; $cadenaJs .="objComp.comprobarModificacion('".$p_campoOrigen."');"; return $cadenaJs; } static function getJsLanzarFocusChanged() { //REVIEW: David - Revisar esta función $cadenaJs = ""; $cadenaJs .= "\n//ATENCION: Esto lo arreglaremos posteriormente\n"; $cadenaJs .= "nombreFormulario ='F_edi';\n"; $cadenaJs .= "tipoCampo ='cam';\n"; $cadenaJs .= "idPanel ='FichaEdicion';\n"; $cadenaJs .= "filaActual =0;\n"; $cadenaJs .="formulario = eval('document.forms[nombreFormulario]');\n"; $cadenaJs .="if(formulario!=null){\n"; $cadenaJs .=" visible = eval('document.getElementById(\'P_edi\').style.display');\n"; $cadenaJs .=" if(visible!='none'){\n"; $cadenaJs .=" claseManejadora = formulario.claseManejadora.value;\n"; $cadenaJs .=" accionAntigua = formulario.action;\n"; $cadenaJs .=" formulario.action = 'phrame.php?action=focusChanged&claseManejadora='+claseManejadora+'&nomForm='+formulario.name+'&tipoCampo='+tipoCampo+'&idPanel='+idPanel+'&filaActual=-1&filaProxima=0';\n"; $cadenaJs .=" formulario.target = 'oculto';\n"; $cadenaJs .=" formulario.submit();\n"; $cadenaJs .=" formulario.action = accionAntigua;\n"; $cadenaJs .=" }\n"; $cadenaJs .="}\n"; return $cadenaJs; } static function getJsFijarFichaActiva($nombrePanel,$claseManejadora,$fichaActiva) { $cadenaJs = "\n"; //Necesitamos el panel y la página if(($nombrePanel=='edi') or ($nombrePanel=='ediDetalle')) { $cadenaJs .="nombrePanel ='".$nombrePanel."';\n"; $cadenaJs .="nombreFormulario ='F_'+'".$nombrePanel."';\n"; $cadenaJs .="nombreCapa ='P_'+'".$nombrePanel."';\n"; $cadenaJs .="formulario = eval('document.forms[nombreFormulario]');\n"; $cadenaJs .="visible = eval('document.getElementById(nombreCapa).style.display');\n"; $cadenaJs .="if((formulario!=null)&&(visible!='none')){\n"; $cadenaJs .= "if (".$nombrePanel."_paginacion.hayError() == false){\n"; $cadenaJs .="document.forms[nombreFormulario].pagActual___".$claseManejadora.".value='".$fichaActiva."';\n"; $cadenaJs .=$nombrePanel."_paginacion.abrir_pagina(".$fichaActiva.");\n"; $cadenaJs .="};\n"; $cadenaJs .="};\n"; } return $cadenaJs; } /** * iGepSmarty::getJsSetBttlState Establece el estado del boton Tooltip * correspondiente a activado (true) o desactivado (false) * @access public * @param String $panel Indica el panel sobre el que se sitúa el botonTooltip ||| * @param String $nameBttl Nombre del boton tooltip * @param Boolean $on True para activar, false para desahabilitar * @return String JavaScrip HTML correspondiente al mensaje */ static function getJsSetBttlState($idPanel, $nameBttl, $on=true) { $nameBttl = trim(strtolower($nameBttl)); $refJS = 'documento.'; switch($nameBttl) { case 'insertar': case 'nuevo': $refJS.='bttlInsertar'; break; case 'modificar': case 'editar': $refJS.='bttlModificar'; break; case 'eliminar': case 'borrar': $refJS.='bttlEliminar'; break; case 'limpiar': case 'restaurar': $refJS.='bttlLimpiar'; break; default: return ''; } $refJS.="_$idPanel"; $cadenaJs = ""; $cadenaJs .= "var documento = document;"; $cadenaJs .= "if (document.getElementById('oculto') == null) // estoy en el oculto"; $cadenaJs .= "\n{ "; $cadenaJs .= " documento = parent.document"; $cadenaJs .= "}\n"; if ($on) { $cadenaJs.="$refJS.habilitarBoton();\n"; } else { $cadenaJs.="$refJS.deshabilitarBoton();\n"; } return $cadenaJs; } //FIN getJsSetBttlEnable static function getJsNuevo($esDetalle) { $cadenaDetalle=''; if($esDetalle!='') $cadenaDetalle='Detalle'; $cadenaJs=''; $cadenaJs.='if(typeof bttlInsertar_edi'.$cadenaDetalle.'!=="undefined"){bttlInsertar_edi'.$cadenaDetalle.'.insertar();}'; $cadenaJs.='if(typeof bttlInsertar_lis'.$cadenaDetalle.'!=="undefined"){bttlInsertar_lis'.$cadenaDetalle.'.insertar();}'; return $cadenaJs; } static function getJsOpenWindow($path) { //REVIEW: David - Tras registrar windows.js en CWVentana, podría quitarse esta declaración $cadenaJs ="function Open_Vtna2(pagina,nombre,w,h,toolbar,location,status,menubar,scroll,resizable) {\n"; $cadenaJs.="LeftPosition = (screen.width) ? (screen.width-w)/2 : 0;\n"; $cadenaJs.="TopPosition = (screen.height) ? (screen.height-h)/2 : 0;\n"; $cadenaJs.="settings = 'top='+TopPosition+',left='+LeftPosition+',toolbar='+toolbar+',location='+location+',status='+status+',menubar='+menubar+',scrollbars='+scroll+',resizable='+resizable+',width='+w+',height='+h;\n"; $cadenaJs.="//Si firefox o Mozilla eliminamos todas las barras, la hacemos modal,dependiente y que flote sobre el resto\n"; $cadenaJs.="if (navigator.appCodeName =='Mozilla')\n"; $cadenaJs.="settings = settings+',directories=no,personalbar=no,minimizable=no,alwaysRaised=yes,modal=yes,dependent=yes';\n"; $cadenaJs.="win = window.open(pagina,nombre,settings);\n"; $cadenaJs.="win.focus();\n"; $cadenaJs.="}"; $cadenaJs.="Open_Vtna2('".$path."','ventana',700,500,'no','no','no','no','yes','yes');"; return $cadenaJs; } }//Fin Class IgepSmarty ?>