public function handle_input(&$request)
 {
     $vd = new ViewDescriptor();
     $vd->setPagina($request['page']);
     //        $this->setImpToken($vd, $request);
     //utente non autentificato
     if (!$this->loggedIn()) {
         $this->showLoginPage($vd);
     } else {
         $user = UserFactory::instance()->cercaUtentePerId($_SESSION[BaseController::user], $_SESSION[BaseController::role]);
         if (isset($request["subpage"])) {
             switch ($request["subpage"]) {
                 case 'gestione_ordini':
                     $ordini = OrdineFactory::instance()->getListaOrdiniAttivi();
                     $vd->setSottoPagina('gestione_ordini');
                     break;
                 default:
                     $vd->setSottoPagina('home');
                     break;
             }
         }
         if (isset($request["cmd"])) {
             switch ($request["cmd"]) {
                 case 'logout':
                     $this->logout($vd);
                     break;
                 case 'invia':
                     $msg = array();
                     $ordini = OrdineFactory::instance()->getListaOrdiniAttivi();
                     if (isset($request['id'])) {
                         if (OrdineFactory::instance()->chiudiOrdinePerId($request['id']) != 1) {
                             $msg[] = '<li>L\'ordine #' . $request['id'] . ' non &egrave; valido</li>';
                         }
                     }
                     $this->creaFeedbackUtente($msg, $vd, 'Ordine #' . $request['id'] . ' inviato');
                     $vd->setSottoPagina('gestione_ordini');
                     $this->showHomeAdmin($vd);
                     /* Non mostra il msg di errore/conferma */
                     header('Location: ' . Settings::getApplicationPath() . 'php/admin/gestione_ordini');
                     exit;
                     /* ************************************ */
                     break;
                 default:
                     $this->showHomeAdmin($vd);
             }
         } else {
             // nessun comando
             $user = UserFactory::instance()->cercaUtentePerId($_SESSION[BaseController::user], $_SESSION[BaseController::role]);
             $this->showHomeUser($vd);
         }
     }
     require basename(__DIR__) . '/../view/master.php';
 }
 /**
  * Metodo per gestire l'input dell'utente. 
  * @param type $request la richiesta da gestire
  */
 public function handleInput(&$request)
 {
     // creo il descrittore della vista
     $vd = new ViewDescriptor();
     // imposto la pagina
     $vd->setPagina($request['page']);
     // imposto il token per impersonare un utente (nel lo stia facendo)
     $this->setImpToken($vd, $request);
     if (!$this->loggedIn()) {
         // utente non autenticato, rimando alla home
         $this->showLoginPage($vd);
     } else {
         // utente autenticato
         $user = UserFactory::instance()->cercaUtentePerId($_SESSION[BaseController::user], $_SESSION[BaseController::role]);
         // verifico quale sia la sottopagina della categoria
         // Docente da servire ed imposto il descrittore
         // della vista per caricare i "pezzi" delle pagine corretti
         // tutte le variabili che vengono create senza essere utilizzate
         // direttamente in questo switch, sono quelle che vengono poi lette
         // dalla vista, ed utilizzano le classi del modello
         if (isset($request["subpage"])) {
             switch ($request["subpage"]) {
                 // modifica dei dati anagrafici
                 case 'anagrafica':
                     $dipartimenti = DipartimentoFactory::instance()->getDipartimenti();
                     $vd->setSottoPagina('anagrafica');
                     break;
                     // inserimento di una lista di appelli
                 // inserimento di una lista di appelli
                 case 'appelli':
                     $appelli = AppelloFactory::instance()->getAppelliPerDocente($user);
                     $insegnamenti = InsegnamentoFactory::instance()->getListaInsegnamentiPerDocente($user);
                     $vd->setSottoPagina('appelli');
                     break;
                     // modifica di un appello
                 // modifica di un appello
                 case 'appelli_modifica':
                     $msg = array();
                     $appelli = AppelloFactory::instance()->getAppelliPerDocente($user);
                     $mod_appello = $this->getAppello($request, $msg);
                     $insegnamenti = InsegnamentoFactory::instance()->getListaInsegnamentiPerDocente($user);
                     if (!isset($mod_appello)) {
                         $vd->setSottoPagina('appelli');
                     } else {
                         $vd->setSottoPagina('appelli_modifica');
                     }
                     break;
                     // creazione di un appello
                 // creazione di un appello
                 case 'appelli_crea':
                     $msg = array();
                     $appelli = AppelloFactory::instance()->getAppelliPerDocente($user);
                     $insegnamenti = InsegnamentoFactory::instance()->getListaInsegnamentiPerDocente($user);
                     if (!isset($request['cmd'])) {
                         $vd->setSottoPagina('appelli');
                     } else {
                         $vd->setSottoPagina('appelli_crea');
                     }
                     break;
                     // visualizzazione della lista di iscritti ad un appello
                 // visualizzazione della lista di iscritti ad un appello
                 case 'appelli_iscritti':
                     $msg = array();
                     $appelli = AppelloFactory::instance()->getAppelliPerDocente($user);
                     $mod_appello = $this->getAppello($request, $msg);
                     if (!isset($mod_appello)) {
                         $vd->setSottoPagina('appelli');
                     } else {
                         $vd->setSottoPagina('appelli_iscritti');
                     }
                     break;
                     // registrazione degli esami
                     // con visualizzazione delle liste attive
                 // registrazione degli esami
                 // con visualizzazione delle liste attive
                 case 'reg_esami':
                     if (!isset($_SESSION[self::elenco])) {
                         $_SESSION[self::elenco] = array();
                     }
                     $elenco_id = $this->getIdElenco($request, $msg, $_SESSION);
                     $elenchi_attivi = $_SESSION[self::elenco];
                     $vd->setSottoPagina('reg_esami');
                     break;
                     // registrazione degli esami, passo 1:
                     // selezione dell'insegnamento
                 // registrazione degli esami, passo 1:
                 // selezione dell'insegnamento
                 case 'reg_esami_step1':
                     $msg = array();
                     // ricerco l'elenco da modificare, e' possibile gestirne
                     // piu' di uno con lo stesso browser
                     $elenco_id = $this->getIdElenco($request, $msg, $_SESSION);
                     $insegnamenti = InsegnamentoFactory::instance()->getListaInsegnamentiPerDocente($user);
                     $docenti = UserFactory::instance()->getListaDocenti();
                     if (isset($elenco_id)) {
                         $sel_insegnamento = $_SESSION[self::elenco][$elenco_id]->getTemplate()->getInsegnamento();
                     }
                     $vd->setSottoPagina('reg_esami_step1');
                     break;
                     // registrazione degli esami, passo 2:
                     // selezione della commissione
                 // registrazione degli esami, passo 2:
                 // selezione della commissione
                 case 'reg_esami_step2':
                     $msg = array();
                     $docenti = UserFactory::instance()->getListaDocenti();
                     // ricerco l'elenco da modificare, e' possibile gestirne
                     // piu' di uno con lo stesso browser
                     $elenco_id = $this->getIdElenco($request, $msg, $_SESSION);
                     $insegnamenti = InsegnamentoFactory::instance()->getListaInsegnamentiPerDocente($user);
                     $elenchi_attivi = $_SESSION[self::elenco];
                     if (isset($elenco_id)) {
                         $commissione = $_SESSION[self::elenco][$elenco_id]->getTemplate()->getCommissione();
                         $sel_insegnamento = $_SESSION[self::elenco][$elenco_id]->getTemplate()->getInsegnamento();
                         $sel_esami = $_SESSION[self::elenco][$elenco_id]->getEsami();
                         // se l'insegnamento non e' stato specificato lo rimandiamo
                         // al passo precedente
                         if (!isset($sel_insegnamento)) {
                             $vd->setSottoPagina('reg_esami_step1');
                         } else {
                             $vd->setSottoPagina('reg_esami_step2');
                         }
                     } else {
                         $vd->setSottoPagina('reg_esami');
                     }
                     break;
                     // registrazione degli esami, passo 3:
                     // inserimento statini
                 // registrazione degli esami, passo 3:
                 // inserimento statini
                 case 'reg_esami_step3':
                     $msg = array();
                     $docenti = UserFactory::instance()->getListaDocenti();
                     // ricerco l'elenco da modificare, e' possibile gestirne
                     // piu' di uno con lo stesso browser
                     $elenco_id = $this->getIdElenco($request, $msg, $_SESSION);
                     $elenchi_attivi = $_SESSION[self::elenco];
                     if (isset($elenco_id)) {
                         $commissione = $_SESSION[self::elenco][$elenco_id]->getTemplate()->getCommissione();
                         $sel_insegnamento = $_SESSION[self::elenco][$elenco_id]->getTemplate()->getInsegnamento();
                         $sel_esami = $_SESSION[self::elenco][$elenco_id]->getEsami();
                         // se l'insegnamento non e' stato specificato lo
                         // rimandiamo al passo 1
                         if (!isset($sel_insegnamento)) {
                             $vd->setSottoPagina('reg_esami_step1');
                             // se la commissione non e' valida lo rimandiamo al passo 2
                         } else {
                             if (!isset($commissione) || !$_SESSION[self::elenco][$elenco_id]->getTemplate()->commissioneValida()) {
                                 $vd->setSottoPagina('reg_esami_step2');
                             } else {
                                 // tutto ok, passo 3
                                 $vd->setSottoPagina('reg_esami_step3');
                             }
                         }
                     } else {
                         $vd->setSottoPagina('reg_esami');
                     }
                     break;
                     // visualizzazione dell'elenco esami
                 // visualizzazione dell'elenco esami
                 case 'el_esami':
                     $insegnamenti = InsegnamentoFactory::instance()->getListaInsegnamentiPerDocente($user);
                     $vd->setSottoPagina('el_esami');
                     $vd->addScript("../js/jquery-2.1.1.min.js");
                     $vd->addScript("../js/elencoEsami.js");
                     break;
                     // gestione della richiesta ajax di filtro esami
                 // gestione della richiesta ajax di filtro esami
                 case 'filtra_esami':
                     $vd->toggleJson();
                     $vd->setSottoPagina('el_esami_json');
                     $errori = array();
                     if (isset($request['insegnamento']) && $request['insegnamento'] != '') {
                         $insegnamento_id = filter_var($request['insegnamento'], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                         if ($insegnamento_id == null) {
                             $errori['insegnamento'] = "Specificare un identificatore valido";
                         }
                     } else {
                         $insegnamento_id = null;
                     }
                     if (isset($request['matricola']) && $request['matricola'] != '') {
                         $matricola = filter_var($request['matricola'], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                         if ($matricola == null) {
                             $errori['matricola'] = "Specificare una matricola valida";
                         }
                     } else {
                         $matricola = null;
                     }
                     if (isset($request['cognome'])) {
                         $cognome = $request['cognome'];
                     } else {
                         $cognome = null;
                     }
                     if (isset($request['nome'])) {
                         $nome = $request['nome'];
                     } else {
                         $nome = null;
                     }
                     $esami = EsameFactory::instance()->ricercaEsami($user, $insegnamento_id, $matricola, $nome, $cognome);
                     break;
                 default:
                     $vd->setSottoPagina('home');
                     break;
             }
         }
         // gestione dei comandi inviati dall'utente
         if (isset($request["cmd"])) {
             switch ($request["cmd"]) {
                 // logout
                 case 'logout':
                     $this->logout($vd);
                     break;
                     // modifica delle informazioni sull'indirizzo dell'ufficio
                 // modifica delle informazioni sull'indirizzo dell'ufficio
                 case 'ufficio':
                     $msg = array();
                     if (isset($request['dipartimento'])) {
                         $intVal = filter_var($request['dipartimento'], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                         if (!isset($intVal) || $intVal < 0 || $intVal > count($dipartimenti) || $user->setDipartimento($dipartimenti[$intVal])) {
                             $msg[] = '<li>Il dipartimento specificato non &egrave; corretto</li>';
                         }
                     }
                     $this->aggiornaIndirizzo($user, $request, $msg);
                     $this->creaFeedbackUtente($msg, $vd, "Indirizzo ufficio aggiornato");
                     $this->showHomeUtente($vd);
                     break;
                     // modifica delle informazioni di contatto
                 // modifica delle informazioni di contatto
                 case 'contatti':
                     $msg = array();
                     if (isset($request['ricevimento'])) {
                         if (!$user->setRicevimento($request['ricevimento'])) {
                             $msg[] = '<li>Il ricevimento specificato non &egrave; corretto</li>';
                         }
                     }
                     $this->aggiornaEmail($user, $request, $msg);
                     $this->creaFeedbackUtente($msg, $vd, "Contatti aggiornati");
                     $this->showHomeUtente($vd);
                     break;
                     // modifica della password
                 // modifica della password
                 case 'password':
                     $msg = array();
                     $this->aggiornaPassword($user, $request, $msg);
                     $this->creaFeedbackUtente($msg, $vd, "Password aggiornata");
                     $this->showHomeUtente($vd);
                     break;
                     // richiesta modifica di un appello esistente,
                     // dobbiamo mostrare le informazioni
                 // richiesta modifica di un appello esistente,
                 // dobbiamo mostrare le informazioni
                 case 'a_modifica':
                     $appelli = AppelloFactory::instance()->getAppelliPerDocente($user);
                     if (isset($request['appello'])) {
                         $intVal = filter_var($request['appello'], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                         if (isset($intVal)) {
                             $mod_appello = $this->cercaAppelloPerId($intVal, $appelli);
                             $insegnamenti = InsegnamentoFactory::instance()->getListaInsegnamentiPerDocente($user);
                             //$vd->setStato('a_modifica');
                         }
                     }
                     $this->showHomeUtente($vd);
                     break;
                     // salvataggio delle modifiche ad un appello esistente
                 // salvataggio delle modifiche ad un appello esistente
                 case 'a_salva':
                     $msg = array();
                     if (isset($request['appello'])) {
                         $intVal = filter_var($request['appello'], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                         if (isset($intVal)) {
                             $mod_appello = $this->cercaAppelloPerId($intVal, $appelli);
                             $this->updateAppello($mod_appello, $request, $msg);
                             if (count($msg) == 0 && AppelloFactory::instance()->salva($mod_appello) != 1) {
                                 $msg[] = '<li> Impossibile salvare l\'appello </li>';
                             }
                             $this->creaFeedbackUtente($msg, $vd, "Appello aggiornato");
                             if (count($msg) == 0) {
                                 $vd->setSottoPagina('appelli');
                             }
                         }
                     } else {
                         $msg[] = '<li> Appello non specificato </li>';
                     }
                     $this->showHomeUtente($vd);
                     break;
                     // l'utente non vuole modificare l'appello selezionato
                 // l'utente non vuole modificare l'appello selezionato
                 case 'a_annulla':
                     $vd->setSottoPagina('appelli');
                     $this->showHomeUtente($vd);
                     break;
                     // richesta di visualizzazione del form per la creazione di un nuovo
                     // appello
                 // richesta di visualizzazione del form per la creazione di un nuovo
                 // appello
                 case 'a_crea':
                     $appelli = AppelloFactory::instance()->getAppelliPerDocente($user);
                     $vd->setSottoPagina('appelli_crea');
                     $this->showHomeUtente($vd);
                     break;
                     // creazione di un nuovo appello
                 // creazione di un nuovo appello
                 case 'a_nuovo':
                     $msg = array();
                     $nuovo = new Appello();
                     $nuovo->setId(-1);
                     $this->updateAppello($nuovo, $request, $msg);
                     $this->creaFeedbackUtente($msg, $vd, "Appello creato");
                     if (count($msg) == 0) {
                         $vd->setSottoPagina('appelli');
                         if (AppelloFactory::instance()->nuovo($nuovo) != 1) {
                             $msg[] = '<li> Impossibile creare l\'appello </li>';
                         }
                     }
                     $appelli = AppelloFactory::instance()->getAppelliPerDocente($user);
                     $this->showHomeUtente($vd);
                     break;
                     // mostra la lista degli iscritti
                 // mostra la lista degli iscritti
                 case 'a_iscritti':
                     $appelli = AppelloFactory::instance()->getAppelliPerDocente($user);
                     if (isset($request['appello'])) {
                         $intVal = filter_var($request['appello'], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                         if (isset($intVal)) {
                             $mod_appello = $this->cercaAppelloPerId($intVal, $appelli);
                         }
                     }
                     $this->showHomeUtente($vd);
                     break;
                     // cancella un appello
                 // cancella un appello
                 case 'a_cancella':
                     if (isset($request['appello'])) {
                         $intVal = filter_var($request['appello'], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                         if (isset($intVal)) {
                             $mod_appello = AppelloFactory::instance()->cercaAppelloPerId($intVal);
                             if ($mod_appello != null) {
                                 if (AppelloFactory::instance()->cancella($mod_appello) != 1) {
                                     $msg[] = '<li> Impossibile cancellare l\'appello </li>';
                                 }
                             }
                             $this->creaFeedbackUtente($msg, $vd, "Appello eliminato");
                         }
                     }
                     $appelli = AppelloFactory::instance()->getAppelliPerDocente($user);
                     $this->showHomeUtente($vd);
                     break;
                     // richiesta di creazione di un nuovo elenco di esami
                 // richiesta di creazione di un nuovo elenco di esami
                 case 'r_nuovo':
                     $elenco_id = $this->prossimoIndiceElencoListe($_SESSION[self::elenco]);
                     // salviamo gli oggetti interi in sessione
                     $el = new ElencoEsami($elenco_id);
                     $el->getTemplate()->setData(new DateTime());
                     $_SESSION[self::elenco][$elenco_id] = $el;
                     $elenchi_attivi = $_SESSION[self::elenco];
                     $this->showHomeUtente($vd);
                     break;
                     // selezione dell'insegnamento
                 // selezione dell'insegnamento
                 case 'r_sel_insegnamento':
                     if (isset($elenco_id)) {
                         $commissione = $_SESSION[self::elenco][$elenco_id]->getTemplate()->getCommissione();
                         // richiesta di andare al passo successivo
                         if (!isset($request['insegnamento'])) {
                             $msg[] = "<li> Non &egrave; stato selezionato un insegnamento</li>";
                         } else {
                             $insegnamento = InsegnamentoFactory::instance()->creaInsegnamentoDaCodice($request['insegnamento']);
                             if (!isset($insegnamento)) {
                                 $msg[] = "<li> L'insegnamento specificato non &egrave; corretto</li>";
                             }
                         }
                         if (count($msg) == 0) {
                             // nessun errore, impostiamo l'insegnamento
                             $_SESSION[self::elenco][$elenco_id]->getTemplate()->setInsegnamento($insegnamento);
                             $sel_insegnamento = $_SESSION[self::elenco][$elenco_id]->getTemplate()->getInsegnamento();
                             $vd->setSottoPagina('reg_esami_step2');
                         } else {
                             $vd->setSottoPagina('reg_esami_step1');
                         }
                         $this->creaFeedbackUtente($msg, $vd, "Insegnamento selezionato");
                     }
                     $this->showHomeUtente($vd);
                     break;
                     // aggiunta di un membro della  commissione
                 // aggiunta di un membro della  commissione
                 case 'r_add_commissione':
                     if (isset($elenco_id)) {
                         // richiesta di aggiungere un nuovo membro
                         $index = filter_var($request['nuovo-membro'], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                         if (isset($index) && ($new_docente = UserFactory::instance()->cercaUtentePerId($index, User::Docente)) != null) {
                             // docente trovato
                             // aggiungiamo il docente alla lista
                             if (!$_SESSION[self::elenco][$elenco_id]->getTemplate()->aggiungiMembroCommissione($new_docente)) {
                                 $msg[] = '<li>Il docente specificato &egrave; gi&agrave; in lista </li>';
                             } else {
                                 // copiamo la nuova commissione nella variabile della vista
                                 $commissione = $_SESSION[self::elenco][$elenco_id]->getTemplate()->getCommissione();
                             }
                         } else {
                             // docente non trovato
                             $msg[] = '<li>Impossibile trovare il  docente specificato </li>';
                         }
                         $this->creaFeedbackUtente($msg, $vd, "Membro aggiunto in commissione");
                     }
                     $this->showHomeUtente($vd);
                     break;
                     // rimozione di un membro della commissione
                 // rimozione di un membro della commissione
                 case 'r_del_commissione':
                     if (isset($elenco_id)) {
                         $index = filter_var($request['index'], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                         if (isset($index) && $index >= 0 && $index < count($commissione)) {
                             $old_docente = $_SESSION[self::elenco][$elenco_id]->getTemplate()->getCommissione()[$index];
                             if (!$_SESSION[self::elenco][$elenco_id]->getTemplate()->rimuoviMembroCommissione($old_docente)) {
                                 $msg[] = '<li>Il docente specificato non &egrave; in lista </li>';
                             } else {
                                 // copiamo la nuova commissione nella variabile della vista
                                 $commissione = $_SESSION[self::elenco][$elenco_id]->getTemplate()->getCommissione();
                             }
                         } else {
                             $msg[] = '<li>Impossibile trovare il membro specificato </li>';
                         }
                     }
                     $this->creaFeedbackUtente($msg, $vd, "Membro rimosso dalla commissione");
                     $this->showHomeUtente($vd);
                     break;
                     // salvataggio della commissione per l'elenco
                 // salvataggio della commissione per l'elenco
                 case 'r_save_commissione':
                     if (isset($elenco_id)) {
                         if (!$_SESSION[self::elenco][$elenco_id]->getTemplate()->commissioneValida()) {
                             $msg[] = '<li>Ci devono essere almeno due membri in commissione</li>';
                         }
                         $this->creaFeedbackUtente($msg, $vd, "Commissione inserita correttamente");
                         if (count($msg) > 0) {
                             $vd->setSottoPagina('reg_esami_step2');
                         }
                     }
                     $this->showHomeUtente($vd);
                     break;
                     // aggiunta di uno statino
                 // aggiunta di uno statino
                 case 'r_add_esame':
                     if (isset($elenco_id)) {
                         $new_esame = new Esame();
                         $new_esame->setInsegnamento($_SESSION[self::elenco][$elenco_id]->getTemplate()->getInsegnamento());
                         $new_esame->setCommissione($_SESSION[self::elenco][$elenco_id]->getTemplate()->getCommissione());
                         // aggiungiamo un esame alla lista
                         if (isset($request['matricola'])) {
                             $studente = UserFactory::instance()->cercaStudentePerMatricola($request['matricola']);
                             if (!isset($studente)) {
                                 $msg[] = '<li>La matricola specificata non &egrave; associata ad uno studente</li>';
                             } else {
                                 // impostiamo lo studente
                                 $new_esame->setStudente($studente);
                             }
                         } else {
                             $msg[] = '<li>Specificare una matricola</li>';
                         }
                         if (isset($request['voto'])) {
                             if (!$new_esame->setVoto($request['voto'])) {
                                 $msg[] = '<li>Il voto specificato non &egrave; corretto</li>';
                             }
                         } else {
                             $msg[] = '<li>Specificare un voto </li>';
                         }
                         if (count($msg) == 0 && !$_SESSION[self::elenco][$elenco_id]->aggiungiEsame($new_esame)) {
                             // esame duplicato
                             $msg[] = '<li>Lo statino specificato &egrave; gi&agrave; presente in elenco </li>';
                         } else {
                             // facciamo una copia aggiornata dell'elenco esami per la vista
                             $sel_esami = $_SESSION[self::elenco][$elenco_id]->getEsami();
                         }
                         $this->creaFeedbackUtente($msg, $vd, "Statino inserito in elenco");
                     }
                     $this->showHomeUtente($vd);
                     break;
                     // rimozione di uno statino
                 // rimozione di uno statino
                 case 'r_del_esame':
                     if (isset($elenco_id)) {
                         $index = filter_var($request['index'], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                         if (isset($index) && $index >= 0 && $index < count($sel_esami)) {
                             $old_statino = $_SESSION[self::elenco][$elenco_id]->getEsami()[$index];
                             if (!$_SESSION[self::elenco][$elenco_id]->rimuoviEsame($old_statino)) {
                                 $msg[] = '<li>L\'esame specificato non &egrave; in lista </li>';
                             } else {
                                 // facciamo una copia aggiornata dell'elenco esami per la vista
                                 $sel_esami = $_SESSION[self::elenco][$elenco_id]->getEsami();
                             }
                         } else {
                             $msg[] = '<li>Impossibile trovare lo statino specificato </li>';
                         }
                         $this->creaFeedbackUtente($msg, $vd, "Statino eliminato correttamente");
                     }
                     $this->showHomeUtente($vd);
                     break;
                     // salvataggio permanente dell'elenco
                 // salvataggio permanente dell'elenco
                 case 'r_salva_elenco':
                     if (isset($elenco_id)) {
                         if (count($_SESSION[self::elenco][$elenco_id]->getEsami()) > 0) {
                             if (!EsameFactory::instance()->salvaElenco($_SESSION[self::elenco][$elenco_id])) {
                                 $msg[] = '<li> Impossibile salvare l\'elenco</li>';
                             } else {
                                 unset($_SESSION[self::elenco][$elenco_id]);
                                 $elenchi_attivi = $_SESSION[self::elenco];
                                 $vd->setPagina("reg_esami");
                                 $vd->setSottoPagina('reg_esami');
                             }
                         } else {
                             $msg[] = '<li> &Egrave; necessario inserire almeno un esame</li>';
                         }
                         $this->creaFeedbackUtente($msg, $vd, "Esami registrati correttamente");
                     }
                     $this->showHomeUtente($vd);
                     break;
                     // cancellazione di un elenco
                 // cancellazione di un elenco
                 case 'r_del_elenco':
                     if (isset($elenco_id) && array_key_exists($elenco_id, $_SESSION[self::elenco])) {
                         unset($_SESSION[self::elenco][$elenco_id]);
                         $this->creaFeedbackUtente($msg, $vd, "Elenco cancellato");
                         $elenchi_attivi = $_SESSION[self::elenco];
                     }
                     $this->showHomeUtente($vd);
                     break;
                     // ricerca di un esame
                 // ricerca di un esame
                 case 'e_cerca':
                     $msg = array();
                     $this->creaFeedbackUtente($msg, $vd, "Lo implementiamo con il db, fai conto che abbia funzionato ;)");
                     $this->showHomeUtente($vd);
                     break;
                     // default
                 // default
                 default:
                     $this->showHomeUtente($vd);
                     break;
             }
         } else {
             // nessun comando, dobbiamo semplicemente visualizzare
             // la vista
             // nessun comando
             $user = UserFactory::instance()->cercaUtentePerId($_SESSION[BaseController::user], $_SESSION[BaseController::role]);
             $this->showHomeUtente($vd);
         }
     }
     // richiamo la vista
     require basename(__DIR__) . '/../view/master.php';
 }
 /**
  * Metodo per gestire l'input dell'utente. 
  * @param type $request la richiesta da gestire
  */
 public function handleInput(&$request)
 {
     // creo il descrittore della vista
     $vd = new ViewDescriptor();
     // imposto la pagina
     $vd->setPagina($request['page']);
     // gestion dei comandi
     // tutte le variabili che vengono create senza essere utilizzate
     // direttamente in questo switch, sono quelle che vengono poi lette
     // dalla vista, ed utilizzano le classi del modello
     if (!$this->loggedIn()) {
         // utente non autenticato, rimando alla home
         $this->showLoginPage($vd);
     } else {
         // utente autenticato
         $user = UserFactory::instance()->cercaUtentePerId($_SESSION[BaseController::user], $_SESSION[BaseController::role]);
         // verifico quale sia la sottopagina della categoria
         // Docente da servire ed imposto il descrittore
         // della vista per caricare i "pezzi" delle pagine corretti
         // tutte le variabili che vengono create senza essere utilizzate
         // direttamente in questo switch, sono quelle che vengono poi lette
         // dalla vista, ed utilizzano le classi del modello
         if (isset($request["subpage"])) {
             switch ($request["subpage"]) {
                 //ad ogni pagina viene associato un valore nella variabile $_SESSION['pagina'] per fare in modo che nel menu
                 //a sinistra appaiano informazioni guida differenti a seconda della pagina che si sta visualizzando
                 // modifica dei dati anagrafici per le consegne a domicilio
                 case 'anagrafica':
                     $_SESSION['pagina'] = 'anagrafica.php';
                     $vd->setSottoPagina('anagrafica');
                     break;
                     // Ordinazione delle Album con scelta dei quantità e dimensioni
                 // Ordinazione delle Album con scelta dei quantità e dimensioni
                 case 'ordina':
                     $_SESSION['pagina'] = 'ordina.php';
                     $album = AlbumFactory::instance()->getAlbum();
                     $orari = OrarioFactory::instance()->getOrari();
                     $vd->setSottoPagina('ordina');
                     break;
                     // visualizzazione degli ordini effettuati precedentemente
                 // visualizzazione degli ordini effettuati precedentemente
                 case 'elenco_ordini':
                     $_SESSION['pagina'] = 'elenco_ordini.php';
                     $ordini = OrdineFactory::instance()->getOrdiniPerIdCliente($user);
                     $vd->setSottoPagina('elenco_ordini');
                     break;
                     // visualizzaza come raggiungere e i vari contatti della Albumria
                 // visualizzaza come raggiungere e i vari contatti della Albumria
                 case 'contatti':
                     $_SESSION['pagina'] = 'contatti.php';
                     $vd->setSottoPagina('contatti');
                     break;
                 default:
                     $_SESSION['pagina'] = 'home.php';
                     $vd->setSottoPagina('home');
                     break;
             }
         }
         // gestione dei comandi inviati dall'utente
         if (isset($request["cmd"])) {
             // abbiamo ricevuto un comando
             switch ($request["cmd"]) {
                 // logout
                 case 'logout':
                     $this->logout($vd);
                     break;
                 case 'procedi_ordine':
                     //si verifica che i dati inseriti dall'utente relativamente a quantità e dimensione Album siano nel formato
                     //corretto e in numero accettabile. Successivamente ad ogni tipologia di prodotto viene associato un
                     //nuovo record nella tabella Album_ordini in cui viene indicato, oltre al numero ordine relativo, anche
                     //la quantità di Album di quel determinato tipo che si vogliono ordinare.
                     $vd->setSottoPagina('conferma_ordine');
                     $msg = array();
                     //carico un array con tutti gli id delle Album ordinabili
                     $idAlbum = AlbumFactory::instance()->getIdAlbum();
                     //verifico se i valori inseriti dall'utente sono corretti e conto quante Album sono state ordinate in totale
                     $nAlbum = $this->validaForm($idAlbum, $request);
                     $flagOrario = false;
                     //creo un nuovo ordine attualmente formato solo dall'id (che è anche l'ulitmo disponibile)
                     $ordine = new Ordine();
                     $ordine->setId(OrdineFactory::instance()->getLastId());
                     $ordineId = $ordine->getId();
                     //se il numero di Album ordinate è accettabile (>0) verifico se la fascia oraria richiesta è a sua volta disponibile
                     //per quel quantitativo di Album. se non lo è assegno quella disponibile piu vicina
                     if ($nAlbum) {
                         $orari = OrarioFactory::instance()->getOrariSuccessivi($request['orario']);
                         foreach ($orari as $orario) {
                             if (Album_ordineFactory::instance()->getNAlbumPerOrario($orario->getId()) + $nAlbum <= $orario->getOrdiniDisponibili()) {
                                 //var_dump("Album per orario ".Album_ordineFactory::instance()->getNAlbumPerOrario($orario->getId()));
                                 $ordine->setOrario($orario->getId());
                                 $flagOrario = true;
                                 break;
                             } else {
                                 $ordine->setOrario(NULL);
                             }
                         }
                     } else {
                         $msg[] = '<li>I valori inseriti non sono validi. Ordine annullato</li>';
                         $vd->setSottoPagina('ordina');
                         $this->creaFeedbackUtente($msg, $vd, "");
                         $this->showHomeUtente($vd);
                         break;
                     }
                 case 'dettaglio':
                     //mi permette di vedere i dettagli relativi a un ordine : elenco Album, quantità, prezzi singoli e totali
                     //e richieste di consegne
                     $_SESSION['pagina'] = 'dettaglio_ordine.php';
                     $ordineId = filter_var($request['ordine'], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                     $ordine = OrdineFactory::instance()->getOrdine($ordineId);
                     $POs = Album_ordineFactory::instance()->getPOPerIdOrdine($ordine);
                     $vd->setSottoPagina('dettaglio_ordine');
                     $this->showHomeUtente($vd);
                     break;
                 case 'conferma_ordine':
                     //dopo il riepilogo dell'ordine il ciente puo' decidere se confermarlo o...
                     $msg = array();
                     $ordineId = $request['ordineId'];
                     $this->creaFeedbackUtente($msg, $vd, "Ordine " . $ordineId . " creato con successo.");
                     $vd->setSottoPagina('home');
                     $this->showHomeUtente($vd);
                     break;
                 case 'cancella_ordine':
                     //...cancella PO e ordine
                     $msg = array();
                     $ordineId = $request['ordineId'];
                     $p = Album_ordineFactory::instance()->cancellaPO($ordineId);
                     $o = OrdineFactory::instance()->cancellaOrdine($ordineId);
                     if ($p && $o) {
                         $this->creaFeedbackUtente($msg, $vd, "Ordine " . $ordineId . " cancellato.");
                     } else {
                         $this->creaFeedbackUtente('<li>Errore cancellazione</li>', $vd, "");
                     }
                     $vd->setSottoPagina('home');
                     $this->showHomeUtente($vd);
                     break;
                 case 'indirizzo':
                     //aggiornamento indirizzo - l'indirizzo viene utilizzato per le consegne a domicilio
                     $msg = array();
                     $this->aggiornaIndirizzo($user, $request, $msg);
                     $this->creaFeedbackUtente($msg, $vd, "Indirizzo aggiornato");
                     $this->showHomeCliente($vd);
                     break;
                 case 'password':
                     // cambio password
                     $msg = array();
                     $this->aggiornaPassword($user, $request, $msg);
                     $this->creaFeedbackUtente($msg, $vd, "Password aggiornata");
                     $this->showHomeCliente($vd);
                     break;
                 default:
                     $this->showHomeUtente($vd);
             }
         } else {
             // nessun comando
             $user = UserFactory::instance()->cercaUtentePerId($_SESSION[BaseController::user], $_SESSION[BaseController::role]);
             $this->showHomeUtente($vd);
         }
     }
     // includo la vista
     require basename(__DIR__) . '/../view/master.php';
 }
 /**
  * Metodo per gestire l'input dell'utente. 
  * @param type $request la richiesta da gestire
  */
 public function handleInput(&$request)
 {
     // creo il descrittore della vista
     $vd = new ViewDescriptor();
     // imposto la pagina
     $vd->setPagina($request['page']);
     if (!$this->loggedIn()) {
         // utente non autenticato, rimando alla home
         $this->showLoginPage($vd);
     } else {
         // utente autenticato
         $user = UserFactory::instance()->cercaUtentePerId($_SESSION[BaseController::user], $_SESSION[BaseController::role]);
         // verifico quale sia la sottopagina della categoria
         // Docente da servire ed imposto il descrittore
         // della vista per caricare i "pezzi" delle pagine corretti
         // tutte le variabili che vengono create senza essere utilizzate
         // direttamente in questo switch, sono quelle che vengono poi lette
         // dalla vista, ed utilizzano le classi del modello
         if (isset($request["subpage"])) {
             switch ($request["subpage"]) {
                 // visualizza i dati anagrafici
                 case 'anagrafica':
                     $_SESSION['pagina'] = 'anagrafica.php';
                     $vd->setSottoPagina('anagrafica');
                     break;
                     // gestione degli ordini eseguiti oggi
                 // gestione degli ordini eseguiti oggi
                 case 'gestione_ordini':
                     $_SESSION['pagina'] = 'gestione_ordini.php';
                     $ordini = OrdineFactory::instance()->getOrdiniNonPagati();
                     $vd->setSottoPagina('gestione_ordini');
                     break;
                     // ricerca di tutti gli ordini che sono stati eseguiti tramite il sito
                 // ricerca di tutti gli ordini che sono stati eseguiti tramite il sito
                 case 'ricerca_ordini':
                     $_SESSION['pagina'] = 'ricerca_ordini.php';
                     $date = OrdineFactory::instance()->getDate();
                     $vd->setSottoPagina('ricerca_ordini');
                     $vd->addScript("../js/jquery-2.1.1.min.js");
                     $vd->addScript("../js/ricercaOrdini.js");
                     break;
                     // utilizzo la funzione js e il json per ricercare e stampare i risultati della ricerca_ordini
                 // utilizzo la funzione js e il json per ricercare e stampare i risultati della ricerca_ordini
                 case 'filtra_ordini':
                     $vd->toggleJson();
                     $vd->setSottoPagina('ricerca_ordini_json');
                     $errori = array();
                     if (isset($request['myData']) && $request['myData'] != '') {
                         $data = $request['myData'];
                     } else {
                         $data = null;
                     }
                     if (isset($request['myOra']) && $request['myOra'] != '') {
                         $ora = $request['myOra'];
                     } else {
                         $ora = null;
                     }
                     //var_dump("data ".$data." Ora " .$ora);
                     $ordini = OrdineFactory::instance()->getOrdiniPerDataOra($data, $ora);
                     //i dati si vedono nel js ma non nel controller ne nel json
                     break;
                 default:
                     $_SESSION['pagina'] = 'home.php';
                     $vd->setSottoPagina('home');
                     break;
             }
         }
         // gestione dei comandi inviati dall'utente
         if (isset($request["cmd"])) {
             switch ($request["cmd"]) {
                 // logout
                 case 'logout':
                     $this->logout($vd);
                     break;
                 case 'dettaglio':
                     //mi permette di vedere i dettagli relativi a un ordine : elenco pizze, quantità, prezzi singoli e totali
                     //e richieste di consegne a domicilio
                     $_SESSION['pagina'] = 'dettaglio_ordine.php';
                     $ordineId = filter_var($request['ordine'], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                     $ordine = OrdineFactory::instance()->getOrdine($ordineId);
                     $POs = Album_ordineFactory::instance()->getPOPerIdOrdine($ordine);
                     $cliente = UserFactory::instance()->getClientePerId($ordine->getCliente());
                     $vd->setSottoPagina('dettaglio_ordine');
                     $this->showHomeUtente($vd);
                     break;
                 case 'paga':
                     //permette al dipendente di segnalare un ordine come pagato e quindi non farlo piu apparire
                     //nell'elenco degli ordini da gestire
                     $msg = array();
                     $ordineId = filter_var($request['ordine'], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                     if (OrdineFactory::instance()->setPagato($ordineId, $user)) {
                         $this->creaFeedbackUtente($msg, $vd, "Ordine " . $ordineId . " pagato.");
                     } else {
                         $this->creaFeedbackUtente($msg, $vd, "Errore cancellazione");
                     }
                     $vd->setSottoPagina('gestione_ordini');
                     $ordini = OrdineFactory::instance()->getOrdiniNonPagati();
                     $this->showHomeUtente($vd);
                     break;
                     // default
                 // default
                 default:
                     $this->showHomeUtente($vd);
                     break;
             }
         } else {
             // nessun comando, dobbiamo semplicemente visualizzare la vista
             $user = UserFactory::instance()->cercaUtentePerId($_SESSION[BaseController::user], $_SESSION[BaseController::role]);
             $this->showHomeUtente($vd);
         }
     }
     // richiamo la vista
     require basename(__DIR__) . '/../view/master.php';
 }
 public function handle_input(&$request)
 {
     $vd = new ViewDescriptor();
     $vd->setPagina($request['page']);
     $this->setImpToken($vd, $request);
     //untente non autentificato
     if (!$this->loggedIn()) {
         $this->showLoginPage($vd);
     } else {
         $user = UserFactory::instance()->cercaUtentePerId($_SESSION[BaseController::user], $_SESSION[BaseController::role]);
         //carica le pizze da visualizzare sulla galleria
         $listaPizzeConImg = PizzaFactory::instance()->getListaPizze(true);
         reset($listaPizzeConImg);
         $pizza = current($listaPizzeConImg);
         $index = 0;
         //        var_dump($listaPizzeConImg);
         $vd->setAjaxFile(basename(__DIR__) . '/../view/ajax.php');
         if (isset($request["subpage"])) {
             switch ($request["subpage"]) {
                 case 'base':
                     $vd->setSottoPagina('base');
                     $vd->setBreadcrumb("Modifica username o e-mail");
                     break;
                 case 'password':
                     $vd->setSottoPagina('password');
                     $vd->setBreadcrumb("Modifica password");
                     break;
                 case 'pagamento':
                     $pagamenti = PagamentoFactory::instance()->getListaPagamentiPerCliente($user);
                     $vd->setSottoPagina('pagamento');
                     $vd->setBreadcrumb("Visualizza i tuoi metodi di pagamento");
                     break;
                 case 'visualizza_pagamento':
                     $pagamenti = PagamentoFactory::instance()->getListaPagamentiPerCliente($user);
                     $vd->setSottoPagina('visualizza_pagamento');
                     $vd->setBreadcrumb("Visualizza i tuoi metodi di pagamento");
                     break;
                 case 'indirizzo':
                     $vd->setSottoPagina('indirizzo');
                     $vd->setBreadcrumb("Modifica indirizzo di consegna");
                     break;
                 case 'account':
                     $msg = array();
                     if (!isset($_SESSION[self::elenco_articoli])) {
                         $_SESSION[self::elenco_articoli] = array();
                     }
                     $vd->setSottoPagina('account');
                     break;
                 case 'conferma_ordine_step1':
                     $vd->setSottoPagina('conferma_ordine_step1');
                     $vd->setTitoloStep('Passo 1: seleziona indirizzo di consegna');
                     break;
                 case 'conferma_ordine_step2':
                     $vd->setSottoPagina('conferma_ordine_step2');
                     $vd->setTitoloStep('Passo 2: riepilogo articoli');
                     break;
                 case 'conferma_ordine_step3':
                     $vd->setSottoPagina('conferma_ordine_step3');
                     $vd->setTitoloStep('Passo 3: seleziona metodo di pagamento');
                     $pagamenti = PagamentoFactory::instance()->getListaPagamentiPerCliente($user);
                     break;
                 case 'cronologia_ordini':
                     $ordini = OrdineFactory::instance()->getListaOrdiniPerCliente($user);
                     $vd->setSottoPagina('cronologia_ordini');
                     $vd->setBreadcrumb("Visualizza cronologia ordini");
                     break;
                 case 'ordini_attivi':
                     $ordini = OrdineFactory::instance()->getListaOrdiniPerCliente($user, true);
                     $vd->setSottoPagina('cronologia_ordini');
                     $vd->setBreadcrumb("Visualizza ordini in corso");
                     break;
                 default:
                     if (!isset($_SESSION[self::elenco_articoli])) {
                         $_SESSION[self::elenco_articoli] = array();
                     }
                     $vd->setSottoPagina('home');
                     break;
             }
         }
         if (isset($request["cmd"])) {
             switch ($request["cmd"]) {
                 //salvataggio permanente elenco articoli
                 case 'ordina':
                     $msg = array();
                     if (!empty($_SESSION[self::elenco_articoli])) {
                         if (isset($request['carta'])) {
                             $carta = intval($request['carta']);
                             $pagamento = PagamentoFactory::instance()->cercaPagamentoPerId($carta);
                             if (!isset($pagamento)) {
                                 $msg[] = 'Il metodo di pagamento inserito non &egrave; valido';
                                 $vd->setTitoloStep('Passo 3: seleziona metodo di pagamento');
                                 $vd->setSottoPagina('conferma_ordine_step3');
                             } else {
                                 if (!OrdineFactory::instance()->salvaOrdine($_SESSION[self::elenco_articoli], $user->getId(), $pagamento, $this->getSubTotale(true))) {
                                     $msg[] = '<li>Spiacente. Impossibile terminare la transazione</li>';
                                     $vd->setTitoloStep('Passo 3: seleziona metodo di pagamento');
                                     $vd->setSottoPagina('conferma_ordine_step3');
                                 } else {
                                     $_SESSION[self::elenco_articoli] = array();
                                     $vd->setSottoPagina('home');
                                 }
                             }
                         }
                         $this->creaFeedbackUtente($msg, $vd, 'Ordine inviato');
                     }
                     $this->showHomeCliente($vd);
                     $pagamenti = PagamentoFactory::instance()->getListaPagamentiPerCliente($user);
                     break;
                     //rimuove un articolo dal carrello
                 //rimuove un articolo dal carrello
                 case 'remove':
                     if (isset($request['key'])) {
                         $key = intval($request['key']);
                         if (array_key_exists($key, $_SESSION[self::elenco_articoli])) {
                             $this->rimuoviArticolo($_SESSION[self::elenco_articoli][$key]);
                         }
                     }
                     $subpage = $_REQUEST['subpage'];
                     if (empty($_SESSION[self::elenco_articoli])) {
                         $subpage = 'home';
                         $vd->setSottoPagina('home');
                     }
                     $this->showHomeCliente($vd);
                     header('Location: ' . Settings::getApplicationPath() . "php/cliente/{$subpage}");
                     exit;
                     break;
                     /**
                      * è stato aggiunto un "articolo" al carrello, 
                      * ovvero una quantità di pizze di un determinato tipo e di una certa dimensione
                      */
                 /**
                  * è stato aggiunto un "articolo" al carrello, 
                  * ovvero una quantità di pizze di un determinato tipo e di una certa dimensione
                  */
                 case 'add':
                     //controlla la provenienza della richiesta: selectmenu form ...
                     if (isset($request['pizza-selection']) && isset($request['size']) && isset($request['quantity'])) {
                         if (PizzaFactory::instance()->cercaPizzaPerId(intval($request['pizza-selection']))) {
                             $articolo = new ArticoloSession(PizzaFactory::instance()->cercaPizzaPerId(intval($request['pizza-selection'])), $request['size'], intval($request['quantity']));
                             $this->aggiungiArticolo($articolo);
                         }
                     }
                     //... altrimenti gallery form
                     if (isset($request['pizza-gallery']) && isset($request['size']) && isset($request['quantity'])) {
                         $key = intval($request['pizza-gallery']);
                         if (array_key_exists($key, $listaPizzeConImg)) {
                             $articolo = new ArticoloSession(PizzaFactory::instance()->cercaPizzaPerId($listaPizzeConImg[$key]->getId()), $request['size'], intval($request['quantity']));
                             $this->aggiungiArticolo($articolo);
                         }
                     }
                     //                        file_put_contents('php/text.txt', $_SERVER['REQUEST_URI'], FILE_APPEND);
                     $vd->setSottoPagina('home');
                     $this->showHomeCliente($vd);
                     /**
                      * Evita l'auto-submit del form in seguito alla ricarica della pagina nel browser.
                      * Problema presente anche nel progetto d'esempio:
                      * http://spano.sc.unica.it/amm2014/davide/esami14/php/docente/reg_esami_step1?cmd=r_nuovo
                      */
                     header('Location: ' . Settings::getApplicationPath() . 'php/cliente/home');
                     exit;
                     break;
                     //visualizza i dettagli di un metodo di pagamento selezionato
                 //visualizza i dettagli di un metodo di pagamento selezionato
                 case 'v_pagamento':
                     $msg = array();
                     //                        var_dump($request);
                     $p = 0;
                     if (isset($request['carta'])) {
                         $p = filter_var($request['carta'], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                         if (!array_key_exists($p, $pagamenti)) {
                             $msg[] = '<li>Il metodo di pagamento specificato non &egrave; valido</li>';
                             $vd->setSottoPagina('pagamento');
                             $this->creaFeedbackUtente($msg, $vd, '');
                         } else {
                             $carta = $pagamenti[$p];
                             $vd->setSottoPagina('visualizza_pagamento');
                         }
                     } else {
                         $vd->setSottoPagina('pagamento');
                     }
                     $this->showHomeUser($vd);
                     break;
                 case 'aggiorna_indirizzo':
                     $msg = array();
                     $this->aggiornaIndirizzo($user, $request, $msg);
                     $this->creaFeedbackUtente($msg, $vd, "Indirizzo di consegna aggiornato");
                     $this->showHomeUser($vd);
                     break;
                 case 'aggiorna_password':
                     $msg = array();
                     $this->aggiornaPassword($user, $request, $msg);
                     $this->creaFeedbackUtente($msg, $vd, 'Password aggiornata');
                     $vd->setSottoPagina('password');
                     $vd->setBreadcrumb("Modifica password");
                     $this->showHomeUser($vd);
                     break;
                     // aggiorna username, e-mail
                 // aggiorna username, e-mail
                 case 'aggiorna_info_base':
                     $msg = array();
                     $vd->setSottoPagina('base');
                     $vd->setBreadcrumb("Modifica username o e-mail");
                     $this->aggiornaInfoBase($user, $request, $msg);
                     $this->creaFeedbackUtente($msg, $vd, 'Username/e-mail sono stati aggiornati');
                     $this->showHomeUser($vd);
                     break;
                 case 'logout':
                     $this->logout($vd);
                     break;
                     // ajax: click di un bullet: cambia pizza visualizzata sulla gallery
                 // ajax: click di un bullet: cambia pizza visualizzata sulla gallery
                 case 'go':
                     $vd->toggleJson();
                     $index = filter_var($request["id"], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                     if (!array_key_exists($index, $listaPizzeConImg)) {
                         $index = 0;
                     }
                     $pizza = $listaPizzeConImg[$index];
                     break;
                     // ajax: click next arrow: visualizza la pizza successiva
                 // ajax: click next arrow: visualizza la pizza successiva
                 case 'next':
                     $vd->toggleJson();
                     $index = filter_var($request["id"], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                     if (!isset($index)) {
                         $intVal = 0;
                     }
                     $index++;
                     if ($index > count($listaPizzeConImg) - 1) {
                         $index = 0;
                     }
                     $pizza = $listaPizzeConImg[$index];
                     break;
                     // ajax: click previous arrow: visualizza la pizza precedente
                 // ajax: click previous arrow: visualizza la pizza precedente
                 case 'prev':
                     $vd->toggleJson();
                     $index = filter_var($request["id"], FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
                     if (!isset($index)) {
                         $index = 0;
                     }
                     $index--;
                     if ($index < 0) {
                         $index = count($listaPizzeConImg) - 1;
                     }
                     $pizza = $listaPizzeConImg[$index];
                     break;
                 default:
                     $this->showHomeCliente($vd);
             }
         } else {
             // nessun comando
             $user = UserFactory::instance()->cercaUtentePerId($_SESSION[BaseController::user], $_SESSION[BaseController::role]);
             $this->showHomeUser($vd);
         }
     }
     require basename(__DIR__) . '/../view/master.php';
 }
 /**
  * Metodo per gestire l'input dell'utente. 
  * @param type $request la richiesta da gestire
  */
 public function handleInput(&$request)
 {
     // creo il descrittore della vista
     $vd = new ViewDescriptor();
     // imposto la pagina
     $vd->setPagina($request['page']);
     // imposto il token per impersonare un utente (nel lo stia facendo)
     $this->setImpToken($vd, $request);
     // gestion dei comandi
     // tutte le variabili che vengono create senza essere utilizzate
     // direttamente in questo switch, sono quelle che vengono poi lette
     // dalla vista, ed utilizzano le classi del modello
     if (!$this->loggedIn()) {
         // utente non autenticato, rimando alla home
         $this->showLoginPage($vd);
     } else {
         // utente autenticato
         $user = UserFactory::instance()->cercaUtentePerId($_SESSION[BaseController::user], $_SESSION[BaseController::role]);
         // verifico quale sia la sottopagina della categoria
         // Docente da servire ed imposto il descrittore
         // della vista per caricare i "pezzi" delle pagine corretti
         // tutte le variabili che vengono create senza essere utilizzate
         // direttamente in questo switch, sono quelle che vengono poi lette
         // dalla vista, ed utilizzano le classi del modello
         if (isset($request["subpage"])) {
             switch ($request["subpage"]) {
                 // modifica dei dati anagrafici
                 case 'anagrafica':
                     $vd->setSottoPagina('anagrafica');
                     break;
                     // visualizzazione degli esami sostenuti
                 // visualizzazione degli esami sostenuti
                 case 'esami':
                     $esami = EsameFactory::instance()->esamiPerStudente($user);
                     $vd->setSottoPagina('esami');
                     break;
                     // iscrizione ad un appello
                 // iscrizione ad un appello
                 case 'iscrizione':
                     // carichiamo gli appelli dal db
                     $appelli = AppelloFactory::instance()->getAppelliPerStudente($user);
                     $vd->setSottoPagina('iscrizione');
                     break;
                 default:
                     $vd->setSottoPagina('home');
                     break;
             }
         }
         // gestione dei comandi inviati dall'utente
         if (isset($request["cmd"])) {
             // abbiamo ricevuto un comando
             switch ($request["cmd"]) {
                 // logout
                 case 'logout':
                     $this->logout($vd);
                     break;
                     // aggiornamento indirizzo
                 // aggiornamento indirizzo
                 case 'indirizzo':
                     // in questo array inserisco i messaggi di
                     // cio' che non viene validato
                     $msg = array();
                     $this->aggiornaIndirizzo($user, $request, $msg);
                     $this->creaFeedbackUtente($msg, $vd, "Indirizzo aggiornato");
                     $this->showHomeUtente($vd);
                     break;
                     // cambio email
                 // cambio email
                 case 'email':
                     // in questo array inserisco i messaggi di
                     // cio' che non viene validato
                     $msg = array();
                     $this->aggiornaEmail($user, $request, $msg);
                     $this->creaFeedbackUtente($msg, $vd, "Email aggiornata");
                     $this->showHomeUtente($vd);
                     break;
                     // cambio password
                 // cambio password
                 case 'password':
                     // in questo array inserisco i messaggi di
                     // cio' che non viene validato
                     $msg = array();
                     $this->aggiornaPassword($user, $request, $msg);
                     $this->creaFeedbackUtente($msg, $vd, "Password aggiornata");
                     $this->showHomeStudente($vd);
                     break;
                     // iscrizione ad un appello
                 // iscrizione ad un appello
                 case 'iscrivi':
                     // recuperiamo l'indice
                     $msg = array();
                     $a = $this->getAppelloPerIndice($appelli, $request, $msg);
                     if (isset($a)) {
                         $isOk = $a->iscrivi($user);
                         $count = AppelloFactory::instance()->aggiungiIscrizione($user, $a);
                         if (!$isOk || $count != 1) {
                             $msg[] = "<li> Impossibile cancellarti dall'appello specificato </li>";
                         }
                     } else {
                         $msg[] = "<li> Impossibile iscriverti all'appello specificato. Verifica la capienza del corso </li>";
                     }
                     $this->creaFeedbackUtente($msg, $vd, "Ti sei iscritto all'appello specificato");
                     $this->showHomeStudente($vd);
                     break;
                     // cancellazione da un appello
                 // cancellazione da un appello
                 case 'cancella':
                     // recuperiamo l'indice
                     $msg = array();
                     $a = $this->getAppelloPerIndice($appelli, $request, $msg);
                     if (isset($a)) {
                         $isOk = $a->cancella($user);
                         $count = AppelloFactory::instance()->cancellaIscrizione($user, $a);
                         if (!$isOk || $count != 1) {
                             $msg[] = "<li> Impossibile cancellarti dall'appello specificato </li>";
                         }
                     } else {
                         $msg[] = "<li> Impossibile cancellarti dall'appello specificato </li>";
                     }
                     $this->creaFeedbackUtente($msg, $vd, "Ti sei cancellato dall'appello specificato");
                     $this->showHomeUtente($vd);
                     break;
                 default:
                     $this->showLoginPage($vd);
             }
         } else {
             // nessun comando
             $user = UserFactory::instance()->cercaUtentePerId($_SESSION[BaseController::user], $_SESSION[BaseController::role]);
             $this->showHomeUtente($vd);
         }
     }
     // includo la vista
     require basename(__DIR__) . '/../view/master.php';
 }
 /**
  * Crea un messaggio di feedback per l'utente 
  * @param array $msg lista di messaggi di errore
  * @param ViewDescriptor $vd il descrittore della pagina
  * @param string $okMsg il messaggio da mostrare nel caso non ci siano errori
  */
 protected function creaFeedbackUtente(&$msg, $vd, $okMsg)
 {
     if (count($msg) > 0) {
         // ci sono messaggi di errore nell'array,
         // qualcosa e' andato storto...
         $error = "Si sono verificati i seguenti errori:\n<ul>\n";
         foreach ($msg as $m) {
             $error = $error . $m . "\n";
         }
         // imposto il messaggio di errore
         $vd->setMessaggioErrore($error);
     } else {
         // non ci sono messaggi di errore, la procedura e' andata
         // quindi a buon fine, mostro un messaggio di conferma
         $vd->setMessaggioConferma($okMsg);
     }
 }