<?php
/**
 * Clase que representa a una opción de menú con permisos.
 **/
class OpcionMenuBtMalaga extends ComponenteBtMalaga {
	static $db = array(
	                                   'Nombre' => 'Text',
	                                   'Texto' => 'Text',
	                                   'Descripcion' => 'Text',
	                                   'PosicionMenu' => 'Float',
                                         'Ayuda' => 'Text'
					  );
					  
    //aunque sean relaciones para poder editar con Picasso tienen que estar aquí					  
	static $has_many = array(
	                                                 'Imagen' => 'ImagenBtMalaga',
	                                                 'Accion' => 'AccionBtMalaga'
				                       );

	static $has_one = array(
						     'NivelSuperior' => 'OpcionMenuBtMalaga'	
	                                            );
	                                            
	/**
	 * constante para indicar la acción de recargar las posiciones
	 * al cambiar el padre.
	 **/
	const ACCION_RECARGAR_POSICION_OPCION = 'recargarposicionopcion';	
	
	/**
	 * Dirección de la opción.
	 **/
	private $direccionOpcion;

    /**
     * Devuelve el nombre del componente 
     **/
    public function getNombreComponente() {
        return 'opci&oacute;n de men&uacute;';
    }

	
	/**
	 * Devuelve la dirección de la opción.
	 **/
	public function DireccionOpcion() {
		return $this->direccionOpcion;
	}                                            
	
	/**
	 * Asigna la dirección de la opción.
	 **/
	public function setDireccionOpcion($direccionOpcion) {
		$this->direccionOpcion = $direccionOpcion;
	}
	
	/**
	 * Función que indica los campos para poner en el grid de listado.
	 * Nota: debe ser sobreescrito por cada componentes.
	 **/
	protected function camposGrid() {
		$resultado = parent::camposGrid();
		$resultado .= '{"Nombre": "Texto", "Columna":"Texto", "Ordenacion":"str", "Tipo":"ro", "Tamano":200, "Filtro":"#text_filter", "Alineacion":"left"},';
		$resultado .= '{"Nombre": "Descripción", "Columna":"Descripcion", "Ordenacion":"str", "Tipo":"ro", "Tamano":"*", "Filtro":"#text_filter", "Alineacion":"left"}';
		return $resultado;
	}
	
	/**
	 * Función que devuelve el JSON para pintar el árbol de jerarquias.
	 **/
	private function getArbolJerarquias() {
		$opciones = DataObject::get('OpcionMenuBtMalaga');
		$gruposOpciones = $opciones->groupBy('NivelSuperiorID');
		foreach ($gruposOpciones as $key => $grupoOpciones) {
			$grupoOpciones->sort('PosicionmMenu');
		}
		//nivel 0
		$arbol = '{id:0,item:[{id:"Root",text:"Root"';
		if (!$this->NivelSuperiorID) {
			$arbol .= ',select:1';
			$this->nombrePadre = 'Root';
		}
		$arbol .= ',item:[';
		//nivel 1
		foreach ($gruposOpciones[0] as $opcionesN1) {
		        if ($this->ID != $opcionesN1->ID) {
			  $arbol .= '{text:"'.$opcionesN1->Texto.'",id:'.$opcionesN1->ID;
			  if ($opcionesN1->ID == $this->NivelSuperiorID) {
			  	$arbol .= ',select:1';
				$this->nombrePadre = $opcionesN1->Nombre;
			  }
			  $arbol .= '},';
			}  
		}
		$arbol .= ']}]}';
		return $arbol;
	}

	/**
	 * Función que devuelve array para las posiciones.
	 **/
	private function getArrayPosiciones() {
	    $resultado = array();
	    if ($this->NivelSuperiorID != null) {
		$opciones = DataObject::get('OpcionMenuBtMalaga', 'NivelSuperiorID = '.$this->NivelSuperiorID);
		//si la opción actual no esta en los resultados es porque se ha cambiado
		//dinámicamente, por tanto se mete.
		if ($opciones != null) {
			$encontrado = false;
			foreach ($opciones as $opcion) {
				if ($opcion->ID == $this->ID) {
					$encontrado = true;
					break;
				}
			} 	
			if (!$encontrado) {
				$opciones->push($this);
			}
		} else {
			$opciones = new DataObjectSet();
			$opciones->push($this);
		}		
		if ($opciones->Count() == 1) {
			$resultado[1] = 'Primera posición';
		} else {
			$nuevo = false;
			$datos = $this->Pagina()->Datos();			
			if ((isset($datos[ControlPicasso::PARAMETRO_NUEVO_RECURSO])) && ($datos[ControlPicasso::PARAMETRO_NUEVO_RECURSO] == 'si')) {
				$nuevo = true;
				$this->PosicionMenu = $opciones->Count();
				//refresca las opciones
				foreach ($opciones as $opcion) {
					if ($opcion->ID == $this->ID) {
						$opcion->PosicionMenu = $this->PosicionMenu;
					}
				} 			
			}
			if ($opciones != null) {
				$contador = 1;		
				$anterior = 0;
				$opciones->sort('PosicionMenu');
				$enSiguiente = false;	
				foreach ($opciones as $opcion) {
				      if (!$enSiguiente) {
					if ($opcion->ID == $this->ID) {
					        $enSiguiente = true; 
						if ($nuevo) {
							$resultado[(string)$contador] = $contador.' Última posición';							
						} else {
							$resultado[(string)$opcion->PosicionMenu] = $opcion->PosicionMenu.' Posición actual';							
						}	
					}  else {
					        $valor = ($anterior + $opcion->PosicionMenu)/2;
						$resultado[(string)$valor] = $valor.' Antes de '.$opcion->Texto;
					}	
				      } else {
				      	$enSiguiente = false;
				      }  	
					$contador++;
					$anterior = $this->PosicionMenu;
				}
				//si no esta en la última posición también da esa opción.
				if ($this->PosicionMenu != $opciones->Count()) {
					$resultado[(string)$contador] = $contador.' Última posición';
				}
			}
		  }			
	    }	
	    return $resultado;	
	}


    /**
     * Función que devuelve los campos para editar
     * el contenido en modo principal.
     **/
    protected function cargarEdicionPrincipal() {
        $pestanasEditable = parent::cargarEdicionPrincipal();       

	//Nombre del contenido.
	$campoNombre = new CampoEditable();
	$campoNombre->setNombre('Nombre');
	$campoNombre->setField(new TextField('Nombre', 'Nombre', $this->Nombre));
	$pestanasEditable->add("Contenido", $campoNombre);

	//Texto del contenido.
	$campoTexto = new CampoEditable();
	$campoTexto->setNombre('Texto');
	$campoTexto->setField(new TextField('Texto', 'Texto', $this->Texto));
	$pestanasEditable->add('Contenido', $campoTexto);
	
	//Descripci�n del contenido.
	$campoDescripcion = new CampoEditable();
	$campoDescripcion->setNombre('Descripci&oacute;n');
	$campoDescripcion->setField(new TextareaField('Descripcion', 'Descripcion', 8, 3, $this->Descripcion));
	$pestanasEditable->add('Contenido', $campoDescripcion);

	//Padre del contenido.
	$campoPadre = new CampoEditable();
	$campoPadre->setNombre('Nivel Superior');
	$campoPadre->setField(new ComboArbolField('NivelSuperiorID', 'Nivel Superior', $this->getArbolJerarquias(), $this->nombrePadre, $this->NivelSuperiorID, OpcionMenuBtMalaga::ACCION_RECARGAR_POSICION_OPCION));
	$pestanasEditable->add("Contenido", $campoPadre);

	//Posición del contenido.
	$campoPosicion = new CampoEditable();
	$campoPosicion->setNombre('Posici&oacute;n');
	$campoPosicion->setField(new DropdownField('PosicionMenu', 'PosicionMenu', $this->getArrayPosiciones(), $this->PosicionMenu));
	$pestanasEditable->add("Contenido", $campoPosicion);

        //Path de la imagen.
        $campoImagen = new CampoEditable();
        $campoImagen->setNombre('Imagen');
        $campoImagen->setMinOccurs(0);
	$campoImagen->setMaxOccurs(1);
	$campoImagen->setSubCampos($this->Imagen());
	$campoImagen->setTipoSubCampos('ImagenBtMalaga');
	$campoImagen->setCampoSubCampos('Imagen');
	$campoImagen->setPonerHeredados(false);
        $pestanasEditable->add("Contenido",$campoImagen);

        //Campo Acción.
        $campoAccion = new CampoEditable();
        $campoAccion->setNombre('Acci&oacute;n');
        $campoAccion->setMinOccurs(0);
	$campoAccion->setMaxOccurs(1);
	$campoAccion->setSubCampos($this->Accion());
	$campoAccion->setTipoSubCampos('AccionBtMalaga');
	$campoAccion->setCampoSubCampos('Accion');
	$campoAccion->setPonerHeredados(true);
        $pestanasEditable->add("Contenido",$campoAccion);

	//Ayuda.
	$campoAyuda = new CampoEditable();
	$campoAyuda->setNombre('Ayuda');
	$campoAyuda->setField(new TextareaField('Ayuda', 'Ayuda', 8, 3, $this->Ayuda));
	$pestanasEditable->add('Contenido', $campoAyuda);

        return $pestanasEditable;
    } 	
    
    /**
     * Devuelve el c�digo par ver el componente.
     **/	
    protected function CodigoVer() {
      return $this->renderWith('PlantillaVerOpcionMenu');
    }    
    
    /**
     * Devuelve una imagen para ver en el modo vista.
     */
    public function PonerImagen() {
    	$resultado = '';
    	$imagenes = $this->Imagen();
    	foreach ($imagenes as $imagen) {
    		$resultado .= '<img style="border:1px solid black;" src="'.$imagen->Imagen()->URL.'" alt="'.$imagen->Alternativa.'"/>';
    	}
    	return $resultado;
    }
    
    /**
     * Devuelve una acci�n para ver en el modo vista.
     */
    public function PonerAccion() {
    	$resultado = '';
    	$acciones = $this->Accion();
    	foreach ($acciones as $accion) {
    		$resultado .= $accion;
    	}
    	return $resultado;
    }   

   	/**
	 * Clase que devuelve los botones para el toolbar.
	 * Nota: debe ser sobreescrito por cada componente.
	 **/
	public function botonesToolbar() {
		$this->cargarAcciones();
		$xml = parent::botonesToolbar();
		
		//botón para editar
        $xml .= '<item id="editar#'.$this->ID.'" type="button" text="Editar" img="btmalaga/images/edit.gif" imgdis="btmalaga/images/editdisabled.gif"';
        if (strpos($this->AccionEditar,'javascript') === false) {
        	$xml .= ' enabled="false"';
     	}        
        $xml .= '></item>';		
        
   		//botón para borrar
        $xml .= '<item id="borrar#'.$this->ID.'" type="button" text="Borrar" img="btmalaga/images/delete.gif" imgdis="btmalaga/images/deletedisabled.gif"';
        if (strpos($this->AccionBorrar,'javascript') === false) {
        	$xml .= ' enabled="false"';
     	}        
        $xml .= '></item>';        

        
        return $xml;
    }  
 
	
}
?>