//<![CDATA[
/*******************************************
 * GUSANITO.COM
 *
 * Dependiente de MOOTools v1.0
 ******************************************/
   


var Gusanito = {
    version: '4', swf: {}, ads: {},
	// Webservice para operaciones AJAX
    webservice: 'http://'+document.domain+'/ajax_herramientas.php',
    alertarMensaje: function(msj) {
        alert(msj);
    },
    escapar: function(txt){
        return (typeof encodeURIComponent == 'function') ? encodeURIComponent(txt) : escape(txt);
    }
};

/*******************************************
 *  NAMESPACES
 */
Gusanito.Juegos = {};
Gusanito.Recordatorios = {};
Gusanito.Recomiendanos = {};
Gusanito.EnviarPostal = {};
Gusanito.TarjetaRecibir = {};
Gusanito.Personajes = {};
Gusanito.Tarjetas = {};

/*******************************************
 *  FORMAS
 */
/*
 * Determina si dos campos son iguales.
 */
Gusanito.sonIguales = new Class({
    initialize: function(campo_uno, campo_dos, opciones){
        this.campo1 = $(campo_uno);
        this.campo2 = $(campo_dos);
        if (!this.campo1 || !this.campo2){ return;}
        this.opciones = opciones;
        this.campo2.addEvent('blur', this.checar.bind(this));
        this.div_mensaje_viejo = $(this.opciones.div_mensaje);
        this.div_mensaje_nuevo = $(this.opciones.div_mensaje_nuevo);
        this.msj_viejo = this.div_mensaje_viejo.innerHTML;
    },
	// Si los campos NO son iguales Muestra un mensaje en la capa correspondiente.
    checar: function(){
        if(!this.son_iguales()){
            this.div_mensaje_viejo.removeClass('oculto');
            this.div_mensaje_viejo.setStyle('display', 'block');
            this.div_mensaje_viejo.setHTML(this.div_mensaje_nuevo.innerHTML);
        } else {
            this.div_mensaje_viejo.addClass('oculto');
            this.div_mensaje_viejo.setStyle('display', '');
            this.div_mensaje_viejo.setHTML(this.msj_viejo);
        }
    },
	// Determina si el valor de los campos es igual.
    son_iguales: function(){
        return (this.campo1.getValue()==this.campo2.getValue());
    }
});

/*
 * Implementa la funcionalidad de una lista dependiente,
 * por ejemplo, la de estados, cuyos valores deben cargarse
 * de acuerdo al paï¿½s seleccionado.
 */
Gusanito.listaDependiente = new Class({
    initialize: function(lista_dependiente, lista_padre, opciones){
        this.ld = lista_dependiente;
        this.lista_dependiente = $(lista_dependiente);
        this.lista_padre = $(lista_padre);
        if (!this.lista_dependiente || !this.lista_padre){ return; }
        this.opciones = opciones;
        this.registrar_evento();
    },
	// Agrega el evento onchange a la lista padre.
    registrar_evento: function(){
        this.lista_padre.addEvent('change', this.consultar.bind(this));
    },
	// Actualiza los valores de la lista hija de acuerdo a la respuesta
	// del servidor en formato JSON.
    actualizar_lista: function(resp){
        this.lista_dependiente.innerHTML = '';
		try {
		  this.matriz = Json.evaluate(resp);
		}catch(e){}
        if(!this.matriz || typeof this.matriz == 'undefined'){
            this.lista_dependiente.adopt(new Element('option').setProperty('value', 0).setHTML(this.opciones.error_no_datos));
            return;
        }
        for(var i=0; i<this.matriz.length; i++){
            this.lista_dependiente.adopt(new Element('option').setProperty('value', this.matriz[i][0]).setHTML(this.matriz[i][1]));
        }
    },
	// Obtiene los datos de la lista dependiente, consultando al servidor.
    consultar: function(){
        var req = new Ajax(Gusanito.webservice, {
            method: 'post',
            postBody: this.opciones.params + this.lista_padre.value,
            onComplete: this.actualizar_lista.bind(this)
        }).request();
    }
});

/*
 * Desactiva un botï¿½n de una forma una vez que se le ha dado clic, para evitar envï¿½os duplicados
 */
Gusanito.desactivarBoton = new Class({
    initialize: function(boton){
        this.boton = $(boton);
        if(!this.boton){ return;}
        this.boton.addEvent('click', function(){
            //setTimeout("this.boton.disabled = true", 200);//fix IE
            (function(){
                this.boton.disabled = true;
            }.bind(this)).delay(200);
        }.bind(this));
    }
});

/*
 * Verifica la disponibilidad de un nombre de usuario.
 */
Gusanito.verificarDisponibilidadUsuario = new Class({
    initialize: function(input_nombre, boton, options){
        this.nombre = $(input_nombre);
        this.boton = $(boton);
        if (!this.nombre || !this.boton){ return;}
        this.options = options;
        this.nombre.addEvent('keyup', function(){
            this.disponible.style.display = 'none';
            this.boton.style.display = 'block';
        }.bind(this));
        this.boton.addEvent('click', this.consultar.bind(this));
        this.cargando = new Element('span').addClass(this.options.class_verificando);
        this.disponible = new Element('span');
        this.cargando.setHTML(this.options.texto_verificando);
    },
	// Realiza la consulta con el servidor.
    consultar: function(){
        if(this.nombre.value.replace(/\s+/g, '')==''){ return;}
        var _req = new Ajax(Gusanito.webservice, {
            method: 'post',
            postBody: this.options.params + this.nombre.value,
            onStart: this.on_loading(),
            onComplete: function(resp){
                this.disponible.style.display = 'block';
                this.resultado = Json.evaluate(resp);
                this.mostrar_resultado();
                return false;
            }.bind(this)
        }).request();
        return false;
    },
	// Muestra el resultado de la consulta.
    mostrar_resultado: function(){
        if(this.resultado.existe==0){
            this.disponible.addClass(this.options.class_disponible).removeClass(this.options.class_nodisponible);
        }else{
            this.disponible.addClass(this.options.class_nodisponible).removeClass(this.options.class_disponible);
        }
        this.disponible.setHTML(this.resultado.mensaje);
        this.disponible.injectBefore(this.boton);
        this.cargando.style.display = 'none';
    },
	// Funciï¿½n que se ejecuta mientras se ejecuta la consulta al servidor.
    on_loading: function(){
        this.boton.style.display = 'none';
        this.cargando.style.display = 'block';
        this.cargando.injectBefore(this.boton);
    }
});

/*
 * Verifica la disponibilidad de un email.
 */
Gusanito.verificarDisponibilidadEmail = function(input_nombre, boton, options){
    new Gusanito.verificarDisponibilidadUsuario(input_nombre, boton, options);
};
/*
 * Anima una Forma, es decir, hace que el fondo de los elementos de la forma se resalte al hacer clic sobre ellos.
 */
Gusanito.animarForma = new Class({
    initialize: function(forma_id, clase_activa){
        this.forma = $(forma_id); if(!this.forma){ return;}
        this.clase_activa = clase_activa;
        //this.inputs = $ES('input, select, textarea, button', this.forma);
        this.inputs = $ES('input, select, textarea', this.forma);
        this.campos = [];
        this.tips = [];
        var j = 0;
        for(var i=0; i< this.inputs.length; i++){
            if(!(/submit|image|hidden/).test(this.inputs[i].getProperty('type')) || (/select|textarea|button/).test(this.inputs[i].getTag()) ){
                this.campos[j] = this.inputs[i];
                this.campos[j].addEvent('focus', this.activar_campo.bind(this, j));
                this.campos[j].addEvent('blur', this.desactivar_todo.bind(this, j));
                this.tips[j] = this.campos[j].getParent().getElementsBySelector('.tip')[0];
                j++;
            }
        }
    },
	// Resalta un campo.
    activar_campo: function(i){
        this.activar_tip(i);
        this.campos[i].getParent().addClass(this.clase_activa);
    },
	// Activa un tip.
    activar_tip: function(i){
        if(this.tips[i]) {
            this.tips[i].removeClass('oculto');
        }
    },
	// Desactiva el resaltado de todos los campos.
    desactivar_todo: function(){
        for(var i=0; i< this.campos.length; i++){
            this.campos[i].getParent().removeClass(this.clase_activa);
            if(this.tips[i]) {
                this.tips[i].addClass('oculto');
            }
        }
    }
});

/*
 * Implementa la funcionalidad del captcha.
 */
Gusanito.captcha = new Class({
    initialize: function(contenedor_id, elemento_captcha, clase_activa){
        this.contenedor = $(contenedor_id);
        if(!this.contenedor){ return;}
        this.elementos = $$('#' + contenedor_id + ' ' + elemento_captcha);
        this.radios = this.contenedor.getElements('input');
        this.clase_activa = clase_activa;
        this.observar();
    },
	// Agrega los eventos a las imï¿½genes del captcha.
    observar: function(){
        for(var i=0; i<this.elementos.length;i++){
            this.elementos[i].addEvent('click', this.activar.bindWithEvent(this, i));
        }
    },
	// Quita la selecciï¿½n de cada elemento.
    desactivar_todos: function(){
        this.radios.each(function(input){
            input.checked = false;
        });
        this.elementos.each(function(elem){
            elem.removeClass(this.clase_activa);
        }, this);
    },
	// Selecciona un elemento.
    activar: function(evt, n){
        this.desactivar_todos();
        this.elementos[n].addClass(this.clase_activa);
        this.radios[n].checked = true;
        evt.stop();
        evt.preventDefault();
    }
});

/*******************************************
 *  BUSCADOR y AUTOCOMPLETADOR
 */
/*
 * Implementa la funcionalidad de autocompletado de palabras en el buscador.
 */
Gusanito.autocompletar = new Class({
    initialize: function(input, options){
        this.input = $(input);
        if(!this.input){ return;}
        //this.input.select(); // solo en desarrollo
        this.puntero = 0;
        this.options = options;
        this.options.delay = this.options.delay | 0;
        this.crear_contenedor();
        this.posicionar_contenedor();
        this.observar();
    },
	// Crea la capa que contiene las sugerencias.
    crear_contenedor: function(){
        this.div = new Element('div');
        this.div.setProperty('id', this.options.div_id);
        this.div.setStyles({
            position: 'absolute',
            display: 'none'

        });
        this.ul = new Element('ul');
        this.div.adopt(this.ul);
        this.div.injectBefore($E('body').getFirst());
    },
	// Posiciona al contenedor de sugerencias.
    posicionar_contenedor: function(){
        this.coordenadas = this.input.getCoordinates();
        this.div.setStyles({
            top: (this.coordenadas.top + this.coordenadas.height) + 'px',
            left: this.coordenadas.left + 'px'
        });
    },
	// Agrega los eventos necesarios.
    observar: function(){
        // keydown para IE
        this.input.addEvent(window.ie ? 'keydown' : 'keypress', this.determinar_accion.bindWithEvent(this) );
        this.input.addEvent('blur', this.ocultar.bind(this));
    },
	// Muestra las sugerencias en base al contenido del input.
    mostrar_sugerencias: function(){
        this.ul.setHTML('');
        for(var i = 0; i < this.respuesta.length; i++){
            var input = this.input.value;
            var txt = this.respuesta[i].replace((new RegExp(input, 'gi')),'<span>'+input+'</span>');
            var li = new Element('li');
            this.a = [];
            this.a[i] = new Element('a');
            this.a[i].setProperty('id', 'ac_'+(i+1 ));
            this.a[i].setHTML(txt);
            this.a[i].addEvent('click', this.actualizar.bind(this, i+1 ));
            this.a[i].addEvent('mouseover', this.seleccionar_activo.bind(this, i +1 ));
            this.a[i].addEvent('mouseout', this.seleccionar_activo.bind(this, 0));
            li.adopt(this.a[i]);
            this.ul.adopt(li);
        }
        if(this.respuesta.length > 6) {
            this.div.setStyles({
                'overflow-y': 'scroll',
                'overflow-x': 'hidden',
                'height': '120px'
            });
        }else{
            this.div.setStyles({
                'overflow-y': 'hidden',
                'overflow-x': 'hidden',
                'height': 'auto'
            });
        }
        this.posicionar_contenedor();
        this.mostrar();
    },
	// Actualiza el contenido del input con la sugerencia seleccionada.
    actualizar: function(i){
        if(this.puntero == 0){ return;}
        this.input.value = $('ac_'+i).innerHTML.replace(/<([^>]+)>/g,'');
        this.ocultar();
        this.input.focus();
        this.evt.returnValue = false;
        this.evt.preventDefault();
        this.evt.stop();
        return false;
    },
	// Muestra el contenedor de sugerencias.
    mostrar: function(){
        this.div.setStyle('display', 'block');
    },
	// Oculta el contenedor de sugerencias.
    ocultar: function(evt){
        (function(){
            this.div.setStyle('display', 'none');
            this.puntero = 0;
            this.ul.setHTML('');
        }).delay(100, this);
    },
	// Consulta las sugerencias en base al modo (JSON/HTML).
    consultar: function(){
        if(this.options.modo=='ws_json') {
            var uri = this.options.webservice;
            var req = new Ajax(uri, {
                method: 'post',
                postBody: this.options.params + this.input.value,
                onComplete: function(resp){
                    this.respuesta = new Json.evaluate(resp);
                    this.onComplete();
                }.bind(this)
            }).request();
        } else if(this.options.modo=='html' && this.options.arreglo_base && this.input.value.trim().length >2) {
            this.respuesta = this.buscarPtrnEnArray(this.options.arreglo_base);
            this.onComplete();
        } else {
            this.ocultar();
        }
    },
	// Busca un patrï¿½n en un arreglo y devuelve las coincidencias.
    buscarPtrnEnArray: function(array){
        var matches = [];
        for(var i=0;i<array.length;i++){
            if((new RegExp(''+this.input.value.toLowerCase())).test(array[i].toLowerCase())){
                matches.push(array[i]);
            }
        }
        return matches;
    },
	// Callback del evento onkeydown/onkeypress.
    onComplete: function(){
        if(this.respuesta.length!==0){
            this.mostrar_sugerencias();
        }else{
            this.ocultar();
        }
    },
	// Determina la acciï¿½n a realizar de acuerdo a si el usuario tecleï¿½ enter, arriba, abajo, cualquier tecla, etc.
    determinar_accion: function(evt){
        this.evt = evt;
        this.tecla_permitida =( (/\w+/).test(this.evt.key) && !(/up|down|left|right|enter|esc/).test(this.evt.key) );
        if(this.tecla_permitida){
            this.consultar.delay(800, this);//FFix
        }else if((this.evt.key=='up' || this.evt.key=='down') && typeof(this.a)!='undefined'){
            this.avanzar();
        }else if(this.evt.key=='enter'){
            this.actualizar(this.puntero);
        }else{
            this.ocultar();
        }
    },
	// Selecciona o activa un elemento de la lista de sugerencias.
    seleccionar_activo: function(j){
        this.puntero = j>-1 ? j : this.puntero;
        for(var i = 1; i <= this.a.length; i++){
            $('ac_'+i).className = (i == this.puntero && typeof(i) !== 'undefined') ? this.options.clase_activa : '';
        }
    },
	// Avanza el puntero interno del listado de sugerencias de acuerdo a si el usuario tecleï¿½ arriba, abajo, etc.
    avanzar: function(){
        if(this.a.length==0)
            return;
        if(this.evt.key=='down'){
            if(this.puntero == this.a.length || this.puntero == 0){ // ultima posiciin o ningun elem. activo: ir a la primera
                this.puntero = 1;
            }else{ // avanzar
                this.puntero++;
            }
        }else if(this.evt.key=='up'){
            if(this.puntero == 0 || this.puntero ==1){ // primera posiciin o ningun elem. activo: ir al ultimo
                this.puntero = this.a.length;
            }else{ // retroceder
                this.puntero--;
            }
        }else if(this.evt.key == 'enter'){
            this.actualizar();
            return;
        }
        this.seleccionar_activo(this.puntero);
    }
});

/*
 * Implementa la funcionalidad del buscador.
 */
Gusanito.Buscador = new Class({
    initialize: function(opciones){
        this.opciones = opciones;
        this.disparador = $(this.opciones.disparador);
        this.input = $(this.opciones.input);
        this.forma = $(this.opciones.forma);
        this.buscar_en = $(this.opciones.buscar_en);
        if(!this.input || !this.disparador || !this.forma) return;
        this.observar();
    },
	// Agrega los eventos necesarios.
    observar: function(){
		if(typeof this.input.setProperty == 'function') {
			this.input.setProperty('autocomplete', 'off');
		} 

        this.disparador.addEvent('click', this.redireccionar.bindWithEvent(this));
        this.forma.addEvent('submit', this.redireccionar.bindWithEvent(this));
    },
	// Redirecciona al usuario al URL correspondiente de acuerdo a su bï¿½squeda.
    redireccionar: function(evt){
        //Comentada la sig. lï¿½nea para permitir bï¿½squedas masivas por tipo. 23/11/07
        //if(!this.input.value || this.input.value.trim()=='') return;
        evt = new Event(evt);
        var buscar_en = this.buscar_en.value;
        var palabras_busqueda = this.sanitizar(this.input.value, '+');
        var qs = 'http://'+document.domain+buscar_en+'/'+palabras_busqueda
        //console.log(palabras_busqueda)
        self.location.href = qs;
        evt.stop();
        evt.preventDefault();
    },
	// Sanitiza o limpia el input del usuario.
    sanitizar: function(texto, reemplazo) {
        texto = texto.trim();
        texto = encodeURIComponent(texto);
        texto = texto.replace(/\s+/g, reemplazo);
        texto = texto.replace(/(\?|\/|_|\\|-|\||;|:|,)+/g, '');
        texto = texto.replace(/\++|%20/g, reemplazo);
        return texto;
    }
});

/*
 * Maneja el menï¿½ de 'Buscar en...' del buscador.
 */
Gusanito.menuBuscarEn = new Class({
    initialize: function(buscar_en, input, clase_oculta){
        this.input = $(input);
        if(!this.input) return;
        this.clase_oculta = clase_oculta
        this.div = $(buscar_en).getChildren()[0];
        this.ul = $(buscar_en).getChildren()[1];
        this.opciones = this.ul.getChildren();


	this.div.setStyle('z-index',999999999);
	this.ul.setStyle('z-index',999999999);

        for(var i =0; i < this.opciones.length; i++){
            this.opciones[i].firstChild.onclick = this.completar.bind({parent:this, n:i});
        }
        this.div.addEvent('click',this.mostrar_opciones.bind(this));
        this.ul.addEvent('mouseover',this.mostrar_opciones.bind(this));
        this.div.addEvent('mouseout',this.ocultar_opciones.bind(this));
        this.ul.addEvent('mouseout',this.ocultar_opciones.bind(this));
    },
	// Muestra el menï¿½ de opciones de bï¿½squeda.
    mostrar_opciones: function(){
        if(this.t_o)
            clearTimeout(this.t_o);
        if(!this.ul.hasClass(this.clase_oculta))
            return;
        this.ul.removeClass(this.clase_oculta);
        this.div.onmouseover = this.mostrar_opciones.bind(this);
    },
	// Oculta el menï¿½ de opciones de bï¿½squeda
    ocultar_opciones: function(){
        this.div.onmouseover = function(){};
        if(this.ul.hasClass(this.clase_oculta))
            return;
        this.t_o = setTimeout(function(){
            this.ul.addClass(this.clase_oculta);
        }.bind(this), 500);
    },
	// Actualiza el campo que indica en dï¿½nde se va a buscar.
    completar: function(){
        var txt = this.parent.opciones[this.n].firstChild.innerHTML;
        txt = txt.length > 11 ? txt.substring(0, 9) + '...' : txt;
        this.parent.div.innerHTML = txt;
        this.parent.input.value = this.parent.opciones[this.n].firstChild.href.replace('http://'+document.domain, '');
        this.parent.ocultar_opciones();
        return false;
    }
});
/*******************************************
 *  ESTRUCTURA GRï¿½FICA
 */
/*
 * Mejora la navegaciï¿½n en resoluciones de 800x600.
 */
Gusanito.layout800x600 = new Class({
    initialize: function(){
        if(screen.width <= 800){
            scrollTo(177, 0);
        }
    }
});

/*
 * Crea un toggler animado, es decir, hace que un elemento, al activarse un trigger, se oculte o aparezca con efecto.
 */
Gusanito.toggler = new Class({
    initialize: function(elemento, trigger, opciones){
        this.elemento = $(elemento);
        if(!this.elemento){
             return;
        }
        this.trigger = $(trigger);
        this.opciones = opciones;
        this.h = this.elemento.getSize();
        if(this.opciones.automatico){
        	if(this.trigger)
			this.trigger.addEvent('click', this.toggle.bindWithEvent(this));
        }
    },
    // Hace el cambio entre oculto/visible.
    toggle: function(evt){
        this.opciones.altura = (typeof(this.opciones.altura)=='object') ? $(this.opciones.altura.id).value : this.opciones.altura;
        if(this.elemento.getCoordinates().height < this.opciones.altura){
            this.show();
        }else{
            this.hide();
        }
        if(evt && this.opciones.sin_evento){
            evt.stop();
            evt.preventDefault();
        }//this.opciones.altura = this.elemento.offsetHeight
    },
    // Muestra el elemento.
    show: function(){
        this.elemento.setStyles({
            display: 'block',
            visibility: 'visible',
            height: '0px'
        });
        new Fx.Style(this.elemento, 'height', {duration:this.opciones.duracion_altura}).start(0, this.opciones.altura);
        new Fx.Style(this.elemento, 'opacity', {duration:this.opciones.duracion_opacidad}).start(0,1);
        if(this.opciones.ocultar_otro){
            $(this.opciones.ocultar_otro).style.display = 'none';
        }
        if(this.opciones.onComplete){
            this.opciones.onComplete();
        }
    },
    // Oculta el elemento.
    hide: function(){
        new Fx.Style(this.elemento, 'height', {duration:this.opciones.duracion_altura}).start(this.opciones.altura, 0);
        new Fx.Style(this.elemento, 'opacity', {duration:this.opciones.duracion_opacidad}).start(1, 0);
        if(this.opciones.onComplete){
            this.opciones.onComplete();
        }
    }
});

/*
 * Crea una capa sobrepuesta
 */
Gusanito.crearCapaSobrepuesta =  new Class({
    initialize: function(pegar_a, opciones){
        this.pegar_a = $(pegar_a);
        this.coords = this.pegar_a.getCoordinates();
        this.opciones = opciones;
        this.ifr = new Element('div').setStyles({
            position: 'absolute',
            display: this.opciones.display || 'none',
            top: (this.coords.top + this.coords.height + (this.opciones.top|0)) + 'px',
            left: this.coords.left + (this.opciones.left|0) + 'px',
            'z-index': 1000,
            width: this.opciones.ancho + 'px',
            height: this.opciones.alto + 'px'
        }).setProperties({
            id: this.opciones.id
        });
        if(this.opciones.contenido){
            this.ifr.innerHTML = this.opciones.contenido;
        }
        this.ifr.injectBefore($(this.opciones.inject_before));
        if(this.opciones.disparador){
            this.toggler = new Gusanito.toggler(this.ifr, this.opciones.disparador, {
                duracion_altura: this.opciones.duracion_altura,
                duracion_opacidad: this.opciones.duracion_opacidad,
                altura: this.opciones.alto_max,
                evento: this.opciones.evento
            });
            if(this.opciones.onComplete){
                this.opciones.onComplete();
            }
        }
    }
});

/*
 * Implementa la funcionalidad del cambio de idioma del sitio a travï¿½s del select de idiomas.
 */
Gusanito.idioma = new Class({
    initialize: function(select_id){
        this.selector = $(select_id);
        if(!this.selector) return;
		try{
			this.selector.addEvent('change', this.cambiar.bind(this));
		}catch(e){
		
		}
        
    },
	// Cambia la navegaciï¿½n al idioma seleccionado.
    cambiar: function(){
        this.idioma = this.selector.value;
        var uri = self.location.href;
        var nuevo_uri = 'http://'+document.domain+'/'+this.idioma
        var requested_uri = uri.substring(nuevo_uri.length, uri.length);
        nuevo_uri = uri.substring(nuevo_uri.length, uri.length);
        Cookie.remove('gusanitoLang');
        Cookie.set('gusanitoLang', this.idioma, {duration: 9999, path:'/'});
        new Ajax(Gusanito.webservice, {
            method: 'post',
            postBody: 'accion=registrar_preferencia_idioma&id='+this.idioma,
            update: $('cnt_juegos_paginado'),
            onComplete:function(resp){
                self.location.href = 'http://'+document.domain+'/'+this.idioma;
            }.bind(this)
        }).request();
    }
});


/*
 * Implementa la funcionalidad de las Tabs de Herramientas de objetos.
 */
Gusanito.tabsHerramientas = new Class({
    initialize: function(contenedor, clase, opciones){
        this.contenedor = $(contenedor);
        this.clase = clase;
        this.opciones = opciones;
        this.clase_contenido = this.opciones.clase_contenido;
        this.clase_tabs = this.opciones.clase_tabs;
        this.lis = $ES('ul li.'+this.clase_tabs, this.contenedor);
        if(this.opciones.tab_default)
        	this.lis[this.opciones.tab_default].addClass(this.clase);
        this.tab = new Array();
	//this.timeout  = 5000;

		if(this.lis){
			for(var i=0; i<this.lis.length; i++){
	            this.tab[i] = $E('h2 a', this.lis[i]);
	            this.tab[i].addEvent('click', this.activar_tab.bindWithEvent(this, i));
		    	//hace q las tabs respondan al evento de mouseover
		    	//this.tab[i].addEvent('mouseover', this.activar_tab.bindWithEvent(this, i));
	        }	
		}
        
		if(this.opciones.tab_default)
        	this.activar([this.opciones.tab_default]);

    },




	// Hace que un tab sea visible.
    activar: function(i){
        this.lis[i].addClass(this.clase);
        var tab_contenedor = $E('.'+this.clase_contenido, this.lis[i]);
        var altura = tab_contenedor.getSize().size.y;
        this.contenedor.setStyles({
            height: (altura+30) +'px'
        });
    },
	// Activa un tab, desactiva los demï¿½s.
    activar_tab: function(e, activo){
        var e = new Event(e);
        this.lis.each(function(li, i){
            if(i==activo){
                this.activar(i);
                //console.log(contenedor.getSize().size.y + ' - ' + this.contenedor.getSize().size.y);
            }else{
                li.removeClass(this.clase);
            }
        }, this);
        e.stop();
        e.preventDefault();
    }
});

/*
 * Implementa la funcionalidad de cajas con tabs.
 */
Gusanito.tabs = new Class({
    initialize: function(contenedor, clase, tab_default, puntero){

		this.contenedor = $(contenedor);
		if(this.contenedor===false){
		    return false;
		}

        this.clase = clase;

	//this.contenedor.setStyle('clear','both');

        this.lis 	= $ES('ul li', contenedor);
	this.lis_dl 	= $ES('ul li', contenedor);

        this.lis[tab_default].addClass(this.clase);
	this.lis[tab_default].setStyle('clear','both');


	this.total = this.lis.length;

	//console.log(this.total);

        this.puntero = puntero ? puntero : false;
        this.tab = [];

        this.lis.each(function(li, i){
            var a = $E('h2 a', li);
            a.addEvent('click', this.activar.bindWithEvent(this, i));
	    //hace q las tabs respondan al evento de mouseover
	    a.addEvent('mouseover', this.activar_retrasar.bindWithEvent(this, i));
	    a.addEvent('mouseout',  this.activar_sin_retraso.bindWithEvent(this, i));
        }, this);

	this.lis_dl.each(function(li, i){
            var dl = $E('dl', li);
			var a = $E('h2 a', li);
            dl.addEvent('click', this.activar_visitar.bindWithEvent(this, i,a));
	    //hace q las tabs respondan al evento de mouseover
	    if(dl){
	    	dl.addEvent('mouseover', this.activar_retrasar.bindWithEvent(this, i));
	    	dl.addEvent('mouseout',  this.activar_sin_retraso.bindWithEvent(this, i));
	    }
        }, this);

	this.elemento_activo = 0;
    	this.actualizar_tab(this.elemento_activo);

    },

    activar_retrasar: function(evt, activo){
	this.activar(evt,activo);
	this.cambio_automatico_tabs_extended();
    },

	activar_visitar: function(evt, activo,link){
		window.location = a;
	},


    activar_sin_retraso: function(evt, activo){
	this.activar(evt,activo);
	this.cambio_automatico_tabs();
    },

    actualizar_tab: function(i){
	this.activar_alt(i);
	this.cambio_automatico_tabs();
	//console.log( 'actualizar_tab::this.elemento_activo: ' + this.elemento_activo );
    },

    actualizar_tab_extended: function(i){
	this.activar_alt(i);
	this.cambio_automatico_tabs_extended();
	//console.log( 'actualizar_tab_extended::this.elemento_activo: ' + this.elemento_activo );
    },

    cambio_automatico_tabs: function(){
	if(this.t_o){
		clearTimeout(this.t_o);
	}

	this.t_o = setTimeout(function(){
		this.actualizar_tab( this.elemento_activo == this.total -1 ? this.elemento_activo = 0 : this.elemento_activo += 1 );
		//console.log( 'cambio_automatico_tabs::this.elemento_activo: ' + this.elemento_activo );
	}.bind(this), 5000);
    },


    cambio_automatico_tabs_extended: function(){
	if(this.t_o){
		clearTimeout(this.t_o);
	}

	this.t_o = setTimeout(function(){
		this.actualizar_tab( this.elemento_activo == this.total-1 ? this.elemento_activo = 0 : this.elemento_activo += 1 );
		//console.log( 'cambio_automatico_tabs_extended::this.elemento_activo: ' + this.elemento_activo );
	}.bind(this), 999999 );
    },

    activar_alt: function(activo){
        this.lis.each(function(li, i){
	            if(i==activo){
	                li.addClass(this.clase);
	                if(this.puntero){
	                    this.puntero.value = i;
	                }
	            }else{
	                li.removeClass(this.clase);
	            }
	        }, this);
        //var tab_contenedor = $E('.'+this.clase_contenido, this.lis[i]);
        //var altura = tab_contenedor.getSize().size.y;
        //this.contenedor.setStyles({
        //    height: (altura+30) +'px'
        //});
    },
	// Activa un tab y desactiva los demï¿½s.
    activar: function(evt, activo){
        try{
	        this.lis.each(function(li, i){
	            if(i==activo){
	                li.addClass(this.clase);
	                if(this.puntero){
	                    this.puntero.value = i;
	                }
	            }else{
	                li.removeClass(this.clase);
	            }
	        }, this);
            //var evt = new Event(evt);
            if(evt)
		//console.log( 'evt, activo : ' + evt.toString() + " , " + activo );
                evt.stop();
            //evt.stopPropagation();
        }catch(e){}
    }
});
/*
 * Implementa la funcionalidad de mostrar/ocultar nubes de Tags.
 */
Gusanito.tagsToggler = new Class({
    initialize: function(contenedor_tags, disparador, opciones){
        this.contenedor = $(contenedor_tags);
        this.disparador = $(disparador);
        this.opciones = opciones;
        this.clase_oculto = this.opciones.clase_oculto;
        this.imagenes = this.opciones.imagenes;
        this.img_obj = $(this.opciones.img_id);
        if(!this.contenedor || !this.disparador || !this.clase_oculto || !this.imagenes || !this.img_obj || this.imagenes.length != 2)
            return;
        this.disparador.addEvent('click', function(){
            var path    = this.img_obj.src.split('/');
            var old_img = path[path.length - 1];
            var neu_img  = old_img == this.imagenes[0] ? this.imagenes[1] : this.imagenes[0];
                path    = path.remove(old_img);
                path = path.join('/');
            this.contenedor.toggleClass(this.clase_oculto);
            this.img_obj.setProperty('src', path+'/'+neu_img);
        }.bind(this));
    }
});

/*******************************************
 *  HERRAMIENTAS DE OBJETOS
 */
/*
 *  Implementa la funcionalidad de calificaciï¿½n de un objeto.
 */
Gusanito.calificar = new Class({
    initialize: function(opciones){
        this.opciones = opciones;
        this.contenedor = $(this.opciones.id);
        this.estrellas = $ES('.' + this.opciones.calificacion, this.contenedor);
        this.contador = $(this.opciones.contador_votos);
        this.descripcion = $(this.opciones.descr_calif);
        this.exito = $(this.opciones.exito);
        this.objID = $('_herr_objeto_id').value;
        this.votos = $('_herr_objeto_votos').value;
        this.ul = $E('ul', this.contenedor);
		this.tipo  = $('tipo').value;
        this.observar();
    },
	// Agrega los eventos necesarios.
    observar: function(){
        this.estrellas.each(function(estrella, i){
			if (window.ie) estrella.innerHTML += '<span>&nbsp;&nbsp;&nbsp;&nbsp;</span>';
            estrella.addEvent('mouseover', this.actualizarEstado.bindWithEvent(this, i));
            estrella.addEvent('mouseout', function(){
                this.ul.setStyle('backgroundImage', 'url(/img/calificacion_5.gif)');
                this.descripcion.innerHTML = $E('a', this.estrellas[4]).innerHTML;
            }.bind(this));
            estrella.addEvent('click', this.enviarCalificacion.bindWithEvent(this, i));
        }, this);
    },
	// Actualiza la calificaciï¿½n sobre la que estï¿½ el mouse.
    actualizarEstado: function(evt, i){
        var evt = new Event(evt);
        var imagenCalificacion = '/img/calificacion_' + (i + 1) + '.gif';

        this.ul.setStyle('backgroundImage', 'url(' + imagenCalificacion + ')');
        this.descripcion.innerHTML = $E('a', this.estrellas[i]).innerHTML;
        this.estrellas.each(function(estrella, i){
            estrella.onmouseover = null;
        }, this);
        evt.stop();
        evt.stopPropagation();
    },
	// Envï¿½a la calificaciï¿½n al servidor.
    enviarCalificacion: function(evt, c){
        var evt = new Event(evt);
        this.c = c + 1;
        this._img = $('img_calificacion').getProperty('src');
        var req = new Ajax(Gusanito.webservice, {
            method: 'post',
            postBody: 'accion=calificar_objeto&id='+this.objID+'&c='+this.c+'&tipo='+this.tipo,
            onComplete: this.actualizar.bind(this)
        }).request();
        evt.stop();
        evt.preventDefault();
    },
	// Actualiza el html con la calificaciï¿½n dada.
    actualizar: function(resp){
        //if (resp>0){
       	if(this.contador)
        	this.contador.setHTML(this.contador.innerHTML.replace(/(\d+)/, parseInt(this.votos)+ 1));
        //}
        if($('img_calificacion'))
        	$('img_calificacion').setProperty('src', this._img.replace(/\d.gif/g, this.c+'.gif') );
        
        if(this.contenedor)
        	this.contenedor.innerHTML = this.exito.innerHTML;
        	
        var parent = this.parentNode || this.parent; 
        
        if(this.descripcion && parent != null )
        	this.descripcion.remove();
        if(this.exito)
        	this.exito.remove();
    }
});

/*
 * Implementa el 'favoriteo' de objetos.
 */
Gusanito.favoritos = new Class({
    initialize: function(btn, opciones){
        this.btn = $(btn);
        this.opciones = opciones;
        this.contenedor = $(this.opciones.id);
        this.exito = $(this.opciones.exito);
        if(!this.btn || !this.exito || !this.contenedor)
            return;
        this.objID = $('_herr_objeto_id').value;
        this.btn.addEvent('click',this.enviarElemento.bindWithEvent(this));
    },
	// Envï¿½a la peticiï¿½n al servidor.
    enviarElemento: function(evt){
        var evt = new Event(evt);
        var req = new Ajax(Gusanito.webservice, {
            method: 'post',
            postBody: 'accion=favoritear_objeto&id='+this.objID,
            onComplete: this.actualizar.bind(this)
        }).request();
        evt.stop();
        evt.preventDefault();
    },
	// Actualiza el html.
    actualizar: function(resp) { //debug(resp)
        this.contenedor.toggleClass(this.opciones.clase_oculto);
        this.exito.toggleClass(this.opciones.clase_oculto);
    }

});
/*
 * Implementa la funcionalidad de recomendaciï¿½n de objetos.
 */
Gusanito.recomendar = new Class({
    initialize: function(opciones){
        this.opciones = opciones;
        this.contenedor = $(this.opciones.id);
        this.disparador = $(this.opciones.disparador);
        this.exito = $(this.opciones.exito);
        if(!this.contenedor || !this.exito || !this.disparador){
            return;
        }
        this.objID = $('_herr_objeto_id').value;
        this.objURL = $('_herr_objeto_url').value;
        this.disparador.addEvent('click', this.validarRecomendacion.bindWithEvent(this));
    },
	// valida que la recomendaciï¿½n estï¿½ bien formada.
    validarRecomendacion: function(evt){
        this.rec_nombre = $('rec_nombre').getValue();
        this.rec_amigo = $('rec_amigo').getValue();
        this.rec_mail_amigo = $('rec_mail_amigo').getValue();
        this.rec_mensaje = $('rec_mensaje').getValue();
        evt = new Event(evt);
        if (this.rec_nombre!='' && this.rec_amigo!='' &&
            this.rec_mail_amigo!='' &&
            /^([a-zA-Z0-9])+([\.\+a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-]+)+/.test(this.rec_mail_amigo)){
            this.enviarRecomendacion();
        }
        evt.stop();
        evt.preventDefault();
    },
	// Envï¿½a la recomendaciï¿½n al servidor.
    enviarRecomendacion: function(){
        var req = new Ajax(Gusanito.webservice, {
            method: 'post',
            postBody: 'accion=recomendar_objeto&id='+this.objID+
                      '&liga='+Gusanito.escapar(this.objURL)+
                      '&rec_nombre='+this.rec_nombre+
                      '&rec_amigo='+this.rec_amigo+
                      '&rec_mail_amigo='+this.rec_mail_amigo+
                      '&rec_mensaje='+Gusanito.escapar(this.rec_mensaje),
            onComplete: this.actualizar.bind(this)
        }).request();
        this.disparador.disabled = true;
    },
	// Actualiza el html con la respuesta.
    actualizar: function(resp){
        this.contenedor.toggleClass(this.opciones.clase_oculto);
        this.exito.toggleClass(this.opciones.clase_oculto);
        this.disparador.disabled = false;
    }
});

/*******************************************
 *  FEATURES
 */
/*
 * Feature Principal Descargas
 */
Gusanito.widgetDescargas = new Class({
    initialize: function(contenedor,  opciones){
        this.opciones = opciones;
        this.contenedor = $(contenedor);
        if(!this.contenedor){ return;}
        this.bloques = $ES('.'+this.opciones.clase_bloque, this.contenedor);
        this.botones = $ES('.'+this.opciones.clase_boton, this.contenedor);
        this.botones[0].addEvent('click', this.cambiar_contenido.bind(this, 1));
        this.botones[1].addEvent('click', this.cambiar_contenido.bind(this, 0));
    },
	// Cambia el contenido del contenedor.
    cambiar_contenido: function(siguiente){
        if(siguiente==1){
            new Fx.Style(this.bloques[1], 'opacity', {duration:500}).start(0, 1);
            this.bloques[1].setStyles({'margin-top': '-230px', 'margin-left': '-500px'});
            new Fx.Style(this.bloques[1], 'margin-left', {duration:600, onComplete:function(){
                this.bloques[1].addClass(this.opciones.clase_activo);
            }.bind(this)}).start(-460, 0);
            this.bloques[1].removeClass(this.opciones.clase_oculto);
            this.bloques[0].removeClass(this.opciones.clase_activo);
            new Fx.Style(this.bloques[0], 'margin-left', {duration:600}).start(0, 460);
            new Fx.Style(this.bloques[0], 'opacity', {duration:500}).start(1,0);
        }else{
            new Fx.Style(this.bloques[0], 'opacity', {duration:500}).start(0, 1);
            this.bloques[0].setStyles({'margin-top': '0', 'margin-left': '500px'});
            this.bloques[0].addClass(this.opciones.clase_activo);
            new Fx.Style(this.bloques[0], 'margin-left', {duration:600, onComplete:function(){
                this.bloques[0].addClass(this.opciones.clase_activo);
            }.bind(this)}).start(500, 0);
            this.bloques[0].removeClass(this.opciones.clase_oculto);
            this.bloques[1].removeClass(this.opciones.clase_activo);
            new Fx.Style(this.bloques[1], 'margin-left', {duration:600}).start(0, -460);
            new Fx.Style(this.bloques[1], 'opacity', {duration:400}).start(1,0);
        }
    }
});
/*
 * Feature Principal Tarjetas
 */
Gusanito.widgetTarjetas = new Class({
    initialize: function(contenedor){
        this.contenedor = $(contenedor);
        this.img = this.contenedor.getElement('img');
        this.imgsrc = this.img.getProperty('src');
        this.img.remove();
        this.contenedor.style.backgroundImage = 'url('+this.imgsrc+')';
    }
});




/*
 * Feature Home
 */
Gusanito.widgetPresentando = new Class({
    initialize: function(contenedor, opciones){

        this.opciones 	= opciones;
        this.contenedor = $(contenedor);


	if(!this.contenedor){return;}

	this.bloques = $ES('.'+this.opciones.bloques, this.contenedor);
        this.bloque = this.opciones.bloques;
        this.invisible = this.opciones.clase_invisible;
        this.bg = this.opciones.clase_bg;
        this.btn_prefijo = this.opciones.btn_prefijo_id;
        this.h2s = this.bloques.getElements('h2');
        this.div = new Element('div');

	this.alt_div = new Element('div');

        this.bgs = $ES('.'+this.bg, this.contenedor);
		// SAN VALENTIN 2009: Descomentar la siguiente linea y borrar la linea de abajo despues de San Valentin.
		this.btns = [$(this.btn_prefijo+'1').clone(), $(this.btn_prefijo+'2').clone(), $(this.btn_prefijo+'3').clone(), $(this.btn_prefijo+'4').clone()];
		
		//this.btns = [$(this.btn_prefijo+'1').clone(), $(this.btn_prefijo+'2').clone()];
        
	this.url_enlaces = new Array(this.btns.length);
	this.tag_enlaces = new Array(this.btns.length);

        this.contenedor.removeClass(this.invisible);
        this.elemento_activo = 0;
        this.div.id = this.opciones.w_id;
        this.div.addClass(this.bloque);
        this.crear_default_background();

	this.alt_div.injectInside(this.div);
	this.alt_div.addClass(this.bloque);
	this.alt_div.id = 'enlace';

	this.div.setStyle('cursor','pointer');


		// SAN VALENTIN 2009: Descomentar la siguiente linea y borrar la linea de abajo despues de San Valentin.
        for(var i=0; i<this.btns.length; i++){
		//for(var i=0; i<2; i++){

	    $(this.btn_prefijo+(i + 1)).remove();

            this.btns[i].injectInside(this.div);

	    //obtiene los enlaces para despues agregarlos a los divs correspondientes
	    this.url_enlaces[i] = this.btns[i].getElement('a').getProperty('href');
            this.tag_enlaces[i] = new Element('a');
	    this.tag_enlaces[i].setProperty('href', this.url_enlaces[i] );
	    //console.log(this.url_enlaces[i]);
        }


        this.crear_widget();
        this.actualizar(0);

	//encadena los eventos para cuando se pasa el mouse sobre los eventos y cuando se retira
	this.mouseOverListener();
	this.mouseOutListener();
	this.clickableDiv();
    },
	// Define el background del feature que se muestra por default. Esta funciï¿½n solo se ejecuta al inicio.
    crear_default_background: function(){
        this.div.style.backgroundImage = 'url(' +  this.bgs[0].src + ')';
    },
	// Crea el feature. Esta funciï¿½n solo se ejecuta al inicio.
    crear_widget: function(){
        this.div.injectBefore(this.bloques[0]);
        this.h2s[0].injectBefore(this.div.firstChild);
    },

    clickableDiv: function(){
	this.div.addEvent( 'click' , this.asigna_link.bind( this ) );
    },

    mouseOverListener: function(){
	for(var i=0; i<this.btns.length; i++){
	    this.btns[i].addEvent( 'mouseover', this.actualizar_alt.bind( this , i ));
        }
    },

   asigna_link: function(){
	window.location = this.tag_enlaces[this.elemento_activo];
	//console.log(this.tag_enlaces[this.elemento_activo]);
   },

   mouseOutListener: function(){
	for(var i=0; i<this.btns.length; i++){
	    this.btns[i].addEvent( 'mouseout', this.actualizar.bind( this , i ));
        }
   },

	// Hace el cambio automï¿½tico entre los elementos del feature.
	cambio_automatico: function(){
		if(this.t_o)
		{
			clearTimeout(this.t_o);
		}

		this.t_o = setTimeout(function(){
			// SAN VALENTIN 2009:Descomentar la siguiente linea y borrar la linea de abajo despues de San Valentin.
			this.actualizar(this.elemento_activo==3 ? 0 : this.elemento_activo+1);
			//this.actualizar(this.elemento_activo==1 ? 0 : this.elemento_activo+1);
			this.div
		}.bind(this), this.opciones.intervalo);

   	 },
	// genera el cambio automatico pero con un retraso muy largo
	cambio_automatico_alt: function(){
		if(this.t_o)
		{
			clearTimeout(this.t_o);
		}

		this.t_o = setTimeout(function(){
			this.actualizar(this.elemento_activo==3 ? 0 : this.elemento_activo+1);
		}.bind(this), 999999999);
    	},


	// Actualiza el background y el texto principal,
    actualizar: function(i){
        // sin Fx en IE y Opera

	var fx = (/Opera|MSIE/.test(navigator.userAgent)===false) ? new Fx.Style(this.div.setStyle('background-image',
													'url(' + this.bgs[i].src + ')'),
													'opacity', {duration:this.opciones.duracion_cambio}).start(0.7,1) : this.div.style.backgroundImage = 'url(' +this.bgs[i].src +')' ;
	if(this.div.firstChild.getTag() == 'h2'){
		this.div.firstChild.remove();
	}




	this.h2s[i].injectBefore(this.div.firstChild);
	this.limpiar_clase_botones();
	this.btns[i].addClass(this.opciones.clase_hover);
	this.btns[i].className = this.opciones.clase_hover;
	this.elemento_activo = i;

	//inyecta dentro del div el tag con el enlace
	this.alt_div.setHTML(null);
	this.tag_enlaces[i].injectInside(this.alt_div);

	this.cambio_automatico();

    },

    //llama a la funcion de cambio automatico alternativa usado para el evento de mouseover
    actualizar_alt: function(i){
        // sin Fx en IE y Opera

	var fx = (/Opera|MSIE/.test(navigator.userAgent)===false) ? new Fx.Style(this.div.setStyle('background-image',
													'url(' + this.bgs[i].src + ')'),
													'opacity', {duration:this.opciones.duracion_cambio}).start(0.7,1) : this.div.style.backgroundImage = 'url(' +this.bgs[i].src +')' ;
	if(this.div.firstChild.getTag() == 'h2'){
		this.div.firstChild.remove();
	}

	this.h2s[i].injectBefore(this.div.firstChild);
	this.limpiar_clase_botones();
	this.btns[i].addClass(this.opciones.clase_hover);
	this.btns[i].className = this.opciones.clase_hover;
	this.elemento_activo = i;

	//inyecta dentro del div el tag con el enlace
	this.alt_div.setHTML(null);
	this.tag_enlaces[i].injectInside(this.alt_div);

	this.cambio_automatico_alt();

    },




	// Quita la clase de botï¿½n, de todos los botones.
    limpiar_clase_botones: function(){
        this.btns.each(function(btn){
            btn.className = this.opciones.clase_boton;
        }, this);
    }
});

/*******************************************
 *  JUEGOS
 */

/*
 * Implementa la paginaciï¿½n AJAX del listado de juegos en la barra derecha.
 */
Gusanito.Juegos.paginar = function(pag){
    new Ajax(Gusanito.webservice, {
        method: 'post',
        postBody: 'accion=paginar_juegos&id='+pag.replace('/',''),
        update: $('cnt_juegos_paginado')//,onComplete:function(resp){console.log(resp)}
    }).request();
};

/*******************************************
 *  RECORDATORIOS
 */
/*
 * Permite que se agreguen o quiten filas de contactos por agregar
 */
Gusanito.Recordatorios.filas = new Class({
    initialize: function(contenedor, disparador, opciones){
        this.contenedor = $(contenedor);
        this.disparador = $(disparador);
        this.opciones = opciones;
        this.offset_height_input = $('_frm_toggler_offsetHeight');
        this.filas = $ES(this.opciones.identificador_filas, this.contenedor);
        if(!this.filas){
            return;
        }
	try{
		this.disparador.addEvent('change', this.administrar.bindWithEvent(this));
	}catch(err){

	}

    },
	// Administra las filas.
    administrar: function(evt){
        this.valor = this.disparador.options[this.disparador.selectedIndex].value;
        this.por_agregar = this.valor - $ES(this.opciones.identificador_filas, this.contenedor).length;
        this.por_borrar = $ES(this.opciones.identificador_filas, this.contenedor).length - this.valor;
        if(this.valor > $ES(this.opciones.identificador_filas, this.contenedor).length){
            for(var i = 0; i < this.por_agregar; i++){
                this.puntero = $ES(this.opciones.identificador_filas, this.contenedor).length;
                this.puntero == this.puntero==0 ? 0 : this.puntero--;
                this.n = ++$ES(this.opciones.identificador_filas, this.contenedor).length;
                this.clon = this.filas[0].clone();
                this.nuev_elems = this.clon.getElements('input');
                for(var k=0; k<this.nuev_elems.length; k++){
                    this.nuev_elems[k].value = '';
                    this.nuev_elems[k].setProperty('id', this.opciones.nuevos_ids[k]+this.n);
                }
                this.contenedor.getParent().setStyle('height', parseInt(this.contenedor.getParent().offsetHeight+45) +'px');
                this.contenedor.getParent().getParent().setStyle('height', parseInt(this.contenedor.getParent().getParent().offsetHeight+45) +'px');
                this.offset_height_input.value = parseInt(this.contenedor.getParent().getParent().offsetHeight+45);
                this.clon.injectAfter( $ES(this.opciones.identificador_filas, this.contenedor)[ this.puntero ] );
            }

        }else{
            this.filas = $ES(this.opciones.identificador_filas, this.contenedor);
            for(var i = (this.filas.length - this.por_borrar); i < this.filas.length ; i++ ){
                this.filas[i].remove();
                this.contenedor.getParent().setStyle('height', parseInt(this.contenedor.getParent().offsetHeight-45 ) +'px');
                this.contenedor.getParent().getParent().setStyle('height', parseInt(this.contenedor.getParent().getParent().offsetHeight-45 ) +'px');
                this.offset_height_input.value = parseInt(this.contenedor.getParent().getParent().offsetHeight-45 );
            }

        }
        if(this.opciones.onComplete){
            this.opciones.onComplete();
        }
        evt.stop();
        evt.preventDefault();
    }
});

/*******************************************
 *  RECOMIï¿½NDANOS
 */
/*
 * Permite que se agreguen o quiten filas de destinatarios de recomendaciones.
 */
Gusanito.Recomiendanos.filas = new Class({
    initialize: function(contenedor, disparador, opciones){
        this.contenedor = $(contenedor);
        this.disparador = $(disparador);
        if(!this.contenedor || !this.disparador){
            return;
        }
        this.opciones = opciones;
        this.filas = $ES(this.opciones.identificador_filas, this.contenedor);
        if(!this.filas) {
            return;
        }
        this.disparador.addEvent('change', this.administrar.bind(this));
    },
	// Administra las filas.
    administrar: function(){
        this.valor = this.disparador.options[this.disparador.selectedIndex].value;
        this.por_agregar = this.valor - $ES(this.opciones.identificador_filas, this.contenedor).length;
        this.por_borrar = $ES(this.opciones.identificador_filas, this.contenedor).length - this.valor;
        if(this.valor > $ES(this.opciones.identificador_filas, this.contenedor).length){
            for(var i = 0; i < this.por_agregar; i++){
                this.puntero = $ES(this.opciones.identificador_filas, this.contenedor).length;
                this.puntero == this.puntero==0 ? 0 : this.puntero--;
                this.n = ++$ES(this.opciones.identificador_filas, this.contenedor).length;
                this.clon = this.filas[0].clone();
                this.nuev_elems = $ES('label, input', this.clon);
                for(var k=0; k<this.nuev_elems.length; k++){
                    this.nuev_elems[k].getParent().removeClass('error');/* FIX */
                    if(this.nuev_elems[k].getTag()=='input'){
                        this.nuev_elems[k].value = '';
                        this.nuev_elems[k].setProperty('id', this.opciones.nuevos_ids[0] + this.n.toString());
                    }
                    if(this.nuev_elems[k].getTag()=='label' && this.opciones.actualizar_label){
                        this.nuev_elems[k].setProperty('for', this.opciones.nuevos_ids[0] + this.n.toString());
                        this.nuev_elems[k].innerHTML = this.opciones.actualizar_label.replace('_', this.n);
                    }
                }
                this.clon.injectAfter( $ES(this.opciones.identificador_filas, this.contenedor)[ this.puntero ] );
            }
        }else{
            this.filas = $ES(this.opciones.identificador_filas, this.contenedor);
            for( i = (this.filas.length - this.por_borrar); i < this.filas.length ; i++ ){
                this.filas[i].remove();
            }
        }
        if(this.opciones.onComplete){
            this.opciones.onComplete();
        }
    }
});

/*******************************************
 *  ENVï¿½O DE TARJETAS POSTALES
 */
/*
 * Permite que se agreguen o quiten filas de destinatarios.
 */
Gusanito.EnviarPostal.filas = new Class({
    initialize: function(contenedor, disparador, opciones){
        this.contenedor = $(contenedor);
        this.disparador = $(disparador);
        this.opciones = opciones;
        this.filas = $ES(this.opciones.identificador_filas, this.contenedor);
        if(!this.filas){
            return;
        }
        this.disparador.addEvent('change', this.administrar.bind(this));
    },
	// Administra las filas.
    administrar: function(){
        this.valor = this.disparador.options[this.disparador.selectedIndex].value;
        this.por_agregar = this.valor - $ES(this.opciones.identificador_filas, this.contenedor).length;
        this.por_borrar = $ES(this.opciones.identificador_filas, this.contenedor).length - this.valor;
        if(this.valor > $ES(this.opciones.identificador_filas, this.contenedor).length){
            for(var i = 0; i < this.por_agregar; i++){
                this.puntero = $ES(this.opciones.identificador_filas, this.contenedor).length;
                this.puntero == this.puntero==0 ? 0 : this.puntero--;
                this.n = ++$ES(this.opciones.identificador_filas, this.contenedor).length;
                this.clon = this.filas[0].clone();
                this.nuev_elems = this.clon.getElements('input');
				this.nuev_elems2 = this.clon.getElements('img');		//fix for zend validation
                for(var k=0; k<this.nuev_elems.length; k++){
                    this.nuev_elems[k].value = '';
                    this.nuev_elems[k].setProperty('id', this.opciones.nuevos_ids[k]+this.n);
                }

				//fix for zend validation
				for(var k2=0; k2<this.nuev_elems2.length; k2++){
                    this.nuev_elems2[k2].remove();
				}

                this.clon.injectAfter( $ES(this.opciones.identificador_filas, this.contenedor)[ this.puntero ] );
            }

        }else{
            this.filas = $ES(this.opciones.identificador_filas, this.contenedor);
            for(i = (this.filas.length - this.por_borrar); i < this.filas.length ; i++ ){
                this.filas[i].remove();
            }

        }
        if(this.opciones.onComplete){
            this.opciones.onComplete();
        }
    }
});

/*
 * Cambia el tipo de mensaje (mensaje predeterminado XOR mensaje personalizado).
 * @deprecated
 */
Gusanito.EnviarPostal.cambiarOpcionMensaje = new Class({
    initialize: function(ids_opciones, switchers, clase_oculto, flag_tipo){
        this.ids_opciones = ids_opciones;
        this.switchers = switchers;
        this.clase_oculto = clase_oculto;
        this.flag_tipo = $(flag_tipo);
        this.opc = [];
        this.ids_opciones.each(function(opc){
            this.opc.push($(opc));
        }, this);
        $ES(this.switchers).each(function(switcher){
            switcher.addEvent('click', function(evt){
                if(this.opc[0].hasClass(this.clase_oculto)){
                    this.opc[0].removeClass(this.clase_oculto);
                    this.opc[1].addClass(this.clase_oculto);
                    this.flag_tipo.value = this.opc[0].id;
                }else{
                    this.opc[1].removeClass(this.clase_oculto);
                    this.opc[0].addClass(this.clase_oculto);
                    this.flag_tipo.value = this.opc[1].id;
                }
                try{
                    evt.preventDefault();
                    evt.stop();
                }catch(e){}
                return false;
            }.bind(this));
        }, this);
    }
});
/*
 * Maneja la vista previa del mensaje de la postal.
 */

 /*
Gusanito.EnviarPostal.vistaPreviaMensaje = new Class({
    initialize: function(prev_div_id, div_editor_id, obj_editor, clase, disparador, ocultar_otro){
        this.prev_div = $(prev_div_id);
        this.div_editor = $(div_editor_id);
        this.obj_editor = obj_editor;
        this.clase = clase;
        this.disparador = $(disparador);
        this.ocultar_otro = $(ocultar_otro);
        this.txt = this.disparador.innerHTML;
        this.disparador.addEvent('click', this.vista_previa.bindWithEvent(this));
    },
	// Lanza la vista previa.
    vista_previa: function(evt){
        this.prev_div.toggleClass(this.clase);
        this.ocultar_otro.toggleClass(this.clase);// ocultar select de mensajes predeterminados
        this.prev_div.setHTML(FCKeditorAPI.GetInstance(this.obj_editor).GetXHTML());
        this.div_editor.toggleClass(this.clase);
        this.disparador.innerHTML = this.div_editor.hasClass(this.clase) ? 'Volver al editor' :  this.txt;
        evt.stop();
        evt.preventDefault();
        return false;
    }
});
*/

/*
 * Maneja la fecha de envï¿½o de una postal.
 */
Gusanito.EnviarPostal.fechaEnvio = new Class({
    initialize: function(selector, indice_otra_fecha, campos_inactivos){
        this.selector = $(selector);
        this.indice_otra_fecha = indice_otra_fecha;
        this.campos_inactivos = campos_inactivos;
        this.selector.addEvent('change', function(){
            if(this.selector.selectedIndex==this.indice_otra_fecha){
                this.campos_inactivos.each(function(elem){
                    $(elem).style.visibility = 'visible';
                }, this);
            }else{
                this.campos_inactivos.each(function(elem){
                    $(elem).style.visibility = 'hidden';
                }, this);
            }

        }.bind(this));
    },
    cambio_fecha: function(){

    }
});

/*
 * Agrega el mensaje predeterminado seleccionado al editor de texto WYSIWYG.
 */

 /*
Gusanito.EnviarPostal.agregarMsjPredeterminado = new Class({
    initialize: function (s_editor, select_mensajes) {
        this.editor = s_editor;
        this.select_mensajes = $(select_mensajes);
        this.select_mensajes.addEvent('change', this.agregar.bindWithEvent(this));
    },
	// Agrega el mensaje mediante el API del editor.
    agregar: function(evt){
        FCKeditorAPI.GetInstance(this.editor).InsertHtml(this.select_mensajes.options[this.select_mensajes.options.selectedIndex].innerHTML);
        evt.stop();
        evt.preventDefault();
    }
});
*/

/*******************************************
 *  RECEPCIï¿½N DE POSTALES
 */
/*
 * Envï¿½a una tarjeta de respuesta desde la recepciï¿½n de una tarjeta.
 */
Gusanito.TarjetaRecibir.enviarRespuesta = new Class({
    initialize: function(disparador, contenedor, exito, tar_respuesta, mensaje){
        this.disparador = $(disparador);
        this.contenedor = $(contenedor);
        this.exito = $(exito);
        this.tar = $ES('input', tar_respuesta);
        this.mensaje = $(mensaje).value;

	try{
		this.disparador.addEvent('click', this.enviar.bindWithEvent(this));
	}
	catch(err){
	}

    },
	// Realiza el envï¿½o.
    enviar: function(evt) {
        this.tar.each(function(tar){
            if(tar.checked) {
                this.tarjeta_respuesta = tar.value;
            }
        }, this);
        if(typeof(this.tarjeta_respuesta)!='undefined') {
            var rid = this.contenedor.className.replace('rid_','');
            var params = 'accion=enviar_postal_respuesta&id='+this.tarjeta_respuesta+
                         '&mensaje='+Gusanito.escapar(this.mensaje)+'&rid='+rid+'&tipo_remitente='+$('tipo_remitente').value+
                         '&nombre_remitente='+Gusanito.escapar($('nombre_remitente').value)+'&email_remitente='+$('email_remitente').value;
            //console.log(params);
            var req = new Ajax(Gusanito.webservice, {
                postBody: params,
                onComplete: this.respuesta_enviada.bind(this)
            }).request();
        }
        evt.preventDefault();
        evt.stop();
    },
	// Callback para cuando el servidor confirma el envï¿½o de la tarjeta de respuesta.
    respuesta_enviada: function(resp){ //console.log(resp)
        if(resp){
            this.contenedor.addClass('oculto');
            this.exito.removeClass('oculto');
        }
    }
});


/*******************************************
 *  WALLPAPERS Y CALENDARIOS
 */
Gusanito.wallpaper = new Class({
    initialize: function(img, aviso_resolucion){
        this.resoluciones = ['800x600','1024x768','1280x800','1280x1024'];
        this.img = $(img);
        this.aviso = $(aviso_resolucion);
        if(!this.img){ return;}
        this.img_id = img;
        this.resolucion = this.detectar_resolucion();
        this.resolucion = this.resoluciones.indexOf(this.resolucion)!==-1 ? this.resolucion : '1280x1024';
        this.escribir_imagen();
    },
	// Detecta la resoluciï¿½n del usuario.
    detectar_resolucion: function(){
        this.resolucion_detectada = true;
        return screen.width + 'x' + screen.height;
    },
	// Carga la imagen (wallpaper/calendario) correcta para la resoluciï¿½n detectada.
    escribir_imagen: function(){
        var img_path = this.img.src.split('/');
        var old_img  = img_path[img_path.length - 1];
        var path     = this.img.src.replace(old_img, '');
        var neu_img = old_img.replace(/(.+)_(.+)_(.+)\.(.+)/, '$1_$2_'+this.resolucion+'.$4');
        //var _img = new Asset.image(path+neu_img, {id: '_img_d_resolucion_', onloaded:function(){alert('ok');}});
        this.img.setProperty('src', path + neu_img);
        this.aviso.innerHTML = this.resolucion;
        var url = this.img.getParent().href;
        this.img.getParent().href += '/' + this.resolucion;
        $('descargar').addEvent('click', function(){ /* fix para el boton */
            self.location.href = url + '/' + this.resolucion;
        }.bind(this));
    }
});

/*
 * Agrega un destinatario como contacto, en la confirmaciï¿½n de envï¿½o de una tarjeta
 * de un usuario logueado.
 */
Gusanito.Tarjetas.agregarContacto = new Class({
    initialize: function(clase_botones, prefijo_elem_fila, opciones){
        this.clase_botones = clase_botones;
        this.prefijo_elem = prefijo_elem_fila;
        this.opciones = opciones;
        this.botones = $ES('.'+clase_botones);
        this.observar();
    },
	// Agrega los eventos necesarios.
    observar: function(){
        this.botones.each(function(boton, i){
            boton.addEvent('click', this.agregar.bindWithEvent(this, i))
        }, this);
    },
	// Realiza la solicitud al servidor.
    agregar: function(evt, i){
        var persona_id = this.botones[i].id.replace(this.prefijo_elem,'');
        var _req = new Ajax(Gusanito.webservice, {
            method: 'post',
            postBody: this.opciones.params + persona_id,
            onStart: this.on_loading.bind(this, i)(),
            onComplete: function(resp){
                if(resp){
                    this.botones[i].addClass(this.opciones.clase_agregado);
                    this.botones[i].innerHTML = this.opciones.msj_exito;
                    this.botones[i].removeEvents('click');
                }
                return false;
            }.bind(this)
        }).request();
    },
	// Funciï¿½n que se ejecuta durante el envï¿½o de la solicitud.
    on_loading: function(i){
        var img = new Element('img');
        img.setProperties({
            src: this.opciones.img_cargando_src,
            alt: this.opciones.img_cargando_alt
        });
        this.botones[i].removeClass(this.clase_botones);
        this.botones[i].innerHTML = '';
        this.botones[i].adopt( img );
    }
});

/*******************************************
 *  PERSONAJES
 */
/*
 * Implementa la funcionalidad del 'onhover' de la imagen de los personajes.
 */
Gusanito.Personajes.paginaPrincipal = new Class({
    initialize: function(contenedor, clase_personaje){
        this.contenedor = $(contenedor);
        if(!this.contenedor) {return;}
        this.bloques = $ES('.'+clase_personaje, this.contenedor);
        this.actualizar_backgrounds();
    },
	// Pone las imï¿½genes de los personajes definidas en el markup, como backgrounds.
    actualizar_backgrounds: function(){
        this.bloques.each(function(bloque){
            bloque.getElement('a').setStyle('background','url('+ bloque.getElement('img').src +')');
        }, this); 
    }
});

/*******************************************
 *  DEBUG
 */
/*
 * Funciï¿½n crossbrowser para imprimir objetos de forma no intrusiva.
 */
function debug(o){
    if(typeof console=='object') {
        console.log(o);
    } else {
        var d = $('_ultraDebug')
            d = d ? d : new Element('div');
            d.id = '_EMB_Ultra_Debug';
            d.setStyles({
                position: 'fixed',
                top:'0', left:'0',
                background: '#fff',
                border: '1px solid #000',
                display: 'block'
            });
            d.innerHTML += o+'<br>';
            d.injectInside(document.body);
    }
}

function switchMenu(obj,obj2) {
	var el = document.getElementById(obj);
	var e2 = document.getElementById(obj2);
	if ( el.style.display != "none" ) {
		el.style.display = 'none';
		e2.style.display = 'none';
	}
	else {
		el.style.display = '';
		e2.style.display = 'none';
	}
}
// ]]>
