/**
 * Objeto unidad.
 */
var Unidad = Class.create({
	/**
	 * Iniciar el objeto.
	 */
	initialize: function(h, modulos, realizaciones, criterios, parent, Buscador) {
		this._fields = h;		
		this._modulos = null;
		this._realizaciones = null;
		this.parent = parent;
		this.buscador = Buscador;
		this._checked = false;
		this._checked_adquisicion = false;
		this._porcentaje = 0;
		
        this._init();
		this.insertModulos(modulos);
        this.insertRealizaciones(realizaciones, criterios);
	},
	
	/**
	 * Acciones del init
	 */
	_init : function() {
		this._realizaciones = new Array();
		this._modulos = new Array();
		if (this._checked) {
			this._porcentaje = 100;
		}
	},

	/**
	 * Insertar los realizaciones.
	 * @param {Object} realizaciones
	 */
	insertRealizaciones : function(realizaciones, criterios) {
		for (var i = 0, len = realizaciones.length; i < len; ++i) {
			var realizacion = new Realizacion($H(realizaciones[i]), this.getChecked(), criterios, this, this.buscador);
			var id = realizacion.getField('id');
//console.debug('insertRealizaciones: ' + id + ' - ' + this.getChecked());
			this._realizaciones.push(id);
			this.buscador.insertRealizacion(id, realizacion);
		}
	},
	
	/**
	 * Insertar los modulos.
	 * @param {Object} modulos
	 */
	insertModulos : function(modulos) {
		for (var i = 0, len = modulos.length; i < len; ++i) {
			var modulo = $H(modulos[i]);
			this._modulos.push(modulo.get('id'));
		}
	},

	/**
	 * Recoger el modulo de unidad. Como que en teoria siempre tiene 1, devolver el primer registro en el array
	 * @param {String} fieldname
	 */
	getModulo : function() {
		return this._modulos.first();
	},
		
	/**
	 * 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) {
		/*
		 * Dibujar la tabla
		 */
		//Coger el id
		var id = id_cualificacion + '_' + this.getField('id');
		var class_id = this.getField('id');
		
		//Crear el elemento
		var div = new Element('div', {'class': 'container'});
		var div_line = new Element('div', {'class': 'line unidadtr txt2'});
		var div_toggle = new Element('div', {'class': 'left unidad_toggle'});		
		var div_checkbox = new Element('div', {'class': 'left checkbox'});		
		var div_title = new Element('div', {'class': 'left unidad_title'}).update(this.getField('denominacion'));			
		var img_toggle = new Element('img', { 'src': 'images/c3.gif', 'id': 'toggle_unidad.' + id, 'open_src': 'images/c3.gif', 'close_src': 'images/e3.gif'});
		var checkbox = new Element('input', {'type':'checkbox', 'class': 'checkbox_unidad_' + class_id, 'id': 'checkbox_unidad.' + id, 'name': 'checkbox_unidad.' + id, 'value': id});
		var div_realizaciones = new Element('div', { 'id': 'layer_realizaciones.' + id});
		
		//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_realizaciones);

		//Ocultar la capa de unidades
		div_realizaciones.hide();
		
		//Crear los handlers
		checkbox.observe('click', this._checkHandler.bindAsEventListener(this, id));
		img_toggle.observe('click', this._toggleHandler.bindAsEventListener(this, id));

		//Crear y insertar el valor en el hidden input 
		var hidden_input = new Element('input', {'type':'text', 'class': 'hidden uc_' + class_id, 'id': 'uc.' + id, 'name': 'uc.' + id});
		div_line.appendChild(hidden_input);
		if (this._porcentaje>0) {
			hidden_input.value = this._porcentaje;
		}
		
		//Añadir la capa a la lista de cualificaciones
		$('layer_unidades.' + id_cualificacion).appendChild(div);
		
		//Poner el checkbox checked o no checked (segun el valor en this._checked) 
		checkbox.checked = this._checked;
		
		var id_array = id.split('_');
		var id_cualificacion = id_array[0];
		
		//Coger los ids
		for (var i = 0, len = this._realizaciones.length; i < len; ++i) {
			var id = this._realizaciones[i];
			realizacion = this.buscador.getRealizacion(id);
			realizacion.drawHTML(id_cualificacion, this.getField('id'));
		}
	},

	/**
	 * El handler cuando se hace click en el check
	 * @param {Object} event
	 */
	_checkHandler : function(event) {		
		var id = arguments[1];
		var checkbox = $('checkbox_unidad.' + id);
		var checked = checkbox.checked;		
		
		//Poner el objeto como selececcionado o no seleccionado
		this.setChildrenChecked(checked);
		this.setChecked(checked);
		this.updateState(checked);
				
		//Actualizar el SNCP
		this.buscador.createCadenaSNCP();
	},
	
	/**
	 * Actualizar los checkes de los realizaciones
	 * @param {Object} checked
	 */
	setChildrenChecked : function(checked) {
		//Si ya tiene sus realizaciones cargado, ponerlos seleccionado o no seleccionado (segun el valor en el checkbox).
		for (var i = 0, len = this._realizaciones.length; i < len; ++i) {
			var realizacion = this.buscador.getRealizacion(this._realizaciones[i]);
			realizacion.inheritChecked(checked);
			realizacion.setPercent();
		}
	},

	/**
	 * Seleccionar o deseleccionar la unidad
	 * @param {Boolean} checked
	 */
	setChecked : function(checked) {
		this._checked = checked;
		return this;
	},
	
	/**
	 * Devolver si el unidad esta seleccionado
	 */
	getChecked : function() {
		return this._checked;
	},
	
	/**
	 * Seleccionar o deseleccionar la unidad para 
	 * @param {Boolean} checked
	 */
	setCheckedAdquisicion : function(checked, actualizar) {
		this._checked_adquisicion = checked;
		
		if (arguments.length == 1) {
			actualizar = true;
		}
		
		//Actualizar los cualificaciones
		var cualificaciones = this.buscador.getUc_cu(this.getField('id'));
		for (var i = 0, len = cualificaciones.length; i < len; ++i) {
			var id_cualificacion = cualificaciones[i];
			var cualificacion = this.buscador.getCualificacion(id_cualificacion);
			if (cualificacion) {
				cualificacion.setCheckedAdquisicion(checked, actualizar);
			}
		}
		return this;
	},
	
	/**
	 * Devolver si el unidad esta seleccionado
	 */
	getCheckedAdquisicion : function() {
		if (this.getPercent()==100) {
			this._checked_adquisicion = false;
		}
		return this._checked_adquisicion;
	},
	
	/**
	 * Seleccionar los realizaciones que se va a aprender.
	 */
	setCheckedAprender : function() {
		var checkboxes = $$('.checkbox_unidad_' + this.getField('id'));
		for (var i = 0, len = checkboxes.length; i < len; ++i) {
			var checkbox = checkboxes[i];
			checkbox.parentNode.parentNode.setStyle({
				'background': '#ffff00',
				'color': '#000000'
			})
			var checkbox_id = checkbox.id.split('.')[1];
			var unidad_id = checkbox_id.split('_')[0];
			var img_avance = $('img_avance.' + unidad_id);
			if (img_avance) {
				var img_avance_src_array = img_avance.src.split('/images/');
				if (img_avance_src_array.length > 0) {
					var img_avance_src = 'images/' + img_avance_src_array[1];
				}				
				
				switch (img_avance_src) {
					case 'images/ico_g100.gif':
						break;
					case 'images/ico_g5050.gif':
						img_avance.src = 'images/ico_g5050.gif';
						break;
					case 'images/ico_g50.gif':
						img_avance.src = 'images/ico_g5050.gif';
						break;
					default:
						img_avance.src = 'images/ico_g0100.gif';
						break;
				}				
			}
			var familia_node = $('cualificacion.' + unidad_id).parentNode.parentNode;
			if (familia_node) {
				var familia_id = familia_node.id.split('.')[1];	
				var fam_img_avance = $('img_fam_avance.' + familia_id);
				if (fam_img_avance) {
					
					var fam_img_avance_src_array = fam_img_avance.src.split('/images/');
					if (fam_img_avance_src_array.length > 0) {
						var fam_img_avance_src = 'images/' + fam_img_avance_src_array[1];
					}	
					
					switch (fam_img_avance_src) {
						case 'images/ico_p100.gif':
							break;
						case 'images/ico_p5050.gif':
							fam_img_avance.src = 'images/ico_p5050.gif';
							break;
						case 'images/ico_p50.gif':
							fam_img_avance.src = 'images/ico_p5050.gif';
							break;
						default:
							fam_img_avance.src = 'images/ico_p0100.gif';
							break;
					}				
				}
			}
		}
		
	},

	/**
	 * Rellenar el valor en el input con el porcentage de hijos que estan seleccionado
	 * @param {Boolean} force_checked
	 */
	updateState : function(force_checked) {
		var porcentaje;
        if (arguments.length == 1) {
			force_checked ? porcentaje = 100 : porcentaje = 0;
			this._porcentaje = porcentaje;
			this.setChecked(porcentaje != 0);
		} else {
			porcentaje = this.setPercent();
		}
        
        //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.uc_' + 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
		var checkboxes = $$('input.checkbox_unidad_' + this.getField('id'));
		for (var i = 0, len = checkboxes.length; i < len; ++i) {
			var checkbox = checkboxes[i];
			checkbox.checked = this.getChecked();
		}
		
		//Actualizar los cualificaciones
		var cualificaciones = this.buscador.getUc_cu(this.getField('id'));
		for (var i = 0, len = cualificaciones.length; i < len; ++i) {
			var id_cualificacion = cualificaciones[i];
			var cualificacion = this.buscador.getCualificacion(id_cualificacion);
			if (cualificacion) {
				cualificacion.open(false);
				cualificacion.updateState();
			}
		}
		
		//Actualizar los imagenes
		var images = $$('img.img_unidad_avance_' + this.getField('id'));
		for (var i = 0, len = images.length; i < len; ++i) {
			var image = images[i];
			//Coger el src correcto
			switch (porcentaje) {
				case '':
					if (this.getCheckedAdquisicion()) {
						image.src = image.getAttribute('_0100pct_src');
					} else {
						image.src = image.getAttribute('_0pct_src');
					}
					break;
				case 100:
					image.src = image.getAttribute('_100pct_src');
					break;
				default:
					if (this.getCheckedAdquisicion()) {
						image.src = image.getAttribute('_5050pct_src');
					} else {
						image.src = image.getAttribute('_50pct_src');
					}
					break
			}
		}		
	},
	
	/**
	 * Recoger el porcentage de unidades seleccionado es este cualificacion
	 */
	setPercent : function() {
		var contador = 0;
		var porcentaje_realizaciones = 0;
		
		//Calcular cuantos realizaciones estan seleccionada 
		for (var i = 0, len = this._realizaciones.length; i < len; ++i) {
			var realizacion = this.buscador.getRealizacion(this._realizaciones[i]);
			porcentaje_realizaciones = porcentaje_realizaciones + realizacion.getPercent()
			contador++;
		}
		
		porcentaje = (porcentaje_realizaciones / contador);
		
		//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 realizaciones seleccionados
	 */
	getSelectedRealizaciones : function() {
		var a = new Array();
		for (var i = 0, len = this._realizaciones.length; i < len; ++i) {
			var id_realizacion = this._realizaciones[i];
			var realizacion = this.buscador.getRealizacion(id_realizacion);
			if (realizacion) {
				if (realizacion.getChecked()) {
					a.push(realizacion);
				}
			}
		}
		return a;
	},
	
	/**
	 * El handler cuando se hace click en un toggle de una cualificacion
	 * @param {Object} event
	 */
	_toggleHandler : function(event) {
		var id = arguments[1];
				
		//Si se hace click en el, se abre.
		this._toggle(id);
	},
	
	/**
	 * Abrir o cerrar una rama familia
	 */
	_toggle : function(id) {
		//Comprobar si esta abiero o cerrado.
		var layer = $('layer_realizaciones.' + id);
		var toggle = $('toggle_unidad.' + id);

		if (layer.visible()) {
			toggle.src = toggle.getAttribute('open_src');
			layer.hide();
		} else {
			toggle.src = toggle.getAttribute('close_src');
			layer.show();
		}
	},
	
	/**
	 * Abrir el popup con informacion sobre la unidad
	 */
	showInfoPopup : function(id_cualificacion) {
		//Si ya existe, solo mostrarlo. Sino, crearlo.
		var id_popup = 'unidad_info_popup.' + this.getField('id');
		if ($(id_popup)) {
			$(id_popup).show();
		} else {
			//Crear los elementos 
			var popup_div = new Element('div', {'id': id_popup, 'class': 'unidad_info_popup'});
			var popup_title = new Element('div', {'class': 'ficha_content1 txt2'}).update(this.getField('denominacion'));
			var popup_ficha = new Element('div', {'class': 'ficha_content2 txt2a', 'id': 'info_popup_layer_realizaciones.' + id_cualificacion + '_' + this.getField('id')});
			var boton_cerrar = new Element('button', {'class': 'temp_boton_style'}).update('Cerrar');
			var popup_footer = new Element('div', {'class': 'ficha_content3'});
	
			//Juntar los elementos
			popup_div.appendChild(popup_title);
			popup_div.appendChild(popup_ficha);
			popup_div.appendChild(popup_footer);
			popup_footer.appendChild(boton_cerrar);
			
			//Poner el handler
			boton_cerrar.observe('click', this._closeInfoPopupHandler.bindAsEventListener(this, id_popup));
			
			//Añadir la capa al container_home
			$('container_home').appendChild(popup_div);
			
			//Dibujar las realizaciones
			for (var i = 0, len = this._realizaciones.length; i < len; ++i) {
				var id = this._realizaciones[i];
				oRealizacion = this.buscador.getRealizacion(id);
				oRealizacion.drawInfoPopupHTML(id_cualificacion, this.getField('id'));
			}						
		}
		this.buscador.showPopupBlocker();
	},	
	
	/**
	 * Cerrar un popup
	 * @param {Object} event
	 */
	_closeInfoPopupHandler : function(event) {
		id_popup = arguments[1];
		if($(id_popup)) {
			$(id_popup).hide();
		}
		this.buscador.hidePopupBlocker();
	},
	
	/**
	 * Modificar si se va a aprender este unidad o no.
	 * @param {Object} event
	 */
	_modifyCheckedAdquisicion : function(event) {
		var radio = arguments[1];
		this.setCheckedAdquisicion(radio.checked);
		this.updateState();	
	},
	
	/**
	 * Abrir el popup con informacion sobre la unidad
	 */
	showConocimientoPopup : function(id_cualificacion) {
		//Si ya existe, solo mostrarlo. Sino, crearlo.
		var id_popup = 'unidad_conocimiento_popup.' + this.getField('id');
		if ($(id_popup)) {
			$(id_popup).show();
		} else {
			//Crear los elementos 
			var layer_id_prefix = 'resumen.';
			var popup_div = new Element('div', {'id': id_popup, 'class': 'unidad_info_popup'});
			var popup_title = new Element('div', {'class': 'ficha_content1 txt2'}).update(this.getField('denominacion'));
			var div_radio = new Element('div', {'class': 'container radio_adquirir'});
			var div_radio_top = new Element('div');
			var div_radio_bottom = new Element('div');
			var label_si = new Element('label', {'for' : layer_id_prefix + 'radio.si.' + this.getField('id'), 'class': 'txt3'}).update(' Adquirir');
			var label_no = new Element('label', {'for' : layer_id_prefix + 'radio.no.' + this.getField('id'), 'class': 'txt3'}).update(' No adquirir');
			var radio_si = new Element('input', {'type' : 'radio', 'name': layer_id_prefix + 'radio.' + this.getField('id'), 'id': layer_id_prefix + 'radio.si.' + this.getField('id'), 'value': '1'});
			var radio_no = new Element('input', {'type' : 'radio', 'name': layer_id_prefix + 'radio.' + this.getField('id'), 'id': layer_id_prefix + 'radio.no.' + this.getField('id'), 'value': '0'});			
			var popup_ficha = new Element('div', {'class': 'ficha_content_paso3 txt2a', 'id': layer_id_prefix + 'layer_realizaciones.' + id_cualificacion + '_' + this.getField('id')});
			var boton_cerrar = new Element('button', {'class': 'temp_boton_style'}).update('Cerrar');
			var popup_footer = new Element('div', {'class': 'ficha_content3'});
	
			//Juntar los elementos
			div_radio.appendChild(div_radio_top);			
			div_radio_top.appendChild(radio_si);
			div_radio_top.appendChild(label_si);
			div_radio.appendChild(div_radio_bottom);
			div_radio_bottom.appendChild(radio_no);
			div_radio_bottom.appendChild(label_no);		
			
			popup_div.appendChild(popup_title);			
			popup_div.appendChild(popup_ficha);			
			popup_div.appendChild(div_radio);
			popup_div.appendChild(popup_footer);
			popup_footer.appendChild(boton_cerrar);
			
			//Poner los handlers
			boton_cerrar.observe('click', this._closeInfoPopupHandler.bindAsEventListener(this, id_popup));
			radio_si.observe('click', this._modifyCheckedAdquisicion.bindAsEventListener(this, radio_si));
			radio_no.observe('click', this._modifyCheckedAdquisicion.bindAsEventListener(this, radio_si));
			
			if (this.getCheckedAdquisicion()) {
				radio_si.checked = true;
			} else {
				radio_no.checked = true;
			}
			
			//Añadir la capa al container_home
			$('container_home').appendChild(popup_div);
			
			//Dibujar las realizaciones
			for (var i = 0, len = this._realizaciones.length; i < len; ++i) {
				var id = this._realizaciones[i];
				oRealizacion = this.buscador.getRealizacion(id);
				oRealizacion.drawHTML(id_cualificacion, this.getField('id'), layer_id_prefix);
			}						
		}
		this.buscador.showPopupBlocker();
	}
});
