]> _ Git - cubeextranet.git/commitdiff
fix #3086 @0.75
authorvincent@cubedesigners.com <vincent@cubedesigners.com@f5622870-0f3c-0410-866d-9cb505b7a8ef>
Wed, 23 Oct 2019 14:41:22 +0000 (14:41 +0000)
committervincent@cubedesigners.com <vincent@cubedesigners.com@f5622870-0f3c-0410-866d-9cb505b7a8ef>
Wed, 23 Oct 2019 14:41:22 +0000 (14:41 +0000)
inc/commons/class.common.url.php

index 8e8d501f417e88b3f76db3a2633c8a637132088e..1d21ff1d5cf756f1d7ed6a9a5e1a8a8ba01d5858 100644 (file)
 <?php\r
 \r
-class commonUrl {\r
-\r
-       public static function hub($args) {\r
-               global $core;\r
-               $args = cubePage::getArgs($args);\r
-               // Si l'utilisateur n'est pas connecté, on affiche le formulaire\r
-               // de login\r
-\r
-               $bypass = array('stats', 'telecharger', 'telechargerr', 'orpiref');\r
-\r
-               if ((!isset($args[0]) || !in_array($args[0], $bypass)) && (is_null($core->user) || !$core->user)) {\r
-                       $args = array('login');\r
-               } else {\r
-                       if (isset($args[0]) && $args[0] == 'login') {\r
-                               http::redirect('/');\r
-                       }\r
-                       if (!count($args)) {\r
-                               // Page par défaut (premier onglet)\r
-                               if (MODE == 'extranet') {\r
-                                       $nav = extranetDroits::navigation();\r
-                               } elseif (MODE == 'ws') {\r
-                                       $nav = wsDroits::navigation();\r
-                               }\r
-                               foreach ($nav as $titre => $url) {\r
-                                       $args = array($url);\r
-                                       break;\r
-                               }\r
-                       }\r
-               }\r
-\r
-               $f = $args[0];\r
-\r
-               $classes = array(MODE . 'Url', 'commonUrl');\r
-\r
-               if (!isset($_GET['light'])) {\r
-                       echo commonPage::header($args);\r
-               }\r
-\r
-               foreach ($classes as $class) {\r
-                       $cb = array($class, $f);\r
-                       if (is_callable($cb)) {\r
-                               echo call_user_func($cb, $args);\r
-                               break;\r
-                       }\r
-               }\r
-               if (!isset($_GET['light'])) {\r
-                       echo commonPage::footer();\r
-               }\r
-       }\r
-\r
-       public static function login($args) {\r
-               global $core;\r
-               $core->con->select('SELECT 2');\r
-\r
-               $tentative = isset($_SESSION['errorLogin']) && $_SESSION['errorLogin'];\r
-               if ($tentative) {\r
-                       $_SESSION['errorLogin'] = false;\r
-               }\r
-\r
-               $message = $tentative ? '<p class="message"><br />' . __('Identifiants incorrects') . '</p>' : '';\r
-\r
-               $res = commonPage::barre();\r
-               $res .= commonPage::tMain();\r
-               $res .= commonPage::bh('login');\r
-               $res .= '<div class="form">';\r
-               $res .= '<form action="' . $_SERVER['REQUEST_URI'] . '" method="post" class="notajax">';\r
-               $res .= '<h1>' . __('Veuillez vous identifier') . '</h1>';\r
-               $res .= $message;\r
-               $res .= '<table>';\r
-               $res .= '<tr><td>' . __('Votre e-mail ou login') . ' : </td><td>' . cubeForm::email('user_email', 20, 64, '') . '</td></tr>';\r
-               $res .= '<tr><td>' . __('Votre mot de passe') . ' : </td><td>' . form::password('user_password', 20, 64, '') . '</td></tr>';\r
-               $res .= '<tr><td colspan="2"><a href="#" class="popup" rel="motdepasseOublie">' . __('Mot de passe oublié ? Cliquez ici') . '</a></td></tr>';\r
-               $res .= '<tr><td colspan="2" class="right"><a href="#" class="submit">' . $core->typo->BoutonOK('Cliquez-ici pour vous identifier') . '</a></td></tr>';\r
-               $res .= '</table>';\r
-               $res .= '</form>';\r
-               $res .= '</div>';\r
-               $res .= commonPage::bf();\r
-               $res .= commonPage::bMain();\r
-               return $res;\r
-       }\r
-\r
-       public static function logout($args) {\r
-               if (isset($_SESSION['user_email'])) {\r
-                       unset($_SESSION['user_email']);\r
-               }\r
-               if (isset($_SESSION['password_email'])) {\r
-                       unset($_SESSION['password_email']);\r
-               }\r
-               http::redirect(SITE_PATH);\r
-       }\r
-\r
-       public static function motdepasseOublie($args) {\r
-               return '<tr><td>' . __('Entrez votre e-mail') . ' : </td><td>' . cubeForm::email('email', 30, 128) . '</td></tr>';\r
-       }\r
-\r
-       public static function mesParametres($args) {\r
-               global $core;\r
-               $utilisateur = $core->user;\r
-\r
-               $res = '<tr><td>Mot de passe :</td><td><a href="#" class="popup" rel="changeMotdepasse">Changer mon mot de passe</a></td></tr>';\r
-               $res .= '<tr><td>Login :</td><td>' . form::field('login', 20, 64, $utilisateur->login) . '</td></tr>';\r
-               $res .= '<tr><td>Langue de l\'interface :</td><td>' . form::combo('lang', cubeLang::getAvailableLangs(true), $utilisateur->lang) . '</td></tr>';\r
-               $res .= '<tr><td colspan="2" class="right"><a href="#" class="submit">' . $core->typo->BoutonOK(__('Enregister')) . '</a></td></tr>';\r
-               if ($utilisateur instanceof commonClient) {\r
-                       $res .= '<tr><td colspan="2"></td></tr>';\r
-                       $res .= '<tr><th colspan="2">' . __('Mes informations') . '</th></tr>';\r
-                       $res .= '<tr><td>' . __('Numéro de client') . ' : </td><td>' . $utilisateur->utilisateur_id . '</td></tr>';\r
-                       $res .= '<tr><td>' . __('Prénom') . ' : </td><td>' . $utilisateur->prenom . '</td></tr>';\r
-                       $res .= '<tr><td>' . __('Nom') . ' : </td><td>' . $utilisateur->nom . '</td></tr>';\r
-                       $res .= '<tr><td>' . __('Adresse e-mail') . ' : </td><td>' . $utilisateur->email . '</td></tr>';\r
-                       $res .= '<tr><td>' . __('Raison sociale') . ' : </td><td>' . $utilisateur->rs . '</td></tr>';\r
-                       $res .= '<tr><td>' . __('Adresse') . ' : </td><td>' . nl2br($utilisateur->adresse) . '<br />' . $utilisateur->code_postal . ' ' . $utilisateur->ville . '<br />' . cubeCountry::getCountry($utilisateur->pays) . '</td></tr>';\r
-                       $res .= '<tr><td>' . __('Numéro de téléphone') . ' : </td><td>' . $utilisateur->telephone . '</td></tr>';\r
-                       $res .= '<tr><td>' . __('Numéro de mobile') . ' : </td><td>' . $utilisateur->mobile . '</td></tr>';\r
-                       $res .= '<tr><td>' . __('Numéro de fax') . ' : </td><td>' . $utilisateur->fax . '</td></tr>';\r
-                       $res .= '<tr><td>' . __('Numéro de TVA intracommunautaire') . ' : </td><td>' . $utilisateur->tva_intra . '</td></tr>';\r
-                       $res .= '<tr><td colspan="2"><em>' . __('Si les informations ci-dessus sont incomplètes ou erronées, veuillez nous<br />en informer en nous écrivant à ') . '<a href="mailto:' . FROM_EMAIL . '">' . FROM_EMAIL . '</a></em></td></tr>';\r
-               }\r
-\r
-               return $res;\r
-       }\r
-\r
-       public static function changeMotdepasse() {\r
-               $res = '<tr><td colspan="2"><em>' . __('Votre mot de passe doit comprendre en 6 et 10 caractères') . '</em></td></tr>';\r
-               $res .= '<tr><td>' . __('Tapez votre mot de passe actuel') . ' : </td><td>' . form::password('actuel', 20, 10) . '</td></tr>';\r
-               $res .= '<tr><td>' . __('Tapez votre nouveau mot de passe') . ' : </td><td>' . form::password('nouveau', 20, 10) . '</td></tr>';\r
-               $res .= '<tr><td>' . __('Confirmez votre nouveau mot de passe') . ' : </td><td>' . form::password('confirmation', 20, 10) . '</td></tr>';\r
-               return $res;\r
-       }\r
-\r
-       public static function orderby($label, $field, $settings, $function, $title = '') {\r
-               $res = '<a href="#" class="nowrap ajax" title="' . $title . '" rel="' . $function . '/' . $field . '">';\r
-               $res .= $label;\r
-               if ($settings['orderby'] == $field) {\r
-                       $puce = ($settings['sens'] == 'DESC') ? 'down' : 'up';\r
-                       $res .= ' ' . cubeMedia::image(IMG . '/' . $puce . '.png');\r
-               }\r
-               $res .= '</a>';\r
-               return $res;\r
-       }\r
-\r
-       public static function formParPage($action, $value, $nom = 'éléments', $all = true) {\r
-               $values = array(2, 5, 10, 15, 25, 50, 100);\r
-               if ($all) {\r
-                       $datas = array(__('Tous les ') . $nom => 0);\r
-               } else {\r
-                       $datas = array();\r
-               }\r
-               foreach ($values as $v) {\r
-                       $datas[$v . ' ' . $nom] = $v;\r
-               }\r
-\r
-               $res = '<form action="' . $action . '" method="post" class="submitonchange">';\r
-               $res .= '<div class="formParPage">' . __('Afficher') . ' : ' . form::combo(array('par_page'), $datas, $value) . ' ' . __('par page') . '</div>';\r
-               $res .= '<div>' . cubeMedia::spacer(950, 1) . '</div>';\r
-               $res .= '</form>';\r
-               return $res;\r
-       }\r
-\r
-       public static function autocomplete($args) {\r
-               global $core;\r
-\r
-               fb('!!!!');\r
-\r
-               if (isset($_GET['q'])) {\r
-                       $args[2] = $_GET['q'];\r
-               }\r
-               $q = mb_strtolower(cubeText::removeAccents($args[2]));\r
-               $suggestions = array();\r
-               if ($args[1] == 'client') {\r
-                       $dao = new commonDAOClient($core->con);\r
-                       $dao->setSearch($q, true);\r
-                       $clients = $dao->getListe();\r
-                       foreach ($clients as $client) {\r
-                               $suggestions[] = $client->utilisateur_id . ' - ' . $client->rs . ' (' . $client->prenom . ' ' . $client->nom . ')';\r
-                       }\r
-               } elseif ($args[1] == 'projet') {\r
-                       $dao = new extranetDAOProjet($core->con);\r
-                       $dao->setSearch($q, true);\r
-                       $projets = $dao->getListe();\r
-                       foreach ($projets as $projet) {\r
-                               $suggestions[] = $projet->projet_id . ' - ' . $projet->nom . ' (' . $projet->client . ')';\r
-                       }\r
-               } elseif ($args[1] == 'book') {\r
-                       $dao = new wsDAOBook($core->con);\r
-                       $dao->setSearch($q, true);\r
-                       $books = $dao->getListe('date', 'DESC', 15, $core->user);\r
-                       foreach ($books as $book) {\r
-                               $suggestions[] = $book->book_id . ' - ' . $book->nom;\r
-                       }\r
-               } elseif ($args[1] == 'wsuser') {\r
-                       $dao = new commonDAOUtilisateur($core->con);\r
-                       $dao->setSearch($q, true);\r
-                       $clients = $dao->getListe('utilisateur_id', 'ASC', null, ' AND ws_grade>0', $core->user);\r
-                       foreach ($clients as $client) {\r
-                               $suggestions[] = $client->utilisateur_id . ' - ' . $client->rs . ' (' . $client->prenom . ' ' . $client->nom . ')';\r
-                       }\r
-               } elseif ($args[1] == 'wsadmin') {\r
-                       $dao = new commonDAOUtilisateur($core->con);\r
-                       $dao->setSearch($q, true);\r
-                       $clients = $dao->getListe('utilisateur_id', 'ASC', null, 'AND ws_grade>2', $core->user);\r
-                       foreach ($clients as $client) {\r
-                               $suggestions[] = $client->utilisateur_id . ' - ' . $client->rs . ' (' . $client->prenom . ' ' . $client->nom . ')';\r
-                       }\r
-               }\r
-               cubeSearch::searchSuggestion($args[2], $suggestions);\r
-               exit;\r
-       }\r
-\r
-       public static function dashboard($args) {\r
-               commonDroits::dashboard();\r
-\r
-               cubePage::ui('Sortable');\r
-               $res = commonPage::barre();\r
-               $res .= commonPage::tMain('dash');\r
-               $res .= commonUrl::listeDashboard($args);\r
-               $res .= commonPage::bMain();\r
-               return $res;\r
-       }\r
-\r
-       public static function listeDashboard($args) {\r
-               commonDroits::dashboard();\r
-               global $core;\r
-               $r = $core->con->select('SELECT * FROM dashboard WHERE equipier=\'' . $core->user->utilisateur_id . '\' AND site=\'' . MODE . '\' ORDER BY sort');\r
-               $res = '';\r
-               while ($r->fetch()) {\r
-                       $res .= '<div class="dashboard" id="dashboard_' . $r->dashboard_id . '">';\r
-                       $res .= commonUrl::displayDashboard($r);\r
-                       $res .= '</div>';\r
-               }\r
-               return $res;\r
-       }\r
-\r
-       public static function displayDashboard($r) {\r
-               commonDroits::dashboard();\r
-               global $core;\r
-               $res = '<div class="caption">' . $core->typo->OngletBlanc($r->nom);\r
-\r
-               $close = ($r->state == '0') ? ' close' : '';\r
-               $hide = ($r->state == '0') ? ' class="close"' : '';\r
-\r
-               $res .= '<a href="#" rel="' . $r->dashboard_id . '" class="toggle' . $close . '">' . cubeMedia::spacer(18, 10) . '</a>';\r
-               $res .= '<a href="#" rel="formDashboard/d/' . $r->dashboard_id . '" class="edit popup">' . cubeMedia::image(IMG . '/edit.png') . '</a>';\r
-               $res .= '<a href="#" rel="delDashboard/' . $r->dashboard_id . '" class="ajax delete" title="' . __('Êtes vous certain de vouloir supprimer cette liste de votre dashboard ?') . '">' . cubeMedia::image(IMG . '/delete.png') . '</a>';\r
-               $res .= '</div>';\r
-               $res .= commonPage::bh();\r
-               $res .= '<div' . $hide . '>';\r
-\r
-               if ($r->rubrique == 'projets') {\r
-                       $res .= extranetUrl::listeProjets($r->dashboard_id, self::getDashboardSettings($r->settings));\r
-               } elseif ($r->rubrique == 'factures') {\r
-                       $res .= extranetUrl::listeFactures($r->dashboard_id, self::getDashboardSettings($r->settings));\r
-               } elseif ($r->rubrique == 'devis') {\r
-                       $res .= extranetUrl::listeDevis($r->dashboard_id, self::getDashboardSettings($r->settings));\r
-               } elseif ($r->rubrique == 'clients' && MODE == 'extranet') {\r
-                       $res .= extranetUrl::listeClients($r->dashboard_id, self::getDashboardSettings($r->settings));\r
-               } elseif ($r->rubrique == 'timereport') {\r
-                       $res .= extranetUrl::listeTimereport($r->dashboard_id, self::getDashboardSettings($r->settings));\r
-               } elseif ($r->rubrique == 'demandes') {\r
-                       $res .= wsUrl::listeDemandes($r->dashboard_id, self::getDashboardSettings($r->settings));\r
-               } elseif ($r->rubrique == 'books') {\r
-                       $res .= wsUrl::listeBooks($r->dashboard_id, self::getDashboardSettings($r->settings));\r
-               }\r
-               $res .= '</div>';\r
-               $res .= commonPage::bf();\r
-\r
-               return $res;\r
-       }\r
-\r
-       public static function getDashboardSettings($s) {\r
-               commonDroits::dashboard();\r
-               $s = unserialize($s);\r
-               if (isset($s['filtres']['annee'])) {\r
-                       $s['filtres']['annee'] = range(2006, date('Y'), 1);\r
-               }\r
-               return $s;\r
-       }\r
-\r
-       public static function formDashboard($args) {\r
-               commonDroits::dashboard();\r
-               global $core;\r
-               $rub = $args[1];\r
-               $dashboard_id = isset($args[2]) ? $args[2] : 'new';\r
-\r
-               if ($dashboard_id == 'new') {\r
-                       $res = '<tr><td class="right">Titre de la liste</td><td>' . form::field('nom', 20, 128, false) . form::hidden('rubrique', $rub) . form::hidden('dashboard_id', $dashboard_id) . '</td></tr>';\r
-               } else {\r
-                       $r = $core->con->select('SELECT * FROM dashboard WHERE dashboard_id=\'' . $core->con->escape($dashboard_id) . '\'');\r
-                       $res = '<tr><td class="right">Titre de la liste</td><td>' . form::field('nom', 20, 128, $r->nom) . form::hidden('dashboard_id', $dashboard_id) . '</td></tr>';\r
-               }\r
-\r
-               return $res;\r
-       }\r
-\r
-       public static function fichiers($args) {\r
-               global $core;\r
-\r
-               commonDroits::min(array('extranet' => 0, 'ws' => 1));\r
-\r
-               $settings = $core->user->getSettings('fichiers');\r
-               if ($core->user->ws_grade > 0 && isset($args[1])) {\r
-                       $dao = new commonDAOClient($core->con);\r
-                       $client = $dao->selectById($args[1]);\r
-                       fb($client);\r
-                       $_SESSION['entreprise_fichiers'] = $client->entreprise;\r
-               } else {\r
-                       unset($_SESSION['entreprise_fichiers']);\r
-               }\r
-\r
-               $shortcuts = array();\r
-               // $shortcuts[] = '<a href="#" class="popup" rel="formProjet/new">' . $core->typo->Ajouter('Créer un projet') . '</a>';\r
-               $filtres = array();\r
-               $res = '';\r
-\r
-               $res .= commonPage::barre();\r
-\r
-               $res .= commonPage::tMain();\r
-               if ($core->user->grade == 0) {\r
-                       $res .= self::formFichier();\r
-               } else {\r
-                       $res .= self::formFichier($args[1]);\r
-               }\r
-               $res .= commonPage::bh();\r
-               $res .= '<div id="listeFichiers">';\r
-               $res .= self::listeFichiers($settings);\r
-               $res .= '</div>';\r
-               $res .= commonPage::bf();\r
-               $res .= commonPage::bMain();\r
-               return $res;\r
-       }\r
-\r
-       public static function formFichier($for = 'client') {\r
-               global $core;\r
-\r
-               if ($for == 'client') {\r
-                       $titre = __('Envoyez-nous un fichier');\r
-                       $texte = __('Cliquez sur le bouton Parcourir, et sélectionnez le ou les fichiers que vous souhaitez nous faire parvenir');\r
-               } else {\r
-                       $dao = new commonDAOClient($core->con);\r
-                       $client = $dao->selectById($for);\r
-                       $titre = __('Envoyer un fichier à') . ' ' . $client->prenom . ' ' . $client->nom;\r
-                       $texte = '';\r
-               }\r
-\r
-               $res = '<div class="dashboard">';\r
-               $res .= '<div class="caption">' . $core->typo->OngletBlancNoDash($titre) . '</div>';\r
-               $res .= commonPage::bh();\r
-               $res .= '<div class="gris form">';\r
-               $res .= '<h1>' . $texte . '</h1>';\r
-\r
-\r
-               if ($for == 'client') {\r
-                       $action = SITE_PATH . 'upload';\r
-               } else {\r
-\r
-                       $action = SITE_PATH . 'upload/' . $for;\r
-               }\r
-               $res .= '<form id="upload" action="' . $action . '" method="post" enctype="multipart/form-data" class="notajax">';\r
-               $res .= '<input type="file" name="files[]" multiple="multiple" />';\r
-               $res .= '<div class="progress"><div class="back"></div><div class="bar"></div><div class="status">Veuillez sélectionner un ou plusieurs fichier</div> </div><a href="#" class="button">' . __('Parcourir') . '...</a>';\r
-               $res .= '</form>';\r
-               $res .= '</div>';\r
-               $res .= commonPage::bf();\r
-               $res .= '</div>';\r
-               return $res;\r
-       }\r
-\r
-       public static function listeFichiers($settings = null) {\r
-               commonDroits::min(array('extranet' => 0, 'ws' => 1));\r
-\r
-               global $core;\r
-               if ($core->user->ws_grade <= 0 && isset($_SESSION['entreprise_fichiers'])) {\r
-                       $entreprise = $core->user->entreprise;\r
-               } else {\r
-                       $entreprise = $_SESSION['entreprise_fichiers'];\r
-               }\r
-\r
-               $settings = is_null($settings) ? $core->user->getSettings('fichiers') : $settings;\r
-               $dao = new commonDAOFichier($core->con);\r
-               $change = 'Fichiers';\r
-               $dao->entreprise_id = $entreprise;\r
-               if (isset($settings['search']) && !is_null($settings['search'])) {\r
-                       $dao->setSearch($settings['search']);\r
-               }\r
-               $liste = $dao->getListe($settings['orderby'], $settings['sens'], $settings['limit']);\r
-\r
-               $res = '<table class="liste">';\r
-               $res .= '<tr><th>' . commonUrl::orderby(__('Nom de fichier'), 'nom', $settings, 'sort' . $change) . '</th>';\r
-               $res .= '<th>' . commonUrl::orderby(__('Type'), 'type', $settings, 'sort' . $change) . '</th>';\r
-               $res .= '<th>' . commonUrl::orderby(__('Taille'), 'taille', $settings, 'sort' . $change) . '</th>';\r
-               $res .= '<th>' . commonUrl::orderby(__('Date'), 'date', $settings, 'sort' . $change) . '</th>';\r
-               $res .= '<th>' . commonUrl::orderby(__('Envoyé par'), 'contact', $settings, 'sort' . $change) . '</th>';\r
-               $res .= '<th>' . commonUrl::orderby(__('Destiné à'), 'destinataire', $settings, 'sort' . $change) . '</th>';\r
-               $res .= '<th class="min"></th><th class="min"></th></tr>';\r
-               $i = 0;\r
-               foreach ($liste as $fichier) {\r
-                       $odd = cubeMath::isOdd($i) ? ' class="odd"' : '';\r
-                       $res .= '<tr' . $odd . '>';\r
-                       $res .= '<td>' . $fichier->nom . '</td>';\r
-                       $res .= '<td>' . $fichier->type . '</td>';\r
-                       $res .= '<td>' . files::size($fichier->taille) . '</td>';\r
-                       $res .= '<td>' . date(__('d/m/Y'), $fichier->date) . '</td>';\r
-                       $res .= '<td>' . $fichier->contact->prenom . ' ' . $fichier->contact->nom . '</td>';\r
-                       if ($fichier->destinataire) {\r
-                               $res .= '<td>' . $fichier->destinataire->prenom . ' ' . $fichier->destinataire->nom . '</td>';\r
-                       } else {\r
-                               $res .= '<td></td>';\r
-                       }\r
-                       $res .= '<td>' . self::telechargerLink($fichier) . '</td>';\r
-                       $res .= '<td><a href="#" class="ajax" rel="supprimeFichier/' . $fichier->relPath . '" title="' . __('Êtes-vous certain de vouloir supprimer ce fichier ?') . '">' . cubeMedia::image(IMG . '/delete.png') . '</a></td>';\r
-                       $res .= '</tr>';\r
-                       $i++;\r
-               }\r
-               if (!isset($settings['search']) || is_null($settings['search'])) {\r
-                       $odd = cubeMath::isOdd($i) ? ' class="odd"' : '';\r
-                       $res .= '<tr' . $odd . '><td colspan="12">';\r
-                       $res .= commonPage::pager($settings['page'], $dao->count(), $settings['par_page'], 'page' . $change . '/%d');\r
-                       $res .= commonUrl::formParPage('parPage' . $change, $settings['par_page'], __('fichiers'));\r
-                       $res .= '</td></tr>';\r
-               }\r
-               $res .= '</table>';\r
-               return $res;\r
-       }\r
-\r
-       public static function telechargerLink($fichier) {\r
-               global $core;\r
-               $ext = files::getExtension($fichier->relPath);\r
-\r
-               $res = '';\r
-               if ($ext == 'ipa') {\r
-                       $res .= '<a href="itms-services://?action=download-manifest&url=' . self::manifestFromIpa($fichier) . '">' . $core->typo->Telecharger('Installer') . '</a> ';\r
-               }\r
-               $res .= '<a href="' . SITE_PATH . 'telecharger/' . self::hashFile($fichier->relPath) . '/' . $fichier->relPath . '">' . $core->typo->Telecharger('Télécharger') . '</a>';\r
-               return $res;\r
-       }\r
-\r
-       public static function manifestFromIpa($fichier) {\r
-               $path = '/cache/iosotamanifest/' . sha1($fichier->relPath) . '/';\r
-               $webpath = SCHEME . '://' . $_SERVER['HTTP_HOST'] . $path;\r
-               $filepath = ROOT . $path;\r
-\r
-               if (!file_exists($filepath)) {\r
-                       mkdir($filepath, 0777, true);\r
-               }\r
-\r
-               $res = $webpath . 'manifest.plist';\r
-               $file = $filepath . 'manifest.plist';\r
-               $tmp = $file . '.info';\r
-               $ipa = $fichier->chemin;\r
-\r
-               if (true || !file_exists($file) || filemtime($ipa) > filemtime($file)) {\r
-                       $zip = new ZipArchive();\r
-                       $zip->open($fichier->chemin);\r
-                       for ($i = 0; $i < $zip->numFiles; $i++) {\r
-                               $filename = $zip->getNameIndex($i);\r
-                               if (preg_match('|Payload/\S+.app/Info.plist|', $filename, $matches)) {\r
-                                       $idx = $i;\r
-                                       break;\r
-                               }\r
-                       }\r
-                       $info = $zip->getFromIndex($idx);\r
-\r
-                       file_put_contents($tmp, $info);\r
-\r
-\r
-                       require_once(ROOT . '/inc/cube/externals/CFPropertyList/CFPropertyList.php');\r
-                       $plist = new CFPropertyList\CFPropertyList($tmp);\r
-\r
-                       $infos = $plist->toArray();\r
-\r
-                       $protocol = 'https';\r
-\r
-                       $bundle = $infos['CFBundleIdentifier'];\r
-                       $appName = $infos['CFBundleDisplayName'];\r
-                       $version = $infos['CFBundleVersion'];\r
-                       $ipaURL = $protocol . '://' . $_SERVER['HTTP_HOST'] . '/telechargerr/' . self::hashFile($fichier->relPath . '//') . '/' . $fichier->relPath;\r
-\r
-                       $xml = '<?xml version="1.0" encoding="UTF-8"?>\r
+class commonUrl\r
+{\r
+\r
+    public static function hub($args)\r
+    {\r
+        global $core;\r
+        $args = cubePage::getArgs($args);\r
+        // Si l'utilisateur n'est pas connecté, on affiche le formulaire\r
+        // de login\r
+\r
+        $bypass = array('stats', 'telecharger', 'telechargerr', 'orpiref');\r
+\r
+        if ((!isset($args[0]) || !in_array($args[0], $bypass)) && (is_null($core->user) || !$core->user)) {\r
+            $args = array('login');\r
+        } else {\r
+            if (isset($args[0]) && $args[0] == 'login') {\r
+                http::redirect('/');\r
+            }\r
+            if (!count($args)) {\r
+                // Page par défaut (premier onglet)\r
+                if (MODE == 'extranet') {\r
+                    $nav = extranetDroits::navigation();\r
+                } elseif (MODE == 'ws') {\r
+                    $nav = wsDroits::navigation();\r
+                }\r
+                foreach ($nav as $titre => $url) {\r
+                    $args = array($url);\r
+                    break;\r
+                }\r
+            }\r
+        }\r
+\r
+        $f = $args[0];\r
+\r
+        $classes = array(MODE . 'Url', 'commonUrl');\r
+\r
+        if (!isset($_GET['light'])) {\r
+            echo commonPage::header($args);\r
+        }\r
+\r
+        foreach ($classes as $class) {\r
+            $cb = array($class, $f);\r
+            if (is_callable($cb)) {\r
+                echo call_user_func($cb, $args);\r
+                break;\r
+            }\r
+        }\r
+        if (!isset($_GET['light'])) {\r
+            echo commonPage::footer();\r
+        }\r
+    }\r
+\r
+    public static function login($args)\r
+    {\r
+        global $core;\r
+        $core->con->select('SELECT 2');\r
+\r
+        $tentative = isset($_SESSION['errorLogin']) && $_SESSION['errorLogin'];\r
+        if ($tentative) {\r
+            $_SESSION['errorLogin'] = false;\r
+        }\r
+\r
+        $message = $tentative ? '<p class="message"><br />' . __('Identifiants incorrects') . '</p>' : '';\r
+\r
+        $res = commonPage::barre();\r
+        $res .= commonPage::tMain();\r
+        $res .= commonPage::bh('login');\r
+        $res .= '<div class="form">';\r
+        $res .= '<form action="' . $_SERVER['REQUEST_URI'] . '" method="post" class="notajax">';\r
+        $res .= '<h1>' . __('Veuillez vous identifier') . '</h1>';\r
+        $res .= $message;\r
+        $res .= '<table>';\r
+        $res .= '<tr><td>' . __('Votre e-mail ou login') . ' : </td><td>' . cubeForm::email('user_email', 20, 64, '') . '</td></tr>';\r
+        $res .= '<tr><td>' . __('Votre mot de passe') . ' : </td><td>' . form::password('user_password', 20, 64, '') . '</td></tr>';\r
+        $res .= '<tr><td colspan="2"><a href="#" class="popup" rel="motdepasseOublie">' . __('Mot de passe oublié ? Cliquez ici') . '</a></td></tr>';\r
+        $res .= '<tr><td colspan="2" class="right"><a href="#" class="submit">' . $core->typo->BoutonOK('Cliquez-ici pour vous identifier') . '</a></td></tr>';\r
+        $res .= '</table>';\r
+        $res .= '</form>';\r
+        $res .= '</div>';\r
+        $res .= commonPage::bf();\r
+        $res .= commonPage::bMain();\r
+        return $res;\r
+    }\r
+\r
+    public static function logout($args)\r
+    {\r
+        if (isset($_SESSION['user_email'])) {\r
+            unset($_SESSION['user_email']);\r
+        }\r
+        if (isset($_SESSION['password_email'])) {\r
+            unset($_SESSION['password_email']);\r
+        }\r
+        http::redirect(SITE_PATH);\r
+    }\r
+\r
+    public static function motdepasseOublie($args)\r
+    {\r
+        return '<tr><td>' . __('Entrez votre e-mail') . ' : </td><td>' . cubeForm::email('email', 30, 128) . '</td></tr>';\r
+    }\r
+\r
+    public static function mesParametres($args)\r
+    {\r
+        global $core;\r
+        $utilisateur = $core->user;\r
+\r
+        $res = '<tr><td>Mot de passe :</td><td><a href="#" class="popup" rel="changeMotdepasse">Changer mon mot de passe</a></td></tr>';\r
+        $res .= '<tr><td>Login :</td><td>' . form::field('login', 20, 64, $utilisateur->login) . '</td></tr>';\r
+        $res .= '<tr><td>Langue de l\'interface :</td><td>' . form::combo('lang', cubeLang::getAvailableLangs(true), $utilisateur->lang) . '</td></tr>';\r
+        $res .= '<tr><td colspan="2" class="right"><a href="#" class="submit">' . $core->typo->BoutonOK(__('Enregister')) . '</a></td></tr>';\r
+        if ($utilisateur instanceof commonClient) {\r
+            $res .= '<tr><td colspan="2"></td></tr>';\r
+            $res .= '<tr><th colspan="2">' . __('Mes informations') . '</th></tr>';\r
+            $res .= '<tr><td>' . __('Numéro de client') . ' : </td><td>' . $utilisateur->utilisateur_id . '</td></tr>';\r
+            $res .= '<tr><td>' . __('Prénom') . ' : </td><td>' . $utilisateur->prenom . '</td></tr>';\r
+            $res .= '<tr><td>' . __('Nom') . ' : </td><td>' . $utilisateur->nom . '</td></tr>';\r
+            $res .= '<tr><td>' . __('Adresse e-mail') . ' : </td><td>' . $utilisateur->email . '</td></tr>';\r
+            $res .= '<tr><td>' . __('Raison sociale') . ' : </td><td>' . $utilisateur->rs . '</td></tr>';\r
+            $res .= '<tr><td>' . __('Adresse') . ' : </td><td>' . nl2br($utilisateur->adresse) . '<br />' . $utilisateur->code_postal . ' ' . $utilisateur->ville . '<br />' . cubeCountry::getCountry($utilisateur->pays) . '</td></tr>';\r
+            $res .= '<tr><td>' . __('Numéro de téléphone') . ' : </td><td>' . $utilisateur->telephone . '</td></tr>';\r
+            $res .= '<tr><td>' . __('Numéro de mobile') . ' : </td><td>' . $utilisateur->mobile . '</td></tr>';\r
+            $res .= '<tr><td>' . __('Numéro de fax') . ' : </td><td>' . $utilisateur->fax . '</td></tr>';\r
+            $res .= '<tr><td>' . __('Numéro de TVA intracommunautaire') . ' : </td><td>' . $utilisateur->tva_intra . '</td></tr>';\r
+            $res .= '<tr><td colspan="2"><em>' . __('Si les informations ci-dessus sont incomplètes ou erronées, veuillez nous<br />en informer en nous écrivant à ') . '<a href="mailto:' . FROM_EMAIL . '">' . FROM_EMAIL . '</a></em></td></tr>';\r
+        }\r
+\r
+        return $res;\r
+    }\r
+\r
+    public static function changeMotdepasse()\r
+    {\r
+        $res = '<tr><td colspan="2"><em>' . __('Votre mot de passe doit comprendre en 6 et 10 caractères') . '</em></td></tr>';\r
+        $res .= '<tr><td>' . __('Tapez votre mot de passe actuel') . ' : </td><td>' . form::password('actuel', 20, 10) . '</td></tr>';\r
+        $res .= '<tr><td>' . __('Tapez votre nouveau mot de passe') . ' : </td><td>' . form::password('nouveau', 20, 10) . '</td></tr>';\r
+        $res .= '<tr><td>' . __('Confirmez votre nouveau mot de passe') . ' : </td><td>' . form::password('confirmation', 20, 10) . '</td></tr>';\r
+        return $res;\r
+    }\r
+\r
+    public static function orderby($label, $field, $settings, $function, $title = '')\r
+    {\r
+        $res = '<a href="#" class="nowrap ajax" title="' . $title . '" rel="' . $function . '/' . $field . '">';\r
+        $res .= $label;\r
+        if ($settings['orderby'] == $field) {\r
+            $puce = ($settings['sens'] == 'DESC') ? 'down' : 'up';\r
+            $res .= ' ' . cubeMedia::image(IMG . '/' . $puce . '.png');\r
+        }\r
+        $res .= '</a>';\r
+        return $res;\r
+    }\r
+\r
+    public static function formParPage($action, $value, $nom = 'éléments', $all = true)\r
+    {\r
+        $values = array(2, 5, 10, 15, 25, 50, 100);\r
+        if ($all) {\r
+            $datas = array(__('Tous les ') . $nom => 0);\r
+        } else {\r
+            $datas = array();\r
+        }\r
+        foreach ($values as $v) {\r
+            $datas[$v . ' ' . $nom] = $v;\r
+        }\r
+\r
+        $res = '<form action="' . $action . '" method="post" class="submitonchange">';\r
+        $res .= '<div class="formParPage">' . __('Afficher') . ' : ' . form::combo(array('par_page'), $datas, $value) . ' ' . __('par page') . '</div>';\r
+        $res .= '<div>' . cubeMedia::spacer(950, 1) . '</div>';\r
+        $res .= '</form>';\r
+        return $res;\r
+    }\r
+\r
+    public static function autocomplete($args)\r
+    {\r
+        global $core;\r
+\r
+        fb('!!!!');\r
+\r
+        if (isset($_GET['q'])) {\r
+            $args[2] = $_GET['q'];\r
+        }\r
+        $q = mb_strtolower(cubeText::removeAccents($args[2]));\r
+        $suggestions = array();\r
+        if ($args[1] == 'client') {\r
+            $dao = new commonDAOClient($core->con);\r
+            $dao->setSearch($q, true);\r
+            $clients = $dao->getListe();\r
+            foreach ($clients as $client) {\r
+                $suggestions[] = $client->utilisateur_id . ' - ' . $client->rs . ' (' . $client->prenom . ' ' . $client->nom . ')';\r
+            }\r
+        } elseif ($args[1] == 'projet') {\r
+            $dao = new extranetDAOProjet($core->con);\r
+            $dao->setSearch($q, true);\r
+            $projets = $dao->getListe();\r
+            foreach ($projets as $projet) {\r
+                $suggestions[] = $projet->projet_id . ' - ' . $projet->nom . ' (' . $projet->client . ')';\r
+            }\r
+        } elseif ($args[1] == 'book') {\r
+            $dao = new wsDAOBook($core->con);\r
+            $dao->setSearch($q, true);\r
+            $books = $dao->getListe('date', 'DESC', 15, $core->user);\r
+            foreach ($books as $book) {\r
+                $suggestions[] = $book->book_id . ' - ' . $book->nom;\r
+            }\r
+        } elseif ($args[1] == 'wsuser') {\r
+            $dao = new commonDAOUtilisateur($core->con);\r
+            $dao->setSearch($q, true);\r
+            $clients = $dao->getListe('utilisateur_id', 'ASC', null, ' AND ws_grade>0', $core->user);\r
+            foreach ($clients as $client) {\r
+                $suggestions[] = $client->utilisateur_id . ' - ' . $client->rs . ' (' . $client->prenom . ' ' . $client->nom . ')';\r
+            }\r
+        } elseif ($args[1] == 'wsadmin') {\r
+            $dao = new commonDAOUtilisateur($core->con);\r
+            $dao->setSearch($q, true);\r
+            $clients = $dao->getListe('utilisateur_id', 'ASC', null, 'AND ws_grade>2', $core->user);\r
+            foreach ($clients as $client) {\r
+                $suggestions[] = $client->utilisateur_id . ' - ' . $client->rs . ' (' . $client->prenom . ' ' . $client->nom . ')';\r
+            }\r
+        }\r
+        cubeSearch::searchSuggestion($args[2], $suggestions);\r
+        exit;\r
+    }\r
+\r
+    public static function dashboard($args)\r
+    {\r
+        commonDroits::dashboard();\r
+\r
+        cubePage::ui('Sortable');\r
+        $res = commonPage::barre();\r
+        $res .= commonPage::tMain('dash');\r
+        $res .= commonUrl::listeDashboard($args);\r
+        $res .= commonPage::bMain();\r
+        return $res;\r
+    }\r
+\r
+    public static function listeDashboard($args)\r
+    {\r
+        commonDroits::dashboard();\r
+        global $core;\r
+        $r = $core->con->select('SELECT * FROM dashboard WHERE equipier=\'' . $core->user->utilisateur_id . '\' AND site=\'' . MODE . '\' ORDER BY sort');\r
+        $res = '';\r
+        while ($r->fetch()) {\r
+            $res .= '<div class="dashboard" id="dashboard_' . $r->dashboard_id . '">';\r
+            $res .= commonUrl::displayDashboard($r);\r
+            $res .= '</div>';\r
+        }\r
+        return $res;\r
+    }\r
+\r
+    public static function displayDashboard($r)\r
+    {\r
+        commonDroits::dashboard();\r
+        global $core;\r
+        $res = '<div class="caption">' . $core->typo->OngletBlanc($r->nom);\r
+\r
+        $close = ($r->state == '0') ? ' close' : '';\r
+        $hide = ($r->state == '0') ? ' class="close"' : '';\r
+\r
+        $res .= '<a href="#" rel="' . $r->dashboard_id . '" class="toggle' . $close . '">' . cubeMedia::spacer(18, 10) . '</a>';\r
+        $res .= '<a href="#" rel="formDashboard/d/' . $r->dashboard_id . '" class="edit popup">' . cubeMedia::image(IMG . '/edit.png') . '</a>';\r
+        $res .= '<a href="#" rel="delDashboard/' . $r->dashboard_id . '" class="ajax delete" title="' . __('Êtes vous certain de vouloir supprimer cette liste de votre dashboard ?') . '">' . cubeMedia::image(IMG . '/delete.png') . '</a>';\r
+        $res .= '</div>';\r
+        $res .= commonPage::bh();\r
+        $res .= '<div' . $hide . '>';\r
+\r
+        if ($r->rubrique == 'projets') {\r
+            $res .= extranetUrl::listeProjets($r->dashboard_id, self::getDashboardSettings($r->settings));\r
+        } elseif ($r->rubrique == 'factures') {\r
+            $res .= extranetUrl::listeFactures($r->dashboard_id, self::getDashboardSettings($r->settings));\r
+        } elseif ($r->rubrique == 'devis') {\r
+            $res .= extranetUrl::listeDevis($r->dashboard_id, self::getDashboardSettings($r->settings));\r
+        } elseif ($r->rubrique == 'clients' && MODE == 'extranet') {\r
+            $res .= extranetUrl::listeClients($r->dashboard_id, self::getDashboardSettings($r->settings));\r
+        } elseif ($r->rubrique == 'timereport') {\r
+            $res .= extranetUrl::listeTimereport($r->dashboard_id, self::getDashboardSettings($r->settings));\r
+        } elseif ($r->rubrique == 'demandes') {\r
+            $res .= wsUrl::listeDemandes($r->dashboard_id, self::getDashboardSettings($r->settings));\r
+        } elseif ($r->rubrique == 'books') {\r
+            $res .= wsUrl::listeBooks($r->dashboard_id, self::getDashboardSettings($r->settings));\r
+        }\r
+        $res .= '</div>';\r
+        $res .= commonPage::bf();\r
+\r
+        return $res;\r
+    }\r
+\r
+    public static function getDashboardSettings($s)\r
+    {\r
+        commonDroits::dashboard();\r
+        $s = unserialize($s);\r
+        if (isset($s['filtres']['annee'])) {\r
+            $s['filtres']['annee'] = range(2006, date('Y'), 1);\r
+        }\r
+        return $s;\r
+    }\r
+\r
+    public static function formDashboard($args)\r
+    {\r
+        commonDroits::dashboard();\r
+        global $core;\r
+        $rub = $args[1];\r
+        $dashboard_id = isset($args[2]) ? $args[2] : 'new';\r
+\r
+        if ($dashboard_id == 'new') {\r
+            $res = '<tr><td class="right">Titre de la liste</td><td>' . form::field('nom', 20, 128, false) . form::hidden('rubrique', $rub) . form::hidden('dashboard_id', $dashboard_id) . '</td></tr>';\r
+        } else {\r
+            $r = $core->con->select('SELECT * FROM dashboard WHERE dashboard_id=\'' . $core->con->escape($dashboard_id) . '\'');\r
+            $res = '<tr><td class="right">Titre de la liste</td><td>' . form::field('nom', 20, 128, $r->nom) . form::hidden('dashboard_id', $dashboard_id) . '</td></tr>';\r
+        }\r
+\r
+        return $res;\r
+    }\r
+\r
+    public static function fichiers($args)\r
+    {\r
+        global $core;\r
+\r
+        commonDroits::min(array('extranet' => 0, 'ws' => 1));\r
+\r
+        $settings = $core->user->getSettings('fichiers');\r
+        if ($core->user->ws_grade > 0 && isset($args[1])) {\r
+            $dao = new commonDAOClient($core->con);\r
+            $client = $dao->selectById($args[1]);\r
+            fb($client);\r
+            $_SESSION['entreprise_fichiers'] = $client->entreprise;\r
+        } else {\r
+            unset($_SESSION['entreprise_fichiers']);\r
+        }\r
+\r
+        $shortcuts = array();\r
+        // $shortcuts[] = '<a href="#" class="popup" rel="formProjet/new">' . $core->typo->Ajouter('Créer un projet') . '</a>';\r
+        $filtres = array();\r
+        $res = '';\r
+\r
+        $res .= commonPage::barre();\r
+\r
+        $res .= commonPage::tMain();\r
+        if ($core->user->grade == 0) {\r
+            $res .= self::formFichier();\r
+        } else {\r
+            $res .= self::formFichier($args[1]);\r
+        }\r
+        $res .= commonPage::bh();\r
+        $res .= '<div id="listeFichiers">';\r
+        $res .= self::listeFichiers($settings);\r
+        $res .= '</div>';\r
+        $res .= commonPage::bf();\r
+        $res .= commonPage::bMain();\r
+        return $res;\r
+    }\r
+\r
+    public static function formFichier($for = 'client')\r
+    {\r
+        global $core;\r
+\r
+        if ($for == 'client') {\r
+            $titre = __('Envoyez-nous un fichier');\r
+            $texte = __('Cliquez sur le bouton Parcourir, et sélectionnez le ou les fichiers que vous souhaitez nous faire parvenir');\r
+        } else {\r
+            $dao = new commonDAOClient($core->con);\r
+            $client = $dao->selectById($for);\r
+            $titre = __('Envoyer un fichier à') . ' ' . $client->prenom . ' ' . $client->nom;\r
+            $texte = '';\r
+        }\r
+\r
+        $res = '<div class="dashboard">';\r
+        $res .= '<div class="caption">' . $core->typo->OngletBlancNoDash($titre) . '</div>';\r
+        $res .= commonPage::bh();\r
+        $res .= '<div class="gris form">';\r
+        $res .= '<h1>' . $texte . '</h1>';\r
+\r
+\r
+        if ($for == 'client') {\r
+            $action = SITE_PATH . 'upload';\r
+        } else {\r
+\r
+            $action = SITE_PATH . 'upload/' . $for;\r
+        }\r
+        $res .= '<form id="upload" action="' . $action . '" method="post" enctype="multipart/form-data" class="notajax">';\r
+        $res .= '<input type="file" name="files[]" multiple="multiple" />';\r
+        $res .= '<div class="progress"><div class="back"></div><div class="bar"></div><div class="status">Veuillez sélectionner un ou plusieurs fichier</div> </div><a href="#" class="button">' . __('Parcourir') . '...</a>';\r
+        $res .= '</form>';\r
+        $res .= '</div>';\r
+        $res .= commonPage::bf();\r
+        $res .= '</div>';\r
+        return $res;\r
+    }\r
+\r
+    public static function listeFichiers($settings = null)\r
+    {\r
+        commonDroits::min(array('extranet' => 0, 'ws' => 1));\r
+\r
+        global $core;\r
+        if ($core->user->ws_grade <= 0 && isset($_SESSION['entreprise_fichiers'])) {\r
+            $entreprise = $core->user->entreprise;\r
+        } else {\r
+            $entreprise = $_SESSION['entreprise_fichiers'];\r
+        }\r
+\r
+        $settings = is_null($settings) ? $core->user->getSettings('fichiers') : $settings;\r
+        $dao = new commonDAOFichier($core->con);\r
+        $change = 'Fichiers';\r
+        $dao->entreprise_id = $entreprise;\r
+        if (isset($settings['search']) && !is_null($settings['search'])) {\r
+            $dao->setSearch($settings['search']);\r
+        }\r
+        $liste = $dao->getListe($settings['orderby'], $settings['sens'], $settings['limit']);\r
+\r
+        $res = '<table class="liste">';\r
+        $res .= '<tr><th>' . commonUrl::orderby(__('Nom de fichier'), 'nom', $settings, 'sort' . $change) . '</th>';\r
+        $res .= '<th>' . commonUrl::orderby(__('Type'), 'type', $settings, 'sort' . $change) . '</th>';\r
+        $res .= '<th>' . commonUrl::orderby(__('Taille'), 'taille', $settings, 'sort' . $change) . '</th>';\r
+        $res .= '<th>' . commonUrl::orderby(__('Date'), 'date', $settings, 'sort' . $change) . '</th>';\r
+        $res .= '<th>' . commonUrl::orderby(__('Envoyé par'), 'contact', $settings, 'sort' . $change) . '</th>';\r
+        $res .= '<th>' . commonUrl::orderby(__('Destiné à'), 'destinataire', $settings, 'sort' . $change) . '</th>';\r
+        $res .= '<th class="min"></th><th class="min"></th></tr>';\r
+        $i = 0;\r
+        foreach ($liste as $fichier) {\r
+            $odd = cubeMath::isOdd($i) ? ' class="odd"' : '';\r
+            $res .= '<tr' . $odd . '>';\r
+            $res .= '<td>' . $fichier->nom . '</td>';\r
+            $res .= '<td>' . $fichier->type . '</td>';\r
+            $res .= '<td>' . files::size($fichier->taille) . '</td>';\r
+            $res .= '<td>' . date(__('d/m/Y'), $fichier->date) . '</td>';\r
+            $res .= '<td>' . $fichier->contact->prenom . ' ' . $fichier->contact->nom . '</td>';\r
+            if ($fichier->destinataire) {\r
+                $res .= '<td>' . $fichier->destinataire->prenom . ' ' . $fichier->destinataire->nom . '</td>';\r
+            } else {\r
+                $res .= '<td></td>';\r
+            }\r
+            $res .= '<td>' . self::telechargerLink($fichier) . '</td>';\r
+            $res .= '<td><a href="#" class="ajax" rel="supprimeFichier/' . $fichier->relPath . '" title="' . __('Êtes-vous certain de vouloir supprimer ce fichier ?') . '">' . cubeMedia::image(IMG . '/delete.png') . '</a></td>';\r
+            $res .= '</tr>';\r
+            $i++;\r
+        }\r
+        if (!isset($settings['search']) || is_null($settings['search'])) {\r
+            $odd = cubeMath::isOdd($i) ? ' class="odd"' : '';\r
+            $res .= '<tr' . $odd . '><td colspan="12">';\r
+            $res .= commonPage::pager($settings['page'], $dao->count(), $settings['par_page'], 'page' . $change . '/%d');\r
+            $res .= commonUrl::formParPage('parPage' . $change, $settings['par_page'], __('fichiers'));\r
+            $res .= '</td></tr>';\r
+        }\r
+        $res .= '</table>';\r
+        return $res;\r
+    }\r
+\r
+    public static function telechargerLink($fichier)\r
+    {\r
+        global $core;\r
+        $ext = files::getExtension($fichier->relPath);\r
+\r
+        $res = '';\r
+        if ($ext == 'ipa') {\r
+            $res .= '<a href="itms-services://?action=download-manifest&url=' . self::manifestFromIpa($fichier) . '">' . $core->typo->Telecharger('Installer') . '</a> ';\r
+        }\r
+        $res .= '<a href="' . SITE_PATH . 'telecharger/' . self::hashFile($fichier->relPath) . '/' . $fichier->relPath . '">' . $core->typo->Telecharger('Télécharger') . '</a>';\r
+        return $res;\r
+    }\r
+\r
+    public static function manifestFromIpa($fichier)\r
+    {\r
+        $path = '/cache/iosotamanifest/' . sha1($fichier->relPath) . '/';\r
+        $webpath = SCHEME . '://' . $_SERVER['HTTP_HOST'] . $path;\r
+        $filepath = ROOT . $path;\r
+\r
+        if (!file_exists($filepath)) {\r
+            mkdir($filepath, 0777, true);\r
+        }\r
+\r
+        $res = $webpath . 'manifest.plist';\r
+        $file = $filepath . 'manifest.plist';\r
+        $tmp = $file . '.info';\r
+        $ipa = $fichier->chemin;\r
+\r
+        if (!file_exists($file) || filemtime($ipa) > filemtime($file)) {\r
+            $zip = new ZipArchive();\r
+            $zip->open($fichier->chemin);\r
+            for ($i = 0; $i < $zip->numFiles; $i++) {\r
+                $filename = $zip->getNameIndex($i);\r
+                if (preg_match('|Payload/(.+).app/Info.plist|', $filename, $matches)) {\r
+                    $idx = $i;\r
+                    break;\r
+                }\r
+            }\r
+            if (!$idx) {\r
+                return;\r
+            }\r
+            $info = $zip->getFromIndex($idx);\r
+\r
+            file_put_contents($tmp, $info);\r
+\r
+\r
+            require_once(ROOT . '/inc/cube/externals/CFPropertyList/CFPropertyList.php');\r
+            $plist = new CFPropertyList\CFPropertyList($tmp);\r
+\r
+            $infos = $plist->toArray();\r
+\r
+            $protocol = 'https';\r
+\r
+            $bundle = $infos['CFBundleIdentifier'];\r
+            $appName = $infos['CFBundleDisplayName'];\r
+            $version = $infos['CFBundleVersion'];\r
+            $ipaURL = $protocol . '://' . $_SERVER['HTTP_HOST'] . '/telechargerr/' . self::hashFile($fichier->relPath . '//') . '/' . $fichier->relPath;\r
+\r
+            $xml = '<?xml version="1.0" encoding="UTF-8"?>\r
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\r
 <plist version="1.0">\r
 <dict>\r
@@ -521,152 +544,157 @@ class commonUrl {
 </dict>\r
 </plist>';\r
 \r
-                       file_put_contents($file, $xml);\r
-                       unlink($tmp);\r
-               }\r
-               return str_replace('http://', 'https://', $res);\r
-       }\r
-\r
-       public static function hashFile($path) {\r
-               $path = trim($path, '/');\r
-               return sha1('!!//' . $path . '||--');\r
-       }\r
-\r
-       public static function telechargerr($args) {\r
-               return self::telecharger($args, true);\r
-       }\r
-\r
-       public static function telecharger($args, $relay = false) {\r
-               array_shift($args);\r
-               $hash = array_shift($args);\r
-               $path = implode('/', $args);\r
-               $utilisateur_id = array_shift($args);\r
-               $nom = array_pop($args);\r
-\r
-               $verihash = self::hashFile($path);\r
-               if ($hash != $verihash) {\r
-                       return;\r
-               }\r
-\r
-               cubeHTTP::xsendFile(FTPROOT . $path, false, true);\r
-       }\r
-\r
-       public static function upload($args) {\r
-               global $core;\r
-\r
-               commonDroits::min(array('extranet' => 0, 'ws' => 1));\r
-\r
-               if (isset($args[1]) && $args[1] != '') {\r
-                       $for = $args[1];\r
-               } else {\r
-                       $for = false;\r
-               }\r
-\r
-               if (!$for) {\r
-                       $destrel = $core->user->utilisateur_id;\r
-               } else {\r
-                       $destrel = $for . '/.in/' . $core->user->utilisateur_id;\r
-               }\r
-               $dest = FTPROOT . $destrel;\r
-               if (!file_exists($dest)) {\r
-                       mkdir($dest, 0755, true);\r
-               }\r
-\r
-               $files_uploaded = array();\r
-\r
-               print_r($_FILES);\r
-\r
-\r
-               foreach ($_FILES['files']['name'] as $k => $ffname) {\r
-                       if ($_FILES['files']['error'][$k]) {\r
-                               continue;\r
-                       }\r
-                       $fname = cubeFiles::tidyName($ffname);\r
-                       while (file_exists($dest . '/' . $fname)) {\r
-                               $name = cubeFiles::getName($fname);\r
-                               $ext = files::getExtension($fname);\r
-\r
-                               $name .= '.' . rand(1, 9);\r
-                               $fname = $name . '.' . $ext;\r
-                       }\r
-\r
-                       move_uploaded_file($_FILES['files']['tmp_name'][$k], $dest . '/' . $fname);\r
-                       $files_uploaded[] = $destrel . '/' . $fname;\r
-               }\r
-\r
-               if (count($files_uploaded) > 0) {\r
-                       $mail = new cubeMail();\r
-                       $mail->charset = 'UTF-8';\r
-                       $mail->from = FROM_NAME . '<' . FROM_EMAIL . '>';\r
-                       if (!$for) {\r
-                               $mail->to = TEAM_EMAIL;\r
-                               $mail->subject = '[' . EMAIL_SUBJECT . '] Nouveaux fichiers uploadés par ' . $core->user->prenom . ' ' . $core->user->nom;\r
-                               $body = 'Tous les fichiers de ' . $core->user->prenom . ' ' . $core->user->nom . ' : https://' . $_SERVER['HTTP_HOST'] . '/fichiers/' . $core->user->utilisateur_id . "\n\n";\r
-                               $body .= 'Fichiers chargés : ' . "\n";\r
-                               foreach ($files_uploaded as $f) {\r
-                                       $body .= ' - https://' . $_SERVER['HTTP_HOST'] . '/telecharger/' . $f . "\n";\r
-                               }\r
-                       } else {\r
-                               $dao = new commonDAOClient($core->con);\r
-                               $client = $dao->selectById($for);\r
-\r
-                               $mail->to = $core->user->email;\r
-                               $mail->subject = '[' . EMAIL_SUBJECT . '] Nouveaux fichiers uploadés pour ' . $client->prenom . ' ' . $client->nom;\r
-\r
-                               $body = 'Tous les fichiers de ' . $client->prenom . ' ' . $client->nom . ' : https://' . $_SERVER['HTTP_HOST'] . '/fichiers/' . $client->utilisateur_id . "\n\n";\r
-                               $body .= 'Fichiers chargés : ' . "\n";\r
-                               foreach ($files_uploaded as $f) {\r
-                                       $body .= ' - https://' . $_SERVER['HTTP_HOST'] . '/telecharger/' . commonUrl::hashFile($f) . '/' . $f . "\n";\r
-                               }\r
-                               $body .= "\n" . RAPPEL . " : \n";\r
-                               $body .= ' - Adresse : https://' . $_SERVER['HTTP_HOST'] . '/' . "\n";\r
-                               $body .= ' - Login : ' . $client->email . "\n";\r
-                               $body .= ' - Mot de passe : ' . $client->password . "\n";\r
-                       }\r
-                       $mail->body = $body;\r
-                       $ok = $mail->send();\r
-               }\r
-\r
-\r
-               ob_clean();\r
-               exit;\r
-       }\r
-\r
-       public static function adresse($utilisateur_id = null, $projet_id = null, $display = 'devis', $adresse = '') {\r
-               global $core;\r
-               $dao = new commonDAOClient($core->con);\r
-               if (!is_null($utilisateur_id)) {\r
-                       $client = $dao->selectById($utilisateur_id);\r
-               }\r
-               if (!is_null($projet_id)) {\r
-                       $client = $dao->selectByProjet($projet_id);\r
-               }\r
-               if (is_null($client)) {\r
-                       return false;\r
-               }\r
-\r
-               if ($adresse == '') {\r
-                       $adresse = array();\r
-                       if ($client->adresse_facturation != '') {\r
-                               $adresse[] = $client->adresse_facturation;\r
-                       } else {\r
-                               $adresse[] = $client->rs;\r
-                               $adresse[] = trim($client->adresse);\r
-                               $adresse[] = $client->code_postal . ' ' . $client->ville;\r
-                               $adresse[] = cubeCountry::getCountry($client->pays);\r
-                       }\r
-               } else {\r
-                       $adresse = explode("\n", trim($adresse));\r
-               }\r
-               if ($display == 'facture' && $client->tva_intra != '' && cubeCountry::inUE($client->pays)) {\r
-                       $tva = '<br /><span class="tva">' . __('N° de TVA Intracommunautaire') . ' : ' . $client->tva_intra . '</span>';\r
-               } else {\r
-                       $tva = '';\r
-               }\r
-               $a = form::textarea('adresse', 40, 6, implode("\n", $adresse));\r
-               $a .= $tva;\r
-               $a .= '<a href="#" class="popup edit" rel="formContact/' . $client->utilisateur_id . '" title="' . __('Editer les informations de ce client') . '">' . cubeMedia::image(IMG . '/edit.png') . '</a>';\r
-               return $a;\r
-       }\r
+            file_put_contents($file, $xml);\r
+            unlink($tmp);\r
+        }\r
+        return str_replace('http://', 'https://', $res);\r
+    }\r
+\r
+    public static function hashFile($path)\r
+    {\r
+        $path = trim($path, '/');\r
+        return sha1('!!//' . $path . '||--');\r
+    }\r
+\r
+    public static function telechargerr($args)\r
+    {\r
+        return self::telecharger($args, true);\r
+    }\r
+\r
+    public static function telecharger($args, $relay = false)\r
+    {\r
+        array_shift($args);\r
+        $hash = array_shift($args);\r
+        $path = implode('/', $args);\r
+        $utilisateur_id = array_shift($args);\r
+        $nom = array_pop($args);\r
+\r
+        $verihash = self::hashFile($path);\r
+        if ($hash != $verihash) {\r
+            return;\r
+        }\r
+\r
+        cubeHTTP::xsendFile(FTPROOT . $path, false, true);\r
+    }\r
+\r
+    public static function upload($args)\r
+    {\r
+        global $core;\r
+\r
+        commonDroits::min(array('extranet' => 0, 'ws' => 1));\r
+\r
+        if (isset($args[1]) && $args[1] != '') {\r
+            $for = $args[1];\r
+        } else {\r
+            $for = false;\r
+        }\r
+\r
+        if (!$for) {\r
+            $destrel = $core->user->utilisateur_id;\r
+        } else {\r
+            $destrel = $for . '/.in/' . $core->user->utilisateur_id;\r
+        }\r
+        $dest = FTPROOT . $destrel;\r
+        if (!file_exists($dest)) {\r
+            mkdir($dest, 0755, true);\r
+        }\r
+\r
+        $files_uploaded = array();\r
+\r
+        print_r($_FILES);\r
+\r
+\r
+        foreach ($_FILES['files']['name'] as $k => $ffname) {\r
+            if ($_FILES['files']['error'][$k]) {\r
+                continue;\r
+            }\r
+            $fname = cubeFiles::tidyName($ffname);\r
+            while (file_exists($dest . '/' . $fname)) {\r
+                $name = cubeFiles::getName($fname);\r
+                $ext = files::getExtension($fname);\r
+\r
+                $name .= '.' . rand(1, 9);\r
+                $fname = $name . '.' . $ext;\r
+            }\r
+\r
+            move_uploaded_file($_FILES['files']['tmp_name'][$k], $dest . '/' . $fname);\r
+            $files_uploaded[] = $destrel . '/' . $fname;\r
+        }\r
+\r
+        if (count($files_uploaded) > 0) {\r
+            $mail = new cubeMail();\r
+            $mail->charset = 'UTF-8';\r
+            $mail->from = FROM_NAME . '<' . FROM_EMAIL . '>';\r
+            if (!$for) {\r
+                $mail->to = TEAM_EMAIL;\r
+                $mail->subject = '[' . EMAIL_SUBJECT . '] Nouveaux fichiers uploadés par ' . $core->user->prenom . ' ' . $core->user->nom;\r
+                $body = 'Tous les fichiers de ' . $core->user->prenom . ' ' . $core->user->nom . ' : https://' . $_SERVER['HTTP_HOST'] . '/fichiers/' . $core->user->utilisateur_id . "\n\n";\r
+                $body .= 'Fichiers chargés : ' . "\n";\r
+                foreach ($files_uploaded as $f) {\r
+                    $body .= ' - https://' . $_SERVER['HTTP_HOST'] . '/telecharger/' . $f . "\n";\r
+                }\r
+            } else {\r
+                $dao = new commonDAOClient($core->con);\r
+                $client = $dao->selectById($for);\r
+\r
+                $mail->to = $core->user->email;\r
+                $mail->subject = '[' . EMAIL_SUBJECT . '] Nouveaux fichiers uploadés pour ' . $client->prenom . ' ' . $client->nom;\r
+\r
+                $body = 'Tous les fichiers de ' . $client->prenom . ' ' . $client->nom . ' : https://' . $_SERVER['HTTP_HOST'] . '/fichiers/' . $client->utilisateur_id . "\n\n";\r
+                $body .= 'Fichiers chargés : ' . "\n";\r
+                foreach ($files_uploaded as $f) {\r
+                    $body .= ' - https://' . $_SERVER['HTTP_HOST'] . '/telecharger/' . commonUrl::hashFile($f) . '/' . $f . "\n";\r
+                }\r
+                $body .= "\n" . RAPPEL . " : \n";\r
+                $body .= ' - Adresse : https://' . $_SERVER['HTTP_HOST'] . '/' . "\n";\r
+                $body .= ' - Login : ' . $client->email . "\n";\r
+                $body .= ' - Mot de passe : ' . $client->password . "\n";\r
+            }\r
+            $mail->body = $body;\r
+            $ok = $mail->send();\r
+        }\r
+\r
+\r
+        ob_clean();\r
+        exit;\r
+    }\r
+\r
+    public static function adresse($utilisateur_id = null, $projet_id = null, $display = 'devis', $adresse = '')\r
+    {\r
+        global $core;\r
+        $dao = new commonDAOClient($core->con);\r
+        if (!is_null($utilisateur_id)) {\r
+            $client = $dao->selectById($utilisateur_id);\r
+        }\r
+        if (!is_null($projet_id)) {\r
+            $client = $dao->selectByProjet($projet_id);\r
+        }\r
+        if (is_null($client)) {\r
+            return false;\r
+        }\r
+\r
+        if ($adresse == '') {\r
+            $adresse = array();\r
+            if ($client->adresse_facturation != '') {\r
+                $adresse[] = $client->adresse_facturation;\r
+            } else {\r
+                $adresse[] = $client->rs;\r
+                $adresse[] = trim($client->adresse);\r
+                $adresse[] = $client->code_postal . ' ' . $client->ville;\r
+                $adresse[] = cubeCountry::getCountry($client->pays);\r
+            }\r
+        } else {\r
+            $adresse = explode("\n", trim($adresse));\r
+        }\r
+        if ($display == 'facture' && $client->tva_intra != '' && cubeCountry::inUE($client->pays)) {\r
+            $tva = '<br /><span class="tva">' . __('N° de TVA Intracommunautaire') . ' : ' . $client->tva_intra . '</span>';\r
+        } else {\r
+            $tva = '';\r
+        }\r
+        $a = form::textarea('adresse', 40, 6, implode("\n", $adresse));\r
+        $a .= $tva;\r
+        $a .= '<a href="#" class="popup edit" rel="formContact/' . $client->utilisateur_id . '" title="' . __('Editer les informations de ce client') . '">' . cubeMedia::image(IMG . '/edit.png') . '</a>';\r
+        return $a;\r
+    }\r
 \r
 }
\ No newline at end of file