/**
 * Objeto cualificacion.
 */
var Cualificacion = Class.create({
    /**
     * Iniciar el objeto.
     */
    initialize: function(h, Buscador){
        this._fields = h;
        this._unidades = null;
        this._loaded = false;
        this.buscador = Buscador;
        this._porcentaje = 0;
		this._checked = false;
		this._checked_adquisicion = false;
		this._porcentaje_adquisicion = 0;
        
        this._init();
    },
    
    /**
     * Acciones del init
     */
    _init: function(){
        this._unidades = new Array();
    },
    
    /**
     * Recoger los datos de un campo
     * @param {String} fieldname
     */
    getField: function(fieldname){
        return this._fields.get(fieldname);
    },
    
    /**
     * Dibujar el html de cualificacion
     */
    drawHTML: function(id_familia){

		//Coger el id
        var id = this.getField('id');
		
		//Crear el elemento
        var div_container = new Element('div', {'class': 'em_familia'});
		
		var sb = new cBdsStringBuilder();	
		sb.append('<div class="em_cuali" id="cualificacion.' + id + '"><div class="em_boton1">');
		sb.append('<img onclick="if ($(\'layer_unidades.' + id + '\').visible()) {$(\'layer_unidades.' + id + '\').hide();this.src=\'images/mas.gif\';} else {$(\'layer_unidades.' + id + '\').show();var cualificacion = window.oBuscador.getCualificacion(' + id + '); if(cualificacion) {cualificacion.open(true)};this.src=\'images/menos.gif\';}" id="toggle_cualificacion.' + id + '" src="images/mas.gif" open_src="images/mas.gif" close_src="images/menos.gif" />');
		sb.append('</div><div class="em_texto txt3">');
		sb.append(this.getField('denominacion'));
		sb.append('</div><div class="em_boton3">');
		sb.append('<img id="img_avance.' + id + '" class="img_avance_' + id + '" src="images/ico_g0.gif" _0pct_src="images/ico_g0.gif" _50pct_src="images/ico_g50.gif" _100pct_src="images/ico_g100.gif" />');
		sb.append('</div></div><div class="em_tabla" style="display:none;" id="layer_unidades.' + id + '"></div>');

		var porcentaje = 0;
		if (this._porcentaje > 0) {
            porcentaje = this._porcentaje;
        }
		sb.append('<input type="text" class="hidden cu_' + id + '" id="cu.' + id + '" name="cu.' + id + '" value="' + porcentaje + '"/></div>');
		$(div_container).update(sb.toString());	
				
     /*   //Crear el elemento
        var div_container = new Element('div', {'class': 'em_familia'});
        var div_cualificacion = new Element('div', {'class': 'em_cuali','id': 'cualificacion.' + id});
        var div_toggle = new Element('div', {'class': 'em_boton1'});
        var img_toggle = new Element('img', {'src': 'images/mas.gif', 'id': 'toggle_cualificacion.' + id,'open_src': 'images/mas.gif','close_src': 'images/menos.gif'});
        var div_nombre = new Element('div', {'class': 'em_texto txt3'}).update(this.getField('denominacion'));
        var div_avance = new Element('div', {'class': 'em_boton3'});
        var img_avance = new Element('img', {'id': 'img_avance.' + id, 'class':'img_avance_' + id, 'src': 'images/ico_g0.gif','_0pct_src': 'images/ico_g0.gif','_50pct_src': 'images/ico_g50.gif','_100pct_src': 'images/ico_g100.gif'});
        var div_unidades = new Element('div', {'class': 'em_tabla','id': 'layer_unidades.' + id});
       
        //Juntar los elementos
        div_container.appendChild(div_cualificacion);
        div_cualificacion.appendChild(div_toggle);
        div_toggle.appendChild(img_toggle);
        div_cualificacion.appendChild(div_nombre);
        div_cualificacion.appendChild(div_avance);
        div_avance.appendChild(img_avance);
        div_container.appendChild(div_unidades);
        
        //Ocultar la capa de unidades
        div_unidades.hide();
      
        
        //Crear y insertar el valor en el hidden input 
        var hidden_input = new Element('input', {
            'type': 'text',
            'class': 'hidden cu_' + id,
            'id': 'cu.' + id,
            'name': 'cu.' + id
        });
        div_container.appendChild(hidden_input);
        if (this._porcentaje > 0) {
            hidden_input.value = this._porcentaje;
        }
        
	    //Crear los handlers
        img_toggle.observe('click', this._toggleHandler.bindAsEventListener(this));	
		*/
		
		
        //Añadir la capa a la lista de cualificaciones
        $('layer_cualificaciones.' + id_familia).appendChild(div_container);
    },
    
	/**
	 * Rellenar el valor en el input con el porcentage de hijos que estan seleccionado
	 */
	updateState : function() {
		
		//console.debug('Cualificacion updateState: ' + this.getField('id'));
		
        //Calcular el porcentaje
        var porcentaje = this.setPercent();
		
		var images = $$('img.img_avance_' + this.getField('id'));
		for (var i = 0, len = images.length; i < len; ++i) {
			var image = images[i];
			switch (porcentaje) {
	            case 0:
	                image.src = image.getAttribute('_0pct_src');
	                break;
	            case 100:
	                image.src = image.getAttribute('_100pct_src');
	                break;
	            default:
	                image.src = image.getAttribute('_50pct_src');
	                break;
	        }
		}

        //Poner el valor de porcentaje en el input y actualizar el check.
        if (porcentaje==0) {
			porcentaje = '';
		}

        //Buscar todos los inputs que contienen los porcentajes
		var inputs = $$('input.cu_' + this.getField('id'));
		for (var i = 0, len = inputs.length; i < len; ++i) {
			var input = inputs[i];			
			input.value = porcentaje;
		}
		
		
//console.debug('Cualificacion updateState: Actualizar la familia ' + this.getField('id_familia'));
		
		//Actualizar la familia
		var familia = this.buscador.getFamilia(this.getField('id_familia'));
		if (familia) {
			familia.updateState();
		}
        
	},
	
	/**
	 * Seleccionar o deseleccionar la cualificacion
	 * @param {Boolean} checked
	 */
	setChecked : function(checked) {
		//Apuntar el valor interno.
		this._checked = checked;
		
		//Añadir o quitarlo del array de competencias
		if (checked) {
			this.buscador.setCompetencia(this.getField('id'));
		} else {
			this.buscador.unsetCompetencia(this.getField('id'));
		}
		
		return this;
	},
    
	/**
	 * Devolver si el unidad esta seleccionado
	 */
	getChecked : function() {
		return this._checked;
	},	
	
    /**
     * Recoger el porcentage de unidades seleccionado es este cualificacion
     */
    setPercent: function(){
        if (this._loaded) {
            var porcentaje_unidades = 0;
            
            //Calcular cuantos realizaciones estan seleccionada 
            var unidades = this._unidades;
            for (var i = 0, len = unidades.length; i < len; ++i) {
                var id = unidades[i];
                var unidad = this.buscador.getUnidad(id);
                porcentaje_unidades = porcentaje_unidades + unidad.getPercent();
            }
            porcentaje = (porcentaje_unidades / unidades.length);
        }
        else {
            porcentaje = 0;
        }
		
		//Si es mas que 0%, marcar el unidad como checked
		this.setChecked(porcentaje != 0);
        
        this._porcentaje = porcentaje;
        return this._porcentaje;
    },

	/**
	 * Devolver el porcentaje
	 */
	getPercent : function() {
		return this._porcentaje;
	},
	
	/**
	 * Recoger los unidades seleccionados
	 */
	getSelectedUnidades : function() {
		var a = new Array();
		for (var i = 0, len = this._unidades.length; i < len; ++i) {
			var id_unidad = this._unidades[i];
			var unidad = this.buscador.getUnidad(id_unidad);
			if (unidad) {
				if (unidad.getChecked()) {
					a.push(unidad);
				}
			}
		}
		return a;
	},
	
    /**
     * El handler cuando se hace click en un toggle de una cualificacion
     * @param {Object} event
     */
    _toggleHandler: function(event){
        //Si se hace click en el, se abre.
        this._toggle();
    },
    
    /**
     * Abrir o cerrar una rama de unidades
     */
    _toggle: function(){
		//Comprobar si esta abiero o cerrado.
        var layer = $('layer_unidades.' + this.getField('id'));
        var toggle = $('toggle_cualificacion.' + this.getField('id'));
        if (layer.visible()) {
            toggle.src = toggle.getAttribute('open_src');
            layer.hide();
        }
        else {
            toggle.src = toggle.getAttribute('close_src');
            this.open(true);
            layer.show();
        }
    },
    
    /**
     * Abrir una familia y mostrar sus unidades
     */
    open: function(async){
        if (!this._loaded) {
            var me = this;
			            
            //Si la familia no esta cargado, carga sus cualificaciones a traves de Ajax
            new Ajax.Request('lib_asp/ajax_query.asp?a=unidades&id_cualificacion=' + me.getField('id'), {
                method: 'get',
				asynchronous: async,
                onCreate: function(){
					$('loading_now').update('cualificación ' + me.getField('id'));
                    $('loader').show();
                },
                onComplete: function(){
					$('loading_now').update('');
                    $('loader').hide();
                },
                onSuccess: function(transport) {
                    me.insertUnidades($H((transport.responseText).evalJSON(true)));
					me.updateState();
                    $('loader').hide();
                }
            });
        }
        this._loaded = true;
    },
    
	/**
	 * Deseleccionar una cualificacion.
	 */
	uncheckComplete : function() {
		var unidades = this._unidades;
        for (var i = 0, len = unidades.length; i < len; ++i) {
            var id = unidades[i];
            var unidad = this.buscador.getUnidad(id);
			
			unidad.setChildrenChecked(false);
			unidad.setChecked(false);
            unidad.updateState(false);
        }
	},
	
    /**
     * Insertar los unidades
     * @param {Object} h
     */
    insertUnidades: function(h){
		var unidades = h.get('uc');
		var realizaciones_criterios = h.get('rp_cr');
		for (var i = 0, len = unidades.length; i < len; ++i) {
            var unidad_hash = $H(unidades[i]);
            var id = unidad_hash.get('id');
            if (this.buscador.getUnidad(id)) {
                var unidad = this.buscador.getUnidad(id);
            } else {
				for (var j = 0, len2 = realizaciones_criterios.length; j < len2; ++j) {
					rc_cr = $H(realizaciones_criterios[j]);
					if (rc_cr.get('mf_' + id)) {
						var modulos = rc_cr.get('mf_' + id);
					}
					if (rc_cr.get('rp_' + id)) {
						var realizaciones = rc_cr.get('rp_' + id);
					}
					if (rc_cr.get('cr_' + id)) {
						var criterios = rc_cr.get('cr_' + id);
					}
				}
                var unidad = new Unidad(unidad_hash, modulos, realizaciones, criterios, this, this.buscador);
				
//console.debug('insertUnidades: ' + id);
				
				this.buscador.insertUnidad(id, unidad);
            }
            
            this._unidades.push(id);
            
            //Dibujar el html de unidad
            unidad.drawHTML(this.getField('id'));
        }
    },
	
	/**
	 * Devolver los unidades checked
	 */
	getUnidades : function() {
		var unidades = new Array();
        for (var i = 0, len = this._unidades.length; i < len; ++i) {
            var id = this._unidades[i];
            var oUnidad = this.buscador.getUnidad(id);
			unidades.push(oUnidad);
        }
		return unidades;
	},
	
	/**
	 * Seleccionar o deseleccionar el check de adquisicion
	 * @param {Boolean} checked
	 * @param {Boolean} actualizar
	 */
	setCheckedAdquisicion : function(adquisicion_checked, actualizar) {
		var unidades = this._unidades;
		if (!adquisicion_checked) {
			for (var i = 0, len = unidades.length; i < len; ++i) {
				var id = unidades[i];
				var unidad = this.buscador.getUnidad(id);
				adquisicion_checked = unidad.getCheckedAdquisicion();
			}
		}
		this._checked_adquisicion = adquisicion_checked;
		
		//Actualizar el SNCP
		if (actualizar) {
			this.buscador.createCadenaSNCP();
		}
		
		return adquisicion_checked;
	},
	
	/**
	 * Devolver si la cualificaciones esta seleccionado
	 */
	getCheckedAdquisicion : function() {
		return this._checked_adquisicion;
	}
});

