10 * Normalement 'const' à la place de 'var' mais non supporté par IE7.
13 nbMessageAffiche : 80, // (par page)
14 pseudoDefaut : "<nick>",
15 tempsAffichageMessageDialogue : 4000, // en ms
17 "smile" : [/:\)/g, /:-\)/g],
18 "bigsmile" : [/:D/g, /:-D/g],
19 "clin" : [/;\)/g, /;-\)/g],
20 "cool" : [/8\)/g, /8-\)/g],
21 "eheheh" : [/:P/g, /:-P/g],
22 "oh" : [/:o/g, /:O/g],
23 "pascontent" : [/>\(/g, />\(/g],
24 "sniff" : [/:\(/g, /:-\(/g],
25 "argn" : [/\[:argn\]/g],
26 "bunny" : [/\[:lapin\]/g],
27 "chat" : [/\[:chat\]/g],
28 "renne" : [/\[:renne\]/g],
29 "lol" : [/\[:lol\]/g],
30 "spliff" : [/\[:spliff\]/g],
31 "star" : [/\[:star\]/g],
32 "triste" : [/\[:triste\]/g],
33 "kirby" : [/\[:kirby\]/g]
37 ///////////////////////////////////////////////////////////////////////////////////////////////////
39 String
.prototype.trim = function()
41 return this.replace(/^\s+|\s+$/g,"");
43 String
.prototype.ltrim = function()
45 return this.replace(/^\s+/,"");
47 String
.prototype.rtrim = function()
49 return this.replace(/\s+$/,"");
52 String
.prototype.dump = function()
54 if (typeof dump
!= "undefined")
56 dump("\n--- EUPHORIK.CH ---\n")
62 ///////////////////////////////////////////////////////////////////////////////////////////////////
64 function Util(serializer
)
66 if(typeof XMLSerializer
!= "undefined")
67 this.serializer
= new XMLSerializer()
69 jQuery("#info .fermer").click(function(){
70 jQuery("#info").slideUp(50)
75 * Affiche une boite de dialogue avec un message à l'intérieur.
78 Util
.prototype.messageDialogue = function(message
, type
, boutons
)
80 if (type
== undefined)
81 type
= messageType
.informatif
83 if (this.timeoutMessageDialogue
!= undefined)
84 clearTimeout(this.timeoutMessageDialogue
)
86 var fermer = function(){jQuery("#info").slideUp(100)}
89 jQuery("#info .message").html(message
)
92 case messageType
.informatif : jQuery("#info #icone").attr("class", "information"); break
93 case messageType
.question : jQuery("#info #icone").attr("class", "interrogation"); break
94 case messageType
.erreur : jQuery("#info #icone").attr("class", "exclamation"); break
96 jQuery("#info .boutons").html("")
97 for (var b
in boutons
)
98 jQuery("#info .boutons").append("<div>" + b
+ "</div>").find("div:last").click(boutons
[b
]).click(fermer
)
100 jQuery("#info").slideDown(200)
101 this.timeoutMessageDialogue
= setTimeout(fermer
, conf
.tempsAffichageMessageDialogue
)
103 var messageType
= {informatif: 0, question: 1, erreur: 2}
106 Util.prototype.log = function(str)
110 Util
.prototype.serializeXML = function(documentXML
)
113 return this.serializer
.serializeToString(documentXML
)
115 return documentXML
.xml
118 Util
.prototype.creerDocumentXMLAction = function()
120 if (document
.implementation
&& document
.implementation
.createDocument
)
122 return document
.implementation
.createDocument("", "action", null)
124 else if (window
.ActiveXObject
)
126 var doc
= new ActiveXObject("MSXML2.DOMDocument") //("Microsoft.XMLDOM")
127 doc
.appendChild(doc
.createElement("action"));
128 //doc.loadXML("<action></action>")
129 //alert(doc.documentElement)
130 //doc.createElement("action")
135 Util
.prototype.xmlVersAction = function(xml
)
137 return {action: this.to_utf8(this.serializeXML(xml
/*, "UTF-8"*/))}
140 // voir : http://homepage3.nifty.com/aokura/jscript/utf8.html
141 // et : http://www1.tip.nl/~t876506/utf8tbl.html
142 Util
.prototype.to_utf8 = function(s
)
147 for (var i
= 0; i
< s
.length
; i
++)
152 } else if (c
>= 0x80 && c
<= 0x7ff) {
153 d
+= String
.fromCharCode(((c
>> 6) & 0x1f) | 0xc0);
154 d
+= String
.fromCharCode((c
& 0x3f) | 0x80);
156 d
+= String
.fromCharCode((c
>> 12) | 0xe0);
157 d
+= String
.fromCharCode(((c
>> 6) & 0x3f) | 0x80);
158 d
+= String
.fromCharCode((c
& 0x3f) | 0x80);
164 Util
.prototype.md5 = function(chaine
)
166 return hex_md5(chaine
)
169 // pompé de http://www.faqts.com/knowledge_base/view.phtml/aid/13562/fid/130
170 Util
.prototype.setSelectionRange = function(input
, selectionStart
, selectionEnd
)
172 if (input
.setSelectionRange
)
175 input
.setSelectionRange(selectionStart
, selectionEnd
)
177 else if (input
.createTextRange
)
179 var range
= input
.createTextRange()
181 range
.moveEnd('character', selectionEnd
)
182 range
.moveStart('character', selectionStart
)
187 Util
.prototype.setCaretToEnd = function(input
)
189 this.setSelectionRange(input
, input
.value
.length
, input
.value
.length
)
191 Util
.prototype.setCaretToBegin = function(input
)
193 this.setSelectionRange(input
, 0, 0)
195 Util
.prototype.setCaretToPos = function(input
, pos
)
197 this.setSelectionRange(input
, pos
, pos
)
199 Util
.prototype.selectString = function(input
, string
)
201 var match
= new RegExp(string
, "i").exec(input
.value
)
204 this.setSelectionRange (input
, match
.index
, match
.index
+ match
[0].length
)
207 Util
.prototype.replaceSelection = function(input
, replaceString
) {
208 if (input
.setSelectionRange
)
210 var selectionStart
= input
.selectionStart
211 var selectionEnd
= input
.selectionEnd
212 input
.value
= input
.value
.substring(0, selectionStart
) + replaceString
+ input
.value
.substring(selectionEnd
)
214 if (selectionStart
!= selectionEnd
) // has there been a selection
215 this.setSelectionRange(input
, selectionStart
, selectionStart
+ replaceString
.length
)
217 this.setCaretToPos(input
, selectionStart
+ replaceString
.length
)
219 else if (document
.selection
)
221 var range
= document
.selection
.createRange();
222 if (range
.parentElement() == input
)
224 var isCollapsed
= range
.text
== ''
225 range
.text
= replaceString
228 // there has been a selection
229 // it appears range.select() should select the newly
230 // inserted text but that fails with IE
231 range
.moveStart('character', -replaceString
.length
);
238 ///////////////////////////////////////////////////////////////////////////////////////////////////
242 this.pageCourante
= null
246 Pages
.prototype.ajouterPage = function(page
)
248 page
.pages
= this // la magie des langages dynamiques : le foutoire
249 this.pages
[page
.nom
] = page
252 Pages
.prototype.afficherPage = function(nomPage
, forcerChargement
)
254 if (forcerChargement
== undefined) forcerChargement
= false
256 var page
= this.pages
[nomPage
]
257 if (page
== undefined || (!forcerChargement
&& page
== this.pageCourante
)) return
259 if (this.pageCourante
!= null && this.pageCourante
.decharger
)
260 this.pageCourante
.decharger()
262 jQuery("#menu div").removeClass("courante")
263 jQuery("#menu div." + nomPage
).addClass("courante")
265 this.pageCourante
= page
266 jQuery("#page").html(this.pageCourante
.contenu()).removeClass().addClass(this.pageCourante
.nom
)
268 if (this.pageCourante
.charger
)
269 this.pageCourante
.charger()
272 ///////////////////////////////////////////////////////////////////////////////////////////////////
276 this.smiles
= conf
.smiles
277 this.protocoles
= "http|https|ed2k"
279 this.regexUrl
= new RegExp("(?:(?:" + this.protocoles
+ ")://|www\\.)[^ ]*", "gi")
280 this.regexImg
= new RegExp("^.*?\\.(gif|jpg|png|jpeg|bmp|tiff)$", "i")
281 this.regexDomaine
= new RegExp("^(?:(?:" + this.protocoles
+ ")://|www\\.).*?([^/.]+\\.[^/.]+)(?:$|/).*$", "i")
282 this.regexTestProtocoleExiste
= new RegExp("^(?:" + this.protocoles
+ ")://.*$", "i")
283 this.regexNomProtocole
= new RegExp("^(.*?)://")
287 * Formate un pseudo saise par l'utilisateur.
288 * @param pseudo le pseudo brut
289 * @return le pseudo filtré
291 Formateur
.prototype.filtrerInputPseudo = function(pseudo
)
293 return pseudo
.replace(/{|}/g, "").trim()
296 Formateur
.prototype.getSmilesHTML = function()
299 for (var sNom
in this.smiles
)
301 XHTML
+= "<img class=\"" + sNom
+ "\" src=\"img/smileys/" + sNom
+ ".gif\" />"
306 Formateur
.prototype.traitementComplet = function(M
, pseudo
)
308 return this.traiterSmiles(this.traiterURL(this.remplacerBalisesHTML(M
), pseudo
))
312 * FIXME : Cette méthode est attrocement lourde !!
314 Formateur
.prototype.traiterSmiles = function(M
)
316 for (var sNom
in this.smiles
)
318 ss
= this.smiles
[sNom
]
319 for (var i
= 0; i
< ss
.length
; i
++)
320 M
= M
.replace(ss
[i
], "<img src=\"img/smileys/" + sNom
+ ".gif\" />")
325 Formateur
.prototype.remplacerBalisesHTML = function(M
)
327 return M
.replace(/</g
, "<").replace(/>/g
, ">")
330 Formateur
.prototype.traiterURL = function(M
, pseudo
)
334 if (pseudo
== undefined)
337 var traitementUrl = function(url
)
339 // si ya pas de protocole on rajoute "http://"
340 if (!thisFormateur
.regexTestProtocoleExiste
.test(url
))
341 url
= "http://" + url
342 var extension
= thisFormateur
.getShort(url
)
343 return "<a " + (extension
[1] ? "title=\"" + thisFormateur
.traiterPourFenetreLightBox(pseudo
, url
) + ": " + thisFormateur
.traiterPourFenetreLightBox(M
, url
) + "\"" + " rel=\"lightbox[groupe]\"" : "") + " href=\"" + url
+ "\" >[" + extension
[0] + "]</a>"
345 return M
.replace(this.regexUrl
, traitementUrl
)
349 * Renvoie une version courte de l'url.
350 * par exemple : http://en.wikipedia.org/wiki/Yakov_Smirnoff devient wikipedia.org
352 Formateur
.prototype.getShort = function(url
)
354 var estUneImage
= false
355 var versionShort
= null
356 var rechercheImg
= this.regexImg
.exec(url
)
358 if (rechercheImg
!= null)
360 versionShort
= rechercheImg
[1].toLowerCase()
361 if (versionShort
== "jpeg") versionShort
= "jpg" // jpeg -> jpg
366 var rechercheDomaine
= this.regexDomaine
.exec(url
)
367 if (rechercheDomaine
!= null && rechercheDomaine
.length
>= 2)
368 versionShort
= rechercheDomaine
[1]
371 var nomProtocole
= this.regexNomProtocole
.exec(url
)
372 if (nomProtocole
!= null && nomProtocole
.length
>= 2)
373 versionShort
= nomProtocole
[1]
377 return [versionShort
== null ? "url" : versionShort
, estUneImage
]
381 * Traite les pseudo et messages à être affiché dans le titre d'une image visualisé avec lightbox.
383 Formateur
.prototype.traiterPourFenetreLightBox = function(M
, urlCourante
)
386 var traitementUrl = function(url
)
388 return "[" + thisFormateur
.getShort(url
)[0] + (urlCourante
== url
? ": image courante" : "") + "]"
391 return this.remplacerBalisesHTML(M
).replace(this.regexUrl
, traitementUrl
)
395 ///////////////////////////////////////////////////////////////////////////////////////////////////
397 var statutType
= {enregistre: 0, identifie: 1, non_identifie: 2}
399 function Client(util
)
404 this.regexCookie
= new RegExp("^cookie=([^;]*)")
407 //this.captchaCrypt = null
409 // données personnels
410 this.resetDonneesPersonnelles()
412 this.setStatut(statutType
.non_identifie
)
414 // le dernier message d'erreur recut du serveur (par exemple une connexion foireuse : "login impossible")
415 this.dernierMessageErreur
= ""
418 Client
.prototype.resetDonneesPersonnelles = function()
420 this.pseudo
= conf
.pseudoDefaut
424 this.css
= jQuery("link#cssPrincipale").attr("href")
427 Client
.prototype.setCss = function(css
)
433 jQuery("link#cssPrincipale").attr("href", this.css
)
436 /* enregistement automatique..
437 if (!this.identifie())
438 if (!this.enregistrement())
441 if (this.identifie())
445 Client
.prototype.getXMLlogin = function(login
, password
)
447 var XMLDocument
= this.util
.creerDocumentXMLAction()
448 XMLDocument
.documentElement
.setAttribute("name", "login")
450 var nodeLogin
= XMLDocument
.createElement("login")
451 nodeLogin
.appendChild(XMLDocument
.createTextNode(login
))
452 XMLDocument
.documentElement
.appendChild(nodeLogin
)
454 var nodePassword
= XMLDocument
.createElement("password")
455 nodePassword
.appendChild(XMLDocument
.createTextNode(password
))
456 XMLDocument
.documentElement
.appendChild(nodePassword
)
461 Client
.prototype.getXMLloginCookie = function()
463 var XMLDocument
= this.util
.creerDocumentXMLAction()
464 XMLDocument
.documentElement
.setAttribute("name", "login")
466 var nodeCookie
= XMLDocument
.createElement("cookie")
467 nodeCookie
.appendChild(XMLDocument
.createTextNode(this.cookie
))
468 XMLDocument
.documentElement
.appendChild(nodeCookie
)
474 Client.prototype.getXMLloginCaptcha = function(captchaCrypt, captchaInput)
476 var XMLDocument = this.util.creerDocumentXMLAction()
477 XMLDocument.documentElement.setAttribute("name", "loginCaptcha")
479 var nodecaptchaCrypt = XMLDocument.createElement("captchaCrypt")
480 nodecaptchaCrypt.appendChild(XMLDocument.createTextNode(captchaCrypt))
481 XMLDocument.documentElement.appendChild(nodecaptchaCrypt)
483 var nodecaptchaInput = XMLDocument.createElement("captchaInput")
484 nodecaptchaInput.appendChild(XMLDocument.createTextNode(captchaInput))
485 XMLDocument.documentElement.appendChild(nodecaptchaInput)
491 Client.prototype.getXMLgenerationCaptcha = function()
493 var XMLDocument = this.util.creerDocumentXMLAction()
494 XMLDocument.documentElement.setAttribute("name", "generationCaptcha")
499 Client
.prototype.getXMLEnregistrement = function(login
, password
)
501 var XMLDocument
= this.util
.creerDocumentXMLAction()
502 XMLDocument
.documentElement
.setAttribute("name", "register")
504 var nodeLogin
= XMLDocument
.createElement("login")
505 nodeLogin
.appendChild(XMLDocument
.createTextNode(login
))
506 XMLDocument
.documentElement
.appendChild(nodeLogin
)
508 var nodePassword
= XMLDocument
.createElement("password")
509 nodePassword
.appendChild(XMLDocument
.createTextNode(password
))
510 XMLDocument
.documentElement
.appendChild(nodePassword
)
515 Client
.prototype.getXMLProfile = function()
517 var XMLDocument
= this.util
.creerDocumentXMLAction()
518 XMLDocument
.documentElement
.setAttribute("name", "profile")
520 var nodeCookie
= XMLDocument
.createElement("cookie")
521 nodeCookie
.appendChild(XMLDocument
.createTextNode(this.cookie
))
522 XMLDocument
.documentElement
.appendChild(nodeCookie
)
524 var nodeLogin
= XMLDocument
.createElement("login")
525 nodeLogin
.appendChild(XMLDocument
.createTextNode(this.login
))
526 XMLDocument
.documentElement
.appendChild(nodeLogin
)
528 var nodePassword
= XMLDocument
.createElement("password")
529 nodePassword
.appendChild(XMLDocument
.createTextNode(this.password
))
530 XMLDocument
.documentElement
.appendChild(nodePassword
)
532 var nodePseudo
= XMLDocument
.createElement("pseudo")
533 nodePseudo
.appendChild(XMLDocument
.createTextNode(this.pseudo
))
534 XMLDocument
.documentElement
.appendChild(nodePseudo
)
536 var nodeEmail
= XMLDocument
.createElement("email")
537 nodeEmail
.appendChild(XMLDocument
.createTextNode(this.email
))
538 XMLDocument
.documentElement
.appendChild(nodeEmail
)
540 var nodeCSS
= XMLDocument
.createElement("css")
541 nodeCSS
.appendChild(XMLDocument
.createTextNode(this.css
))
542 XMLDocument
.documentElement
.appendChild(nodeCSS
)
548 * Renvoie null si pas définit.
550 Client
.prototype.getCookie = function()
552 var cookie
= this.regexCookie
.exec(document
.cookie
)
553 if (cookie
== null) this.cookie
= null
554 else this.cookie
= cookie
[1]
557 Client
.prototype.delCookie = function()
559 document
.cookie
= "cookie=; max-age=0"
562 Client
.prototype.setCookie = function(cookie
)
564 if (this.cookie
== null)
568 "cookie="+this.cookie
+
569 "; max-age=" + (60 * 60 * 24 * 365)
572 Client
.prototype.identifie = function()
574 return this.statut
== statutType
.enregistre
|| this.statut
== statutType
.identifie
577 Client
.prototype.setStatut = function(statut
)
579 if(typeof(statut
) == "string")
582 statut
== "enregistre" ?
583 statutType
.enregistre : (statut
== "identifie" ? statutType
.identifie : statutType
.non_identifie
)
586 if (statut
== this.statut
) return
593 * Demande la génération d'un captcha au serveur et l'affiche.
596 Client.prototype.afficherCaptcha = function(query)
598 var thisClient = this
600 $.post("request", this.util.xmlVersAction(this.getXMLgenerationCaptcha()),
601 function(data, textStatus)
603 var chemin = jQuery("chemin", data.documentElement).text()
604 thisClient.captchaCrypt = jQuery("captchaCrypt", data.documentElement).text()
605 jQuery(query).prepend(
606 "<p id=\"captcha\" >Es-tu un bot ? <img class=\"captchaImg\" src=\"" + chemin + "\" />" +
607 "<input name=\"captchaInput\" type=\"text\" size=\"5\" max_length=\"5\" ></p>"
613 Client.prototype.cacherCaptcha = function()
615 jQuery("#captcha").remove()
619 * Effectue la connexion vers le serveur.
620 * Cette fonction est bloquante tant que la connexion n'a pas été établie.
621 * S'il existe un cookie en local on s'authentifie directement avec lui.
622 * Si il n'est pas possible de s'authentifier alors on affiche un captcha anti-bot.
624 Client
.prototype.connexionCookie = function()
627 if (this.cookie
== null) return false;
628 return this.connexion(this.util
.xmlVersAction(this.getXMLloginCookie()))
631 Client
.prototype.connexionLogin = function(login
, password
)
633 return this.connexion(this.util
.xmlVersAction(this.getXMLlogin(login
, password
)))
637 Client.prototype.connexionCaptcha = function()
639 return this.connexion(this.util.xmlVersAction(this.getXMLloginCaptcha(this.captchaCrypt, jQuery("#captcha input").val())))
642 Client
.prototype.enregistrement = function(login
, password
)
644 if (this.identifie())
647 this.password
= password
649 this.setStatut(statutType
.enregistre
)
654 if (login
== undefined) login
= ""
655 if (password
== undefined) password
= ""
656 return this.connexion(this.util
.xmlVersAction(this.getXMLEnregistrement(login
, password
)))
660 Client
.prototype.connexion = function(action
)
673 thisClient
.chargerDonnees(data
)
677 return this.identifie()
680 Client
.prototype.deconnexion = function()
682 this.setStatut(statutType
.non_identifie
) // deconnexion
683 this.resetDonneesPersonnelles()
687 Client
.prototype.chargerDonnees = function(data
)
689 this.setStatut(jQuery("statut", data
.documentElement
).text())
691 if (this.identifie())
693 this.cookie
= jQuery("cookie", data
.documentElement
).text()
696 this.login
= jQuery("login", data
.documentElement
).text()
697 this.pseudo
= jQuery("pseudo", data
.documentElement
).text()
698 this.email
= jQuery("email", data
.documentElement
).text()
699 this.css
= jQuery("css", data
.documentElement
).text()
703 jQuery("link#cssPrincipale").attr("href", this.css
)
707 this.dernierMessageErreur
= jQuery("information", data
.documentElement
).text()
711 * Met à jour les données personne sur serveur.
713 Client
.prototype.flush = function()
716 //thisClient.util.log(this.util.xmlVersAction(this.getXMLProfile()).action)
723 data: this.util
.xmlVersAction(this.getXMLProfile()),
727 //thisClient.util.log(thisClient.util.serializer.serializeToString(data))
731 // TODO : retourner false si un problème est survenu lors de l'update du profile
735 Client
.prototype.majMenu = function()
737 var displayType
= this.css
== "css/3/euphorik.css" ? "block" : "inline" //this.client
739 // met à jour le menu
740 if (this.statut
== statutType
.enregistre
)
742 jQuery("#menu .profile").css("display", displayType
).text("profile")
743 jQuery("#menu .logout").css("display", displayType
)
744 jQuery("#menu .register").css("display", "none")
746 else if (this.statut
== statutType
.identifie
)
748 jQuery("#menu .profile").css("display", "none")
749 jQuery("#menu .logout").css("display", displayType
)
750 jQuery("#menu .register").css("display", displayType
)
754 jQuery("#menu .profile").css("display", displayType
).text("login")
755 jQuery("#menu .logout").css("display", "none")
756 jQuery("#menu .register").css("display", displayType
)
760 ///////////////////////////////////////////////////////////////////////////////////////////////////
766 jQuery(document
).ready(
770 var util
= new Util()
771 var client
= new Client(util
)
772 var pages
= new Pages()
773 var formateur
= new Formateur()
775 // connexion vers le serveur (utilise un cookie qui traine)
776 client
.connexionCookie()
779 for (var i
= 1; i
<= 3; i
++)
781 jQuery("#css"+i
).click(function(){
782 client
.setCss("css/" + jQuery(this).attr("id").charAt(3) + "/euphorik.css")
786 jQuery("#menu .minichat").click(function(){ pages
.afficherPage("minichat") })
787 jQuery("#menu .profile").click(function(){ pages
.afficherPage("profile") })
788 jQuery("#menu .logout").click(function(){
789 util
.messageDialogue("Êtes-vous sur de vouloir vous délogger ?", messageType
.question
,
792 client
.deconnexion();
793 pages
.afficherPage("minichat", true)
799 jQuery("#menu .register").click(function(){ pages
.afficherPage("register") })
801 pages
.ajouterPage(new PageMinichat(client
, formateur
, util
))
802 pages
.ajouterPage(new PageProfile(client
, formateur
, util
))
803 pages
.ajouterPage(new PageRegister(client
, formateur
, util
))
804 pages
.afficherPage("minichat")