From 1e4e243ed17372f0466dd7f94dcdb2f4c53fba6a Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Sun, 8 Jan 2017 16:30:40 +0100 Subject: [PATCH] Fixed (partially) + font for login pages ( + ) + migrated view to Twig --- build/viewer/view/group/group_groupChoice.php | 1 - .../viewer/view/group/group_groupChoice.twig | 2 +- .../viewer/view/group/group_membersChoice.php | 287 +++++++----------- .../view/group/group_membersChoice.twig | 50 +++ public_html/css/layout.scss | 2 +- public_html/css/min/layout.css | 60 +++- public_html/css/min/reset.css | 130 +++++++- public_html/css/reset.scss | 1 + public_html/js/action-script.js | 28 +- public_html/js/lib/min/page-manager.js | 10 +- public_html/js/lib/page-manager.js | 8 +- public_html/js/min/action-script.js | 209 ++++++++++++- public_html/view/admin.php | 36 ++- public_html/view/groups.php | 4 +- public_html/view/js/groups.js | 2 +- public_html/view/warehouse.php | 5 +- 16 files changed, 586 insertions(+), 249 deletions(-) mode change 100755 => 100644 build/viewer/view/group/group_membersChoice.php create mode 100644 build/viewer/view/group/group_membersChoice.twig diff --git a/build/viewer/view/group/group_groupChoice.php b/build/viewer/view/group/group_groupChoice.php index bf0fb93..ec0aaac 100755 --- a/build/viewer/view/group/group_groupChoice.php +++ b/build/viewer/view/group/group_groupChoice.php @@ -4,7 +4,6 @@ use \api\core\ModuleRequest; use \error\core\Error; use \api\core\Authentification; - use \manager\repo\cluster as clusterRepo; class group_groupChoice{ diff --git a/build/viewer/view/group/group_groupChoice.twig b/build/viewer/view/group/group_groupChoice.twig index ec253bb..1bfc01d 100644 --- a/build/viewer/view/group/group_groupChoice.twig +++ b/build/viewer/view/group/group_groupChoice.twig @@ -1,4 +1,4 @@ -
+ - - - - - "; - break; - - - case 'machinelist': return " -
- @name - - - - - - - -
"; - break; - - - default: return " - Modifier un autre groupe

-
- - - -
- @header - Membre de @name -
- - @members -
"; - break; - - } - } - - public static function view($params){ - /* [0] Initialisation + public static function render($params){ + var_dump('membersChoice'); + debug(); + /* [1] On vérifie le type de groupe (user/machine) =========================================================*/ /* (1) On vérifie les paramètres */ if( !isset($params['id_cluster']) || !is_numeric($params['id_cluster']) || !isset($params['class']) || !is_numeric($params['class']) ) return Viewer::$htmlError; - /* (2) On initialise les vues */ - $view = ''; - $members_view = ''; - $header = ''; - - - - /* [1] On vérifie le type de groupe (user/machine) - =========================================================*/ - /* (1) On récupère le groupe */ + /* (2) On récupère le groupe */ $checktypeRequest = new ModuleRequest('clusterDefault/getById', [ 'id_cluster' => $params['id_cluster'], 'class' => $params['class'] ]); $checktypeResponse = $checktypeRequest->dispatch(); - /* (2) Si on ne le trouve pas, on retourne une erreur */ + /* (3) Si on ne le trouve pas, on retourne une erreur */ if( $checktypeResponse->error != Error::Success ) return Viewer::$htmlError; - /* (3) On récupère les données du groupe */ + /* (4) On récupère les données du groupe */ $currentCluster = $checktypeResponse->get('cluster'); - - /* [2] On récupère les membres du groupe + /* [2] Init Twig =========================================================*/ - /* (1) On exécute la requête */ - $getmembersRequest = new ModuleRequest('clusterDefault/getMembers', [ - 'id_cluster' => $params['id_cluster'], - 'class' => $params['class'] + $loader = new \Twig_Loader_Filesystem(__BUILD__.'/viewer/view'); + $twig = new \Twig_Environment($loader, []); + + + /* [3] Store variables + =========================================================*/ + $variables = [ + 'p_id_cluster' => $params['id_cluster'], + 'p_class' => $params['class'], + 'p_name' => $currentCluster['name'], + 'p_theme' => $_SESSION['WAREHOUSE']['theme'] + ]; + + /* [4] Store functions + =========================================================*/ + $twig->addFunction(new \Twig_Function('f_members', function($id_cluster, $class){ + /* [1] On récupère les membres + =========================================================*/ + + /* (1) On exécute la requête */ + $getmembersRequest = new ModuleRequest('clusterDefault/getMembers', [ + 'id_cluster' => $id_cluster, + 'class' => $class + ]); + $getmembersResponse = $getmembersRequest->dispatch(); + + /* (2) Si erreur, on retourne rien par défaut */ + if( $getmembersResponse->error != Error::Success ) + return []; + + /* (3) On récupère la liste des UID uniquement */ + $members_ids = []; + foreach($getmembersResponse->get('members') as $member) + $members_ids[] = ($class==0) ? $member['id_user'] : $member['id_machine']; + + + /* [2] On récupère les utilisateurs non membres + =========================================================*/ + /* (1) On récupère les utilisateurs */ + if( $class == 0 ){ + + /* (2) On exécute la requête */ + $getusersRequest = new ModuleRequest('userDefault/getAll'); + // On recupere la reponse + $getusersResponse = $getusersRequest->dispatch(); + + /* (3) si erreur, on affiche l'explicitation */ + if( $getusersResponse->error != Error::Success ) + return []; + + /* (4) On récupère la liste des utilisateurs */ + $users = $getusersResponse->get('users'); + + /* (5) On ajoute s'ils sont dans le groupe ou non */ + foreach($users as $u=>$user) + $users[$u]['already'] = in_array($user['id_user'], $members_ids); + return $users; + + + /* [3] On récupère les machines non membres + =========================================================*/ + /* (1) On récupère les machines */ + }else{ + + /* (2) On exécute la requête */ + $getmachinesRequest = new ModuleRequest('machineDefault/getAll'); + // On recupere la reponse + $getmachinesResponse = $getmachinesRequest->dispatch(); + + /* (3) si erreur, on affiche l'explicitation */ + if( $getmachinesResponse->error != Error::Success ) + return []; + + /* (4) On récupère la liste des machines */ + $machines = $getmachinesResponse->get('machines'); + + /* (5) On ajoute s'ils sont dans le groupe ou non */ + foreach($machines as $u=>$machine) + $machines[$u]['already'] = in_array($machine['id_machine'], $members_ids); + + return $machines; + } + + + })); + + + + /* [5] Build the whole stuff + =========================================================*/ + return $twig->render('group/group_membersChoice.twig', [ + 'p_class' => $variables['p_class'], + 'p_name' => $variables['p_name'], + 'p_id_cluster' => $variables['p_id_cluster'], + 'p_theme' => $variables['p_theme'] ]); - $getmembersResponse = $getmembersRequest->dispatch(); - - /* (2) Si erreur, on retourne l'erreur */ - if( $getmembersResponse->error != Error::Success ) - return Viewer::$htmlError; - - /* (3) On récupère la liste des UID uniquement */ - $members_id = []; - foreach($getmembersResponse->get('members') as $member) - $members_id[] = ($params['class']==0) ? $member['id_user'] : $member['id_machine']; - - - - /* [3] SI GROUPE D'UTILISATEURS -> On récupère les utilisateurs - =========================================================*/ - if( $params['class'] == 0 ){ - - /* (1) On récupère les utilisateurs - ---------------------------------------------------------*/ - /* (1) On exécute la requête */ - $getusersRequest = new ModuleRequest('userDefault/getAll'); // On utilise la methode 'getAll' du module 'userDefault' - $getusersResponse = $getusersRequest->dispatch(); // On recupere la reponse - - /* (2) si erreur, on affiche l'explicitation */ - if( $getusersResponse->error != Error::Success ) - return Viewer::$htmlError; - - /* (3) On récupère la liste des utilisateurs */ - $USERLIST = $getusersResponse->get('users'); - - - /* (2) On gère l'affichage des utilisateurs - ---------------------------------------------------------*/ - /* (1) On gère l'état 'membre' ou non */ - foreach($USERLIST as $u=>$user) - $USERLIST[$u]['already_in'] = in_array($user['id_user'], $members_id) ? 'checked' : ''; - - /* (2) On génère la vue */ - $header = self::template('userheader'); - - $members_view = Viewer::replaceMultiple( - self::template('userlist'), - $USERLIST - ); - - - /* [4] SI GROUPE DE MACHINES -> On récupère les machines - =========================================================*/ - }else{ - - /* (1) On récupère les machines - ---------------------------------------------------------*/ - /* (1) On exécute la requête */ - $getmachinesRequest = new ModuleRequest('machineDefault/getAll'); // On utilise la methode 'getAll' du module 'machineDefault' - $getmachinesResponse = $getmachinesRequest->dispatch(); // On recupere la reponse - - /* (2) si erreur, on affiche l'explicitation */ - if( $getmachinesResponse->error != Error::Success ) - return Viewer::$htmlError; - - /* (3) On récupère la liste des machines */ - $MACHINELIST = $getmachinesResponse->get('machines'); - - - /* (2) On gère l'affichage des machines - ---------------------------------------------------------*/ - /* (1) On gère l'état 'membre' ou non */ - foreach($MACHINELIST as $m=>$machine) - $MACHINELIST[$m]['already_in'] = in_array($machine['id_machine'], $members_id) ? 'checked' : ''; - - /* (2) On génère la vue */ - $header = self::template('machineheader'); - - $members_view = Viewer::replaceMultiple( - self::template('machinelist'), - $MACHINELIST - ); - - } - - - - return Viewer::replaceSingle( - self::template(), [ - 'id_cluster' => $params['id_cluster'], - 'class' => $params['class'], - 'name' => $currentCluster['name'], - 'clustertype' => ($params['class']==0) ? 'utilisateurs' : 'machines', - 'members' => $members_view, - 'header' => $header - ] - ); } - - - - - - } diff --git a/build/viewer/view/group/group_membersChoice.twig b/build/viewer/view/group/group_membersChoice.twig new file mode 100644 index 0000000..859bdf3 --- /dev/null +++ b/build/viewer/view/group/group_membersChoice.twig @@ -0,0 +1,50 @@ +Modifier un autre groupe +

+ +
+ + + +
+ + {# USER HEADER #} + {% if p_class == 0 %} + Identifiant + Nom + Code RFID + {# MACHINE HEADER #} + {% else %} + Nom + {% endif %} + Membre de {{ p_name }} +
+ + + {% for member in f_members(p_id_cluster, p_class) %} + + {# USER ENTRIES #} + {% if p_class == 0 %} +
+ {{ member.username }} + {{ member.firstname }} {{ member.lastname }} + {{ member.code }} + + + + + +
+ {# MACHINE ENTRIES #} + {% else %} +
+ {{ member.name }} + + + + + +
+ {% endif %} + + {% endfor %} +
diff --git a/public_html/css/layout.scss b/public_html/css/layout.scss index e5fbaa8..8aa7888 100755 --- a/public_html/css/layout.scss +++ b/public_html/css/layout.scss @@ -10,7 +10,7 @@ background-color: #edf0f5; - font-family: 'Open Sans', 'Ubuntu'; + font-family: 'Open Sans', 'Ubuntu', 'Verdana', 'Arial'; /* [1] Header de la page diff --git a/public_html/css/min/layout.css b/public_html/css/min/layout.css index f20e339..c4758fb 100755 --- a/public_html/css/min/layout.css +++ b/public_html/css/min/layout.css @@ -1,3 +1,59 @@ -#WRAPPER{display:block;position:fixed;top:0;left:0;width:100%;height:100%;background-color:#edf0f5;font-family:'Open Sans', 'Ubuntu'}#WRAPPER>#HEADER{display:block;position:absolute;top:0;left:0;width:100%;height:calc( 4em - 1px);border-bottom:1px solid #c23f05;background-color:#f44f06;z-index:10}#WRAPPER>#MENU-SIDE{display:block;position:absolute;top:4em;left:0;width:4em;height:100%;box-shadow:2px 1px 3px #ddd;background-color:#fff;transition:all .3s;z-index:9}#WRAPPER>#CONTAINER{display:flex;position:absolute;top:4em;left:4em;width:calc( 100% - 4em - 2*1em);height:calc( 100% - 4em - 2*1em);padding:1em;flex-direction:row;justify-content:space-between;overflow-x:none;overflow-y:auto} +/* COULEUR DU THEME */ +/* COULEUR DU SOUS-MENU */ +/* COULEUR DES ERREURS */ +/* FORMULAIRES */ +/* GESTION DES LONGUEURS */ +#WRAPPER { + display: block; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: #edf0f5; + font-family: 'Open Sans', 'Ubuntu', 'Verdana', 'Arial'; + /* [1] Header de la page + ==========================================*/ + /* [2] Side-Menu de la page + ==========================================*/ + /* [3] Container de la page + ==========================================*/ +} +#WRAPPER > #HEADER { + display: block; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: calc( 4em - 1px ); + border-bottom: 1px solid #c23f05; + background-color: #f44f06; + z-index: 10; +} +#WRAPPER > #MENU-SIDE { + display: block; + position: absolute; + top: 4em; + left: 0; + width: 4em; + height: 100%; + box-shadow: 2px 1px 3px #ddd; + background-color: #fff; + transition: all .3s; + z-index: 9; +} +#WRAPPER > #CONTAINER { + display: flex; + position: absolute; + top: 4em; + left: 4em; + width: calc( 100% - 4em - 2*1em ); + height: calc( 100% - 4em - 2*1em ); + padding: 1em; + flex-direction: row; + justify-content: space-between; + overflow-x: none; + overflow-y: auto; +} -/*# sourceMappingURL=data:application/json;base64,ewoJInZlcnNpb24iOiAzLAoJImZpbGUiOiAibGF5b3V0LmNzcyIsCgkic291cmNlcyI6IFsKCQkiLi4vbGF5b3V0LnNjc3MiLAoJCSIuLi9jb25zdGFudHMuc2NzcyIKCV0sCgkic291cmNlc0NvbnRlbnQiOiBbCgkJIkBpbXBvcnQgJ2NvbnN0YW50cyc7XG5cbiNXUkFQUEVSe1xuXHRkaXNwbGF5OiBibG9jaztcblx0cG9zaXRpb246IGZpeGVkO1xuXHRcdHRvcDogMDtcblx0XHRsZWZ0OiAwO1xuXHRcdHdpZHRoOiAxMDAlO1xuXHRcdGhlaWdodDogMTAwJTtcblxuXHRiYWNrZ3JvdW5kLWNvbG9yOiAjZWRmMGY1O1xuXG5cdGZvbnQtZmFtaWx5OiAnT3BlbiBTYW5zJywgJ1VidW50dSc7XG5cblxuXHQvKiBbMV0gSGVhZGVyIGRlIGxhIHBhZ2Vcblx0PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblx0JiA+ICNIRUFERVJ7XG5cdFx0ZGlzcGxheTogYmxvY2s7XG5cdFx0cG9zaXRpb246IGFic29sdXRlO1xuXHRcdFx0dG9wOiAwO1xuXHRcdFx0bGVmdDogMDtcblx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdFx0aGVpZ2h0OiBjYWxjKCAjeyRtZW51LXNpZGUtd2lkdGh9IC0gMXB4ICk7XG5cblx0XHRib3JkZXItYm90dG9tOiAxcHggc29saWQgZGFya2VuKCR0aGVtZS1jb2xvciwgMTApO1xuXG5cdFx0YmFja2dyb3VuZC1jb2xvcjogJHRoZW1lLWNvbG9yO1xuXG5cdFx0ei1pbmRleDogMTA7XG5cblx0fVxuXG5cblx0LyogWzJdIFNpZGUtTWVudSBkZSBsYSBwYWdlXG5cdD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cdC8vIEdlc3Rpb24gZHUgbWVudVxuXHQmID4gI01FTlUtU0lERXtcblx0XHRkaXNwbGF5OiBibG9jaztcblx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHR0b3A6ICRtZW51LXNpZGUtd2lkdGg7XG5cdFx0XHRsZWZ0OiAwO1xuXHRcdFx0d2lkdGg6ICRtZW51LXNpZGUtd2lkdGg7XG5cdFx0XHRoZWlnaHQ6IDEwMCU7XG5cblx0XHRib3gtc2hhZG93OiAycHggMXB4IDNweCAjZGRkO1xuXG5cdFx0YmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcblxuXHRcdHRyYW5zaXRpb246IGFsbCAuM3M7XG5cblx0XHR6LWluZGV4OiA5O1xuXHR9XG5cblxuXHQvKiBbM10gQ29udGFpbmVyIGRlIGxhIHBhZ2Vcblx0PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblx0JiA+ICNDT05UQUlORVJ7XG5cdFx0ZGlzcGxheTogZmxleDtcblx0XHRwb3NpdGlvbjogYWJzb2x1dGU7XG5cdFx0XHR0b3A6ICRtZW51LXNpZGUtd2lkdGg7XG5cdFx0XHRsZWZ0OiAkbWVudS1zaWRlLXdpZHRoO1xuXHRcdFx0d2lkdGg6IGNhbGMoIDEwMCUgLSAjeyRtZW51LXNpZGUtd2lkdGh9IC0gMioxZW0gKTtcblx0XHRcdGhlaWdodDogY2FsYyggMTAwJSAtICN7JG1lbnUtc2lkZS13aWR0aH0gLSAyKjFlbSApO1xuXHRcdHBhZGRpbmc6IDFlbTtcblxuXHRcdC8vIEZsZXggcHJvcGVydGllc1xuXHRcdGZsZXgtZGlyZWN0aW9uOiByb3c7XG5cdFx0anVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuXG5cdFx0b3ZlcmZsb3cteDogbm9uZTtcblx0XHRvdmVyZmxvdy15OiBhdXRvO1xuXHR9XG59XG4iLAoJCSIvKiBDT1VMRVVSIERVIFRIRU1FICovXG4kdGhlbWUtY29sb3I6ICNmNDRmMDY7XG5cbi8qIENPVUxFVVIgRFUgU09VUy1NRU5VICovXG4kc3ViLW1lbnUtY29sb3I6ICM1YjVlNjM7XG5cbi8qIENPVUxFVVIgREVTIEVSUkVVUlMgKi9cbiRlcnJvci1jb2xvcjogI2NjNTg1NztcblxuLyogRk9STVVMQUlSRVMgKi9cbiRmb3JtLXZhbGlkLWNvbG9yOiAgICMyN2E1NjA7XG4kZm9ybS1uZXV0cmFsLWNvbG9yOiAjMjE5M2U2O1xuJGZvcm0tc2VhcmNoLWNvbG9yOiAgIzU2MzBlZDtcbiRmb3JtLWludmFsaWQtY29sb3I6ICNkNTI5MTg7XG5cblxuLyogR0VTVElPTiBERVMgTE9OR1VFVVJTICovXG4kbWVudS1zaWRlLXdpZHRoOiA0ZW07XG5cblxuLy8gUE9VUiBSRVNPVVJDRV9ESVNQQVRDSEVSXG4kcmQtZm9ybS12YWxpZC1jb2xvcjogICAnMjdhNTYwJztcbiRyZC1mb3JtLW5ldXRyYWwtY29sb3I6ICcyMTkzZTYnO1xuJHJkLWZvcm0tc2VhcmNoLWNvbG9yOiAgJzU2MzBlZCc7XG4kcmQtZm9ybS1pbnZhbGlkLWNvbG9yOiAnZDUyOTE4JztcbiIKCV0sCgkibWFwcGluZ3MiOiAiQUFFQSxBQUFBLFFBQVEsQUFBQSxDQUNQLE9BQU8sQ0FBRSxLQUFNLENBQ2YsUUFBUSxDQUFFLEtBQU0sQ0FDZixHQUFHLENBQUUsQ0FBRSxDQUNQLElBQUksQ0FBRSxDQUFFLENBQ1IsS0FBSyxDQUFFLElBQUssQ0FDWixNQUFNLENBQUUsSUFBSyxDQUVkLGdCQUFnQixDQUFFLE9BQVEsQ0FFMUIsV0FBVyxDQUFFLHFCQUFzQixDQTZEbkMsQUF2RUQsQUFlSyxRQWZHLENBZUgsT0FBTyxBQUFBLENBQ1YsT0FBTyxDQUFFLEtBQU0sQ0FDZixRQUFRLENBQUUsUUFBUyxDQUNsQixHQUFHLENBQUUsQ0FBRSxDQUNQLElBQUksQ0FBRSxDQUFFLENBQ1IsS0FBSyxDQUFFLElBQUssQ0FDWixNQUFNLENBQUUsZ0JBQUksQ0FFYixhQUFhLENBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFNLENBRS9CLGdCQUFnQixDQzFCSixPQUFPLENENEJuQixPQUFPLENBQUUsRUFBRyxDQUVaLEFBN0JGLEFBbUNLLFFBbkNHLENBbUNILFVBQVUsQUFBQSxDQUNiLE9BQU8sQ0FBRSxLQUFNLENBQ2YsUUFBUSxDQUFFLFFBQVMsQ0FDbEIsR0FBRyxDQ3ZCWSxHQUFHLENEd0JsQixJQUFJLENBQUUsQ0FBRSxDQUNSLEtBQUssQ0N6QlUsR0FBRyxDRDBCbEIsTUFBTSxDQUFFLElBQUssQ0FFZCxVQUFVLENBQUUsZ0JBQWlCLENBRTdCLGdCQUFnQixDQUFFLElBQUssQ0FFdkIsVUFBVSxDQUFFLE9BQVEsQ0FFcEIsT0FBTyxDQUFFLENBQUUsQ0FDWCxBQWxERixBQXVESyxRQXZERyxDQXVESCxVQUFVLEFBQUEsQ0FDYixPQUFPLENBQUUsSUFBSyxDQUNkLFFBQVEsQ0FBRSxRQUFTLENBQ2xCLEdBQUcsQ0MzQ1ksR0FBRyxDRDRDbEIsSUFBSSxDQzVDVyxHQUFHLENENkNsQixLQUFLLENBQUUseUJBQUksQ0FDWCxNQUFNLENBQUUseUJBQUksQ0FDYixPQUFPLENBQUUsR0FBSSxDQUdiLGNBQWMsQ0FBRSxHQUFJLENBQ3BCLGVBQWUsQ0FBRSxhQUFjLENBRS9CLFVBQVUsQ0FBRSxJQUFLLENBQ2pCLFVBQVUsQ0FBRSxJQUFLLENBQ2pCIiwKCSJuYW1lcyI6IFtdCn0= */ \ No newline at end of file +/*# sourceMappingURL=layout.css.map */ diff --git a/public_html/css/min/reset.css b/public_html/css/min/reset.css index 7248ac2..4fc9a1f 100755 --- a/public_html/css/min/reset.css +++ b/public_html/css/min/reset.css @@ -1,3 +1,129 @@ -/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0} +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +/** 1. Set default font family to sans-serif. 2. Prevent iOS and IE text size adjust after device orientation change, without disabling user zoom. */ +html { font-family: sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ } -/*# sourceMappingURL=data:application/json;base64,ewoJInZlcnNpb24iOiAzLAoJImZpbGUiOiAicmVzZXQuY3NzIiwKCSJzb3VyY2VzIjogWwoJCSIuLi9yZXNldC5zY3NzIgoJXSwKCSJzb3VyY2VzQ29udGVudCI6IFsKCQkiLyohIG5vcm1hbGl6ZS5jc3MgdjMuMC4zIHwgTUlUIExpY2Vuc2UgfCBnaXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcyAqL1xuXG4vKipcbiAqIDEuIFNldCBkZWZhdWx0IGZvbnQgZmFtaWx5IHRvIHNhbnMtc2VyaWYuXG4gKiAyLiBQcmV2ZW50IGlPUyBhbmQgSUUgdGV4dCBzaXplIGFkanVzdCBhZnRlciBkZXZpY2Ugb3JpZW50YXRpb24gY2hhbmdlLFxuICogICAgd2l0aG91dCBkaXNhYmxpbmcgdXNlciB6b29tLlxuICovXG5cbmh0bWwge1xuICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgLyogMSAqL1xuICAtbXMtdGV4dC1zaXplLWFkanVzdDogMTAwJTsgLyogMiAqL1xuICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7IC8qIDIgKi9cbn1cblxuLyoqXG4gKiBSZW1vdmUgZGVmYXVsdCBtYXJnaW4uXG4gKi9cblxuYm9keSB7XG4gIG1hcmdpbjogMDtcbiAgLy8gZm9udC1zaXplOiAxMnB4O1xufVxuXG4vKiBIVE1MNSBkaXNwbGF5IGRlZmluaXRpb25zXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKipcbiAqIENvcnJlY3QgYGJsb2NrYCBkaXNwbGF5IG5vdCBkZWZpbmVkIGZvciBhbnkgSFRNTDUgZWxlbWVudCBpbiBJRSA4LzkuXG4gKiBDb3JyZWN0IGBibG9ja2AgZGlzcGxheSBub3QgZGVmaW5lZCBmb3IgYGRldGFpbHNgIG9yIGBzdW1tYXJ5YCBpbiBJRSAxMC8xMVxuICogYW5kIEZpcmVmb3guXG4gKiBDb3JyZWN0IGBibG9ja2AgZGlzcGxheSBub3QgZGVmaW5lZCBmb3IgYG1haW5gIGluIElFIDExLlxuICovXG5cbmFydGljbGUsXG5hc2lkZSxcbmRldGFpbHMsXG5maWdjYXB0aW9uLFxuZmlndXJlLFxuZm9vdGVyLFxuaGVhZGVyLFxubWFpbixcbm1lbnUsXG5uYXYsXG5zZWN0aW9uLFxuc3VtbWFyeSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4vKipcbiAqIDEuIENvcnJlY3QgYGlubGluZS1ibG9ja2AgZGlzcGxheSBub3QgZGVmaW5lZCBpbiBJRSA4LzkuXG4gKiAyLiBOb3JtYWxpemUgdmVydGljYWwgYWxpZ25tZW50IG9mIGBwcm9ncmVzc2AgaW4gQ2hyb21lLCBGaXJlZm94LCBhbmQgT3BlcmEuXG4gKi9cblxuYXVkaW8sXG5jYW52YXMsXG5wcm9ncmVzcyxcbnZpZGVvIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrOyAvKiAxICovXG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsgLyogMiAqL1xufVxuXG4vKipcbiAqIFByZXZlbnQgbW9kZXJuIGJyb3dzZXJzIGZyb20gZGlzcGxheWluZyBgYXVkaW9gIHdpdGhvdXQgY29udHJvbHMuXG4gKiBSZW1vdmUgZXhjZXNzIGhlaWdodCBpbiBpT1MgNSBkZXZpY2VzLlxuICovXG5cbmF1ZGlvOm5vdChbY29udHJvbHNdKSB7XG4gIGRpc3BsYXk6IG5vbmU7XG4gIGhlaWdodDogMDtcbn1cblxuLyoqXG4gKiBBZGRyZXNzIGBbaGlkZGVuXWAgc3R5bGluZyBub3QgcHJlc2VudCBpbiBJRSA4LzkvMTAuXG4gKiBIaWRlIHRoZSBgdGVtcGxhdGVgIGVsZW1lbnQgaW4gSUUgOC85LzEwLzExLCBTYWZhcmksIGFuZCBGaXJlZm94IDwgMjIuXG4gKi9cblxuW2hpZGRlbl0sXG50ZW1wbGF0ZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi8qIExpbmtzXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKipcbiAqIFJlbW92ZSB0aGUgZ3JheSBiYWNrZ3JvdW5kIGNvbG9yIGZyb20gYWN0aXZlIGxpbmtzIGluIElFIDEwLlxuICovXG5cbmEge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbn1cblxuLyoqXG4gKiBJbXByb3ZlIHJlYWRhYmlsaXR5IG9mIGZvY3VzZWQgZWxlbWVudHMgd2hlbiB0aGV5IGFyZSBhbHNvIGluIGFuXG4gKiBhY3RpdmUvaG92ZXIgc3RhdGUuXG4gKi9cblxuYTphY3RpdmUsXG5hOmhvdmVyIHtcbiAgb3V0bGluZTogMDtcbn1cblxuLyogVGV4dC1sZXZlbCBzZW1hbnRpY3NcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qKlxuICogQWRkcmVzcyBpbmNvbnNpc3RlbnQgc3R5bGluZyBvZiBgYWJiclt0aXRsZV1gLlxuICogMS4gQ29ycmVjdCBzdHlsaW5nIGluIEZpcmVmb3ggMzkgYW5kIE9wZXJhIDEyLlxuICogMi4gQ29ycmVjdCBtaXNzaW5nIHN0eWxpbmcgaW4gQ2hyb21lLCBFZGdlLCBJRSwgT3BlcmEsIGFuZCBTYWZhcmkuXG4gKi9cblxuYWJiclt0aXRsZV0ge1xuICBib3JkZXItYm90dG9tOiBub25lOyAvKiAxICovXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyAvKiAyICovXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZDsgLyogMiAqL1xufVxuXG4vKipcbiAqIEFkZHJlc3MgaW5jb25zaXN0ZW50IHN0eWxpbmcgb2YgYiBhbmQgc3Ryb25nLlxuICogMS4gQ29ycmVjdCBkdXBsaWNhdGUgYXBwbGljYXRpb24gb2YgYGJvbGRlcmAgaW4gU2FmYXJpIDYuMC4yLlxuICogMi4gQ29ycmVjdCBzdHlsZSBzZXQgdG8gYGJvbGRgIGluIEVkZ2UgMTIrLCBTYWZhcmkgNi4yKywgYW5kIENocm9tZSAxOCsuXG4gKi9cblxuYixcbnN0cm9uZyB7XG4gIGZvbnQtd2VpZ2h0OiBpbmhlcml0OyAvKiAxICovXG59XG5cbmIsXG5zdHJvbmcge1xuICBmb250LXdlaWdodDogYm9sZGVyOyAvKiAyICovXG59XG5cbi8qKlxuICogQWRkcmVzcyBzdHlsaW5nIG5vdCBwcmVzZW50IGluIFNhZmFyaSBhbmQgQ2hyb21lLlxuICovXG5cbmRmbiB7XG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcbn1cblxuLyoqXG4gKiBBZGRyZXNzIHZhcmlhYmxlIGBoMWAgZm9udC1zaXplIGFuZCBtYXJnaW4gd2l0aGluIGBzZWN0aW9uYCBhbmQgYGFydGljbGVgXG4gKiBjb250ZXh0cyBpbiBGaXJlZm94IDQrLCBTYWZhcmksIGFuZCBDaHJvbWUuXG4gKi9cblxuaDEge1xuICBmb250LXNpemU6IDJlbTtcbiAgbWFyZ2luOiAwLjY3ZW0gMDtcbn1cblxuLyoqXG4gKiBBZGRyZXNzIHN0eWxpbmcgbm90IHByZXNlbnQgaW4gSUUgOC85LlxuICovXG5cbm1hcmsge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmYwO1xuICBjb2xvcjogIzAwMDtcbn1cblxuLyoqXG4gKiBBZGRyZXNzIGluY29uc2lzdGVudCBhbmQgdmFyaWFibGUgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiAqL1xuXG5zbWFsbCB7XG4gIGZvbnQtc2l6ZTogODAlO1xufVxuXG4vKipcbiAqIFByZXZlbnQgYHN1YmAgYW5kIGBzdXBgIGFmZmVjdGluZyBgbGluZS1oZWlnaHRgIGluIGFsbCBicm93c2Vycy5cbiAqL1xuXG5zdWIsXG5zdXAge1xuICBmb250LXNpemU6IDc1JTtcbiAgbGluZS1oZWlnaHQ6IDA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuXG5zdXAge1xuICB0b3A6IC0wLjVlbTtcbn1cblxuc3ViIHtcbiAgYm90dG9tOiAtMC4yNWVtO1xufVxuXG4vKiBFbWJlZGRlZCBjb250ZW50XG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKipcbiAqIFJlbW92ZSBib3JkZXIgd2hlbiBpbnNpZGUgYGFgIGVsZW1lbnQgaW4gSUUgOC85LzEwLlxuICovXG5cbmltZyB7XG4gIGJvcmRlcjogMDtcbn1cblxuLyoqXG4gKiBDb3JyZWN0IG92ZXJmbG93IG5vdCBoaWRkZW4gaW4gSUUgOS8xMC8xMS5cbiAqL1xuXG5zdmc6bm90KDpyb290KSB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi8qIEdyb3VwaW5nIGNvbnRlbnRcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbi8qKlxuICogQWRkcmVzcyBtYXJnaW4gbm90IHByZXNlbnQgaW4gSUUgOC85IGFuZCBTYWZhcmkuXG4gKi9cblxuZmlndXJlIHtcbiAgbWFyZ2luOiAxZW0gNDBweDtcbn1cblxuLyoqXG4gKiBBZGRyZXNzIGluY29uc2lzdGVudCBzdHlsaW5nIG9mIGBocmAuXG4gKiAxLiBDb3JyZWN0IGBib3gtc2l6aW5nYCBzZXQgdG8gYGJvcmRlci1ib3hgIGluIEZpcmVmb3guXG4gKiAyLiBDb3JyZWN0IGBvdmVyZmxvd2Agc2V0IHRvIGBoaWRkZW5gIGluIElFIDgvOS8xMC8xMSBhbmQgRWRnZSAxMi5cbiAqL1xuXG5ociB7XG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94OyAvKiAxICovXG4gIGhlaWdodDogMDsgLyogMSAqL1xuICBvdmVyZmxvdzogdmlzaWJsZTsgLyogMiAqL1xufVxuXG4vKipcbiAqIENvbnRhaW4gb3ZlcmZsb3cgaW4gYWxsIGJyb3dzZXJzLlxuICovXG5cbnByZSB7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuXG4vKipcbiAqIDEuIENvcnJlY3QgaW5oZXJpdGFuY2UgYW5kIHNjYWxpbmcgb2YgZm9udC1zaXplIGZvciBwcmVmb3JtYXR0ZWQgdGV4dC5cbiAqIDIuIEFkZHJlc3Mgb2RkIGBlbWAtdW5pdCBmb250IHNpemUgcmVuZGVyaW5nIGluIGFsbCBicm93c2Vycy5cbiAqL1xuXG5jb2RlLFxua2JkLFxucHJlLFxuc2FtcCB7XG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTsgLyogMSAqL1xuICBmb250LXNpemU6IDFlbTsgLyogMiAqL1xufVxuXG4vKiBGb3Jtc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqXG4gKiBLbm93biBsaW1pdGF0aW9uOiBieSBkZWZhdWx0LCBDaHJvbWUgYW5kIFNhZmFyaSBvbiBPUyBYIGFsbG93IHZlcnkgbGltaXRlZFxuICogc3R5bGluZyBvZiBgc2VsZWN0YCwgdW5sZXNzIGEgYGJvcmRlcmAgcHJvcGVydHkgaXMgc2V0LlxuICovXG5cbi8qKlxuICogMS4gQ29ycmVjdCBmb250IHByb3BlcnRpZXMgbm90IGJlaW5nIGluaGVyaXRlZC5cbiAqIDIuIEFkZHJlc3MgbWFyZ2lucyBzZXQgZGlmZmVyZW50bHkgaW4gRmlyZWZveCA0KywgU2FmYXJpLCBhbmQgQ2hyb21lLlxuICovXG5cbmJ1dHRvbixcbmlucHV0LFxub3B0Z3JvdXAsXG5zZWxlY3QsXG50ZXh0YXJlYSB7XG4gIGZvbnQ6IGluaGVyaXQ7IC8qIDEgKi9cbiAgbWFyZ2luOiAwOyAvKiAyICovXG59XG5cbi8qKlxuICogQWRkcmVzcyBgb3ZlcmZsb3dgIHNldCB0byBgaGlkZGVuYCBpbiBJRSA4LzkvMTAvMTEuXG4gKi9cblxuYnV0dG9uIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG5cbi8qKlxuICogQWRkcmVzcyBpbmNvbnNpc3RlbnQgYHRleHQtdHJhbnNmb3JtYCBpbmhlcml0YW5jZSBmb3IgYGJ1dHRvbmAgYW5kIGBzZWxlY3RgLlxuICogQWxsIG90aGVyIGZvcm0gY29udHJvbCBlbGVtZW50cyBkbyBub3QgaW5oZXJpdCBgdGV4dC10cmFuc2Zvcm1gIHZhbHVlcy5cbiAqIENvcnJlY3QgYGJ1dHRvbmAgc3R5bGUgaW5oZXJpdGFuY2UgaW4gRmlyZWZveCwgSUUgOC85LzEwLzExLCBhbmQgT3BlcmEuXG4gKiBDb3JyZWN0IGBzZWxlY3RgIHN0eWxlIGluaGVyaXRhbmNlIGluIEZpcmVmb3guXG4gKi9cblxuYnV0dG9uLFxuc2VsZWN0IHtcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XG59XG5cbi8qKlxuICogMS4gQXZvaWQgdGhlIFdlYktpdCBidWcgaW4gQW5kcm9pZCA0LjAuKiB3aGVyZSAoMikgZGVzdHJveXMgbmF0aXZlIGBhdWRpb2BcbiAqICAgIGFuZCBgdmlkZW9gIGNvbnRyb2xzLlxuICogMi4gQ29ycmVjdCBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIGBpbnB1dGAgdHlwZXMgaW4gaU9TLlxuICogMy4gSW1wcm92ZSB1c2FiaWxpdHkgYW5kIGNvbnNpc3RlbmN5IG9mIGN1cnNvciBzdHlsZSBiZXR3ZWVuIGltYWdlLXR5cGVcbiAqICAgIGBpbnB1dGAgYW5kIG90aGVycy5cbiAqL1xuXG5idXR0b24sXG5odG1sIGlucHV0W3R5cGU9XCJidXR0b25cIl0sIC8qIDEgKi9cbmlucHV0W3R5cGU9XCJyZXNldFwiXSxcbmlucHV0W3R5cGU9XCJzdWJtaXRcIl0ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IGJ1dHRvbjsgLyogMiAqL1xuICBjdXJzb3I6IHBvaW50ZXI7IC8qIDMgKi9cbn1cblxuLyoqXG4gKiBSZS1zZXQgZGVmYXVsdCBjdXJzb3IgZm9yIGRpc2FibGVkIGVsZW1lbnRzLlxuICovXG5cbmJ1dHRvbltkaXNhYmxlZF0sXG5odG1sIGlucHV0W2Rpc2FibGVkXSB7XG4gIGN1cnNvcjogZGVmYXVsdDtcbn1cblxuLyoqXG4gKiBSZW1vdmUgaW5uZXIgcGFkZGluZyBhbmQgYm9yZGVyIGluIEZpcmVmb3ggNCsuXG4gKi9cblxuYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLFxuaW5wdXQ6Oi1tb3otZm9jdXMtaW5uZXIge1xuICBib3JkZXI6IDA7XG4gIHBhZGRpbmc6IDA7XG59XG5cbi8qKlxuICogQWRkcmVzcyBGaXJlZm94IDQrIHNldHRpbmcgYGxpbmUtaGVpZ2h0YCBvbiBgaW5wdXRgIHVzaW5nIGAhaW1wb3J0YW50YCBpblxuICogdGhlIFVBIHN0eWxlc2hlZXQuXG4gKi9cblxuaW5wdXQge1xuICBsaW5lLWhlaWdodDogbm9ybWFsO1xufVxuXG4vKipcbiAqIEl0J3MgcmVjb21tZW5kZWQgdGhhdCB5b3UgZG9uJ3QgYXR0ZW1wdCB0byBzdHlsZSB0aGVzZSBlbGVtZW50cy5cbiAqIEZpcmVmb3gncyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHJlc3BlY3QgYm94LXNpemluZywgcGFkZGluZywgb3Igd2lkdGguXG4gKlxuICogMS4gQWRkcmVzcyBib3ggc2l6aW5nIHNldCB0byBgY29udGVudC1ib3hgIGluIElFIDgvOS8xMC5cbiAqIDIuIFJlbW92ZSBleGNlc3MgcGFkZGluZyBpbiBJRSA4LzkvMTAuXG4gKi9cblxuaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdLFxuaW5wdXRbdHlwZT1cInJhZGlvXCJdIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDsgLyogMSAqL1xuICBwYWRkaW5nOiAwOyAvKiAyICovXG59XG5cbi8qKlxuICogRml4IHRoZSBjdXJzb3Igc3R5bGUgZm9yIENocm9tZSdzIGluY3JlbWVudC9kZWNyZW1lbnQgYnV0dG9ucy4gRm9yIGNlcnRhaW5cbiAqIGBmb250LXNpemVgIHZhbHVlcyBvZiB0aGUgYGlucHV0YCwgaXQgY2F1c2VzIHRoZSBjdXJzb3Igc3R5bGUgb2YgdGhlXG4gKiBkZWNyZW1lbnQgYnV0dG9uIHRvIGNoYW5nZSBmcm9tIGBkZWZhdWx0YCB0byBgdGV4dGAuXG4gKi9cblxuaW5wdXRbdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcbmlucHV0W3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xuICBoZWlnaHQ6IGF1dG87XG59XG5cbi8qKlxuICogQWRkcmVzcyBgYXBwZWFyYW5jZWAgc2V0IHRvIGBzZWFyY2hmaWVsZGAgaW4gU2FmYXJpIGFuZCBDaHJvbWUuXG4gKi9cblxuaW5wdXRbdHlwZT1cInNlYXJjaFwiXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogdGV4dGZpZWxkO1xufVxuXG4vKipcbiAqIFJlbW92ZSBpbm5lciBwYWRkaW5nIGFuZCBzZWFyY2ggY2FuY2VsIGJ1dHRvbiBpbiBTYWZhcmkgYW5kIENocm9tZSBvbiBPUyBYLlxuICogU2FmYXJpIChidXQgbm90IENocm9tZSkgY2xpcHMgdGhlIGNhbmNlbCBidXR0b24gd2hlbiB0aGUgc2VhcmNoIGlucHV0IGhhc1xuICogcGFkZGluZyAoYW5kIGB0ZXh0ZmllbGRgIGFwcGVhcmFuY2UpLlxuICovXG5cbmlucHV0W3R5cGU9XCJzZWFyY2hcIl06Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b24sXG5pbnB1dFt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xufVxuXG4vKipcbiAqIERlZmluZSBjb25zaXN0ZW50IGJvcmRlciwgbWFyZ2luLCBhbmQgcGFkZGluZy5cbiAqL1xuXG5maWVsZHNldCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7XG4gIG1hcmdpbjogMCAycHg7XG4gIHBhZGRpbmc6IDAuMzVlbSAwLjYyNWVtIDAuNzVlbTtcbn1cblxuLyoqXG4gKiAxLiBDb3JyZWN0IGBjb2xvcmAgbm90IGJlaW5nIGluaGVyaXRlZCBpbiBJRSA4LzkvMTAvMTEuXG4gKiAyLiBSZW1vdmUgcGFkZGluZyBzbyBwZW9wbGUgYXJlbid0IGNhdWdodCBvdXQgaWYgdGhleSB6ZXJvIG91dCBmaWVsZHNldHMuXG4gKi9cblxubGVnZW5kIHtcbiAgYm9yZGVyOiAwOyAvKiAxICovXG4gIHBhZGRpbmc6IDA7IC8qIDIgKi9cbn1cblxuLyoqXG4gKiBSZW1vdmUgZGVmYXVsdCB2ZXJ0aWNhbCBzY3JvbGxiYXIgaW4gSUUgOC85LzEwLzExLlxuICovXG5cbnRleHRhcmVhIHtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG5cbi8qKlxuICogRG9uJ3QgaW5oZXJpdCB0aGUgYGZvbnQtd2VpZ2h0YCAoYXBwbGllZCBieSBhIHJ1bGUgYWJvdmUpLlxuICogTk9URTogdGhlIGRlZmF1bHQgY2Fubm90IHNhZmVseSBiZSBjaGFuZ2VkIGluIENocm9tZSBhbmQgU2FmYXJpIG9uIE9TIFguXG4gKi9cblxub3B0Z3JvdXAge1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLyogVGFibGVzXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKipcbiAqIFJlbW92ZSBtb3N0IHNwYWNpbmcgYmV0d2VlbiB0YWJsZSBjZWxscy5cbiAqL1xuXG50YWJsZSB7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gIGJvcmRlci1zcGFjaW5nOiAwO1xufVxuXG50ZCxcbnRoIHtcbiAgcGFkZGluZzogMDtcbn1cbiIKCV0sCgkibWFwcGluZ3MiOiAiQUFBQSw0RUFBNEUsQUFRNUUsQUFBQSxJQUFJLEFBQUMsQ0FDSCxXQUFXLENBQUUsVUFBVyxDQUN4QixvQkFBb0IsQ0FBRSxJQUFLLENBQzNCLHdCQUF3QixDQUFFLElBQUssQ0FDaEMsQUFNRCxBQUFBLElBQUksQUFBQyxDQUNILE1BQU0sQ0FBRSxDQUFFLENBRVgsQUFZRCxBQUFBLE9BQU8sQ0FDUCxBQUFBLEtBQUssQ0FDTCxBQUFBLE9BQU8sQ0FDUCxBQUFBLFVBQVUsQ0FDVixBQUFBLE1BQU0sQ0FDTixBQUFBLE1BQU0sQ0FDTixBQUFBLE1BQU0sQ0FDTixBQUFBLElBQUksQ0FDSixBQUFBLElBQUksQ0FDSixBQUFBLEdBQUcsQ0FDSCxBQUFBLE9BQU8sQ0FDUCxB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 */ \ No newline at end of file +/** Remove default margin. */ +body { margin: 0; font-family: 'Open Sans', 'Ubuntu', 'Verdana', 'Arial'; } + +/* HTML5 display definitions ========================================================================== */ +/** Correct `block` display not defined for any HTML5 element in IE 8/9. Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox. Correct `block` display not defined for `main` in IE 11. */ +article, aside, details, figcaption, figure, footer, header, main, menu, nav, section, summary { display: block; } + +/** 1. Correct `inline-block` display not defined in IE 8/9. 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. */ +audio, canvas, progress, video { display: inline-block; /* 1 */ vertical-align: baseline; /* 2 */ } + +/** Prevent modern browsers from displaying `audio` without controls. Remove excess height in iOS 5 devices. */ +audio:not([controls]) { display: none; height: 0; } + +/** Address `[hidden]` styling not present in IE 8/9/10. Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. */ +[hidden], template { display: none; } + +/* Links ========================================================================== */ +/** Remove the gray background color from active links in IE 10. */ +a { background-color: transparent; } + +/** Improve readability of focused elements when they are also in an active/hover state. */ +a:active, a:hover { outline: 0; } + +/* Text-level semantics ========================================================================== */ +/** Address inconsistent styling of `abbr[title]`. 1. Correct styling in Firefox 39 and Opera 12. 2. Correct missing styling in Chrome, Edge, IE, Opera, and Safari. */ +abbr[title] { border-bottom: none; /* 1 */ text-decoration: underline; /* 2 */ text-decoration: underline dotted; /* 2 */ } + +/** Address inconsistent styling of b and strong. 1. Correct duplicate application of `bolder` in Safari 6.0.2. 2. Correct style set to `bold` in Edge 12+, Safari 6.2+, and Chrome 18+. */ +b, strong { font-weight: inherit; /* 1 */ } + +b, strong { font-weight: bolder; /* 2 */ } + +/** Address styling not present in Safari and Chrome. */ +dfn { font-style: italic; } + +/** Address variable `h1` font-size and margin within `section` and `article` contexts in Firefox 4+, Safari, and Chrome. */ +h1 { font-size: 2em; margin: 0.67em 0; } + +/** Address styling not present in IE 8/9. */ +mark { background-color: #ff0; color: #000; } + +/** Address inconsistent and variable font size in all browsers. */ +small { font-size: 80%; } + +/** Prevent `sub` and `sup` affecting `line-height` in all browsers. */ +sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } + +sup { top: -0.5em; } + +sub { bottom: -0.25em; } + +/* Embedded content ========================================================================== */ +/** Remove border when inside `a` element in IE 8/9/10. */ +img { border: 0; } + +/** Correct overflow not hidden in IE 9/10/11. */ +svg:not(:root) { overflow: hidden; } + +/* Grouping content ========================================================================== */ +/** Address margin not present in IE 8/9 and Safari. */ +figure { margin: 1em 40px; } + +/** Address inconsistent styling of `hr`. 1. Correct `box-sizing` set to `border-box` in Firefox. 2. Correct `overflow` set to `hidden` in IE 8/9/10/11 and Edge 12. */ +hr { box-sizing: content-box; /* 1 */ height: 0; /* 1 */ overflow: visible; /* 2 */ } + +/** Contain overflow in all browsers. */ +pre { overflow: auto; } + +/** 1. Correct inheritance and scaling of font-size for preformatted text. 2. Address odd `em`-unit font size rendering in all browsers. */ +code, kbd, pre, samp { font-family: monospace, monospace; /* 1 */ font-size: 1em; /* 2 */ } + +/* Forms ========================================================================== */ +/** Known limitation: by default, Chrome and Safari on OS X allow very limited styling of `select`, unless a `border` property is set. */ +/** 1. Correct font properties not being inherited. 2. Address margins set differently in Firefox 4+, Safari, and Chrome. */ +button, input, optgroup, select, textarea { font: inherit; /* 1 */ margin: 0; /* 2 */ } + +/** Address `overflow` set to `hidden` in IE 8/9/10/11. */ +button { overflow: visible; } + +/** Address inconsistent `text-transform` inheritance for `button` and `select`. All other form control elements do not inherit `text-transform` values. Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. Correct `select` style inheritance in Firefox. */ +button, select { text-transform: none; } + +/** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls. 2. Correct inability to style clickable `input` types in iOS. 3. Improve usability and consistency of cursor style between image-type `input` and others. */ +button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ } + +/** Re-set default cursor for disabled elements. */ +button[disabled], html input[disabled] { cursor: default; } + +/** Remove inner padding and border in Firefox 4+. */ +button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } + +/** Address Firefox 4+ setting `line-height` on `input` using `!important` in the UA stylesheet. */ +input { line-height: normal; } + +/** It's recommended that you don't attempt to style these elements. Firefox's implementation doesn't respect box-sizing, padding, or width. 1. Address box sizing set to `content-box` in IE 8/9/10. 2. Remove excess padding in IE 8/9/10. */ +input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ } + +/** Fix the cursor style for Chrome's increment/decrement buttons. For certain `font-size` values of the `input`, it causes the cursor style of the decrement button to change from `default` to `text`. */ +input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { height: auto; } + +/** Address `appearance` set to `searchfield` in Safari and Chrome. */ +input[type="search"] { -webkit-appearance: textfield; } + +/** Remove inner padding and search cancel button in Safari and Chrome on OS X. Safari (but not Chrome) clips the cancel button when the search input has padding (and `textfield` appearance). */ +input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } + +/** Define consistent border, margin, and padding. */ +fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } + +/** 1. Correct `color` not being inherited in IE 8/9/10/11. 2. Remove padding so people aren't caught out if they zero out fieldsets. */ +legend { border: 0; /* 1 */ padding: 0; /* 2 */ } + +/** Remove default vertical scrollbar in IE 8/9/10/11. */ +textarea { overflow: auto; } + +/** Don't inherit the `font-weight` (applied by a rule above). NOTE: the default cannot safely be changed in Chrome and Safari on OS X. */ +optgroup { font-weight: bold; } + +/* Tables ========================================================================== */ +/** Remove most spacing between table cells. */ +table { border-collapse: collapse; border-spacing: 0; } + +td, th { padding: 0; } + +/*# sourceMappingURL=reset.css.map */ diff --git a/public_html/css/reset.scss b/public_html/css/reset.scss index 4642136..bde343c 100755 --- a/public_html/css/reset.scss +++ b/public_html/css/reset.scss @@ -19,6 +19,7 @@ html { body { margin: 0; // font-size: 12px; + font-family: 'Open Sans', 'Ubuntu', 'Verdana', 'Arial'; } /* HTML5 display definitions diff --git a/public_html/js/action-script.js b/public_html/js/action-script.js index d1d0342..2ff51ea 100755 --- a/public_html/js/action-script.js +++ b/public_html/js/action-script.js @@ -66,7 +66,7 @@ function navSubMenu(subsection){ var page = null; // Si erreur, on retourne FALSE - if( !target.getData('sublink') ) return false + if( !target.getData('sublink') ) return false; var mustRefresh = pageManager.vars[0] != target.getData('sublink'); @@ -103,7 +103,7 @@ function navMenu(section, persistence){ target = (typeof section == 'string') ? document.querySelector('#WRAPPER > #MENU-SIDE > span[data-link="'+section+'"]') : target; // Si rien trouve, on prend le premier element correspondant a la premiere page - target = (target == null) ? document.querySelector('#WRAPPER > #MENU-SIDE > span[data-link="'+pageManager.pagelist[0]+'"]') : target; + target = target || document.querySelector('#WRAPPER > #MENU-SIDE > span[data-link="'+pageManager.pagelist[0]+'"]'); // Si le param n'est toujours pas bon, on retourne une erreur if( target == null ) return false; @@ -114,18 +114,16 @@ function navMenu(section, persistence){ /* [2] Gestion de l'affichage de l'element ------------------------------------------------*/ // On desactive l'element courant - if( current != null ) - current.remClass('active'); + current && current.remClass('active'); // On active le nouveau - if( target != null ) - target.addClass('active'); + target && target.addClass('active'); /* [3] Gestion de pageManager ------------------------------------------------*/ // Si element, on recupere le data-link var page = null; - // SI on change de menu, on efface les données URL + // Si on change de menu, on efface les données URL if( !persistence && current != target ) pageManager.vars = []; @@ -134,12 +132,11 @@ function navMenu(section, persistence){ if( target.getData('link') ){ DOM.HEADER.addClass('loading'); // Animation de chargement - pageManager.setPage( target.getData('link') ); - pageManager.activeXHR.addEventListener('loadend', function(){ + //pageManager.activeXHR.addEventListener('loadend', + + var handlerX = function(){ - // On retire l'icone de chargement - DOM.HEADER.remClass('loading'); // On gere la navigation du sous-menu (si defini, utilise) var subSectionExists = pageManager.vars.length > 0 && document.querySelector('#CONTAINER > .sub-menu-side > [data-sublink="'+pageManager.vars[0]+'"]') != null; @@ -160,7 +157,14 @@ function navMenu(section, persistence){ navSubMenu(target); }, false); - }, false); + }; + + /* (x) Si première ou changement de page, on charge la nouvelle */ + pageManager.page != target.getData('link') && pageManager.setPage( target.getData('link') ); + + /* (x) Si on a `pageManager.activeXHR`, on met le handler, sinon on lance */ + pageManager.activeXHR ? pageManager.activeXHR.addEventListener('loadend', handlerX, false) : handlerX.call(); + } }navMenu(pageManager.page); diff --git a/public_html/js/lib/min/page-manager.js b/public_html/js/lib/min/page-manager.js index b1080fe..06ddc9a 100755 --- a/public_html/js/lib/min/page-manager.js +++ b/public_html/js/lib/min/page-manager.js @@ -127,9 +127,8 @@ pageManagerClass.prototype = { // si pageList est correct et que l'URL correspond à un schéma de page => continue [sinon] return null if( this.pagelist != null && /^(?:(?:https?:\/\/)?[^\/]+)\/([a-z0-9_]+)(?:\/|((?:\/\w+)+)\/?)?(#.*)?$/i.test(url_data) ){ // si la page récupérée dans l'url est dans la liste => renvoi de l'objet [sinon] null - var vars = RegExp.$2.split('/'); // on supprime la première entrée vide - vars = vars.slice(1); + var vars = RegExp.$2.split('/').slice(1); return ( this.pagelist.indexOf(RegExp.$1) > -1 ) ? {page: RegExp.$1, var: vars} : null; }else @@ -310,16 +309,11 @@ pageManagerClass.prototype = { */ refresh: function(refresher){ if( refresher instanceof Function ){ - this.refresher = refresher; return; - - }else{ - + }else return this.setPage(true); - } - } }; diff --git a/public_html/js/lib/page-manager.js b/public_html/js/lib/page-manager.js index 7450141..06ddc9a 100755 --- a/public_html/js/lib/page-manager.js +++ b/public_html/js/lib/page-manager.js @@ -129,7 +129,6 @@ pageManagerClass.prototype = { // si la page récupérée dans l'url est dans la liste => renvoi de l'objet [sinon] null // on supprime la première entrée vide var vars = RegExp.$2.split('/').slice(1); - console.log(vars); return ( this.pagelist.indexOf(RegExp.$1) > -1 ) ? {page: RegExp.$1, var: vars} : null; }else @@ -310,16 +309,11 @@ pageManagerClass.prototype = { */ refresh: function(refresher){ if( refresher instanceof Function ){ - this.refresher = refresher; return; - - }else{ - + }else return this.setPage(true); - } - } }; diff --git a/public_html/js/min/action-script.js b/public_html/js/min/action-script.js index 4dc7a4a..2ff51ea 100755 --- a/public_html/js/min/action-script.js +++ b/public_html/js/min/action-script.js @@ -1,6 +1,203 @@ -DOM={WRAPPER:$("WRAPPER"),HEADER:$("HEADER"),MENUSIDE:$("MENU-SIDE"),CONTAINER:$("CONTAINER")};var pageManager=new pageManagerClass;pageManager.setPage(null,"/view",DOM.CONTAINER,"history profile machines users groups analytics settings".split(" "));var api=new APIClass("/api/"); -function navSubMenu(a){var d=document.querySelector('#CONTAINER > .sub-menu-side > span[data-sublink="'+pageManager.vars[0]+'"]'),b=null,b=a instanceof Element?a:null,b="string"==typeof a?document.querySelector('#CONTAINER > .sub-menu-side > span[data-sublink="'+a+'"]'):b,b=null==b?document.querySelector("#CONTAINER > .sub-menu-side > span[data-sublink]"):b;if(null==b)return!1;null!=d&&d.remClass("active");a=document.querySelectorAll("#CONTAINER > section[data-sublink].active");for(d=0;d section[data-sublink="'+b.getData("sublink")+'"]'),null!=a&&a.addClass("active"));if(!b.getData("sublink"))return!1;a=pageManager.vars[0]!=b.getData("sublink");pageManager.vars[0]=b.getData("sublink");a&&pageManager.updateURL()} -function navMenu(a,d){var b=document.querySelector('#WRAPPER > #MENU-SIDE > span[data-link="'+pageManager.page+'"]'),c=null,c=a instanceof Element?a:null,c="string"==typeof a?document.querySelector('#WRAPPER > #MENU-SIDE > span[data-link="'+a+'"]'):c,c=null==c?document.querySelector('#WRAPPER > #MENU-SIDE > span[data-link="'+pageManager.pagelist[0]+'"]'):c;if(null==c)return!1;d=!0===d?!0:!1;null!=b&&b.remClass("active");null!=c&&c.addClass("active");d||b==c||(pageManager.vars=[]);c.getData("link")&& -(DOM.HEADER.addClass("loading"),pageManager.setPage(c.getData("link")),pageManager.activeXHR.addEventListener("loadend",function(){DOM.HEADER.remClass("loading");0 .sub-menu-side > [data-sublink="'+pageManager.vars[0]+'"]')?navSubMenu(pageManager.vars[0]):navSubMenu(null);document.querySelector("#CONTAINER > .sub-menu-side").addEventListener("click",function(a){for(a=a.target;a!=document.body&&!a.getData("sublink");)a=a.parentNode; -a.getData("sublink")&&navSubMenu(a)},!1)},!1))}navMenu(pageManager.page);DOM.MENUSIDE.addEventListener("click",function(a){for(a=a.target;a!=document.body&&!a.getData("link");)a=a.parentNode;a.getData("link")&&navMenu(a.getData("link"))},!1); +// TODO: Attendre que API soit chargée, sinon erreur: le CONTAINER prend comme contenu la dépendance JS +DOM = { + WRAPPER: $('WRAPPER'), + HEADER: $('HEADER'), + MENUSIDE: $('MENU-SIDE'), + CONTAINER: $('CONTAINER') +}; + + +/* [0] Instanciation +===========================================*/ +var pageManager = new pageManagerClass(); +pageManager.setPage(null, '/view', DOM.CONTAINER, ['history', 'profile', 'machines', 'users', 'groups', 'analytics', 'settings'] ); + +var api = new APIClass('/api/'); + + +/* [1] Toggle du sub-menu-side <-> navigation +===========================================*/ +function navSubMenu(subsection){ + /* [1] Format du param + ------------------------------------------------*/ + // Contient l'element courant + var current = document.querySelector('#CONTAINER > .sub-menu-side > span[data-sublink="'+pageManager.vars[0]+'"]'); + + // Contiendra l'element cible + var target = null; + + // si @subsection est un element, on le prends + target = (subsection instanceof Element) ? subsection : null; + + // Si string, on trouve l'element correspondant + target = (typeof subsection == 'string') ? document.querySelector('#CONTAINER > .sub-menu-side > span[data-sublink="'+subsection+'"]') : target; + + // Si rien trouve, on prend le premier element correspondant a la premiere page + target = (target == null) ? document.querySelector('#CONTAINER > .sub-menu-side > span[data-sublink]') : target; + + // Si le param n'est toujours pas bon, on retourne une erreur + if( target == null ) return false; + + /* [2] Gestion de l'affichage de l'element + ------------------------------------------------*/ + // On desactive l'element courant + if( current != null ) + current.remClass('active'); + + // On cache les sections visibles + var visibleSections = document.querySelectorAll('#CONTAINER > section[data-sublink].active'); + for( var i = 0 ; i < visibleSections.length ; i++ ) + visibleSections[i].remClass('active'); + + // On active le nouveau + if( target != null ){ + target.addClass('active'); + + // On affiche la section associee + var targetSection = document.querySelector('#CONTAINER > section[data-sublink="'+target.getData('sublink')+'"]'); + if( targetSection != null ) + targetSection.addClass('active'); + + } + + /* [3] Gestion de pageManager + ------------------------------------------------*/ + // Si element, on recupere le data-link + var page = null; + + // Si erreur, on retourne FALSE + if( !target.getData('sublink') ) return false; + + var mustRefresh = pageManager.vars[0] != target.getData('sublink'); + + // On met a jour la variable page-manager si data-link trouve + pageManager.vars[0] = target.getData('sublink'); + + if( mustRefresh ) + // navMenu(pageManager.page); + pageManager.updateURL(); + +} + + + + + + +/* [2] Toggle du side-menu <-> navigation +===========================================*/ +function navMenu(section, persistence){ + + /* [1] Format du param + ------------------------------------------------*/ + // Contient l'element courant + var current = document.querySelector('#WRAPPER > #MENU-SIDE > span[data-link="'+pageManager.page+'"]'); + + // Contiendra l'element cible + var target = null; + + // si @section est un element, on le prends + target = (section instanceof Element) ? section : null; + + // Si string, on trouve l'element correspondant + target = (typeof section == 'string') ? document.querySelector('#WRAPPER > #MENU-SIDE > span[data-link="'+section+'"]') : target; + + // Si rien trouve, on prend le premier element correspondant a la premiere page + target = target || document.querySelector('#WRAPPER > #MENU-SIDE > span[data-link="'+pageManager.pagelist[0]+'"]'); + + // Si le param n'est toujours pas bon, on retourne une erreur + if( target == null ) return false; + + // Persistence de pageManager.vars (OPTIONNEL) + persistence = (persistence===true) ? true : false; + + /* [2] Gestion de l'affichage de l'element + ------------------------------------------------*/ + // On desactive l'element courant + current && current.remClass('active'); + // On active le nouveau + target && target.addClass('active'); + + /* [3] Gestion de pageManager + ------------------------------------------------*/ + // Si element, on recupere le data-link + var page = null; + + // Si on change de menu, on efface les données URL + if( !persistence && current != target ) + pageManager.vars = []; + + + // On charge la page si data-link trouve + if( target.getData('link') ){ + DOM.HEADER.addClass('loading'); // Animation de chargement + + + //pageManager.activeXHR.addEventListener('loadend', + + var handlerX = function(){ + + + // On gere la navigation du sous-menu (si defini, utilise) + var subSectionExists = pageManager.vars.length > 0 && document.querySelector('#CONTAINER > .sub-menu-side > [data-sublink="'+pageManager.vars[0]+'"]') != null; + if( subSectionExists ) // Si le lien du menu associe existe + navSubMenu(pageManager.vars[0]); // on charge la page associee + else // sinon + navSubMenu(null); // on charge le lien par defaut + + + // GESTION DE LA NAVIGATION DU SOUS-MENU + document.querySelector('#CONTAINER > .sub-menu-side').addEventListener('click', function(e){ + var target = e.target; + + while( target != document.body && !target.getData('sublink') ) + target = target.parentNode; + + if( target.getData('sublink') ) + navSubMenu(target); + }, false); + + }; + + /* (x) Si première ou changement de page, on charge la nouvelle */ + pageManager.page != target.getData('link') && pageManager.setPage( target.getData('link') ); + + /* (x) Si on a `pageManager.activeXHR`, on met le handler, sinon on lance */ + pageManager.activeXHR ? pageManager.activeXHR.addEventListener('loadend', handlerX, false) : handlerX.call(); + + } + +}navMenu(pageManager.page); + + + + + + + + + + + + + + + + + + + + +/* [4] Gestion de la navigation (physique) +===========================================*/ +DOM.MENUSIDE.addEventListener('click', function(e){ + var target = e.target; + + // On remonte dans les parents au bon niveau + while( target != document.body && !target.getData('link') ) + target = target.parentNode; + + // Si on a trouve l'element, on l'utilise pour la page + if( target.getData('link') ) + navMenu(target.getData('link')); +}, false); diff --git a/public_html/view/admin.php b/public_html/view/admin.php index 8978051..0e40a74 100755 --- a/public_html/view/admin.php +++ b/public_html/view/admin.php @@ -10,7 +10,8 @@ - + + @@ -21,25 +22,23 @@