window.addEvent('domready', inicioUtilidades);

function inicioUtilidades(){
  var instanciaMenuDesplegable = new MenuDesplegable();
  /**
   * para cambiar ruta imagenes aumentar/disminuir fuente pasar como parametro de la instancia de ControlTamanoFuente
   * Ej:
   * var instanciaControlTamanoFuente = new ControlTamanoFuente({
   *		imgControlAumentar: {
   *			ruta: 'archivos/tipo/x.gif'
   *		},
   *		imgControlDisminuir: {
   *			ruta: 'archivos/tipo/x.gif'
   *		}
   * })
   */  
  var instanciaControlTamanoFuente = new ControlTamanoFuente();  
  var instanciaControlContraste = new ControlContraste();
  var instanciaControladorInterfaz = new ControladorInterfaz();
}


var Selectores = {
	clases: {
		abreEnlaceVentanaNueva: 'openBlank',
		abreEnlaceEnvioCorreo: 'openMail',
		abreEnlacePdf: 'openPdf',
		abreEnlaceDoc: 'openDoc'
		
	}
}

var accionVinculos = {
	abreEnlaceVentanaNueva : 'abreEnlaceVentanaNueva',
	abreEnlaceEnvioCorreo : 'abreEnlaceEnvioCorreo',
	abreEnlacePdf : 'abreEnlacePdf',
	abreEnlaceDoc : 'abreEnlaceDoc'
}
var textos = {
	indentados: {
		abreEnlaceVentanaNueva: 'Abre en ventana nueva.',
		abreEnlaceEnvioCorreo: 'Envía correo electrónico.',
		abreEnlacePdf: 'Abre archivo Pdf en ventana nueva.',
		abreEnlaceDoc: 'Abre documento de texto en ventana nueva.'
	}
}

var ControladorInterfaz = new Class({
    initialize: function(){ with(this) {
	  insertaComportamiento().enEnlaces();
    }},
	abreEnlaceVentanaNueva: function (enlace) { with(this) {
		construye().nuevaVentana(enlace.href)
		
	}},
	insertaComportamiento: function () {
		return new generadorComportamientos(this);
	},
	construye: function () {
		return new ConstructorInterfaz(this);
	}
	
});	

var ConstructorInterfaz = new Class( {
	initialize: function(controladorInterfaz){
		this.controladorInterfaz = controladorInterfaz;
		return this;
    },
	textoAdicionalIndentado: function(elemento,texto){ with(this) {
		elemento.innerHTML +=  "<span class='indentado'>.&nbsp;"+texto+"</span>";
		return this;
	}},
	title: function(elemento,texto){ with(this) {
		var title = "";
		if (elemento.title.length > 0) title = ". ";
		title += texto
		elemento.title +=  title;
		return this;
	}},
	Y: function(){ with(this) {
		return this;
	}},
	nuevaVentana: function(enlace){ with(this) {
		var url;
		(esUnEnlace(enlace))?url = enlace.href:url = enlace.parentNode.href;
		var ventana = window.open(url, '_blank');
		if (ventana && !ventana.closed) { 
			ventana.focus(); 
		}
		return this;
	}},
	esUnEnlace: function(enlace){ with(this) {
		return (enlace.tagName == "A");
	}}
});

var generadorComportamientos = new Class( {
	initialize: function(controladorInterfaz){
		this.controladorInterfaz = controladorInterfaz;
		return this;
    },
	enEnlaces: function () { with(this) {
		recorreEnlacesAccionEspecial();
	}},
	recorreEnlacesAccionEspecial: function () { with(this) {
		var accion;
		$$('a').each(function(enlace){
			if (esEnlaceConTextoAdicional(enlace)) {
				controladorInterfaz.construye().textoAdicionalIndentado(enlace,textos.indentados[sacaAccionEspecialEnlace(enlace)]);
				controladorInterfaz.construye().title(enlace,textos.indentados[sacaAccionEspecialEnlace(enlace)]);
			}
			if (esEnlaceAperturaNuevaVentana(enlace)) insertaComportamiento(enlace,'click',lanzaAccionEnlaceEspecial);
		},this)
		
	}},
	sacaAccionEspecialEnlace: function (enlace) { with(this) {
		if (enlace.hasClass(Selectores.clases.abreEnlaceVentanaNueva)) return accionVinculos.abreEnlaceVentanaNueva;
		else if (enlace.hasClass(Selectores.clases.abreEnlacePdf)) return accionVinculos.abreEnlacePdf;
		else if (enlace.hasClass(Selectores.clases.abreEnlaceDoc)) return accionVinculos.abreEnlaceDoc;
		else if (enlace.hasClass(Selectores.clases.abreEnlaceEnvioCorreo)) return accionVinculos.abreEnlaceEnvioCorreo;
	}},
	insertaComportamiento: function (elemento, evento, accion) {
		elemento.addEvent(evento, accion.bind(this))
	},	
	esEnlaceConTextoAdicional: function (enlace) {
		return (enlace.hasClass(Selectores.clases.abreEnlaceVentanaNueva) || enlace.hasClass(Selectores.clases.abreEnlacePdf) || enlace.hasClass(Selectores.clases.abreEnlaceDoc) || enlace.hasClass(Selectores.clases.abreEnlaceEnvioCorreo));
	},
	esEnlaceAperturaNuevaVentana: function (enlace) {
		return (enlace.hasClass(Selectores.clases.abreEnlaceVentanaNueva) || enlace.hasClass(Selectores.clases.abreEnlacePdf) || enlace.hasClass(Selectores.clases.abreEnlaceDoc))
	},
	lanzaAccionEnlaceEspecial: function (evento) { with(this) {
		
		controladorInterfaz.construye().nuevaVentana(evento.target);
		evento.stop();
	}}

	
});







var MenuDesplegable = new Class({
    Implements: [Options],

    options: {
		selectorMenuPpal: 'div.menuNavegacionPrincipal li a',
		claseSubMenuPlegado: 'oculto',
		claseItemDesplegado: 'activo'
    },

    initialize: function(options){
      this.setOptions(options);
	  this.alternaVisibilidadSubMenus();
    },
	
	
	/**
	 * funciones para menu desplegable 
	 */
	alternaVisibilidadSubMenus: function(){
		var itemMenuPpal = $$(this.options.selectorMenuPpal);
		if(!itemMenuPpal) return;
		
		itemMenuPpal.each(function(el){
			// oculto todos los submenus excepto el que tiene padre LI con clase "activo"
			var todosLosSubmenus = el.getParent('ul').getElements('ul');
			todosLosSubmenus.each(function(ulItem){
				if(!ulItem.getParent('li').hasClass(this.options.claseItemDesplegado)){
					ulItem.addClass(this.options.claseSubMenuPlegado);
				}
			}.bind(this))
			
			
			el.addEvent('click', function(evento){
				if(el.getParent('li').getElement('ul')){ // si tiene submenus... (si no tiene submenus es el ultimo item y no detengo el evento)
					// pliego todos los demas
					var restoDeSubmenus = el.getParent('ul').getElements('ul');
					restoDeSubmenus.each(function(el){
						// si no esta plegado (es visible) lo oculto y quito la clase 'activo' al LI padre
						if(!el.hasClass(this.options.claseSubMenuPlegado)){							
							el.addClass(this.options.claseSubMenuPlegado);
							el.getParent('li').removeClass(this.options.claseItemDesplegado);
						}
					}.bind(this))

					el.getParent('li').getElement('ul').toggleClass(this.options.claseSubMenuPlegado);
					el.getParent('li').toggleClass(this.options.claseItemDesplegado);
					evento.stop();
				}
			}.bind(this))
		}.bind(this))
	},
	
	efectoSlide: function(el){
		var miSlide = new Fx.Slide(el);
		return miSlide;
	},
	
	estaPlegado: function(el, elementoHijo){
		return (el.getElement(elementoHijo).hasClass(this.options.claseSubMenuPlegado))
	}
})

var ControlTamanoFuente = new Class({
	Implements: [Options],
	options: {
		nombreCookie: 'fsJazztel',
		claseTagCambioLetra: '.cambioLetra',
		idAumentar: 'mas',
		idDisminuir: 'menos',
		textoComplementoIconos: 'Tama\u00f1o de letra',
		claseTextoComplementoIconos: 'texto',
		imgControlAumentar: {
			textoAlternativo: 'Aumentar tamaño de fuente',
			ruta: 'img/ico_aumentarLetra.gif',
			clase: 'aumentaLetra'
		},
		imgControlDisminuir: {
			textoAlternativo: 'Disminuir tamaño de fuente',
			ruta: 'img/ico_disminuirLetra.gif',
			clase: 	'disminuyeLetra'
		}		
	},
	
	initialize: function(options){
		this.setOptions(options);
		this.reemplazaTextoPorControles(); // reemplaza el texto con las intrucciones para cambiar tamano de fuente por iconos de aumentar / disminuir
		this.aplicaTamanoFuente(); // cargo las preferencias del usuario al cargar la pagina
	},

	
	reemplazaTextoPorControles: function(){
		var contenedorControles = $$(this.options.claseTagCambioLetra)[0];
		if(!contenedorControles) return;
		
		// imagenen aumentar
		var imgControlAumentar = new Element('img',{
			'alt': this.options.imgControlAumentar.textoAlternativo,
			'src': this.options.imgControlAumentar.ruta,
			'class': this.options.imgControlAumentar.clase
		})
		// imagen disminuir
		var imgControlDisminuir = new Element('img',{
			'alt': this.options.imgControlDisminuir.textoAlternativo,
			'src': this.options.imgControlDisminuir.ruta,
			'class': this.options.imgControlDisminuir.clase
		})
		
		// links
		var linkControlAumentar = new Element('a',{'id': this.options.idAumentar, 'href': '#', 'title': this.options.imgControlAumentar.textoAlternativo}).grab(imgControlAumentar);
		var linkControlDisminuir = new Element('a', {'id': this.options.idDisminuir, 'href': '#', 'title': this.options.imgControlDisminuir.textoAlternativo}).grab(imgControlDisminuir);
		
		// span contenedores links
		var spanControlAumentar = new Element('span').grab(linkControlAumentar);
		var spanControlDisminuir = new Element('span').grab(linkControlDisminuir);
		
		// items de lista
		var itemControlAumentar = new Element('li').grab(spanControlAumentar);
		var itemControlDisminuir = new Element('li').grab(spanControlDisminuir);
		
		// span texto
		var spanTexto = new Element('span',{
			'text': this.options.textoComplementoIconos,
			'class': this.options.claseTextoComplementoIconos
		})
		
		// lista
		// adopt() permite meter varios elementos en otro
		var listaItemsControles = new Element('ul').adopt(itemControlAumentar, itemControlDisminuir, spanTexto);
		
		// reemplazo <span> por controles
		contenedorControles.getElement('span').dispose();
		contenedorControles.grab(listaItemsControles);
		
		// y una vez que tengo mis elementos creados llamo a la funcion que se encarga de aumentar / disminuir fuente
		this.cambiaTamanoFuente();
	},
	
	cambiaTamanoFuente: function(){
		var controlAumentar = $(this.options.idAumentar);
		var controlDisminuir = $(this.options.idDisminuir);
		// el tamano de fuente inicial sera el establecido en la cookie (preferencias del usuario) 
		// o si no hay cookie, 10px para evitar incompatibilidad entre navegadores (Opera devuelve 6%, FF devuelve 10px, IE 101%, etc.)
		var fontsize = this.recuperaFuenteUsuario() || 10; 
		var body = $$('body')[0];
		
		controlAumentar.addEvent('click', function(evento){
			evento.stop();			
			fontsize++;
			body.setStyle('font-size', fontsize + 'px');
			this.creaCookie(fontsize);
		}.bind(this))
		
		controlDisminuir.addEvent('click', function(evento){
			evento.stop();
			fontsize--;
			body.setStyle('font-size', fontsize + 'px');
			this.creaCookie(fontsize);
		}.bind(this))				
	},
	
	aplicaTamanoFuente: function(tamanoFuente){
		if(!this.recuperaFuenteUsuario()) return; // si no hay preferencias todavia, no se hace nada
		// en otro caso, el tamano de fuente sera el de la cookie o si no hay cookie, 
		// el que se ha pasado como parametro en la funcion de aumentar o disminuir fuente
		else{
			tamanoFuente = this.recuperaFuenteUsuario() || tamanoFuente; 
			$$('body')[0].setStyle('font-size', tamanoFuente + 'px');
		}
		
	},
	
	recuperaFuenteUsuario: function(){
		var fontsize = Cookie.read(this.options.nombreCookie) || false;
		return fontsize;
	},
	
	creaCookie: function(tamanoFuente){
		Cookie.write(this.options.nombreCookie, tamanoFuente, {duration: 7}); // dura una semana
	}
})

var ControlContraste = new Class({
	Implements: [Options],
	options: {
		claseAlternarCSS: '.contraste', // podria aparecer en mas sitios de la web, no necesariamente en una lista o menu de utilidades
		claseLinkHighContrast: 'hc',
		claseLinkNormalContrast: 'nc',
		titleLinkHighContrast: 'Cambiar a alto contraste',
		titleLinkNormalContrast: 'Volver a contraste por defecto',
		selectorLinkHighContrast: 'a.hc',
		selectorLinkNormalContrast: 'a.nc',
		titleCssHighContrast: 'Alto contraste',
		titleCssNormalContrast: 'Contraste normal',
		nombreCookieContraste: 'styleJazztel',
		claseOcultar: 'oculto'
	},
	
	initialize: function(options){
		this.setOptions(options);
		this.generaLinksSeleccionContraste();
		this.muestraLinkSegunPreferencias(); // leo el valor de la cookie y muestro el link que corresponda al cargar la pagina
		this.cambiaCSS();
	},
	
	generaLinksSeleccionContraste: function(){
		var linkAlternarCSS = $$(this.options.claseAlternarCSS);
		
		// link alto contraste
		var linkHighContrast = new Element('a', {
			'href': 	'#',
			'class': 	this.options.claseLinkHighContrast,
			'text': 	this.options.titleCssHighContrast,
			'title': 	this.options.titleLinkHighContrast
		})
		
		// link contraste normal
		var linkNormalContrast = new Element('a', {
			'href': 	'#',
			'class': 	this.options.claseLinkNormalContrast,
			'text': 	this.options.titleCssNormalContrast,
			'title': 	this.options.titleLinkNormalContrast
		})
		
		// elementos de lista LI
		var itemLinkHighContrast = new Element('li').grab(linkHighContrast);
		var itemLinkNormalContrast = new Element('li').grab(linkNormalContrast);
		
		// lista contenedora UL
		var listaItems = new Element('ul').adopt(itemLinkHighContrast, itemLinkNormalContrast);
		
		// inserto los nuevos elementos
		linkAlternarCSS.each(function(el){
			el.getElement('a').dispose();
			el.grab(listaItems)
		})
	},
	
	cambiaCSS: function(){
		$$(this.options.selectorLinkHighContrast).addEvent('click', function(evento){
			setActiveStyleSheet(this.options.titleCssHighContrast);
			$$(this.options.selectorLinkNormalContrast).toggleClass('oculto');
			$$(this.options.selectorLinkHighContrast).toggleClass('oculto')
			evento.stop();
		}.bind(this))
		
		$$(this.options.selectorLinkNormalContrast).addEvent('click', function(evento){	
			setActiveStyleSheet(this.options.titleCssNormalContrast);
			$$(this.options.selectorLinkHighContrast).toggleClass('oculto');
			$$(this.options.selectorLinkNormalContrast).toggleClass('oculto');
			evento.stop();
		}.bind(this))
	},
	
	// muestra el link que corresponda segun las preferencias al cargar la pagina
	muestraLinkSegunPreferencias: function(){
		var preferenciaUsuario = this.recuperaPreferenciasCSS();

		var linkAltoContraste = $$(this.options.selectorLinkHighContrast);
		var linkContrasteNormal = $$(this.options.selectorLinkNormalContrast);
		

		switch (preferenciaUsuario){
			// no hay cookie
			case 'null':			
				linkContrasteNormal.each(function(el){
					el.addClass(this.options.claseOcultar);
				}.bind(this))
			break;	
			
			// alto contraste seleccionado
			case this.options.titleCssHighContrast:
				linkAltoContraste.each(function(el){
					el.addClass(this.options.claseOcultar);
				}.bind(this))
				linkContrasteNormal.each(function(el){
					if(el.hasClass(this.options.claseOcultar)) el.removeClass(this.options.claseOcultar)
				}.bind(this))
			break;
			
			// contraste normal seleccionado o estado por defecto
			default:
				linkContrasteNormal.each(function(el){
					el.addClass(this.options.claseOcultar)
				}.bind(this))
			break;
		}
	},
	
	
	recuperaPreferenciasCSS: function(){
		var estiloPreferido = Cookie.read(this.options.nombreCookieContraste) || false;
		return estiloPreferido;
	}
})


// evito errores en Explorer si se queda algun console.log en el codigo
if (!window.console || !console.firebug){var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml","group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];window.console = {};for (var i = 0; i < names.length; ++i)window.console[names[i]] = function() {}}