function ini() {
	menu();
	linksExternos();
}
function menu() {
	$('sidebar').getElements('li.menu').each( function( elem ){
		var list = elem.getElement('ul.submenu');
		var myFx = new Fx.Slide(list).hide();
		
		elem.addEvents({
			'mouseenter' : function(){
				myFx.cancel();
				myFx.slideIn();
			},
			'mouseleave' : function(){
				myFx.cancel();
				myFx.slideOut();
			}
		});
	})	
}
function validar(e) {
	e.stop();
	var numControl, controles, 
        numErrores, comprobaciones, valorCampo,
        numComprobacion, validacion, error;
 
    // la variable 'this' hace referencia al objeto que invoca este método
    // en nuestro caso: el formulario
    // la propiedad 'elements' contiene una matriz con todos los controles
    controles= this.elements;
 
    // eliminamos los posibles errores previos
	$$('.error').each(function(elem){
		elem.removeClass('error');
	});
	if($type($('pError'))){$('pError').dispose();}	
	if($type($('pAviso'))){$('pAviso').dispose();}
	
    numErrores= 0;                          // cuenta el nº de campos erróneos
    // revisamos todos los controles del formulario
    for (numControl= 0; numControl < controles.length; ++numControl) {
        valorCampo= controles[numControl].value;
        // cada campo especifica en las 'clases' los tipos de comprobación que requiere
        comprobaciones= controles[numControl].className.split (" ");    // matriz de clases especificadas
        // repasamos cada clase (por si corresponde a una comprobación)
        for (numComprobacion= 0; numComprobacion < comprobaciones.length; ++numComprobacion) {
            validacion= comprobaciones[numComprobacion];
            error= false;
            switch (validacion) {
                case 'chkOblig':
                    error= /^\s*$/.test (valorCampo);
                    break;
                case 'chkDNI':
                    error= (valorCampo.length > 0 && !(/^\d{8}-[a-z]$/i.test (valorCampo)));
                    break;
                case 'chkCPos':
                    error= (valorCampo.length > 0 && !(/^\d{5}$/.test (valorCampo)));
                    break;
                case 'chkNum':
                    error= (valorCampo.length > 0 && !(/^\d+$/.test (valorCampo)));
                    break;
                case 'chkMovil':
                    error= (valorCampo.length > 0 && !(/^6\d{8}$/.test (valorCampo)));
                    break;
                case 'chkFecha':
                    error= (valorCampo.length > 0 && !esFechaValida (valorCampo));
                    break;
                case 'chkEmail':
                    error= (valorCampo.length > 0 && !(/^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/i.test (valorCampo)));
                    break;
            }
            // si no se cumple una validación, dejamos de comprobar el campo
            if (error) {
                ++numErrores;
                // mostramos visualmente el error
                //controles[numControl].addClass('error');
				controles[numControl].className += ' error';
                break;                          // sale del último 'for' (comprobación de clases)
            }
        }
    }
 
    // muestra información al usuario
    if (numErrores > 0){
		var pError = new Element('p', {
			'class': 'error',
			'id': 'pError',
			'html': 'Algunos de los campos no tienen un valor correcto.'
		});
		this.insertBefore(pError, this.firstChild);
	}
	else {
		this.submit();
	}
} 
function esFechaValida (valorFecha) {
/* 
   comprobar una fecha no es una tarea sencilla: Es necesario:
   · verificar que la sintaxis es correcta (dd/mm/aaaa)
   · verificar que la fecha es válida
     ej.: 31/04/2007 es sintácticamente correcto, pero no es válido
*/ 
    var esValida= false,		// asumimos, por defecto, que el valor es erróneo
        matrizComponentes,
        fecha, cadenaFecha; 
    // podemos utilizar una expresión regular para comprobar la sintaxis
    // y obtener cada componente de la fecha en un elemento de matriz
    matrizComponentes= valorFecha.match (
                            /^(\d{2})\/(\d{2})\/(\d{4})$/); // cada paréntesis marca un componente
    if (matrizComponentes) {
        // la sintaxis es correcta, ahora veremos si la fecha es válida 
        // primero construimos una fecha a partir de los componentes
        fecha= new Date(matrizComponentes[3],           // año
                        matrizComponentes[2] - 1,       // mes (en JavaScript, desde 0)
                        matrizComponentes[1]);          // día 
        // JavaScript corrige automáticamente los "errores" al construir la fecha
        // ej.: 31/04/2007 => se crea la fecha 01/05/2007 
        // y ahora escribimos esta fecha con el formato adecuado (dd/mm/aaaa)
        cadenaFecha= (("0" + fecha.getDate ()) + "/" +
                      ("0" + (fecha.getMonth () + 1)) + "/" +
                      fecha.getFullYear ()).replace (/0(\d\d\/)/g, "$1"); 
        // para que la fecha sea válida, tienen que coincidir ambos valores
        if (valorFecha == cadenaFecha){esValida= true;}
    } 
    return esValida;
}
function linksExternos() {
	$$('.externo').each(function(elem){
		elem.removeEvents('click');
		elem.addEvent('click', function(e) {
			e.stop();
			open(this.href);
		});
	});
}
