/**
 * Objeto realizacion.
 */
var Realizacion = Class.create({
    /**
     * Iniciar el objeto.
     */
    initialize: function(h, checked, criterios, parent, Buscador){
        this._fields = h;
        this._criterios = null;
        this._checked = checked;
        this._porcentaje = 0;
        this.parent = parent;
        this.buscador = Buscador;
		this.timeout = false;
        
        this._init();
        this.insertCriterios(criterios);
    },
    
    /**
     * Acciones del init
     */
    _init: function(){
        this._criterios = new Array();
        if (this._checked) {
            this._porcentaje = 100;
        }
    },
    
    /**
     * Insertar los criterios
     * @param {Object} criterios
     */
    insertCriterios: function(criterios){
        for (var i = 0, len = criterios.length; i < len; ++i) {
            var criterios_array = criterios[i];
            for (var j = 0, len2 = criterios_array.length; j < len2; ++j) {
				var criterio_hash = $H(criterios_array[j]);
				if (criterio_hash.get('id_rp') == this.getField('id')) {
					var criterio = new Criterio(criterio_hash, this.getChecked(), this.buscador);
					var id = criterio.getField('id');
					//console.debug('<span>insertCriterios</span>: ' + id + ' - ' + this.getChecked());
					this._criterios.push(id);
					this.buscador.insertCriterio(id, criterio);
				}
            }
        }
    },

	/**
	 * Recoger los criterios seleccionados
	 */
	getSelectedCriterios : function() {
		var a = new Array();
		for (var i = 0, len = this._criterios.length; i < len; ++i) {
			var id_criterio = this._criterios[i];
			var oCriterio = this.buscador.getCriterio(id_criterio);
			if (oCriterio) {
				if (oCriterio.getChecked()) {
					a.push(oCriterio);
				}
			}
		}
		return a;
	},
    
    /**
     * 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_cualificacion, id_unidad, prefix){
		if (arguments.length!=3) {
			prefix = '';
		} else {
			//Dibjuar el html de cualificacion que contiene  
			this.drawHTML(id_cualificacion, id_unidad);
		}
		
		//Coger el id
		var class_id = this.getField('id');
		var id = id_cualificacion + '_' + id_unidad + '_' + class_id;
				
		var checked_string = '';
		if (this._checked) {
			var checked_string = 'checked="checked" ';
		}
		
		hidden_input_value = '';
		if (this._porcentaje > 0) {
            hidden_input_value = this._porcentaje;
        }
		
		/*var html_string = '<div class="line">';
		html_string += '<div class="left realizacion_toggle">';
		html_string += '<img onclick="var realizacion = window.oBuscador.getRealizacion(' + class_id + ');if(realizacion) {realizacion._toggle(\'' + id + '\',\'form\',\'' + prefix + '\')}" close_src="images/e3.gif" open_src="images/c3.gif" id="' + prefix + 'toggle_realizacion.' + id + '" src="images/c3.gif">';
		html_string += '</div>';
		html_string += '<div class="left checkbox">';
		html_string += '<input onclick="var realizacion = window.oBuscador.getRealizacion(' + class_id + ');if(realizacion) {realizacion.onclickCheck(\'' + id + '\',\'' + prefix + '\')}"' + checked_string + 'value="' + id + '" name="checkbox_realizacion.' + id + '" id="' + prefix + 'checkbox_realizacion.' + id + '" class="checkbox_realizacion_' + class_id + '" type="checkbox">';
		html_string += '</div>';
		html_string += '<div class="left realizacion_title">' + this.getField('realizacion') + '</div>';
		html_string += '<input name="rp.' + id + '" id="' + prefix + 'rp.' + id + '" class="hidden rp_' + class_id + '" type="text" value="' + hidden_input_value + '">';
		html_string += '</div>';
		html_string += '<div style="display: none;" class="line_popup_subcontent left" id="' + prefix + 'layer_criterios.' + id + '">';
		html_string += '</div>';*/
		
		var html_string = '<div class="line"><div class="left realizacion_toggle"><img onclick="var realizacion = window.oBuscador.getRealizacion(' + class_id + ');if(realizacion) {realizacion._toggle(\'' + id + '\',\'form\',\'' + prefix + '\')}" close_src="images/e3.gif" open_src="images/c3.gif" id="' + prefix + 'toggle_realizacion.' + id + '" src="images/c3.gif"></div><div class="left checkbox"><input onclick="var realizacion = window.oBuscador.getRealizacion(' + class_id + ');if(realizacion) {realizacion.onclickCheck(\'' + id + '\',\'' + prefix + '\')}"' + checked_string + 'value="' + id + '" name="checkbox_realizacion.' + id + '" id="' + prefix + 'checkbox_realizacion.' + id + '" class="checkbox_realizacion_' + class_id + '" type="checkbox"></div><div class="left realizacion_title">' + this.getField('realizacion') + '</div><input name="rp.' + id + '" id="' + prefix + 'rp.' + id + '" class="hidden rp_' + class_id + '" type="text" value="' + hidden_input_value + '"></div><div style="display: none;" class="line_popup_subcontent left" id="' + prefix + 'layer_criterios.' + id + '"></div>';
		var div = new Element('div', {'class': 'realizaciontr txt2a container'});
		div.innerHTML = html_string; 
		$(prefix + 'layer_realizaciones.' + id_cualificacion + '_' + id_unidad).appendChild(div);
		
		//Antes, con elementos.
		/*//Crear el elemento
		var div = new Element('div', {'class': 'realizaciontr txt2a container'});
        var div_line = new Element('div', {'class': 'line'});
        var div_toggle = new Element('div', {'class': 'left realizacion_toggle'});
        var div_checkbox = new Element('div', {'class': 'left checkbox'});
        var div_title = new Element('div', {'class': 'left realizacion_title'}).update(this.getField('realizacion'));
        var img_toggle = new Element('img', {'src': 'images/c3.gif','id': prefix + 'toggle_realizacion.' + id,'open_src': 'images/c3.gif','close_src': 'images/e3.gif'});
        var checkbox = new Element('input', {'type': 'checkbox','class': 'checkbox_realizacion_' + class_id, 'id': prefix + 'checkbox_realizacion.' + id,'name': 'checkbox_realizacion.' + id,'value': id});
		var div_criterios = new Element('div', {'id': prefix + 'layer_criterios.' + id,'class': 'line_popup_subcontent left'});
        
        //Juntar los elementos
        div.appendChild(div_line);
        div_line.appendChild(div_toggle);
        div_line.appendChild(div_checkbox);
        div_line.appendChild(div_title);
        div_toggle.appendChild(img_toggle);
        div_checkbox.appendChild(checkbox);
        div.appendChild(div_criterios);
        
        //Ocultar la capa de unidades
        div_criterios.hide();
        
        //Crear los handlers
        checkbox.observe('click', this._checkHandler.bindAsEventListener(this, id, prefix));
        img_toggle.observe('click', this._toggleHandler.bindAsEventListener(this, id, 'form', prefix));
        
        //Crear y insertar el valor en el hidden input 
        var hidden_input = new Element('input', {
            'type': 'text',
            'class': 'hidden rp_' + class_id,
            'id': prefix + 'rp.' + id,
            'name': 'rp.' + id
        });
        div_line.appendChild(hidden_input);
        if (this._porcentaje > 0) {
            hidden_input.value = this._porcentaje;
        }
        
        //Añadir la capa a la lista de cualificaciones
        $(prefix + 'layer_realizaciones.' + id_cualificacion + '_' + id_unidad).appendChild(div);
		
		//Poner el checkbox checked o no checked (segun el valor en this._checked) 
		checkbox.checked = this._checked;*/
		
		//Dibujar los criterios
		for (var i = 0, len = this._criterios.length; i < len; ++i) {
			var id = this._criterios[i];
			criterio = this.buscador.getCriterio(id);
			criterio.drawHTML(id_cualificacion, id_unidad, class_id, prefix);
		}
    },
	
   /**
     * Dibujar el html de popup de informacion
     */
    drawInfoPopupHTML: function(id_cualificacion, id_unidad){
		//Coger el id
		var id = id_cualificacion + '_' + id_unidad + '_' + this.getField('id');
		
        //Crear el elemento
        var div = new Element('div', {'class': 'realizaciontr_topline txt2a container'});
        var div_line = new Element('div', {'class': 'line'});
        var div_toggle = new Element('div', {'class': 'left realizacion_toggle'});
        var div_title = new Element('div', {'class': 'left realizacion_title_infopopup'}).update(this.getField('realizacion'));
        var img_toggle = new Element('img', {'src': 'images/c3.gif','id': 'infopopup_toggle_realizacion.' + id,'open_src': 'images/c3.gif','close_src': 'images/e3.gif'});
        var div_criterios = new Element('div', {'id': 'infopopup_layer_criterios.' + id,'class': 'line_popup_subcontent left'});
        
        //Juntar los elementos
        div.appendChild(div_line);
        div_line.appendChild(div_toggle);
        div_line.appendChild(div_title);
        div_toggle.appendChild(img_toggle);
        div.appendChild(div_criterios);
        
        //Ocultar la capa de unidades
        div_criterios.hide();
        
        //Crear los handlers
        img_toggle.observe('click', this._toggleHandler.bindAsEventListener(this, id, 'infopopup', ''));
        
        //Añadir la capa a la lista de cualificaciones
        $('info_popup_layer_realizaciones.' + id_cualificacion + '_' + id_unidad).appendChild(div);
		
    },
    
    /**
     * El handler cuando se hace click en el check
     * @param {Object} event
     */
    _checkHandler: function(event){
        var id = arguments[1];
		var prefix = arguments[2];
        var checkbox = $(prefix + 'checkbox_realizacion.' + id);
        var checked = checkbox.checked;

        for (var i = 0, len = this._criterios.length; i < len; ++i) {
			criterio = this.buscador.getCriterio(this._criterios[i]);
			criterio.inheritChecked(checked);
        }
        
        //Poner el objeto como selececcionado o no seleccionado
        this.setChecked(checked);
        this.updateState(checked);
		
		//Actualizar el SNCP
		this.buscador.createCadenaSNCP();
    },
	
    /**
     * El handler cuando se hace click en el check
     * @param {Object} event
     */
    onclickCheck: function(id, prefix){
        var checkbox = $(prefix + 'checkbox_realizacion.' + id);
        var checked = checkbox.checked;

        for (var i = 0, len = this._criterios.length; i < len; ++i) {
			criterio = this.buscador.getCriterio(this._criterios[i]);
			criterio.inheritChecked(checked);
        }
        
        //Poner el objeto como selececcionado o no seleccionado
        this.setChecked(checked);
        this.updateState(checked);
		
		//Actualizar el SNCP
		this.buscador.createCadenaSNCP();
    },
    
    /**
     * Rellenar el valor en el input con el porcentage de hijos que estan seleccionado
     * @param {Boolean} force_checked
     */
	updateState : function(force_checked, force_direction) {
		
		//console.debug('Realizacion.updateState(' + force_checked + ') id:' + this.getField('id') + ' direction:' + force_direction);
		
		var porcentaje;
		if (arguments.length == 1) {
			force_checked ? porcentaje = 100 : porcentaje = 0;
			this._porcentaje = porcentaje;
		} else {
			porcentaje = this.setPercent();
		}
		this.setChecked(porcentaje != 0);
		
		var direction = 'down';
		if (arguments.length == 2) {
			direction = force_direction;
		}
		
        //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.rp_' + this.getField('id'));
		for (var i = 0, len = inputs.length; i < len; ++i) {
			var input = inputs[i];			
			input.value = porcentaje;
		}
		
		//Buscar todos los checks para marcarlos/desmarcarlos
		if (direction == 'down') {
			var checkboxes = $$('input.checkbox_realizacion_' + this.getField('id'));
			for (var i = 0, len = checkboxes.length; i < len; ++i) {
				var checkbox = checkboxes[i];
				checkbox.checked = this.getChecked();
				
				//Y tambien para actualizar los padres
				var id_array = checkbox.id.split('.')[1].split('_');
				var id_unidad = parseInt(id_array[1]);
				var unidad = this.buscador.getUnidad(id_unidad);
				if (unidad) {
					unidad.updateState();
				}
			}
		}
	},
	
    /**
     * Recoger el porcentage de unidades seleccionado es este cualificacion
	 */
    setPercent: function(){
		var contador = 0;
        var checked_contador = 0;
        
        for (var i = 0, len = this._criterios.length; i < len; ++i) {
            var criterio = this.buscador.getCriterio(this._criterios[i]);
            if (criterio.getChecked()) {
                checked_contador++;
            }
            contador++;
        }
        porcentaje = (checked_contador / contador) * 100;
        
        this._porcentaje = porcentaje;
        return this._porcentaje;
    },
    
    /**
     * Devolver el porcentaje
     */
    getPercent: function(){
        return this._porcentaje;
    },
    
    /**
     * Seleccionar o deseleccionar la unidad
     * @param {Boolean} checked
     */
    setChecked: function(checked){
		//En la vista tiene que seleccionar o deseleccionar todos
		var checkboxes = $$('input.checkbox_realizacion_' + this.getField('id'));
		for (var i = 0, len = checkboxes.length; i < len; ++i) {
			checkboxes[i].checked = checked;
		}
		
        this._checked = checked;
        return this;
    },
    
    /**
     * Seleccionar o deseleccionar la unidad
     * @param {Boolean} checked
     */
    inheritChecked: function(checked){
		this.updateState(checked);
		
		for (var i = 0, len = this._criterios.length; i < len; ++i) {
            criterio = this.buscador.getCriterio(this._criterios[i]);
            criterio.inheritChecked(checked);
		}
        return this;
    },
	
    /**
     * Seleccionar o deseleccionar la unidad. Especial para precargar en el resumen
     * @param {Boolean} checked
     */
    inheritCheckedResumen: function(checked){
		this.updateState(checked);
		
		for (var i = 0, len = this._criterios.length; i < len; ++i) {
            criterio = this.buscador.getCriterio(this._criterios[i]);
            criterio.inheritCheckedResumen(checked);
		}
        return this;
    },
	
    /**
     * Devolver si el unidad esta seleccionado
     */
    getChecked: function(){
        return this._checked;
    },
    
    /**
     * El handler cuando se hace click en un toggle de una cualificacion
     * @param {Object} event
     */
    _toggleHandler: function(event){
		var id = arguments[1];
		var type = arguments[2];
		var prefix = arguments[3];
				
		//Si se hace click en el, se abre.
		this._toggle(id, type, prefix);
    },
    
    /**
     * Abrir o cerrar una rama de criterios
     */
    _toggle: function(id, type, prefix){
        //Comprobar el tipo
		switch (type) {
			case 'form':
		        var layer = $(prefix + 'layer_criterios.' + id);
		        var toggle = $(prefix + 'toggle_realizacion.' + id);
				break;
			case 'infopopup':
				var layer = $('infopopup_layer_criterios.' + id);
        		var toggle = $('infopopup_toggle_realizacion.' + id);
				break;
			default:
				return;
		}
       
	    //Comprobar si esta abiero o cerrado.
        if (layer.visible()) {
            toggle.src = toggle.getAttribute('open_src');
            layer.hide();
        }
        else {
            toggle.src = toggle.getAttribute('close_src');
            layer.show();
        }
        
        //Dibujar el html de criterio.
		if (layer.innerHTML == '') {
			var id_array = id.split('_');
			var id_cualificacion = id_array[0];
			var id_unidad = id_array[1];
			
			//Coger los ids
			for (var i = 0, len = this._criterios.length; i < len; ++i) {
				var id = this._criterios[i];
				criterio = this.buscador.getCriterio(id);
				
				switch (type) {
					case 'form':
						criterio.drawHTML(id_cualificacion, id_unidad, this.getField('id'), prefix);
						break;
					case 'infopopup':
						criterio.drawInfoPopupHTML(id_cualificacion, id_unidad, this.getField('id'));
						break;
				}	
			}
		}
    }
});

