/**
 * Objeto buscador.
 */
var Buscador = Class.create({

    /**
     * Iniciar el objeto.
     */
    initialize: function(){
        this._competencias = null;
        
		this._preloadedFamilias = null;
		this._preloadedUnidadesCompletas = null;
		
        this._familias_array = null;
        this._familias = null;
		
        this._cualificaciones = null;
        this._cualificaciones_unidades = null;
        this._unidades = null;
        this._realizaciones = null;
        this._criterios = null;
        this._modulos = null;
        this._capacidades = null;
        this._capacidades_criterios = null;
        
        this._oResult = null;
		this._oResumen = null;
		this._oResumen_b = null;
        
        this._init();
    },
    
    /**
     * Iniciar el array de competencias
     */
    _init: function(){
        //Crear el array vacio de competencias
        this._competencias = new Array();
        this._familias_array = new Array();
        this._familias = new Hash();
        this._cualificaciones = new Hash();
        this._cualificaciones_unidades = new Hash();
        this._unidades = new Hash();
        this._realizaciones = new Hash();
        this._criterios = new Hash();
        this._modulos = new Hash();
        this._capacidades = new Hash();
        this._capacidades_criterios = new Hash();
		
		//Cambiar el tamaño de container principal
		this._resizeContentLayer();
        
        //Poner los handlers a los botones
        var button_add = $('button_add_competencias');
        if (button_add) {
            button_add.observe('click', this._addCompetenciaHandler.bindAsEventListener(this));
        }
        var button_cerrar = $('cerrar_popup');
        if (button_cerrar) {
            button_cerrar.observe('click', this._cerrarHandler.bindAsEventListener(this));
        }
        var button_buscar_competencias = $('buscar_competencias');
        if (button_buscar_competencias) {
            button_buscar_competencias.observe('click', this._buscarCompetenciasHandler.bindAsEventListener(this));
        }
		var button_buscar_volver_paso1 = $('volver_a_criterios');
        if (button_buscar_volver_paso1) {
            button_buscar_volver_paso1.observe('click', this._volverACriteriosHandler.bindAsEventListener(this));
        }
		var button_aplicar_seleccion = $('aplicar_seleccion');
        if (button_aplicar_seleccion) {
            button_aplicar_seleccion.observe('click', this._aplicarSeleccionHandler.bindAsEventListener(this));
        }
		var button_buscar_volver_paso2 = $('volver_a_resultado');
        if (button_buscar_volver_paso2) {
            button_buscar_volver_paso2.observe('click', this._volverAResultadoHandler.bindAsEventListener(this));
        }
		
		var button_ayuda = $('ayuda_popup_button');
        if (button_ayuda) {
            button_ayuda.observe('click', this._abrirAyudaHandler.bindAsEventListener(this));
        }
        var button_ayuda_cerrar = $('cerrar_ayuda_popup');
        if (button_ayuda_cerrar) {
            button_ayuda_cerrar.observe('click', this._cerrarAyudaHandler.bindAsEventListener(this));
        }
		
        
        //Poner el handler del check "Marcar o desmarcar todas"
        var check_filtro_familias = $('check_filtro_familias');
        if (check_filtro_familias) {
            check_filtro_familias.observe('click', this._familiaFiltroHandler.bindAsEventListener(this));
        }
        
        //Poner el handler de toggles (todos los elementos toggle_button)
        var element_classname = 'div.toggle_button';
        var toggles = $$(element_classname);
        for (var i = 0, len = toggles.length; i < len; ++i) {
            var toggle = toggles[i];
            toggle.observe('click', this._toggleHandler.bindAsEventListener(this, toggle.id, element_classname));
        }
		
		//Escuchar al evento de cambiar el tamaño de ventana.
		var me = this;
        Event.observe(window, 'resize', function(event){
            me._resizeContentLayer.delay(0.1);
        });
    },

	preload: function(data){
		var me = this;
		var data_hash = $H(data); 

		/**
		 * Precargar las familias.
		 */
		//Crear los objetos de familia y dibujar su html.
		
		//Buscar que familias correspronden con los ucs en el json precargada.
		var uc_array = new Array();
		var uc_actuales = data_hash.get('uc_actuales');
		if (uc_actuales) {
			for (var i = 0, len = uc_actuales.length; i < len; ++i) {
				var uc_actual = uc_actuales[i];
				uc_array.push(uc_actual.id);
			}
		}
		var uc_adquirir_array = data_hash.get('uc_adquirir');
		if (uc_adquirir_array) {
			for (var i = 0, len = uc_adquirir_array.length; i < len; ++i) {
				var uc_adquirir = uc_adquirir_array[i];
				uc_array.push(uc_adquirir);
			}
		}
		
		//Buscar las cualificaciones que vinculan la unidad con la familia.
		var cualificacion_hash = new Hash();
		for (var i = 0, len = uc_array.length; i < len; ++i) {
			uc_cu_array = this.getUc_cu(uc_array[i]);
			
			//Recorrer el array
			for (var j = 0, len2 = uc_cu_array.length; j < len2; ++j) {
			
				//Coger la cualificacion
				var cualificacion_id = uc_cu_array[j];
				cualificacion_hash.set(cualificacion_id, true);
			}
		}
		
		//Recorrer el hash con todos los cualificaciones que hay que cargar y meterlo en un array
		var cualificacion_array = new Array();
		cualificacion_hash.each(function(pair) {
			cualificacion_array.push(pair.key)			
		});
		
		//Precargar todos
		new Ajax.Request('lib_asp/ajax_query.asp?a=cualificaciones_complete&ids_cualificaciones=' + cualificacion_array.join(','), {
			method: 'get',
			asynchronous: false,
			onCreate: function(){
				$('loading_now').update('cualificaciones ' + cualificacion_array.join(','));
				$('loader').show();
			},
			onComplete: function(){
				$('loading_now').update('');
				$('loader').hide();
			},
			onSuccess: function(transport){
				me._preloadedFamilias = (transport.responseText).evalJSON(true);
			}
		});	
		
		var familias = this.getFamiliasArray();
		for (var i = 0, len = familias.length; i < len; ++i) {
			var familia = familias[i];
			var id = $H(familia).get('id');
			var familiaObj = this.getFamilia(id);
			familiaObj.open(false);
		}

		/**
		 * Precargar lo que ya sabe hacer.
		 */
		//Sacar los unidades y criterios del hash y guardarlos en dos arrays
		var uc_actuales_array = new Array();
		var criterios_array = new Array();
		var uc_actuales_sin_criterios_hash = new Hash();
		var uc_actuales = data_hash.get('uc_actuales');
		if (uc_actuales) {
			for (var i = 0, len = uc_actuales.length; i < len; ++i) {
				var uc_actual = uc_actuales[i];
				uc_actuales_array.push(uc_actual.id);
				
				var uc_actual_rps = uc_actual.rp;
				var m = 0;
				for (var j = 0, len2 = uc_actual_rps.length; j < len2; ++j) {
					uc_actual_rp = uc_actual_rps[j];
						
					var uc_actual_rp_crs = uc_actual_rp.cr;
					for (var k = 0, len3 = uc_actual_rp_crs.length; k < len3; ++k) {
						criterios_array.push(uc_actual_rp_crs[k]);
						m++;
					}					
				}
				if (m===0) {
					uc_actuales_sin_criterios_hash.set(uc_actual.id, uc_actual_rps);
				}
			}
		}
		
		//Crear los competencias en cada familia.
		for (var i = 0, len = familias.length; i < len; ++i) {
			var familia = familias[i];
			var id = $H(familia).get('id');
			
			//Comprobar para cada familia si hay competencias para cargar. Estos se cargan a traves de id de familia y id de unidad.
			for (var j = 0, len2 = uc_actuales_array.length; j < len2; ++j) {
				this.loadCompetencia(id, uc_actuales_array[j]);
			}
		}
	
		//Despues de cargar todo, se preseleccionan los criterios con llamar a setChecked = true.
		if (criterios_array.length == 0) {
			for (var i = 0, len = uc_actuales_array.length; i < len; ++i) {
				var unidad = this.getUnidad(uc_actuales_array[i]);
				if (unidad) {
					unidad.setChildrenChecked(true);
					unidad.setChecked(true);
					unidad.updateState(true);
				}
			}
		} else {
			for (var i = 0, len = criterios_array.length; i < len; ++i) {
				var criterio_loaded = this.getCriterio(criterios_array[i]);
				if (criterio_loaded) {
					criterio_loaded.setChecked(true, true);
				}
			}
			
			//Despues de insertar los criterios, comprobar si faltan unidades completos para precargar.
			for (var i = 0, len = uc_actuales_array.length; i < len; ++i) {
				if (!uc_actuales_sin_criterios_hash.get(uc_actuales_array[i])) {
					var unidad = this.getUnidad(uc_actuales_array[i]);
					if (unidad) {
						if (!unidad.getChecked()) {
							unidad.setChildrenChecked(true);
							unidad.setChecked(true);
							unidad.updateState(true);
						}
					}
				}
			}
			
			uc_actuales_sin_criterios_hash.each(function(pair) {
				var realizaciones = pair.value;
				for (var i = 0, len = realizaciones.length; i < len; ++i) {
					var realizacion_id = realizaciones[i].id;
					var realizacion = me.getRealizacion(realizacion_id);
					realizacion.setChecked(true);
					realizacion.inheritCheckedResumen(true);
				}
			});
			
			
		}
		
		/**
		 * Precargar los unidades que se va a aprender.
		 */
		var uc_adquirir_array = data_hash.get('uc_adquirir');
		if (uc_adquirir_array) {
			//Crear los competencias en cada familia.
			for (var i = 0, len = familias.length; i < len; ++i) {
				var familia = familias[i];
				var id = $H(familia).get('id');
				
				//Comprobar para cada familia si hay competencias para cargar. Estos se cargan a traves de id de familia y id de unidad.
				for (var j = 0, len2 = uc_adquirir_array.length; j < len2; ++j) {
					this.loadCompetencia(id, uc_adquirir_array[j]);
				}
			}
			
			//Seleccionar cada unidad
			for (var i = 0, len = uc_adquirir_array.length; i < len; ++i) {
				var unidad = this.getUnidad(uc_adquirir_array[i]);
				if (unidad) {
					unidad.setCheckedAdquisicion(true, false);
					unidad.setCheckedAprender();					
				}
			}
		}
		
		this.createResumen_b();
	},

    /**
     * Cambiar el tamaño de capa de contenido segun el tamaño de ventana y la altura de capa header.
     */
    _resizeContentLayer: function(){        
        //Calcular la altura
        var new_height = document.viewport.getHeight();
        
        //Si la altura es menor que 0, ponerlo a 0. (IE-fix)
        if (new_height < 0) {
            new_height = 0;
		}
		        
        //Poner el estilo
        $('content_container').setStyle({
            'height': new_height + 'px'
        });
	},

	/**
     * Devolver las competencias seleccionadas
     * @param {Object} id
     */
    getCompetencias: function(id){
        return this._competencias;
    },
    
    /**
     * Añadir una competencia
     * @param {int} id_cualificacion
     */
    setCompetencia: function(id_cualificacion){
        //Buscar si ya esta en el array. Si es asi, no añadirlo
        var found = false;
        for (var i = 0, len = this._competencias.length; i < len; ++i) {
            if (this._competencias[i] == id_cualificacion) {
                found = true;
            }
        }
        //Si no esta, añadirlo al array y dibujarlo
        if (!found) {
            this._competencias.push(id_cualificacion);
            this.drawCompetencia(id_cualificacion);
        }
        
        this.updateCompetenciasFields();
        
        return this._competencias;
    },
    
    /**
     * Quitar una cometencia
     * @param {int} id_cualificacion
     */
    unsetCompetencia: function(id_cualificacion){
        //Actualizar el array
        var a = new Array();
        for (var i = 0, len = this._competencias.length; i < len; ++i) {
            if (this._competencias[i] != id_cualificacion) {
                a.push(this._competencias[i]);
            }
        }
        this._competencias = a;
        
        //Quitar el elemento html
        if ($('layer_competencia.' + id_cualificacion)) {
            $('layer_competencia.' + id_cualificacion).remove();
            
            if ($('layer_competencia').innerHTML == '') {
                $('layer_competencia_vacio').show();
                $('layer_competencia').hide();
            }
        }
        
        this.updateCompetenciasFields();
        
        return this._competencias;
    },

	/**
	 * Cargar una cualificacion teniendo solo la familia_id y unidad_id
	 * @param {Object} familia_id
	 */
	loadCompetencia : function(familia_id, unidad_id) {
		var uc_cu_array = new Array();
		var oFamilia = this.getFamilia(familia_id, unidad_id);
		if (oFamilia) {
			//Abrirlo. El open carga el informacion de cualificacion con ajax si no esta cargado aun.
			oFamilia.open(false);
			
			//Buscar las cualificaciones que vinculan la familia con la unidad.
			uc_cu_array = this.getUc_cu(unidad_id);
			
			//Recorrer el array
			for (var i = 0, len = uc_cu_array.length; i < len; ++i) {
			
				//Coger la cualificacion
				var cualificacion_id = uc_cu_array[i];
				var oCualificacion = this.getCualificacion(cualificacion_id);
				//Si no existe, abrirlo
				if (oCualificacion) {
					//Abrirlo. El open carga el informacion de cualificacion con ajax si no esta cargado aun.
					oCualificacion.open(false);					
				}
			}
		}
		
		//Devuelve el array de cualificaciones.
		return uc_cu_array;
	},
    
    /**
     * Dibujar una competencia
     * @param {int} id_cualificacion
     */
    drawCompetencia: function(id_cualificacion){
        var cualificacion = this.getCualificacion(id_cualificacion);
       
        var div_competencia = new Element('div', {
            'id': 'layer_competencia.' + id_cualificacion,
            'class': 'container fila_competencia'
        });
        var div_img_info = new Element('div', {
            'class': 't1i'
        });
        var div_titulo = new Element('div', {
            'class': 't1txt'
        }).update(cualificacion.getField('denominacion'));
        var div_borrar = new Element('div', {
            'class': 't1d'
        });
        var img_info = new Element('img', {
            'src': 'images/i.gif'
        });
        var img_borrar = new Element('img', {
            'src': 'images/del.gif'
        });
        
        div_competencia.appendChild(div_img_info);
        div_competencia.appendChild(div_titulo);
        div_competencia.appendChild(div_borrar);
        div_img_info.appendChild(img_info);
        div_borrar.appendChild(img_borrar);
        
        $('layer_competencia').insert(div_competencia);
        $('layer_competencia').show();
        $('layer_competencia_vacio').hide();
        
        //Crear los handlers
        img_borrar.observe('click', this._removeCompetenciaHandler.bindAsEventListener(this, id_cualificacion));
    },
    
    _removeCompetenciaHandler: function(event){
        var id_cualificacion = arguments[1];
        var cualificacion = this.getCualificacion(id_cualificacion);
        
        if (cualificacion) {
            cualificacion.uncheckComplete(false);
        }
    },
    
    /**
     * Guardar las familias en el buscador
     * @param {Object} a
     */
    setFamiliasArray: function(a){
        this._familias_array = a;
    },
    
    /**
     * Recoger las familias en el buscador
     * @param {Object} a
     */
    getFamiliasArray: function(a){
        return this._familias_array;
    },
    
    /**
     * Guardar lor relaciones entre los cualificaciones y unidades
     * @param {Object} a
     */
    setUc_cuHash: function(a){
        for (var i = 0, len = a.length; i < len; ++i) {
            var relacion = $H(a[i]);
            var id_uc = relacion.get('id_uc');
            var id_cu = relacion.get('id_cu');
            
            //Crear el hash con las relaciones
            if (this._cualificaciones_unidades.get(id_uc)) {
                var array = this._cualificaciones_unidades.get(id_uc);
            }
            else {
                var array = new Array();
            }
            array.push(id_cu);
            this._cualificaciones_unidades.set(id_uc, array);
        }
    },
    
    /**
     * Devuelve un array con los ids de cualificaciones en donde esta el unidad
     * @param {Object} id_unidad
     */
    getUc_cu: function(id_unidad){
        return this._cualificaciones_unidades.get(id_unidad);
    },
    
    /**
     * Acciones para empezar añadir competencias
     * @param {Object} event
     */
    _addCompetenciaHandler: function(event){
        //Mostrar el inline-popup
        $('competencias_popup').show();
		this.showPopupBlocker();
    },
    
    /**
     * Cerrar el popup
     * @param {Object} event
     */
    _cerrarHandler: function(event){
        $('competencias_popup').hide();
		this.hidePopupBlocker();
    },
	
    /**
     * Ver la ayuda
     * @param {Object} event
     */
    _abrirAyudaHandler: function(event){
        //Mostrar el inline-popup
        $('ayuda_popup').show();
		this.showPopupBlocker();
    },
    
    /**
     * Cerrar la ayuda
     * @param {Object} event
     */
    _cerrarAyudaHandler: function(event){
        $('ayuda_popup').hide();
		this.hidePopupBlocker();
    },
    
    /**
     * Buscar los competencias en el buscador con una llamada Ajax.
     * @param {Object} event
     */
    _buscarCompetenciasHandler: function(event){
        var me = this;
        
        //Recoger el resultado, y si se ha recibido, abrir la segunda pantalla.
        new Ajax.Request('lib_asp/ajax_query.asp?a=buscar', {
            method: 'post',
			parameters:	$('form_buscador').serialize(true),
            onCreate: function(){
                $('loader').show();
            },
            onComplete: function(){
                $('loader').hide();
            },
            onSuccess: function(transport){
                me.toggle('paso_resultados_busqueda', 'div.toggle_pasos');
                me.loadResultBusqueda((transport.responseText).evalJSON(true));
                $('loader').hide();
            }
        });
    },
	
	/**
	 * Volver a los criterios
	 * @param {Object} event
	 */
	_volverACriteriosHandler : function(event) {
		this.toggle('paso_establecer_criterios', 'div.toggle_pasos');
	},

	/**
	 * Volver a los resultados
	 * @param {Object} event
	 */	
	_volverAResultadoHandler : function(event) {
		this.toggle('paso_resultados_busqueda', 'div.toggle_pasos');
	},
	
	/**
	 * Ir al paso de resumen
	 * @param {Object} event
	 */
	_aplicarSeleccionHandler : function(event) {
		this.mostrarSeleccionHandler()
	},

	/**
	 * Ir al paso de resumen
	 * @param {Object} event
	 */
	mostrarSeleccionHandler : function(event) {
		this.toggle('paso_resultados_resumen', 'div.toggle_pasos');
		
		//Si no esta creado el resumen aun, crearlo.
		var oResumen = this.createResumen();
		oResumen.drawResumen();
	},
    
    /**
     * Marcar o desmarcar todas las familias
     * @param {Object} event
     */
    _familiaFiltroHandler: function(event){
        var checked = event.target.checked;
        var checks = $$('input.filtro_fam');
		
        for (var i = 0, len = checks.length; i < len; ++i) {
            checks[i].checked = checked;
        }
    },
    
    /**
     * Hacer el toggle para mostrar o occultar capas
     * @param {Object} event
     */
    _toggleHandler: function(event){
        var toggle_selected_id = arguments[1];
        var element_classname = arguments[2];
        
        this.toggle(toggle_selected_id, element_classname);
    },
    
    /**
     * Hacer el toggle
     * @param {String} toggle_selected_id
     * @param {String} element_classname
     */
    toggle: function(toggle_selected_id, element_classname){
        var toggles = $$(element_classname);
        for (var i = 0, len = toggles.length; i < len; ++i) {
            var toggle = toggles[i];
            var toggle_id_array = toggle.id.split('.');
            if (toggle_id_array.length > 1) {
                var layer_id = toggle_id_array[1];
            }
            else {
                var layer_id = toggle.id;
            }
            if ($(layer_id)) {
                if (toggle.id == toggle_selected_id) {
                    if (toggle.hasClassName('res_off') || toggle.hasClassName('res_act')) {
                        toggle.removeClassName('res_off');
                        toggle.addClassName('res_act');
                    }
                    $(layer_id).show();
                }
                else {
                    if (toggle.hasClassName('res_off') || toggle.hasClassName('res_act')) {
                        toggle.removeClassName('res_act');
                        toggle.addClassName('res_off');
                    }
                    $(layer_id).hide();
                }
            }
        }
    },
    
    /**
     * Insertar familias en el hash
     * @param {Object} id
     * @param {Object} familia
     */
    insertFamilia: function(id, familia){
        this._familias.set(id, familia);
    },
    
    /**
     * Devolver una familia
     * @param {Object} id
     */
    getFamilia: function(id){
        var familia = this._familias.get(id);
        if (Object.isUndefined(familia)) {
            return false;
        }
        else {
            return familia;
        }
    },
    
    /**
     * Insertar cualificaciones en el hash
     * @param {Object} id
     * @param {Object} cualificacion
     */
    insertCualificacion: function(id, cualificacion){
        this._cualificaciones.set(id, cualificacion);
    },
    
    /**
     * Devolver una cualificacion
     * @param {Object} id
     */
    getCualificacion: function(id){
        var cualificacion = this._cualificaciones.get(id);
		if (Object.isUndefined(cualificacion)) {
            return false;
        }
        else {
            return cualificacion;
        }
    },
	
    /**
     * Devolver los cualificaciones seleccionados
     */
    getCheckedCualificaciones: function(){
		var cualificaciones = new Array();
		this._cualificaciones.each(function(pair) {
			if (pair.value.getChecked() || pair.value.getCheckedAdquisicion()) {
				cualificaciones.push(pair.value);
			}
		});
		return cualificaciones;
    },	
	
    /**
     * Insertar unidades en el hash
     * @param {Object} id
     * @param {Object} unidad
     */
    insertUnidad: function(id, unidad){
        this._unidades.set(id, unidad);
    },
    
    /**
     * Devolver un unidad
     * @param {Object} id
     */
    getUnidad: function(id){
        var unidad = this._unidades.get(id);
        if (Object.isUndefined(unidad)) {
            return false;
        }
        else {
            return unidad;
        }
    },
    
    /**
     * Insertar realizaciones en el hash
     * @param {Object} id
     * @param {Object} realizacion
     */
    insertRealizacion: function(id, realizacion){
        this._realizaciones.set(id, realizacion);
    },
    
    /**
     * Devolver una realizacion
     * @param {Object} id
     */
    getRealizacion: function(id){
        var realizacion = this._realizaciones.get(id);
        if (Object.isUndefined(realizacion)) {
            return false;
        }
        else {
            return realizacion;
        }
    },
    
    /**
     * Insertar criterios en el hash
     * @param {Object} id
     * @param {Object} criterio
     */
    insertCriterio: function(id, criterio){
        this._criterios.set(id, criterio);
    },
    
    /**
     * Devolver un criterio
     * @param {Object} id
     */
    getCriterio: function(id){
        var criterio = this._criterios.get(id);
		if (Object.isUndefined(criterio)) {
            return false;
        }
        else {
            return criterio;
        }
    },
    
	/**
	 * Devolver un modulo. Si no existe, cargarlo.
	 * @param {Object} id
	 */
    getModulo: function(id){
        var me = this;
        
        var modulo = this._modulos.get(id);
        if (Object.isUndefined(modulo)) {
			new Ajax.Request('lib_asp/ajax_query.asp?a=modulo&id_modulo=' + id, {
				method: 'get',
				asynchronous: false,
				onCreate: function(){
					$('loading_now').update('modulo ' + id);
					$('loader').show();
				},
				onComplete: function(){
					$('loading_now').update('');
					$('loader').hide();
				},
				onSuccess: function(transport){
					$('loader').hide();
					return me.insertModulos($H((transport.responseText).evalJSON(true)));
				}
			})
		}
		else {
			return modulo;
		}
    },
    
    /**
     * Insertar modulos
     * @param {Object} modulos
     */
    insertModulos: function(h){
    
        var modulo_hash = $H(h.get('modulos')[0]);
        var capacidades = h.get('capacidades');
        
        var id = modulo_hash.get('id');
        
        for (var j = 0, len2 = capacidades.length; j < len2; ++j) {
			capacidad_hash = $H(capacidades[j]);
            if (capacidad_hash.get('capacidades_' + id)) {
                var capacidades_list = capacidad_hash.get('capacidades_' + id);
            }
            if (capacidad_hash.get('criterios_' + id)) {
                var criterios_list = capacidad_hash.get('criterios_' + id);
            }
        }

        var modulo = new Modulo(modulo_hash, capacidades_list, criterios_list, this);
        this.insertModulo(id, modulo);
    
        return modulo;
    },
    
    /**
     * Insertar un modulo en el hash
     * @param {Int} id
     * @param {Object} modulo
     */
    insertModulo: function(id, modulo){
        this._modulos.set(id, modulo);
    },
    
    /**
     * Insertar una capacidad
     * @param {Int} id
     * @param {Object} capacidad
     */
    insertCapacidad: function(id, capacidad){
        this._capacidades.set(id, capacidad);
    },
    
    /**
     * Devolver una capacidad
     * @param {Object} id
     */
    getCapacidad: function(id){
        var capacidad = this._capacidades.get(id);
        if (Object.isUndefined(capacidad)) {
            return false;
        }
        else {
            return capacidad;
        }
    },
    
    /**
     * Insertar una capacidad_criterio
     * @param {Int} id
     * @param {Object} capacidad_criterio
     */
    insertCapacidad_criterio: function(id, capacidad_criterio){
        this._capacidades_criterios.set(id, capacidad_criterio);
    },
    
    /**
     * Devolver un capacidad_criterio
     * @param {Object} id
     */
    getCapacidad_criterio: function(id){
        var capacidad_criterio = this._capacidades_criterios.get(id);
        if (Object.isUndefined(capacidad_criterio)) {
            return false;
        }
        else {
            return capacidad_criterio;
        }
    },
    
    /**
     * Recoger las cualificaciones, unidades y realizaciones y sus porcentajes.
     */
    updateCompetenciasFields: function(){
        //Crear los hashes
        var h_cu = new Hash();
        var h_uc = new Hash();
        var h_rp = new Hash();
        
        //Recoger las cualificaciones
        for (var i = 0, len = this._competencias.length; i < len; ++i) {
            var id_cualificacion = this._competencias[i];
            var cualificacion = this.getCualificacion(id_cualificacion);
            h_cu.set(id_cualificacion, Math.round(cualificacion.getPercent() * 100) / 100);
            
            //Recoger de cada cualificacion, los unidades.
            if (!cualificacion._loaded) {
                cualificacion.open(false);
            }
            
            //Recorrer los unidades
            var unidades = cualificacion.getSelectedUnidades();
            for (var j = 0, len2 = unidades.length; j < len2; ++j) {
                var unidad = unidades[j];
                var id_unidad = unidad.getField('id');
                if (!h_uc.get(id_unidad)) {
                    h_uc.set(id_unidad, Math.round(unidad.getPercent() * 100) / 100);
                    
                    //Y para cada unidad, recoger sus realizaciones
                    var realizaciones = unidad.getSelectedRealizaciones();
                    for (var k = 0, len3 = realizaciones.length; k < len3; ++k) {
                        var realizacion = realizaciones[k];
                        h_rp.set(realizacion.getField('id'), Math.round(realizacion.getPercent() * 100) / 100);
                    }
                }
            }
            
        }
        
        $('cu_field').value = h_cu.toQueryString();
        $('uc_field').value = h_uc.toQueryString();
        $('rp_field').value = h_rp.toQueryString();
    },
    
    /**
     * Crear el resultado
     * @param {Object} h
     */
    loadResultBusqueda: function(h){
        //Crear un objeto de resultado. Se sobreescribe el resultado del buscador
        this._oResult = new Result(h, this);
    },
	
    /**
     * Crear el resumen
     * @param {Object} h
     */
    createResumen: function(){
        //Crear un objeto de resumen si no existe aun.
        if (this._oResumen === null) {
			this._oResumen = new Resumen(this);
		}
		return this._oResumen;
    },
	
    /**
     * Crear el resumen
     * @param {Object} h
     */
    createResumen_b: function(){
        //Crear un objeto de resumen si no existe aun.
        if (this._oResumen_b === null) {
			this._oResumen_b = new Resumen_b(this);
		}
		return this._oResumen_b;
    },
	
	/**
	 * Mostrar el bloqueador de popup
	 */
	showPopupBlocker : function() {
		$('popup_blocker').show();	
	},
	
	/**
	 * Occultar el bloqueador de popup
	 */
	hidePopupBlocker : function() {
		$('popup_blocker').hide();	
	},
	
	/**
	 * Crear la cadena de SNCP despues de cada accion.
	 * Cambios en realizaciones (o sus criterios de realizaciones) llaman a todos los 
	 * objetos de unidad en donde se encuentran estos realizaciones. Asi que hay que actualizar
	 * la cadena SNCP en tres casos.
	 * - El evento onclick de un select de unidad.
	 * - El evento onclick de una realizacion.
	 * - El cambio de estado de adquirir unidad.
	 * 
	 * El hash tiene la siguiente forma:
	 *      {
     *      "uc_actuales" : [
     *          {
     *                "id" : 23,
     *                 "rp" : [
     *                     {
     *                         "id" : 87,
     *                          "cr" : [152, 316, 2356, 81]
     *                     },
     *                     { "id" : ..., "cr" : [...] },
     *                     { "id" : ..., "cr" : [...] },
     *                     { "id" : ..., "cr" : [...] }
     *                 ]
     *          },
     *          { "id" : ..., "rp" : [...]  },
     *          { "id" : ..., "rp" : [...]  }
     *      ],
     *       "uc_adquirir" : [56, 652, 14]
     *      }
	 */
	createCadenaSNCP : function() {
		//Crear el hash en donde vamos a escribir
		var hash_sncp = new Hash();
		
		//Crear un array para guardar los hashes de uc_actuales
		var uc_actuales = new Array();
		
		//Crear un array para guardar los ids de uc que se quieren adquirir
		var uc_adquirir = new Array();
				
		//Recorrer todos los unidades
		this._unidades.each(function(pair) {
			
			//Coger el id de unidad y el objeto
			unidad_id = pair.key;
			oUnidad = pair.value;
		
			//
			// Actual
			//
			if (oUnidad.getChecked()) {
				//Crear el hash de uc
				var uc_hash = new Hash();
				
				//Apuntar el id
				uc_hash.set('id', unidad_id);
				
				//Crear el array de rp's
				var rp_array = new Array();
				
				//Recoger los realizaciones que estan seleccionados
				var realizaciones = oUnidad.getSelectedRealizaciones();
				
				//Recorrerlos
				for (var i = 0, len = realizaciones.length; i < len; ++i) {
					var oRealizacion = realizaciones[i];
					
					//Crear el hash de rp
					var rp_hash = new Hash();
					
					//Apuntarlo el id.
					rp_hash.set('id', oRealizacion.getField('id'));
					
					//Crear el array para guardar los ids de criterios
					cr_array = new Array();
					
					//Recoger los criterios que estan seleccionados
					var criterios = oRealizacion.getSelectedCriterios();
					
					//Recorrerlos
					for (var j = 0, len2 = criterios.length; j < len2; ++j) {
						var oCriterio = criterios[j];
						
						//Apuntar el id en el array
						cr_array.push(oCriterio.getField('id'));
					}
					
					//Apuntarlo el array en el hash de rp.
					rp_hash.set('cr', cr_array);
					
					//Añadir el hash de rp al array de rps
					rp_array.push(rp_hash);
				}
				
				//Apuntar el array de rps en el hash de uc			 
				uc_hash.set('rp', rp_array);
				
				//Apuntar el hash de uc en el array		 
				uc_actuales.push(uc_hash);
				
				//Comprobar si la unidad no esta a 100% y si se va a aprender:
				if (oUnidad.getPercent() != 100) {
					if (oUnidad.getCheckedAdquisicion()) {
						uc_adquirir.push(parseInt(unidad_id));
					}
				}
				
			} else {
			
				//
				// Adquirir. Solo se puede adquirir unidades que no estan marcado como ya aprendido.
				//
				//Apuntar en el array uc_adquirir si hay que adquirirlo 
				if (oUnidad.getCheckedAdquisicion()) {
					uc_adquirir.push(parseInt(unidad_id));
				}
			}
		});

		//Poner los dos arrays en el hash de SNCP
		hash_sncp.set('uc_actuales', uc_actuales);
		hash_sncp.set('uc_adquirir', uc_adquirir);
		
		//Escribir el hash en formato json
		$('CADENA_SNCP').value = Object.toJSON(hash_sncp.toObject());
		
		//Enviar los datos al iframe.
		$('cadena_sncp_form').submit();
	}
});

