<?php
/**
 * Clase para el contenido de gestión de la web del Banco del Tiempo de Málaga.
 **/
class ContenidoGestionWebBtMalaga extends WebBtMalaga {
    static $db = array();
    static $has_one = array();
}

/**
 * Controlador de la clase ContenidoGestionWebBtMalaga.
 **/
class ContenidoGestionWebBtMalaga_Controller extends WebBtMalaga_Controller {

    /**
     * Indica la opción de menú actual para pintar su acción.
     **/
    private $opcionMenuActual;

    /**
     * Cuando esta editando indica el componente que hay cargado.
     **/
    private $componenteAEditar;

    /**
     * Indica si un usuario puede editar componentes en un listado.
     * Esto se usa para poder crear y borrado multiple.
     **/
    private $puedeEditarEnListado;
	
    /**
     * Indica el error que se ha producido.
     **/
    private $error;

    /**
     * Indica el formulario para el filtrado de datos.
     **/
    private $formularioFiltrado;

    /**
     * Indica el nombre del componente a editar en listado.
     **/
    private $nombreComponenteEnListado;

    /**
     * Función de inicio.
     **/
    public function init() {
        parent::init();
        if ((isset($_POST['accion'])) && ($_POST['accion']=='exportardatosbtmalaga')) {
            $this->exportarDatos();
	} else {    
	$cargarAlerta = true;
	if (!$usuario = $this->obtenerUsuarioConectado()) {
	    SecurityBtMalaga::permissionFailure();
	} else {
	    Requirements::javascript('jsparty/jquery/jquery.js');
	    Requirements::javascript('dhtmlx/dhtmlxcommon/dhtmlxcommon.js');
	    Requirements::javascript('dhtmlx/dhtmlxwindows/dhtmlxwindows.js');
	    Requirements::css('dhtmlx/dhtmlxwindows/dhtmlxwindows.css');
	    Requirements::css('dhtmlx/dhtmlxwindows/skins/dhtmlxwindows_dhx_blue.css');
            $direccionAccion = $this->URLSegment.'/formularioSistema';
	    Requirements::customScript(<<<JS
	      	  				function ponerVentanaSistemas() {
                				var dhxWins= new dhtmlXWindows();
                				dhxWins.setImagePath("dhtmlx/dhtmlxwindows/imgs/");
	            				var ventanaSistema = dhxWins.createWindow("ventanaSistema", 0, 0, 200, 140);
	            				ventanaSistema.centerOnScreen();
	            				ventanaSistema.setModal(true);
	            				ventanaSistema.button("close").hide();
	            				ventanaSistema.button("minmax1").hide();
	            				ventanaSistema.setText("Cambiar sistema");
	            				ventanaSistema.attachURL("$direccionAccion", true);              
              				}                                                                           	    
JS
	  	);
            if ((stripos($_SERVER["REQUEST_URI"],'verDatosOferta') === false) && (stripos($_SERVER["REQUEST_URI"],'verDatosDemanda') === false)) {
                //if ((!$usuario->esAdministrador()) && (Session::get(ComponenteBtMalagaControl::SISTEMA) == null)) {
                if (Session::get(ComponenteBtMalagaControl::SISTEMA) == null) {
		    $sistemas = $usuario->obtenerSistemas();
		    $numSistemas = count($sistemas);
		    if ($numSistemas == 0) {
		        //obtiene el sistema por defecto creado en la instalación
                        $sistema = DataObject::get_one('SistemaBtMalaga', "Nombre='malagacomun'");
			Session::set(ComponenteBtMalagaControl::SISTEMA, $sistema->ID);
		    } else if ($numSistemas == 1) {
		        Session::set(ComponenteBtMalagaControl::SISTEMA, key($sistemas));
		    } else {
                        Session::set(ComponenteBtMalagaControl::SISTEMA, key($sistemas));
                        $cargarAlerta = false;
	  		Requirements::customScript(<<<JS
	      				jQuery(document).ready(function() {
                                                           ponerVentanaSistemas();
                                                          });                                                                           	    
JS
	  	        );
		    }
	        }
            }  
	    if ($cargarAlerta) {
                $parametros = $this->getURLParams();
	  	if (($parametros['Action'] != 'verComponente') && ($parametros['Action'] != 'FormularioAccion')){
	  	    $variables = array(
                                       'direccionFormulario' => $this->URLSegment.'/FormularioAccion',
	  		              );
  		    Requirements::javascript('dhtmlx/dhtmlxcommon/dhtmlxcommon.js');
  		    Requirements::javascript('jsparty/jquery/jquery.js');
  		    Requirements::javascript('picassocms/templates/jsparty/jquery/jquery.flydom.js');
  		    Requirements::javascriptTemplate('btmalaga/javascript/alertamensajes.js', $variables);
	  	}
            }
        }
        }
    }
    
    /**
     * Se le indica si se puede editar en el listado.
     **/
    public function setPuedeEditarEnListado($puede) {
        $this->puedeEditarEnListado = $puede;
    }

    /**
     * Devuelve el valor que indica si puede editar en el listado.
     **/
    public function PuedeEditarEnListado() {
        return $this->puedeEditarEnListado;
    }
    

    /**
     * Sobreescribe el método que obtiene las migas.
     **/
    private $nivelesMigas;
    public function Migas() {
        $resultado = '';
	$tamano = count($this->nivelesMigas);
	for ($i = 0; $i < $tamano; $i++) {
	    if ($i > 0) {
	        $resultado .= ' &raquo; ';
	    }
	    if ($i < ($tamano - 1)) {
                $resultado .= '<a href="'.$this->URLSegment.'/ejecutaOpcion/'.$this->nivelesMigas[$i]->ID.'" title="'.$this->nivelesMigas[$i]->Descripcion.'">'.$this->nivelesMigas[$i]->Texto.'</a>';
	    } else {
	        $resultado .= $this->nivelesMigas[$i]->Texto;
	    }
	}
	return $resultado;
    }

    /**
     * Función para poner el menú lateral según las opciones disponibles
     * para cada usuario.
     **/
    public function MenuLateral() {
        $opcionesMenu = DataObject::get('OpcionMenuBtMalaga');
	$opcionesPorPadre = $opcionesMenu->groupBy('NivelSuperiorID');
	$resultado = '<ul>';
	//genera el menú.
	$opcionesPorPadre[0]->sort('PosicionMenu');
	foreach ($opcionesPorPadre[0] as $opcionMenu) {
	    if ($opcionMenu->puedeLeer()) {
	        $resultado .= '<li><a title="'.$opcionMenu->Descripcion.'" href="'.$this->URLSegment.'/ejecutaOpcion/'.$opcionMenu->ID.'" ';
		if (($this->opcionMenuActual != null) && (($this->opcionMenuActual->ID == $opcionMenu->ID) || ($this->opcionMenuActual->NivelSuperiorID == $opcionMenu->ID))) {
		    $resultado .= 'class="current">'.$opcionMenu->Texto.'</a><ul>';
		    $this->nivelesMigas[0] = $opcionMenu;
		    //pinta los hijos.
		    if (isset($opcionesPorPadre[$opcionMenu->ID])) {
		        $opcionesPorPadre[$opcionMenu->ID]->sort("PosicionMenu");
                        foreach ($opcionesPorPadre[$opcionMenu->ID] as $opcionHijo) {
			    if ($opcionHijo->puedeLeer()) {
			        $resultado .= '<li><a title="'.$opcionHijo->Descripcion.'" href="'.$this->URLSegment.'/ejecutaOpcion/'.$opcionHijo->ID.'" ';
				if (($this->opcionMenuActual != null) && ($this->opcionMenuActual->ID == $opcionHijo->ID)) {
				    $resultado .= 'class="subcurrent" ';
				    $this->nivelesMigas[1] = $opcionHijo;
				}
			 	$resultado .= '>&raquo; '.$opcionHijo->Texto.'</a></li>';
                            }
			}
		    }   
		    $resultado .= '</ul></li>';
                } else {
		    $resultado .= 'class="link">'.$opcionMenu->Texto.'</a></li>';
		}
            }    
        }   
	$resultado .= '</ul>';
	return $resultado;
    }   

    /**
     * Devuelve el componente que se esta editando.
     **/
    public function ComponenteAEditar() {
        return $this->componenteAEditar;
    }

    /**
     * Asigna el componente a editar.
     **/
    public function setComponenteAEditar($componente) {
        $this->componenteAEditar = $componente;
    }

	/**
	 * Ejecuta una opciÃ³n segÃºn su acciÃ³n definida.
	 **/
	public function ejecutaOpcion($request) {
		$resultado = '';
		$parametros = $request->allParams();
		$ID = $parametros['ID'];
		$this->opcionMenuActual = DataObject::get_by_id('OpcionMenuBtMalaga', $ID);
		//ejecuta la acciÃ³n.		
		$acciones = $this->opcionMenuActual->Accion();
		if ($acciones != null) {
			foreach ($acciones as $accion) {
				$resultado .= $accion->ejecutarAccion($this, $this->opcionMenuActual);
			}
		}
		return $resultado;
	}

	/**
	 * Funciï¿½n que devuelve todas las opciones de una secciï¿½n.
	 **/
	public function OpcionesSubMenu() {
		$opcionesValidas = new DataObjectSet();
		$opciones = DataObject::get('OpcionMenuBtMalaga', 'NivelSuperiorID = '.$this->opcionMenuActual->ID, 'PosicionMenu');
		if ($opciones != null) {
			foreach ($opciones as $opcion) {
				if ($opcion->puedeLeer()) {
					$opcion->setDireccionOpcion($this->URLSegment.'/ejecutaOpcion/'.$opcion->ID);
					$opcionesValidas->push($opcion);
				}
			}
		}
		return $opcionesValidas;
	}

	/**
	 * Funciï¿½n para ver un componente.
	 **/
	public function verComponente($request) {
		$parametros = $request->allParams();
		$idComponente = $parametros['ID'];
		$componente = DataObject::get_by_id('ComponenteBtMalaga', $idComponente);
		if ($componente == null) {
			$componente = DataObject::get_by_id('CarpetaBtMalaga', $idComponente);
		}
		return $componente->getCodigoVer();
	}


	/**
	 * Mï¿½todo que ejecuta la acciï¿½n enviada por el formulario.
	 * Extiende el mï¿½todo del padre.
	 **/
	public function ejecutarAccion($data, $form) {
		$resultado = '';
		$this->addControl(new ComponenteBtMalagaControl());
		$this->addControl(new MensajeBtMalagaControl());
		$resultado .= parent::ejecutarAccion($data, $form);
		return $resultado;
	}

	/**
	 * Devuelve el enlace para desconectarse.
	 **/
	public function EnlaceDesconexion() {
		$usuario = $this->obtenerUsuarioConectado();
		$resultado = $usuario->FirstName.' '.$usuario->Surname.' '.$usuario->SApellido;
		$resultado .= ' - <a href="SecurityBtMalaga/logout" title="Salir de la zona privada">Desconectarse</a>';
		if ((Session::get(ComponenteBtMalagaControl::SISTEMA) != null) && (is_numeric(Session::get(ComponenteBtMalagaControl::SISTEMA)))) {
		  $sistema = DataObject::get_by_id('SistemaBtMalaga', Session::get(ComponenteBtMalagaControl::SISTEMA));
		  if ($sistema != null) { 
			$resultado .= '<br/>Sistema: <strong>'.$sistema->Nombre.'</strong> - <a href="#" onClick="javacript:ponerVentanaSistemas()" title="Cambiar Sistema">Cambiar Sistema</a>';
		  }		
		}	
		return $resultado;
	}

	/**
	 * Devuelve el formulario para seleccionar el sistema.
	 **/
	public function formularioSistema() {
		$usuario = $this->obtenerUsuarioConectado();
		$sistemas = $usuario->obtenerSistemas();
		$fields = new FieldSet(
		new DropdownField('Sistema', 'Sistema', $sistemas),
		new HiddenField(ControlPicasso::PARAMETRO_ACCION, ControlPicasso::PARAMETRO_ACCION, ComponenteBtMalagaControl::ACCION_FORMULARIO_SELECCION_SISTEMA)
		);
		$actions = new FieldSet(
		new FormAction('ejecutarAccion', 'Seleccionar')
		);
		$formulario = new Form($this, 'FormularioAccion', $fields, $actions);
		 
		return $formulario->renderWith('FormularioSeleccionSistema');
	}

	/**
	 * Funciï¿½n para ver las opiniones de una factura.
	 **/
	public function verOpinionesFactura($request) {
		$parametros = $request->allParams();
		$idFactura = $parametros['ID'];
		$factura = DataObject::get_by_id('FacturaBtMalaga', $idFactura);
		return $factura->verOpinionesFactura();
	}
	 
	/**
	 * Funciï¿½n para cargar la barra de herramientas de un componente.
	 **/
	public function cargarToolbar($request) {
		$parametros = $request->allParams();
		$idComponente = $parametros['ID'];
		$componente = DataObject::get_by_id('ContenidoEditable', $idComponente);
		$xml = '<?xml version="1.0"?><toolbar>';
		$xml .= $componente->botonesToolbar();
		$xml .= '</toolbar>';
		return $xml;
	}
	 
	/**
	 * Carga la pagina de inicio.
	 */
	public function index() {
		$resultado = '';
		$this->opcionMenuActual = DataObject::get_one('OpcionMenuBtMalaga', "Nombre='usuario'");

		//ejecuta la acciÃ³n.
		$acciones = $this->opcionMenuActual->Accion();
		if ($acciones != null) {
			foreach ($acciones as $accion) {
				$resultado .= $accion->ejecutarAccion($this, $this->opcionMenuActual);
			}
		}
		return $resultado;
	}
	 
	/**
	 * Pone los datos de una oferta.
	 */
	public function verDatosOferta($request) {
	  return $this->verDatosServicio($request,'ofertas');	
	}

	/**
	 * Pone los datos de una demanda.
	 */
	public function verDatosDemanda($request) {
	  return $this->verDatosServicio($request,'demandas');	
	}
		
	/**
	 * Pone los datos de un servicio.
	 */
	public function verDatosServicio($request, $tipoServicio) {
		
		$parametros = $request->allParams();
		$idComponente = $parametros['ID'];
		$servicio = DataObject::get_by_id('ServicioBtMalaga', $idComponente);
		$sistema = $servicio->SistemaID;
		$sistemaEncontrado = false;
		
		$usuario = $this->obtenerUsuarioConectado();
		if (!$usuario->esUsuarioActivo()) {
			$this->error = 'El usuario a&uacute;n no esta Activado';
			$this->setPlantilla('PlantillaError');
			$resultado = $this->render();
		} else {
		
		if ((Session::get(ComponenteBtMalagaControl::SISTEMA) != null) && 
			  ($sistema == Session::get(ComponenteBtMalagaControl::SISTEMA))) {
				$sistemaEncontrado = true;
		} else {
		
		  //antes de nada comprueba que el usuario pertenezca al sistema
		  //de la oferta y si es así cambia el sistema.		  		
		  $sistemasUsuario = $usuario->SistemaUsuario();		
		  if ($sistemasUsuario) {
			foreach ($sistemasUsuario as $sistemaUsuario) {
				if ($sistemaUsuario->SistemaID == $sistema) {
					$sistemaEncontrado = true;
					//cambia el sistema
					Session::set(ComponenteBtMalagaControl::SISTEMA, $sistema);
					break;
				}	
			}
		  }
		  
		}  
		
		$resultado = '';
		
		if ($sistemaEncontrado) {

			$this->opcionMenuActual = DataObject::get_one('OpcionMenuBtMalaga', "Nombre='".$tipoServicio."'");
			//ejecuta la acción.
			$acciones = $this->opcionMenuActual->Accion();
			if ($acciones != null) {
				foreach ($acciones as $accion) {
					$resultado .= $accion->ejecutarAccion($this, $this->opcionMenuActual);
				}
			}
			//si pongo Requirements no funciona
			$resultado .= '<script type="text/javascript">';
			$resultado .= 'abrirVentanaServicio = function() { mygrid.selectRowById('.$idComponente.'); verComponente('.$idComponente.'); };';
			$resultado .= '</script>';
			
		} else {
			$this->error = 'El usuario no pertenece al sistema del servicio';
			$this->setPlantilla('PlantillaError');
			$resultado = $this->render();
		}
		}	

		return $resultado;
	}
	 
	/**
	 * Devuelve el tipo del componente.
	 **/
	public function verTipoComponente($request) {
		$parametros = $request->allParams();
		$idComponente = $parametros['ID'];
	 $componente = DataObject::get_by_id('ComponenteBtMalaga', $idComponente);
	 return get_class($componente);
	}	  
	
	/**
	 * Devuelve el error producido
	 */
	public function Error() {
		return $this->error;
	}

    /**
     * Devuelve el formulario para el filtrado de datos.
     **/
    public function FormularioFiltro() {            
      $formulario = null;
      if ($this->formularioFiltrado) {
        $fields = $this->formularioFiltrado;
        $actions = new FieldSet(new FormAction('filtrarResultados','Mostrar resultados'));
        $formulario = new Form($this,'FormularioFiltro',$fields,$actions);
      }
      return $formulario;
    }

    /**
     * Asigna el formulario para el filtrado de datos
     **/
    public function setFormularioFiltrado($formulario) {
      $this->formularioFiltrado = $formulario;
    }
    
    /**
     * Poner el formulario para el envio masivo.
     **/
    public function FormularioMensajeDifusion() {
        $fields = new FieldSet(new TextField('Asunto','Asunto*:'),
		               new TextareaField('Mensaje','Mensaje*:'),
		               new EtiquetaField('<small>*Campos obligatorios</small>')
		              );
        $actions = new FieldSet(new FormAction('enviarMensajeDifusion', 'Enviar a todos'));
        $validador = new RequiredFields(array('Asunto','Mensaje'));
        $formulario = new Form($this, 'FormularioMensajeDifusion', $fields, $actions, $validador);
        return $formulario;      
    }
    
    /**
     * Envia un mensaje a todos los usuarios del sistema.
     **/
    public function enviarMensajeDifusion($data, $form) {
        $usuarioConectado = $this->obtenerUsuarioConectado();
        $sistema = Session::get(ComponenteBtMalagaControl::SISTEMA);
        if ($sistema) {
            $sql = "select distinct UsuarioBtMalaga.*, 
	                            Member.* 
                    from UsuarioBtMalaga, Member, SistemaUsuarioBtMalaga 
		    where UsuarioBtMalaga.ID=Member.ID 
		      and SistemaUsuarioBtMalaga.UsuarioID=UsuarioBtMalaga.ID
		      and SistemaUsuarioBtMalaga.SistemaID=".$sistema;            
            $records = DB::query($sql);
            $usuarios = singleton('UsuarioBtMalaga')->buildDataObjectSet($records);		      
            $mailsUsuarios = '';
            if ($usuarios) {
                foreach ($usuarios as $usuario) {
                    MensajeBtMalaga::enviarMensaje($usuarioConectado, $usuario, $data['Asunto'], $data['Mensaje'], true);                        
                    if (($usuario->TipoNotificacion == 'Alerta y Email') || ($usuario->TipoNotificacion == 'Email')) {
                        if ($mailsUsuarios != '') {
                            $mailsUsuarios.=',';
                        }
		        $mailsUsuarios.=$usuario->Email;	    
                    }
                }
            }
            $email = new Email($usuarioConectado->Email, $mailsUsuarios, $data['Asunto'], strip_tags($data['Mensaje']));
            $email->send();
        }
        Session::set('Mensaje','<h1>Mensaje enviado correctamente</h1>');
        Director::redirectBack();
    }
    
    /**
     * Muestra un mensaje por pantalla.
     **/
    public function Mensaje() {
        $mensaje = Session::get('Mensaje');  
        Session::set('Mensaje',null);
        return $mensaje;
    }
    
    /**
     * Función que exporta los datos de una consulta.
     **/
    public function exportarDatos() {
        include_once (dirname(__FILE__).'/utilidades/dompdf/dompdf_config.inc.php');
        $numCampos = $_POST['numCampos'];
        $html = '<html><body><div style="margin:30px;width:100%"><table cellspacing="0" cellpadding="0" align="center" width="100%" border="1">';
        $columnas = array();
        for ($i=0; $i<$numCampos; $i++) {
            $columnas []= $_POST['campo'.$i];
        } 
        $numColumnas = count($columnas);
        $numFilas = count($columnas[0]);
        for ($i=0; $i<$numFilas; $i++) {
            $html .= '<tr>';
            for ($j=0; $j<$numColumnas; $j++) {
                if ($i==0) {
                    $html .= '<th style="background-color:#cccccc;">';
                    $html .= $columnas[$j][$i];
                    $html .= '</th>';
                } else {
                    $html .= '<td>';
                    $html .= $columnas[$j][$i];
                    $html .= '</td>';
                }  
            }
	    $html .= '</tr>';
        }
        $html .= '</table></div></body>';  
        $pdf = new DOMPDF();
        $pdf->load_html(utf8_decode($html));
        $pdf->render();
        $pdf->stream('listado.pdf');

    }

    /**
     * Asigna el nombre del componente en listado.
     **/
    public function setNombreComponente($nombre) {
        $this->nombreComponenteEnListado = $nombre;
    }

    /**
     * Devuelve el nombre del componente en listado.
     **/
    public function NombreComponente() {
        return $this->nombreComponenteEnListado;
    }

    public function AyudaBasica() {
        return $this->opcionMenuActual->Ayuda;
    }

    public function tieneAyuda() {
        $tiene = false;
        if ($this->opcionMenuActual->Ayuda != '') {
            $tiene = true;
        }
        return $tiene;
    }
    
}
?>
