From 6feaef2a51f7226c41d69f9e86f605718b78aa02 Mon Sep 17 00:00:00 2001 From: Greg Burri Date: Tue, 4 Dec 2007 19:44:28 +0000 Subject: [PATCH 1/1] Premier commit --- conception/TODO.txt | 132 ++ conception/fonctionnement_minichat.txt | 203 +++ conception/fond.xcf | Bin 0 -> 1400 bytes conception/icones/exclamation.xcf | Bin 0 -> 1936 bytes conception/icones/fermer.xcf | Bin 0 -> 1562 bytes conception/icones/information.xcf | Bin 0 -> 1891 bytes conception/icones/interrogation.xcf | Bin 0 -> 2001 bytes conception/logo_1.xcf | Bin 0 -> 5473 bytes conception/logo_2.xcf | Bin 0 -> 42985 bytes conception/old.xcf | Bin 0 -> 266420 bytes conception/old_piedpage.xcf | Bin 0 -> 2764 bytes conception/return.xcf | Bin 0 -> 1044 bytes css/1/euphorik.css | 181 +++ css/1/pageMinichat.css | 159 +++ css/1/pageProfileRegister.css | 7 + css/2/euphorik.css | 180 +++ css/2/pageMinichat.css | 164 +++ css/2/pageProfileRegister.css | 7 + css/3/euphorik.css | 171 +++ css/3/pageMinichat.css | 155 ++ css/3/pageProfileRegister.css | 8 + css/common.css | 9 + img/css1/fond.png | Bin 0 -> 208 bytes img/css1/logo_1.png | Bin 0 -> 4808 bytes img/css1/logo_2.png | Bin 0 -> 2802 bytes img/css1/return.png | Bin 0 -> 215 bytes img/css2/fond.png | Bin 0 -> 2725 bytes img/css2/logo.png | Bin 0 -> 4392 bytes img/css3/logo.gif | Bin 0 -> 25015 bytes img/css3/logo.png | Bin 0 -> 53998 bytes img/css3/piedpage.png | Bin 0 -> 404 bytes img/exclamation.gif | Bin 0 -> 119 bytes img/fermer.gif | Bin 0 -> 118 bytes img/information.gif | Bin 0 -> 119 bytes img/interrogation.gif | Bin 0 -> 123 bytes img/powered-by-yaws.gif | Bin 0 -> 1388 bytes img/smileys/alien.gif | Bin 0 -> 169 bytes img/smileys/argn.gif | Bin 0 -> 356 bytes img/smileys/autres/icon_angry.gif | Bin 0 -> 93 bytes img/smileys/autres/icon_chinese.gif | Bin 0 -> 936 bytes img/smileys/autres/icon_confused.gif | Bin 0 -> 88 bytes img/smileys/autres/icon_cool.gif | Bin 0 -> 871 bytes img/smileys/autres/icon_largesmile.gif | Bin 0 -> 873 bytes img/smileys/autres/icon_lol.gif | Bin 0 -> 167 bytes img/smileys/autres/icon_mrgreen.gif | Bin 0 -> 954 bytes img/smileys/autres/icon_neutral.gif | Bin 0 -> 85 bytes img/smileys/autres/icon_redface.gif | Bin 0 -> 90 bytes img/smileys/autres/icon_rolleyes.gif | Bin 0 -> 1146 bytes img/smileys/autres/icon_sad.gif | Bin 0 -> 87 bytes img/smileys/autres/icon_smile.gif | Bin 0 -> 76 bytes img/smileys/autres/icon_surprised.gif | Bin 0 -> 967 bytes img/smileys/autres/icon_tongue.gif | Bin 0 -> 983 bytes img/smileys/autres/icon_whistle.gif | Bin 0 -> 852 bytes img/smileys/autres/icon_wink.gif | Bin 0 -> 76 bytes img/smileys/bigsmile.gif | Bin 0 -> 349 bytes img/smileys/bunny.gif | Bin 0 -> 8425 bytes img/smileys/chat.gif | Bin 0 -> 270 bytes img/smileys/clin.gif | Bin 0 -> 263 bytes img/smileys/cool.gif | Bin 0 -> 957 bytes img/smileys/eheheh.gif | Bin 0 -> 583 bytes img/smileys/kirby.gif | Bin 0 -> 1278 bytes img/smileys/lol.gif | Bin 0 -> 656 bytes img/smileys/oh.gif | Bin 0 -> 367 bytes img/smileys/pascontent.gif | Bin 0 -> 375 bytes img/smileys/renne.gif | Bin 0 -> 364 bytes img/smileys/slurp.gif | Bin 0 -> 141 bytes img/smileys/smile.gif | Bin 0 -> 590 bytes img/smileys/sniff.gif | Bin 0 -> 378 bytes img/smileys/spliff.gif | Bin 0 -> 253 bytes img/smileys/star.gif | Bin 0 -> 162 bytes img/smileys/triste.gif | Bin 0 -> 377 bytes index.html | 34 + js/euphorik.js | 807 +++++++++++ js/jquery.js | 11 + js/md5.js | 256 ++++ js/pageMinichat.js | 588 ++++++++ js/pageProfile.js | 118 ++ js/pageRegister.js | 70 + lightbox/css/lightbox.css | 79 ++ lightbox/images/blank.gif | Bin 0 -> 43 bytes lightbox/images/close.gif | Bin 0 -> 222 bytes lightbox/images/closelabel.gif | Bin 0 -> 979 bytes lightbox/images/loading.gif | Bin 0 -> 2767 bytes lightbox/images/next.gif | Bin 0 -> 305 bytes lightbox/images/nextlabel.gif | Bin 0 -> 1252 bytes lightbox/images/prev.gif | Bin 0 -> 307 bytes lightbox/images/prevlabel.gif | Bin 0 -> 1264 bytes lightbox/js/effects.js | 903 ++++++++++++ lightbox/js/lightbox.js | 815 +++++++++++ lightbox/js/prototype.js | 1785 ++++++++++++++++++++++++ lightbox/js/scriptaculous.js | 45 + modules/Makefile | 52 + modules/erl/captcha.erl | 31 + modules/erl/euphorik_bd.erl | 75 + modules/erl/euphorik_deamon.erl | 25 + modules/erl/euphorik_format.erl | 67 + modules/erl/euphorik_protocole.erl | 362 +++++ modules/erl/euphorik_requests.erl | 82 ++ modules/erl/minichat.erl | 445 ++++++ modules/include/euphorik_bd.hrl | 45 + modules/include/euphorik_defines.hrl | 3 + pages/faq.html | 11 + 102 files changed, 8085 insertions(+) create mode 100755 conception/TODO.txt create mode 100755 conception/fonctionnement_minichat.txt create mode 100755 conception/fond.xcf create mode 100755 conception/icones/exclamation.xcf create mode 100755 conception/icones/fermer.xcf create mode 100755 conception/icones/information.xcf create mode 100755 conception/icones/interrogation.xcf create mode 100755 conception/logo_1.xcf create mode 100755 conception/logo_2.xcf create mode 100755 conception/old.xcf create mode 100755 conception/old_piedpage.xcf create mode 100755 conception/return.xcf create mode 100755 css/1/euphorik.css create mode 100755 css/1/pageMinichat.css create mode 100755 css/1/pageProfileRegister.css create mode 100755 css/2/euphorik.css create mode 100755 css/2/pageMinichat.css create mode 100755 css/2/pageProfileRegister.css create mode 100755 css/3/euphorik.css create mode 100755 css/3/pageMinichat.css create mode 100755 css/3/pageProfileRegister.css create mode 100755 css/common.css create mode 100755 img/css1/fond.png create mode 100755 img/css1/logo_1.png create mode 100755 img/css1/logo_2.png create mode 100755 img/css1/return.png create mode 100755 img/css2/fond.png create mode 100755 img/css2/logo.png create mode 100755 img/css3/logo.gif create mode 100755 img/css3/logo.png create mode 100755 img/css3/piedpage.png create mode 100755 img/exclamation.gif create mode 100755 img/fermer.gif create mode 100755 img/information.gif create mode 100755 img/interrogation.gif create mode 100755 img/powered-by-yaws.gif create mode 100755 img/smileys/alien.gif create mode 100755 img/smileys/argn.gif create mode 100755 img/smileys/autres/icon_angry.gif create mode 100755 img/smileys/autres/icon_chinese.gif create mode 100755 img/smileys/autres/icon_confused.gif create mode 100755 img/smileys/autres/icon_cool.gif create mode 100755 img/smileys/autres/icon_largesmile.gif create mode 100755 img/smileys/autres/icon_lol.gif create mode 100755 img/smileys/autres/icon_mrgreen.gif create mode 100755 img/smileys/autres/icon_neutral.gif create mode 100755 img/smileys/autres/icon_redface.gif create mode 100755 img/smileys/autres/icon_rolleyes.gif create mode 100755 img/smileys/autres/icon_sad.gif create mode 100755 img/smileys/autres/icon_smile.gif create mode 100755 img/smileys/autres/icon_surprised.gif create mode 100755 img/smileys/autres/icon_tongue.gif create mode 100755 img/smileys/autres/icon_whistle.gif create mode 100755 img/smileys/autres/icon_wink.gif create mode 100755 img/smileys/bigsmile.gif create mode 100755 img/smileys/bunny.gif create mode 100755 img/smileys/chat.gif create mode 100755 img/smileys/clin.gif create mode 100755 img/smileys/cool.gif create mode 100755 img/smileys/eheheh.gif create mode 100755 img/smileys/kirby.gif create mode 100755 img/smileys/lol.gif create mode 100755 img/smileys/oh.gif create mode 100755 img/smileys/pascontent.gif create mode 100755 img/smileys/renne.gif create mode 100755 img/smileys/slurp.gif create mode 100755 img/smileys/smile.gif create mode 100755 img/smileys/sniff.gif create mode 100755 img/smileys/spliff.gif create mode 100755 img/smileys/star.gif create mode 100755 img/smileys/triste.gif create mode 100755 index.html create mode 100755 js/euphorik.js create mode 100755 js/jquery.js create mode 100755 js/md5.js create mode 100755 js/pageMinichat.js create mode 100755 js/pageProfile.js create mode 100755 js/pageRegister.js create mode 100755 lightbox/css/lightbox.css create mode 100755 lightbox/images/blank.gif create mode 100755 lightbox/images/close.gif create mode 100755 lightbox/images/closelabel.gif create mode 100755 lightbox/images/loading.gif create mode 100755 lightbox/images/next.gif create mode 100755 lightbox/images/nextlabel.gif create mode 100755 lightbox/images/prev.gif create mode 100755 lightbox/images/prevlabel.gif create mode 100755 lightbox/js/effects.js create mode 100755 lightbox/js/lightbox.js create mode 100755 lightbox/js/prototype.js create mode 100755 lightbox/js/scriptaculous.js create mode 100755 modules/Makefile create mode 100755 modules/erl/captcha.erl create mode 100755 modules/erl/euphorik_bd.erl create mode 100755 modules/erl/euphorik_deamon.erl create mode 100755 modules/erl/euphorik_format.erl create mode 100755 modules/erl/euphorik_protocole.erl create mode 100755 modules/erl/euphorik_requests.erl create mode 100755 modules/erl/minichat.erl create mode 100755 modules/include/euphorik_bd.hrl create mode 100755 modules/include/euphorik_defines.hrl create mode 100755 pages/faq.html diff --git a/conception/TODO.txt b/conception/TODO.txt new file mode 100755 index 0000000..c946ac2 --- /dev/null +++ b/conception/TODO.txt @@ -0,0 +1,132 @@ +-- TODO -- +[ok] * Réaliser la structure suivante : + * Table minichat : {id, auteur_id, date, pseudo, contenu, reponses_minichat_id} reponses_minichat_id peut être null + * Table reponse_minichat : {id, minichat_id} la clef est (id, minichat_id) + * Table user : {id, cookie, pseudo, date_creation, date_derniere_connexion, css} +[ok] Implémenter le protocol dans 'fonctionnement_minichat.txt' +[ok] Trier la requête et limiter à N le nombre de messages affichés +[ok] réaliser un controller sous la forme d'une application pour receptionner tout ce qui vient des formulaires +[ok] Ajouter un lien minichat.iduser -> user.id +[ok] Ajouter un id pour les messages qui est un entier auto incrémenté +[ok] Afficher un captcha le md5 de la valeur est l'envoyer avec +[ok] Formater les dates +[ok] Trouver et remplacer les url http://www.youpla.com par [url] +[ok] Traitement des smiles (remplacer :) par "" +[ok] Afficher les smiles disponibles, on peut clicker dessus pour en ajouter un dans le text +[ok] Mettre en évidence les posts auquels l'utilisateur courant à répondu ainsi que ses propres posts + * Vérifier le captcha + * Mettre un cookie +[ok] Mémoriser le pseudo et le remettre à chaque fois (si cookie) +[ok] Afficher un et pour renseigner l'utilisateur sur les différents zones de texte. Lorsque l'utilisateur click sur une zone le message disparait. (javascript). +[ok] Pouvoir répondre à un ou plusieurs messages en cliquant dessus (javascript) + * L'utilisateur peut clicker sur un message, cela appond le nom et l'id du message à son message, exe : "kiki:G3E> " "G3E" et l'id du message en base 36, si l'id est omis alors le dernier message dont le pseudo est kiki est pris en compte + * le(s) pseudo(s) de l'auteur du message auquel on répond préfixe notre message + * Lorsque l'on passe le curseur sur un message on voit la conversation avec une mise en évidence des réponses (les messages ne faisant pas partie de la conversation sont grisés ou masqués) +[ok] Maintenir le focus sur la ligne de saisie après l'envoie d'un message +[ok] Ajouter plusieurs messages d'un coup pour eviter des lenteurs au chargement +[pas besoin] Catcher les exceptions de parsage de l'xml dans euphorik_request +[ok] * Ne pas virer les balises html mais remplacer les <> par < > +[ok mais limité] Avoir accès aux archives (par page, par exemple) +[ok] Profiling pour améliorer les performances (surtout du coté client) +[ok] Interdir les {} dans les pseudo +[plus besoin] Finir le deamon +[plus besoin] tester si le captcha_crypt existe (en regardant les fichiers images temporaires) +[ok] Virer les balises html des messages et pseudo lors du stockage du message (et trimer). +[ok] afficher les pseudo des messages auquels un message répond (modification du protocole, il faut ajouter une liste de pseudo pour chaque message) +[ok] Possibilité de logout +[ok] Filtrer les { et } dans les pseudo sur la page profile +[ok] différentier [url] [gif] [png] et le reste des url. utiliser lightbox pour les images +[ok] Déplacer le formatage des messages du coté du client -> permet de demander à lightbox de reparser lors de l'ajout d'une image +[ok] Demander une confirmation lors d'un logout (are you sure jane ?) (vie la système de messagebox) +[ok] Possibilité d'enregistrement avec une page dédiée au profil. + * Pour se logger il suffit de donner un tuple login + password (le pseudo courant de chat est une données supplémentaire). + * La css choisie est une donnée personnelle. + * Les personnes enregistrées on un pseudo d'une couleur différente. + * (Ajout de smiles personnels)? +[ok] Ajouter des messages d'erreur ("login impossible", "captcha incorrect") +[ok] Ajouter des messages systèmes +[ok] Gérer le flood : si un utilisateur envoie plus de 2 messages par seconde pendant 5 secondes alors il ne peut plus poster pendant 5 secondes + * S'il récidive alors il est suspendu pendant 5^2 puis 5^3 + * Utiliser les messages systèmes pour annonce le flood +[ok] Pouvoir modifier la css (dark/light) + * Créer le style lite + * Créer le style old (avec le style de l'ancien site) +[ok] Ne pas afficher la css dans le profile + +* Ne pas effacer le message (dans le ) si l'on recoit un "pas ok" lors de l'envoie +* Ralentir volontairement le connexion lors d'un mauvais login +* Shift-enter pour ajouter une ligne dans la ligne de saisie (retour à la ligne) + * Crée un
XHTML +* réduire les pseudo trop long en mettant un ".." à la fin et permettre de le voir en entier lorsque le curseur le survol. +* Problème d'utf-8 avec opera +* Tester avec des caractères exotiques (jap, coréen, etc..) +* Rendre compatible IE 7 +* Pouvoir switcher entre un affichage "pseudo" ou "pseudo (login)" +* Faire une page faq et raconter n'importe quoi (entre autre la limitation avec firefox) "pourquoi ce site à des couleurs qui ne veulent rien dire ?" +* Créer un favicon (joli) +* Système de commande / + * /nick : changer de pseudo + * /me : "* " +* Ajouter de nouveaux smiles : + * "slurp" ("ca fait envie") : http://forum-images.hardware.fr/images/perso/huit.gif + * "agreed" : http://forum-images.hardware.fr/icones/smilies/jap.gif + * "dodo" (tete avec un bonnet de nuit et des ZZZZ) + * "hum?" : http://forum-images.hardware.fr/icones/smilies/heink.gif + * "pas reveillé" avec une tasse de café et des cernes : http://forum-images.hardware.fr/images/perso/elmoricq.gif + * "interrogation" genre http://forum-images.hardware.fr/icones/confused.gif + * http://forum-images.hardware.fr/images/perso/dao.gif ou http://forum-images.hardware.fr/icones/redface.gif + * http://forum-images.hardware.fr/icones/ohwell.gif +* Cleaner le code et eventuellement profiler un peu (le refresh est lent sous opera) +* Gestion de l'historique au niveau du navigateur (pouvoir revenir aux pages précédentes) +* Intégrer les totoz : http://www.totoz.eu/ (avec une limite de 3 par messages par exemple) + * avoir une option pour les cacher ou les voir + * modifier la syntaxe des smiles actuels (pour pas qu'ils entre en conflit avec totoz) +* Mettre un icone (genre sablier) lorsque le chat se charge (lors changement d'un changement de page par exemple) +* traitementComplet() de euphorik.js est très très lent à executer +* gestin des timezone (fuseaux horaire) +* Créer un style "super old school" (couleur 8 bit, pas de smiles/images, font fixe) +* Un statut "EK" avec plein de privilège à la con. (avoir une petite étoile à coté de son nick ou le nick d'une certaine couleur) + +-- Bugs -- +1 : Critique +2 : Urgent +3 : Peu grave +[ok] Au bout d'un moment opera n'écoute plus rien... et donc n'affiche plus les nouveaux messages.. +[ok] La méthod traiterSmiles est très lourde ! (4 secondes pour 80 appels (une page normale)) +[ok] Utiliser Alpha truc à la place d'opacity sous explorer +[ok] les heures sont formatées par le serveur avec un espace devant : " 12.30:10", zarb +[ok] un undefined est mis lorsque l'on répond à qqun qui n'a pas de pseudo (traiter ces pseudo par le formateur) +[ok] On ne peut pas réponde aux messages du système + +[3] Après un register le pseudo est effacé +[3] "Return" ne marche pas sous safari +[1] Apparement les process liés aux connexions ne sont jamais terminé même quand l'utilisateur coupe la connexion à cause de minichat:attends_nouveau_messages() +[2] cliquer sur les smiles ne marche pas sous IE +[2] le return ne marche pas sous IE +[3] la page est completement rechargé après avoir submité le profile dans opera +[3] après le login un '?' s'ajoute à l'adresse (opera, firefox) + +-- Idées -- +* Pouvoir cacher les dates +* Pouvoir choisir une couleur pour son pseudo +* Gestion de l'historique (calendrier) +* Créer un gamebot pour lancer des jeux. Par exemple un jeu d'énigmes +* Pourvoir ajouter du texte (correctif en général) à son dernier message par une commande, par exemple : /+ blabla +* smiles personnalisé, on peut en ajouter dans la préférence utilisateur. + * tout le monde peut voir les smiles des autres et les utiliser : [nom_user:smile] +* Possibilité de formater le texte ; bold, italic, etc.. +* Utiliser XMLRPC ou SOAP pour la communication client -> serveur +* Image annimé à la http://www.google.co.kr/ cf http://www.google.co.kr//ig/f/AaEyQnOaAr4/intl/ALL_kr/svc_sprite_all.gif +* Browser les messages par jour. Avec un joli calendar et tout et tout +* Bot de traduction +* RSS +* Voir les personnes connectées +* Statut : Modo avec ce qui va avec : kick ban sodo gravier etc... +* Plusieurs cannaux + + +-- Concurrents -- +http://www.phpfreechat.net/demo.fr.html +http://moules.org/board +http://hadoken.free.fr/board/index#b +http://bouchot.org/tribune#missive diff --git a/conception/fonctionnement_minichat.txt b/conception/fonctionnement_minichat.txt new file mode 100755 index 0000000..2ae4681 --- /dev/null +++ b/conception/fonctionnement_minichat.txt @@ -0,0 +1,203 @@ +Euphorik - minichat +------------------- + +A. Introduction +--------------- + +Le minichat utilise AJAX. Tous les messages sont au format XML +Eventuellement utiliser comet comme décrit ici + : http://www.zeitoun.net/index.php?2007/06/22/46-how-to-implement-comet-with-php + + +Structure : +----------- + +Les objets globaux : + - Messages (liste des messages actuellement affichés, permet de recupérer les nouveaux messages) + - Connexion (Information sur la connexion, information sur le user actuel) + + +B. Principe +----------- +Termes : serveur, client, utilisateur + + 1 Chargement de la page html. + 2 Le client écoute les derniers messages au serveur (asynchrone). + 3 Le client est initialement déconnecté, il regarde si un cookie existe sur la machine cliente : + a Si oui : il tente un login avec le cookie, si ok alors le client est connecté sinon il reste dans l'état déconnecté. + b Si non : il demande au serveur la génération d'un captcha et l'affiche. + 4 L'utilisateur peut alors envoyer un message. Il doit saisir le captcha s'il l'état et déconnecté. + a Si le captcha a été saisie le client envoie une requête de login + 5 Le message est posté + + +Principe concernant le rafraichissement: + * Le client envoie une demande au serveur avec l'id du dernier message (via XMLHttpRequest ou un méthode de JQuery) + * Le serveur maintient la connexion bloqué si le client est à jour. + * Dès que le serveur n'est plus à jours, il envoie les messages manquants. + +Problème : + * Comment faire de l'attente passive sur le serveur en écoutant l'arrivée d'un nouveau message au niveau de la bd + -> en utilisant le "event handling" de mnesia : http://www.erlang.org//doc/apps/mnesia/part_frame.html + chapitre 5.7 et 5.7.2 + + +C. Protocole +------------ +c : client +s : server + +C.1. Demande de génération d'un nouveau captcha : +----------------------------------------------- + +c -> s + + + +s -> c + + img/tmp/b1b1b4e72e6f3d00e477cf37cced5851.jpg + b1b1b4e72e6f3d00e477cf37cced5851 + + +C.2. Login : +------------ +le message du client est posté par la méthode POST et se nomme 'action'. + +c -> s +(nouveau user) (obsolète) + + b1b1b4e72e6f3d00e477cf37cced5851 + LKJDLA + + +ou +(ne sert pour l'instant qu'a mettre à jour user.date_derniere_connexion) +(si le login est faut, une temporisation est effectuée) + + LKJDLAKSJBFLKASN + + +ou + + Paul + IJKJDHHSAD9081238 + + + + Paul + IJKJDHHSAD9081238 + + +ou (login et password peuvent être omis) + + Paul + IJKJDHHSAD9081238 + + +s -> c +( et pas obligatoire) + + enregistre|identifie|erreur + LKJDLAKSJBFLKASN + 7ZS + Paul + paul49 + paul@pierre.com + css/lite.css + blabla + + + +C.3. Logout : +------------- +c -> s + + LKJDLAKSJBFLKASN + + +C.4. Profile : +-------------- +modification du profile, seul 'cookie' est obligatoire + +c -> s + + LKJDLAKSJBFLKASN + paul49 + IJKJDHHSAD9081238 + Paul + paul@pierre.com + css/dark.css + + +s -> c + + ok|pas ok + balbla> + + + +C.5. Refresh messages : +----------------------- + +Si dernierMessageId est absent alors le client ne possède pas de message. +Page peut être omis, il a alors la valeur 1 (première page) +dernierMessageId est en base 36 (l'histoire de rigoler un peu) + +c -> s + + LKJDLAKSJBFLKASN + 6ZR + 10 + 1 + + +s -> c + + 4 + + Hier 17:26:54 + + + + + Paul + paul_22 + Salut + + + + + + + + + +ou + + + raison + + +C.6. Envoie message : +--------------------- + +Un client envoie un message, le message peut répondre à un certain nombre d'autres messages. + n'est pas obligatoire. +c -> s + + LKJDLAKSJBFLKASN + Paul + Bonjour + + + + + + + +s -> c + + ok|pas ok + + diff --git a/conception/fond.xcf b/conception/fond.xcf new file mode 100755 index 0000000000000000000000000000000000000000..96e905fcee61ed62a34b3445fb429d5829b0e6d6 GIT binary patch literal 1400 zcmeHG!A{#i5M4VCgakyY0_Q!3LlFD|Jy0ZCRe~cIe{VJHtNp6nPQ%0uliZG& zgTm_!igG?N+NPz+3lo(#ON+zqAWouelI40(xnZ8%g!=gCxUx0mq**$I^k$7z*7d&$ zrL*ETjBJ|d6FCdX`MPA28{Vb1MDx+uua@eNXc2 jE*&v^ui2J=3oW!ivk{oIiMelI*D1-htNH)osYk&dD;50I literal 0 HcmV?d00001 diff --git a/conception/icones/exclamation.xcf b/conception/icones/exclamation.xcf new file mode 100755 index 0000000000000000000000000000000000000000..96381e0dc1a8ad25b0f78ea7bcf7f20179c61fab GIT binary patch literal 1936 zcmeHIy^hmB5FY>J5^OJo--^N#O|A&KgEu$|gv8$?;PY*K7Kwdwe7dB8hJq6D2t0rr zS2UDY@^D05Bd_};DvOpCGWt;wRpgL$?lP}d9P4Uv z`J#PfgSXv+n@~2n=XMj;qn`*Vs{a3sbQvzaBZaCdzDl&2;;JcJ`;~DM$0kQPO&pIF z94}DZQ0q?PP7l`K!-IX^vw490t1qLo3eRKbUBg>nM(6WIUFQq0@6)nI=0R#wHIG>yQiJf^*G%gnbxId?jJ<)+oZ@(GyUXjt1z2g_1kAU457Mj YI3UDS81G_N{|tZYx*yo!J$lvP7vCjXF#rGn literal 0 HcmV?d00001 diff --git a/conception/icones/fermer.xcf b/conception/icones/fermer.xcf new file mode 100755 index 0000000000000000000000000000000000000000..9dc1f7b6ed0464fe089da03f8d0e4e9808bc47dd GIT binary patch literal 1562 zcmdT^OODz=5UnItE#SkxV!BKi)-u7om$gi?h$OLo$+J15V$>scQ3vZvBRFh z+wczjg~nX>9Q7aZ9QbHEcB93@3lnhSMANJW}M`F&^; zKZwlBis4zU6~Eoy2k+K;=d8S#3k<%&c!7AK3V2szu702~9@MMh(;DvA@Suht0dud) zP5^igwrXRv6y>`y)3{QLTH{MIW_)9A%9GTPgH*_Unq{&hMYc<&Of!+0WMo^$62zcZ zwgJRNphDA>X(!td;*15gk;@xwtr=yUYcw&`NED!Fi{}G8OrDomiP|&nr$Y(B1i=Ks zWZNv*-jS4K3mby%En^7+!S)6a7v~_jq{OsiLoj~0AQ-v4!Pc6Q&ACPsLybfMdP1;!WBU!TD0 d3xKK2pFAO~I)ONy=DiA4vCc#0U-50I{1=*FRk8p8 literal 0 HcmV?d00001 diff --git a/conception/icones/information.xcf b/conception/icones/information.xcf new file mode 100755 index 0000000000000000000000000000000000000000..a44fedbb0d814ccd75a0d4fdb9d453a494e771f4 GIT binary patch literal 1891 zcmeHIOK#gR5FOc)<=Qmre%C6xaTYG}xk0)J3iP+@T2W|4s4WGug4nC{0A2J3x&e>S zMHfCmPgB6D)Hjr9*ojj#i=vwjFyiBz84k@E(qS|?^Jc-w8%1MDkbbR#InO6nM`DyVNPs(_%fA#CQrPJC_D9zUcGtGmcDk4 zCVnV~VH%w<2XCuAm}c{_^rASE=~M<;l*H4W&R`S<$v8>9fgXlwcT)(BKaQ5xQ6<#&(U_`(BMPP-hKy*RWW_ zy)}FvnAbAGjld1TVw$5_P5Ijx*Vyb9zKu_tTtl~3lUmB5p0cP=*r8Q{CRq!cmWoKx zO>C*3;B6`vY}Av=>Cf;I!K9E0DSqe_N-gX~qt4f%D<*}yBBe+m#s3}Rq&Cm?j%V1X zUWp2q=({D_vgEpzDDZFbU3_m_&myNpVRar9mPb)?Q*PWNvARdk_t^HYZjiZA*n)!| z)UtMioNt?)^PT6HxZBUD>o%$97UT-o0||?0mkJk8J%V!t=LO{=M=(@? zVDh@!>||>Lg7Yf4Y?45Axx%ah^X?Y4%YsT<8xULS|Cm)3_=j{4{orGmCg-vKQ`lAn hcKh4Un0ZE#%01wO5K{y^aqdw?8P5H{^Gg)L=r5sXTjT%$ literal 0 HcmV?d00001 diff --git a/conception/icones/interrogation.xcf b/conception/icones/interrogation.xcf new file mode 100755 index 0000000000000000000000000000000000000000..8b7cfd8d72975fbef658bab8e882865c480c7522 GIT binary patch literal 2001 zcmeHH&2G~`5FXq4!%jr_J#lcw#XW?y@CN08kobEA*L7@*#;F`vO->wg;S})-ynt_9 zx#4%<5qN^CB#QZFy&IC$hzn9LtUTUt=9`@z?aXcv4bSX}H?RlMsZSVPDU9zxG!4Id zkk-*BA{LDMkeZZ-a%R5=@PCWB6CiBQ8x4nkoI)oi?>L+90OQTUd-Zz~=;Ehg4iS3A~mjuVIeemQ!j0$il zseLRxu2`yg`_F)vPR3`h7sY}7?5PT9I@2nnwDr#8C`IyK=yTSS(O@w4({+L{O|P3u z%l1+}4>`22M0Ff- zoOIGE^o8IXf-A8>HTWs4<+Z{6#d zy$h~4x|F{L43`oYT<;2fA$ZgqT!~Td4XhQ&Q1~F*N^DAAC!;VVMwNL@yWqZDH!NS6 z_WD{qK4ebkAI42xFm>UOLj9Y_fg6*^&hN1B5kgdHCxV!X4Y&qN2^=21+@9h zRMu_MfWxlrai9c&!X+M=&Cxk?xT+(r`$eBLsmkpco6uA{;ihF~l)P8Suge?6t$^QbJ5HCs*ix4h@i8&%65Y{ct`5)hYJu`BkLUyaR zYHMFrPrujib-#Yy{kq>jrT&W5o^?efo)Uk#PuN~16l#ZU7{TG-&j^BR?mvhqu#F_7 z5j=$KWM9|0x&B__%u28edhluc*c!sH~nmFt4PvC{P}#^5n%)VO8lW zuV?C%squE5&a~vzWU{Wh4r~9s=g)VPbzSvpZ;`*U)HAJrFB0pnM@-TR*HrpzsC-eG zPqkhbC@HD-)qJI(a{nnQLAjPy?U8JbgCc_~XyMKD!s31^@iT-xf?9g8Z_VnmK$ZWI zDMe)*N;*N^1%fNt*L4GueIglnRe#V`{lQoDGq36oVP9qG+7vpn`^OdXV%NRlGxw^O`yc~GT{od;2xZGP=x`wewB`OQo zRIB(^-fCZAvA-%2bDr{=DiZ%R=>B}bd=*O?IS;R?uJM=DdCGkyH7Y!?uCO9d?DG`Y zReE{0Bq<&({VJ<@k}dVkWT)T7G;`{I(#wBE@LoHY`UO34j$YZP^!kB@1lr z<~BSccZk`H7i5+gLx2j!cL4JgmjF4$=2o=ps*mt1MVIlS+$2^?7URSi2~;vAM8EdX zrcK4U^uCd{^Q9DezjOU7H;6Q1iHusceb2Lt9Q3eprwVpR%z0P&0}e?QYw!}XnC{&s zQV_CtGr($q37qL0Vxe4a1U9{4AQinIGA18Zbp~&|0tf6`6*p*eABa0|`~wjB>_|KC zx;QW4_uM|Z7?>{iBMses4ab2eM4smBWJV~Pfb}lj=ji~ zJ+Cp=e!#u0VLN!b$bOL@!O|1<<-86w(Xt2Q1_*x$BdrBzT&m|U(KMRabj;mHrf|k@ z(Yoli$J%Myu1`eXr{lj<|C2Cqa)Pev!t+%9%k&U_E6)J?=Z}+>G{w6w|FnhNhW)s# zfD^&Jhw!;bGyZK1<(RRps)R8Xj6R;50lQg-e8Cy2`jpLZGP_@$!4<8KTY&w+x8)@s zb13j+dSmzDCpB`7$-tfD4F?drQRM6Y!Odv4$=~1o?ykB!ot!boE?tyO8Q~k=C>8o^ zB`=b>ZoS?bbM)4~qzrTN$}$-vMj0?wFXDDsF1?8RsVZ+^8-AkH(HgGA3xE}htAHtr zcf!mdHh+#&x_a?}6;jVy{?+Z*OyHOxcA9)m)40~dysl7s6443;Gj}9 znNULc&Y4QQh?jV5-jflD{4!Py8nr@&PklRD!PiGvGtJt^SKqAWam*dBmQERy?@{jb zS%ZlBsMKAOzt`3@kRg$=#amzBwMoUt^A3GzeVoHlXaz2ajNRA}p=YAYG%>tHa+KQ7 zd($G#+MmtHHOKF@=4_-h9l ztp#0N+Sh*MjETswc-oi_>>+q7B6M2U_MADAqn8;;4#=)7~#>fM{t6N_puVt;^kz-lSKpji5-9}of#Oe@{ z5z6sI3I%uHs{tazfmebsmXc!BYkYIPrWo7i)eMy(EZ<^imyq1GQ6ousf9EZ;5sL46 z9;cn0iY2lN1N%8%tD8A)Q)iuq@DNO(J9&@oQKGwB4sF#~H&9mFHs|P#)(;z*glc1ir`p zTHTx5zn4fKa#Mf?d0M0udz6#ObER^&vfQOe)3DRPl8oYo&JJ9-RnorscYVCaBAPdZ zMvJ_XA`H5X~`Ouzsg_#D0WswO`Pm3jLXxPtyQA_W7$}tm^O$feP;AYI@Zjrc8@1mj^nwKIG*=-Ni~&~>(gUC zL7#!zCKB{{sqIyQeqJ!r#i=hpVygRp_dZqm+OGFL)qRsKGb`EYSCEga%zOeLs+k+F zoy(j{+H%4wrPmMo_J0q~MybCF$f6%T`q`u{kDza8ZT)+zaWZPEy#AVMCF}EA+y9rD zoQduAH|v&Uzh70FDU0cJuZzF4_YxL}8oj>%%V4`Dd6Bsz9W zOXRIw##zkmt@pYaV5Xa8VK_3m<{$$;WS;9ivf)TCMW;w#!CBzqT7JT8F)>2dRNMM6 zpeEs6_Z-HN5U*;i$Lqc~hLIRd5iJ-9t0{^Mm>r!a+!!R5>&FfEH$JhdHB6-_mmtv!p!FvCxQHi)?v9`4=4 z14WvG(L=Kfx6uH`*&o%lVgT&VxXw6`FAcmn_9vXNJ|D*fVAsuW1do z-(%W~WY;#g{UVUf&8+#RE`Ij}ePLO1m`|el`wU}Wz6@m$T;yEX%zl}L(y}J0VeXL|#F`aTl};D%crn+c>67%OO8t9zlfxX(f4Ol-t_%@tYzNI{ zAK+P{?kz1ix-h;j_Sv#!g)W-OSa<|_@KEnDd{RnhKh@oK6>8h_C zqhn3Uy@Fw|x2t%D>I9g*5B!GL#NI}V{ZGi%7#RWMZ$%!!ELfc})TeEM-Gm$Ix6f6? zl~$X^Gr>I2_<0H^X-G0g>m#u1bp0VvH587piqvtL~j@Hg; zz=aLj4I~8*;6MRCk&Z!y2EXLRPkJOp><0B;yP6`(h$4r6eio2}b~0UCZ1P)?0$M#p z;-|;Z`*yBOpi8$zaCVN=r%b&j^VZ8d{q7nq!MvaM;N;Sz^O8x!DWQ(z`zrI+o^S5v zsd~a!)Mt|SI}4qUGC1kW z$2Typ+^~=Hy*3h7bT;t_-o&|lU<{}Bi)q1Ou+EL6(X6PZ1f#F(wr$4`pH1uU)D9cZ&7Ny@F{BUr2r=dv<1aW>-?nV|V08mPFW=McM35keDz+#|Uf~NDwsqBFn4w zI=VR0Iv3}Fx?NKAmXXzn5}t=;AJ_Ds*P zo0snV{^!(p>EUR#S_^rxX1CdOIj8E>sdK7M|Ev1z7hn4PuiyL4&wTdYXJ7i<3laaW zczs9-{yoDhj`?$o*V0e_UKHuYzuUZOyndV4osbsYv(W!M?`tp8?8iUz#m|5Kg)h8J zK2qh)?JvFX>6c&lm3#mArI&y8-rxG!zw-;KxnZO)eg4xgzVPuEzx2|ts0`|O>BC=s z`757$;oeJMc=?4deffpYy!_G^zwqUctbF*hFMj5WpZnsM?tR$aKK`W_fBDn*estqU z?cY-pKNhM!0_!h7g*C6g_w5s6{mn1``lmnh(idL5_lY0R8(jJDSDscF%0B)ZUwG+d zg#XO1z96Z8^NXMT?3Z77xe$<|uUs$kl0{bOBm9g1dlaSrE{Z<-Y7~9#uSL-x{D-`T z_YSW*FKK$|*FXKa7hZnZ=CeUwQ#Dt4Nb?pgSJEq$bXG~PR?=&gbc?jw`cJ&nXOoxu z(7)U?R3H8&zZMd?jL;_kY_Tl)UFCmp{-2|HvpMhe=I!=;b5n`Ez4_tcJj>?8;r#e` ze*gabU6I_I-;Lt=vNyT0G2h*t_xt+);9x!;&!^LQx2wcpFh4n=$#+4r&?EwFZ_hiO z`PSBaXJ@{@KR-H}w_5YbWIh_rPfuy`U67Pb&Z7CfdHF}Gily6+E5WPrg%@6W@!QU* zDE`7TI-k!+yv}LsX*2qZl!t${o+kZ3ZF85d@ ze&m7bUx|M(n$4r1j2iQwjF#q`ygn6O&X0%ll!D}VHk>DvB=h*#3g(x`*g#BCJfB8N z&!eA;(qr1#;;jqIE79*nvmwrq%x90Ho4ox{)SSm(UyZJY5v_edwJ{y3C>hq~?^A~n zjV8m{{Ojr0SE7sK==gXT4^!&ShsW3)8LP|aB(d_VGA#hw1POIiJ@O(1nbf4_kmc_7mtNJ-(Fgo`H#x|3H+YVJo?T z3Tr4SonJBXc&?$;(L;iIl)IFiB6&V)4sW^`_2Zaqd|Vse^7^_a13cOraFh(|sEGzJYS%D|b3I>Nt-wpLf?SlMyRB8LPtzMv0YQjZR0&=xSnCFmhTin@wZ|qjXZWg3;+It;h=C zi=huzFglG-XCqmGQ%qz96SD%9$O=RfkFbK#B%uZ?7|9A$j1^31EkQV0ftSk)Cdej{ zWd)uvEAXUQ!RS)D!wN>Z6?h3&FbY<{$ju5y!3yXcE0CNb!3ri=fyAhf%nC-e309!` zx+VlGKr*I%bXq@6Mpyye7g?-egcUGdvVuR4>hqtn4WT*TBHfK@_S&-dlyow;iJddC z>HLgBev@sWGBb4=Ys`H%YV+Hq znPVDA=FigTGIu6X65)o_Co^P1NhXK~F2Z z*J*iW{v3I|qlY@FSv8 zywezdl#Okf{myob;~yc1yu8Q5ENUEo6hfKS@zq=_{1Q9EJ#8K<5IOpt0p%pOXhb^JcnYul;KKT#&16YF!f?WrzhuraT5-|i&+I)cs#H?9@i ze$=pX+jXq(m`SvXx>fj=o1kv(nku_1p|!^*P{#8sVhOf8tI!TuqrZ60UMe{+BkcYT zdbT(tRA_$>6*0S_va0cvRd^S)a5b048Q`jQ8cH-q$uLamBGf4PTy#O{eRlB%_LHZH zZHCf`hDZYq4034N2nDKtK00S2sIMW+N||}TCy$3qOt6t?#y>!74D@~t8&E2_-!}QR z3!CaR;{;Uqe?ZgJL{Y2~^W*gR2e7uAXycXWzh1XLZN|a=*!s-=#`#T*-@xpT;N0wQZ1%@CM<=Na zvM7kzy|KT6?9Vnlx4)3Y{>HLD+o-ic2mAAlR?=gC?BBuus>QZ92K!UF^=2rHfFbr0kDz5I?y6c^dl~oBb&pQ*{-M-Tu5l^|HT#vNdFrrG<>_kK|yy!~}EIphPhmi?KQ>*nzlrQ`66|k+ z{V5#4{wCPp1pAxVE;+*fCfFbE@dW!DVSl!@j;{EyQ`q0Aus;=IeQY|2m4dG^=wQKgrmYmz4#TCK+h@UF<$7XG2rYNRre2rHfFbr0kDz5V^Shc^dngnEfdmQ*{+h-2S{k^|HT_vNdFrrG<>_kK|~w z!~}FB!s{RG?WC)jj9!LIBd zPW3^x8D2_je~#xLx2>~Ays~Ujz$c;q3FFHcwgo^+Xp37hJ&VcH30AH2GTT*xT`R5d zA+_0jj?QlI(gyY%OY=?m!yMEsh6ou8OG4F;MXU24ue>DuCu!3M&?LB0fR!)v|C=EY zS6%4ssS70{wT3HH^#3H$bS~Kyw$!9Gl!T5kWYd*crxXHy zKu`p)D9!q&iaL?A76fSs%4}wB9utbya7l>CSxJzs##}K1(WwzdfP^Jxnbm@tv^H!? zK$`-!lIQd}O63yZMv?kJNP%!^5px2AA3mU7hIC24H=@Uae*hWg!$>jwaU|7KenxUG z@Q-%2)>3YBC0VC)!7IZE(T9){TOH5&yo9CQkB6(g-+%$t-=QZ^l{LI;O^Uw{ja!6@ z6nU+H)exn*X=@1DQRvJjK`RB-^ZNv>ID`W)OIXk>A~e$nhuJX*cydfDGHD{VbVx9) zb}q>wftlZr3J{WcGBpXlYC_S&JbERX5qed9a$Nc(d$@dZQ1Qv}(|vO6K1oQzqz~LD z$;4wkig%2Tz(+o*SWCIQ&PFO^;)2j(!6ywhAa<}8_)wpd;FDgJTGgdM6Sa6!p1JI!VPR zjiuskvxqQ5QDEVv^2sNuP{@-+_@o9Bd~zUjQ0RpT2FfXNM;7Zw_eoSQpFBCq zeR2?=;FE3@)ai5fgrB7-`@W}x}5X9q?4uiQ*60Vw04&;*qT9HW;#inC? zQte!lLjp5Dd{U7tlL%mCK8aA@#wRDGPZHP2Cr1^ZoIKqpC+?GkY53&GeUeN(!J~M` z=m-YolZro;%j?`H0Zc9kw-$WTFdX73YXOKQC&4GZDz&OhL0D=Xp9G6ipfs7tCn0*I zx+pUA44)jGTZULOU_$BWf=)-dPmbhs)C!lvCxtjEnfv6(48sa@pLCLnPg-ro17{JT zmm=c@pL~)Eg*-`wPii2+Cr6qrg`@anpqwIiWbtp+C#@%{s1rFp8Tuw-r-9NZQJ8!( zC&ZhqB#giGNgF@$uVQNR$!dZ5Q^!xVaor~cJx;VwPRu9yc;h~K8c%YcMD_AX5XZ1jj^a~%(k;S$ zQlFoufT5@ElajFXNzDj8$wAU7A8hbR2PNGn3E|BrNAk%Lt;nQ_?9&N8sdg^OA%U46 zKB?%QNd!JLpG2sq`(&LUR)MQyczPFpXYs1QJ7rR~_&WsZdL`jqF?mA$UGndT24vEZ zL4W772layIL}zixU4rqu+JV|c)E4`Fi14~F-49b*WIh6|BEf`?KT0PxB88ar$LOR? zE6`t}EaroN2k8K{ItPr2*!9tk&NivFW`BqTem6&Z{JBA6AErd_z`)uT1y-dDSD*6~ z(af1^$1m3?Bj_rIuE(7y?g4<3OPN)n`U5iWn)T#NSz9SmDAk6uTZHzamg$Vu*ohaK*CH`ASp= zo>WYzfv1`y%P*5wy(xn=VXgowrEj9TnCu138GcXkGWj#*?<**Ft{PnuED|k7tk@|k zk$Rkph>WrpA0(;QN1@wA6~Sd*rKF6^`XW*fh^RCjJ_Xn(B7KZ{+v9je(254Nbo*x% z+PcFa6w#v|#;!#tMA|8CUK?7-m?E5g*h$eO>RDrDh=z5dY7Q_+N!cqXqy^-wzx9x_ z<3BqT+tkO)AF_2FV>oNv| zTsBqDMPm=p`G`oYe~U`=GdDyCOH0w-9bUONyn?srg~)i!_`C5KiV<@Y5jE+j}05y1w`d74Q9>c+_J~^4k z@R=rf%*iE0@)#>JkKqv40^tj=Qib5mnLNhhV0ny{D}FVPAr4;f7~)UyS3QPF$~{KB zgWO|I7ClC%$5oFxagPa~Q-a5w*k=Kz)znWAdg2~~CbUb*Go(0S>+%@;e8C9JW5`f0 z>F^kzoZMqPhsSvM%;XV?o5v`jGb9G_&K@)QZal^!S(HMo6+DLc!aT;_gU1j8B75){ zf*d@?i|`n-!DE1c6;Bl&WBKbIL+~MwvET!bf!{oaV)Gc~PZcLtJ%%WTIIQ9^MnyCe z+=6-qo8~cAMPQa!DH%M5C@LZxGSoTu7|-V(qkxVG-TsC>#xjM+NG*)rJ%%d9yLimR z!Y%h0!mp~wOzM`!V@%n>V<@Y5jEXEEKG&GX@QEXM%;}|KPdvto z%wst4wlMVqbXNf~b0&}RC{-R~<%%xNV~A20Jcj5{{8f)(l5&p`?C5*%&B_}nkYPmG@hZDSD&!TJ%$YBk`9mY$;my&b9jsgw@e;! zvU!XW@)!p3RF6siNPA2VgS7zcqwJ3!d{L?cZ7KhUd6yF?!dNAp@h%frJ|oW4Y|2oz zfrT(?2|HFyOe@b?LJpzONWt(js?XmQVL-HMh5DFV4-n+CHNQjvyF%R$(oM$uJ@OW+ zV9g&SOqTh4kg}UJsCQY2-hT@E9F_iP5icab>J}a_BsvYj01cDjx)JgQaTLM{K!2Wh zov}X;+xw{0`}<9Hb(74cH{YuN6_FR4AFo#lM2G=^75O9Nk3Wk4^an535<+*<-v`;^ z;Tyom>s6LxRzjc;{s^7m4-1|Bc`DxsK3=b4l-L6w&-kNHQ2b%K?ax#Bm@9p15XLxv z)+WwA5x7KLq5J2&bOBfY{w6Qo-qgQ)ymWhzfAPoo^C2a8t^Um4{e_*M|HYsExsB}| zvJB1tJ?)n0_vB6?&8r>#%kLEGR`G3Kx-t5byu!ba`PJf5Ug|&gN8EIMo)_|e?Z=!j zAJ51BCqq7sqQB3L*njx?%^F^QRESdq$u1W}AC449T9? z#+mnm2u7Xq?j&kH>1BsWZ$iuMcJDAWSj*z}RgqHzwL@%A)U(5O)*fv(H=D+=xhbJU z|G0O!xu=Xq236W-sVX?$7Dr%d=PYNv!#(47j#~RN%Gwg)u-A^;%h^>kYsSr4MrL}r zxw#j58qt%nAu&Qyn`DpRM1Bg|&Gmu>dG-)4X}@h8dnHZM90!heui0xho2WwFQ+O(x0 z&b|#>uC<(PFIThr#R^IZ-59|xa$_`#G<&1j(^SjK%C0M%vc$)Ejro5sZV%m?LouDg z;A+Q9YrV_8-X4zbhB$Sq-cm1tZ&OQxmtgmJzCPK)6dzo{5qIO=#8UJgQfapq$ebmc zCI=H}`~BVNfwR@RasR5w#W2*SY%12lw7=Sau+iTzdU(3KU6DWDo%YAdXmqn_Kkc)p z6bvI6p5!>&osNy&8EXB@sM}}ASJQ)j++XfqZFD!{jaiq>blUHaLq{VzGB*AqBDG2P z5u8ZhKRD=btQRbZGe)+g|F&_AOPXY3960(18wVTB4Ym~TM-n;Hu*zg)aly5_yRmCr zk2I(tT-qHMIr=iGjWFJrdT$z>F|ws}1M67hDp)NC>uefmL4U1(g)PP#kA31a+r?mHR>pGBulLUaM`?^n&g4_}R@tjF zxh)3C@T6IPqZL@p6!U?b`8tac$r`<_gWMY3IP!^lY~X)@|*$Ed%D54u+hzI&1-J>`;86um5o`nachHpWh2_CZxs7VYZkQ{ zExK;$oqeT61Fh|JJK0aSFLzoyt$NGe8ZGt}vOBG2tG+$k*S^x)j<@42D7Vh{cT|gqIlovlkM5oehfphAMaej5x3&)#8UJgQfaFe$kau$ogF1R6KFe~ z?V}xMtF_|JRgsHfs2#Ddhi8K&e963`x;llYB^YEM}aoxQ>ogbAVIm#v~QZm9;`p6 z{E{|uqLkjO90rU5YoaN$vb;~%dWC(`+IEim_QUHcOTxjomZ;%aYn>|?;_R`@so5?DBeM!*_0Cz~D2*}6nS9FL zGE%ceXL4H%lHp6U4i@bFm?;*bmHilztkGJ)euFiJc@`n!z41g(Teb|ut(OShui4Q8upM`X?#`i@PGNAhZy#;f zwlDX$_nC@diGiC{Y`ealz`Lb&!Fh24@v^fhkGm&Zm-}1$GO(R#FvPfXc@%hAZQ{;@ zoZEdPW{FMK{4z8ypxnNH25baa*9H2$!f> z;dL7Ta>?>Bx0_?~NytN(iTW07PLY?~q_M@4CO~jeqAL0RTc1F}`>GDq!SiT-8uGhkq!ik^|dwD=@_gV!tr%ZhuBf*LHE^_Bx_3Cf(U z^y+-P2Oii1?+j!@MA>+In~hC_OKTZ0qM*?xB=ziEnY~RwRHJX|Q#lQ2{sWc~{s!scteNKooHh1_3>^3RdO(mh}ecHOFAfHV~b{w+uluz($RL z(g+9^^x?R!Gb->ZSEjfV)0C8NvZDx?zv;|-0RaVw=YJbafsXZ9Gvj6|pcx+TM2HgHC&rDM zycDb0+&lyv%3-U`UZYooQRD@Q7+)2m1{g}kx9O;o4FW4#X`diR(KMYfGOH|GOAnLw zLjg?z+U&Jg+T*I2@!p$Rv+ZmW%e!mW+mC50V5{qgqq0TG1it1duDW;pwOwmp7zc2- zYplJ51v~ccjjD~3lV+Tg?F7Hzzog(?ZXdgf!{EipyqQXh9^uG)dK&#<7*n;MMwH{0 zjJU>pU+V^i7Tq{3Yr7pjjR2dQZL_l2`3lV=9^yJlF=GpSd+dgTCkUi%oJA@bSLWaN z!cl_kM$Y-xlheA%^e1>WQ%NhXr3$0jO%E&2XDO#)&1r}U$hE>$;>}vW9)__xN!-3< z`N19xZasSnpGk0yFKKJ>s);RWSJ}9Ocz8t@tZ$o~d}W8};e)(K41#3RW}($G>LOwn zOOZ_gbJIi;1BXf5Dgyl~CAqLklbf8BiL!}BDwS%rA+^%JY%*|GN-~%>CzLY0X6A=Y zY4e;Jr_bdKM7A!YB&6X~TS#oHnMBVS3d_dTW#bYK+v2184PLV@h}m>kSV(|hySqz{ zOQgUCad&xlCQL&~?%aSII53-bVFCu*?Kk=thQ6jyVxw!AD#!&`sR3(GV+C`APxIQ)*zNJndf?oFo2k?M@5eSFnyX0Io!y`S1$vDyY=+o7P{^qO&I0SHQ>MT< z0k|mi!{A)bqBShLKc>_%Tx?>c54u}4%Ot$n-2nIUaTYSv`;TD?U9C??rFc?1LkPew z6Yp?czt+Dnjxf9Q6Yo0KU#g_!qY>u=@V(${K_fP+0F66#1?Sq3p&R&!j`H3%vUi|1 zS3u9zJ{pnZ^UQsnnZDKqdJKvicOCylu!1S>*O}tj*~-~u7At+ZyvD{NpovD@dUxRI zLgQGByhJ)2S7zP#0s=3C(Q(mRxlF~hFzE>{%?uV3Tw&DIbPpI}J~=rbi%sJ?Q;BP9 z;d;1W0uJfg%7vh3c|+D&e$GPSH9kOAR;_^LR@vCQrovs*{v~|VbowCg4?7^4^jTlE zdb%1hhb6;lIq=wM0MLrUOoY@b_TUn+yl=2;sVPjqi3uu|ZeU8JR{ED4=!wPA3AAg` z*+$pTv(k-orkehiyWqWb*yOwa?)&{$lVZ7{GEp{!Tye%+*8@y&M(75TgaFzh> zwziiX^GJat;@0x^On8Zs@jl4yj>Eob3nn18?XAYvg<-pC3pi95a1)|>>s*=rEdXKT z$b^r8=*F$a7U17DXp^Ae##Xu`s5d=Icg{@)8kh;!1*ABdWqD2@aO0@9lL&2~Fzy&x zVo)6*tV66VP~0=>l@lN{>j*PB>eRtZcG8`TtYvsDkO(-efp$-0-8U?U4utDAI_JPP zpiGEQ5im{X)H?&f6x2gUtq!$Quru;#Gl6nS4cIQ_Y3IU#KJkBR`zQyMVRLv_m=&!8 zyE(sQy#dfK;uOPq%Qg^Qv7mv0Na~FMHVM-beB&6kdOAhp5g=joW1)9SX=x7t}6XQlrUdm)`Z5;t{<=ER6hQ?t5tb)-BBC)<|-4zWQ z=ayq*CJCG?ofCvF8mAk^=3*ADrAJBUq2Mydhp~y3&bTUQy#Hn^>o}VPb0IL<$FvoI z;`O6ZDWB91Oz4obx_25n%vps|bJW_w z&huHy=ap5bAttb67s8lI@LVg{!!TASaopIJFa$k&3ZF@EjW6kF`KsaXh*4!@`#KV` z%W}4LNpnZ((Sy8441#3RVX4(Z>LOwneDo3tbCV&7q1>cx9ie=cl3ds%V-urHluayB zDL&eR9=EXk%Z!1uR+7QAwTaPT*7Bn>Zlf{d^ts%cWz3hB>r9)N!-H&M0ZaZWuwuCQ z3!uCN6wLRt3}6(N+yrD4o-FWDSaKZzQqN}*FexlKHJmvspyJqY=Cvv|drKhb`T{ol zT@>j)^U?xy(>kNg_g1wiNzs@U2LxHTcP{f{kp>o^+d#C6G>au!iS-5=eTQ(7W*J2; zmMo#x#S-1#zg|*6-i73%`wpe1?*+Q|P@<`g4TCPHUSGA;cMo&Z&^_+;a10^S(UF8b zSIrJ8WL)~j$t!mA>Z?(frOjHjrkl4Q4_tj_AYcQ!SbJfhAb7AaEW#yVW$wH6gv9nP z0dSy?BPF6nblPkSV+NImLU3SP@O0qiND}N=rMktdtCxY@ux)y*Md!}1dzIFL8W5hy zLzt%L6&S5)a>;Wr!RsfPM)1YAh?c~c-FaL}27 znLscUmltb=bj=*b)|EbR9!SAwgl1pTJk?;;%|jut-Uy%>cV;OMuo4yU^_ZH+-=Li7E?ZDJO!N_2 z5Jcxqg%+j0xUB{YT-h6dDsCTIgD_QE0L!}8LR*(2hl?#(0|wvyDR*vZz7RtCTx^2z z3$QaFUu1&S!(~Y@N$EgiY|_cMtk$_he+)^?Nt4TskTC@^7fQxWrru>%;Nl(W9P;bScArE4hH8?B{BzAjaRIufJr{!_|PF%O%n!* z$d2|d9pa1(KRuk8iG;c5)rAfwuZQJ1AfYVvIo}RPj z{%V?%cgP*&!)R7FmW}fY&N%X$#`$QObP;k`6O_QE^#kKw9zBRA=tVIFu4zQC0Zvk<44 z$*Wl*f%v6I<5zRyIE(|*{s^~00;|+I|5|?GTBXJq`bBVxGzAoBjSlC3y5uat{dKgj z1q}OAcj6)|MK!_t#gw!s)+R~adKUUl6sN1uNuhdqX%o%L}{cs@;1|?7FjD zsuoS0RttSg`>sIvgl$(BrkBEXXg1|;xdH~iAi2uYU2~1vE=CJp2L(ggB$`;?mIv?wmlZ@m0nicLGu4Gbb(drK zXWb}rh5+$%4lo5^H*7xcUJ5bdR^zVjGJ;^eCg{iza^8(`7o60gNl^$;<4qu#a|+at z54ax=nO!+PGXxNb2?=t{j0#Eb$h@vYik}Q4?>#LV*ucS`>;( z`8N!zth8X|W02*%1@+)fg%+hgZ?L?#Y7IaY_YbW>m?|y6ajgZ~=QitN3)X<$H2qVq z4EHNdNS}*Mpm1F)wX+GyYKKXF)zr{d8v%bf9kJPP?r`IoA&EJ`UZo1AM&?2Zn%hMK z(y)#bUN2dh7txx6lfEI5ec44|oT;aY%PdYC#c2>a@CKFFHUNp?)%|DdH0S01JJ7uG zCY<#6fMX=_j%6L#hOkZ8m%#sV@9E6!u3#I0box*$vxOJJh$}HxuITQ{J}INC6uUMV z-hj^;cT2{D#QoK@q!T&0g31_cl5<|c$&PHDaueS=VYWob*;6P6!nI>HPE>NfODeS^ zFEVOc;hg&5<>C_Edb9@UZCV3R4%}}paAWIIY;xc@IZK;i{?O=dze|qE=;)5y&L~*> zv9}PE>`w6pP`8hS)z6O&tc`P(cUeQw11(%p$8Ky5;4$jkj#H%Oz|R6V4CfA3FFV!@ zOQK7ts6WeR3?HwYsC`q7lv4TJgf=uxPE34QH1SwD)#+T5FPFfobH>vHtQ=!@!F(Y2 zoHwG8@{(0^=p(y!7c&RYQfA*SIruaD(4`P{N9B3j~%Y4wr{Zb?Ql!Vk!4T<7YVd0+P7{bA*($qZs-WXj;S|R?c#W1_rztCY{=fe z*7%n8T%9i@Y`MB=z7+0}vmv**C>5=>xCzY8&4$bcJ3bI|vwZu^5!@Z2jXG1{TDeL% zTG+nO5rjU{MVBPBA!i+KlkRYg00~IvR!8Rv+&~pGH>d&nRk|h2onmpper~4`Y{;)0 zyG|*LU+f@QAaL;0ODoyF2;5viw=3m3Isn*1Ty|vVR{o;31?H^dhY9GEu&X28vQ&TD z;k4q6U!ZY@P{0|-QK#YO4sq*J@E14Cw{-^;Q0}!1)XFxt0;sK+NpzZ zGI9Ft_Ox@JFgg$o@W8 z{dI{wV1WDEEp)Vlg2VlC^=GZ<+yE$F=L_gL1B-V_j*f(O(g;bvYZ2ochQ3x>P&rKW5n50W-c)E&>We#Sa66O-5y-`zLu(MGN(%sw*IMZ4 zBJOap1#7@==>92Jt!cgxLi${6f|(GyYUeH@vx726Tmg`!1C24GlW*B?ahBm86PH<>-}0jl;|Z)m<26U_ zu{0fxL7KB}?dS|ar$h)n$p;)CIUY{a^p9-_s6~*aBixbUr$;lhyug`s1^~B40s3pB zgHd(Cs;U(pfw?_Ff}Sy z6Ttk|#uc^f%z@Y6pa>fDe7ygb(ujiPL#oMPlExEf30*Ttd_bhKl$#`Ym9Bj$H5si#Ff|fM< zdd|+D;g2qbI6z6&i$*Ai5X+7R##ehNum&W;l=RMy8c23tZ50yOva2pkLo_Fjqd1(5 zJi>F3z$&%Wzn0(hS1Idt*ag(52sI1PYMIv7f|clMy$(oTr+KYmI_wBsWTmT&Z9q&( zXJT!V)Lna>mT+*b3;68Jfd`Hb`e^7}#E#;#Rl9W$+QTJ#874ck(`v2PRq8bzns7NV z(l!01;@~6$_pV;VPslaxfW$B2C*0JoUc`^7ODh-g?TkSe?Mdh+{`27L!q|o8KhL?s zjc}~;JY3@R@*2JPt@~9g)AfG6>XeHn&m;CiK5xV8?Oa2TKFS$%30;rISq=^8qP$L6 zRzhCa9z9PMrU$%H9`WJj_{HqaP;()^sFZ8gXOy9-O`2|mh(3kR?#7w#wuV<0~^J_^u z=XxXwo(8D5W)z-5(j-3OdUSX!$&@n;C(jQkXwps)bkvd9Q%JxYS=Q}YAUf3WN0aEL zJ?-1E1m80Zsd`igoVoxS${$Ul&V^J861L-y@8qfFk3o?G4FsU$8zJ6qyu6haOGzSIX0rS(x}8emwumP{=&uQc_% z5`#|lo{OYffuC#9I5fnALe!M7UXCLmR114Rl|}n1tTIT0&LH^Q8H8;H1~05I=&=2<2rAQ;EDRN%n8Zc^yvMT^q|_>#m7eFSzT#qh!m~mG*lhr2eluRI0qPWJ z?$_nTX$lOF8R0isXx)I>tXJn+{38kAMRrXd23MgT>M%C+krD>hUN(@_dyv}s>VZI1 zh9-+D9+bkc!u5A+mBRv2hDI4;@wJ3m#(9{XJ4m4Q!wZdu);Prq#{f1*y5VkDu!G!o z<-JfyJ$slV|29F(?T5^Jp$CN4mo$Qyz@ylzjh?x5(tPlnfize^N#>W>F)`ZDMes6O zHj%NglHBLtEw`Ze`45F=Va~vT!-ByS)8`ENL`lWjSw2n-U?m&rh$ts7Jj4pcYirKA z!}4}?P&^%El*#nHd%1_Z7MAR@o^GCTI$APTpAN!lC=cn8P=VN$89XT2e58e>;H^F! zfxU+_b5eYx%D@w5F20I9OA*Q^8j7~;D-XGJO)B@o;R<5o-k&QqCeB5-g~OlE*w$M2Pt%Sh_FNO0ZDt zjn?UPt$9U?g`Q(={dt97$F+Tc5BS;#gqN$jt7<{!Jkr6wNWY;m1D@+)A{Ro*)xk!j z1Rdy&oxmR+vZ0*-Y#Ve8Tzl%z6A`(i;)v}D#I}crfO17b(ifg6qNjxL+>u>jFaqMk zt#;Dv1>hnVpb}zv5(b9=Ln>~zTb3*HdbEY#R$t{RsKAqO&slR6?z98U;Kv26ZhB_= z!u~r@>)vd5lnBTgqV~H>JV8R3mEakB_a4ej1L#E1C$(^_Z0I2)2HEM|WY7Z(yiluj zXy|}Dp)@6g5oAfYmEMu9Xx~8al3|yFi@@NBoC{PicwwanJ!+z0fY_xddoVmt6m`C@ zVA$QnBsMOCmL3Sasxj|a+U2(gdThmOe<9G&~<@d|Q8z8pw(z#ec?3hu1Hpqj3 zBC3=}GNjxs2QUlJn$)S=<}kS)^&AER2$38OAM}?Epz~g&dq{<3Ye<;XIg+Cko@1-K zwRVl%N`Rau%x{O7H`OuwE!^QwiYPAo1SK~T3gtYCYenFfsP?)F- z#L|PAdnqbtp-QZREhD$FCKERXC`;S;~ zO5Wp7NCi_{18XAfzSf!eCo{6~^`FI@;ALs*^b2UcMv&G;2`u zItOBX8?GQ)7CT30NwS{n(l^)eIpomIZ9%o%`W9qw=DML>K*EX5zPNV|1^5hp!6)GS`5#s26`?Vt;-4IB$hn{PwWu{(I z>(1ngJul>)=(%nj9{mB9V~Fb#PkazY!pD8}0lr~tsQP3B)a1b7m0MW4mff)rk zg>t;m&<+Tv|~N#ero8! z3YDqz9RS0>CWhM@0VoDfGI)~BO8xdYd{^Aq<{mPW>$s5tHTj)w@dijoNT6Tj7OQD6 zJj>%jK&@2DBNWo@TIW##CP|&T!VQz_QO`{n3q3+|l)2McHbBUGk?tWCV5A{oR_8_u zaK+fd)od%Vo7zRAO;FDK()_Fi{BJO;`dB}@(1>Ua&_1A^Hc`5LZP$Zclr6iCU1+7= zdYA*9HcQK$hgd|R3xw8J2!fb=7R&EVGoenpubI;11kzvzp-}T~7p$=}+RsV7jFwGg z%&a8W2;RyMA#!>Zau40im@yU%dPnJ(5Di7g!(86boGY|((H}hocQH!&u zg17nvj)$E6IAgJJnAUBi@zGhvBT$Srd{IMaA>W5F>EkW%K+~XWX(dE*KU~+S57iRB)%;6)^B-i32Y2qaWqdI9i6N z2^d?NuakBhQ0el)8SB*L&)sASQczQ5>uE?ZTGs%)jq_H%1`_DKF{5k1I4kH^TL z<-w;t%Ln{UxS<|cQa-#yh+LzhLVjTabgon{`>uXjU=gz8qgvya7G69{`1g6;)I){& z_jA1L0mHoOVahz5*#2GcH-ETt{j*>E!mp_G|L4<`)nEQJ?MKnx-&Td5qP#jJIMI(A^M?n>3>(opuVhH{K}~ZA zZaw5V;rzr$jq)YZH-|hxhTj2fkX{}#i9>!FPlQWUtnj)$WEL&Y17t|wrp)sYW}?0Y z+hWO08e1%B4l!hF#hO?3cPhAbt&!^;T^HurLfl-uJLQP-qU%K08@k@v_iR*mT_QXL z&4mmPkU_B_1Kdu=rQ`uJq;Hwld4LQ`d4^YmpO3!56t;NP_`Sq+rgx23GUNd=)MdQ% zLqI%0#_VD&=t6cemR*do3tkDEaY9XVj9u^;Q~msJjq)YZH^7JhWUvb|E+uwB`j%-OyFe+=@M`e0&NrCC z7Oxt=*|*O0uJKC7*adYNFa6w2ZWj~mLO%w~AM9d+UGPfy(dC4i<^;Q#U>E#cLyht! z(l;mA1;2;ZAiX@nE+#WjItZ7jSmAYhf?Zf1yC8j=GS5SpiTW07izPQ{Y_X&{!3?Yw zYhKmgso>VNMy_{sU6^MJadYwRlq1TEt`l8v=z3@0vr*l3iLeVa7c$rdiVYd;f{aUv zU68(ITE{L>$}_wg{M_;lrm)4U#_z_hGreoPk_mP}UB(L=DD0wgHun7ok@<7d!gt0L zuo1`Dv&sHaJ%~)Wc+IyJi!b=z7rDA^I*KoV&@IN$hNSp{FBP&mE!$?L_<}DLlFn=+ zQ+UDoE$OxDetk^g&O!YR7PP>D>Z$qy@KvNlxS-C zQXz4PhnAXpzEsHXEtjUjr%_@R4^3q{3RC$~VF+GjT-=8o%IM7SeBZJFhB|U}+tn1n zz->W{c02_z7#_Rdvh9WnVCbE6W;-Q@K_H;uW~~|!+|tgwz7P<67e)NQ7|mJ$qxLO< zZk2d%Rg01|P4Zm85VnN&jdHO_0}Js&AX=q?#geQHFapgADq5sjMv;ppOQ?0RBqf5p zUQ!9@3N>I*WtjK0Qq#BEE9l-siKZ6ABk=LqRa1}Q@uR|}X<&E+LmvCebQA|;cp*BL zabbAl!ti`!v^8i5LqtU{GZo`Lt5gx7sV{-b0C|7Q-X5^59rgkKysl zxut1fctl$sT+4J6Xk&OG{FZTHc$32LzW@FG@PL8EFY7<$EB)X9{=S|e`#t;qKG9nh zN8i;#p9SpdeJM?wLG0}3dfCk#+1;Aw6b!s%)5KN9*V zy=rAbr}TO<&;7@R`n(ONw-79;5C}uzw~Yxyoj_QMg29!L7s``L(!4+bON;TUcU1~l zQCf^^Xhvx@Dv(8K>v6^6CG{XY$14P`-3<&H#$AZ>AwEZ4KJ-=Zz0}L9iC5}OVdJuh zED#ek=Nb}4j@?lkQ=t&G1o*iBXuzHZq3B9MI_FbE0C7d<)j7`ZKV}3_3a0Yikhv$k zDzPGkO;xOjxhIk+u_6mngaug)#C)?GYe&|e{yaOec4JQ?6r7%B?ukB>UbQk5$*z1o z&)hH6=WRH>ML}G#3Cv6r9rG)_M1oEryhQQXO2`YzNhN7sAP}X+c-6Zq1)eA^#x*pf zv>FwVqO|q6Vj+uq5N6{Q0?_UT1`Xpb#Q6}Pqb?u%s`p;%W!1zhb*9K|Swt2K34U`8 zi6Y16sEw&mlvsjz%)Nnk8iWEI#mUV5SaWZ!lyh9nJu!^pnS4WH?ul?pJO~}Ik(PK6 zbI)d8;z1TC2=B2lg!yJe)TXFy^?5c!ZHS&mC^$XM+!FvOy=rABl8y0tp1EJB&)aZ% z3q+C%fv^yMZ2~?SET?FrNy|0W|UT=0!x&(9#<@C zP!Gaoyh0$^-N2w>+=VzF;&asHLtpjYOTDa`c%{x1JS~gJ!Vy7it|3w67#y`R6$;d< z6B8Rir$H#jP^ik>Pc-+|N;${H+<*Vh`(M&K@4vOM58SM570*<*l2&D}Su3~pCH9o^ zd}zfsN$qt@?0Y)f$kXLfjy6z$+(7eg)4q>#q-p!6>R~a``U+47^HJGK3LBE;~n!+tjWwrz6CC^_Lk=%%m+l;6PDN?gyrYy^5{YvO@7ev?$f^CFb}rx zy!ZE9o~jI0*-Dw2kBR1^7!dP;Hp;>3!>{ro7!dfOBcoDH%m=D0Rmgmx=u*ARht8y` z5lNVj%Gm_-QCz`bKIY5^J6Vm}59Qqg<|F^&&=Pkw%3BG{M{#3;`6#YnELW~zFbBmI zjCY^*?>#XO_Wh^#{_a;W7W*x)U{qyhKIWQ_VnF&aa`azZ!C*ctUtGapJ}4;F#C$AV z!C*cXu3#`9PhP?Jimn~}Q(pOni@#1fT)2qqq(9C}|FWO{^k@FTi(mTUZ+!c!79tZX zS03!&N+r!DprU-Wl3uH%xjM&G&F2q!ab<#QJS9(l)gu4lY^wh7XZgdwLd=x1mw5d* zUjK{N@nZcS{x)U*hS$I6^&fft7uCO#{f!~7F|WzHN=L7OXuk%y_}T>a@AyOD{}1&g B^_l9B}R<6 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 literal 0 HcmV?d00001 diff --git a/conception/old_piedpage.xcf b/conception/old_piedpage.xcf new file mode 100755 index 0000000000000000000000000000000000000000..9975be080f1f75b5c5e29256dbf06e405a057243 GIT binary patch literal 2764 zcmeH}y>nYd6veLvNv!AZ=)<4uJUb4N0mVv~VPFO(87QED3$dBR_oMZeRyj*A5V&h@CUM<$!jW6gD z)|r_tbh^if)wt2@R@$p?a`}!raqW5 zb^JblexOs2I*-bgMzbEjac8_>R5+g2IqEAuZZ^7zuY6fm)km#btyAru38d@zpIxUt z&ra3-7`2)2MAA3Lza|bq_dU8_{U-jXd|Yko0Nr72y6d|80nCnK9i1Mpml|`K-L^bF%OA zQt+#C)33=ZeqC<(4cYUXa@~I>yM4q2RD|RpIUhnyf|vv`31Sk&B#226lOQHROoEsM zF$rQ4#3YDG5Yt1<02Kpw;Le8-;}GKz;}GKz;}GKz;}GKz;}GKz;}GKz;}GLi%)HzQ zFNy_rlbnH^ft-Pyft-Pyft-Pyft-Pyft-Pyft-PyVM}(yUAa3vxqQ#VeGrHfxCaKr zPUDj+_x>OEoP8X}lsE##d$CI3sJu zSy?sCN!~awIpbBy8m~#lxG2NEY)GcRC0GkjrKi@Ci{aST#hNkJjIm~nHDjz9W6cbVJCu=_GIEVFvP~Irl#wmU$R=fEgEF#C8Cj!@tWrku zl#v`|Bug2|P)7I?d5g!Q-Ziuzf!=r8?t}3?cavD}Ra#0f;CCz(nR~BX`KsP-J#N~E z&9v)SNB-;UIGna8tTpXA9)AvKDz6DAWMU!BRT^O}`WgHRezPHGR-!%nN&s8Yhu~B2 vIXDDd$Y|BPyNm~LWCcc0NpT{TgL3{{L ztlyMf1F;^NzC_BRL%LX%O;I4g`Z704@>8E?`-B>;tvVJ7WY0B~<_iIMST* z4w3%|-H32(D@cYz5$CWO1^2E~;pd{qCo=Ezo7?**itH4ra_C2*6{WIAK4e=pFUw~G z!DXC_G!sEClQ?U-UKj<*AW6Abs8$+vecnE87g9pbbf}5aZb_+$^ZyBzPP368$T;E` z=jK4yo0U1WuQiTkj^=~DpsuG$7-k~>Z4j>6U)RF3T1xZKVtruZSH^-iyQ1m34`Raa z{Fz88!KMdf1E57Ipr$!xZ)y%zY@2dO>VV-}OT4kfx54QwBUKPnv;1M`xZT&pbc y&*r6y{yTo~9Hq%P?vYtGd-AV)_Gb6E%K4%TA*N0Iu+I0wWqg%lm#^$o8T{XE z)7O>#I+p;SIg87t20fsVY>8_`iF1B#Zfaf$gL6@8Vo7R>LV0FMhC)b2s)Di*w_e^<4_lr4+F}|^|D7DWoF11NUE-o+CK?sB7>)^pUXO@geCyqYB;0- literal 0 HcmV?d00001 diff --git a/img/css1/logo_1.png b/img/css1/logo_1.png new file mode 100755 index 0000000000000000000000000000000000000000..06318b02a30a4467d36293a66f04d25fd4379674 GIT binary patch literal 4808 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 BDA@o2 literal 0 HcmV?d00001 diff --git a/img/css1/logo_2.png b/img/css1/logo_2.png new file mode 100755 index 0000000000000000000000000000000000000000..0a7da962426080fcb69001402bfe8220eb2302e5 GIT binary patch literal 2802 zcmVPx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RS3<44cF|;sq9{>Ofgh@m}RCwC$ zUCnD$Nf56LlZXTrWZ7&^lZ&@yV88_3VJ~|b2>1_p%CI_;iDdC6NKPW;CL7iSXBWnk z|9~LmvKJA>1cF06dC8pefe0H3Vhqe4l6v;**B@2=@sh|C1SXT$^}4F-S6$Uz-2v!R zpZe6NKJ}?j-!BbN9vZG*=y4hEz5H*0!k6+~h_+lAxV-a_gCoO9(9QQ?H{YY2q!(AN zUCw-e&LjUuY!z4q7xc%3R zFOIADnaW$mSLT_qpA%*`WS*xC9|ev;`<>6Q-}#&pXtA-7d@ug3GJjR;0Y$#1=R&kq z4T?$*Q5F~8G3C&WgYL&wH=!!T&B9`10XAV9?zbMmT;m># zw~8gBxxHo?N3aPD&407K?>c+>K4G8@S)P1D?UQmm9A|;*GQZhQJ|gm zEjajeK>Fc$Fzx`T1Tz^mRSuPLa+J=MLncaF1k1Y`(noCPc3PoTkZ+lG)s zG;UqEniqIo!ctq`T>$K2ka>{`@XPJzP^(YET;rbe;&JHlu#L?qj5zbt*<+FFjmNKF zfwgn1!E3*Lb2BcDU%vt?@LDOyk3aw997b{guM5F%+`ef|4P3%f3SVxhyx3UqGDuF} zj8q*2c&4s@R{>t6m8Y+rLUK9v3y~&-AZlt?l)a3p;iKipN`R(nvyTQs-q((io0+_& zNe;1y0ll=c&YS?|jDxHWLZy1RcP;nJ(Baca194c(^#0Q5bQyE0trlCL&l9jmD!YEtJ0-stzg(T6||nO6YBqLj?%2 zL=-JX0R-nGDJY@IDKlqOM~DKGb;l zIybIe>BhAf8t?$$Ry3)=_f@OPLJT2Q zi$W^EV@2R`)Q+S6bj};UZ#-NsB*XkxMM#pESTzu~oDgfe4h-T6>SX323x=0D5PAOZk0_ z?Jt{dZQEkHyir~VLkgw85DQ_rUST^gP^(X7?gPkUcj-9o$|R{B_DAd4H zfghVpj%5e7wENzn_j{=`y_`3y7Q&L5_1YM$!Kybaz*>@YTLJs)w znM_nRSwytb`O z)%$fiiHVO8wyQe+TrdfS;hmV*i7Uc7BgdRc7EG%+X*)&CALaY*bVnrfIM{QX{B622 z>4!4I%l$V2-!%5}43E!p@@NVmeC{tWISl;oFdX2A!bfP^(j9*;a#lT&utt5tP}8of zy*Kiopc#H@)snE47#olw4xk|6f{;p26kVwRZ#yic(~oJa<`lK}cyR?fX|x%Yo#^hw zr=HpH8B@~%Ba~D3{@D14ZC3z>|7EAUYKTiZP=?@7<&BC9dF8OrJ2-89^(5;^$8Quy zV5oc+)}F0qq9#)xO69Rsn^<-eTi^K1%D-sl&(oMt&Q;k_-C2?fd!{JFeC-!bm< z4o+JiJ*jl010gavCD3K-oa_h z(Nip^sOp0WKr!qlw!XRiPph1L>QkTk)Tci6>3gLA0Uf>-T%KnY$N&HU07*qoM6N<$ Ef_vRl`2YX_ literal 0 HcmV?d00001 diff --git a/img/css1/return.png b/img/css1/return.png new file mode 100755 index 0000000000000000000000000000000000000000..d4aa70b63182bab68532ef5922dd6bdfc8f24185 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W=!3HF^gw{O+QjEnx?oJHr&dIz4a@dl*-Cck* z5d3uBT@R!<3p^r=85p>QL70(Y)*K0-AbW|YuPgg?ZgwthMpcgE+kirnC9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3hti10pX2&;y^`4o-U3d8t0P}B;GVk3}XKG|NnpandePx#32;bRa{vGf6951U69E94oEQKA00(qQO+^RS3<41qB2y>L3IG5KH%UZ6RA}Dq zTD!6=Hx2_-{r|t}#DOzxz!#|Q+2A_bsw&OkEW#s#AeD=j;`RJFXC~P15Kv6c15r|$S$h`GFjpJaa%3yk%eJ~e%eejTxmW)YRAwZ+JG5zm?PWN zax_+y>^Q_aP%;1zY1<0c0>eB#3)+6{3~pKIXip-~DRLMZsJA86_S0qyoGmN{fTvwS zUr9?2rk(|2x82>w1GT;OT6ye0@Dv8+5+!B^z(;bkB*zMjoQSc*meWXb8I!+dPCF|% z#-sHDr5&V^iu!Rr&}`wAiq*Ru;||W|kvwzC{Iax>K!pVCe1~UF_Dw2ewv_iOeOt=i z&S0JdSQ$?%s6@A((wXg9A)pO7w4<6KPJ>kdzoSwf{7&_~|KZyrjI@aC1Cm3Cg=`F6 z@k}*123oPH0NsE}sTt7EK#nG_E6KpnklK4Cg$SDyz?yAHK}A$SM6t1pEWRZOJUK-n z?9itO;KW~EdA+EV!EWJK5TVGVY<>lnEz0K(eJXdX%BPl~GE(a6V!aV+GfAzxVw5|$ z%D3fVG$criMvU*%J?89y7y=lv>(I&@k93?$>?C+cx5iI$5$B?4`bqjd+;hI?6XdQ> zG6a?d+nM;|3%-r~RV=L3@i^4<`h{(LC;asdPcq7F>DTh#iBeCv#gJSLhq*V-_*(pZ z5-f)5MU?i^L2UC(Y-z;NjW9b>n zmBoR(L}em&>6RhhiH^naSkv*UA&a-reF2Q9N}cMPyF(z<92Vm~P}?%MP@3`?Tm(NH$e-7E)5ccvP7( zQgSBcSB8m`NU)GB!w$_4zA^$L^}+JZPJ_VM1mV0Y6Yeu6cUIr(qf3L}=nV@%z2qK$ zIU630<+~hp3sy5TaTgVI6db7pS0d-p1+to*RR{oFXh^f?7;3Q;zoj@1m}VkrCJ`G( ztE^RZSJeu_Xj+!D2_e+i+9FVma)3x^<)GB8y`+-@QaVo1OJI}D>2g$4 zti{!X&;(hR!5taBj|}gW_lpdblu+s;-9-}<#IbYu4!fcY62~b@RQ#-x{Dd-hft@AJ z8A4jZaJ8~BLu;Y#`g~d*qdc`c=3An(6dT-gwbr&mnutCP2GfZB04xKJrc#aG;}X)ajZ^hw7e&7l*3uAiYDyyWyNNJ)3Hvy}nf`&hRE( zZmrx-QDnGhYavrQ$meAg(63Ll;$cnw8D#Y|d1NrKD1>I3K+;JuZ?vg*(`dGgSkBB-g>3V`;{e zJMRt&b`xcYzQ7~l%C6eO{~-O1VczU%%JM=V;=0!q_YA0)X#de4)zwHzzAY}zU9aAp zwme3!G0emjb4!8Xt!YhZ8d{a0nzM1FU_IsfRxU zbKVxyk`etytE{_&vI9$-d6^i%bxFZ$pXNay4WQi!O5$?9j)-?s8w{k&kf*5Z)~$q1 z``!F(co2A$xK`Xak(wh#i7lUdkP3LJ?dcjyU2`D&l2G4%n!W|`II*oRZnNlI%d}rh z;EBxpz#2v@JzSn#J5{hKlCp{ND05r`k63t_hMImYF17lpA367hri9Y=wA{R$#FP84 zMk=pvt#Qz^ud7`W=Ml1u{hhL!$Pz>MLH@m zZ|`u^I?EWeJABve59`rgqINY_y~*i$FY8kse%>$AeWhUSN!@ceZzjD{;nhl6kb3k| zzpidEf84_*D&-h67kWgc_A@IH1$-eyB@&j^$Jdb^4l=tBlT#mwY`S? fxE%LR*uZ}P(ZmIt_elPk00000NkvXXu0mjf=2;w* literal 0 HcmV?d00001 diff --git a/img/css2/logo.png b/img/css2/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..aaeaef0ccd7a8a6830e4efa73a8e85d98ebe19dc GIT binary patch literal 4392 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 literal 0 HcmV?d00001 diff --git a/img/css3/logo.png b/img/css3/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..dc6bd856684d84e8a66a303b71fc86715a118e13 GIT binary patch literal 53998 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%0Dnb!c9H!;0YKC9dkW(8o{A=_Zuz2 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 Ef)SJ#-2eap literal 0 HcmV?d00001 diff --git a/img/css3/piedpage.png b/img/css3/piedpage.png new file mode 100755 index 0000000000000000000000000000000000000000..095fdb7755d8ad0b75a35b81859dac670f654e71 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0y~yU@8Q%WjWY@Px#Op-=eaACnPL4Bs|WK$3wP>t1BK( aWX@+OJhFLusTVL189ZJ6T-G@yGywqNLxGY2 literal 0 HcmV?d00001 diff --git a/img/exclamation.gif b/img/exclamation.gif new file mode 100755 index 0000000000000000000000000000000000000000..46bb73303c33a98ba6e59608c38f258be38690fe GIT binary patch literal 119 zcmZ?wbhEHb6krfwSjfz5n9Xon&r{X_B=c3falGGH1^30M91$R&100zaM zER0+X%nUjVKmgLjz+^n9Kl9+*eGPL$+B{lUl((!Zyde^FcY5wKjj5M8SLt)_5X)sQ XIQo9A+U1KCPUjz=2+$B@Wv~VSz+5be literal 0 HcmV?d00001 diff --git a/img/fermer.gif b/img/fermer.gif new file mode 100755 index 0000000000000000000000000000000000000000..3d78493974fc6fe662a6902c651d99239c9931de GIT binary patch literal 118 zcmZ?wbhEHb6krfwSjfb%m4V@ok2XRlE6om6lu U?KkhPH!ACoK0cwK#m!(107<7TlK=n! literal 0 HcmV?d00001 diff --git a/img/information.gif b/img/information.gif new file mode 100755 index 0000000000000000000000000000000000000000..c75a5d6cfd09041c055dc59f6a85ebb5186133f8 GIT binary patch literal 119 zcmZ?wbhEHb6krfwSjf!4z&?N7x^>5n9Xon&r{X_B=c3falGGH1^30M91$R&100zaM zER0+X%nUjVKmgLjz+^n9Kl9+*eGPL$+B{lUl((!Zyde^FH+-r3j+u)?{Iai|(iey> X=R325ZA)d)s-urj1ZW7dGFSrusrM`N literal 0 HcmV?d00001 diff --git a/img/interrogation.gif b/img/interrogation.gif new file mode 100755 index 0000000000000000000000000000000000000000..47fd4b06504e399760806d8f6c74970db9caf1d3 GIT binary patch literal 123 zcmZ?wbhEHb6krfwSjf!KoT0I9-MVAPjvc+XQ}Lgmb5UwyNotBhd1gt5g1e`00E6OB z7Dg@xW(FMwAOLA%U^1W6pLy`@zJ@s=Z5%E4ZauPVye{CeK(iu6blHK3pgG*(%cZu5 a>h2akzlgzDT2bvsw9Pc0R^dPf25SIY_bTrI literal 0 HcmV?d00001 diff --git a/img/powered-by-yaws.gif b/img/powered-by-yaws.gif new file mode 100755 index 0000000000000000000000000000000000000000..8c874d809d5dea505a8e57a636c2f3294a3fa7b9 GIT binary patch literal 1388 zcmeIx{WIGK0LSrM%<)D|72FL0fdX zwPts2V`n;6W?Ry!>J5#DMwlw4x_M}$jfYUiR$aFarht3E3@{7K0rS8E;2~fJ7Jx^uVP43X9bm5z!VA(Y}Yx{*KN5p2N{`IC>7} zDu>e%8F`J%?c{R1xZE32Q9njSbw@|{L`U}$#7%-Q5JVqA^vA>u#Khd<@r*p)5RYf# z^N0ET5k7xZAh<0Mj0psHgu-#5a6%-yD-unLL{lQsJ+XLNEWR%m|16RGB9Y8UrL$7$ zoK!k5l|Gco%re=d*jP(k++tkZv@;jP)#n*+_BQ6~gT`EZ-X5)I(p#MNxutj4%L0}@ta3kLtS7fxTwJ|# z2HPvQmJ}C!G-k^R-(l=1yCBU_JKSU$t__w|^4}9SHiJCC$+u%^1CSloddn^6P>XZj zXm?&|)%n>_^=n;!>zmM`=CSW@WF=E`|IANpN!;F<7rx& zobN;m%B+31^0=_G!ISor6uB@^bFnN>3%NMVPm^iC!I%l1?jSDCoN<(^!t|9{L)3ki zwr|J~9@&vUUFS=_+{7&RD*f2Bt9D_UT(vK$1IP~oZ6@jR{e*m?XWEu}T{xYoFRSX` zVZ2_TSGs5EKnZ%oU>NW#Hfa4lUoA0v&^L!GVr|t8%<;e~W}!?~x-(JX4{d3cy-H)_ z$%rSL5EM)HBS^Ah{5+damKmz`Ma+3SPcrdbxvt?H)n}-RUf~)uM;~&m)4pqbOVRN> zvwDA|4WHsx!yFGFJrX@$Ic+I*KrUG$aC)b5L20kfpqx#mq%h_Gp2<(MRg&}mxf%4(JiAh*R)`CI(+5Jnl|nw Uy2LTmFfraaSG=~~X=4NKKhhoD1poj5 literal 0 HcmV?d00001 diff --git a/img/smileys/alien.gif b/img/smileys/alien.gif new file mode 100755 index 0000000000000000000000000000000000000000..b75a32b99a4dd4fac04dbcad65689d2706b15ed2 GIT binary patch literal 169 zcmZ?wbhEHb#~L^c`lZdQ1{ zCX1ti@xl#WMw11KhA}$rp4S2uUDO&? literal 0 HcmV?d00001 diff --git a/img/smileys/autres/icon_angry.gif b/img/smileys/autres/icon_angry.gif new file mode 100755 index 0000000000000000000000000000000000000000..15f9ccb54cb3feb6934428a28883f1fb227f5525 GIT binary patch literal 93 zcmZ?wbhEHbG!fLx#~KLZ1k-kkoGs~_o4*>+j2to+ ZALJRDnRvBSPHa#-)WrVZ(*&s48UP|NFR7h*#tZJCxeF}AXXeI8)h)JOczk)^k}A&$hrj#_VqmZa0HWU?H2?qr literal 0 HcmV?d00001 diff --git a/img/smileys/autres/icon_cool.gif b/img/smileys/autres/icon_cool.gif new file mode 100755 index 0000000000000000000000000000000000000000..bf0fd097436d7325adf0de739eba94b7e1c22ec1 GIT binary patch literal 871 zcmZ?wbhEHbr^9h6`OqX0!B=-84HOux0a)B7(*OVf literal 0 HcmV?d00001 diff --git a/img/smileys/autres/icon_lol.gif b/img/smileys/autres/icon_lol.gif new file mode 100755 index 0000000000000000000000000000000000000000..ebbec8bf42b29318c4d5a0813662fcd21b42e4c1 GIT binary patch literal 167 zcmZ?wbhEHbGc{SNzGsD#F0RpaTj7P&Q%U2w>pkknz~C;9xV`f6bU5?;qGR3b3-wxG~|u;SM2n zwiOy59v$r!(dDY}5K?hx5?9W;lQD7O>B;{Yj?B>vUUqbrNxE1_NARA+sKLaD1mQ6*#0_PTv|DJO!1P|DEOX#z)FjxZs;t)PM literal 0 HcmV?d00001 diff --git a/img/smileys/autres/icon_neutral.gif b/img/smileys/autres/icon_neutral.gif new file mode 100755 index 0000000000000000000000000000000000000000..634153603451dfd372e0ce53f37e9948153320f1 GIT binary patch literal 85 zcmZ?wbhEHbR7h*#tZJCxgUH}w-sh+t$Xuhsq#;+35TEj3SwZe1^`{n9|`~f literal 0 HcmV?d00001 diff --git a/img/smileys/autres/icon_redface.gif b/img/smileys/autres/icon_redface.gif new file mode 100755 index 0000000000000000000000000000000000000000..667054277d798f6ac8f236730e88816639a97678 GIT binary patch literal 90 zcmZ?wbhEHbGn-Shn@X3+|x13oOHD=EjJzL|b#M^*FdvOYQzG2R>#VJuU`o07YpYLjV8( literal 0 HcmV?d00001 diff --git a/img/smileys/autres/icon_rolleyes.gif b/img/smileys/autres/icon_rolleyes.gif new file mode 100755 index 0000000000000000000000000000000000000000..b2aab79551a579f9e63e30e155510e5833b6de72 GIT binary patch literal 1146 zcmZ?wbhEHb}5vt@XESm@Fz!Wy-Q!|-uK zuY!8m6N!tD-TKr5%VZ*jQVvd5l{E_K*s$zuGb1CyR5k`S237_ppsAb;%p4*=@*nJP zK*+K(umk0R&fs8Y_|Gb#VW5DJW5FwjFcqY);K2bTQ(1sE!t6wmO#%56Bnz>VgMs;v qw1Go{1K3g{kR(Wo73Lsbi68n92Z1#r*;mdDXlH$x>0~>KSt!`3`^gW@NAi0D9CNBLDyZ literal 0 HcmV?d00001 diff --git a/img/smileys/autres/icon_smile.gif b/img/smileys/autres/icon_smile.gif new file mode 100755 index 0000000000000000000000000000000000000000..71cd97a7334a06c301d86c03ec10db00a9d21500 GIT binary patch literal 76 zcmZ?wbhEHb&TA@ z$wzyHjq9dp1TJRiQBm*P6H%1vHCa7)mCuO)#Y3|#_}N&%=87-?&1GX?VPFI@7&usg UGzSM*CIwyQ|6gv140b)%0AL6&ng9R* literal 0 HcmV?d00001 diff --git a/img/smileys/autres/icon_tongue.gif b/img/smileys/autres/icon_tongue.gif new file mode 100755 index 0000000000000000000000000000000000000000..5e25f32c5d692fa4dfce6fb3c1f269e376f62366 GIT binary patch literal 983 zcmZ?wbhEHbNZ`K*oO{ISNKYU_^z0;(u;G*N|Xm#{gF&Jp*P& zpyw5Tvap_DU}n$(1q3LYFmO0Cuye?GY*=uxneD%3%#ZgE>=^`+EOhAUIs=U36PDAj6!TEdJ!uA^FmZGfK*rm0QvAZ9{>OV literal 0 HcmV?d00001 diff --git a/img/smileys/autres/icon_whistle.gif b/img/smileys/autres/icon_whistle.gif new file mode 100755 index 0000000000000000000000000000000000000000..9c20056cc69cd0cf39838c816eb3590df04272ea GIT binary patch literal 852 zcmZ?wbhEHbfEzP&=2rS4)MUvU@j=ZQh?36I7glH{V?nUP&Sh)&QF77fb*E literal 0 HcmV?d00001 diff --git a/img/smileys/bigsmile.gif b/img/smileys/bigsmile.gif new file mode 100755 index 0000000000000000000000000000000000000000..b54cd0f9469ae025d7b709f03432eebc30a615b8 GIT binary patch literal 349 zcmZ?wbhEHbF%wyNW~cLKD&UCI$nR5;ND%61VyNQaR>4~V0+VS-Es%b&%dQM0Fc;EB>`F)=EbAG?) z{XW0v_e4uX5p!1)0U6wy1Q7JOn1AsIzxWg)JTx4#qn)0spSCpN+f(MFm1#AvFHDgH zbar;yY&MAK0l;til3r1I6Jy0&%=sBmC`|fWJyP-9%{8Pm@We)*+ZHAb_4m>Y5 z>do!+m07oL**|GoCr_kC&L!_LM$Tq1Zr{EQ!!VIZL?O`$*HA#s)8N#6fFy!xFStge z`^&b^eYG{dFb%ZX!jP|0hj*+(`aVL*|60$T<-as4?3ESp7`-9I+g=MH7lQpFra)4{ zQ);ik4HJSYL8CmVe`^%dqDXjwt4&|^X#Q;(lTYmSMh40GQ^5y;;G6*5kpV>Wr~2>! zpJn_xufHVf0N_GAxLFU7yC64`ad3lju%VnFW`z_glDaI9<~K!xZVf;zU?%@fX}(o^ zq@xMBIk1jDQk#c#AK-@vuZrco{YLB~eGveMm|$>)%SaJG4uZ6lMl{iAy3wSgsYGRH zT<*OO;}bxmg+KEQERn2OzC0^4Q}Yt|*a(m=AftgpF<^57skJ5zx!U?b{~)BI@TXVC z3Uic+hPYL85f4ulD(gx`05GwLytT28_lt3zE&tc+R z(DBrt{i0JNx>S0->lF-20D!$1A|! zV}^LI`BSaOl;GtZduu=2LZrb9hRm0a78CHiQWwb0P6i4^O9v_cctue3yk7F;E62-& z{kqKkBMQ7PC%*B@5Txv=BB;-EDVJ3uJsY;*85*U~cXo--fLI<|bkWMxKZ z6^V~8tpCTi#VF9=Rkj`U~u4s$3ae0tp)P?m%@~6YXV-jba@*MrNx`4eEXMO8{pHbME1Q2B z61wC3+5m);+YPKaYg~zJD;~^ApCvx}Mp>i{BJ4;lqr)uq; zRUDn$m$S~$j#0Sa3clJHXfNTKPskGY4eDMs4R(HCZqdscvBVAtfu4FUe zvT$mBnLOG!Gl~#! zZL$h3^Nz9i7HM{#aQBHh_=V($okHKpqMu9!oI(6MYzsRu_iO;5EQ!9Fx8uj8*oF{J SB9~0OABr(0=VQAXefAe=Bq<93 literal 0 HcmV?d00001 diff --git a/img/smileys/chat.gif b/img/smileys/chat.gif new file mode 100755 index 0000000000000000000000000000000000000000..33cb58f5e68f58fdd3edfe452a9b098823dc8e46 GIT binary patch literal 270 zcmZ?wbhEHb>(%2Ui5$+E6^rU1V38 z=TtYLnwlC0Fi`x-!pOiN&!7Y1f$Vf(?OyP`cYgY;l$Vlh1|t385hk^AlN=Nsw(vTH z96zj?rPiZz__AiA%_NqlMG`JD(&sNvwya>0V`zL(I7M0Me9EGA6;d1Bbxf@m25C%Y z2vl9}Dt$Nk%w1VGjTg0K^{v`KAE*ssR1z0RHg+{pA4u?g0JS0Q}GZ_?`g!xB&XK z0R7$o`n>@7p#b~B0Q=AY{LKLU)&TwD0R7+q`oIACumJd-0Q<@S`Lh80(*XO!0R74U z{__C%oB#j-00000A^8LW0018VEC2ui01p5U000Gq;3tY+S&ryea)mHGC+czB(7IXR zjdN`mgh|E$*r^7yf`=d}F?6bev?L%bN(lg>G?7f0l7#`{Pyj5YNW@?e8!{J0MO)Hb zE|9|kve6_0bRHB8f*OW{6&?s^Dj10v3JM8{i$)#*0Xilg4ILduDhQ$o4GjpMpd=oi N78akWGMgzO06R_8X7d05 literal 0 HcmV?d00001 diff --git a/img/smileys/cool.gif b/img/smileys/cool.gif new file mode 100755 index 0000000000000000000000000000000000000000..c3aff9d11d5d3bea921c2ec0dceed550fbbb9c04 GIT binary patch literal 957 zcmZ?wbhEHbO4ED+ljw%dJstlf*3_e;6L3#|K`V6543<+io ziDnEb77W=o3BZ72R>?(ldLLgJw&Mq~dq5fhtS zIQSW~Obj*%9cUL&QV?77;DJNKR4&t!8xtNjv9PhT98l$8IMmF>$>HL&;zH`71_lOe E0OJFKJOBUy literal 0 HcmV?d00001 diff --git a/img/smileys/eheheh.gif b/img/smileys/eheheh.gif new file mode 100755 index 0000000000000000000000000000000000000000..4fc3e19b8d0ef8442d4cac16a83f1755a03fe696 GIT binary patch literal 583 zcmd6k%}>&C0EZuovNFZYOtE}Hdy(j6)=D!|7vS6C;2+SezoClpeGqY*L2TLT6IBO?qCGc-i* zIP*C7|3dvASpn!#=e6>mQ0RW6|EDg*s7WvCs>rFSG&U&fzx3&z@%#w2s%fBL(BQ9)DVkro2QG!KtTb@CJY?u4D1{tKh`H4Y~NF_dIYSq)_6=%IX%gg`Nx?b0T~w-3Cru5 zoC;hK)a<8dR$CGH%3(DpD;ovb4M?o8xtM} zED{pdidj*(?8suDsZ}Bp0@y4~!sX$3mo5oiz9}6WAKEiYvDdtLA^7B2C%fB2*-kigN+>8A~6RJFtTv43o=+d14GfG7Yz!Vu9SnwPjr|;2W_vgmsxmMd z@m`5Ju%WSeBJ0F|HVi>8yyh@4aTuH^eaJK;YPT5AslddB4KXX_G_u3A8E4w_Zcv>O z$`HgPD6I8lmVpAoiOdYl4BSBT892;A4n1(-U~{9e8js5ah6ZK^0R@JDjE09zP5equ g9SIK_Tze$tMOJhq9CT&Z;OC3kIf=2kfq}sq0MUGFe*gdg literal 0 HcmV?d00001 diff --git a/img/smileys/oh.gif b/img/smileys/oh.gif new file mode 100755 index 0000000000000000000000000000000000000000..18d3abb9637a65feee26e6e6559c10c6f6f6f96a GIT binary patch literal 367 zcmZ?wbhEHb(`=h`A=aebG51s!qkAdO;|NndU z?qwhsDE?$&1nJcQ5ge6e_RWOQCY;0=D@8@}KZKA=*mywmKj@B+{9 z1ov&Lopv%Im~1Ye(xvZ6MP-Y_<5vVj_kuy_HOp?_;G$9P5sfB` pU6KQ;Y&G|ptu}|->kq0Ej(&&J{k^PfM|kK$v5{{UxXNm&2@ literal 0 HcmV?d00001 diff --git a/img/smileys/renne.gif b/img/smileys/renne.gif new file mode 100755 index 0000000000000000000000000000000000000000..71c63162183df546571471196d21412fa00090e5 GIT binary patch literal 364 zcmV-y0h9hmNk%w1VGjTg0M$PL*Pds2JONXu+{$hhX*2Vvem?=MZ0O!4x*N{xakzQ3Q0NIsP$7BTFqHD}_9)m#v{}B-=S=0ak z00000A^8LW002J#EC2ui01p5U000Jwz}@e+6ApX7SYlWTh>AaCPk;<0FpOV;6QxFn zzW@O|DSW}d$av`cIb=Vd{0Di&I6gIbaXtfbFD)K& z26Jo{3l|j&IwS)wZD2k*BPnt|Dl{FXY%2;rJheUzD6p}#wzFuaH>(u7XmSW22%5if KAgdX=K>$16o`;M8 literal 0 HcmV?d00001 diff --git a/img/smileys/slurp.gif b/img/smileys/slurp.gif new file mode 100755 index 0000000000000000000000000000000000000000..cced52cd1b05281117dda9cb094daa2e01db6d9e GIT binary patch literal 141 zcmZ?wbhEHbz>% literal 0 HcmV?d00001 diff --git a/img/smileys/smile.gif b/img/smileys/smile.gif new file mode 100755 index 0000000000000000000000000000000000000000..3fb63ae4921af03b086a7af004c1318f04dd1894 GIT binary patch literal 590 zcmc(cO;6GR0EZvTQp*A@DosUG3Qb(PLCs={zCa}4|APz1%P_Sa7xkjh9Hj2JPzr%BWp8W=|4s-c^6{rG&md&}AyUJqU`9uF%kEHAUP#Nr|gZrpBM^US+&xp2-g z=fvs6@fwGNS9a`nY%j6duvoEJm^EXb#cXC~2BQg+38N8%f$3?U=+W!Z>6n~Ec*p}S zS}o(_jEylmT1ftv{{PYNtGEc%v=&qfpHQ-(QU7%ngo!D&&{!i8A9yrHN2~1QQPIKu zdzs+UdBthziHh=);yqSfcb8CKeMBhTXJx2YCCKWkghORd8ScN_*(N_#TUA*hJ}it3 z_FimPoN1`5K7LFhTpu3jzHm;_(pWF8tr2csqpwHV-gdSbS<~u`ksnu7owvCE{*FW= o|6MM5({ne_(qH;QuI%U=5=%v8MVc@79vhmTRW_@i%f+bv0Qd8!SpWb4 literal 0 HcmV?d00001 diff --git a/img/smileys/sniff.gif b/img/smileys/sniff.gif new file mode 100755 index 0000000000000000000000000000000000000000..da1895d2153a36c0411f82160fff8a72cdc82210 GIT binary patch literal 378 zcmZ?wbhEHb+Z^fx(vDa>fFdJ(VB2H z>`9={k_8MZO7VJPB7)3JJltHaCS?ZtQewiL{91gjYE6c6(o*6gIzoa1uIj4BMsxM` zB*a8@MM_LfjNM%Iq$Fd!%uE@Kl@#PFWc2s$GgVblHc~W{Kk34tu4ZyJ(9>&&rz3+k E08wdl7XSbN literal 0 HcmV?d00001 diff --git a/img/smileys/spliff.gif b/img/smileys/spliff.gif new file mode 100755 index 0000000000000000000000000000000000000000..a7338cb239cb468d4fbea48e89a5ba637ffac681 GIT binary patch literal 253 zcmV+9g)0P*nv!9+*n;{dR*0K+aa z)YR1f{{R300RR90A^8LW0018VEC2ui01p5U000Gg;3tY+S&ryec5D}%+~~DzfB=^l zt8@)Ck;rb=Sp@(k3nxY_dM1UO=fD}PT2Mg5a&T}S*BWCx7(6(OEA(Pels$`ODPU`~ z-yVX7<54v{1{n$^6cru`Lk0#WU=W2mGF=M<2?8FDhA1VJ0+tXE8xkohCM6gWq9Fh~ D@>FFM literal 0 HcmV?d00001 diff --git a/img/smileys/star.gif b/img/smileys/star.gif new file mode 100755 index 0000000000000000000000000000000000000000..5259b73750e7e4b32bfe5771d52368c4dd1b60c5 GIT binary patch literal 162 zcmZ?wbhEHbVR~D%wS;g|8Vjr!`|yjJk#z8U#L-dV8Rp0xTey` z>$aB9<2x&wWY`i*djl_QHm27Wr!|@>iSZ zt~ASDW|qCwG;^^@`T~>m`NpYpjZ^0sCC@ZWoNkyn%^-e?LHuO>*a>>ky}FTII^pfw zp)Fd$jhcbA8va#k-X*G@g(~iO%C6Z;&KZi1sS5T<^0x6>LG_veH5z`E>ON&^-o>h( z1+|z+lXv15yX_69e0{12Y3SG{o9ZL>dNnT8Ox- zC>&)pk!@&UG+^0a*KjcPQvw5DbP~q}#RQEB$Cw%(FnKHrElijxBFPoNpsK9n$|5P| z%FoB^s#c+`$;!ecCL$~(=&IhLs36BGEh!-`ChBTvps(lFF2yWarlH25r>HG2$G{ru mVzfnHSyx9}OI|Z(zlMRTik^~Uo99Y(wR3@317vmp literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100755 index 0000000..2740552 --- /dev/null +++ b/index.html @@ -0,0 +1,34 @@ + + + + + euphorik.ch + + + + + + + + + + + + + +
! Under heavy development !
+
+ + \ No newline at end of file diff --git a/js/euphorik.js b/js/euphorik.js new file mode 100755 index 0000000..433c0bc --- /dev/null +++ b/js/euphorik.js @@ -0,0 +1,807 @@ +// coding: utf-8 + +/** + * Auteur : GBurri + * Date : 6.11.2007 + */ + +/** + * La configuration. + * Normalement 'const' à la place de 'var' mais non supporté par IE7. + */ +var conf = { + nbMessageAffiche : 80, // (par page) + pseudoDefaut : "", + tempsAffichageMessageDialogue : 4000, // en ms + smiles : { + "smile" : [/:\)/g, /:-\)/g], + "bigsmile" : [/:D/g, /:-D/g], + "clin" : [/;\)/g, /;-\)/g], + "cool" : [/8\)/g, /8-\)/g], + "eheheh" : [/:P/g, /:-P/g], + "oh" : [/:o/g, /:O/g], + "pascontent" : [/>\(/g, />\(/g], + "sniff" : [/:\(/g, /:-\(/g], + "argn" : [/\[:argn\]/g], + "bunny" : [/\[:lapin\]/g], + "chat" : [/\[:chat\]/g], + "renne" : [/\[:renne\]/g], + "lol" : [/\[:lol\]/g], + "spliff" : [/\[:spliff\]/g], + "star" : [/\[:star\]/g], + "triste" : [/\[:triste\]/g], + "kirby" : [/\[:kirby\]/g] + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +String.prototype.trim = function() +{ + return this.replace(/^\s+|\s+$/g,""); +} +String.prototype.ltrim = function() +{ + return this.replace(/^\s+/,""); +} +String.prototype.rtrim = function() +{ + return this.replace(/\s+$/,""); +} + +String.prototype.dump = function() +{ + if (typeof dump != "undefined") + { + dump("\n--- EUPHORIK.CH ---\n") + dump(this) + dump("\n------\n") + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +function Util(serializer) +{ + if(typeof XMLSerializer != "undefined") + this.serializer = new XMLSerializer() + + jQuery("#info .fermer").click(function(){ + jQuery("#info").slideUp(50) + }) +} + +/** + * Affiche une boite de dialogue avec un message à l'intérieur. + * + */ +Util.prototype.messageDialogue = function(message, type, boutons) +{ + if (type == undefined) + type = messageType.informatif + + if (this.timeoutMessageDialogue != undefined) + clearTimeout(this.timeoutMessageDialogue) + + var fermer = function(){jQuery("#info").slideUp(100)} + fermer() + + jQuery("#info .message").html(message) + switch(type) + { + case messageType.informatif : jQuery("#info #icone").attr("class", "information"); break + case messageType.question : jQuery("#info #icone").attr("class", "interrogation"); break + case messageType.erreur : jQuery("#info #icone").attr("class", "exclamation"); break + } + jQuery("#info .boutons").html("") + for (var b in boutons) + jQuery("#info .boutons").append("
" + b + "
").find("div:last").click(boutons[b]).click(fermer) + + jQuery("#info").slideDown(200) + this.timeoutMessageDialogue = setTimeout(fermer, conf.tempsAffichageMessageDialogue) +} +var messageType = {informatif: 0, question: 1, erreur: 2} + +/* obsolète +Util.prototype.log = function(str) +{ +}*/ + +Util.prototype.serializeXML = function(documentXML) +{ + if (this.serializer) + return this.serializer.serializeToString(documentXML) + else + return documentXML.xml +} + +Util.prototype.creerDocumentXMLAction = function() +{ + if (document.implementation && document.implementation.createDocument) + { + return document.implementation.createDocument("", "action", null) + } + else if (window.ActiveXObject) + { + var doc = new ActiveXObject("MSXML2.DOMDocument") //("Microsoft.XMLDOM") + doc.appendChild(doc.createElement("action")); + //doc.loadXML("") + //alert(doc.documentElement) + //doc.createElement("action") + return doc + } +} + +Util.prototype.xmlVersAction = function(xml) +{ + return {action: this.to_utf8(this.serializeXML(xml /*, "UTF-8"*/))} +} + +// voir : http://homepage3.nifty.com/aokura/jscript/utf8.html +// et : http://www1.tip.nl/~t876506/utf8tbl.html +Util.prototype.to_utf8 = function(s) +{ + if (!s) return "" + + var c, d = "" + for (var i = 0; i < s.length; i++) + { + c = s.charCodeAt(i); + if (c <= 0x7f) { + d += s.charAt(i); + } else if (c >= 0x80 && c <= 0x7ff) { + d += String.fromCharCode(((c >> 6) & 0x1f) | 0xc0); + d += String.fromCharCode((c & 0x3f) | 0x80); + } else { + d += String.fromCharCode((c >> 12) | 0xe0); + d += String.fromCharCode(((c >> 6) & 0x3f) | 0x80); + d += String.fromCharCode((c & 0x3f) | 0x80); + } + } + return d; +} + +Util.prototype.md5 = function(chaine) +{ + return hex_md5(chaine) +} + +// pompé de http://www.faqts.com/knowledge_base/view.phtml/aid/13562/fid/130 +Util.prototype.setSelectionRange = function(input, selectionStart, selectionEnd) +{ + if (input.setSelectionRange) + { + input.focus() + input.setSelectionRange(selectionStart, selectionEnd) + } + else if (input.createTextRange) + { + var range = input.createTextRange() + range.collapse(true) + range.moveEnd('character', selectionEnd) + range.moveStart('character', selectionStart) + range.select() + } +} + +Util.prototype.setCaretToEnd = function(input) +{ + this.setSelectionRange(input, input.value.length, input.value.length) +} +Util.prototype.setCaretToBegin = function(input) +{ + this.setSelectionRange(input, 0, 0) +} +Util.prototype.setCaretToPos = function(input, pos) +{ + this.setSelectionRange(input, pos, pos) +} +Util.prototype.selectString = function(input, string) +{ + var match = new RegExp(string, "i").exec(input.value) + if (match) + { + this.setSelectionRange (input, match.index, match.index + match[0].length) + } +} +Util.prototype.replaceSelection = function(input, replaceString) { + if (input.setSelectionRange) + { + var selectionStart = input.selectionStart + var selectionEnd = input.selectionEnd + input.value = input.value.substring(0, selectionStart) + replaceString + input.value.substring(selectionEnd) + + if (selectionStart != selectionEnd) // has there been a selection + this.setSelectionRange(input, selectionStart, selectionStart + replaceString.length) + else // set caret + this.setCaretToPos(input, selectionStart + replaceString.length) + } + else if (document.selection) + { + var range = document.selection.createRange(); + if (range.parentElement() == input) + { + var isCollapsed = range.text == '' + range.text = replaceString + if (!isCollapsed) + { + // there has been a selection + // it appears range.select() should select the newly + // inserted text but that fails with IE + range.moveStart('character', -replaceString.length); + range.select(); + } + } + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +function Pages() +{ + this.pageCourante = null + this.pages = {} +} + +Pages.prototype.ajouterPage = function(page) +{ + page.pages = this // la magie des langages dynamiques : le foutoire + this.pages[page.nom] = page +} + +Pages.prototype.afficherPage = function(nomPage, forcerChargement) +{ + if (forcerChargement == undefined) forcerChargement = false + + var page = this.pages[nomPage] + if (page == undefined || (!forcerChargement && page == this.pageCourante)) return + + if (this.pageCourante != null && this.pageCourante.decharger) + this.pageCourante.decharger() + + jQuery("#menu div").removeClass("courante") + jQuery("#menu div." + nomPage).addClass("courante") + + this.pageCourante = page + jQuery("#page").html(this.pageCourante.contenu()).removeClass().addClass(this.pageCourante.nom) + + if (this.pageCourante.charger) + this.pageCourante.charger() +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +function Formateur() +{ + this.smiles = conf.smiles + this.protocoles = "http|https|ed2k" + + this.regexUrl = new RegExp("(?:(?:" + this.protocoles + ")://|www\\.)[^ ]*", "gi") + this.regexImg = new RegExp("^.*?\\.(gif|jpg|png|jpeg|bmp|tiff)$", "i") + this.regexDomaine = new RegExp("^(?:(?:" + this.protocoles + ")://|www\\.).*?([^/.]+\\.[^/.]+)(?:$|/).*$", "i") + this.regexTestProtocoleExiste = new RegExp("^(?:" + this.protocoles + ")://.*$", "i") + this.regexNomProtocole = new RegExp("^(.*?)://") +} + +/** + * Formate un pseudo saise par l'utilisateur. + * @param pseudo le pseudo brut + * @return le pseudo filtré + */ +Formateur.prototype.filtrerInputPseudo = function(pseudo) +{ + return pseudo.replace(/{|}/g, "").trim() +} + +Formateur.prototype.getSmilesHTML = function() +{ + var XHTML = "" + for (var sNom in this.smiles) + { + XHTML += "" + } + return XHTML +} + +Formateur.prototype.traitementComplet = function(M, pseudo) +{ + return this.traiterSmiles(this.traiterURL(this.remplacerBalisesHTML(M), pseudo)) +} + +/** + * FIXME : Cette méthode est attrocement lourde !! + */ +Formateur.prototype.traiterSmiles = function(M) +{ + for (var sNom in this.smiles) + { + ss = this.smiles[sNom] + for (var i = 0; i < ss.length; i++) + M = M.replace(ss[i], "") + } + return M +} + +Formateur.prototype.remplacerBalisesHTML = function(M) +{ + return M.replace(//g, ">") +} + +Formateur.prototype.traiterURL = function(M, pseudo) +{ + thisFormateur = this + + if (pseudo == undefined) + pseudo = "" + + var traitementUrl = function(url) + { + // si ya pas de protocole on rajoute "http://" + if (!thisFormateur.regexTestProtocoleExiste.test(url)) + url = "http://" + url + var extension = thisFormateur.getShort(url) + return "[" + extension[0] + "]" + } + return M.replace(this.regexUrl, traitementUrl) +} + +/** + * Renvoie une version courte de l'url. + * par exemple : http://en.wikipedia.org/wiki/Yakov_Smirnoff devient wikipedia.org + */ +Formateur.prototype.getShort = function(url) +{ + var estUneImage = false + var versionShort = null + var rechercheImg = this.regexImg.exec(url) + //alert(url) + if (rechercheImg != null) + { + versionShort = rechercheImg[1].toLowerCase() + if (versionShort == "jpeg") versionShort = "jpg" // jpeg -> jpg + estUneImage = true + } + else + { + var rechercheDomaine = this.regexDomaine.exec(url) + if (rechercheDomaine != null && rechercheDomaine.length >= 2) + versionShort = rechercheDomaine[1] + else + { + var nomProtocole = this.regexNomProtocole.exec(url) + if (nomProtocole != null && nomProtocole.length >= 2) + versionShort = nomProtocole[1] + } + } + + return [versionShort == null ? "url" : versionShort, estUneImage] + } + +/** + * Traite les pseudo et messages à être affiché dans le titre d'une image visualisé avec lightbox. + */ +Formateur.prototype.traiterPourFenetreLightBox = function(M, urlCourante) +{ + thisFormateur = this + var traitementUrl = function(url) + { + return "[" + thisFormateur.getShort(url)[0] + (urlCourante == url ? ": image courante" : "") + "]" + } + + return this.remplacerBalisesHTML(M).replace(this.regexUrl, traitementUrl) +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +var statutType = {enregistre: 0, identifie: 1, non_identifie: 2} + +function Client(util) +{ + this.util = util + + this.cookie = null + this.regexCookie = new RegExp("^cookie=([^;]*)") + + // Obsolète + //this.captchaCrypt = null + + // données personnels + this.resetDonneesPersonnelles() + + this.setStatut(statutType.non_identifie) + + // le dernier message d'erreur recut du serveur (par exemple une connexion foireuse : "login impossible") + this.dernierMessageErreur = "" +} + +Client.prototype.resetDonneesPersonnelles = function() +{ + this.pseudo = conf.pseudoDefaut + this.login = "" + this.password = "" + this.email = "" + this.css = jQuery("link#cssPrincipale").attr("href") +} + +Client.prototype.setCss = function(css) +{ + if (this.css == css) + return + + this.css = css + jQuery("link#cssPrincipale").attr("href", this.css) + this.majMenu() + + /* enregistement automatique.. + if (!this.identifie()) + if (!this.enregistrement()) + return + */ + if (this.identifie()) + this.flush() +} + +Client.prototype.getXMLlogin = function(login, password) +{ + var XMLDocument = this.util.creerDocumentXMLAction() + XMLDocument.documentElement.setAttribute("name", "login") + + var nodeLogin = XMLDocument.createElement("login") + nodeLogin.appendChild(XMLDocument.createTextNode(login)) + XMLDocument.documentElement.appendChild(nodeLogin) + + var nodePassword = XMLDocument.createElement("password") + nodePassword.appendChild(XMLDocument.createTextNode(password)) + XMLDocument.documentElement.appendChild(nodePassword) + + return XMLDocument +} + +Client.prototype.getXMLloginCookie = function() +{ + var XMLDocument = this.util.creerDocumentXMLAction() + XMLDocument.documentElement.setAttribute("name", "login") + + var nodeCookie = XMLDocument.createElement("cookie") + nodeCookie.appendChild(XMLDocument.createTextNode(this.cookie)) + XMLDocument.documentElement.appendChild(nodeCookie) + + return XMLDocument +} + +/* Obsolète +Client.prototype.getXMLloginCaptcha = function(captchaCrypt, captchaInput) +{ + var XMLDocument = this.util.creerDocumentXMLAction() + XMLDocument.documentElement.setAttribute("name", "loginCaptcha") + + var nodecaptchaCrypt = XMLDocument.createElement("captchaCrypt") + nodecaptchaCrypt.appendChild(XMLDocument.createTextNode(captchaCrypt)) + XMLDocument.documentElement.appendChild(nodecaptchaCrypt) + + var nodecaptchaInput = XMLDocument.createElement("captchaInput") + nodecaptchaInput.appendChild(XMLDocument.createTextNode(captchaInput)) + XMLDocument.documentElement.appendChild(nodecaptchaInput) + + return XMLDocument +}*/ + +/* Obsolète +Client.prototype.getXMLgenerationCaptcha = function() +{ + var XMLDocument = this.util.creerDocumentXMLAction() + XMLDocument.documentElement.setAttribute("name", "generationCaptcha") + + return XMLDocument +}*/ + +Client.prototype.getXMLEnregistrement = function(login, password) +{ + var XMLDocument = this.util.creerDocumentXMLAction() + XMLDocument.documentElement.setAttribute("name", "register") + + var nodeLogin = XMLDocument.createElement("login") + nodeLogin.appendChild(XMLDocument.createTextNode(login)) + XMLDocument.documentElement.appendChild(nodeLogin) + + var nodePassword = XMLDocument.createElement("password") + nodePassword.appendChild(XMLDocument.createTextNode(password)) + XMLDocument.documentElement.appendChild(nodePassword) + + return XMLDocument +} + +Client.prototype.getXMLProfile = function() +{ + var XMLDocument = this.util.creerDocumentXMLAction() + XMLDocument.documentElement.setAttribute("name", "profile") + + var nodeCookie = XMLDocument.createElement("cookie") + nodeCookie.appendChild(XMLDocument.createTextNode(this.cookie)) + XMLDocument.documentElement.appendChild(nodeCookie) + + var nodeLogin = XMLDocument.createElement("login") + nodeLogin.appendChild(XMLDocument.createTextNode(this.login)) + XMLDocument.documentElement.appendChild(nodeLogin) + + var nodePassword = XMLDocument.createElement("password") + nodePassword.appendChild(XMLDocument.createTextNode(this.password)) + XMLDocument.documentElement.appendChild(nodePassword) + + var nodePseudo = XMLDocument.createElement("pseudo") + nodePseudo.appendChild(XMLDocument.createTextNode(this.pseudo)) + XMLDocument.documentElement.appendChild(nodePseudo) + + var nodeEmail = XMLDocument.createElement("email") + nodeEmail.appendChild(XMLDocument.createTextNode(this.email)) + XMLDocument.documentElement.appendChild(nodeEmail) + + var nodeCSS = XMLDocument.createElement("css") + nodeCSS.appendChild(XMLDocument.createTextNode(this.css)) + XMLDocument.documentElement.appendChild(nodeCSS) + + return XMLDocument +} + +/** + * Renvoie null si pas définit. + */ +Client.prototype.getCookie = function() +{ + var cookie = this.regexCookie.exec(document.cookie) + if (cookie == null) this.cookie = null + else this.cookie = cookie[1] +} + +Client.prototype.delCookie = function() +{ + document.cookie = "cookie=; max-age=0" +} + +Client.prototype.setCookie = function(cookie) +{ + if (this.cookie == null) + return + + document.cookie = + "cookie="+this.cookie+ + "; max-age=" + (60 * 60 * 24 * 365) +} + +Client.prototype.identifie = function() +{ + return this.statut == statutType.enregistre || this.statut == statutType.identifie +} + +Client.prototype.setStatut = function(statut) +{ + if(typeof(statut) == "string") + { + statut = + statut == "enregistre" ? + statutType.enregistre : (statut == "identifie" ? statutType.identifie : statutType.non_identifie) + } + + if (statut == this.statut) return + + this.statut = statut + this.majMenu() +} + +/** + * Demande la génération d'un captcha au serveur et l'affiche. + */ + /* Obsolète +Client.prototype.afficherCaptcha = function(query) +{ + var thisClient = this + + $.post("request", this.util.xmlVersAction(this.getXMLgenerationCaptcha()), + function(data, textStatus) + { + var chemin = jQuery("chemin", data.documentElement).text() + thisClient.captchaCrypt = jQuery("captchaCrypt", data.documentElement).text() + jQuery(query).prepend( + "

Es-tu un bot ? " + + "

" + ) + } + ) +} + +Client.prototype.cacherCaptcha = function() +{ + jQuery("#captcha").remove() +}*/ + +/** + * Effectue la connexion vers le serveur. + * Cette fonction est bloquante tant que la connexion n'a pas été établie. + * S'il existe un cookie en local on s'authentifie directement avec lui. + * Si il n'est pas possible de s'authentifier alors on affiche un captcha anti-bot. + */ +Client.prototype.connexionCookie = function() +{ + this.getCookie() + if (this.cookie == null) return false; + return this.connexion(this.util.xmlVersAction(this.getXMLloginCookie())) +} + +Client.prototype.connexionLogin = function(login, password) +{ + return this.connexion(this.util.xmlVersAction(this.getXMLlogin(login, password))) +} + +/* Obsolète +Client.prototype.connexionCaptcha = function() +{ + return this.connexion(this.util.xmlVersAction(this.getXMLloginCaptcha(this.captchaCrypt, jQuery("#captcha input").val()))) +}*/ + +Client.prototype.enregistrement = function(login, password) +{ + if (this.identifie()) + { + this.login = login + this.password = password + if(this.flush()) + this.setStatut(statutType.enregistre) + return true + } + else + { + if (login == undefined) login = "" + if (password == undefined) password = "" + return this.connexion(this.util.xmlVersAction(this.getXMLEnregistrement(login, password))) + } +} + +Client.prototype.connexion = function(action) +{ + thisClient = this + jQuery.ajax( + { + async: false, + type: "POST", + url: "request", + dataType: "xml", + data: action, + success: + function(data) + { + thisClient.chargerDonnees(data) + } + } + ) + return this.identifie() +} + +Client.prototype.deconnexion = function() +{ + this.setStatut(statutType.non_identifie) // deconnexion + this.resetDonneesPersonnelles() + this.delCookie () +} + +Client.prototype.chargerDonnees = function(data) +{ + this.setStatut(jQuery("statut", data.documentElement).text()) + + if (this.identifie()) + { + this.cookie = jQuery("cookie", data.documentElement).text() + this.setCookie() + + this.login = jQuery("login", data.documentElement).text() + this.pseudo = jQuery("pseudo", data.documentElement).text() + this.email = jQuery("email", data.documentElement).text() + this.css = jQuery("css", data.documentElement).text() + // met à jour la css + if (this.css != "") + { + jQuery("link#cssPrincipale").attr("href", this.css) + this.majMenu() + } + } + this.dernierMessageErreur = jQuery("information", data.documentElement).text() +} + +/** + * Met à jour les données personne sur serveur. + */ +Client.prototype.flush = function() +{ + thisClient = this + //thisClient.util.log(this.util.xmlVersAction(this.getXMLProfile()).action) + jQuery.ajax( + { + async: true, + type: "POST", + url: "request", + dataType: "xml", + data: this.util.xmlVersAction(this.getXMLProfile()), + success: + function(data) + { + //thisClient.util.log(thisClient.util.serializer.serializeToString(data)) + } + } + ) + // TODO : retourner false si un problème est survenu lors de l'update du profile + return true +} + +Client.prototype.majMenu = function() +{ + var displayType = this.css == "css/3/euphorik.css" ? "block" : "inline" //this.client + + // met à jour le menu + if (this.statut == statutType.enregistre) + { + jQuery("#menu .profile").css("display", displayType).text("profile") + jQuery("#menu .logout").css("display", displayType) + jQuery("#menu .register").css("display", "none") + } + else if (this.statut == statutType.identifie) + { + jQuery("#menu .profile").css("display", "none") + jQuery("#menu .logout").css("display", displayType) + jQuery("#menu .register").css("display", displayType) + } + else + { + jQuery("#menu .profile").css("display", displayType).text("login") + jQuery("#menu .logout").css("display", "none") + jQuery("#menu .register").css("display", displayType) + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +jQuery.noConflict() + + +// le main +jQuery(document).ready( + function() + { + + var util = new Util() + var client = new Client(util) + var pages = new Pages() + var formateur = new Formateur() + + // connexion vers le serveur (utilise un cookie qui traine) + client.connexionCookie() + + // les styles css + for (var i = 1; i <= 3; i++) + { + jQuery("#css"+i).click(function(){ + client.setCss("css/" + jQuery(this).attr("id").charAt(3) + "/euphorik.css") + }) + } + + jQuery("#menu .minichat").click(function(){ pages.afficherPage("minichat") }) + jQuery("#menu .profile").click(function(){ pages.afficherPage("profile") }) + jQuery("#menu .logout").click(function(){ + util.messageDialogue("Êtes-vous sur de vouloir vous délogger ?", messageType.question, + {"Oui" : function() + { + client.deconnexion(); + pages.afficherPage("minichat", true) + }, + "Non" : function(){} + } + ) + }) + jQuery("#menu .register").click(function(){ pages.afficherPage("register") }) + + pages.ajouterPage(new PageMinichat(client, formateur, util)) + pages.ajouterPage(new PageProfile(client, formateur, util)) + pages.ajouterPage(new PageRegister(client, formateur, util)) + pages.afficherPage("minichat") + } +) + diff --git a/js/jquery.js b/js/jquery.js new file mode 100755 index 0000000..d646859 --- /dev/null +++ b/js/jquery.js @@ -0,0 +1,11 @@ +/* + * jQuery 1.2.1 - New Wave Javascript + * + * Copyright (c) 2007 John Resig (jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * $Date: 2007-09-16 23:42:06 -0400 (Sun, 16 Sep 2007) $ + * $Rev: 3353 $ + */ +eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(G(){9(1m E!="W")H w=E;H E=18.15=G(a,b){I 6 7u E?6.5N(a,b):1u E(a,b)};9(1m $!="W")H D=$;18.$=E;H u=/^[^<]*(<(.|\\s)+>)[^>]*$|^#(\\w+)$/;E.1b=E.3A={5N:G(c,a){c=c||U;9(1m c=="1M"){H m=u.2S(c);9(m&&(m[1]||!a)){9(m[1])c=E.4D([m[1]],a);J{H b=U.3S(m[3]);9(b)9(b.22!=m[3])I E().1Y(c);J{6[0]=b;6.K=1;I 6}J c=[]}}J I 1u E(a).1Y(c)}J 9(E.1n(c))I 1u E(U)[E.1b.2d?"2d":"39"](c);I 6.6v(c.1c==1B&&c||(c.4c||c.K&&c!=18&&!c.1y&&c[0]!=W&&c[0].1y)&&E.2h(c)||[c])},4c:"1.2.1",7Y:G(){I 6.K},K:0,21:G(a){I a==W?E.2h(6):6[a]},2o:G(a){H b=E(a);b.4Y=6;I b},6v:G(a){6.K=0;1B.3A.1a.16(6,a);I 6},N:G(a,b){I E.N(6,a,b)},4I:G(a){H b=-1;6.N(G(i){9(6==a)b=i});I b},1x:G(f,d,e){H c=f;9(f.1c==3X)9(d==W)I 6.K&&E[e||"1x"](6[0],f)||W;J{c={};c[f]=d}I 6.N(G(a){L(H b 1i c)E.1x(e?6.R:6,b,E.1e(6,c[b],e,a,b))})},17:G(b,a){I 6.1x(b,a,"3C")},2g:G(e){9(1m e!="5i"&&e!=S)I 6.4n().3g(U.6F(e));H t="";E.N(e||6,G(){E.N(6.3j,G(){9(6.1y!=8)t+=6.1y!=1?6.6x:E.1b.2g([6])})});I t},5m:G(b){9(6[0])E(b,6[0].3H).6u().3d(6[0]).1X(G(){H a=6;1W(a.1w)a=a.1w;I a}).3g(6);I 6},8m:G(a){I 6.N(G(){E(6).6q().5m(a)})},8d:G(a){I 6.N(G(){E(6).5m(a)})},3g:G(){I 6.3z(1q,Q,1,G(a){6.58(a)})},6j:G(){I 6.3z(1q,Q,-1,G(a){6.3d(a,6.1w)})},6g:G(){I 6.3z(1q,P,1,G(a){6.12.3d(a,6)})},50:G(){I 6.3z(1q,P,-1,G(a){6.12.3d(a,6.2q)})},2D:G(){I 6.4Y||E([])},1Y:G(t){H b=E.1X(6,G(a){I E.1Y(t,a)});I 6.2o(/[^+>] [^+>]/.14(t)||t.1g("..")>-1?E.4V(b):b)},6u:G(e){H f=6.1X(G(){I 6.67?E(6.67)[0]:6.4R(Q)});H d=f.1Y("*").4O().N(G(){9(6[F]!=W)6[F]=S});9(e===Q)6.1Y("*").4O().N(G(i){H c=E.M(6,"2P");L(H a 1i c)L(H b 1i c[a])E.1j.1f(d[i],a,c[a][b],c[a][b].M)});I f},1E:G(t){I 6.2o(E.1n(t)&&E.2W(6,G(b,a){I t.16(b,[a])})||E.3m(t,6))},5V:G(t){I 6.2o(t.1c==3X&&E.3m(t,6,Q)||E.2W(6,G(a){I(t.1c==1B||t.4c)?E.2A(a,t)<0:a!=t}))},1f:G(t){I 6.2o(E.1R(6.21(),t.1c==3X?E(t).21():t.K!=W&&(!t.11||E.11(t,"2Y"))?t:[t]))},3t:G(a){I a?E.3m(a,6).K>0:P},7c:G(a){I 6.3t("."+a)},3i:G(b){9(b==W){9(6.K){H c=6[0];9(E.11(c,"24")){H e=c.4Z,a=[],Y=c.Y,2G=c.O=="24-2G";9(e<0)I S;L(H i=2G?e:0,33=2G?e+1:Y.K;i<33;i++){H d=Y[i];9(d.26){H b=E.V.1h&&!d.9V["1Q"].9L?d.2g:d.1Q;9(2G)I b;a.1a(b)}}I a}J I 6[0].1Q.1p(/\\r/g,"")}}J I 6.N(G(){9(b.1c==1B&&/4k|5j/.14(6.O))6.2Q=(E.2A(6.1Q,b)>=0||E.2A(6.2H,b)>=0);J 9(E.11(6,"24")){H a=b.1c==1B?b:[b];E("9h",6).N(G(){6.26=(E.2A(6.1Q,a)>=0||E.2A(6.2g,a)>=0)});9(!a.K)6.4Z=-1}J 6.1Q=b})},4o:G(a){I a==W?(6.K?6[0].3O:S):6.4n().3g(a)},6H:G(a){I 6.50(a).28()},6E:G(i){I 6.2J(i,i+1)},2J:G(){I 6.2o(1B.3A.2J.16(6,1q))},1X:G(b){I 6.2o(E.1X(6,G(a,i){I b.2O(a,i,a)}))},4O:G(){I 6.1f(6.4Y)},3z:G(f,d,g,e){H c=6.K>1,a;I 6.N(G(){9(!a){a=E.4D(f,6.3H);9(g<0)a.8U()}H b=6;9(d&&E.11(6,"1I")&&E.11(a[0],"4m"))b=6.4l("1K")[0]||6.58(U.5B("1K"));E.N(a,G(){H a=c?6.4R(Q):6;9(!5A(0,a))e.2O(b,a)})})}};G 5A(i,b){H a=E.11(b,"1J");9(a){9(b.3k)E.3G({1d:b.3k,3e:P,1V:"1J"});J E.5f(b.2g||b.6s||b.3O||"");9(b.12)b.12.3b(b)}J 9(b.1y==1)E("1J",b).N(5A);I a}E.1k=E.1b.1k=G(){H c=1q[0]||{},a=1,2c=1q.K,5e=P;9(c.1c==8o){5e=c;c=1q[1]||{}}9(2c==1){c=6;a=0}H b;L(;a<2c;a++)9((b=1q[a])!=S)L(H i 1i b){9(c==b[i])6r;9(5e&&1m b[i]==\'5i\'&&c[i])E.1k(c[i],b[i]);J 9(b[i]!=W)c[i]=b[i]}I c};H F="15"+(1u 3D()).3B(),6p=0,5c={};E.1k({8a:G(a){18.$=D;9(a)18.15=w;I E},1n:G(a){I!!a&&1m a!="1M"&&!a.11&&a.1c!=1B&&/G/i.14(a+"")},4a:G(a){I a.2V&&!a.1G||a.37&&a.3H&&!a.3H.1G},5f:G(a){a=E.36(a);9(a){9(18.6l)18.6l(a);J 9(E.V.1N)18.56(a,0);J 3w.2O(18,a)}},11:G(b,a){I b.11&&b.11.27()==a.27()},1L:{},M:G(c,d,b){c=c==18?5c:c;H a=c[F];9(!a)a=c[F]=++6p;9(d&&!E.1L[a])E.1L[a]={};9(b!=W)E.1L[a][d]=b;I d?E.1L[a][d]:a},30:G(c,b){c=c==18?5c:c;H a=c[F];9(b){9(E.1L[a]){2E E.1L[a][b];b="";L(b 1i E.1L[a])1T;9(!b)E.30(c)}}J{2a{2E c[F]}29(e){9(c.53)c.53(F)}2E E.1L[a]}},N:G(a,b,c){9(c){9(a.K==W)L(H i 1i a)b.16(a[i],c);J L(H i=0,48=a.K;i<48;i++)9(b.16(a[i],c)===P)1T}J{9(a.K==W)L(H i 1i a)b.2O(a[i],i,a[i]);J L(H i=0,48=a.K,3i=a[0];i<48&&b.2O(3i,i,3i)!==P;3i=a[++i]){}}I a},1e:G(c,b,d,e,a){9(E.1n(b))b=b.2O(c,[e]);H f=/z-?4I|7T-?7Q|1r|69|7P-?1H/i;I b&&b.1c==4W&&d=="3C"&&!f.14(a)?b+"2T":b},1o:{1f:G(b,c){E.N((c||"").2l(/\\s+/),G(i,a){9(!E.1o.3K(b.1o,a))b.1o+=(b.1o?" ":"")+a})},28:G(b,c){b.1o=c!=W?E.2W(b.1o.2l(/\\s+/),G(a){I!E.1o.3K(c,a)}).66(" "):""},3K:G(t,c){I E.2A(c,(t.1o||t).3s().2l(/\\s+/))>-1}},2k:G(e,o,f){L(H i 1i o){e.R["3r"+i]=e.R[i];e.R[i]=o[i]}f.16(e,[]);L(H i 1i o)e.R[i]=e.R["3r"+i]},17:G(e,p){9(p=="1H"||p=="2N"){H b={},42,41,d=["7J","7I","7G","7F"];E.N(d,G(){b["7C"+6]=0;b["7B"+6+"5Z"]=0});E.2k(e,b,G(){9(E(e).3t(\':3R\')){42=e.7A;41=e.7w}J{e=E(e.4R(Q)).1Y(":4k").5W("2Q").2D().17({4C:"1P",2X:"4F",19:"2Z",7o:"0",1S:"0"}).5R(e.12)[0];H a=E.17(e.12,"2X")||"3V";9(a=="3V")e.12.R.2X="7g";42=e.7e;41=e.7b;9(a=="3V")e.12.R.2X="3V";e.12.3b(e)}});I p=="1H"?42:41}I E.3C(e,p)},3C:G(h,j,i){H g,2w=[],2k=[];G 3n(a){9(!E.V.1N)I P;H b=U.3o.3Z(a,S);I!b||b.4y("3n")==""}9(j=="1r"&&E.V.1h){g=E.1x(h.R,"1r");I g==""?"1":g}9(j.1t(/4u/i))j=y;9(!i&&h.R[j])g=h.R[j];J 9(U.3o&&U.3o.3Z){9(j.1t(/4u/i))j="4u";j=j.1p(/([A-Z])/g,"-$1").2p();H d=U.3o.3Z(h,S);9(d&&!3n(h))g=d.4y(j);J{L(H a=h;a&&3n(a);a=a.12)2w.4w(a);L(a=0;a<2w.K;a++)9(3n(2w[a])){2k[a]=2w[a].R.19;2w[a].R.19="2Z"}g=j=="19"&&2k[2w.K-1]!=S?"2s":U.3o.3Z(h,S).4y(j)||"";L(a=0;a<2k.K;a++)9(2k[a]!=S)2w[a].R.19=2k[a]}9(j=="1r"&&g=="")g="1"}J 9(h.3Q){H f=j.1p(/\\-(\\w)/g,G(m,c){I c.27()});g=h.3Q[j]||h.3Q[f];9(!/^\\d+(2T)?$/i.14(g)&&/^\\d/.14(g)){H k=h.R.1S;H e=h.4v.1S;h.4v.1S=h.3Q.1S;h.R.1S=g||0;g=h.R.71+"2T";h.R.1S=k;h.4v.1S=e}}I g},4D:G(a,e){H r=[];e=e||U;E.N(a,G(i,d){9(!d)I;9(d.1c==4W)d=d.3s();9(1m d=="1M"){d=d.1p(/(<(\\w+)[^>]*?)\\/>/g,G(m,a,b){I b.1t(/^(70|6Z|6Y|9Q|4t|9N|9K|3a|9G|9E)$/i)?m:a+">"});H s=E.36(d).2p(),1s=e.5B("1s"),2x=[];H c=!s.1g("<9y")&&[1,"<24>",""]||!s.1g("<9w")&&[1,"<6T>",""]||s.1t(/^<(9u|1K|9t|9r|9p)/)&&[1,"<1I>",""]||!s.1g("<4m")&&[2,"<1I><1K>",""]||(!s.1g("<9m")||!s.1g("<9k"))&&[3,"<1I><1K><4m>",""]||!s.1g("<6Y")&&[2,"<1I><1K><6L>",""]||E.V.1h&&[1,"1s<1s>",""]||[0,"",""];1s.3O=c[1]+d+c[2];1W(c[0]--)1s=1s.5p;9(E.V.1h){9(!s.1g("<1I")&&s.1g("<1K")<0)2x=1s.1w&&1s.1w.3j;J 9(c[1]=="<1I>"&&s.1g("<1K")<0)2x=1s.3j;L(H n=2x.K-1;n>=0;--n)9(E.11(2x[n],"1K")&&!2x[n].3j.K)2x[n].12.3b(2x[n]);9(/^\\s/.14(d))1s.3d(e.6F(d.1t(/^\\s*/)[0]),1s.1w)}d=E.2h(1s.3j)}9(0===d.K&&(!E.11(d,"2Y")&&!E.11(d,"24")))I;9(d[0]==W||E.11(d,"2Y")||d.Y)r.1a(d);J r=E.1R(r,d)});I r},1x:G(c,d,a){H e=E.4a(c)?{}:E.5o;9(d=="26"&&E.V.1N)c.12.4Z;9(e[d]){9(a!=W)c[e[d]]=a;I c[e[d]]}J 9(E.V.1h&&d=="R")I E.1x(c.R,"9e",a);J 9(a==W&&E.V.1h&&E.11(c,"2Y")&&(d=="9d"||d=="9a"))I c.97(d).6x;J 9(c.37){9(a!=W){9(d=="O"&&E.11(c,"4t")&&c.12)6G"O 94 93\'t 92 91";c.90(d,a)}9(E.V.1h&&/6C|3k/.14(d)&&!E.4a(c))I c.4p(d,2);I c.4p(d)}J{9(d=="1r"&&E.V.1h){9(a!=W){c.69=1;c.1E=(c.1E||"").1p(/6O\\([^)]*\\)/,"")+(3I(a).3s()=="8S"?"":"6O(1r="+a*6A+")")}I c.1E?(3I(c.1E.1t(/1r=([^)]*)/)[1])/6A).3s():""}d=d.1p(/-([a-z])/8Q,G(z,b){I b.27()});9(a!=W)c[d]=a;I c[d]}},36:G(t){I(t||"").1p(/^\\s+|\\s+$/g,"")},2h:G(a){H r=[];9(1m a!="8P")L(H i=0,2c=a.K;i<2c;i++)r.1a(a[i]);J r=a.2J(0);I r},2A:G(b,a){L(H i=0,2c=a.K;i<2c;i++)9(a[i]==b)I i;I-1},1R:G(a,b){9(E.V.1h){L(H i=0;b[i];i++)9(b[i].1y!=8)a.1a(b[i])}J L(H i=0;b[i];i++)a.1a(b[i]);I a},4V:G(b){H r=[],2f={};2a{L(H i=0,6y=b.K;i<6y;i++){H a=E.M(b[i]);9(!2f[a]){2f[a]=Q;r.1a(b[i])}}}29(e){r=b}I r},2W:G(b,a,c){9(1m a=="1M")a=3w("P||G(a,i){I "+a+"}");H d=[];L(H i=0,4g=b.K;i<4g;i++)9(!c&&a(b[i],i)||c&&!a(b[i],i))d.1a(b[i]);I d},1X:G(c,b){9(1m b=="1M")b=3w("P||G(a){I "+b+"}");H d=[];L(H i=0,4g=c.K;i<4g;i++){H a=b(c[i],i);9(a!==S&&a!=W){9(a.1c!=1B)a=[a];d=d.8M(a)}}I d}});H v=8K.8I.2p();E.V={4s:(v.1t(/.+(?:8F|8E|8C|8B)[\\/: ]([\\d.]+)/)||[])[1],1N:/6w/.14(v),34:/34/.14(v),1h:/1h/.14(v)&&!/34/.14(v),35:/35/.14(v)&&!/(8z|6w)/.14(v)};H y=E.V.1h?"4h":"5h";E.1k({5g:!E.V.1h||U.8y=="8x",4h:E.V.1h?"4h":"5h",5o:{"L":"8w","8v":"1o","4u":y,5h:y,4h:y,3O:"3O",1o:"1o",1Q:"1Q",3c:"3c",2Q:"2Q",8u:"8t",26:"26",8s:"8r"}});E.N({1D:"a.12",8q:"15.4e(a,\'12\')",8p:"15.2I(a,2,\'2q\')",8n:"15.2I(a,2,\'4d\')",8l:"15.4e(a,\'2q\')",8k:"15.4e(a,\'4d\')",8j:"15.5d(a.12.1w,a)",8i:"15.5d(a.1w)",6q:"15.11(a,\'8h\')?a.8f||a.8e.U:15.2h(a.3j)"},G(i,n){E.1b[i]=G(a){H b=E.1X(6,n);9(a&&1m a=="1M")b=E.3m(a,b);I 6.2o(E.4V(b))}});E.N({5R:"3g",8c:"6j",3d:"6g",8b:"50",89:"6H"},G(i,n){E.1b[i]=G(){H a=1q;I 6.N(G(){L(H j=0,2c=a.K;j<2c;j++)E(a[j])[n](6)})}});E.N({5W:G(a){E.1x(6,a,"");6.53(a)},88:G(c){E.1o.1f(6,c)},87:G(c){E.1o.28(6,c)},86:G(c){E.1o[E.1o.3K(6,c)?"28":"1f"](6,c)},28:G(a){9(!a||E.1E(a,[6]).r.K){E.30(6);6.12.3b(6)}},4n:G(){E("*",6).N(G(){E.30(6)});1W(6.1w)6.3b(6.1w)}},G(i,n){E.1b[i]=G(){I 6.N(n,1q)}});E.N(["85","5Z"],G(i,a){H n=a.2p();E.1b[n]=G(h){I 6[0]==18?E.V.1N&&3y["84"+a]||E.5g&&38.33(U.2V["5a"+a],U.1G["5a"+a])||U.1G["5a"+a]:6[0]==U?38.33(U.1G["6n"+a],U.1G["6m"+a]):h==W?(6.K?E.17(6[0],n):S):6.17(n,h.1c==3X?h:h+"2T")}});H C=E.V.1N&&3x(E.V.4s)<83?"(?:[\\\\w*57-]|\\\\\\\\.)":"(?:[\\\\w\\82-\\81*57-]|\\\\\\\\.)",6k=1u 47("^>\\\\s*("+C+"+)"),6i=1u 47("^("+C+"+)(#)("+C+"+)"),6h=1u 47("^([#.]?)("+C+"*)");E.1k({55:{"":"m[2]==\'*\'||15.11(a,m[2])","#":"a.4p(\'22\')==m[2]",":":{80:"im[3]-0",2I:"m[3]-0==i",6E:"m[3]-0==i",3v:"i==0",3u:"i==r.K-1",6f:"i%2==0",6e:"i%2","3v-46":"a.12.4l(\'*\')[0]==a","3u-46":"15.2I(a.12.5p,1,\'4d\')==a","7X-46":"!15.2I(a.12.5p,2,\'4d\')",1D:"a.1w",4n:"!a.1w",7W:"(a.6s||a.7V||15(a).2g()||\'\').1g(m[3])>=0",3R:\'"1P"!=a.O&&15.17(a,"19")!="2s"&&15.17(a,"4C")!="1P"\',1P:\'"1P"==a.O||15.17(a,"19")=="2s"||15.17(a,"4C")=="1P"\',7U:"!a.3c",3c:"a.3c",2Q:"a.2Q",26:"a.26||15.1x(a,\'26\')",2g:"\'2g\'==a.O",4k:"\'4k\'==a.O",5j:"\'5j\'==a.O",54:"\'54\'==a.O",52:"\'52\'==a.O",51:"\'51\'==a.O",6d:"\'6d\'==a.O",6c:"\'6c\'==a.O",2r:\'"2r"==a.O||15.11(a,"2r")\',4t:"/4t|24|6b|2r/i.14(a.11)",3K:"15.1Y(m[3],a).K",7S:"/h\\\\d/i.14(a.11)",7R:"15.2W(15.32,G(1b){I a==1b.T;}).K"}},6a:[/^(\\[) *@?([\\w-]+) *([!*$^~=]*) *(\'?"?)(.*?)\\4 *\\]/,/^(:)([\\w-]+)\\("?\'?(.*?(\\(.*?\\))?[^(]*?)"?\'?\\)/,1u 47("^([:.#]*)("+C+"+)")],3m:G(a,c,b){H d,2b=[];1W(a&&a!=d){d=a;H f=E.1E(a,c,b);a=f.t.1p(/^\\s*,\\s*/,"");2b=b?c=f.r:E.1R(2b,f.r)}I 2b},1Y:G(t,o){9(1m t!="1M")I[t];9(o&&!o.1y)o=S;o=o||U;H d=[o],2f=[],3u;1W(t&&3u!=t){H r=[];3u=t;t=E.36(t);H l=P;H g=6k;H m=g.2S(t);9(m){H p=m[1].27();L(H i=0;d[i];i++)L(H c=d[i].1w;c;c=c.2q)9(c.1y==1&&(p=="*"||c.11.27()==p.27()))r.1a(c);d=r;t=t.1p(g,"");9(t.1g(" ")==0)6r;l=Q}J{g=/^([>+~])\\s*(\\w*)/i;9((m=g.2S(t))!=S){r=[];H p=m[2],1R={};m=m[1];L(H j=0,31=d.K;j<31;j++){H n=m=="~"||m=="+"?d[j].2q:d[j].1w;L(;n;n=n.2q)9(n.1y==1){H h=E.M(n);9(m=="~"&&1R[h])1T;9(!p||n.11.27()==p.27()){9(m=="~")1R[h]=Q;r.1a(n)}9(m=="+")1T}}d=r;t=E.36(t.1p(g,""));l=Q}}9(t&&!l){9(!t.1g(",")){9(o==d[0])d.44();2f=E.1R(2f,d);r=d=[o];t=" "+t.68(1,t.K)}J{H k=6i;H m=k.2S(t);9(m){m=[0,m[2],m[3],m[1]]}J{k=6h;m=k.2S(t)}m[2]=m[2].1p(/\\\\/g,"");H f=d[d.K-1];9(m[1]=="#"&&f&&f.3S&&!E.4a(f)){H q=f.3S(m[2]);9((E.V.1h||E.V.34)&&q&&1m q.22=="1M"&&q.22!=m[2])q=E(\'[@22="\'+m[2]+\'"]\',f)[0];d=r=q&&(!m[3]||E.11(q,m[3]))?[q]:[]}J{L(H i=0;d[i];i++){H a=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];9(a=="*"&&d[i].11.2p()=="5i")a="3a";r=E.1R(r,d[i].4l(a))}9(m[1]==".")r=E.4X(r,m[2]);9(m[1]=="#"){H e=[];L(H i=0;r[i];i++)9(r[i].4p("22")==m[2]){e=[r[i]];1T}r=e}d=r}t=t.1p(k,"")}}9(t){H b=E.1E(t,r);d=r=b.r;t=E.36(b.t)}}9(t)d=[];9(d&&o==d[0])d.44();2f=E.1R(2f,d);I 2f},4X:G(r,m,a){m=" "+m+" ";H c=[];L(H i=0;r[i];i++){H b=(" "+r[i].1o+" ").1g(m)>=0;9(!a&&b||a&&!b)c.1a(r[i])}I c},1E:G(t,r,h){H d;1W(t&&t!=d){d=t;H p=E.6a,m;L(H i=0;p[i];i++){m=p[i].2S(t);9(m){t=t.7O(m[0].K);m[2]=m[2].1p(/\\\\/g,"");1T}}9(!m)1T;9(m[1]==":"&&m[2]=="5V")r=E.1E(m[3],r,Q).r;J 9(m[1]==".")r=E.4X(r,m[2],h);J 9(m[1]=="["){H g=[],O=m[3];L(H i=0,31=r.K;i<31;i++){H a=r[i],z=a[E.5o[m[2]]||m[2]];9(z==S||/6C|3k|26/.14(m[2]))z=E.1x(a,m[2])||\'\';9((O==""&&!!z||O=="="&&z==m[5]||O=="!="&&z!=m[5]||O=="^="&&z&&!z.1g(m[5])||O=="$="&&z.68(z.K-m[5].K)==m[5]||(O=="*="||O=="~=")&&z.1g(m[5])>=0)^h)g.1a(a)}r=g}J 9(m[1]==":"&&m[2]=="2I-46"){H e={},g=[],14=/(\\d*)n\\+?(\\d*)/.2S(m[3]=="6f"&&"2n"||m[3]=="6e"&&"2n+1"||!/\\D/.14(m[3])&&"n+"+m[3]||m[3]),3v=(14[1]||1)-0,d=14[2]-0;L(H i=0,31=r.K;i<31;i++){H j=r[i],12=j.12,22=E.M(12);9(!e[22]){H c=1;L(H n=12.1w;n;n=n.2q)9(n.1y==1)n.4U=c++;e[22]=Q}H b=P;9(3v==1){9(d==0||j.4U==d)b=Q}J 9((j.4U+d)%3v==0)b=Q;9(b^h)g.1a(j)}r=g}J{H f=E.55[m[1]];9(1m f!="1M")f=E.55[m[1]][m[2]];f=3w("P||G(a,i){I "+f+"}");r=E.2W(r,f,h)}}I{r:r,t:t}},4e:G(b,c){H d=[];H a=b[c];1W(a&&a!=U){9(a.1y==1)d.1a(a);a=a[c]}I d},2I:G(a,e,c,b){e=e||1;H d=0;L(;a;a=a[c])9(a.1y==1&&++d==e)1T;I a},5d:G(n,a){H r=[];L(;n;n=n.2q){9(n.1y==1&&(!a||n!=a))r.1a(n)}I r}});E.1j={1f:G(g,e,c,h){9(E.V.1h&&g.4j!=W)g=18;9(!c.2u)c.2u=6.2u++;9(h!=W){H d=c;c=G(){I d.16(6,1q)};c.M=h;c.2u=d.2u}H i=e.2l(".");e=i[0];c.O=i[1];H b=E.M(g,"2P")||E.M(g,"2P",{});H f=E.M(g,"2t",G(){H a;9(1m E=="W"||E.1j.4T)I a;a=E.1j.2t.16(g,1q);I a});H j=b[e];9(!j){j=b[e]={};9(g.4S)g.4S(e,f,P);J g.7N("43"+e,f)}j[c.2u]=c;6.1Z[e]=Q},2u:1,1Z:{},28:G(d,c,b){H e=E.M(d,"2P"),2L,4I;9(1m c=="1M"){H a=c.2l(".");c=a[0]}9(e){9(c&&c.O){b=c.4Q;c=c.O}9(!c){L(c 1i e)6.28(d,c)}J 9(e[c]){9(b)2E e[c][b.2u];J L(b 1i e[c])9(!a[1]||e[c][b].O==a[1])2E e[c][b];L(2L 1i e[c])1T;9(!2L){9(d.4P)d.4P(c,E.M(d,"2t"),P);J d.7M("43"+c,E.M(d,"2t"));2L=S;2E e[c]}}L(2L 1i e)1T;9(!2L){E.30(d,"2P");E.30(d,"2t")}}},1F:G(d,b,e,c,f){b=E.2h(b||[]);9(!e){9(6.1Z[d])E("*").1f([18,U]).1F(d,b)}J{H a,2L,1b=E.1n(e[d]||S),4N=!b[0]||!b[0].2M;9(4N)b.4w(6.4M({O:d,2m:e}));b[0].O=d;9(E.1n(E.M(e,"2t")))a=E.M(e,"2t").16(e,b);9(!1b&&e["43"+d]&&e["43"+d].16(e,b)===P)a=P;9(4N)b.44();9(f&&f.16(e,b)===P)a=P;9(1b&&c!==P&&a!==P&&!(E.11(e,\'a\')&&d=="4L")){6.4T=Q;e[d]()}6.4T=P}I a},2t:G(d){H a;d=E.1j.4M(d||18.1j||{});H b=d.O.2l(".");d.O=b[0];H c=E.M(6,"2P")&&E.M(6,"2P")[d.O],3q=1B.3A.2J.2O(1q,1);3q.4w(d);L(H j 1i c){3q[0].4Q=c[j];3q[0].M=c[j].M;9(!b[1]||c[j].O==b[1]){H e=c[j].16(6,3q);9(a!==P)a=e;9(e===P){d.2M();d.3p()}}}9(E.V.1h)d.2m=d.2M=d.3p=d.4Q=d.M=S;I a},4M:G(c){H a=c;c=E.1k({},a);c.2M=G(){9(a.2M)a.2M();a.7L=P};c.3p=G(){9(a.3p)a.3p();a.7K=Q};9(!c.2m&&c.65)c.2m=c.65;9(E.V.1N&&c.2m.1y==3)c.2m=a.2m.12;9(!c.4K&&c.4J)c.4K=c.4J==c.2m?c.7H:c.4J;9(c.64==S&&c.63!=S){H e=U.2V,b=U.1G;c.64=c.63+(e&&e.2R||b.2R||0);c.7E=c.7D+(e&&e.2B||b.2B||0)}9(!c.3Y&&(c.61||c.60))c.3Y=c.61||c.60;9(!c.5F&&c.5D)c.5F=c.5D;9(!c.3Y&&c.2r)c.3Y=(c.2r&1?1:(c.2r&2?3:(c.2r&4?2:0)));I c}};E.1b.1k({3W:G(c,a,b){I c=="5Y"?6.2G(c,a,b):6.N(G(){E.1j.1f(6,c,b||a,b&&a)})},2G:G(d,b,c){I 6.N(G(){E.1j.1f(6,d,G(a){E(6).5X(a);I(c||b).16(6,1q)},c&&b)})},5X:G(a,b){I 6.N(G(){E.1j.28(6,a,b)})},1F:G(c,a,b){I 6.N(G(){E.1j.1F(c,a,6,Q,b)})},7x:G(c,a,b){9(6[0])I E.1j.1F(c,a,6[0],P,b)},25:G(){H a=1q;I 6.4L(G(e){6.4H=0==6.4H?1:0;e.2M();I a[6.4H].16(6,[e])||P})},7v:G(f,g){G 4G(e){H p=e.4K;1W(p&&p!=6)2a{p=p.12}29(e){p=6};9(p==6)I P;I(e.O=="4x"?f:g).16(6,[e])}I 6.4x(4G).5U(4G)},2d:G(f){5T();9(E.3T)f.16(U,[E]);J E.3l.1a(G(){I f.16(6,[E])});I 6}});E.1k({3T:P,3l:[],2d:G(){9(!E.3T){E.3T=Q;9(E.3l){E.N(E.3l,G(){6.16(U)});E.3l=S}9(E.V.35||E.V.34)U.4P("5S",E.2d,P);9(!18.7t.K)E(18).39(G(){E("#4E").28()})}}});E.N(("7s,7r,39,7q,6n,5Y,4L,7p,"+"7n,7m,7l,4x,5U,7k,24,"+"51,7j,7i,7h,3U").2l(","),G(i,o){E.1b[o]=G(f){I f?6.3W(o,f):6.1F(o)}});H x=P;G 5T(){9(x)I;x=Q;9(E.V.35||E.V.34)U.4S("5S",E.2d,P);J 9(E.V.1h){U.7f("<7d"+"7y 22=4E 7z=Q "+"3k=//:><\\/1J>");H a=U.3S("4E");9(a)a.62=G(){9(6.2C!="1l")I;E.2d()};a=S}J 9(E.V.1N)E.4B=4j(G(){9(U.2C=="5Q"||U.2C=="1l"){4A(E.4B);E.4B=S;E.2d()}},10);E.1j.1f(18,"39",E.2d)}E.1b.1k({39:G(g,d,c){9(E.1n(g))I 6.3W("39",g);H e=g.1g(" ");9(e>=0){H i=g.2J(e,g.K);g=g.2J(0,e)}c=c||G(){};H f="4z";9(d)9(E.1n(d)){c=d;d=S}J{d=E.3a(d);f="5P"}H h=6;E.3G({1d:g,O:f,M:d,1l:G(a,b){9(b=="1C"||b=="5O")h.4o(i?E("<1s/>").3g(a.40.1p(/<1J(.|\\s)*?\\/1J>/g,"")).1Y(i):a.40);56(G(){h.N(c,[a.40,b,a])},13)}});I 6},7a:G(){I E.3a(6.5M())},5M:G(){I 6.1X(G(){I E.11(6,"2Y")?E.2h(6.79):6}).1E(G(){I 6.2H&&!6.3c&&(6.2Q||/24|6b/i.14(6.11)||/2g|1P|52/i.14(6.O))}).1X(G(i,c){H b=E(6).3i();I b==S?S:b.1c==1B?E.1X(b,G(a,i){I{2H:c.2H,1Q:a}}):{2H:c.2H,1Q:b}}).21()}});E.N("5L,5K,6t,5J,5I,5H".2l(","),G(i,o){E.1b[o]=G(f){I 6.3W(o,f)}});H B=(1u 3D).3B();E.1k({21:G(d,b,a,c){9(E.1n(b)){a=b;b=S}I E.3G({O:"4z",1d:d,M:b,1C:a,1V:c})},78:G(b,a){I E.21(b,S,a,"1J")},77:G(c,b,a){I E.21(c,b,a,"45")},76:G(d,b,a,c){9(E.1n(b)){a=b;b={}}I E.3G({O:"5P",1d:d,M:b,1C:a,1V:c})},75:G(a){E.1k(E.59,a)},59:{1Z:Q,O:"4z",2z:0,5G:"74/x-73-2Y-72",6o:Q,3e:Q,M:S},49:{},3G:G(s){H f,2y=/=(\\?|%3F)/g,1v,M;s=E.1k(Q,s,E.1k(Q,{},E.59,s));9(s.M&&s.6o&&1m s.M!="1M")s.M=E.3a(s.M);9(s.1V=="4b"){9(s.O.2p()=="21"){9(!s.1d.1t(2y))s.1d+=(s.1d.1t(/\\?/)?"&":"?")+(s.4b||"5E")+"=?"}J 9(!s.M||!s.M.1t(2y))s.M=(s.M?s.M+"&":"")+(s.4b||"5E")+"=?";s.1V="45"}9(s.1V=="45"&&(s.M&&s.M.1t(2y)||s.1d.1t(2y))){f="4b"+B++;9(s.M)s.M=s.M.1p(2y,"="+f);s.1d=s.1d.1p(2y,"="+f);s.1V="1J";18[f]=G(a){M=a;1C();1l();18[f]=W;2a{2E 18[f]}29(e){}}}9(s.1V=="1J"&&s.1L==S)s.1L=P;9(s.1L===P&&s.O.2p()=="21")s.1d+=(s.1d.1t(/\\?/)?"&":"?")+"57="+(1u 3D()).3B();9(s.M&&s.O.2p()=="21"){s.1d+=(s.1d.1t(/\\?/)?"&":"?")+s.M;s.M=S}9(s.1Z&&!E.5b++)E.1j.1F("5L");9(!s.1d.1g("8g")&&s.1V=="1J"){H h=U.4l("9U")[0];H g=U.5B("1J");g.3k=s.1d;9(!f&&(s.1C||s.1l)){H j=P;g.9R=g.62=G(){9(!j&&(!6.2C||6.2C=="5Q"||6.2C=="1l")){j=Q;1C();1l();h.3b(g)}}}h.58(g);I}H k=P;H i=18.6X?1u 6X("9P.9O"):1u 6W();i.9M(s.O,s.1d,s.3e);9(s.M)i.5C("9J-9I",s.5G);9(s.5y)i.5C("9H-5x-9F",E.49[s.1d]||"9D, 9C 9B 9A 5v:5v:5v 9z");i.5C("X-9x-9v","6W");9(s.6U)s.6U(i);9(s.1Z)E.1j.1F("5H",[i,s]);H c=G(a){9(!k&&i&&(i.2C==4||a=="2z")){k=Q;9(d){4A(d);d=S}1v=a=="2z"&&"2z"||!E.6S(i)&&"3U"||s.5y&&E.6R(i,s.1d)&&"5O"||"1C";9(1v=="1C"){2a{M=E.6Q(i,s.1V)}29(e){1v="5k"}}9(1v=="1C"){H b;2a{b=i.5s("6P-5x")}29(e){}9(s.5y&&b)E.49[s.1d]=b;9(!f)1C()}J E.5r(s,i,1v);1l();9(s.3e)i=S}};9(s.3e){H d=4j(c,13);9(s.2z>0)56(G(){9(i){i.9q();9(!k)c("2z")}},s.2z)}2a{i.9o(s.M)}29(e){E.5r(s,i,S,e)}9(!s.3e)c();I i;G 1C(){9(s.1C)s.1C(M,1v);9(s.1Z)E.1j.1F("5I",[i,s])}G 1l(){9(s.1l)s.1l(i,1v);9(s.1Z)E.1j.1F("6t",[i,s]);9(s.1Z&&!--E.5b)E.1j.1F("5K")}},5r:G(s,a,b,e){9(s.3U)s.3U(a,b,e);9(s.1Z)E.1j.1F("5J",[a,s,e])},5b:0,6S:G(r){2a{I!r.1v&&9n.9l=="54:"||(r.1v>=6N&&r.1v<9j)||r.1v==6M||E.V.1N&&r.1v==W}29(e){}I P},6R:G(a,c){2a{H b=a.5s("6P-5x");I a.1v==6M||b==E.49[c]||E.V.1N&&a.1v==W}29(e){}I P},6Q:G(r,b){H c=r.5s("9i-O");H d=b=="6K"||!b&&c&&c.1g("6K")>=0;H a=d?r.9g:r.40;9(d&&a.2V.37=="5k")6G"5k";9(b=="1J")E.5f(a);9(b=="45")a=3w("("+a+")");I a},3a:G(a){H s=[];9(a.1c==1B||a.4c)E.N(a,G(){s.1a(3f(6.2H)+"="+3f(6.1Q))});J L(H j 1i a)9(a[j]&&a[j].1c==1B)E.N(a[j],G(){s.1a(3f(j)+"="+3f(6))});J s.1a(3f(j)+"="+3f(a[j]));I s.66("&").1p(/%20/g,"+")}});E.1b.1k({1A:G(b,a){I b?6.1U({1H:"1A",2N:"1A",1r:"1A"},b,a):6.1E(":1P").N(G(){6.R.19=6.3h?6.3h:"";9(E.17(6,"19")=="2s")6.R.19="2Z"}).2D()},1z:G(b,a){I b?6.1U({1H:"1z",2N:"1z",1r:"1z"},b,a):6.1E(":3R").N(G(){6.3h=6.3h||E.17(6,"19");9(6.3h=="2s")6.3h="2Z";6.R.19="2s"}).2D()},6J:E.1b.25,25:G(a,b){I E.1n(a)&&E.1n(b)?6.6J(a,b):a?6.1U({1H:"25",2N:"25",1r:"25"},a,b):6.N(G(){E(6)[E(6).3t(":1P")?"1A":"1z"]()})},9c:G(b,a){I 6.1U({1H:"1A"},b,a)},9b:G(b,a){I 6.1U({1H:"1z"},b,a)},99:G(b,a){I 6.1U({1H:"25"},b,a)},98:G(b,a){I 6.1U({1r:"1A"},b,a)},96:G(b,a){I 6.1U({1r:"1z"},b,a)},95:G(c,a,b){I 6.1U({1r:a},c,b)},1U:G(k,i,h,g){H j=E.6D(i,h,g);I 6[j.3L===P?"N":"3L"](G(){j=E.1k({},j);H f=E(6).3t(":1P"),3y=6;L(H p 1i k){9(k[p]=="1z"&&f||k[p]=="1A"&&!f)I E.1n(j.1l)&&j.1l.16(6);9(p=="1H"||p=="2N"){j.19=E.17(6,"19");j.2U=6.R.2U}}9(j.2U!=S)6.R.2U="1P";j.3M=E.1k({},k);E.N(k,G(c,a){H e=1u E.2j(3y,j,c);9(/25|1A|1z/.14(a))e[a=="25"?f?"1A":"1z":a](k);J{H b=a.3s().1t(/^([+-]=)?([\\d+-.]+)(.*)$/),1O=e.2b(Q)||0;9(b){H d=3I(b[2]),2i=b[3]||"2T";9(2i!="2T"){3y.R[c]=(d||1)+2i;1O=((d||1)/e.2b(Q))*1O;3y.R[c]=1O+2i}9(b[1])d=((b[1]=="-="?-1:1)*d)+1O;e.3N(1O,d,2i)}J e.3N(1O,a,"")}});I Q})},3L:G(a,b){9(E.1n(a)){b=a;a="2j"}9(!a||(1m a=="1M"&&!b))I A(6[0],a);I 6.N(G(){9(b.1c==1B)A(6,a,b);J{A(6,a).1a(b);9(A(6,a).K==1)b.16(6)}})},9f:G(){H a=E.32;I 6.N(G(){L(H i=0;i-8O?r:3I(E.17(6.T,6.1e))||0},3N:G(c,b,e){6.5u=(1u 3D()).3B();6.1O=c;6.2D=b;6.2i=e||6.2i||"2T";6.2v=6.1O;6.4q=6.4i=0;6.4r();H f=6;G t(){I f.2F()}t.T=6.T;E.32.1a(t);9(E.32.K==1){H d=4j(G(){H a=E.32;L(H i=0;i6.Y.2e+6.5u){6.2v=6.2D;6.4q=6.4i=1;6.4r();6.Y.3M[6.1e]=Q;H a=Q;L(H i 1i 6.Y.3M)9(6.Y.3M[i]!==Q)a=P;9(a){9(6.Y.19!=S){6.T.R.2U=6.Y.2U;6.T.R.19=6.Y.19;9(E.17(6.T,"19")=="2s")6.T.R.19="2Z"}9(6.Y.1z)6.T.R.19="2s";9(6.Y.1z||6.Y.1A)L(H p 1i 6.Y.3M)E.1x(6.T.R,p,6.Y.3P[p])}9(a&&E.1n(6.Y.1l))6.Y.1l.16(6.T);I P}J{H n=t-6.5u;6.4i=n/6.Y.2e;6.4q=E.3J[6.Y.3J||(E.3J.5q?"5q":"6B")](6.4i,n,0,1,6.Y.2e);6.2v=6.1O+((6.2D-6.1O)*6.4q);6.4r()}I Q}};E.2j.2F={2R:G(a){a.T.2R=a.2v},2B:G(a){a.T.2B=a.2v},1r:G(a){E.1x(a.T.R,"1r",a.2v)},6z:G(a){a.T.R[a.1e]=a.2v+a.2i}};E.1b.6m=G(){H c=0,3E=0,T=6[0],5t;9(T)8L(E.V){H b=E.17(T,"2X")=="4F",1D=T.12,23=T.23,2K=T.3H,4f=1N&&3x(4s)<8J;9(T.6V){5w=T.6V();1f(5w.1S+38.33(2K.2V.2R,2K.1G.2R),5w.3E+38.33(2K.2V.2B,2K.1G.2B));9(1h){H d=E("4o").17("8H");d=(d=="8G"||E.5g&&3x(4s)>=7)&&2||d;1f(-d,-d)}}J{1f(T.5l,T.5z);1W(23){1f(23.5l,23.5z);9(35&&/^t[d|h]$/i.14(1D.37)||!4f)d(23);9(4f&&!b&&E.17(23,"2X")=="4F")b=Q;23=23.23}1W(1D.37&&!/^1G|4o$/i.14(1D.37)){9(!/^8D|1I-9S.*$/i.14(E.17(1D,"19")))1f(-1D.2R,-1D.2B);9(35&&E.17(1D,"2U")!="3R")d(1D);1D=1D.12}9(4f&&b)1f(-2K.1G.5l,-2K.1G.5z)}5t={3E:3E,1S:c}}I 5t;G d(a){1f(E.17(a,"9T"),E.17(a,"8A"))}G 1f(l,t){c+=3x(l)||0;3E+=3x(t)||0}}})();',62,616,'||||||this|||if|||||||||||||||||||||||||||||||||function|var|return|else|length|for|data|each|type|false|true|style|null|elem|document|browser|undefined||options|||nodeName|parentNode||test|jQuery|apply|css|window|display|push|fn|constructor|url|prop|add|indexOf|msie|in|event|extend|complete|typeof|isFunction|className|replace|arguments|opacity|div|match|new|status|firstChild|attr|nodeType|hide|show|Array|success|parent|filter|trigger|body|height|table|script|tbody|cache|string|safari|start|hidden|value|merge|left|break|animate|dataType|while|map|find|global||get|id|offsetParent|select|toggle|selected|toUpperCase|remove|catch|try|cur|al|ready|duration|done|text|makeArray|unit|fx|swap|split|target||pushStack|toLowerCase|nextSibling|button|none|handle|guid|now|stack|tb|jsre|timeout|inArray|scrollTop|readyState|end|delete|step|one|name|nth|slice|doc|ret|preventDefault|width|call|events|checked|scrollLeft|exec|px|overflow|documentElement|grep|position|form|block|removeData|rl|timers|max|opera|mozilla|trim|tagName|Math|load|param|removeChild|disabled|insertBefore|async|encodeURIComponent|append|oldblock|val|childNodes|src|readyList|multiFilter|color|defaultView|stopPropagation|args|old|toString|is|last|first|eval|parseInt|self|domManip|prototype|getTime|curCSS|Date|top||ajax|ownerDocument|parseFloat|easing|has|queue|curAnim|custom|innerHTML|orig|currentStyle|visible|getElementById|isReady|error|static|bind|String|which|getComputedStyle|responseText|oWidth|oHeight|on|shift|json|child|RegExp|ol|lastModified|isXMLDoc|jsonp|jquery|previousSibling|dir|safari2|el|styleFloat|state|setInterval|radio|getElementsByTagName|tr|empty|html|getAttribute|pos|update|version|input|float|runtimeStyle|unshift|mouseover|getPropertyValue|GET|clearInterval|safariTimer|visibility|clean|__ie_init|absolute|handleHover|lastToggle|index|fromElement|relatedTarget|click|fix|evt|andSelf|removeEventListener|handler|cloneNode|addEventListener|triggered|nodeIndex|unique|Number|classFilter|prevObject|selectedIndex|after|submit|password|removeAttribute|file|expr|setTimeout|_|appendChild|ajaxSettings|client|active|win|sibling|deep|globalEval|boxModel|cssFloat|object|checkbox|parsererror|offsetLeft|wrapAll|dequeue|props|lastChild|swing|handleError|getResponseHeader|results|startTime|00|box|Modified|ifModified|offsetTop|evalScript|createElement|setRequestHeader|ctrlKey|callback|metaKey|contentType|ajaxSend|ajaxSuccess|ajaxError|ajaxStop|ajaxStart|serializeArray|init|notmodified|POST|loaded|appendTo|DOMContentLoaded|bindReady|mouseout|not|removeAttr|unbind|unload|Width|keyCode|charCode|onreadystatechange|clientX|pageX|srcElement|join|outerHTML|substr|zoom|parse|textarea|reset|image|odd|even|before|quickClass|quickID|prepend|quickChild|execScript|offset|scroll|processData|uuid|contents|continue|textContent|ajaxComplete|clone|setArray|webkit|nodeValue|fl|_default|100|linear|href|speed|eq|createTextNode|throw|replaceWith|splice|_toggle|xml|colgroup|304|200|alpha|Last|httpData|httpNotModified|httpSuccess|fieldset|beforeSend|getBoundingClientRect|XMLHttpRequest|ActiveXObject|col|br|abbr|pixelLeft|urlencoded|www|application|ajaxSetup|post|getJSON|getScript|elements|serialize|clientWidth|hasClass|scr|clientHeight|write|relative|keyup|keypress|keydown|change|mousemove|mouseup|mousedown|right|dblclick|resize|focus|blur|frames|instanceof|hover|offsetWidth|triggerHandler|ipt|defer|offsetHeight|border|padding|clientY|pageY|Left|Right|toElement|Bottom|Top|cancelBubble|returnValue|detachEvent|attachEvent|substring|line|weight|animated|header|font|enabled|innerText|contains|only|size|gt|lt|uFFFF|u0128|417|inner|Height|toggleClass|removeClass|addClass|replaceAll|noConflict|insertAfter|prependTo|wrap|contentWindow|contentDocument|http|iframe|children|siblings|prevAll|nextAll|wrapInner|prev|Boolean|next|parents|maxLength|maxlength|readOnly|readonly|class|htmlFor|CSS1Compat|compatMode|compatible|borderTopWidth|ie|ra|inline|it|rv|medium|borderWidth|userAgent|522|navigator|with|concat|1px|10000|array|ig|PI|NaN|400|reverse|fast|600|slow|Function|Object|setAttribute|changed|be|can|property|fadeTo|fadeOut|getAttributeNode|fadeIn|slideToggle|method|slideUp|slideDown|action|cssText|stop|responseXML|option|content|300|th|protocol|td|location|send|cap|abort|colg|cos|tfoot|thead|With|leg|Requested|opt|GMT|1970|Jan|01|Thu|area|Since|hr|If|Type|Content|meta|specified|open|link|XMLHTTP|Microsoft|img|onload|row|borderLeftWidth|head|attributes'.split('|'),0,{})) \ No newline at end of file diff --git a/js/md5.js b/js/md5.js new file mode 100755 index 0000000..36fc1c2 --- /dev/null +++ b/js/md5.js @@ -0,0 +1,256 @@ +/* + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for more info. + */ + +/* + * Configurable variables. You may need to tweak these to be compatible with + * the server-side, but the defaults work in most cases. + */ +var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ +var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */ +var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */ + +/* + * These are the functions you'll usually want to call + * They take string arguments and return either hex or base-64 encoded strings + */ +function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));} +function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));} +function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));} +function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); } +function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); } +function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); } + +/* + * Perform a simple self-test to see if the VM is working + */ +function md5_vm_test() +{ + return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72"; +} + +/* + * Calculate the MD5 of an array of little-endian words, and a bit length + */ +function core_md5(x, len) +{ + /* append padding */ + x[len >> 5] |= 0x80 << ((len) % 32); + x[(((len + 64) >>> 9) << 4) + 14] = len; + + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + var d = 271733878; + + for(var i = 0; i < x.length; i += 16) + { + var olda = a; + var oldb = b; + var oldc = c; + var oldd = d; + + a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); + d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); + c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); + b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); + a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); + d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426); + c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); + b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); + a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416); + d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); + c = md5_ff(c, d, a, b, x[i+10], 17, -42063); + b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); + a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); + d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); + c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); + b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); + + a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); + d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); + c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); + b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); + a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); + d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083); + c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); + b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); + a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438); + d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); + c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); + b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); + a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); + d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); + c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); + b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); + + a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); + d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); + c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); + b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); + a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); + d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353); + c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); + b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); + a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174); + d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); + c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); + b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); + a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); + d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); + c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); + b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); + + a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); + d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); + c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); + b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); + a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); + d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); + c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); + b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); + a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359); + d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); + c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); + b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); + a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); + d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); + c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); + b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); + + a = safe_add(a, olda); + b = safe_add(b, oldb); + c = safe_add(c, oldc); + d = safe_add(d, oldd); + } + return Array(a, b, c, d); + +} + +/* + * These functions implement the four basic operations the algorithm uses. + */ +function md5_cmn(q, a, b, x, s, t) +{ + return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); +} +function md5_ff(a, b, c, d, x, s, t) +{ + return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); +} +function md5_gg(a, b, c, d, x, s, t) +{ + return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); +} +function md5_hh(a, b, c, d, x, s, t) +{ + return md5_cmn(b ^ c ^ d, a, b, x, s, t); +} +function md5_ii(a, b, c, d, x, s, t) +{ + return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); +} + +/* + * Calculate the HMAC-MD5, of a key and some data + */ +function core_hmac_md5(key, data) +{ + var bkey = str2binl(key); + if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz); + + var ipad = Array(16), opad = Array(16); + for(var i = 0; i < 16; i++) + { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5C5C5C5C; + } + + var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz); + return core_md5(opad.concat(hash), 512 + 128); +} + +/* + * Add integers, wrapping at 2^32. This uses 16-bit operations internally + * to work around bugs in some JS interpreters. + */ +function safe_add(x, y) +{ + var lsw = (x & 0xFFFF) + (y & 0xFFFF); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xFFFF); +} + +/* + * Bitwise rotate a 32-bit number to the left. + */ +function bit_rol(num, cnt) +{ + return (num << cnt) | (num >>> (32 - cnt)); +} + +/* + * Convert a string to an array of little-endian words + * If chrsz is ASCII, characters >255 have their hi-byte silently ignored. + */ +function str2binl(str) +{ + var bin = Array(); + var mask = (1 << chrsz) - 1; + for(var i = 0; i < str.length * chrsz; i += chrsz) + bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32); + return bin; +} + +/* + * Convert an array of little-endian words to a string + */ +function binl2str(bin) +{ + var str = ""; + var mask = (1 << chrsz) - 1; + for(var i = 0; i < bin.length * 32; i += chrsz) + str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask); + return str; +} + +/* + * Convert an array of little-endian words to a hex string. + */ +function binl2hex(binarray) +{ + var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; + var str = ""; + for(var i = 0; i < binarray.length * 4; i++) + { + str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) + + hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF); + } + return str; +} + +/* + * Convert an array of little-endian words to a base-64 string + */ +function binl2b64(binarray) +{ + var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + var str = ""; + for(var i = 0; i < binarray.length * 4; i += 3) + { + var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16) + | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 ) + | ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF); + for(var j = 0; j < 4; j++) + { + if(i * 8 + j * 6 > binarray.length * 32) str += b64pad; + else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F); + } + } + return str; +} diff --git a/js/pageMinichat.js b/js/pageMinichat.js new file mode 100755 index 0000000..ce0bcf0 --- /dev/null +++ b/js/pageMinichat.js @@ -0,0 +1,588 @@ +// coding: utf-8 + +function PageMinichat(client, formateur, util) +{ + this.nom = "minichat" + + this.client = client + this.formateur = formateur + this.util = util + + this.regexMessageTagMatch = /\{.*?\}>/g + this.regexMessageTagReplace = /^(.*?\{.*?\}>)*/ + + this.messages = new Messages(this.client, this.formateur, this.util) +} + +PageMinichat.prototype.contenu = function() +{ + return '\ +
\ +
\ +

\ + \ + \ + \ + \ +

\ +
\ +
\ +
' +} + +PageMinichat.prototype.charger = function() +{ + thisPage = this + + jQuery("form input.pseudo").val(this.client.pseudo) + + this.messages.rafraichirMessages(true) + + this.util.setCaretToEnd(jQuery("form input.message")[0]) + + jQuery("#messages").hover( + function(){}, + function(event) + { + jQuery("#messages .message").removeClass("cache") + thisPage.messages.messageOver = null + } + ) + + // affichage des smiles + jQuery("#smiles").html(this.formateur.getSmilesHTML()).children().each( + function(i) + { + var opacityBase = jQuery(this).css("opacity") + jQuery(this).click( + function(event) + { + thisPage.util.replaceSelection(jQuery("form input.message")[0], thisPage.formateur.smiles[jQuery(this).attr("class")][0].source.replace(/\\/g, "")) + } + ) + .hover( + function() + { + jQuery(this).animate( + { + opacity: 1 + }, 200 + ) + }, + function() + { + jQuery(this).animate( + { + opacity: opacityBase + }, 200 + ) + } + ) + } + ) + + /// événements + jQuery("form button.return").click( + function() + { + // captcha anti bot + if (jQuery("form input.captcha").val() != "") return + + thisPage.messages.allerSurLaPage(1) + + thisPage.envoyerMessage( + jQuery("form input.pseudo").val(), + jQuery("form input.message").val() + ) + + jQuery("form input.message")[0].focus() + } + ) + // interdiction de submiter le formulaire + jQuery("form").submit(function(){return false}) + + jQuery("input.pseudo").click( + function() + { + var input = jQuery("input.pseudo")[0] + if (input.value == conf.pseudoDefaut) + input.value = "" + } + ) +} + +PageMinichat.prototype.decharger = function() +{ + if (this.attenteCourante != null) + this.attenteCourante.abort() +} + +PageMinichat.prototype.getXMLMessage = function(pseudo, message, repondA) +{ + var XMLDocument = this.util.creerDocumentXMLAction() + XMLDocument.documentElement.setAttribute("name", "message") + + var nodeCookie = XMLDocument.createElement("cookie") + nodeCookie.appendChild(XMLDocument.createTextNode(this.client.cookie)) + XMLDocument.documentElement.appendChild(nodeCookie) + + var nodePseudo = XMLDocument.createElement("pseudo") + nodePseudo.appendChild(XMLDocument.createTextNode(pseudo)) + XMLDocument.documentElement.appendChild(nodePseudo) + + var nodeContenu = XMLDocument.createElement("contenu") + nodeContenu.appendChild(XMLDocument.createTextNode(message)) + XMLDocument.documentElement.appendChild(nodeContenu) + + if (repondA.length > 0) + { + var nodeReponses = XMLDocument.createElement("reponses") + XMLDocument.documentElement.appendChild(nodeReponses) + for (var i = 0; i < repondA.length; i++) + { + var nodeReponse = XMLDocument.createElement("reponse") + nodeReponse.setAttribute("id", repondA[i]) + nodeReponses.appendChild(nodeReponse) + } + } + + return XMLDocument +} + +PageMinichat.prototype.envoyerMessage = function(pseudo, message) +{ + // (un pseudo vide est autorisé) + pseudo = this.formateur.filtrerInputPseudo(pseudo) + + // extraction des id des messages (en base 36 évidemment) auquels le user répond + var repondA = [] + var tags = message.match(this.regexMessageTagMatch) + if (tags != null) + { + for(var i = 0; i < tags.length; i++) + repondA.push(/\{(.*?)\}>/.exec(tags[i])[1]) + message = message.replace(this.regexMessageTagReplace, "") + + // met à jour la classe des messages auquel repond celui ci (c'est un peu de la triche) + for (var i = 0; i < repondA.length; i++) + { + jQuery("#messages div#" + repondA[i]).addClass("repondu") + for (var m = 0; m < this.messages.messages.length; m++) + this.messages.messages[m].clientARepondu = true + } + } + + message = message.trim() + if (message == "") + { + this.util.messageDialogue("Le message est vide") + return + } + + if (!this.client.identifie()) + if (!this.client.enregistrement()) + { + this.util.messageDialogue("login impossible") + return + } + + //this.util.log(this.util.xmlVersAction(this.getXMLmessage(pseudo, message, repondA)).action) + //alert(this.util.xmlVersAction(this.getXMLMessage(pseudo, message, repondA)).action) + jQuery.post("request", this.util.xmlVersAction(this.getXMLMessage(pseudo, message, repondA)), + function(data, textStatus) + { + // TODO : traiter les erreurs + //alert(data) + jQuery("form input.message").val("") + } + ) +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +function Reponse(id, pseudo, login) +{ + this.id = id + this.pseudo = pseudo + this.login = login + + if (this.pseudo == undefined) + this.pseudo = "" + + if (this.login == undefined) + this.login = "" +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * Représente un message. + * @param id (string) + * @param date (string) + * @param pseudo + * @param contenu + */ +function Message(id, date, pseudo, contenu) +{ + this.id = id + this.date = date + this.pseudo = pseudo + this.contenu = contenu + + this.appartientAuClient = false + this.clientARepondu = false + this.estUneReponse = false + + this.systeme = false // est-ce un message 'système' ? + + this.repondA = {} // un ensemble de reponse (voir Reponse) indexé par l'id du message de la reponses +} + +/** + * + */ +Message.prototype.setRepondA = function(element) +{ + this.repondA = {} + + var thisMessage = this + + jQuery("id", element).each ( + function() + { + var reponse = new Reponse(jQuery(this).attr("id"), jQuery(this).attr("pseudo"), jQuery(this).attr("login")) + thisMessage.repondA[reponse.id] = reponse + } + ) +} + +/** + * @return les id des messages qui ont été mis en evidence sous la forme d'un objet + */ +Message.prototype.afficherConversation = function(messages) +{ + // les messages faisant partie de la conversation + var messagesEnEvidence = {} + + messagesEnEvidence[this.id] = true + + // recherche les réponses (O(n)) + for (var i = 0; i < messages.messages.length; i++) + if (messages.messages[i].repondA.hasOwnProperty(this.id)) + messagesEnEvidence[messages.messages[i].id] = true + + var f = function(tabIds) + { + for(var id in tabIds) + { + var message = messages.messagesParId[id] + if (message != undefined) + { + messagesEnEvidence[id] = true + f (message.repondA) + } + } + } + f(this.repondA) + + return messagesEnEvidence +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * Représente l'ensemble des messages affichés. + */ +function Messages(client, formateur, util) +{ + this.client = client + this.formateur = formateur + this.util = util + + this.nbMessageMax = conf.nbMessageAffiche // Le nombre de message affiché par page + this.idDernierMesssage = null // l'id du dernier message connu + this.page = 1 // par défaut on se trouve sur la première page + + this.messages = new Array() + this.messagesParId = new Object() + + // l'objet XMLHttpRequest représentant la connexion d'attente + this.attenteCourante = null + + var messageOver = null // element +} + +/** + * Crée un document XML contenant le message demandant un rafraichissement. + */ +Messages.prototype.getXMLrafraichirMessages = function() +{ + var XMLDocument = this.util.creerDocumentXMLAction() + XMLDocument.documentElement.setAttribute("name", "refreshMessages") + + //alert(this.util.serializer.serializeToString(XMLDocument)) + + if (this.client.identifie()) + { + var nodeCookie= XMLDocument.createElement("cookie") + nodeCookie.appendChild(XMLDocument.createTextNode(this.client.cookie)) + XMLDocument.documentElement.appendChild(nodeCookie) + } + + if (this.idDernierMesssage != null) + { + var nodeDernierMessageId = XMLDocument.createElement("dernierMessageId") + nodeDernierMessageId.appendChild(XMLDocument.createTextNode(this.idDernierMesssage)) + XMLDocument.documentElement.appendChild(nodeDernierMessageId) + } + + var nodeNombreMessage = XMLDocument.createElement("nombreMessage") + nodeNombreMessage.appendChild(XMLDocument.createTextNode(this.nbMessageMax)) + XMLDocument.documentElement.appendChild(nodeNombreMessage) + + var nodePage = XMLDocument.createElement("page") + nodePage.appendChild(XMLDocument.createTextNode(this.page)) + XMLDocument.documentElement.appendChild(nodePage) + + return XMLDocument; +} + +/** + * Création d'un nouveau message. + * Les message sont données dans l'ordre de leur id. + * Met directement à jour l'affichage. + * @param element un element xml représentant le message + * @param autoFlush si oui alors le message est directement ajouté à la vue + */ +Messages.prototype.ajouterMessage = function(element, autoFlush) +{ + if (autoFlush == undefined) autoFlush = true // valeur par défaut + + // pas d'utilisation de jquery pour des raisons de performance + this.idDernierMesssage = element.getAttribute("id") + + var message = new Message( + this.idDernierMesssage, + jQuery("date", element).text(), + jQuery("pseudo", element).text(), + jQuery("contenu", element).text() + ) + + message.appartientAuClient = jQuery("proprietaire", element).text() == "true" + message.clientARepondu = jQuery("repondu", element).text() == "true" + message.estUneReponse = jQuery("reponse", element).text() == "true" + message.systeme = jQuery("systeme", element).text() == "true" + message.setRepondA(jQuery("repondA", element)) + + this.messages.push(message) + this.messagesParId[message.id] = message + if (this.messages.length > this.nbMessageMax) + delete this.messagesParId[this.messages.shift().id] + + if (autoFlush) + this.flush() +} + +Messages.prototype.flush = function() +{ + var thisMessages = this + + var idDernierMessageAffiche = jQuery("#messages div:first").attr("id") + if (idDernierMessageAffiche == undefined) idDernierMessageAffiche = "0" + + var XHTML = "" + for (var i = this.messages.length - 1; i >= 0; i--) + if (parseInt(this.messages[i].id, 36) > parseInt(idDernierMessageAffiche, 36)) + { + var message = this.messages[i] + var XHTMLrepondA = "" + for (var id in message.repondA) + XHTMLrepondA += this.formateur.traitementComplet(message.repondA[id].pseudo) + "> " + XHTMLrepondA = "
" + XHTMLrepondA + "
" + + XHTML += + "
" + + "[
" + message.date + "
]" + + "
" + this.formateur.traitementComplet(message.pseudo) + "
:" + + XHTMLrepondA + + "
" + (message.systeme ? this.formateur.remplacerBalisesHTML(message.contenu) : this.formateur.traitementComplet(message.contenu, message.pseudo))+ "
" + + "
" + } + jQuery("#messages").prepend(XHTML) + + if (myLightbox != null) + myLightbox.updateImageList() + + var nbMessagesAffiche = jQuery("#messages .message").size() + if (nbMessagesAffiche > this.nbMessageMax) + jQuery("#messages .message").slice(this.nbMessageMax, nbMessagesAffiche).empty(); + + jQuery("#messages .message").filter(function(){return parseInt(jQuery(this).attr("id"), 36) > parseInt(idDernierMessageAffiche, 36)}).each( + function() + { + jQuery(this).click( + function(event) + { + if (jQuery(event.target).is("a")) return + + var valCourant = jQuery("input.message").val() + if (valCourant == undefined) valCourant = "" + var tag = jQuery(".pseudo", this).text() + "{" + jQuery(this).attr("id") + "}" + ">" + if (valCourant.indexOf(tag, 0) == -1) + jQuery("input.message").val(tag + " " + valCourant) + thisMessages.util.setCaretToEnd(jQuery("form input.message")[0]) + } + ) + // Q : pourquoi pas un .hover ? + // R : simplement pour éviter que lorsqu'un message arrive cela n'affecte la conversation actuellement mise en évidence + .mousemove( + function(e) + { + if (this !== thisMessages.messageOver) + { + thisMessages.afficherConversation(this) + thisMessages.messageOver = this + } + } + ) + } + ) +} + +/** + * Etablit une liste des messages à mettre en evidence et des messages à cacher. + * Puis applique un plan diabolique. + * @param element un message de la liste des messages + */ +Messages.prototype.afficherConversation = function(element) +{ + // cherche le message selectionné + var id = jQuery(element).attr("id") + var message = this.messagesParId[id] + if (message == undefined) return + + mess = message.afficherConversation(this) + + // FIXME : cet appel est très lent + jQuery("#messages .message").each( + function() + { + var jq = jQuery(this) + if (!mess.hasOwnProperty(jq.attr("id"))) + jq.addClass("cache") + else + jq.removeClass("cache") + } + ) +} + +Messages.prototype.viderMessages = function() +{ + this.idDernierMesssage = null + this.messages = new Array() + jQuery("#messages").empty() +} + +/** + * Met à jour les messages de manière continue. + * (AJAX-Comet-style proof) + * @param vider vide tous les messages avant d'afficher les nouveaux + */ +Messages.prototype.rafraichirMessages = function(vider) +{ + if (this.attenteCourante != null) + this.attenteCourante.abort() + + if (vider == undefined) + vider = false + + if (vider) + { + this.idDernierMesssage = null + this.messages = new Array() + } + + var thisMessages = this // caisupair javacrypte + + //this.util.log(this.util.serializer.serializeToString(this.getXMLrafraichirMessages())) + this.attenteCourante = jQuery.ajax({ + type: "POST", + url: "request", + dataType: "xml", + data: this.util.xmlVersAction(this.getXMLrafraichirMessages()), + success: + function(data) + { + //thisMessages.util.log(thisMessages.util.serializer.serializeToString(data)) + + if (vider) + thisMessages.viderMessages() + + thisMessages.MAJPages(parseInt(jQuery("nbPage", data.documentElement).text())) + + reponse = jQuery("message", data.documentElement).each( + function(i) + { + thisMessages.ajouterMessage(this, false) + } + ) + thisMessages.flush() + setTimeout(function(){ thisMessages.rafraichirMessages() }, 100); + }, + error: + function(XMLHttpRequest, textStatus, errorThrown) + { + setTimeout(function(){ thisMessages.rafraichirMessages() }, 1000); + } + } + ) +} + +Messages.prototype.MAJPages = function(nbPage) +{ + //alert(nbPage) + + var thisMessages = this + + var nbPageActuel = jQuery("#pages span").size() + + for(var p = nbPageActuel + 1; p <= nbPage && p <= 3; p++) + { + jQuery("#pages").append("" + p + "").click( + function(event) + { + var target = jQuery(event.target) + + if(!target.is("span")) + return + + thisMessages.allerSurLaPage(parseInt(jQuery(event.target).text())) + } + ) + } +} + +Messages.prototype.allerSurLaPage = function(page) +{ + if (page == this.page) + return + this.page = page + + var thisMessages = this + + //jQuery("#pages span").removeClass("pageCourante") + jQuery("#pages span").each( + function(i) + { + if (jQuery(this).text() == thisMessages.page) + jQuery(this).addClass("pageCourante") + else + jQuery(this).removeClass("pageCourante") + } + ) + + this.rafraichirMessages(true) +} + diff --git a/js/pageProfile.js b/js/pageProfile.js new file mode 100755 index 0000000..7270c23 --- /dev/null +++ b/js/pageProfile.js @@ -0,0 +1,118 @@ +// coding: utf-8 + +function PageProfile(client, formateur, util) +{ + this.nom = "profile" + + this.client = client + this.formateur = formateur + this.util = util +} + +PageProfile.prototype.contenu = function() +{ + return "" +} + +PageProfile.prototype.charger = function() +{ + jQuery("#page").html(this.getHTML()) + + // en fonction du statut + if (this.client.identifie()) + this.chargerProfile() + else + this.chargerLogin() + + jQuery("#page form#profile").submit(function(){return false}) +} + +PageProfile.prototype.chargerProfile = function() +{ + var thisPage = this + + jQuery("form#profile input.login").val(this.client.login) + jQuery("form#profile input.pseudo").val(this.client.pseudo) + jQuery("form#profile input.email").val(this.client.email) + + jQuery("#page form#profile button").click( + function() + { + thisPage.client.pseudo = thisPage.formateur.filtrerInputPseudo(jQuery("form#profile input.pseudo").val()) + thisPage.client.email = jQuery("form#profile input.email").val() + + var password = jQuery("form#profile input.password").val() + var passwordRe = jQuery("form#profile input.passwordRe").val() + if (password != "" || passwordRe != "") + { + if (password != passwordRe) + { + thisPage.util.messageDialogue("Les mots de passes ne correspondent pas") + return + } + thisPage.client.password = thisPage.util.md5(password) + } + + if(!thisPage.client.flush()) + thisPage.util.messageDialogue("Impossible de mettre à jour votre profile, causes inconnues", messageType.erreur) + else + { + thisPage.util.messageDialogue("Votre profile a été mis à jour") + //thisPage.pages.afficherPage("minichat") + } + } + ) +} + +PageProfile.prototype.chargerLogin = function() +{ + var thisPage = this + + jQuery("#page form#profile button").click( + function() + { + if(!thisPage.client.connexionLogin(jQuery("form#profile input.login").val(), thisPage.util.md5(jQuery("form#profile input.password").val()))) + thisPage.util.messageDialogue("Couple login/pass introuvable") + else + { + // TODO afficher un message "ok" + thisPage.pages.afficherPage("minichat") + } + } + ) +} + +PageProfile.prototype.getHTML = function() +{ +return '\ +
\ + \ + \ + \ + \ + \ + \ + \ + \ + ' + + (this.client.identifie() ? '\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + ' : '') + '\ + \ + \ + \ +
login
password
password re
pseudo
e-mail
\ +
\ +
' +} \ No newline at end of file diff --git a/js/pageRegister.js b/js/pageRegister.js new file mode 100755 index 0000000..30d1790 --- /dev/null +++ b/js/pageRegister.js @@ -0,0 +1,70 @@ +// coding: utf-8 + +function PageRegister(client, formateur, util) +{ + this.nom = "register" + + this.client = client + this.formateur = formateur + this.util = util +} + +PageRegister.prototype.contenu = function() +{ + return '\ +
\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
login\
password
password re
\ +
\ +' +} + +PageRegister.prototype.charger = function() +{ + jQuery("#page form#register").submit(function(){return false}) + + var thisPage = this + + jQuery("#page form#register button").click( + function() + { + if (jQuery("#page form#register input.captcha").val() != "") return + + var login = jQuery("#page form#register input.login").val().trim() + var password = jQuery("#page form#register input.password").val() + var passwordRe = jQuery("#page form#register input.passwordRe").val() + + if (login == "") + thisPage.util.messageDialogue("Le login ne doit pas être vide") + else if (password == "" && passwordRe == "") + thisPage.util.messageDialogue("Un mot de passe est obligatoire") + else if (password != passwordRe) + thisPage.util.messageDialogue("Les mots de passes ne correspondent pas") + else if(!thisPage.client.enregistrement(login, thisPage.util.md5(password))) + { + thisPage.util.messageDialogue(thisPage.client.dernierMessageErreur, messageType.erreur) + } + else + { + // TODO : avertir que l'enregistrement s'est bien déroulé + thisPage.client.majMenu() + thisPage.pages.afficherPage("minichat") + } + } + ) +} \ No newline at end of file diff --git a/lightbox/css/lightbox.css b/lightbox/css/lightbox.css new file mode 100755 index 0000000..9eb74be --- /dev/null +++ b/lightbox/css/lightbox.css @@ -0,0 +1,79 @@ +#lightbox{ + position: absolute; + left: 0; + width: 100%; + z-index: 100; + text-align: center; + line-height: 0; + } + +#lightbox a img{ border: none; } + +#outerImageContainer{ + position: relative; + background-color: #fff; + width: 250px; + height: 250px; + margin: 0 auto; + } + +#imageContainer{ + padding: 10px; + } + +#loading{ + position: absolute; + top: 40%; + left: 0%; + height: 25%; + width: 100%; + text-align: center; + line-height: 0; + } +#hoverNav{ + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + z-index: 10; + } +#imageContainer>#hoverNav{ left: 0;} +#hoverNav a{ outline: none;} + +#prevLink, #nextLink{ + width: 49%; + height: 100%; + background: transparent url(../images/blank.gif) no-repeat; /* Trick IE into showing hover */ + display: block; + } +#prevLink { left: 0; float: left;} +#nextLink { right: 0; float: right;} +#prevLink:hover, #prevLink:visited:hover { background: url(../images/prevlabel.gif) left 15% no-repeat; } +#nextLink:hover, #nextLink:visited:hover { background: url(../images/nextlabel.gif) right 15% no-repeat; } + + +#imageDataContainer{ + font: 10px Verdana, Helvetica, sans-serif; + background-color: #fff; + margin: 0 auto; + line-height: 1.4em; + overflow: auto; + width: 100% + } + +#imageData{ padding:0 10px; color: #666; } +#imageData #imageDetails{ width: 70%; float: left; text-align: left; } +#imageData #caption{ font-weight: bold; } +#imageData #numberDisplay{ display: block; clear: left; padding-bottom: 1.0em; } +#imageData #bottomNavClose{ width: 66px; float: right; padding-bottom: 0.7em; } + +#overlay{ + position: absolute; + top: 0; + left: 0; + z-index: 90; + width: 100%; + height: 500px; + background-color: #000; + } \ No newline at end of file diff --git a/lightbox/images/blank.gif b/lightbox/images/blank.gif new file mode 100755 index 0000000000000000000000000000000000000000..1d11fa9ada9e93505b3d736acb204083f45d5fbf GIT binary patch literal 43 scmZ?wbhEHbWMp7uX!y@?;J^U}1_s5SEQ~;kK?g*DWEhy3To@Uw0n;G|I{*Lx literal 0 HcmV?d00001 diff --git a/lightbox/images/close.gif b/lightbox/images/close.gif new file mode 100755 index 0000000000000000000000000000000000000000..ca517b6ab36816a651016d4c14b84475a2ff296b GIT binary patch literal 222 zcmZ?wbhEHblwy!#*v!dLU0r?R#ECg`=6w0`WyXvdd-v{5O-;Rb?_N|?)c^ng88Cq2 zPZmZ722KVYkPOHS29|CE&&p+cCFFxY^Ug_A@OZAuD(NTfIVisb5Vz8{T8r- z^6NM+vy6$kz^*ngxS~q0wWK{St4pU>yxxhiq+g|bq8*z^|ExAQ9kT_KVE z)6+9$%9N0hkg%|@J9q8`1qGcvc``6CFd`x%G&JWG1!QZ}p`}_Crt5>gn{ra_R z*|PBP@I{Lj`S|$w`}?P*rG5YY{qEhnXU?2SNJyxzu3ors;h#T$K79Ca@7}$foSdy& zxBmY9d+OAwXV0EJb?Q__MaApauf4s!A3S&vA0NMS=g#~0?{C?%rLC>4pr9Z*Ir-_+ zr;{d4>gecLxpHM*Uf%TS)ARH5uU@^{*Vp&5E2E;KQc_ZUeSM3Ii__E7r%jvI-roNB@nb(fzs$_c+qZ95RaO1} z|Nq~=e++a1ia%Mv_UM2}P@FKZ|8IzCYHn$5Ywzgn>h9_7>+gx3Gn5iiIZY<+?`^k#V9jLtyr*r!J=422f09{b+Ju)CUT+TQ$(XUHpFrqp3WW>wX1uv zuMxADYt*_`D!j~cc9U4RqaSdy#4<#mnaaTWAexn73fF5^{TRmAubUT3M$0pEhL|XZa-W~L|(gBwDDiyC{R^)5V?SdhX{^V3U3;)26b z9`PG&9vg+2LK~Ub)t*kN@Dpm%WzyoDVKHUWf+~JK$+ZDZ@~kR1)Kp$5Zt9+<`%Y)- z>yw)=g|fzKY2BzS@eXpHy5ookQ(^-%AM<|&o|T%JuT^(X?uuf%wX|uMuC&0ET*U<& zn5MV|N-Q);aBAjTtM<^<-0=N0@0#5*3?I(E@i^2b=>KSu3P#TbT%XyyED9)8M!}zkkRC?kPTh mHXNSne@Ka2Tq>lLlg+!}=2PuWCXYMo(tpiJ>u+RWum%8KFq1q0 literal 0 HcmV?d00001 diff --git a/lightbox/images/loading.gif b/lightbox/images/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..f864d5fd38b7466c76b5a36dc0e3e9455c0126e2 GIT binary patch literal 2767 zcmeH``%_bA0*1eHPVNawNVtR;Fkp-nQj8edfS`v<5L7TgR6wi;WfgH-0}4fE+c_uU zB6tf6auF}FAcDdgg|bMU&H)LR5jARM!8$tuwd$nHqS?K-=JNZ+yGvz=Iegxp{+qWGZ9j{-%9vvN>n3$NJp6==CAqYaF(LfM1Z{EEA{{Gt9 z+Ba|B7z_sR+xabl|E~mm-*OXmhLq??y)HONjX>1ze1D?RIn=G1`RR-%fb}zgSh6^a z(}Zw20U1L^Cs9UcyJfc+al#}J2xVlYUoR{`gd&QDxAb1w4>I~5gc?ccq(G+T!I;H};U_uyHR0@hr>Qk1P1=6fvUBhR zb|&^^cEQtu&W}=-=YR7o5UI)AD*~%J7bkVd5`xrdw{bHm;|Bf^_|FG$9l}`ruhnVF zO%=6X*I#yro*pmfB;-A0cVjz73Qy)`oa=df_3Bx6!M3TNALf9BwI*di`jhdovR(I= zFT31zui1Xw??+Ym-lWNq=V6~8tt012$@*hy3So0QNJ#eIJ4Yh{qJ+aTY>ng8W1p4BrwB_>i7AY-xmGrA}hAeq`aX(yx~=c&|=$w&*&PpKd;G@@0oXK@D0x=;tyY&Eb|HKPsM z71v`PO)na3pfO*xUD8Z|CQju)c+RSAH=5V^4vb9Q2JwHwt|-INt|!nD?AlRxF5ZT8 zaA9~hGb$~rMhQh_0+31$tkzyLi>X3c7>F!|Jyn`+5{LG=E`sIQbHA8!=`uday6D6Y zNtVL?j^`6A%UuwO!`}j#s~H?w=P<5}Z2)*PPx|5q$MM+1K6_d_cie9JVArbrB2sRy zOl**1Mc+|zLM>munG#O|##RApuODr^1+pL-?SHX+D6Dz_@%-Oo(fM&hHYZ-jWU5jf z&nBYG;>F6&Y`veoLdZ@0WyrDsuXOP)9g*C`A(+R`Ryc2+9w_DJNaf@Dzg?~N{uI_} zjV(!yygvrGv#KF*Mt{6H^v1Ve=hQyF2^E~bd#&iZg;(%dS^nM;oGSF1Y^&rY}Ian zFrp%SBGPyN{Z?t%Mo#!qgLQ2)k{>KAv?=zezKN*qPRf>^4QjcWgyxiC}7Vb6vGrBLR(1J&B%*gb{`!Jljb^2%jB$ zFBNUHANC6Q?0~M}cVtgk_;_DAB-BE?2dP z(C9OIXza3Ao-@UyqX%`5cjg#cHl!uHq;&?~JO{eE+A2KSSD)s8v&CiV$kV$A=DG@i z;6JY7z*8oPdj@bbJQoTAENW#ls(ucbGA#yhN>zbWqBTbLl>rGqOAY+` z=psSt8VQE=9+X8^$l@oeDzRvja79ry3nvLcOR7+)bIFyJVoz4}URM-47_u>V zY*^e(o`?|l++*Y0uQ#&dKapW1o?J{jx+*_gKV^cW+W87KI7hZ5viXv$$=1IR^Z~yA XWBrHU7iSEP8X8hQyAJO{V6g1pwSv80 literal 0 HcmV?d00001 diff --git a/lightbox/images/next.gif b/lightbox/images/next.gif new file mode 100755 index 0000000000000000000000000000000000000000..1fe6ca1ed04d715412072b417070b58edc5e24cb GIT binary patch literal 305 zcmZ?wbhEHb)Me0RI3mFC<;$0i8#g8;CB1z4^3tVCEiEm%xw&`m-d(zM>8x3^_Uzfy z-`{`y`0>ih%JA^;|6ssC3Q+vX!pOiNz@P)t1hSKXb)5o>ZA#|6j8)4XzuH%zbG{_^ ze#N@?HShl)xWpjPqbSpNWWf$5g^5iJ#;z51ye%s;6Sk^#+;U&|yQhtj`_twE4q>S* z6($>Ajz?_AECtI&rbV$QXQd@_u@!PB@-r|NMs_n7#0DiY*Q87>El*)8ab)Renc&FW zoK@`FTbtv+1^-4^K=?3=9lhv0}y5t5@&ezkl%H!9Rcg{P^)>;>3wtwrq)w zjlFm8UUPGERaI4EW8C&ZHSy^-E z&h_{AU$<`EzJ2?8dU||)ecRgFo;-Q-@ZrPj*RQWxv*z{d*M|=uc5-rxh={1Gt1B)p zuB@z_J$v@!$B%Pza=v`|^8f#TV`F26Q9$<)Q2fcl$iUFdpaZfQlqVQC{xh)i3b|}p zaIl#}SS#j)z{3M=0?J-X){18#t4FnV&ADwPmY8kM^qRBa+Ss;jowc>(u6Q{856unO7XG0CH04+qke}t=kX<#j~4ncHM_B}aGWghWz=*1$MI;5Ihzn` zR>+M+2LUH}Nrf;O8HEK5*-SzOS8gh?H%&OlI4R-5V@A)8?M)0{K5SZi?8BqustgAU z4W70%>8X6NvjF;niDfctr^2SjR(=JxPU-N@Kg|kk4K@aj0`s0W2=G_6C~$~~mQ0YZ z_~ZFtzJjxXVl#JDU_&dLOqZiOr_+IkwphCb3~r9UHhw$ABFy#3ot1^n;2X_^es8mM&dd zSy{Pf&z}DN{_ybd|6ssC3Q+vX!pOiNz@P)t1hSKXb;ASYzLd;)FE|}DU++`mK3|f1 zzhd3{n)m+?D6Cbe;bdSuzG#LMk4yl2Q>2x|qCkeymLqPG(T6T`^K#5+VzJz%Ah!E8 z!;Xj@>twq&2Q1iO&6DTkSI!*l!%)u1Q026EfN*V=QJuUx%$ P{l?8({6^Qb6&b7n50-It literal 0 HcmV?d00001 diff --git a/lightbox/images/prevlabel.gif b/lightbox/images/prevlabel.gif new file mode 100755 index 0000000000000000000000000000000000000000..51a31c2fd7829eb95c071b4ba1d82863a723f5a8 GIT binary patch literal 1264 zcmZ?wbhEHbv}aIY_}3Q5cJJQ3V8Md>_wP41H#<2wd3$@u#>PfPMHLklWo2dU+qZAR zgb7ooOgVGr%#R;GmMmEk6cm)2ntJTmu_H&09-@kvaTeoii{{4A*d5MXMnVFeau3YKs>)X0@>)yS47cE-! z>eZ{cbLZ~dxid60bk?j{%a$$s`0?ZS@84IgT6N*Vg`S?C6DLlrSg~UD>eWd}No{Ry zo}Qi&5fPg=Z+`gjp`)W?VPWC<^XE^WK3!Z~{Qmv>@bK_=@813Y|KHfym|+yqI0O`b zvM@3*bTa6G>;dHo29Ey>f}AoQ8x|aF<`C90nW1s}-j^R+5pxE3c=EPF>qF}*uMm`(1lNtsE&J(Pa1h33E zupm>2y`$?uz=8!nJvJRW5(X&`j&QP;UhrWsn9#tfti6bfKxUoPGg6n0iPgWs91pJ3q@95mJWd!P8X9U z4IGv>3L7RK^KC-j=Pf$n^uHy(fAlT3m7{nlD5pc^P zhe1JD$<{{U2pfaIf~C{scvRR~7OYfx=4vj$aA0P}Jjus1__rn;W+*sj$-t4g;b#CN d0) window.scrollBy(0,0); +} + +Element.getOpacity = function(element){ + var opacity; + if (opacity = Element.getStyle(element, 'opacity')) + return parseFloat(opacity); + if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/)) + if(opacity[1]) return parseFloat(opacity[1]) / 100; + return 1.0; +} + +Element.setOpacity = function(element, value){ + element= $(element); + if (value == 1){ + Element.setStyle(element, { opacity: + (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? + 0.999999 : null }); + if(/MSIE/.test(navigator.userAgent)) + Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')}); + } else { + if(value < 0.00001) value = 0; + Element.setStyle(element, {opacity: value}); + if(/MSIE/.test(navigator.userAgent)) + Element.setStyle(element, + { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') + + 'alpha(opacity='+value*100+')' }); + } +} + +Element.getInlineOpacity = function(element){ + return $(element).style.opacity || ''; +} + +Element.childrenWithClassName = function(element, className) { + return $A($(element).getElementsByTagName('*')).select( + function(c) { return Element.hasClassName(c, className) }); +} + +Array.prototype.call = function() { + var args = arguments; + this.each(function(f){ f.apply(this, args) }); +} + +/*--------------------------------------------------------------------------*/ + +var Effect = { + tagifyText: function(element) { + var tagifyStyle = 'position:relative'; + if(/MSIE/.test(navigator.userAgent)) tagifyStyle += ';zoom:1'; + element = $(element); + $A(element.childNodes).each( function(child) { + if(child.nodeType==3) { + child.nodeValue.toArray().each( function(character) { + element.insertBefore( + Builder.node('span',{style: tagifyStyle}, + character == ' ' ? String.fromCharCode(160) : character), + child); + }); + Element.remove(child); + } + }); + }, + multiple: function(element, effect) { + var elements; + if(((typeof element == 'object') || + (typeof element == 'function')) && + (element.length)) + elements = element; + else + elements = $(element).childNodes; + + var options = Object.extend({ + speed: 0.1, + delay: 0.0 + }, arguments[2] || {}); + var masterDelay = options.delay; + + $A(elements).each( function(element, index) { + new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay })); + }); + }, + PAIRS: { + 'slide': ['SlideDown','SlideUp'], + 'blind': ['BlindDown','BlindUp'], + 'appear': ['Appear','Fade'] + }, + toggle: function(element, effect) { + element = $(element); + effect = (effect || 'appear').toLowerCase(); + var options = Object.extend({ + queue: { position:'end', scope:(element.id || 'global') } + }, arguments[2] || {}); + Effect[Element.visible(element) ? + Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); + } +}; + +var Effect2 = Effect; // deprecated + +/* ------------- transitions ------------- */ + +Effect.Transitions = {} + +Effect.Transitions.linear = function(pos) { + return pos; +} +Effect.Transitions.sinoidal = function(pos) { + return (-Math.cos(pos*Math.PI)/2) + 0.5; +} +Effect.Transitions.reverse = function(pos) { + return 1-pos; +} +Effect.Transitions.flicker = function(pos) { + return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4; +} +Effect.Transitions.wobble = function(pos) { + return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; +} +Effect.Transitions.pulse = function(pos) { + return (Math.floor(pos*10) % 2 == 0 ? + (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10))); +} +Effect.Transitions.none = function(pos) { + return 0; +} +Effect.Transitions.full = function(pos) { + return 1; +} + +/* ------------- core effects ------------- */ + +Effect.ScopedQueue = Class.create(); +Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), { + initialize: function() { + this.effects = []; + this.interval = null; + }, + _each: function(iterator) { + this.effects._each(iterator); + }, + add: function(effect) { + var timestamp = new Date().getTime(); + + var position = (typeof effect.options.queue == 'string') ? + effect.options.queue : effect.options.queue.position; + + switch(position) { + case 'front': + // move unstarted effects after this effect + this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { + e.startOn += effect.finishOn; + e.finishOn += effect.finishOn; + }); + break; + case 'end': + // start effect after last queued effect has finished + timestamp = this.effects.pluck('finishOn').max() || timestamp; + break; + } + + effect.startOn += timestamp; + effect.finishOn += timestamp; + this.effects.push(effect); + if(!this.interval) + this.interval = setInterval(this.loop.bind(this), 40); + }, + remove: function(effect) { + this.effects = this.effects.reject(function(e) { return e==effect }); + if(this.effects.length == 0) { + clearInterval(this.interval); + this.interval = null; + } + }, + loop: function() { + var timePos = new Date().getTime(); + this.effects.invoke('loop', timePos); + } +}); + +Effect.Queues = { + instances: $H(), + get: function(queueName) { + if(typeof queueName != 'string') return queueName; + + if(!this.instances[queueName]) + this.instances[queueName] = new Effect.ScopedQueue(); + + return this.instances[queueName]; + } +} +Effect.Queue = Effect.Queues.get('global'); + +Effect.DefaultOptions = { + transition: Effect.Transitions.sinoidal, + duration: 1.0, // seconds + fps: 25.0, // max. 25fps due to Effect.Queue implementation + sync: false, // true for combining + from: 0.0, + to: 1.0, + delay: 0.0, + queue: 'parallel' +} + +Effect.Base = function() {}; +Effect.Base.prototype = { + position: null, + start: function(options) { + this.options = Object.extend(Object.extend({},Effect.DefaultOptions), options || {}); + this.currentFrame = 0; + this.state = 'idle'; + this.startOn = this.options.delay*1000; + this.finishOn = this.startOn + (this.options.duration*1000); + this.event('beforeStart'); + if(!this.options.sync) + Effect.Queues.get(typeof this.options.queue == 'string' ? + 'global' : this.options.queue.scope).add(this); + }, + loop: function(timePos) { + if(timePos >= this.startOn) { + if(timePos >= this.finishOn) { + this.render(1.0); + this.cancel(); + this.event('beforeFinish'); + if(this.finish) this.finish(); + this.event('afterFinish'); + return; + } + var pos = (timePos - this.startOn) / (this.finishOn - this.startOn); + var frame = Math.round(pos * this.options.fps * this.options.duration); + if(frame > this.currentFrame) { + this.render(pos); + this.currentFrame = frame; + } + } + }, + render: function(pos) { + if(this.state == 'idle') { + this.state = 'running'; + this.event('beforeSetup'); + if(this.setup) this.setup(); + this.event('afterSetup'); + } + if(this.state == 'running') { + if(this.options.transition) pos = this.options.transition(pos); + pos *= (this.options.to-this.options.from); + pos += this.options.from; + this.position = pos; + this.event('beforeUpdate'); + if(this.update) this.update(pos); + this.event('afterUpdate'); + } + }, + cancel: function() { + if(!this.options.sync) + Effect.Queues.get(typeof this.options.queue == 'string' ? + 'global' : this.options.queue.scope).remove(this); + this.state = 'finished'; + }, + event: function(eventName) { + if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this); + if(this.options[eventName]) this.options[eventName](this); + }, + inspect: function() { + return '#'; + } +} + +Effect.Parallel = Class.create(); +Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), { + initialize: function(effects) { + this.effects = effects || []; + this.start(arguments[1]); + }, + update: function(position) { + this.effects.invoke('render', position); + }, + finish: function(position) { + this.effects.each( function(effect) { + effect.render(1.0); + effect.cancel(); + effect.event('beforeFinish'); + if(effect.finish) effect.finish(position); + effect.event('afterFinish'); + }); + } +}); + +Effect.Opacity = Class.create(); +Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), { + initialize: function(element) { + this.element = $(element); + // make this work on IE on elements without 'layout' + if(/MSIE/.test(navigator.userAgent) && (!this.element.hasLayout)) + Element.setStyle(this.element, {zoom: 1}); + var options = Object.extend({ + from: Element.getOpacity(this.element) || 0.0, + to: 1.0 + }, arguments[1] || {}); + this.start(options); + }, + update: function(position) { + Element.setOpacity(this.element, position); + } +}); + +Effect.Move = Class.create(); +Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), { + initialize: function(element) { + this.element = $(element); + var options = Object.extend({ + x: 0, + y: 0, + mode: 'relative' + }, arguments[1] || {}); + this.start(options); + }, + setup: function() { + // Bug in Opera: Opera returns the "real" position of a static element or + // relative element that does not have top/left explicitly set. + // ==> Always set top and left for position relative elements in your stylesheets + // (to 0 if you do not need them) + Element.makePositioned(this.element); + this.originalLeft = parseFloat(Element.getStyle(this.element,'left') || '0'); + this.originalTop = parseFloat(Element.getStyle(this.element,'top') || '0'); + if(this.options.mode == 'absolute') { + // absolute movement, so we need to calc deltaX and deltaY + this.options.x = this.options.x - this.originalLeft; + this.options.y = this.options.y - this.originalTop; + } + }, + update: function(position) { + Element.setStyle(this.element, { + left: this.options.x * position + this.originalLeft + 'px', + top: this.options.y * position + this.originalTop + 'px' + }); + } +}); + +// for backwards compatibility +Effect.MoveBy = function(element, toTop, toLeft) { + return new Effect.Move(element, + Object.extend({ x: toLeft, y: toTop }, arguments[3] || {})); +}; + +Effect.Scale = Class.create(); +Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), { + initialize: function(element, percent) { + this.element = $(element) + var options = Object.extend({ + scaleX: true, + scaleY: true, + scaleContent: true, + scaleFromCenter: false, + scaleMode: 'box', // 'box' or 'contents' or {} with provided values + scaleFrom: 100.0, + scaleTo: percent + }, arguments[2] || {}); + this.start(options); + }, + setup: function() { + this.restoreAfterFinish = this.options.restoreAfterFinish || false; + this.elementPositioning = Element.getStyle(this.element,'position'); + + this.originalStyle = {}; + ['top','left','width','height','fontSize'].each( function(k) { + this.originalStyle[k] = this.element.style[k]; + }.bind(this)); + + this.originalTop = this.element.offsetTop; + this.originalLeft = this.element.offsetLeft; + + var fontSize = Element.getStyle(this.element,'font-size') || '100%'; + ['em','px','%'].each( function(fontSizeType) { + if(fontSize.indexOf(fontSizeType)>0) { + this.fontSize = parseFloat(fontSize); + this.fontSizeType = fontSizeType; + } + }.bind(this)); + + this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; + + this.dims = null; + if(this.options.scaleMode=='box') + this.dims = [this.element.offsetHeight, this.element.offsetWidth]; + if(/^content/.test(this.options.scaleMode)) + this.dims = [this.element.scrollHeight, this.element.scrollWidth]; + if(!this.dims) + this.dims = [this.options.scaleMode.originalHeight, + this.options.scaleMode.originalWidth]; + }, + update: function(position) { + var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); + if(this.options.scaleContent && this.fontSize) + Element.setStyle(this.element, {fontSize: this.fontSize * currentScale + this.fontSizeType }); + this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); + }, + finish: function(position) { + if (this.restoreAfterFinish) Element.setStyle(this.element, this.originalStyle); + }, + setDimensions: function(height, width) { + var d = {}; + if(this.options.scaleX) d.width = width + 'px'; + if(this.options.scaleY) d.height = height + 'px'; + if(this.options.scaleFromCenter) { + var topd = (height - this.dims[0])/2; + var leftd = (width - this.dims[1])/2; + if(this.elementPositioning == 'absolute') { + if(this.options.scaleY) d.top = this.originalTop-topd + 'px'; + if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px'; + } else { + if(this.options.scaleY) d.top = -topd + 'px'; + if(this.options.scaleX) d.left = -leftd + 'px'; + } + } + Element.setStyle(this.element, d); + } +}); + +Effect.Highlight = Class.create(); +Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), { + initialize: function(element) { + this.element = $(element); + var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {}); + this.start(options); + }, + setup: function() { + // Prevent executing on elements not in the layout flow + if(Element.getStyle(this.element, 'display')=='none') { this.cancel(); return; } + // Disable background image during the effect + this.oldStyle = { + backgroundImage: Element.getStyle(this.element, 'background-image') }; + Element.setStyle(this.element, {backgroundImage: 'none'}); + if(!this.options.endcolor) + this.options.endcolor = Element.getStyle(this.element, 'background-color').parseColor('#ffffff'); + if(!this.options.restorecolor) + this.options.restorecolor = Element.getStyle(this.element, 'background-color'); + // init color calculations + this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); + this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this)); + }, + update: function(position) { + Element.setStyle(this.element,{backgroundColor: $R(0,2).inject('#',function(m,v,i){ + return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) }); + }, + finish: function() { + Element.setStyle(this.element, Object.extend(this.oldStyle, { + backgroundColor: this.options.restorecolor + })); + } +}); + +Effect.ScrollTo = Class.create(); +Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), { + initialize: function(element) { + this.element = $(element); + this.start(arguments[1] || {}); + }, + setup: function() { + Position.prepare(); + var offsets = Position.cumulativeOffset(this.element); + if(this.options.offset) offsets[1] += this.options.offset; + var max = window.innerHeight ? + window.height - window.innerHeight : + document.body.scrollHeight - + (document.documentElement.clientHeight ? + document.documentElement.clientHeight : document.body.clientHeight); + this.scrollStart = Position.deltaY; + this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart; + }, + update: function(position) { + Position.prepare(); + window.scrollTo(Position.deltaX, + this.scrollStart + (position*this.delta)); + } +}); + +/* ------------- combination effects ------------- */ + +Effect.Fade = function(element) { + var oldOpacity = Element.getInlineOpacity(element); + var options = Object.extend({ + from: Element.getOpacity(element) || 1.0, + to: 0.0, + afterFinishInternal: function(effect) { with(Element) { + if(effect.options.to!=0) return; + hide(effect.element); + setStyle(effect.element, {opacity: oldOpacity}); }} + }, arguments[1] || {}); + return new Effect.Opacity(element,options); +} + +Effect.Appear = function(element) { + var options = Object.extend({ + from: (Element.getStyle(element, 'display') == 'none' ? 0.0 : Element.getOpacity(element) || 0.0), + to: 1.0, + beforeSetup: function(effect) { with(Element) { + setOpacity(effect.element, effect.options.from); + show(effect.element); }} + }, arguments[1] || {}); + return new Effect.Opacity(element,options); +} + +Effect.Puff = function(element) { + element = $(element); + var oldStyle = { opacity: Element.getInlineOpacity(element), position: Element.getStyle(element, 'position') }; + return new Effect.Parallel( + [ new Effect.Scale(element, 200, + { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), + new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], + Object.extend({ duration: 1.0, + beforeSetupInternal: function(effect) { with(Element) { + setStyle(effect.effects[0].element, {position: 'absolute'}); }}, + afterFinishInternal: function(effect) { with(Element) { + hide(effect.effects[0].element); + setStyle(effect.effects[0].element, oldStyle); }} + }, arguments[1] || {}) + ); +} + +Effect.BlindUp = function(element) { + element = $(element); + Element.makeClipping(element); + return new Effect.Scale(element, 0, + Object.extend({ scaleContent: false, + scaleX: false, + restoreAfterFinish: true, + afterFinishInternal: function(effect) { with(Element) { + [hide, undoClipping].call(effect.element); }} + }, arguments[1] || {}) + ); +} + +Effect.BlindDown = function(element) { + element = $(element); + var oldHeight = Element.getStyle(element, 'height'); + var elementDimensions = Element.getDimensions(element); + return new Effect.Scale(element, 100, + Object.extend({ scaleContent: false, + scaleX: false, + scaleFrom: 0, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { with(Element) { + makeClipping(effect.element); + setStyle(effect.element, {height: '0px'}); + show(effect.element); + }}, + afterFinishInternal: function(effect) { with(Element) { + undoClipping(effect.element); + setStyle(effect.element, {height: oldHeight}); + }} + }, arguments[1] || {}) + ); +} + +Effect.SwitchOff = function(element) { + element = $(element); + var oldOpacity = Element.getInlineOpacity(element); + return new Effect.Appear(element, { + duration: 0.4, + from: 0, + transition: Effect.Transitions.flicker, + afterFinishInternal: function(effect) { + new Effect.Scale(effect.element, 1, { + duration: 0.3, scaleFromCenter: true, + scaleX: false, scaleContent: false, restoreAfterFinish: true, + beforeSetup: function(effect) { with(Element) { + [makePositioned,makeClipping].call(effect.element); + }}, + afterFinishInternal: function(effect) { with(Element) { + [hide,undoClipping,undoPositioned].call(effect.element); + setStyle(effect.element, {opacity: oldOpacity}); + }} + }) + } + }); +} + +Effect.DropOut = function(element) { + element = $(element); + var oldStyle = { + top: Element.getStyle(element, 'top'), + left: Element.getStyle(element, 'left'), + opacity: Element.getInlineOpacity(element) }; + return new Effect.Parallel( + [ new Effect.Move(element, {x: 0, y: 100, sync: true }), + new Effect.Opacity(element, { sync: true, to: 0.0 }) ], + Object.extend( + { duration: 0.5, + beforeSetup: function(effect) { with(Element) { + makePositioned(effect.effects[0].element); }}, + afterFinishInternal: function(effect) { with(Element) { + [hide, undoPositioned].call(effect.effects[0].element); + setStyle(effect.effects[0].element, oldStyle); }} + }, arguments[1] || {})); +} + +Effect.Shake = function(element) { + element = $(element); + var oldStyle = { + top: Element.getStyle(element, 'top'), + left: Element.getStyle(element, 'left') }; + return new Effect.Move(element, + { x: 20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { + new Effect.Move(effect.element, + { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { with(Element) { + undoPositioned(effect.element); + setStyle(effect.element, oldStyle); + }}}) }}) }}) }}) }}) }}); +} + +Effect.SlideDown = function(element) { + element = $(element); + Element.cleanWhitespace(element); + // SlideDown need to have the content of the element wrapped in a container element with fixed height! + var oldInnerBottom = Element.getStyle(element.firstChild, 'bottom'); + var elementDimensions = Element.getDimensions(element); + return new Effect.Scale(element, 100, Object.extend({ + scaleContent: false, + scaleX: false, + scaleFrom: 0, + scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, + restoreAfterFinish: true, + afterSetup: function(effect) { with(Element) { + makePositioned(effect.element); + makePositioned(effect.element.firstChild); + if(window.opera) setStyle(effect.element, {top: ''}); + makeClipping(effect.element); + setStyle(effect.element, {height: '0px'}); + show(element); }}, + afterUpdateInternal: function(effect) { with(Element) { + setStyle(effect.element.firstChild, {bottom: + (effect.dims[0] - effect.element.clientHeight) + 'px' }); }}, + afterFinishInternal: function(effect) { with(Element) { + undoClipping(effect.element); + undoPositioned(effect.element.firstChild); + undoPositioned(effect.element); + setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }} + }, arguments[1] || {}) + ); +} + +Effect.SlideUp = function(element) { + element = $(element); + Element.cleanWhitespace(element); + var oldInnerBottom = Element.getStyle(element.firstChild, 'bottom'); + return new Effect.Scale(element, 0, + Object.extend({ scaleContent: false, + scaleX: false, + scaleMode: 'box', + scaleFrom: 100, + restoreAfterFinish: true, + beforeStartInternal: function(effect) { with(Element) { + makePositioned(effect.element); + makePositioned(effect.element.firstChild); + if(window.opera) setStyle(effect.element, {top: ''}); + makeClipping(effect.element); + show(element); }}, + afterUpdateInternal: function(effect) { with(Element) { + setStyle(effect.element.firstChild, {bottom: + (effect.dims[0] - effect.element.clientHeight) + 'px' }); }}, + afterFinishInternal: function(effect) { with(Element) { + [hide, undoClipping].call(effect.element); + undoPositioned(effect.element.firstChild); + undoPositioned(effect.element); + setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }} + }, arguments[1] || {}) + ); +} + +// Bug in opera makes the TD containing this element expand for a instance after finish +Effect.Squish = function(element) { + return new Effect.Scale(element, window.opera ? 1 : 0, + { restoreAfterFinish: true, + beforeSetup: function(effect) { with(Element) { + makeClipping(effect.element); }}, + afterFinishInternal: function(effect) { with(Element) { + hide(effect.element); + undoClipping(effect.element); }} + }); +} + +Effect.Grow = function(element) { + element = $(element); + var options = Object.extend({ + direction: 'center', + moveTransistion: Effect.Transitions.sinoidal, + scaleTransition: Effect.Transitions.sinoidal, + opacityTransition: Effect.Transitions.full + }, arguments[1] || {}); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: Element.getInlineOpacity(element) }; + + var dims = Element.getDimensions(element); + var initialMoveX, initialMoveY; + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + initialMoveX = initialMoveY = moveX = moveY = 0; + break; + case 'top-right': + initialMoveX = dims.width; + initialMoveY = moveY = 0; + moveX = -dims.width; + break; + case 'bottom-left': + initialMoveX = moveX = 0; + initialMoveY = dims.height; + moveY = -dims.height; + break; + case 'bottom-right': + initialMoveX = dims.width; + initialMoveY = dims.height; + moveX = -dims.width; + moveY = -dims.height; + break; + case 'center': + initialMoveX = dims.width / 2; + initialMoveY = dims.height / 2; + moveX = -dims.width / 2; + moveY = -dims.height / 2; + break; + } + + return new Effect.Move(element, { + x: initialMoveX, + y: initialMoveY, + duration: 0.01, + beforeSetup: function(effect) { with(Element) { + hide(effect.element); + makeClipping(effect.element); + makePositioned(effect.element); + }}, + afterFinishInternal: function(effect) { + new Effect.Parallel( + [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }), + new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }), + new Effect.Scale(effect.element, 100, { + scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, + sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) + ], Object.extend({ + beforeSetup: function(effect) { with(Element) { + setStyle(effect.effects[0].element, {height: '0px'}); + show(effect.effects[0].element); }}, + afterFinishInternal: function(effect) { with(Element) { + [undoClipping, undoPositioned].call(effect.effects[0].element); + setStyle(effect.effects[0].element, oldStyle); }} + }, options) + ) + } + }); +} + +Effect.Shrink = function(element) { + element = $(element); + var options = Object.extend({ + direction: 'center', + moveTransistion: Effect.Transitions.sinoidal, + scaleTransition: Effect.Transitions.sinoidal, + opacityTransition: Effect.Transitions.none + }, arguments[1] || {}); + var oldStyle = { + top: element.style.top, + left: element.style.left, + height: element.style.height, + width: element.style.width, + opacity: Element.getInlineOpacity(element) }; + + var dims = Element.getDimensions(element); + var moveX, moveY; + + switch (options.direction) { + case 'top-left': + moveX = moveY = 0; + break; + case 'top-right': + moveX = dims.width; + moveY = 0; + break; + case 'bottom-left': + moveX = 0; + moveY = dims.height; + break; + case 'bottom-right': + moveX = dims.width; + moveY = dims.height; + break; + case 'center': + moveX = dims.width / 2; + moveY = dims.height / 2; + break; + } + + return new Effect.Parallel( + [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), + new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), + new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) + ], Object.extend({ + beforeStartInternal: function(effect) { with(Element) { + [makePositioned, makeClipping].call(effect.effects[0].element) }}, + afterFinishInternal: function(effect) { with(Element) { + [hide, undoClipping, undoPositioned].call(effect.effects[0].element); + setStyle(effect.effects[0].element, oldStyle); }} + }, options) + ); +} + +Effect.Pulsate = function(element) { + element = $(element); + var options = arguments[1] || {}; + var oldOpacity = Element.getInlineOpacity(element); + var transition = options.transition || Effect.Transitions.sinoidal; + var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) }; + reverser.bind(transition); + return new Effect.Opacity(element, + Object.extend(Object.extend({ duration: 3.0, from: 0, + afterFinishInternal: function(effect) { Element.setStyle(effect.element, {opacity: oldOpacity}); } + }, options), {transition: reverser})); +} + +Effect.Fold = function(element) { + element = $(element); + var oldStyle = { + top: element.style.top, + left: element.style.left, + width: element.style.width, + height: element.style.height }; + Element.makeClipping(element); + return new Effect.Scale(element, 5, Object.extend({ + scaleContent: false, + scaleX: false, + afterFinishInternal: function(effect) { + new Effect.Scale(element, 1, { + scaleContent: false, + scaleY: false, + afterFinishInternal: function(effect) { with(Element) { + [hide, undoClipping].call(effect.element); + setStyle(effect.element, oldStyle); + }} }); + }}, arguments[1] || {})); +} diff --git a/lightbox/js/lightbox.js b/lightbox/js/lightbox.js new file mode 100755 index 0000000..3b2ecf4 --- /dev/null +++ b/lightbox/js/lightbox.js @@ -0,0 +1,815 @@ +// ----------------------------------------------------------------------------------- +// +// Lightbox v2.03.3 +// by Lokesh Dhakar - http://www.huddletogether.com +// 5/21/06 +// +// For more information on this script, visit: +// http://huddletogether.com/projects/lightbox2/ +// +// Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/ +// +// Credit also due to those who have helped, inspired, and made their code available to the public. +// Including: Scott Upton(uptonic.com), Peter-Paul Koch(quirksmode.com), Thomas Fuchs(mir.aculo.us), and others. +// +// +// ----------------------------------------------------------------------------------- +/* + + Table of Contents + ----------------- + Configuration + Global Variables + + Extending Built-in Objects + - Object.extend(Element) + - Array.prototype.removeDuplicates() + - Array.prototype.empty() + + Lightbox Class Declaration + - initialize() + - updateImageList() + - start() + - changeImage() + - resizeImageContainer() + - showImage() + - updateDetails() + - updateNav() + - enableKeyboardNav() + - disableKeyboardNav() + - keyboardAction() + - preloadNeighborImages() + - end() + + Miscellaneous Functions + - getPageScroll() + - getPageSize() + - getKey() + - listenKey() + - showSelectBoxes() + - hideSelectBoxes() + - showFlash() + - hideFlash() + - pause() + - initLightbox() + + Function Calls + - addLoadEvent(initLightbox) + +*/ +// ----------------------------------------------------------------------------------- + +// +// Configuration +// +var fileLoadingImage = "lightbox/images/loading.gif"; +var fileBottomNavCloseImage = "lightbox/images/closelabel.gif"; + +var overlayOpacity = 0.8; // controls transparency of shadow overlay + +var animate = true; // toggles resizing animations +var resizeSpeed = 8; // controls the speed of the image resizing animations (1=slowest and 10=fastest) + +var borderSize = 10; //if you adjust the padding in the CSS, you will need to update this variable + +// ----------------------------------------------------------------------------------- + +// +// Global Variables +// +var imageArray = new Array; +var activeImage; + +if(animate == true){ + overlayDuration = 0.2; // shadow fade in/out duration + if(resizeSpeed > 10){ resizeSpeed = 10;} + if(resizeSpeed < 1){ resizeSpeed = 1;} + resizeDuration = (11 - resizeSpeed) * 0.15; +} else { + overlayDuration = 0; + resizeDuration = 0; +} + +// ----------------------------------------------------------------------------------- + +// +// Additional methods for Element added by SU, Couloir +// - further additions by Lokesh Dhakar (huddletogether.com) +// +Object.extend(Element, { + getWidth: function(element) { + element = $(element); + return element.offsetWidth; + }, + setWidth: function(element,w) { + element = $(element); + element.style.width = w +"px"; + }, + setHeight: function(element,h) { + element = $(element); + element.style.height = h +"px"; + }, + setTop: function(element,t) { + element = $(element); + element.style.top = t +"px"; + }, + setLeft: function(element,l) { + element = $(element); + element.style.left = l +"px"; + }, + setSrc: function(element,src) { + element = $(element); + element.src = src; + }, + setHref: function(element,href) { + element = $(element); + element.href = href; + }, + setInnerHTML: function(element,content) { + element = $(element); + element.innerHTML = content; + } +}); + +// ----------------------------------------------------------------------------------- + +// +// Extending built-in Array object +// - array.removeDuplicates() +// - array.empty() +// +Array.prototype.removeDuplicates = function () { + for(i = 0; i < this.length; i++){ + for(j = this.length-1; j>i; j--){ + if(this[i][0] == this[j][0]){ + this.splice(j,1); + } + } + } +} + +// ----------------------------------------------------------------------------------- + +Array.prototype.empty = function () { + for(i = 0; i <= this.length; i++){ + this.shift(); + } +} + +// ----------------------------------------------------------------------------------- + +// +// Lightbox Class Declaration +// - initialize() +// - start() +// - changeImage() +// - resizeImageContainer() +// - showImage() +// - updateDetails() +// - updateNav() +// - enableKeyboardNav() +// - disableKeyboardNav() +// - keyboardNavAction() +// - preloadNeighborImages() +// - end() +// +// Structuring of code inspired by Scott Upton (http://www.uptonic.com/) +// +var Lightbox = Class.create(); + +Lightbox.prototype = { + + // initialize() + // Constructor runs on completion of the DOM loading. Calls updateImageList and then + // the function inserts html at the bottom of the page which is used to display the shadow + // overlay and the image container. + // + initialize: function() { + + this.updateImageList(); + + // Code inserts html at the bottom of the page that looks similar to this: + // + //
+ // + + + var objBody = document.getElementsByTagName("body").item(0); + + var objOverlay = document.createElement("div"); + objOverlay.setAttribute('id','overlay'); + objOverlay.style.display = 'none'; + objOverlay.onclick = function() { myLightbox.end(); } + objBody.appendChild(objOverlay); + + var objLightbox = document.createElement("div"); + objLightbox.setAttribute('id','lightbox'); + objLightbox.style.display = 'none'; + objLightbox.onclick = function(e) { // close Lightbox is user clicks shadow overlay + if (!e) var e = window.event; + var clickObj = Event.element(e).id; + if ( clickObj == 'lightbox') { + myLightbox.end(); + } + }; + objBody.appendChild(objLightbox); + + var objOuterImageContainer = document.createElement("div"); + objOuterImageContainer.setAttribute('id','outerImageContainer'); + objLightbox.appendChild(objOuterImageContainer); + + // When Lightbox starts it will resize itself from 250 by 250 to the current image dimension. + // If animations are turned off, it will be hidden as to prevent a flicker of a + // white 250 by 250 box. + if(animate){ + Element.setWidth('outerImageContainer', 250); + Element.setHeight('outerImageContainer', 250); + } else { + Element.setWidth('outerImageContainer', 1); + Element.setHeight('outerImageContainer', 1); + } + + var objImageContainer = document.createElement("div"); + objImageContainer.setAttribute('id','imageContainer'); + objOuterImageContainer.appendChild(objImageContainer); + + var objLightboxImage = document.createElement("img"); + objLightboxImage.setAttribute('id','lightboxImage'); + objImageContainer.appendChild(objLightboxImage); + + var objHoverNav = document.createElement("div"); + objHoverNav.setAttribute('id','hoverNav'); + objImageContainer.appendChild(objHoverNav); + + var objPrevLink = document.createElement("a"); + objPrevLink.setAttribute('id','prevLink'); + objPrevLink.setAttribute('href','#'); + objHoverNav.appendChild(objPrevLink); + + var objNextLink = document.createElement("a"); + objNextLink.setAttribute('id','nextLink'); + objNextLink.setAttribute('href','#'); + objHoverNav.appendChild(objNextLink); + + var objLoading = document.createElement("div"); + objLoading.setAttribute('id','loading'); + objImageContainer.appendChild(objLoading); + + var objLoadingLink = document.createElement("a"); + objLoadingLink.setAttribute('id','loadingLink'); + objLoadingLink.setAttribute('href','#'); + objLoadingLink.onclick = function() { myLightbox.end(); return false; } + objLoading.appendChild(objLoadingLink); + + var objLoadingImage = document.createElement("img"); + objLoadingImage.setAttribute('src', fileLoadingImage); + objLoadingLink.appendChild(objLoadingImage); + + var objImageDataContainer = document.createElement("div"); + objImageDataContainer.setAttribute('id','imageDataContainer'); + objLightbox.appendChild(objImageDataContainer); + + var objImageData = document.createElement("div"); + objImageData.setAttribute('id','imageData'); + objImageDataContainer.appendChild(objImageData); + + var objImageDetails = document.createElement("div"); + objImageDetails.setAttribute('id','imageDetails'); + objImageData.appendChild(objImageDetails); + + var objCaption = document.createElement("span"); + objCaption.setAttribute('id','caption'); + objImageDetails.appendChild(objCaption); + + var objNumberDisplay = document.createElement("span"); + objNumberDisplay.setAttribute('id','numberDisplay'); + objImageDetails.appendChild(objNumberDisplay); + + var objBottomNav = document.createElement("div"); + objBottomNav.setAttribute('id','bottomNav'); + objImageData.appendChild(objBottomNav); + + var objBottomNavCloseLink = document.createElement("a"); + objBottomNavCloseLink.setAttribute('id','bottomNavClose'); + objBottomNavCloseLink.setAttribute('href','#'); + objBottomNavCloseLink.onclick = function() { myLightbox.end(); return false; } + objBottomNav.appendChild(objBottomNavCloseLink); + + var objBottomNavCloseImage = document.createElement("img"); + objBottomNavCloseImage.setAttribute('src', fileBottomNavCloseImage); + objBottomNavCloseLink.appendChild(objBottomNavCloseImage); + }, + + + // + // updateImageList() + // Loops through anchor tags looking for 'lightbox' references and applies onclick + // events to appropriate links. You can rerun after dynamically adding images w/ajax. + // + updateImageList: function() { + if (!document.getElementsByTagName){ return; } + var anchors = document.getElementsByTagName('a'); + var areas = document.getElementsByTagName('area'); + + // loop through all anchor tags + for (var i=0; i 1){ + Element.show('numberDisplay'); + Element.setInnerHTML( 'numberDisplay', "Image " + eval(activeImage + 1) + " of " + imageArray.length); + } + + new Effect.Parallel( + [ new Effect.SlideDown( 'imageDataContainer', { sync: true, duration: resizeDuration, from: 0.0, to: 1.0 }), + new Effect.Appear('imageDataContainer', { sync: true, duration: resizeDuration }) ], + { duration: resizeDuration, afterFinish: function() { + // update overlay size and update nav + var arrayPageSize = getPageSize(); + Element.setHeight('overlay', arrayPageSize[1]); + myLightbox.updateNav(); + } + } + ); + }, + + // + // updateNav() + // Display appropriate previous and next hover navigation. + // + updateNav: function() { + + Element.show('hoverNav'); + + // if not first image in set, display prev image button + if(activeImage != 0){ + Element.show('prevLink'); + document.getElementById('prevLink').onclick = function() { + myLightbox.changeImage(activeImage - 1); return false; + } + } + + // if not last image in set, display next image button + if(activeImage != (imageArray.length - 1)){ + Element.show('nextLink'); + document.getElementById('nextLink').onclick = function() { + myLightbox.changeImage(activeImage + 1); return false; + } + } + + this.enableKeyboardNav(); + }, + + // + // enableKeyboardNav() + // + enableKeyboardNav: function() { + document.onkeydown = this.keyboardAction; + }, + + // + // disableKeyboardNav() + // + disableKeyboardNav: function() { + document.onkeydown = ''; + }, + + // + // keyboardAction() + // + keyboardAction: function(e) { + if (e == null) { // ie + keycode = event.keyCode; + escapeKey = 27; + } else { // mozilla + keycode = e.keyCode; + escapeKey = e.DOM_VK_ESCAPE; + } + + key = String.fromCharCode(keycode).toLowerCase(); + + if((key == 'x') || (key == 'o') || (key == 'c') || (keycode == escapeKey)){ // close lightbox + myLightbox.end(); + } else if((key == 'p') || (keycode == 37)){ // display previous image + if(activeImage != 0){ + myLightbox.disableKeyboardNav(); + myLightbox.changeImage(activeImage - 1); + } + } else if((key == 'n') || (keycode == 39)){ // display next image + if(activeImage != (imageArray.length - 1)){ + myLightbox.disableKeyboardNav(); + myLightbox.changeImage(activeImage + 1); + } + } + + }, + + // + // preloadNeighborImages() + // Preload previous and next images. + // + preloadNeighborImages: function(){ + + if((imageArray.length - 1) > activeImage){ + preloadNextImage = new Image(); + preloadNextImage.src = imageArray[activeImage + 1][0]; + } + if(activeImage > 0){ + preloadPrevImage = new Image(); + preloadPrevImage.src = imageArray[activeImage - 1][0]; + } + + }, + + // + // end() + // + end: function() { + this.disableKeyboardNav(); + Element.hide('lightbox'); + new Effect.Fade('overlay', { duration: overlayDuration}); + showSelectBoxes(); + showFlash(); + } +} + +// ----------------------------------------------------------------------------------- + +// +// getPageScroll() +// Returns array with x,y page scroll values. +// Core code from - quirksmode.com +// +function getPageScroll(){ + + var xScroll, yScroll; + + if (self.pageYOffset) { + yScroll = self.pageYOffset; + xScroll = self.pageXOffset; + } else if (document.documentElement && document.documentElement.scrollTop){ // Explorer 6 Strict + yScroll = document.documentElement.scrollTop; + xScroll = document.documentElement.scrollLeft; + } else if (document.body) {// all other Explorers + yScroll = document.body.scrollTop; + xScroll = document.body.scrollLeft; + } + + arrayPageScroll = new Array(xScroll,yScroll) + return arrayPageScroll; +} + +// ----------------------------------------------------------------------------------- + +// +// getPageSize() +// Returns array with page width, height and window width, height +// Core code from - quirksmode.com +// Edit for Firefox by pHaez +// +function getPageSize(){ + + var xScroll, yScroll; + + if (window.innerHeight && window.scrollMaxY) { + xScroll = window.innerWidth + window.scrollMaxX; + yScroll = window.innerHeight + window.scrollMaxY; + } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac + xScroll = document.body.scrollWidth; + yScroll = document.body.scrollHeight; + } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari + xScroll = document.body.offsetWidth; + yScroll = document.body.offsetHeight; + } + + var windowWidth, windowHeight; + +// console.log(self.innerWidth); +// console.log(document.documentElement.clientWidth); + + if (self.innerHeight) { // all except Explorer + if(document.documentElement.clientWidth){ + windowWidth = document.documentElement.clientWidth; + } else { + windowWidth = self.innerWidth; + } + windowHeight = self.innerHeight; + } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode + windowWidth = document.documentElement.clientWidth; + windowHeight = document.documentElement.clientHeight; + } else if (document.body) { // other Explorers + windowWidth = document.body.clientWidth; + windowHeight = document.body.clientHeight; + } + + // for small pages with total height less then height of the viewport + if(yScroll < windowHeight){ + pageHeight = windowHeight; + } else { + pageHeight = yScroll; + } + +// console.log("xScroll " + xScroll) +// console.log("windowWidth " + windowWidth) + + // for small pages with total width less then width of the viewport + if(xScroll < windowWidth){ + pageWidth = xScroll; + } else { + pageWidth = windowWidth; + } +// console.log("pageWidth " + pageWidth) + + arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) + return arrayPageSize; +} + +// ----------------------------------------------------------------------------------- + +// +// getKey(key) +// Gets keycode. If 'x' is pressed then it hides the lightbox. +// +function getKey(e){ + if (e == null) { // ie + keycode = event.keyCode; + } else { // mozilla + keycode = e.which; + } + key = String.fromCharCode(keycode).toLowerCase(); + + if(key == 'x'){ + } +} + +// ----------------------------------------------------------------------------------- + +// +// listenKey() +// +function listenKey () { document.onkeypress = getKey; } + +// --------------------------------------------------- + +function showSelectBoxes(){ + var selects = document.getElementsByTagName("select"); + for (i = 0; i != selects.length; i++) { + selects[i].style.visibility = "visible"; + } +} + +// --------------------------------------------------- + +function hideSelectBoxes(){ + var selects = document.getElementsByTagName("select"); + for (i = 0; i != selects.length; i++) { + selects[i].style.visibility = "hidden"; + } +} + +// --------------------------------------------------- + +function showFlash(){ + var flashObjects = document.getElementsByTagName("object"); + for (i = 0; i < flashObjects.length; i++) { + flashObjects[i].style.visibility = "visible"; + } + + var flashEmbeds = document.getElementsByTagName("embed"); + for (i = 0; i < flashEmbeds.length; i++) { + flashEmbeds[i].style.visibility = "visible"; + } +} + +// --------------------------------------------------- + +function hideFlash(){ + var flashObjects = document.getElementsByTagName("object"); + for (i = 0; i < flashObjects.length; i++) { + flashObjects[i].style.visibility = "hidden"; + } + + var flashEmbeds = document.getElementsByTagName("embed"); + for (i = 0; i < flashEmbeds.length; i++) { + flashEmbeds[i].style.visibility = "hidden"; + } + +} + + +// --------------------------------------------------- + +// +// pause(numberMillis) +// Pauses code execution for specified time. Uses busy code, not good. +// Help from Ran Bar-On [ran2103@gmail.com] +// + +function pause(ms){ + var date = new Date(); + curDate = null; + do{var curDate = new Date();} + while( curDate - date < ms); +} +/* +function pause(numberMillis) { + var curently = new Date().getTime() + sender; + while (new Date().getTime(); +} +*/ +// --------------------------------------------------- +var myLightbox = null +function initLightbox() { myLightbox = new Lightbox(); } +Event.observe(window, 'load', initLightbox, false); \ No newline at end of file diff --git a/lightbox/js/prototype.js b/lightbox/js/prototype.js new file mode 100755 index 0000000..e9ccd3c --- /dev/null +++ b/lightbox/js/prototype.js @@ -0,0 +1,1785 @@ +/* Prototype JavaScript framework, version 1.4.0 + * (c) 2005 Sam Stephenson + * + * THIS FILE IS AUTOMATICALLY GENERATED. When sending patches, please diff + * against the source tree, available from the Prototype darcs repository. + * + * Prototype is freely distributable under the terms of an MIT-style license. + * + * For details, see the Prototype web site: http://prototype.conio.net/ + * +/*--------------------------------------------------------------------------*/ + +var Prototype = { + Version: '1.4.0', + ScriptFragment: '(?:)((\n|\r|.)*?)(?:<\/script>)', + + emptyFunction: function() {}, + K: function(x) {return x} +} + +var Class = { + create: function() { + return function() { + this.initialize.apply(this, arguments); + } + } +} + +var Abstract = new Object(); + +Object.extend = function(destination, source) { + for (property in source) { + destination[property] = source[property]; + } + return destination; +} + +Object.inspect = function(object) { + try { + if (object == undefined) return 'undefined'; + if (object == null) return 'null'; + return object.inspect ? object.inspect() : object.toString(); + } catch (e) { + if (e instanceof RangeError) return '...'; + throw e; + } +} + +Function.prototype.bind = function() { + var __method = this, args = $A(arguments), object = args.shift(); + return function() { + return __method.apply(object, args.concat($A(arguments))); + } +} + +Function.prototype.bindAsEventListener = function(object) { + var __method = this; + return function(event) { + return __method.call(object, event || window.event); + } +} + +Object.extend(Number.prototype, { + toColorPart: function() { + var digits = this.toString(16); + if (this < 16) return '0' + digits; + return digits; + }, + + succ: function() { + return this + 1; + }, + + times: function(iterator) { + $R(0, this, true).each(iterator); + return this; + } +}); + +var Try = { + these: function() { + var returnValue; + + for (var i = 0; i < arguments.length; i++) { + var lambda = arguments[i]; + try { + returnValue = lambda(); + break; + } catch (e) {} + } + + return returnValue; + } +} + +/*--------------------------------------------------------------------------*/ + +var PeriodicalExecuter = Class.create(); +PeriodicalExecuter.prototype = { + initialize: function(callback, frequency) { + this.callback = callback; + this.frequency = frequency; + this.currentlyExecuting = false; + + this.registerCallback(); + }, + + registerCallback: function() { + setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); + }, + + onTimerEvent: function() { + if (!this.currentlyExecuting) { + try { + this.currentlyExecuting = true; + this.callback(); + } finally { + this.currentlyExecuting = false; + } + } + } +} + +/*--------------------------------------------------------------------------*/ + +function $() { + var elements = new Array(); + + for (var i = 0; i < arguments.length; i++) { + var element = arguments[i]; + if (typeof element == 'string') + element = document.getElementById(element); + + if (arguments.length == 1) + return element; + + elements.push(element); + } + + return elements; +} +Object.extend(String.prototype, { + stripTags: function() { + return this.replace(/<\/?[^>]+>/gi, ''); + }, + + stripScripts: function() { + return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); + }, + + extractScripts: function() { + var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); + var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); + return (this.match(matchAll) || []).map(function(scriptTag) { + return (scriptTag.match(matchOne) || ['', ''])[1]; + }); + }, + + evalScripts: function() { + return this.extractScripts().map(eval); + }, + + escapeHTML: function() { + var div = document.createElement('div'); + var text = document.createTextNode(this); + div.appendChild(text); + return div.innerHTML; + }, + + unescapeHTML: function() { + var div = document.createElement('div'); + div.innerHTML = this.stripTags(); + return div.childNodes[0] ? div.childNodes[0].nodeValue : ''; + }, + + toQueryParams: function() { + var pairs = this.match(/^\??(.*)$/)[1].split('&'); + return pairs.inject({}, function(params, pairString) { + var pair = pairString.split('='); + params[pair[0]] = pair[1]; + return params; + }); + }, + + toArray: function() { + return this.split(''); + }, + + camelize: function() { + var oStringList = this.split('-'); + if (oStringList.length == 1) return oStringList[0]; + + var camelizedString = this.indexOf('-') == 0 + ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1) + : oStringList[0]; + + for (var i = 1, len = oStringList.length; i < len; i++) { + var s = oStringList[i]; + camelizedString += s.charAt(0).toUpperCase() + s.substring(1); + } + + return camelizedString; + }, + + inspect: function() { + return "'" + this.replace('\\', '\\\\').replace("'", '\\\'') + "'"; + } +}); + +String.prototype.parseQuery = String.prototype.toQueryParams; + +var $break = new Object(); +var $continue = new Object(); + +var Enumerable = { + each: function(iterator) { + var index = 0; + try { + this._each(function(value) { + try { + iterator(value, index++); + } catch (e) { + if (e != $continue) throw e; + } + }); + } catch (e) { + if (e != $break) throw e; + } + }, + + all: function(iterator) { + var result = true; + this.each(function(value, index) { + result = result && !!(iterator || Prototype.K)(value, index); + if (!result) throw $break; + }); + return result; + }, + + any: function(iterator) { + var result = true; + this.each(function(value, index) { + if (result = !!(iterator || Prototype.K)(value, index)) + throw $break; + }); + return result; + }, + + collect: function(iterator) { + var results = []; + this.each(function(value, index) { + results.push(iterator(value, index)); + }); + return results; + }, + + detect: function (iterator) { + var result; + this.each(function(value, index) { + if (iterator(value, index)) { + result = value; + throw $break; + } + }); + return result; + }, + + findAll: function(iterator) { + var results = []; + this.each(function(value, index) { + if (iterator(value, index)) + results.push(value); + }); + return results; + }, + + grep: function(pattern, iterator) { + var results = []; + this.each(function(value, index) { + var stringValue = value.toString(); + if (stringValue.match(pattern)) + results.push((iterator || Prototype.K)(value, index)); + }) + return results; + }, + + include: function(object) { + var found = false; + this.each(function(value) { + if (value == object) { + found = true; + throw $break; + } + }); + return found; + }, + + inject: function(memo, iterator) { + this.each(function(value, index) { + memo = iterator(memo, value, index); + }); + return memo; + }, + + invoke: function(method) { + var args = $A(arguments).slice(1); + return this.collect(function(value) { + return value[method].apply(value, args); + }); + }, + + max: function(iterator) { + var result; + this.each(function(value, index) { + value = (iterator || Prototype.K)(value, index); + if (value >= (result || value)) + result = value; + }); + return result; + }, + + min: function(iterator) { + var result; + this.each(function(value, index) { + value = (iterator || Prototype.K)(value, index); + if (value <= (result || value)) + result = value; + }); + return result; + }, + + partition: function(iterator) { + var trues = [], falses = []; + this.each(function(value, index) { + ((iterator || Prototype.K)(value, index) ? + trues : falses).push(value); + }); + return [trues, falses]; + }, + + pluck: function(property) { + var results = []; + this.each(function(value, index) { + results.push(value[property]); + }); + return results; + }, + + reject: function(iterator) { + var results = []; + this.each(function(value, index) { + if (!iterator(value, index)) + results.push(value); + }); + return results; + }, + + sortBy: function(iterator) { + return this.collect(function(value, index) { + return {value: value, criteria: iterator(value, index)}; + }).sort(function(left, right) { + var a = left.criteria, b = right.criteria; + return a < b ? -1 : a > b ? 1 : 0; + }).pluck('value'); + }, + + toArray: function() { + return this.collect(Prototype.K); + }, + + zip: function() { + var iterator = Prototype.K, args = $A(arguments); + if (typeof args.last() == 'function') + iterator = args.pop(); + + var collections = [this].concat(args).map($A); + return this.map(function(value, index) { + iterator(value = collections.pluck(index)); + return value; + }); + }, + + inspect: function() { + return '#'; + } +} + +Object.extend(Enumerable, { + map: Enumerable.collect, + find: Enumerable.detect, + select: Enumerable.findAll, + member: Enumerable.include, + entries: Enumerable.toArray +}); +var $A = Array.from = function(iterable) { + if (!iterable) return []; + if (iterable.toArray) { + return iterable.toArray(); + } else { + var results = []; + for (var i = 0; i < iterable.length; i++) + results.push(iterable[i]); + return results; + } +} + +Object.extend(Array.prototype, Enumerable); + +Array.prototype._reverse = Array.prototype.reverse; + +Object.extend(Array.prototype, { + _each: function(iterator) { + for (var i = 0; i < this.length; i++) + iterator(this[i]); + }, + + clear: function() { + this.length = 0; + return this; + }, + + first: function() { + return this[0]; + }, + + last: function() { + return this[this.length - 1]; + }, + + compact: function() { + return this.select(function(value) { + return value != undefined || value != null; + }); + }, + + flatten: function() { + return this.inject([], function(array, value) { + return array.concat(value.constructor == Array ? + value.flatten() : [value]); + }); + }, + + without: function() { + var values = $A(arguments); + return this.select(function(value) { + return !values.include(value); + }); + }, + + indexOf: function(object) { + for (var i = 0; i < this.length; i++) + if (this[i] == object) return i; + return -1; + }, + + reverse: function(inline) { + return (inline !== false ? this : this.toArray())._reverse(); + }, + + shift: function() { + var result = this[0]; + for (var i = 0; i < this.length - 1; i++) + this[i] = this[i + 1]; + this.length--; + return result; + }, + + inspect: function() { + return '[' + this.map(Object.inspect).join(', ') + ']'; + } +}); +var Hash = { + _each: function(iterator) { + for (key in this) { + var value = this[key]; + if (typeof value == 'function') continue; + + var pair = [key, value]; + pair.key = key; + pair.value = value; + iterator(pair); + } + }, + + keys: function() { + return this.pluck('key'); + }, + + values: function() { + return this.pluck('value'); + }, + + merge: function(hash) { + return $H(hash).inject($H(this), function(mergedHash, pair) { + mergedHash[pair.key] = pair.value; + return mergedHash; + }); + }, + + toQueryString: function() { + return this.map(function(pair) { + return pair.map(encodeURIComponent).join('='); + }).join('&'); + }, + + inspect: function() { + return '#'; + } +} + +function $H(object) { + var hash = Object.extend({}, object || {}); + Object.extend(hash, Enumerable); + Object.extend(hash, Hash); + return hash; +} +ObjectRange = Class.create(); +Object.extend(ObjectRange.prototype, Enumerable); +Object.extend(ObjectRange.prototype, { + initialize: function(start, end, exclusive) { + this.start = start; + this.end = end; + this.exclusive = exclusive; + }, + + _each: function(iterator) { + var value = this.start; + do { + iterator(value); + value = value.succ(); + } while (this.include(value)); + }, + + include: function(value) { + if (value < this.start) + return false; + if (this.exclusive) + return value < this.end; + return value <= this.end; + } +}); + +var $R = function(start, end, exclusive) { + return new ObjectRange(start, end, exclusive); +} + +var Ajax = { + getTransport: function() { + return Try.these( + function() {return new ActiveXObject('Msxml2.XMLHTTP')}, + function() {return new ActiveXObject('Microsoft.XMLHTTP')}, + function() {return new XMLHttpRequest()} + ) || false; + }, + + activeRequestCount: 0 +} + +Ajax.Responders = { + responders: [], + + _each: function(iterator) { + this.responders._each(iterator); + }, + + register: function(responderToAdd) { + if (!this.include(responderToAdd)) + this.responders.push(responderToAdd); + }, + + unregister: function(responderToRemove) { + this.responders = this.responders.without(responderToRemove); + }, + + dispatch: function(callback, request, transport, json) { + this.each(function(responder) { + if (responder[callback] && typeof responder[callback] == 'function') { + try { + responder[callback].apply(responder, [request, transport, json]); + } catch (e) {} + } + }); + } +}; + +Object.extend(Ajax.Responders, Enumerable); + +Ajax.Responders.register({ + onCreate: function() { + Ajax.activeRequestCount++; + }, + + onComplete: function() { + Ajax.activeRequestCount--; + } +}); + +Ajax.Base = function() {}; +Ajax.Base.prototype = { + setOptions: function(options) { + this.options = { + method: 'post', + asynchronous: true, + parameters: '' + } + Object.extend(this.options, options || {}); + }, + + responseIsSuccess: function() { + return this.transport.status == undefined + || this.transport.status == 0 + || (this.transport.status >= 200 && this.transport.status < 300); + }, + + responseIsFailure: function() { + return !this.responseIsSuccess(); + } +} + +Ajax.Request = Class.create(); +Ajax.Request.Events = + ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; + +Ajax.Request.prototype = Object.extend(new Ajax.Base(), { + initialize: function(url, options) { + this.transport = Ajax.getTransport(); + this.setOptions(options); + this.request(url); + }, + + request: function(url) { + var parameters = this.options.parameters || ''; + if (parameters.length > 0) parameters += '&_='; + + try { + this.url = url; + if (this.options.method == 'get' && parameters.length > 0) + this.url += (this.url.match(/\?/) ? '&' : '?') + parameters; + + Ajax.Responders.dispatch('onCreate', this, this.transport); + + this.transport.open(this.options.method, this.url, + this.options.asynchronous); + + if (this.options.asynchronous) { + this.transport.onreadystatechange = this.onStateChange.bind(this); + setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); + } + + this.setRequestHeaders(); + + var body = this.options.postBody ? this.options.postBody : parameters; + this.transport.send(this.options.method == 'post' ? body : null); + + } catch (e) { + this.dispatchException(e); + } + }, + + setRequestHeaders: function() { + var requestHeaders = + ['X-Requested-With', 'XMLHttpRequest', + 'X-Prototype-Version', Prototype.Version]; + + if (this.options.method == 'post') { + requestHeaders.push('Content-type', + 'application/x-www-form-urlencoded'); + + /* Force "Connection: close" for Mozilla browsers to work around + * a bug where XMLHttpReqeuest sends an incorrect Content-length + * header. See Mozilla Bugzilla #246651. + */ + if (this.transport.overrideMimeType) + requestHeaders.push('Connection', 'close'); + } + + if (this.options.requestHeaders) + requestHeaders.push.apply(requestHeaders, this.options.requestHeaders); + + for (var i = 0; i < requestHeaders.length; i += 2) + this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]); + }, + + onStateChange: function() { + var readyState = this.transport.readyState; + if (readyState != 1) + this.respondToReadyState(this.transport.readyState); + }, + + header: function(name) { + try { + return this.transport.getResponseHeader(name); + } catch (e) {} + }, + + evalJSON: function() { + try { + return eval(this.header('X-JSON')); + } catch (e) {} + }, + + evalResponse: function() { + try { + return eval(this.transport.responseText); + } catch (e) { + this.dispatchException(e); + } + }, + + respondToReadyState: function(readyState) { + var event = Ajax.Request.Events[readyState]; + var transport = this.transport, json = this.evalJSON(); + + if (event == 'Complete') { + try { + (this.options['on' + this.transport.status] + || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')] + || Prototype.emptyFunction)(transport, json); + } catch (e) { + this.dispatchException(e); + } + + if ((this.header('Content-type') || '').match(/^text\/javascript/i)) + this.evalResponse(); + } + + try { + (this.options['on' + event] || Prototype.emptyFunction)(transport, json); + Ajax.Responders.dispatch('on' + event, this, transport, json); + } catch (e) { + this.dispatchException(e); + } + + /* Avoid memory leak in MSIE: clean up the oncomplete event handler */ + if (event == 'Complete') + this.transport.onreadystatechange = Prototype.emptyFunction; + }, + + dispatchException: function(exception) { + (this.options.onException || Prototype.emptyFunction)(this, exception); + Ajax.Responders.dispatch('onException', this, exception); + } +}); + +Ajax.Updater = Class.create(); + +Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), { + initialize: function(container, url, options) { + this.containers = { + success: container.success ? $(container.success) : $(container), + failure: container.failure ? $(container.failure) : + (container.success ? null : $(container)) + } + + this.transport = Ajax.getTransport(); + this.setOptions(options); + + var onComplete = this.options.onComplete || Prototype.emptyFunction; + this.options.onComplete = (function(transport, object) { + this.updateContent(); + onComplete(transport, object); + }).bind(this); + + this.request(url); + }, + + updateContent: function() { + var receiver = this.responseIsSuccess() ? + this.containers.success : this.containers.failure; + var response = this.transport.responseText; + + if (!this.options.evalScripts) + response = response.stripScripts(); + + if (receiver) { + if (this.options.insertion) { + new this.options.insertion(receiver, response); + } else { + Element.update(receiver, response); + } + } + + if (this.responseIsSuccess()) { + if (this.onComplete) + setTimeout(this.onComplete.bind(this), 10); + } + } +}); + +Ajax.PeriodicalUpdater = Class.create(); +Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), { + initialize: function(container, url, options) { + this.setOptions(options); + this.onComplete = this.options.onComplete; + + this.frequency = (this.options.frequency || 2); + this.decay = (this.options.decay || 1); + + this.updater = {}; + this.container = container; + this.url = url; + + this.start(); + }, + + start: function() { + this.options.onComplete = this.updateComplete.bind(this); + this.onTimerEvent(); + }, + + stop: function() { + this.updater.onComplete = undefined; + clearTimeout(this.timer); + (this.onComplete || Prototype.emptyFunction).apply(this, arguments); + }, + + updateComplete: function(request) { + if (this.options.decay) { + this.decay = (request.responseText == this.lastText ? + this.decay * this.options.decay : 1); + + this.lastText = request.responseText; + } + this.timer = setTimeout(this.onTimerEvent.bind(this), + this.decay * this.frequency * 1000); + }, + + onTimerEvent: function() { + this.updater = new Ajax.Updater(this.container, this.url, this.options); + } +}); +document.getElementsByClassName = function(className, parentElement) { + var children = ($(parentElement) || document.body).getElementsByTagName('*'); + return $A(children).inject([], function(elements, child) { + if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) + elements.push(child); + return elements; + }); +} + +/*--------------------------------------------------------------------------*/ + +if (!window.Element) { + var Element = new Object(); +} + +Object.extend(Element, { + visible: function(element) { + return $(element).style.display != 'none'; + }, + + toggle: function() { + for (var i = 0; i < arguments.length; i++) { + var element = $(arguments[i]); + Element[Element.visible(element) ? 'hide' : 'show'](element); + } + }, + + hide: function() { + for (var i = 0; i < arguments.length; i++) { + var element = $(arguments[i]); + element.style.display = 'none'; + } + }, + + show: function() { + for (var i = 0; i < arguments.length; i++) { + var element = $(arguments[i]); + element.style.display = ''; + } + }, + + remove: function(element) { + element = $(element); + element.parentNode.removeChild(element); + }, + + update: function(element, html) { + $(element).innerHTML = html.stripScripts(); + setTimeout(function() {html.evalScripts()}, 10); + }, + + getHeight: function(element) { + element = $(element); + return element.offsetHeight; + }, + + classNames: function(element) { + return new Element.ClassNames(element); + }, + + hasClassName: function(element, className) { + if (!(element = $(element))) return; + return Element.classNames(element).include(className); + }, + + addClassName: function(element, className) { + if (!(element = $(element))) return; + return Element.classNames(element).add(className); + }, + + removeClassName: function(element, className) { + if (!(element = $(element))) return; + return Element.classNames(element).remove(className); + }, + + // removes whitespace-only text node children + cleanWhitespace: function(element) { + element = $(element); + for (var i = 0; i < element.childNodes.length; i++) { + var node = element.childNodes[i]; + if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) + Element.remove(node); + } + }, + + empty: function(element) { + return $(element).innerHTML.match(/^\s*$/); + }, + + scrollTo: function(element) { + element = $(element); + var x = element.x ? element.x : element.offsetLeft, + y = element.y ? element.y : element.offsetTop; + window.scrollTo(x, y); + }, + + getStyle: function(element, style) { + element = $(element); + var value = element.style[style.camelize()]; + if (!value) { + if (document.defaultView && document.defaultView.getComputedStyle) { + var css = document.defaultView.getComputedStyle(element, null); + value = css ? css.getPropertyValue(style) : null; + } else if (element.currentStyle) { + value = element.currentStyle[style.camelize()]; + } + } + + if (window.opera && ['left', 'top', 'right', 'bottom'].include(style)) + if (Element.getStyle(element, 'position') == 'static') value = 'auto'; + + return value == 'auto' ? null : value; + }, + + setStyle: function(element, style) { + element = $(element); + for (name in style) + element.style[name.camelize()] = style[name]; + }, + + getDimensions: function(element) { + element = $(element); + if (Element.getStyle(element, 'display') != 'none') + return {width: element.offsetWidth, height: element.offsetHeight}; + + // All *Width and *Height properties give 0 on elements with display none, + // so enable the element temporarily + var els = element.style; + var originalVisibility = els.visibility; + var originalPosition = els.position; + els.visibility = 'hidden'; + els.position = 'absolute'; + els.display = ''; + var originalWidth = element.clientWidth; + var originalHeight = element.clientHeight; + els.display = 'none'; + els.position = originalPosition; + els.visibility = originalVisibility; + return {width: originalWidth, height: originalHeight}; + }, + + makePositioned: function(element) { + element = $(element); + var pos = Element.getStyle(element, 'position'); + if (pos == 'static' || !pos) { + element._madePositioned = true; + element.style.position = 'relative'; + // Opera returns the offset relative to the positioning context, when an + // element is position relative but top and left have not been defined + if (window.opera) { + element.style.top = 0; + element.style.left = 0; + } + } + }, + + undoPositioned: function(element) { + element = $(element); + if (element._madePositioned) { + element._madePositioned = undefined; + element.style.position = + element.style.top = + element.style.left = + element.style.bottom = + element.style.right = ''; + } + }, + + makeClipping: function(element) { + element = $(element); + if (element._overflow) return; + element._overflow = element.style.overflow; + if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') + element.style.overflow = 'hidden'; + }, + + undoClipping: function(element) { + element = $(element); + if (element._overflow) return; + element.style.overflow = element._overflow; + element._overflow = undefined; + } +}); + +var Toggle = new Object(); +Toggle.display = Element.toggle; + +/*--------------------------------------------------------------------------*/ + +Abstract.Insertion = function(adjacency) { + this.adjacency = adjacency; +} + +Abstract.Insertion.prototype = { + initialize: function(element, content) { + this.element = $(element); + this.content = content.stripScripts(); + + if (this.adjacency && this.element.insertAdjacentHTML) { + try { + this.element.insertAdjacentHTML(this.adjacency, this.content); + } catch (e) { + if (this.element.tagName.toLowerCase() == 'tbody') { + this.insertContent(this.contentFromAnonymousTable()); + } else { + throw e; + } + } + } else { + this.range = this.element.ownerDocument.createRange(); + if (this.initializeRange) this.initializeRange(); + this.insertContent([this.range.createContextualFragment(this.content)]); + } + + setTimeout(function() {content.evalScripts()}, 10); + }, + + contentFromAnonymousTable: function() { + var div = document.createElement('div'); + div.innerHTML = '' + this.content + '
'; + return $A(div.childNodes[0].childNodes[0].childNodes); + } +} + +var Insertion = new Object(); + +Insertion.Before = Class.create(); +Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), { + initializeRange: function() { + this.range.setStartBefore(this.element); + }, + + insertContent: function(fragments) { + fragments.each((function(fragment) { + this.element.parentNode.insertBefore(fragment, this.element); + }).bind(this)); + } +}); + +Insertion.Top = Class.create(); +Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), { + initializeRange: function() { + this.range.selectNodeContents(this.element); + this.range.collapse(true); + }, + + insertContent: function(fragments) { + fragments.reverse(false).each((function(fragment) { + this.element.insertBefore(fragment, this.element.firstChild); + }).bind(this)); + } +}); + +Insertion.Bottom = Class.create(); +Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), { + initializeRange: function() { + this.range.selectNodeContents(this.element); + this.range.collapse(this.element); + }, + + insertContent: function(fragments) { + fragments.each((function(fragment) { + this.element.appendChild(fragment); + }).bind(this)); + } +}); + +Insertion.After = Class.create(); +Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), { + initializeRange: function() { + this.range.setStartAfter(this.element); + }, + + insertContent: function(fragments) { + fragments.each((function(fragment) { + this.element.parentNode.insertBefore(fragment, + this.element.nextSibling); + }).bind(this)); + } +}); + +/*--------------------------------------------------------------------------*/ + +Element.ClassNames = Class.create(); +Element.ClassNames.prototype = { + initialize: function(element) { + this.element = $(element); + }, + + _each: function(iterator) { + this.element.className.split(/\s+/).select(function(name) { + return name.length > 0; + })._each(iterator); + }, + + set: function(className) { + this.element.className = className; + }, + + add: function(classNameToAdd) { + if (this.include(classNameToAdd)) return; + this.set(this.toArray().concat(classNameToAdd).join(' ')); + }, + + remove: function(classNameToRemove) { + if (!this.include(classNameToRemove)) return; + this.set(this.select(function(className) { + return className != classNameToRemove; + }).join(' ')); + }, + + toString: function() { + return this.toArray().join(' '); + } +} + +Object.extend(Element.ClassNames.prototype, Enumerable); +var Field = { + clear: function() { + for (var i = 0; i < arguments.length; i++) + $(arguments[i]).value = ''; + }, + + focus: function(element) { + $(element).focus(); + }, + + present: function() { + for (var i = 0; i < arguments.length; i++) + if ($(arguments[i]).value == '') return false; + return true; + }, + + select: function(element) { + $(element).select(); + }, + + activate: function(element) { + element = $(element); + element.focus(); + if (element.select) + element.select(); + } +} + +/*--------------------------------------------------------------------------*/ + +var Form = { + serialize: function(form) { + var elements = Form.getElements($(form)); + var queryComponents = new Array(); + + for (var i = 0; i < elements.length; i++) { + var queryComponent = Form.Element.serialize(elements[i]); + if (queryComponent) + queryComponents.push(queryComponent); + } + + return queryComponents.join('&'); + }, + + getElements: function(form) { + form = $(form); + var elements = new Array(); + + for (tagName in Form.Element.Serializers) { + var tagElements = form.getElementsByTagName(tagName); + for (var j = 0; j < tagElements.length; j++) + elements.push(tagElements[j]); + } + return elements; + }, + + getInputs: function(form, typeName, name) { + form = $(form); + var inputs = form.getElementsByTagName('input'); + + if (!typeName && !name) + return inputs; + + var matchingInputs = new Array(); + for (var i = 0; i < inputs.length; i++) { + var input = inputs[i]; + if ((typeName && input.type != typeName) || + (name && input.name != name)) + continue; + matchingInputs.push(input); + } + + return matchingInputs; + }, + + disable: function(form) { + var elements = Form.getElements(form); + for (var i = 0; i < elements.length; i++) { + var element = elements[i]; + element.blur(); + element.disabled = 'true'; + } + }, + + enable: function(form) { + var elements = Form.getElements(form); + for (var i = 0; i < elements.length; i++) { + var element = elements[i]; + element.disabled = ''; + } + }, + + findFirstElement: function(form) { + return Form.getElements(form).find(function(element) { + return element.type != 'hidden' && !element.disabled && + ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); + }); + }, + + focusFirstElement: function(form) { + Field.activate(Form.findFirstElement(form)); + }, + + reset: function(form) { + $(form).reset(); + } +} + +Form.Element = { + serialize: function(element) { + element = $(element); + var method = element.tagName.toLowerCase(); + var parameter = Form.Element.Serializers[method](element); + + if (parameter) { + var key = encodeURIComponent(parameter[0]); + if (key.length == 0) return; + + if (parameter[1].constructor != Array) + parameter[1] = [parameter[1]]; + + return parameter[1].map(function(value) { + return key + '=' + encodeURIComponent(value); + }).join('&'); + } + }, + + getValue: function(element) { + element = $(element); + var method = element.tagName.toLowerCase(); + var parameter = Form.Element.Serializers[method](element); + + if (parameter) + return parameter[1]; + } +} + +Form.Element.Serializers = { + input: function(element) { + switch (element.type.toLowerCase()) { + case 'submit': + case 'hidden': + case 'password': + case 'text': + return Form.Element.Serializers.textarea(element); + case 'checkbox': + case 'radio': + return Form.Element.Serializers.inputSelector(element); + } + return false; + }, + + inputSelector: function(element) { + if (element.checked) + return [element.name, element.value]; + }, + + textarea: function(element) { + return [element.name, element.value]; + }, + + select: function(element) { + return Form.Element.Serializers[element.type == 'select-one' ? + 'selectOne' : 'selectMany'](element); + }, + + selectOne: function(element) { + var value = '', opt, index = element.selectedIndex; + if (index >= 0) { + opt = element.options[index]; + value = opt.value; + if (!value && !('value' in opt)) + value = opt.text; + } + return [element.name, value]; + }, + + selectMany: function(element) { + var value = new Array(); + for (var i = 0; i < element.length; i++) { + var opt = element.options[i]; + if (opt.selected) { + var optValue = opt.value; + if (!optValue && !('value' in opt)) + optValue = opt.text; + value.push(optValue); + } + } + return [element.name, value]; + } +} + +/*--------------------------------------------------------------------------*/ + +var $F = Form.Element.getValue; + +/*--------------------------------------------------------------------------*/ + +Abstract.TimedObserver = function() {} +Abstract.TimedObserver.prototype = { + initialize: function(element, frequency, callback) { + this.frequency = frequency; + this.element = $(element); + this.callback = callback; + + this.lastValue = this.getValue(); + this.registerCallback(); + }, + + registerCallback: function() { + setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); + }, + + onTimerEvent: function() { + var value = this.getValue(); + if (this.lastValue != value) { + this.callback(this.element, value); + this.lastValue = value; + } + } +} + +Form.Element.Observer = Class.create(); +Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.Observer = Class.create(); +Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { + getValue: function() { + return Form.serialize(this.element); + } +}); + +/*--------------------------------------------------------------------------*/ + +Abstract.EventObserver = function() {} +Abstract.EventObserver.prototype = { + initialize: function(element, callback) { + this.element = $(element); + this.callback = callback; + + this.lastValue = this.getValue(); + if (this.element.tagName.toLowerCase() == 'form') + this.registerFormCallbacks(); + else + this.registerCallback(this.element); + }, + + onElementEvent: function() { + var value = this.getValue(); + if (this.lastValue != value) { + this.callback(this.element, value); + this.lastValue = value; + } + }, + + registerFormCallbacks: function() { + var elements = Form.getElements(this.element); + for (var i = 0; i < elements.length; i++) + this.registerCallback(elements[i]); + }, + + registerCallback: function(element) { + if (element.type) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + Event.observe(element, 'click', this.onElementEvent.bind(this)); + break; + case 'password': + case 'text': + case 'textarea': + case 'select-one': + case 'select-multiple': + Event.observe(element, 'change', this.onElementEvent.bind(this)); + break; + } + } + } +} + +Form.Element.EventObserver = Class.create(); +Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.EventObserver = Class.create(); +Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { + getValue: function() { + return Form.serialize(this.element); + } +}); +if (!window.Event) { + var Event = new Object(); +} + +Object.extend(Event, { + KEY_BACKSPACE: 8, + KEY_TAB: 9, + KEY_RETURN: 13, + KEY_ESC: 27, + KEY_LEFT: 37, + KEY_UP: 38, + KEY_RIGHT: 39, + KEY_DOWN: 40, + KEY_DELETE: 46, + + element: function(event) { + return event.target || event.srcElement; + }, + + isLeftClick: function(event) { + return (((event.which) && (event.which == 1)) || + ((event.button) && (event.button == 1))); + }, + + pointerX: function(event) { + return event.pageX || (event.clientX + + (document.documentElement.scrollLeft || document.body.scrollLeft)); + }, + + pointerY: function(event) { + return event.pageY || (event.clientY + + (document.documentElement.scrollTop || document.body.scrollTop)); + }, + + stop: function(event) { + if (event.preventDefault) { + event.preventDefault(); + event.stopPropagation(); + } else { + event.returnValue = false; + event.cancelBubble = true; + } + }, + + // find the first node with the given tagName, starting from the + // node the event was triggered on; traverses the DOM upwards + findElement: function(event, tagName) { + var element = Event.element(event); + while (element.parentNode && (!element.tagName || + (element.tagName.toUpperCase() != tagName.toUpperCase()))) + element = element.parentNode; + return element; + }, + + observers: false, + + _observeAndCache: function(element, name, observer, useCapture) { + if (!this.observers) this.observers = []; + if (element.addEventListener) { + this.observers.push([element, name, observer, useCapture]); + element.addEventListener(name, observer, useCapture); + } else if (element.attachEvent) { + this.observers.push([element, name, observer, useCapture]); + element.attachEvent('on' + name, observer); + } + }, + + unloadCache: function() { + if (!Event.observers) return; + for (var i = 0; i < Event.observers.length; i++) { + Event.stopObserving.apply(this, Event.observers[i]); + Event.observers[i][0] = null; + } + Event.observers = false; + }, + + observe: function(element, name, observer, useCapture) { + var element = $(element); + useCapture = useCapture || false; + + if (name == 'keypress' && + (navigator.appVersion.match(/Konqueror|Safari|KHTML/) + || element.attachEvent)) + name = 'keydown'; + + this._observeAndCache(element, name, observer, useCapture); + }, + + stopObserving: function(element, name, observer, useCapture) { + var element = $(element); + useCapture = useCapture || false; + + if (name == 'keypress' && + (navigator.appVersion.match(/Konqueror|Safari|KHTML/) + || element.detachEvent)) + name = 'keydown'; + + if (element.removeEventListener) { + element.removeEventListener(name, observer, useCapture); + } else if (element.detachEvent) { + element.detachEvent('on' + name, observer); + } + } +}); + +/* prevent memory leaks in IE */ +Event.observe(window, 'unload', Event.unloadCache, false); +var Position = { + // set to true if needed, warning: firefox performance problems + // NOT neeeded for page scrolling, only if draggable contained in + // scrollable elements + includeScrollOffsets: false, + + // must be called before calling withinIncludingScrolloffset, every time the + // page is scrolled + prepare: function() { + this.deltaX = window.pageXOffset + || document.documentElement.scrollLeft + || document.body.scrollLeft + || 0; + this.deltaY = window.pageYOffset + || document.documentElement.scrollTop + || document.body.scrollTop + || 0; + }, + + realOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.scrollTop || 0; + valueL += element.scrollLeft || 0; + element = element.parentNode; + } while (element); + return [valueL, valueT]; + }, + + cumulativeOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + return [valueL, valueT]; + }, + + positionedOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + p = Element.getStyle(element, 'position'); + if (p == 'relative' || p == 'absolute') break; + } + } while (element); + return [valueL, valueT]; + }, + + offsetParent: function(element) { + if (element.offsetParent) return element.offsetParent; + if (element == document.body) return element; + + while ((element = element.parentNode) && element != document.body) + if (Element.getStyle(element, 'position') != 'static') + return element; + + return document.body; + }, + + // caches x/y coordinate pair to use with overlap + within: function(element, x, y) { + if (this.includeScrollOffsets) + return this.withinIncludingScrolloffsets(element, x, y); + this.xcomp = x; + this.ycomp = y; + this.offset = this.cumulativeOffset(element); + + return (y >= this.offset[1] && + y < this.offset[1] + element.offsetHeight && + x >= this.offset[0] && + x < this.offset[0] + element.offsetWidth); + }, + + withinIncludingScrolloffsets: function(element, x, y) { + var offsetcache = this.realOffset(element); + + this.xcomp = x + offsetcache[0] - this.deltaX; + this.ycomp = y + offsetcache[1] - this.deltaY; + this.offset = this.cumulativeOffset(element); + + return (this.ycomp >= this.offset[1] && + this.ycomp < this.offset[1] + element.offsetHeight && + this.xcomp >= this.offset[0] && + this.xcomp < this.offset[0] + element.offsetWidth); + }, + + // within must be called directly before + overlap: function(mode, element) { + if (!mode) return 0; + if (mode == 'vertical') + return ((this.offset[1] + element.offsetHeight) - this.ycomp) / + element.offsetHeight; + if (mode == 'horizontal') + return ((this.offset[0] + element.offsetWidth) - this.xcomp) / + element.offsetWidth; + }, + + clone: function(source, target) { + source = $(source); + target = $(target); + target.style.position = 'absolute'; + var offsets = this.cumulativeOffset(source); + target.style.top = offsets[1] + 'px'; + target.style.left = offsets[0] + 'px'; + target.style.width = source.offsetWidth + 'px'; + target.style.height = source.offsetHeight + 'px'; + }, + + page: function(forElement) { + var valueT = 0, valueL = 0; + + var element = forElement; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + + // Safari fix + if (element.offsetParent==document.body) + if (Element.getStyle(element,'position')=='absolute') break; + + } while (element = element.offsetParent); + + element = forElement; + do { + valueT -= element.scrollTop || 0; + valueL -= element.scrollLeft || 0; + } while (element = element.parentNode); + + return [valueL, valueT]; + }, + + clone: function(source, target) { + var options = Object.extend({ + setLeft: true, + setTop: true, + setWidth: true, + setHeight: true, + offsetTop: 0, + offsetLeft: 0 + }, arguments[2] || {}) + + // find page position of source + source = $(source); + var p = Position.page(source); + + // find coordinate system to use + target = $(target); + var delta = [0, 0]; + var parent = null; + // delta [0,0] will do fine with position: fixed elements, + // position:absolute needs offsetParent deltas + if (Element.getStyle(target,'position') == 'absolute') { + parent = Position.offsetParent(target); + delta = Position.page(parent); + } + + // correct by body offsets (fixes Safari) + if (parent == document.body) { + delta[0] -= document.body.offsetLeft; + delta[1] -= document.body.offsetTop; + } + + // set position + if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; + if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; + if(options.setWidth) target.style.width = source.offsetWidth + 'px'; + if(options.setHeight) target.style.height = source.offsetHeight + 'px'; + }, + + absolutize: function(element) { + element = $(element); + if (element.style.position == 'absolute') return; + Position.prepare(); + + var offsets = Position.positionedOffset(element); + var top = offsets[1]; + var left = offsets[0]; + var width = element.clientWidth; + var height = element.clientHeight; + + element._originalLeft = left - parseFloat(element.style.left || 0); + element._originalTop = top - parseFloat(element.style.top || 0); + element._originalWidth = element.style.width; + element._originalHeight = element.style.height; + + element.style.position = 'absolute'; + element.style.top = top + 'px';; + element.style.left = left + 'px';; + element.style.width = width + 'px';; + element.style.height = height + 'px';; + }, + + relativize: function(element) { + element = $(element); + if (element.style.position == 'relative') return; + Position.prepare(); + + element.style.position = 'relative'; + var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); + var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); + + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.height = element._originalHeight; + element.style.width = element._originalWidth; + } +} + +// Safari returns margins on body which is incorrect if the child is absolutely +// positioned. For performance reasons, redefine Position.cumulativeOffset for +// KHTML/WebKit only. +if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) { + Position.cumulativeOffset = function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + if (element.offsetParent == document.body) + if (Element.getStyle(element, 'position') == 'absolute') break; + + element = element.offsetParent; + } while (element); + + return [valueL, valueT]; + } +} \ No newline at end of file diff --git a/lightbox/js/scriptaculous.js b/lightbox/js/scriptaculous.js new file mode 100755 index 0000000..dac1228 --- /dev/null +++ b/lightbox/js/scriptaculous.js @@ -0,0 +1,45 @@ +// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +var Scriptaculous = { + Version: '1.5.1', + require: function(libraryName) { + // inserting via DOM fails in Safari 2.0, so brute force approach + document.write(''); + }, + load: function() { + if((typeof Prototype=='undefined') || + parseFloat(Prototype.Version.split(".")[0] + "." + + Prototype.Version.split(".")[1]) < 1.4) + throw("script.aculo.us requires the Prototype JavaScript framework >= 1.4.0"); + + $A(document.getElementsByTagName("script")).findAll( function(s) { + return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/)) + }).each( function(s) { + var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,''); + var includes = s.src.match(/\?.*load=([a-z,]*)/); + (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each( + function(include) { Scriptaculous.require(path+include+'.js') }); + }); + } +} + +Scriptaculous.load(); \ No newline at end of file diff --git a/modules/Makefile b/modules/Makefile new file mode 100755 index 0000000..1675c83 --- /dev/null +++ b/modules/Makefile @@ -0,0 +1,52 @@ +# Répertoire dans lequel se trouve les modules compilés (beam) +rep_ebin = ebin + +# Répertoire dans lequel se trouve les fichiers sources +rep_erl = erl + +# Répertoire dans lequel se trouve les fichier hrl (définition de record) +rep_include = include + +# Paramètre du compilateur +erlc_params = -I $(rep_include) -o $(rep_ebin) $< + +# Compilation de toute l'application euphorik +all: $(rep_ebin)/euphorik_bd.beam \ +$(rep_ebin)/minichat.beam \ +$(rep_ebin)/euphorik_requests.beam \ +$(rep_ebin)/euphorik_protocole.beam \ +$(rep_ebin)/captcha.beam \ +$(rep_ebin)/euphorik_format.beam \ +$(rep_ebin)/euphorik_deamon.beam + +# Module pour la gestion de la BD, principalement la création +$(rep_ebin)/euphorik_bd.beam: $(rep_erl)/euphorik_bd.erl $(rep_include)/euphorik_bd.hrl + erlc $(erlc_params) + +# Module permettant l'ajout et la demande de message dans le minichat +$(rep_ebin)/minichat.beam: $(rep_erl)/minichat.erl $(rep_include)/euphorik_bd.hrl + erlc $(erlc_params) + +# Module traitant les requêtes AJAX du client javascript d'euphorik +$(rep_ebin)/euphorik_requests.beam: $(rep_erl)/euphorik_requests.erl + erlc $(erlc_params) + +# Module interpretant les messages XML du client +$(rep_ebin)/euphorik_protocole.beam: $(rep_erl)/euphorik_protocole.erl + erlc $(erlc_params) + +# Module pour la génération du captcha +$(rep_ebin)/captcha.beam: $(rep_erl)/captcha.erl + erlc $(erlc_params) + +# Module pour le formatage +$(rep_ebin)/euphorik_format.beam: $(rep_erl)/euphorik_format.erl + erlc $(erlc_params) + +# Module effectuant periodiquement certaines tâches +$(rep_ebin)/euphorik_deamon.beam: $(rep_erl)/euphorik_deamon.erl + erlc $(erlc_params) + +# Suppression des modules compilés +clean: + rm ebin/*.beam \ No newline at end of file diff --git a/modules/erl/captcha.erl b/modules/erl/captcha.erl new file mode 100755 index 0000000..e885239 --- /dev/null +++ b/modules/erl/captcha.erl @@ -0,0 +1,31 @@ +% Module permettant la génération de captcha. +% Dépend de la lib 'erlycairo', il faut que son c-node soit démarré. +% Auteur : G.Burri +% Date : 05.11.2007 + +-module(captcha). +-export([create/2]). + +-include("../include/euphorik_defines.hrl"). + + +% Crée un captcha de longueur L dans le dossier Dossier. +% renvoie {Mot crypté:string(), Nom du fichier:string()} +create(L, Dossier) -> + Mot = common:generer_mot(L), + Mot_crypt = common:crypt(Mot), + Nom_fichier = Mot_crypt ++ ".png", + erlycairo:new_image_blank(length(Mot) * 8, 14), + erlycairo:set_source_rgba(0, 0, 0, 1), + erlycairo:select_font_face("Courier", 0, 1), + erlycairo:set_font_size(12), + erlycairo:move_to(2, 10), + erlycairo:show_text(Mot), + erlycairo:move_to(2, 10), + erlycairo:line_to(length(Mot) * 8 - 2, 10), + erlycairo:set_line_width(1), + erlycairo:stroke(), + erlycairo:write_to_png(Dossier ++ "/" ++ Nom_fichier), + erlycairo:close_image(), + {Mot_crypt, Nom_fichier}. + \ No newline at end of file diff --git a/modules/erl/euphorik_bd.erl b/modules/erl/euphorik_bd.erl new file mode 100755 index 0000000..39825bd --- /dev/null +++ b/modules/erl/euphorik_bd.erl @@ -0,0 +1,75 @@ +% Module de création de la base de données euphorik. +% Auteur : G.Burri +% Date : 14.10.2007 + +-module(euphorik_bd). +-export([create/0, create_tables/0, vers_version2/0, vers_version3/0, peupler/0, tester/0]). + +-include("../include/euphorik_bd.hrl"). + + +create() -> + mnesia:stop(), + mnesia:delete_schema([node()]), + mnesia:create_schema([node()]), % nécessaire pour les tables sur disc + mnesia:start(), + create_tables(). + + +create_tables() -> + mnesia:create_table(counter, [ + {attributes, record_info(fields, counter)}, + {disc_copies, [yaws@overnux]} + ]), + mnesia:create_table(minichat, [ + {attributes, record_info(fields, minichat)}, + {index, [auteur_id]}, + {disc_copies, [yaws@overnux]} + ]), + mnesia:create_table(reponse_minichat, [ + {type, bag}, + {attributes, record_info(fields, reponse_minichat)}, + {index, [cible]}, + {disc_copies, [yaws@overnux]} + ]), + mnesia:create_table(user, [ + {attributes, record_info(fields, user)}, + {index, [cookie, login]}, + {disc_copies, [yaws@overnux]} + ]). + + +vers_version2() -> + mnesia:transform_table( + user, + fun({user, Id, Cookie, Pseudo, Date_creation, Date_derniere_connexion, Css}) -> + {user, Id, Cookie, Pseudo, "", "", "", Date_creation, Date_derniere_connexion, Css} + end, + record_info(fields, user), + user + ). + +vers_version3() -> + mnesia:transform_table( + user, + fun({user, Id, Cookie, Pseudo, Login, Password, Email, Date_creation, Date_derniere_connexion, Css}) -> + {user, Id, Cookie, Pseudo, Login, Password, Email, Date_creation, Date_derniere_connexion, Css, 0} + end, + record_info(fields, user), + user + ). + + +% exemple de peuplage de la BD, utilisé pour les tests +peupler() -> + mnesia:transaction( + fun() -> + mnesia:write({minichat, now(), "Pierre", "Salut tout le monde"}), + mnesia:write({minichat, now(), "Paul", "Salut à toi !"}) + end + ). + + +tester() -> + ok. + diff --git a/modules/erl/euphorik_deamon.erl b/modules/erl/euphorik_deamon.erl new file mode 100755 index 0000000..a957475 --- /dev/null +++ b/modules/erl/euphorik_deamon.erl @@ -0,0 +1,25 @@ +% Module tournant en background s'occupant periodiquement de certaines tâches. +% Auteur : G.Burri +% Date : 05.11.2007 + +-module(euphorik_deamon). +-export([start/1]). + +% L'age max que peut avoir les fichier se trouvant dans le dossier 'tmp' (en second) +-define(AGE_MAX_TMP, 86400). % 24 heures + +% Démarre le démon +start(A) -> + loop(A). + + +loop(A) -> + verifier_tmp_captcha(), + timer:sleep(100000), % attend 100 secondes + loop(A). + + +% Vérifie le repertoire tmp où se trouve les captcha et efface les plus vieux. +verifier_tmp_captcha() -> + ok. + \ No newline at end of file diff --git a/modules/erl/euphorik_format.erl b/modules/erl/euphorik_format.erl new file mode 100755 index 0000000..3d60eb1 --- /dev/null +++ b/modules/erl/euphorik_format.erl @@ -0,0 +1,67 @@ +% Attention : Ce module n'est plus utilisé, les fonctions ont été déportées vers le client +% Ce module permet de formater le contenu d'un message : +% - Ajout de balise HTML pour les URL +% - Substitution des smiles par des images +% - Cleanage du contenu des balises HTML +% +% Auteur : G.Burri +% Date : 12.11.2007 + +-module(euphorik_format). +-export([smiles/0, formater_contenu_message/1]). + + +smiles() -> + [ + {":\\)", "smile"}, + {":D", "bigsmile"}, + {"\\[:argn\\]", "argn"}, + {"\\[:lapin\\]", "bunny"}, + {"\\[:chat\\]", "chat"}, + {";\\)", "clin"}, + {"8\\)", "cool"}, + {":P", "eheheh"}, + {"\\[:lol\\]", "lol"}, + {":o", "oh"}, + {">\\(", "pascontent"}, + {"\\[:renne\\]", "renne"}, + {":\\(", "sniff"}, + {"\\[:spliff\\]", "spliff"}, + {"\\[:star\\]", "star"}, + {"\\[:triste\\]", "triste"} + ]. + + +traiter_smiles(M) -> + lists:foldr( + fun({Symbole, Nom}, A) -> + case regexp:gsub(A, Symbole, "") of + {ok, R, _} -> R; + _ -> "ERREUR" + end + end, + M, + smiles() + ). + + + +virer_balises_html(M) -> + case regexp:gsub(M, "]*>", "") of + {ok, R, _} -> R; + _ -> erreur + end. + + +traiter_url(M) -> + case regexp:gsub(M, "http://[^ ]*", "[url]") of + {ok, R, _} -> R; + _ -> erreur + end. + + +formater_contenu_message(M) -> + string:strip(traiter_smiles(traiter_url(virer_balises_html(M)))). + + + diff --git a/modules/erl/euphorik_protocole.erl b/modules/erl/euphorik_protocole.erl new file mode 100755 index 0000000..66555e0 --- /dev/null +++ b/modules/erl/euphorik_protocole.erl @@ -0,0 +1,362 @@ +% coding: utf-8 +% Ce module gére les différents message envoyé par le client (javascript) +% Par exemple le client peut demander les derniers messages du minichat. +% Les messages sont au format XML, la plus part des fonctions accepte un xmlDocument() et renvoie un string() +% qui est la réponse XML. +% Example XML : http://www.erlang.org/doc/apps/xmerl/xmerl_ug.html +% Auteur : G.Burri +% Date : 29.10.2007 + +-module(euphorik_protocole). +-export([ + generation_captcha/1, + nouveau_user_captcha/1, + nouveau_user_login/1, + login/1, + logout/1, + profile/1, + refreshMessage/1, + message/1 +]). +-include_lib("xmerl/include/xmerl.hrl"). +-include("../include/euphorik_bd.hrl"). +-include("../include/euphorik_defines.hrl"). +%-compile(export_all). + + +% Génère un nouveau captchat dans ?DOSSIER_CAPTCHA +generation_captcha(_) -> + {Mot_crypt, Nom_fichier} = captcha:create(5, ?DOSSIER_CAPTCHA), + simple_xml_to_string(xml_reponse_generation_captcha(?DOSSIER_CAPTCHA_RELATIF "/" ++ Nom_fichier, Mot_crypt)). + + +% Un nouvel utilisateur doit être créé +% Action est un xmlElement() +nouveau_user_captcha(Action) -> + simple_xml_to_string( + case {xmerl_xpath:string("captchaCrypt", Action), xmerl_xpath:string("captchaInput", Action)} of + {[#xmlElement{content = [#xmlText{value = C1}]}], [#xmlElement{content = [#xmlText{value = C2}]}]} -> + C2_crypt = common:crypt(C2), + if C1 =:= C2_crypt -> + Cookie = generer_cookie(), + User = minichat:nouveau_user("Paul", Cookie), + xml_reponse_login_ok(User); + true -> + xml_reponse_login_pas_ok("Captcha incorrect") + end; + _ -> + xml_reponse_login_pas_ok("XML malformé") + end + ). + +nouveau_user_login(Action) -> + {Login, Password, Login_deja_pris} = case {xmerl_xpath:string("login", Action), xmerl_xpath:string("password", Action)} of + {[#xmlElement{content = [#xmlText{value = L}]}], [#xmlElement{content = [#xmlText{value = P}]}]} -> + {L, P, case minichat:get_user_by_login(L) of {ok, _} -> true; _ -> false end}; + _ -> {[], [], false} + end, + simple_xml_to_string( + if Login_deja_pris-> + xml_reponse_login_pas_ok("Login déjà pris"); + true -> + Cookie = generer_cookie(), + User = minichat:nouveau_user(Login, Password, Cookie), + xml_reponse_login_ok(User) + end + ). + + +% Un utilisateur se logge +login(Action) -> + case xmerl_xpath:string("cookie", Action) of + [#xmlElement{content = [#xmlText{value = Cookie}]}] -> + loginUser(minichat:get_user_by_cookie(Cookie)); + _ -> + case {xmerl_xpath:string("login", Action), xmerl_xpath:string("password", Action)} of + {[#xmlElement{content = [#xmlText{value = Login}]}], [#xmlElement{content = [#xmlText{value = Password}]}]} -> + loginUser(minichat:get_user_by_login_password(Login, Password)); + _ -> + simple_xml_to_string(xml_reponse_login_pas_ok("XML malformé")) + end + end. +loginUser({ok, User}) -> + minichat:update_date_derniere_connexion(User#user.id), + simple_xml_to_string(xml_reponse_login_ok(User)); +loginUser(_) -> + simple_xml_to_string(xml_reponse_login_pas_ok("Erreur de login")). + + +% Renvoie un string() représentant un cookie en base 36. Il y a 10^32 possibillités. +generer_cookie() -> + {A1,A2,A3} = now(), + random:seed(A1, A2, A3), + erlang:integer_to_list(random:uniform(math:pow(10, 32)), 36). + + +% Un utilisateur se délogge. +logout(_) -> + do_nothing. + + +% Modification du profile. +profile(Action) -> + simple_xml_to_string( + case xmerl_xpath:string("cookie", Action) of + [#xmlElement{content = [#xmlText{value = Cookie}]}] -> + Login = case xmerl_xpath:string("login", Action) of [#xmlElement{content = [#xmlText{value = L}]}] -> L; _ -> undefined end, + Password = case xmerl_xpath:string("password", Action) of [#xmlElement{content = [#xmlText{value = P}]}] -> P; _ -> undefined end, + Pseudo = case xmerl_xpath:string("pseudo", Action) of [#xmlElement{content = [#xmlText{value = P2}]}] -> P2; _ -> Login end, + Email = case xmerl_xpath:string("email", Action) of [#xmlElement{content = [#xmlText{value = E}]}] -> E; _ -> undefined end, + Css = case xmerl_xpath:string("css", Action) of [#xmlElement{content = [#xmlText{value = C}]}] -> C; _ -> undefined end, + case minichat:set_profile(Cookie, Login, Password, Pseudo, Email, Css) of + ok -> + xml_reponse_profile_ok(); + login_deja_pris -> + xml_reponse_profile_pas_ok("Login déjà pris"); + _ -> + xml_reponse_profile_pas_ok("Impossible de mettre à jour le profile") + end; + _ -> + xml_reponse_profile_pas_ok("XML malformé") + end + ). + + +% Renvoie les messages appropriés. +refreshMessage(Action) -> + simple_xml_to_string( + case { + xmerl_xpath:string("nombreMessage", Action), % le nombre de message qu'affiche le client + xmerl_xpath:string("page", Action) % la page désiré, la première (les derniers messages) étant la 1 + } of + { + [#xmlElement{content = [#xmlText{value = Nb_message_str}]}], + [#xmlElement{content = [#xmlText{value = Page_str}]}] + } -> + Nb_message = list_to_integer(Nb_message_str), + Page = list_to_integer(Page_str), + Dernier_id = case xmerl_xpath:string("dernierMessageId", Action) of % l'id du dernier message que connait le client + [#xmlElement{content = [#xmlText{value = D}]}] -> erlang:list_to_integer(D, 36); + _ -> 0 + end, + User = case xmerl_xpath:string("cookie", Action) of + [#xmlElement{content = [#xmlText{value = Cookie}]}] -> + case minichat:get_user_by_cookie(Cookie) of + {ok, U} -> U; + _ -> inconnu + end; + _ -> inconnu + end, + % accrochez-vous ca va siouxer ;) + Mess = lists:map( + fun(Mess) -> + Est_proprietaire = User =/= inconnu andalso User#user.id =:= Mess#minichat.auteur_id, + A_repondu_a_message = User =/= inconnu andalso minichat:a_repondu_a_message(User#user.id, Mess#minichat.id), + Est_une_reponse_a_user = User =/= inconnu andalso minichat:est_une_reponse_a_user(User#user.id, Mess#minichat.id), + User_mess = if Mess#minichat.auteur_id =:= 0 -> inconnu; true -> + {ok, U2} = minichat:get_user_by_id(Mess#minichat.auteur_id), + U2 + end, + {message, [{id, erlang:integer_to_list(Mess#minichat.id, 36)}], + [ + {date, [], [format_date(Mess#minichat.date)]}, + {systeme, [], [atom_to_list(Mess#minichat.auteur_id =:= 0)]}, + {proprietaire, [], [atom_to_list(Est_proprietaire)]}, + {repondu, [], [atom_to_list(A_repondu_a_message)]}, + {reponse, [], [atom_to_list(Est_une_reponse_a_user)]}, + {pseudo, [], [Mess#minichat.pseudo]}, + {login, [], [if User_mess =:= inconnu -> Mess#minichat.pseudo; true -> User_mess#user.login end]}, + {contenu, [], [Mess#minichat.contenu]}, + {repondA, [], xml_repond_a(Mess#minichat.id)} + ] + } + end, + get_dernieres_messages(Dernier_id, Nb_message, Page) + ), + [{reponse, [{name, "refreshMessages"}], + % la fonction get_nb_page DOIT être évalué après get_dernieres_messages (merci les effets de bord) + [{nbPage, [], [integer_to_list(minichat:get_nb_page(Nb_message))]} | Mess] + }]; + _ -> + [{reponse, [{name, "refreshMessages"}], [{erreur, [], ["erreur"]}]}] + end + ). + + +% Renvoie les dernies messages, s'il n'y en a pas on effectue une attente. +get_dernieres_messages(Dernier_id, Nb_message, Page) -> + Messages = minichat:messages(Dernier_id, Nb_message, Page), + if Messages =:= [] -> + minichat:attends_nouveau_messages(), + minichat:messages(Dernier_id, Nb_message, Page); + true -> + Messages + end. + +% Prend une liste de xml text node et en resort un string() +% xmerl : "test & test" devient deux fragments de texte : "test " et "& test", il faut donc rassembler les morceaux... +defragmenter(Text_nodes) -> + lists:foldl(fun(Node, Acc) -> #xmlText{value = V} = Node, Acc ++ V end, [], Text_nodes). + + +% Un utilisateur envoie un message +message(Action) -> + simple_xml_to_string( + case { + xmerl_xpath:string("cookie", Action), + xmerl_xpath:string("pseudo", Action), + xmerl_xpath:string("contenu", Action) + } of + { + [#xmlElement{content = [#xmlText{value = Cookie}]}], + [#xmlElement{content = Pseudo_fragments}], + [#xmlElement{content = Contenu_fragments}] + } -> + case minichat:get_user_by_cookie(Cookie) of + {ok, U} -> + Pseudo = defragmenter(Pseudo_fragments), + Contenu = defragmenter(Contenu_fragments), + % met à jour le pseudo du user + minichat:update_pseudo_user(U#user.id, Pseudo), + Reponses = case xmerl_xpath:string("reponses", Action) of + [#xmlElement{content = C}] -> + lists:map( + fun (Reponse) -> + #xmlElement{attributes = [#xmlAttribute{name = id, value = Id_reponse}]} = Reponse, + erlang:list_to_integer(Id_reponse, 36) + end + , C); + _ -> [] + end, + Contenu_strip = string:strip(Contenu), + if Contenu_strip =:= [] -> xml_reponse_message(pas_ok); + true -> + case minichat:nouveau_message(Contenu, U#user.id, Reponses) of + erreur -> xml_reponse_message(pas_ok); + _ -> xml_reponse_message(ok) + end + end; + _ -> xml_reponse_message(pas_ok) + end; + _ -> + xml_reponse_message(pas_ok) + end + ). + + +% Formatage d'une heure +% local_time() -> string +format_date(Date) -> + DateLocal = calendar:now_to_local_time(Date), + DateNowLocal = calendar:local_time(), + {{Annee, Mois, Jour}, {Heure, Minute, Seconde}} = DateLocal, + {{AnneeNow, _, _}, {_, _, _}} = DateNowLocal, + Hier = calendar:date_to_gregorian_days(element(1, DateLocal)) =:= calendar:date_to_gregorian_days(element(1, DateNowLocal)) - 1, + if element(1, DateLocal) =:= element(1, DateNowLocal) -> + ""; + Hier -> + "Hier "; + Annee =:= AnneeNow -> + io_lib:format("~2.10.0B/~2.10.0B ", [Jour, Mois]); + true -> + io_lib:format("~2.10.0B/~2.10.0B/~B ", [Jour, Mois, Annee]) + end ++ + io_lib:format("~2.10.0B:~2.10.0B:~2.10.0B", [Heure, Minute, Seconde]). + + +%%%%%%%%% %%%%%%%%% +simple_xml_to_string(XML) -> + lists:flatten(xmerl:export_simple(XML, xmerl_xml, [{prolog, ["\n"]}])). + + +% Construit une réponse positive à un login +% si Enregistre vaut true alors cela veut dire que la personne s'est enregistré (elle possède au moins un login et un password) +xml_reponse_login_ok(User) -> + [{reponse, [{name, "login"}], + [ + {statut, [if (User#user.password =/= []) and (User#user.login =/= []) -> "enregistre"; true -> "identifie" end]}, + {cookie, [User#user.cookie]}, + {id, [erlang:integer_to_list(User#user.id, 36)]}, + {pseudo, [User#user.pseudo]}, + {login, [User#user.login]}, + {email, [User#user.email]}, + {css, [User#user.css]} + ] + }]. + + +% Construit un réponse négative à un login +xml_reponse_login_pas_ok(Message) -> + [{reponse, [{name, "login"}], + [ + {statut, ["erreur"]}, + {information, [Message]} + ] + }]. + + +xml_reponse_profile_ok() -> + [{reponse, [{name, "profile"}], + [ + {statut, ["ok"]} + ] + }]. + + +xml_reponse_profile_pas_ok(Message) -> + [{reponse, [{name, "profile"}], + [ + {statut, ["pas ok"]}, + {information, [Message]} + ] + }]. + + +% Pas utilisé +%~ xml_conversation(Mess_id, Nb) -> + %~ {Mess_id, Conversation} = minichat:conversation(Mess_id, Nb), + %~ xml_conversation(Conversation). +%~ xml_conversation([]) -> []; +%~ xml_conversation(Liste_id) -> + %~ lists:map( + %~ fun({Id, Sous_liste}) -> + %~ {id, [{id, erlang:integer_to_list(Id, 36)}], xml_conversation(Sous_liste)} + %~ end, + %~ Liste_id + %~ ). + + +% Renvoie un element XML representant une liste de messages auquel le message M_id repond +xml_repond_a(Mess_id) -> + lists:map( + fun(M) -> + {ok, User} = minichat:get_user_by_id(M#minichat.auteur_id), + {id, [{id, erlang:integer_to_list(M#minichat.id, 36)}, {pseudo, M#minichat.pseudo}, {login, User#user.login}], []} + end, + minichat:repond_a(Mess_id) + ). + + +xml_reponse_message(Ok) -> + [ + {reponse, [{name, "message"}], + [ + {statut, [], [case Ok of ok -> "ok"; pas_ok -> "pas ok" end]} + ] + } + ]. + +xml_reponse_generation_captcha(Chemin, Captcha) -> + [ + {reponse, [{name, "generationCaptcha"}], + [ + {chemin, [], [Chemin]}, + {captchaCrypt, [], [Captcha]} + ] + } + ]. +%%%%%%%%% %%%%%%%%% + + + + diff --git a/modules/erl/euphorik_requests.erl b/modules/erl/euphorik_requests.erl new file mode 100755 index 0000000..a289f0d --- /dev/null +++ b/modules/erl/euphorik_requests.erl @@ -0,0 +1,82 @@ +% coding: utf-8 +% Ce module est fait pour répondre à des requêtes 'AJAX'. +% Auteur : G.Burri +% Date : 22.10.2007 + +-module(euphorik_requests). +-export([ + tester/0, + out/1 +]). + +-include_lib("xmerl/include/xmerl.hrl"). +-include_lib("yaws/include/yaws_api.hrl"). + +% Test du module +tester() -> + %~ {XML, _} = xmerl_scan:string( + %~ "" + %~ " b1b1b4e72e6f3d00e477cf37cced5851" + %~ " LKJDLA" + %~ ""), + %~ io:format("Nouvel user : ~p~n", [nouveau_user(XML)]). + + {XML2, _} = xmerl_scan:string( + "" + " 5DZQ2HCRO7JIX3QCSWRNL" + ""), + io:format("Login : ~p~n", [euphorik_protocole:login(XML2)]). + + %~ {XML, _} = xmerl_scan:string( + %~ "" + %~ "5" + %~ "1" + %~ ""), + %~ io:format("Messages de la premières page : ~p~n", [euphorik_protocole:refreshMessage(XML)]). + + %~ traiter_xml("" + %~ "4UDUSY6Z2IZNTQO484S8X" + %~ "Pifou" + %~ "test & plop" + %~ ""). + %~ traiter_xml( + %~ "" + %~ ""). + +% il faut catcher toutes les exceptions possibles +out(A) -> + %inet:setopts(A#arg.clisock, inet:getopts(A#arg.clisock, [active])), + {value, {_, Contenu}} = lists:keysearch("action", 1, yaws_api:parse_post(A)), + Ret = traiter_xml(Contenu), + {content, "text/xml", Ret}. + + +traiter_xml(Contenu) -> + {XML, _} = xmerl_scan:string(Contenu), + traiter_action(XML#xmlElement.attributes, XML). + + +% un client demande la génération d'un captcha +traiter_action([#xmlAttribute{value="generationCaptcha"}], XML) -> + euphorik_protocole:generation_captcha(XML); +% un client se log pour la première fois +traiter_action([#xmlAttribute{value="loginCaptcha"}], XML) -> + euphorik_protocole:nouveau_user_captcha(XML); +% un client s'enregistre (pseudo + password) +traiter_action([#xmlAttribute{value="register"}], XML) -> + euphorik_protocole:nouveau_user_login(XML); +% authentification d'un client +traiter_action([#xmlAttribute{value="login"}], XML) -> + euphorik_protocole:login(XML); +% modification du profile +traiter_action([#xmlAttribute{value="profile"}], XML) -> + euphorik_protocole:profile(XML); +% le client désire les messages +traiter_action([#xmlAttribute{value="refreshMessages"}], XML) -> + euphorik_protocole:refreshMessage(XML); +% envoie d'un message +traiter_action([#xmlAttribute{value="message"}], XML) -> + euphorik_protocole:message(XML). + + + diff --git a/modules/erl/minichat.erl b/modules/erl/minichat.erl new file mode 100755 index 0000000..29fb4d7 --- /dev/null +++ b/modules/erl/minichat.erl @@ -0,0 +1,445 @@ +% coding: utf-8 +% Ce module permet de gérer les données persistantes lié au minichat d'euphorik.ch +% Il permet d'ajouter des message, de demande les messages sur une page donnée, etc.. +% Ce module utilise la base mnesia créée par le module euphorik_bd. +% Auteur : G.Burri +% Date : 22.10.2007 + +-module(minichat). +-export([ + connect/0, + % get : + messages/1, + messages/2, + messages/3, + conversation/2, + reponses/0, + repond_a/1, + get_nb_page/1, + users/0, + get_user_by_cookie/1, + get_user_by_id/1, + get_user_by_login/1, + get_user_by_login_password/2, + possede_message/2, + a_repondu_a_message/2, + est_une_reponse_a_user/2, + % set : + update_pseudo_user/2, + set_profile/6, + update_date_derniere_connexion/1, + nouveau_user/2, + nouveau_user/3, + nouveau_message/3, + % autre : + attends_nouveau_messages/0, + tester/0, + reset/0]). + +-include("../include/euphorik_bd.hrl"). +-include_lib("stdlib/include/qlc.hrl"). + +% Un message est considéré comme du spam s'il est posté 1 seconde ou moins après le dernier posté +-define(DUREE_SPAM, 1000). % ms + +% Lorsque l'indice de spam d'un utilisateur atteind cette valeur alors il ne peut plus poster pendant un moment +-define(INDICE_SPAM_MAX, 6). + +% Un utilisateur ayant trop spamé est bloqué pendant ce temps +-define(DUREE_BLOCAGE_SPAM, 20000). % ms + + +% Quelques tests du modules. +tester() -> + aplu. + + +% Connexion à la base de données de yaws sur overnux +connect() -> + mnesia:start(), + mnesia:change_config(extra_db_nodes, [yaws@overnux]). + + +% Efface tous les users, minichat_reponse et minichat. +reset() -> + mnesia:clear_table(counter), + mnesia:clear_table(user), + mnesia:clear_table(reponse_minichat), + mnesia:clear_table(minichat), + % crée l'utilisateur root + mnesia:transaction(fun() -> + User = #user{id = 0, pseudo = "Sys", login = "Sys", date_creation = now(), date_derniere_connexion = now()}, + mnesia:write(User), + User + end). + + +% Est-ce qu'un utilisateur existe en fonction de son cookie ? +% Renvoie {ok, User} ou erreur +get_user_by_cookie(Cookie) -> + resultat_transaction(mnesia:transaction( + fun() -> + Users = qlc:e(qlc:q([E || E <- mnesia:table(user), E#user.cookie =:= Cookie])), + case Users of + [User] -> {ok, User}; + _ -> erreur + end + end + )). + + +get_user_by_id(ID) -> + resultat_transaction(mnesia:transaction( + fun() -> + Users = qlc:e(qlc:q([E || E <- mnesia:table(user), E#user.id =:= ID])), + case Users of + [User] -> {ok, User}; + _ -> erreur + end + end + )). + + +get_user_by_login(Login) -> + resultat_transaction(mnesia:transaction( + fun() -> + Users = qlc:e(qlc:q([E || E <- mnesia:table(user), E#user.login =:= Login])), + case Users of + [User] -> {ok, User}; + _ -> erreur + end + end + )). + + +get_user_by_login_password(Login, Password) -> + resultat_transaction(mnesia:transaction( + fun() -> + Users = qlc:e(qlc:q([E || E <- mnesia:table(user), E#user.login =:= Login, E#user.password =:= Password])), + case Users of + [User] -> {ok, User}; + _ -> erreur + end + end + )). + + +% Renvoie l'utilisateur root +get_root() -> + {ok, User} = get_user_by_id(0), + User. + + +% Est-ce que Id_user possède Id_mess ? +possede_message(Id_user, Id_mess) -> + case mnesia:transaction( + fun() -> + qlc:e(qlc:q([E#minichat.auteur_id || E <- mnesia:table(minichat), E#minichat.id =:= Id_mess])) + end + ) of + {atomic, [Id_user | []]} -> true; + _ -> false + end. + + +% Est-ce que Id_user à répondu au message Id_mess +a_repondu_a_message(Id_user, Id_mess) -> + case mnesia:transaction( + fun() -> + qlc:e(qlc:q([ + M#minichat.auteur_id || M <- mnesia:table(minichat), R <- mnesia:table(reponse_minichat), + R#reponse_minichat.cible =:= Id_mess, R#reponse_minichat.repondant =:= M#minichat.id, M#minichat.auteur_id =:= Id_user + ]), [{unique_all, true}]) + end + ) of + {atomic, [_]} -> true; + _ -> false + end. + + +% Est-ce que le message Id_mess est une réponse d'une message de Id_user ? +est_une_reponse_a_user(Id_user, Id_mess) -> + case mnesia:transaction( + fun() -> + qlc:e(qlc:q([ + M#minichat.auteur_id || M <- mnesia:table(minichat), R <- mnesia:table(reponse_minichat), + M#minichat.auteur_id =:= Id_user, M#minichat.id =:= R#reponse_minichat.cible, R#reponse_minichat.repondant =:= Id_mess + ]), [{unique_all, true}]) + end + ) of + {atomic, [_]} -> true; + _ -> false + end. + + +% Met à jour le pseudo du user +update_pseudo_user(UserId, Pseudo) -> + mnesia:transaction( + fun() -> + case mnesia:wread({user, UserId}) of + [User] when User#user.pseudo =/= Pseudo -> + mnesia:write(User#user{pseudo = Pseudo}); + _ -> + mnesia:abort("update_pseudo_user: User inconnu ou pseudo deja à jour") + end + end + ). + + +% Mise à par Cookie les autres peuvent être undefined ce qui veut dire qu'ils ne seront pas modifié. +set_profile(Cookie, Login, Password, Pseudo, Email, Css) -> + resultat_transaction(mnesia:transaction( + fun() -> + case get_user_by_cookie(Cookie) of + {ok, User} -> + case get_user_by_login(Login) of + {ok, U} when U#user.id =/= User#user.id -> + login_deja_pris; + _ -> + User_modifie = User#user{ + login = if is_list(Login) -> Login; true -> User#user.login end, + password = if is_list(Password) -> Password; true -> User#user.password end, + pseudo = if is_list(Pseudo) -> Pseudo; true -> User#user.pseudo end, + email = if is_list(Email) -> Email; true -> User#user.email end, + css = if is_list(Css) -> Css; true -> User#user.css end + }, + mnesia:write(User_modifie), + ok + end; + _ -> erreur + end + end + )). + + +% Met à jour la date de la dernière connexion d'un utilisateur à maintenant +update_date_derniere_connexion(UserId) -> + mnesia:transaction( + fun() -> + case mnesia:wread({user, UserId}) of + [User] -> + mnesia:write(User#user{date_derniere_connexion = now()}); + _ -> + mnesia:abort("update_date_derniere_connexion: User inconnu") + end + end + ). + + +% Ajoute un nouveau user et le renvoie +nouveau_user(Pseudo, Cookie) -> + F = fun() -> + Id = get_nouvel_id(user), + User = #user{id = Id, cookie = Cookie, pseudo = Pseudo, date_creation = now(), date_derniere_connexion = now()}, + mnesia:write(User), + User + end, + resultat_transaction(mnesia:transaction(F)). + + +% Ajoute un nouveau user et le renvoie +nouveau_user(Login, Password, Cookie) -> + F = fun() -> + Id = get_nouvel_id(user), + User = #user{id = Id, cookie = Cookie, pseudo = Login, login = Login, password = Password, date_creation = now(), date_derniere_connexion = now()}, + mnesia:write(User), + User + end, + resultat_transaction(mnesia:transaction(F)). + + +% Ajoute un message. Repond_A est une liste d'id auquel le message répond +% retourne soit l'id du message soit erreur. +nouveau_message(Mess, Auteur_id, Repond_A) -> + % regarde si les id 'Repond_A' existent + F = fun() -> + Nb_id_trouve = length(qlc:e(qlc:q([E#minichat.id || E <- mnesia:table(minichat), lists:member(E#minichat.id, Repond_A)]))), + % est-ce que l'auteur existe ? + Auteur = case qlc:e(qlc:q([E || E <- mnesia:table(user), E#user.id =:= Auteur_id])) of + [A] -> A; + _ -> throw("L'auteur du message est introuvable") + end, + if Nb_id_trouve =/= length(Repond_A) -> throw("Un ou plusieurs messages introuvable"); + true -> ok + end, + Id = get_nouvel_id(minichat), + % compare les dernière + Delta = delta_date_ms(Auteur#user.date_derniere_connexion, now()), + Nouvel_indice_flood = Auteur#user.indice_flood + if Delta =< ?DUREE_SPAM -> 2; true -> -1 end, + Auteur_maj = Auteur#user{ + indice_flood = if Nouvel_indice_flood > ?INDICE_SPAM_MAX -> ?INDICE_SPAM_MAX; Nouvel_indice_flood < 0 -> 0; true -> Nouvel_indice_flood end, + date_derniere_connexion = now() + }, + % est-ce que l'auteur à trop floodé ? + if Auteur#user.indice_flood =/= ?INDICE_SPAM_MAX, Auteur_maj#user.indice_flood =:= ?INDICE_SPAM_MAX, Delta =< ?DUREE_BLOCAGE_SPAM -> + Root = get_root(), + mnesia:write(Auteur#user{indice_flood = Auteur_maj#user.indice_flood}), + mnesia:write(#minichat{id=Id, auteur_id=Root#user.id, date=now(), pseudo=Root#user.pseudo, contenu=Auteur#user.pseudo ++ "(" ++ Auteur#user.login ++ ") est bloqué pour " ++ integer_to_list(trunc(?DUREE_BLOCAGE_SPAM / 1000)) ++ " secondes pour cause de flood.."}), + Id; + Auteur#user.indice_flood =:= ?INDICE_SPAM_MAX, Delta =< ?DUREE_BLOCAGE_SPAM -> + erreur; + true -> + mnesia:write(Auteur_maj), + inserer_reponses(Id, Repond_A), + mnesia:write(#minichat{id=Id, auteur_id=Auteur#user.id, date=now(), pseudo=Auteur#user.pseudo, contenu=Mess}), + Id + end + end, + resultat_transaction(mnesia:transaction(F)). + + +% Retourne la difference entre deux timestamp (erlang:now()) en miliseconde +delta_date_ms(D1, D2) -> + 1000000000 * abs(element(1, D1) - element(1, D2)) + 1000 * abs(element(2, D1) - element(2, D2)) + trunc(abs(element(3, D1) - element(3, D2)) / 1000). + + +% Définit Id_repondant comme étant la réponse à Ids. Ids est une liste d'id. +inserer_reponses(Id_repondant, [Id_mess | Reste]) -> + mnesia:write(#reponse_minichat{repondant = Id_repondant, cible = Id_mess}), + inserer_reponses(Id_repondant, Reste); +inserer_reponses(_, []) -> + ok. + + +% Renvoie un nouvel id pour une table donnée +get_nouvel_id(Table) -> + mnesia:dirty_update_counter(counter, Table, 1). + + +% Attend qu'au moins un nouveau message arrive, function bloquante. +attends_nouveau_messages() -> + case mnesia:subscribe({table, minichat, simple}) of + {error, _} = E -> E; + _ -> + %{ok, F} = file:open("/tmp/log_euphorik_" ++ pid_to_list(self()) ++ ".txt", [write]), + %io:format(F, "Test2~n", []), + attends_nouveau_messages2() + end. +attends_nouveau_messages2() -> + %io:format(F, "En attente d'un message !~n", []), + receive % attente d'un post + {mnesia_table_event, {write, _, _}} -> + mnesia:unsubscribe({table, minichat, simple}); + %io:format(F, "Debloquage !~n", []), + %file:close(F); + %~ {tcp_closed, _} -> + %~ mnesia:unsubscribe({table, minichat, simple}); + _ -> + %io:format(F, "~p~n", [M]), + attends_nouveau_messages2() + % 60 minutes de timeout (le cas ou il n'y a que des consultations et jamais de post) + % Après 60 minutes de connexion, le client doit donc reétablir une connexion + % TODO : pour être mieux : quand le socket se ferme alors un message devrait être envoyé et débloquer ce receive (demande en cours sur la mailing list de yaws) + after 1000 * 60 * 60 -> + mnesia:unsubscribe({table, minichat, simple}) + end. + + +% Renvoie les messages manquants pour la page P en sachant qu'il y a N message +% par page et que le dernier message que l'on possède est Id +messages(Id, N, P) -> + lists:filter(fun (M) -> M#minichat.id > Id end, messages(N, P)). + + +% Renvoie N messages se trouvant sur la page P +messages(N, P) -> + F = fun() -> + C = qlc:cursor(qlc:q([E || E <- qlc:keysort(2, mnesia:table(minichat), [{order, descending}])])), + if P > 1 -> qlc:next_answers(C, N * (P - 1)); + true -> ok + end, + R = qlc:next_answers(C, N), + qlc:delete_cursor(C), + lists:reverse(R) + end, + resultat_transaction(mnesia:transaction(F)). + + +% Renvoie N messages se trouvant sur la première page +messages(N) -> + messages(N, 1). + + +% Renvoie les messages auquels répond M. M est l'id du message. +% La réponse est sous la forme d'un arbre, par exemple : {M, [{3, [{1, []}]},{4, []}]} +% ce qui signifie : M répond à 3 et à 4, 3 répond à 1. +% N est le nombre de message sur une page +conversation(M, N) -> + P = page(M, N), + {M, get_liste_cibles(M, N, P)}. + + +% Renvoie la liste des cibles d'un message M, c'est à dire des messages auquel M répond. N étant le nombre de message par page et +% P la page à laquelle se limite la recherche. +% Voir 'conversation/2' pour plus de détail sur la structure retournée. +get_liste_cibles(M, N, P) -> + resultat_transaction(mnesia:transaction(fun() -> + Cibles = qlc:e(qlc:q([E#reponse_minichat.cible || E <- mnesia:table(reponse_minichat), E#reponse_minichat.repondant =:= M])), + lists:foldl( + fun(E, A) -> + PageE = page(E, N), + if PageE =:= P -> % si E fait partit de la page de l'élément de base alors on le prend + [{E, get_liste_cibles(E, N, P)}| A]; + true -> + A + end + end, [], Cibles) + end)). + + +% Renvoie le nombre de page total en fonction du nombre de message par page N +% TODO : ya pas un moyen moins pourri pour avoir le nombre de record d'une table ? +get_nb_page(N) -> + resultat_transaction(mnesia:transaction(fun() -> + ceiling(length(qlc:e(qlc:q([E#minichat.id || E <- mnesia:table(minichat)]))) / N) + end)). + + +% Renvoie le numéro de la page sur lequel se trouve le message M en sachant qu'il y a N messages par page. +page(M, N) -> + resultat_transaction(mnesia:transaction(fun() -> + ceiling((length(qlc:e(qlc:q([E || E <- mnesia:table(minichat), E#minichat.id >= M])))) / N) + end)). + + +% Bizarre, cette fonction n'existe pas dans la stdlib. +ceiling(X) -> + T = trunc(X), + case (X - T) of + Neg when Neg < 0 -> T; + Pos when Pos > 0 -> T + 1; + _ -> T + end. + + +% Renvoie tous les users. +users() -> + resultat_transaction(mnesia:transaction(fun() -> + qlc:e(qlc:q([E || E <- mnesia:table(user)])) + end)). + + +% Renvoie les reponses (utilisé normalement uniquement pendant le debug). +reponses() -> + F = fun() -> + qlc:e(qlc:q([E || E <- mnesia:table(reponse_minichat)])) + end, + resultat_transaction(mnesia:transaction(F)). + +% Renvoie les messages auquel M_id répond. +repond_a(M_id) -> + resultat_transaction(mnesia:transaction( + fun() -> + qlc:e(qlc:q( + [M || E <- mnesia:table(reponse_minichat), + M <- mnesia:table(minichat), + E#reponse_minichat.repondant =:= M_id, + M#minichat.id =:= E#reponse_minichat.cible])) + end + )). + + +% Renvoie le résultat d'une transaction (en décomposant le tuple fournit) +resultat_transaction({_, T}) -> + T. + \ No newline at end of file diff --git a/modules/include/euphorik_bd.hrl b/modules/include/euphorik_bd.hrl new file mode 100755 index 0000000..7ffeae4 --- /dev/null +++ b/modules/include/euphorik_bd.hrl @@ -0,0 +1,45 @@ +% Auteur : GBurri +% Version 2 + +% Pour générer des id +-record(counter, + { + key, + value + }). + +% décrit un enregistrement d'un message +-record(minichat, + { + id, % integer + auteur_id, % -> user.id + date, % erlang:now() + pseudo, % chaine de caractère + contenu % chaine de caractère + }). + + +% type bag +% 'repondant' repond à 'cible' +-record(reponse_minichat, + { + repondant, % -> minichat.id + cible % -> minichat.id + }). + + +-record(user, + { + id, + cookie, % string() + pseudo = [], % string() + login = [], % string() + password = [], % string() (md5) + email = [], % string() + date_creation, % erlang:now() + date_derniere_connexion, % erlang:now(), est mis à jour lors de n'importe quelle activitée (envoie de message par exemple) + css = [], % string() + indice_flood = 0 % integer() est incrémenté lorsque l'utilisateur envoie trop rapidement des messages. + }). + + \ No newline at end of file diff --git a/modules/include/euphorik_defines.hrl b/modules/include/euphorik_defines.hrl new file mode 100755 index 0000000..42026b6 --- /dev/null +++ b/modules/include/euphorik_defines.hrl @@ -0,0 +1,3 @@ +-define(DOSSIER_CAPTCHA_RELATIF, "img/tmp"). +-define(DOSSIER_CAPTCHA, "/var/www/euphorik/" ?DOSSIER_CAPTCHA_RELATIF). + diff --git a/pages/faq.html b/pages/faq.html new file mode 100755 index 0000000..ca60b9a --- /dev/null +++ b/pages/faq.html @@ -0,0 +1,11 @@ +FAQ + +Pourquoi les couleurs du site font mal aux yeux ? +Le daltonisme du webmaster n'y est surement pas étranger. Il est possible de choisir parmis d'autres styles via le menu en haut à droite. + +Quels-sont les navigateurs supporté ? +Le site a été testé avec succès sous "firefox 2", "safari 3", "Opera 9" et "Konqueror". +Il est déconseillé d'utiliser Microsoft Internet Explorer pour des raisons d'incompatibilités. + +Le site se bloque sous Microsoft Internet Explorer 7 ! +Internet Explorer gère assez mal les connexions persitantes de type Comet/AJAX. Il est conseillé d'utiliser un vrai navigateur comme ceux cités au point précédent. \ No newline at end of file -- 2.45.2