]> git.llucax.com Git - mecon/samurai.git/blob - lib/SAMURAI/HTML/Perfil.php
Se corrige con la nueva interface de MECON_Usuario.
[mecon/samurai.git] / lib / SAMURAI / HTML / Perfil.php
1 <?php 
2 // vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4 foldmethod=marker textwidth=80:
3 // +----------------------------------------------------------------------+
4 // | PHP Version 4                                                        |
5 // +----------------------------------------------------------------------+
6 // | Copyright (c) 1997-2003 The PHP Group                                |
7 // +----------------------------------------------------------------------+
8 // | This source file is subject to version 2.02 of the PHP license,      |
9 // | that is bundled with this package in the file LICENSE, and is        |
10 // | available at through the world-wide-web at                           |
11 // | http://www.php.net/license/2_02.txt.                                 |
12 // | If you did not receive a copy of the PHP license and are unable to   |
13 // | obtain it through the world-wide-web, please send a note to          |
14 // | license@php.net so we can mail you a copy immediately.               |
15 // +----------------------------------------------------------------------+
16 // | Created: mar ago 26 13:18:26 ART 2003
17 // | Author:  Martin Marrese <mmarre@mecon.gov.ar>
18 // +----------------------------------------------------------------------+
19 //
20 // $Id$
21 //
22
23 /** \page page_samurai_html_perfil Perfil Embebido
24
25 \section page_samurai_html_perfil_descripcion Descripcion
26     Samurai provee de una funcion que permite embeber la funcionalidad de 
27     perfiles dentro de aquellos sistemas que asi lo requieran.
28     Es completamente independiente del sistema en el cual trabaja y puede ser
29     agregado de cualquier manera (Seccion, Subseccion o Contenido) al sistema.
30         
31     \note Es necesario para embeber los perfiles que se haya realizado un
32     session_start().
33
34 \section page_samurai_html_perfil_funcionamiento Funcionamiento
35     Es una copia de la seccion Perfiles dentro de SAMURAI. Se relizan las mismas
36     verificaciones, tiene las mismas condiciones y se utilizan los mismos 
37     permisos que en este.
38
39     \subsection page_samurai_html_perfil_funcionamiento_validaciones Validaciones y Condiciones
40         - Los espacios entre las palabras que componen el nombre de un
41           perfil son eliminados. Ej: Agregar&nbsp;&nbsp;&nbsp;&nbsp;Usuario
42           se cambia por Agregar Usuario.
43         - Es obligatorio que los perfiles contengan al menos un permiso.
44         - No puede haber dos perfiles con los mismos permisos.
45         - No se pueden borrar perfiles que esten asociados a usuarios.
46         - No se pueden ingresar pefiles nuevos que ya esten cargados.
47
48 \section page_samurai_html_perfil_ejemplo Ejemplo
49     SAMURAI_HTML_Perfil agrega el contenido directamente en el marco que se este
50     utilizando.
51     Para embeber los perfiles hay que hacerlo de la siguiente manera
52
53     \code
54     include 'SAMURAI/HTML/Perfil.php';
55     SAMURAI_HTML_Perfil($MARCO, $ID_SISTEMA);
56     \endcode
57     
58     \note $MARCO es el objeto MECON_Marco o el objeto HTML_DietMarco de
59     intranet. 
60     $ID_SISTEMA es el identificador numerico en el cual se esta realizando la
61     accion de embeber.
62
63 \section page_samurai_html_perfil_permisos Pasos Finales
64     Para que los usuarios puedan acceder a los perfiles embebidos es necesario
65     que en el sistema en el cual se este embebiendo se agregen los permisos que
66     utiliza la seccion Perfiles (enumerados mas abajo), y que estos mediante
67     perfiles se asignen a usuarios.
68     Esto implica que por lo menos un usuario tendra que ser cargado desde
69     SAMURAI para que este tenga acceso a la zona embebida.
70
71     Permisos
72         - perfil alta
73         - perfil baja
74         - perfil modificacion
75         - perfil tipo
76 */
77
78 //REQUIRE ONCE {{{
79 require_once 'SAMURAI/DB.php';
80 require_once 'SAMURAI/Perm.php';
81 require_once 'SAMURAI/constantes.php';
82 require_once 'SAMURAI/Perfil.php';
83 require_once 'SAMURAI/Sistema.php';
84 require_once 'SAMURAI/Permiso.php';
85 require_once 'MECON/HTML/Tabla.php';
86 require_once 'MECON/HTML/QuickForm.php';
87 require_once 'MECON/HTML/Error.php';
88 require_once 'MECON/HTML/Image.php';
89 require_once 'PEAR.php';
90 // }}}
91
92 /** 
93  * Funcion que se encarga agregar los componentes necesarios al sistema para
94  * que se pueda realizar un abm de perfiles.
95 @see \ref page_samurai_html_perfil
96  *
97  * @param MECON_Marco &$MARCO      Referencia al objeto MECON_Marco que se este utilizando en la pagina
98  * @param int          $id_sistema Identificador del sistema en el cual se esta trabajando
99  *
100  * @return void
101  */
102 //SAMURAI_HTML_Perfil {{{
103 function SAMURAI_HTML_Perfil(&$MARCO, $id_sistema) {
104
105     //INICIALIZO OBJETOS GENERALES {{{
106     //REALIZO CONEXION
107     $tmp = new SAMURAI_DB();
108     $DB  =& $tmp->connect();
109     //CREAR EL OBJETO SAMURAI_Perm
110     $SAMURAI_PERM = new SAMURAI_Perm ($_SESSION['usuario'], $id_sistema, $DB);
111     //}}}
112
113     if (@$_POST['samurai_accion'] == 'abm' || @$_GET['samurai_perfiles'] == 'abm') {
114         $OPCION = 'abm';
115     }
116     elseif (@$_POST['samurai_accion'] == 'nuevo' || @$_GET['samurai_perfiles'] == 'nuevo') {
117         $OPCION = 'nuevo';
118     }
119     else {
120         $OPCION = 'listado';
121     }
122     
123     //POSIBLES ACCIONES
124     // listado -> Listado de los perfiles ya creados en el sistema.
125     // nuevo   -> Pantalla de seleccion o de ingreso de un nuevo nombre.
126     // abm     -> Formulario para la carga de la info del perfil.
127
128     //LISTADO {{{
129     if ($OPCION == 'listado') {
130         //VEO SI PUEDE ACCEDER{{{
131         $SAMURAI_PERM->chequear(SAMURAI_PERM_PERFIL_ALTA,SAMURAI_PERM_PERFIL_BAJA,SAMURAI_PERM_PERFIL_MODIF);
132         //}}}
133         //LINKS {{{
134             $aHref      = '<a href="'.$_SERVER['PHP_SELF'].'?accion=##ACCION##&id_perfil=##NUEVO##&samurai_perfiles=abm">';
135             $aHrefModif = $aHref.'<img src="/MECON/images/general_modificar.gif" border="0" alt="Modificar Perfil"></a>';
136             $aHrefElim  = $aHref.'<img src="/MECON/images/general_eliminar.gif"  border="0" alt="Eliminar Perfil" ></a>';
137         // }}}
138         //CREO LOS OBJETOS NECESARIOS {{{
139             $TABLA2  =& new MECON_HTML_Tabla ('cellspacing=0');
140             $TABLA   =& new MECON_HTML_Tabla ('cellpadding=2');
141             $TABLA3  =& new MECON_HTML_Tabla ('cellspacing=0');
142             $SISTEMA =& new SAMURAI_Sistema($DB, $id_sistema);
143         // }}}
144         //OBTENGO LA INFORMACION DE LA BASE {{{
145             $perfiles = SAMURAI_Perfil::getPerfiles($DB, null, $id_sistema);
146         // }}}
147         //AGREGO LOS DATOS A LAS TABLAS {{{
148             $imagen = new MECON_HTML_Image('/MECON/images/vinetas_flecha_doble.gif');
149             $row    = array ($imagen->toHtml().'&nbsp;<b>SISTEMA: '.$SISTEMA->getNombre().'</b>');
150             $TABLA3->addRow($row,'align=left'); 
151
152             //Agrego el link a nuevo
153             if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_ALTA)) {
154                 $row   = array ('<a href="'.$_SERVER['PHP_SELF'].'?samurai_perfiles=nuevo"><img src="/MECON/images/general_nuevo.gif" border="0">Ingresar&nbsp;Nuevo&nbsp;Perfil</a>');
155                 $TABLA2->addRow($row,'align=right');    
156             }
157
158             //Genero la cabecera de la tabla
159             $row   = array ('Id','Descripción');
160             if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
161                 $row[] = 'Tipo';
162             }    
163             if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_MODIF)) {
164                 $row[] = 'Modif.';
165             }    
166             if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_BAJA)) {
167                 $row[] = 'Elim.';
168             }    
169             
170             $TABLA->addRow($row,'cabecera');
171             foreach ($perfiles as $perfil) {
172                 $Modif = ereg_replace('##NUEVO##' , $perfil->getId(), $aHrefModif);
173                 $Elim  = ereg_replace('##NUEVO##' , $perfil->getId(), $aHrefElim );
174                 $Modif = ereg_replace('##ACCION##', 'm'             , $Modif     );
175                 $Elim  = ereg_replace('##ACCION##', 'e'             , $Elim      );
176                 $row = array ($perfil->getId(), $perfil->getDescripcion());
177                 
178                 if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
179                     $row[] = $perfil->getTipo();
180                 }    
181                 if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_MODIF)) {
182                     $row[] = $Modif;
183                 }    
184                 if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_BAJA)) {
185                     $row[] = $Elim;
186                 }    
187                 $TABLA->addRow($row);
188             }
189         // }}}
190         //AGREGO LA INFO AL MARCO {{{
191             $MARCO->addBodyContent($TABLA3);
192             $MARCO->addBodyContent($TABLA2->toHtml(1));
193             $MARCO->addBodyContent($TABLA);
194         //}}}
195     }
196     //}}}
197     //NUEVO {{{
198     elseif ($OPCION == 'nuevo') {
199         //VEO SI PUEDE ACCEDER{{{
200         $SAMURAI_PERM->chequear(SAMURAI_PERM_PERFIL_ALTA);
201         //}}}
202         //CREO LOS OBJETO NECESARIOS {{{
203             $FORM    =& new MECON_HTML_QuickForm ('samurai_perfiles','post',$_SERVER['PHP_SELF']);
204             $SISTEMA =& new SAMURAI_Sistema ($DB, $id_sistema);
205         // }}}
206         //AGREGO LOS ELEMENTOS DEL FORM {{{
207             $FORM->addElement ('hidden', 'samurai_accion', 'nuevo');
208             $FORM->addElement ('header', 'cabecera'   , 'Nuevo Perfil');
209             $FORM->addElement ('select', 'perfiles'   , 'Perfiles', null, array('size' => '1'));
210             $FORM->addElement ('text'  , 'filtro'     , 'Filtrar' , array('size' => '50'));
211             $FORM->addElement ('text'  , 'descripcion', 'Nombre'  , array('size' => '50'));
212             $group[] = HTML_QuickForm::createElement('submit', 'continuar', 'Continuar');
213             $group[] = HTML_QuickForm::createElement('submit', 'filtrar'  , 'Filtrar'  );
214             $group[] = HTML_QuickForm::createElement('submit', 'cancelar' , 'Cancelar', array ('onClick' => 'javascript:window.location =\''.$_SERVER['PHP_SELF'].'\';return false;') );
215             $FORM->addGroup($group,'botones');
216         // }}}
217         //RESTRINJO EL FORMATO DEL NOMBRE DEL PERFIL{{{
218             $FORM->addRule ('descripcion', 'El nombre del perfil solo puede contener letras y/o numeros.', 'regex','/^[a-zA-Z0-9 ]+$/');
219         // }}}
220         // CARGO LA INFORMACION EN EL SELECT DE PERFILES {{{
221             $botones     = $FORM->getSubmitValue('botones');
222             $perfiles    =& $FORM->getElement('perfiles');
223             $descripcion =& $FORM->getElement('descripcion');
224             if (@$botones['cancelar']) {
225                 header('Location: '.$_SERVER['PHP_SELF'].'/');
226             }
227             if (!isset($botones['filtrar'])) {
228                 $PERFILES = SAMURAI_Perfil::getArrayPerfiles($DB);
229             }
230             elseif (@$botones['filtrar']) {
231                 $filtro   =& $FORM->getElement('filtro'); 
232                 $PERFILES = SAMURAI_Perfil::getArrayPerfiles($DB, $filtro->getValue());
233             }
234             $perfiles->addOption('--', '--');
235             $perfiles->loadArray($PERFILES);
236         // }}}
237         // VALIDO EL FORMULARIO {{{
238             if ($FORM->validate()) {
239                 if (@$botones['continuar']) { //Ya selecciono un nombre para el perfil
240                     $res = '';
241                     $tmp = $perfiles->getSelected();
242                     if ((!@$descripcion->getvalue() && $tmp['0'] == '--') || ($descripcion->getvalue() && $tmp['0'] != '--')) {
243                         $res = new PEAR_Error("Debe seleccionar un perfil del combo o ingresar un nombre en la casilla correspondiente.<br>Solo una de las dos opciones.");
244                         @$descripcion->setValue('');
245                     }
246                     elseif ($tmp['0'] != '--') {
247                         //verificar que el sistema no tenga una asociacion con ese perfil
248                         if (SAMURAI_Perfil::existeAsociacion($DB, $tmp['0'], $id_sistema)) {
249                             $res = new PEAR_Error("El sistema ya tiene asociado el perfil seleccionado, modifique sus permisos desde la seccion perfiles.");
250                         }
251                         else {
252                             header('Location: '.$_SERVER['PHP_SELF'].'?samurai_perfiles=abm&id_perfil='.$tmp['0']);
253                         }
254                     }
255                     elseif ($descripcion->getValue()) {
256                         //Verificar que no exista un perfil con la misma descripcion
257                         //Reduzco los blancos
258                         $temp = $descripcion->getValue();
259                         $tt = split (' ', $temp);
260                         $rta = ''; 
261                         foreach ($tt as $t) {
262                             if ($t != '') {
263                                 $rta.= $t.' ';
264                             }
265                         }
266                         $rta = rtrim($rta);
267                         // 
268                         if (SAMURAI_Perfil::existePerfil($DB, $rta)) {
269                             $res = new PEAR_Error("Ya existe un perfil con ese nombre, seleccionelo del combo.<br> Recuerde que varios espacios se reduciran a uno solo (Ej: Agregar&nbsp;&nbsp;&nbsp;&nbsp; Usuario -> Agregar Usuario)");
270                         }
271                         else {
272                             $temp = ereg_replace(' ' , '%20', $rta); //Cambio los espacios por %20 para que no chille el netscape
273                             header('Location: '.$_SERVER['PHP_SELF'].'?samurai_perfiles=abm&desc_perfil='.$temp);
274                         }
275                     }
276                     if (PEAR::isError($res)) {
277                         $TABLA = new MECON_HTML_Tabla ('cellspacing=0');
278                         $row = array ('<font color="red"><b>'.$res->getMessage().'</b></font>');
279                         $TABLA->addRow($row,'align=left');
280                     }
281                 } 
282             }
283         // }}}
284         //AGREGO LA INFO AL MARCO {{{
285         //AGREGO LOS DATOS A LAS TABLAS {{{
286             $TABLA3 = new MECON_HTML_Tabla ('cellspacing=0');
287             $imagen = new MECON_HTML_Image('/MECON/images/vinetas_flecha_doble.gif');
288             $row    = array ($imagen->toHtml().'&nbsp;<b>SISTEMA: '.$SISTEMA->getNombre().'</b>');
289             $TABLA3->addRow($row,'align=left');    
290         //}}} 
291             $MARCO->addBodyContent($TABLA3);
292             if (isset($TABLA)) {
293                 $MARCO->addBodyContent($TABLA);
294             }
295             $MARCO->addBodyContent($FORM);
296         //}}}
297     }
298     //}}}
299     //ABM {{{
300     elseif ($OPCION == 'abm') {
301         //VEO SI PUEDE ACCEDER{{{
302         $SAMURAI_PERM->chequear(SAMURAI_PERM_PERFIL_ALTA,SAMURAI_PERM_PERFIL_BAJA,SAMURAI_PERM_PERFIL_MODIF);
303         //}}}
304         //CREO LOS OBJETO NECESARIOS {{{
305             if (@$_GET['id_perfil']) {
306                 $id_perfil = $_GET['id_perfil'];
307             }
308             elseif (@$_POST['id_perfil']) {
309                 $id_perfil = $_POST['id_perfil'];
310             }
311             else {
312                 $id_perfil = null;
313             }
314             $FORM    =& new MECON_HTML_QuickForm ('samurai_perfiles','post',$_SERVER['PHP_SELF']);
315             $SISTEMA =& new SAMURAI_Sistema ($DB, $id_sistema);
316             $PERFIL  =& new SAMURAI_Perfil ($DB, $id_perfil, $id_sistema);
317
318             if ($PERFIL->getResponsable()) {
319                 $responsable = $PERFIL->getResponsable();
320             }
321             else {
322                 $responsable = $_SESSION['usuario'];
323             }
324             
325             if (!@$_GET['id_perfil']) {
326                 if (@$_GET['desc_perfil']) {
327                     $PERFIL->setDescripcion(@$_GET['desc_perfil']);
328                 }
329                 else {
330                     $PERFIL->setDescripcion(@$_POST['desc_ant']);
331                 }
332             }
333             $descripcion = $PERFIL->getDescripcion();
334         // }}}
335         //OBTENGO LOS PERMISOS DEL SISTEMA {{{
336             $ASOCIACIONES = $SISTEMA->getAsociaciones();
337             $PERMISOS = array ();
338             foreach ($ASOCIACIONES as $as) {
339                 $clave = $as['id'].'##'.$as['obs'];
340                 $texto = ($as['obs'] != '') ? $as['desc'].' - '.$as['obs']: $as['desc'];
341                 $PERMISOS[$clave] = $texto;
342             }
343         // }}}
344         //AGREGO LOS ELEMENTOS DEL FORM {{{
345             if (@$PERMISOS) {
346                 $FORM->addElement ('hidden', 'samurai_accion', 'abm');
347                 $FORM->addElement ('header', 'cabecera', 'ABM Perfiles');
348                 $FORM->addElement ('hidden', 'id_perfil', $id_perfil);
349                 $FORM->addElement ('hidden', 'desc_ant'   , $descripcion);
350                 $FORM->addElement ('static', 'desc_perfil', 'Descripción', $descripcion);
351                 $FORM->addElement ('select', 'permisos'   , 'Permisos'   , $PERMISOS, array('size' => '5', 'multiple' => 'true'));
352                 if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
353                     $FORM->addElement ('select', 'tipo_perfil', 'Tipo Perfil', array('E' => 'Externo', 'I' => 'Interno', 'D' => 'Dios'), array ('size' => '1'));
354                 }
355                 $FORM->addElement ('hidden', 'responsable', $responsable);
356                 $group[] = HTML_QuickForm::createElement('submit', 'aceptar' , 'Grabar');
357                 $group[] = HTML_QuickForm::createElement('submit', 'cancelar', 'Cancelar', array ('onClick' => 'javascript:window.location=\''.$_SERVER['PHP_SELF'].'\';return false;'));
358                 $FORM->addGroup($group,'botones');
359             }
360             else {
361                 $ERROR = new MECON_HTML_Error('El sistema no posee permisos asociados.');
362             }
363         // }}}
364         //AGREGO LAS REGLAS DE VALIDACION {{{
365             $FORM->addRule ('permisos', 'Se debe seleccionar al menos un permiso', 'required');
366         // }}}
367         //CARGO LOS DATOS SI YA EXISTEN EN BASE {{{
368             if (isset($_GET['accion']) && $_GET['accion'] != '') {
369                 //MODIFICACION
370                 $id_perfil    =& $FORM->getElement  ('id_perfil'  );
371                 $desc_perfil  =& $FORM->getElement  ('desc_perfil');
372                 $permisos     =& $FORM->getElement  ('permisos'   );
373                 
374                 if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
375                     $tipo_perfil  =& $FORM->getElement  ('tipo_perfil');
376                 }
377                 $responsable  =& $FORM->getElement  ('responsable');
378                 $group        =& $FORM->getElement  ('botones'    );
379                 $group        =& $group->getElements('aceptar'    );
380                 $aceptar      =& $group[0];
381
382                 $permisos->setSelected($PERFIL->getPermisos());
383                 
384                 if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
385                     $tipo_perfil->setSelected($PERFIL->getTipo());
386                 }
387
388                 if ($PERFIL->getResponsable() != '') {
389                     $responsable->setValue($PERFIL->getResponsable());
390                 }
391
392                 //Modifico el valor del boton
393                 $aceptar->setValue('Modificar');
394                     
395                 //ELIMINACION -> modifico el valor del boton
396                 if ($_GET['accion'] == 'e') {
397                     $aceptar->setValue('Eliminar');
398                     $aceptar->updateAttributes(array ('onClick' => 'javascript:if (confirm(\'¿Esta Seguro?\')) return true;return false;'));
399                     $FORM->freeze();
400                 }
401             }
402         // }}}
403         //VALIDO EL FORMULARIO {{{
404             if ($FORM->validate()) {
405                 // VEO SI SE CANCELO {{{
406                 $botones = $FORM->getSubmitValue('botones');
407                 if (@$botones['cancelar']) {
408                     header('Location: '.$_SERVER['PHP_SELF']);
409                 }
410                 // }}}
411                 else {
412                     $samurai_accion =& $FORM->getElement('samurai_accion');
413                     $samurai_accion->setValue('listado');
414                     $id_perfil    =& $FORM->getElement  ('id_perfil'  );
415                     $desc_perfil  =& $FORM->getElement  ('desc_perfil');
416                     $permisos     =& $FORM->getElement  ('permisos'   );
417                     
418                     if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
419                         $tipo_perfil  =& $FORM->getElement  ('tipo_perfil');
420                         $tipo_perfil_tmp  =  $tipo_perfil->getSelected();
421                     }
422                     $responsable  =& $FORM->getElement  ('responsable');
423                     $group        =& $FORM->getElement  ('botones'    );
424                     $group        =& $group->getElements('aceptar'    );
425                     $aceptar      =& $group[0];
426               
427                     $PERFIL->setDescripcion($desc_perfil->_text     );
428                     $PERFIL->setResponsable($responsable->getValue());
429                     $PERFIL->setPermisos   ($permisos->getSelected()); //Le asigno al perfil los permisos seleccionados
430                     
431                     if ($SAMURAI_PERM->tiene(SAMURAI_PERM_PERFIL_TIPO)) {
432                         $PERFIL->setTipo($tipo_perfil_tmp['0']);
433                     }
434                     
435                     //Grabo y verifico si se produjo algun error
436                     $res = $PERFIL->guardarDatos($aceptar->getValue());
437
438                     if (PEAR::isError($res)) {
439                         $ERROR = new MECON_HTML_Error($res->getMessage());
440                         if ($aceptar->getValue() == 'Eliminar') {
441                             $FORM->freeze();
442                         }
443                     }
444                     else {
445                         $FORM->freeze();
446                         header('Location: '.$_SERVER ['PHP_SELF'].'/');
447                         exit;
448                     }
449                 }
450             }
451         // }}}
452         //DIBUJO LA PAGINA {{{
453             $imagen = new MECON_HTML_Image('/MECON/images/vinetas_flecha_doble.gif');
454             $row    = array ($imagen->toHtml().'&nbsp;<b>SISTEMA: '.$SISTEMA->getNombre().'</b>');
455             $TABLA3 = new MECON_HTML_Tabla ('cellspacing=0');
456             $TABLA3->addRow($row,'align=left');    
457
458             $MARCO->addBodyContent($TABLA3);
459             if (isset($ERROR)) {
460                 $MARCO->addBodyContent($ERROR);
461             }
462             $MARCO->addBodyContent($FORM);
463     //}}}
464     }
465     //}}}
466 }
467 //}}}
468 ?>