X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=htdocs%2Fjavascript%2Fxorg.js;h=d804403d8b0876ae66b4a10562dfc43a1bd9910d;hb=6a686adb39d65e4472497f4ce69f0314085cead3;hp=0e5f5d0f016d3501768204a444c140eb26873d52;hpb=08fa70684fd1332178cddb6b318151335fb4506c;p=platal.git diff --git a/htdocs/javascript/xorg.js b/htdocs/javascript/xorg.js index 0e5f5d0..d804403 100644 --- a/htdocs/javascript/xorg.js +++ b/htdocs/javascript/xorg.js @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2003-2008 Polytechnique.org * + * Copyright (C) 2003-2010 Polytechnique.org * * http://opensource.polytechnique.org/ * * * * This program is free software; you can redistribute it and/or modify * @@ -18,27 +18,32 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * ***************************************************************************/ -var is_netscape = (navigator.appName.substring(0,8) == "Netscape"); -var is_IE = (navigator.appName.substring(0,9) == "Microsoft"); +var is_IE = $.browser.msie; // {{{ function getNow() +var days = ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi']; +var months = ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', + 'août', 'septembre', 'octobre', 'novembre', 'décembre'] function getNow() { - dt = new Date(); - dy = dt.getDay(); - mh = dt.getMonth(); - wd = dt.getDate(); - yr = dt.getYear(); + var dt = new Date(); + var dy = dt.getDay(); + var mh = dt.getMonth(); + var wd = dt.getDate(); + var yr = dt.getYear(); if (yr<1000) yr += 1900; - hr = dt.getHours(); - mi = dt.getMinutes(); - - time = (mi < 10) ? hr +':0'+mi : hr+':'+mi; - days = ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi']; - months = ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', - 'août', 'septembre', 'octobre', 'novembre', 'décembre'] - - return days[dy]+' '+wd+' '+months[mh]+' '+yr+'
'+time; + var hr = dt.getHours(); + var mi = dt.getMinutes(); + if (mi < 10) { + mi = '0' + mi; + } + var se = dt.getSeconds(); + if (se < 10) { + se = '0' + se; + } + + $(".date-heure").html(days[dy] + ' ' + wd + ' ' + months[mh] + ' ' + yr + '
' + + hr + ':' + mi + ':' + se); } // }}} @@ -46,51 +51,29 @@ function getNow() { function canAddSearchEngine() { - if (((typeof window.sidebar == "object") && (typeof window.sidebar.addSearchEngine == "function")) - || ((typeof window.sidebar == "object") && (typeof window.sidebar.addSearchEngine == "function"))) { - return true; - } - return false; + if (((typeof window.sidebar == "object") && $.isFunction(window.sidebar.addSearchEngine)) + || ((typeof window.external == "object") && $.isFunction(window.external.AddSearchProvider))) { + return true; + } + return false; } function addSearchEngine() { - var searchURI = "http://www.polytechnique.org/xorg.opensearch.xml"; - if ((typeof window.sidebar == "object") && (typeof window.sidebar.addSearchEngine == "function")) { - window.sidebar.addSearchEngine( - searchURI, - "http://www.polytechnique.org/images/xorg.png", - "Annuaire Polytechnique.org", - "Academic"); - } else { - try { - window.external.AddSearchProvider(searchURI); - } catch(e) { - alert("Impossible d'installer la barre de recherche"); + var searchURI = "http://www.polytechnique.org/xorg.opensearch.xml"; + if ((typeof window.sidebar == "object") && $.isFunction(window.sidebar.addSearchEngine)) { + window.sidebar.addSearchEngine( + searchURI, + "http://www.polytechnique.org/images/xorg.png", + "Annuaire Polytechnique.org", + "Academic"); + } else { + try { + window.external.AddSearchProvider(searchURI); + } catch(e) { + alert("Impossible d'installer la barre de recherche"); + } } - } -} - -// }}} -// {{{ Events - -function eventClosure(obj, methodName) { - return (function(e) { - e = e || window.event; - return obj[methodName](e); - }); -} - -function attachEvent(obj, evt, f, useCapture) { - if (!useCapture) useCapture = false; - - if (obj.addEventListener) { - obj.addEventListener(evt, f, useCapture); - return true; - } else if (obj.attachEvent) { - return obj.attachEvent("on"+evt, f); - } - return false; } // }}} @@ -98,13 +81,11 @@ function attachEvent(obj, evt, f, useCapture) { function dynpost(action, values) { - var body = document.getElementsByTagName('body')[0]; - var form = document.createElement('form'); form.action = action; form.method = 'post'; - body.appendChild(form); + $('body').get(0).appendChild(form); for (var k in values) { var input = document.createElement('input'); @@ -117,6 +98,7 @@ function dynpost(action, values) form.submit(); } + function dynpostkv(action, k, v) { var dict = {}; @@ -149,133 +131,362 @@ RegExp.escape = function(text) { // {{{ function popWin() -function popWin(theNode,w,h) { +function popWin(theNode, w, h) { window.open(theNode.href, '_blank', - 'toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=1,resizable=1,width='+w+',height='+h); + 'toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=1,resizable=1,width='+w+',height='+h); + return false; } // }}} // {{{ function goodiesPopup() -function goodiesPopup(node) { - if (node.href.indexOf('ical') > -1) { - __goodies_popup(node, __goodies_ical_sites, 'Calendrier iCal'); - } else if (node.href.indexOf('rss') > -1 && (node.href.indexOf('xml') > -1 || node.href.indexOf('hash'))) { - __goodies_popup(node, __goodies_rss_sites, 'Fil rss'); - } +var __goodies_active = true; + +var __goodies_ical = { + default_title: 'Calendrier iCal', + sites: [ + {'url_prefix': '', + 'img': 'images/icons/calendar_view_day.gif', + 'title': 'Calendrier iCal'}, + {'url_prefix': 'http://www.google.com/calendar/render?cid=', + 'img': 'images/goodies/add-google-calendar.gif', + 'title': 'Ajouter à Google Calendar'}, + {'url_prefix': 'https://www.google.com/calendar/hosted/polytechnique.org/render?cid=', + 'img': 'images/goodies/add-google-calendar.gif', + 'title': 'Ajouter à Google Apps / Calendar'} + ] +}; + +var __goodies_rss = { + default_title: 'Fils RSS', + sites: [ + {'url_prefix': '', + 'img': 'images/icons/feed.gif', + 'title': 'Fil rss'}, + {'url_prefix': 'http://fusion.google.com/add?feedurl=', + 'img': 'images/goodies/add-google.gif', + 'alt': 'Add to Google', + 'title': 'Ajouter à iGoogle/Google Reader'}, + {'url_prefix': 'http://www.netvibes.com/subscribe.php?url=', + 'img': 'images/goodies/add-netvibes.gif', + 'title': 'Ajouter à Netvibes'}, + {'url_prefix': 'http://add.my.yahoo.com/content?.intl=fr&url=', + 'img': 'images/goodies/add-yahoo.gif', + 'alt': 'Add to My Yahoo!', + 'title': 'Ajouter à My Yahoo!'} + ] +}; + +function disableGoodiesPopups() { + __goodies_active = false; } -var __goodies_ical_sites = [ - {'url_prefix': '', - 'img': 'images/icons/calendar_view_day.gif', - 'title': 'Calendrier iCal'}, - {'url_prefix': 'http://www.google.com/calendar/render?cid=', - 'img': 'images/goodies/add-google-calendar.gif', - 'title': 'Ajouter à Google Calendar'} -]; -var __goodies_rss_sites = [ - {'url_prefix': '', - 'img': 'images/icons/feed.gif', - 'title': 'Fil rss'}, - {'url_prefix': 'http://fusion.google.com/add?feedurl=', - 'img': 'images/goodies/add-google.gif', - 'alt': 'Add to Google', - 'title': 'Ajouter à iGoogle/Google Reader'}, - {'url_prefix': 'http://www.netvibes.com/subscribe.php?url=', - 'img': 'images/goodies/add-netvibes.gif', - 'title': 'Ajouter à Netvibes'}, - {'url_prefix': 'http://add.my.yahoo.com/content?.intl=fr&url=', - 'img': 'images/goodies/add-yahoo.gif', - 'alt': 'Add to My Yahoo!', - 'title': 'Ajouter à My Yahoo!'} -]; - -function __goodies_popupText(url, sites) { +function goodiesPopup(node, goodies) { var text = '
'; - for (var site in sites) { - var s_alt = (sites[site]["alt"] ? sites[site]["alt"] : ""); - var s_img = sites[site]["img"]; - var s_title = (sites[site]["title"] ? sites[site]["title"] : ""); - var s_url = (sites[site]["url_prefix"].length > 0 ? sites[site]["url_prefix"] + escape(url) : url); + for (var site in goodies.sites) { + var entry = goodies.sites[site]; + var s_alt = entry["alt"] ? entry["alt"] : ""; + var s_img = entry["img"]; + var s_title = entry["title"] ? entry["title"] : ""; + var s_url = entry["url_prefix"].length > 0 ? entry["url_prefix"] + escape(this.href) : this.href; text += '' + s_alt + '
'; } - text += 'Plus de bonus ...
' - return text; -} + text += 'Plus de bonus ...'; -function __goodies_popup(node, sites, default_title) { - var mouseover_cb = function() { - var rss_text = __goodies_popupText(node.href, sites); - var rss_title = (node.title ? node.title : default_title); - return overlib(rss_text, CAPTION, rss_title, CLOSETEXT, 'Fermer', DELAY, 800, STICKY, WIDTH, 150); - } - var mouseout_cb = function() { - nd(); - } + var title = node.title ? node.title : goodies.default_title; - node.onmouseover = mouseover_cb; - node.onmouseout = mouseout_cb; + $(node) + .mouseover( + function() { + if (__goodies_active) { + return overlib(text, CAPTION, title, CLOSETEXT, 'Fermer', DELAY, 800, STICKY, WIDTH, 150); + } + } + ) + .mouseout(nd); } // }}} // {{{ function auto_links() function auto_links() { - auto_links_nodes(document.getElementsByTagName('a')); - auto_links_nodes(document.getElementsByTagName('link')); + var url = document.URL; + var fqdn = url.replace(/^https?:\/\/([^\/]*)\/.*$/,'$1'); + var light = (url.indexOf('display=light') > url.indexOf('?')); + var resource_page = (url.indexOf('rss') > -1 || url.indexOf('ical') > -1); + + $("a,link").each( + function(i) { + node = $(this); + href = this.href; + if(!href || node.hasClass('xdx') + || href.indexOf('mailto:') > -1 || href.indexOf('javascript:') > -1) { + return; + } + if ((href.indexOf(fqdn) < 0 && this.className.indexOf('popup') < 0) || node.hasClass('popup')) { + node.click(function () { window.open(this.href); return false; }); + } + if (href.indexOf(fqdn) > -1 && light) { + href = href.replace(/([^\#\?]*)\??([^\#]*)(\#.*)?/, "$1?display=light&$2$3"); + this.href = href; + } + rss = href.indexOf('rss') > -1; + ical = href.indexOf('ical') > -1; + if (rss || ical) { + if (href.indexOf('http') < 0) { + href = 'http://' + fqdn + '/' + href; + } + } + if (this.nodeName.toLowerCase() == 'a' && !resource_page) { + if (rss && href.indexOf('prefs/rss') < 0 && (href.indexOf('xml') > -1 || href.indexOf('hash'))) { + goodiesPopup(this, __goodies_rss); + } else if (ical) { + goodiesPopup(this, __goodies_ical); + } + } + if(matches = (/^popup_([0-9]*)x([0-9]*)$/).exec(this.className)) { + var w = matches[1], h = matches[2]; + node.click(function() { return popWin(this, w, h); }); + } + } + ); + $('.popup2').click(function() { return popWin(this, 840, 600); }); + $('.popup3').click(function() { return popWin(this, 640, 800); }); +} + + +// }}} + +/*************************************************************************** + * Password check + */ + +// {{{ function checkPassword + +function getType(c) { + if (c >= 'a' && c <= 'z') { + return 1; + } else if (c >= 'A' && c <= 'Z') { + return 2; + } else if (c >= '0' && c <= '9') { + return 3; + } else { + return 4; + } } -function auto_links_nodes(nodes) { - url = document.URL; - fqdn = url.replace(/^https?:\/\/([^\/]*)\/.*$/,'$1'); - light = (url.indexOf('display=light') > url.indexOf('?')); - for(var i=0; i < nodes.length; i++) { - node = nodes[i]; - if(!node.href || node.className == 'xdx' - || node.href.indexOf('mailto:') > -1 || node.href.indexOf('javascript:') > -1) - continue; - if (node.href.indexOf(fqdn) < 0 || node.className == 'popup') { - node.onclick = function () { window.open(this.href); return false; }; +function differentTypes(password) { + var prev = 0; + + for (i = 0 ; i < password.length ; ++i) { + var type = getType(password.charAt(i)); + if (prev != 0 && prev != type) { + return true; } - if (node.href.indexOf(fqdn) > -1 && light) { - node.href = node.href.replace(/([^\#\?]*)\??([^\#]*)(\#.*)?/, - "$1?display=light&$2$3"); + prev = type; + } + return false; +} + +function passwordStrength(password) { + var prop = 0; + var prev = 0; + var firstType = true; + var types = Array(0, 0, 0, 0, 0); + + for (i = 0 ; i < password.length ; ++i) { + var type = getType(password.charAt(i)); + if (prev != 0 && prev != type) { + prop += 5; + firstType = false; } - if (node.href.indexOf('rss') > -1 || node.href.indexOf('ical') > -1) { - node.href = node.href.replace(/https/, 'http'); - if (node.href.indexOf('http') < 0) { - node.href = 'http://' + fqdn + '/' + node.href; - } - if (node.nodeName.toLowerCase() == 'a') { - goodiesPopup(node); + prop += i; + if (types[type] == 0 && !firstType) { + prop += 15; + } + types[type]++; + prev = type; + } + if (password.length < 6) { + prop *= 0.75; + } + if (firstType) { + prop *= 0.75; + } + if (prop > 100) { + prop = 100; + } else if (prop < 0) { + prop = 0; + } + + return prop; +} + +function checkPassword(box, okLabel) { + var password = box.value; + var prop = passwordStrength(password); + + if (prop >= 60) { + color = "#4f4"; + bgcolor = "#050"; + ok = true; + } else if (prop >= 35) { + color = "#ff4"; + bgcolor = "#750"; + ok = true; + } else { + color = "#f20"; + bgcolor = "#700"; + ok = false; + } + $("#passwords_measure") + .stop() + .animate({ width: prop + "%", + backgroundColor: color + }, 750) + .parent().stop() + .animate({ backgroundColor: bgcolor }, 750); + var submitButton = $(":submit[name='" + passwordprompt_submit + "']"); + if (ok && password.length >= 6 && differentTypes(password)) { + submitButton.attr("value", okLabel); + submitButton.removeAttr("disabled"); + } else { + submitButton.attr("value", "Mot de passe trop faible"); + submitButton.attr("disabled", "disabled"); + } +} + +// }}} +// {{{ jQuery object extension + +(function($) { + $.xget = function(source, type, onSuccess, onError) { + function ajaxHandler(data, textStatus) { + if (textStatus == 'success') { + if (onSuccess) { + onSuccess(data); + } + } else if (textStatus == 'error') { + if (onError) { + onError(data); + } else { + alert("Une error s'est produite lors du traitement de la requête.\n" + + "Ta session a peut-être expiré"); + } } } - if(node.className == 'popup2') { - node.onclick = function () { popWin(this,840,600); return false; }; + $.get(source, ajaxHandler, type); + return false; + } + + $.fn.tmpMessage = function(message, success) { + if (success) { + this.html(" " + message) + .css('color', 'green'); + } else { + this.html(" " + message) + .css('color', 'red'); } - if(node.className == 'popup3') { - node.onclick = function () { popWin(this, 640, 800); return false; }; + return this.css('fontWeight', 'bold') + .show() + .delay(1000) + .fadeOut(500); + } + + $.fn.updateHtml = function(source, callback) { + var elements = this; + function handler(data) { + elements.html(data); + if (callback) { + callback(data); + } } - if(matches = (/^popup_([0-9]*)x([0-9]*)$/).exec(node.className)) { - var w = matches[1], h = matches[2]; - node.onclick = function () { popWin(this,w,h); return false; }; + $.xget(source, 'text', handler); + return this; + } + + $.fn.successMessage = function(source, message) { + var elements = this; + $.xget(source, 'text', function() { + elements.tmpMessage(message, true); + }); + return this; + } + + $.fn.wiki = function(text, withTitle) { + if (text == '') { + return this.html(''); + } + var url = 'wiki_preview'; + if (!withTitle) { + url += '/notitile'; } + var $this = this; + $.post(url, { text: text }, + function (data) { + $this.html(data); + }, 'text'); + return this; } -} +})(jQuery); // }}} +// {{{ preview wiki -/*************************************************************************** - * The real OnLoad - */ +function previewWiki(idFrom, idTo, withTitle, idShow) +{ + $('#' + idTo).wiki($('#' + idFrom).val(), withTitle); + if (idShow != null) { + $('#' + idShow).show(); + } +} -// {{{ function pa_onload +// }}} +// {{{ send test email -if (!attachEvent(window, 'load', auto_links)) { - window.onload = auto_links; +function sendTestEmail(token, hruid) +{ + var url = 'emails/test'; + var msg = "Un email a été envoyé avec succès"; + if (hruid != null) { + url += '/' + hruid; + msg += " sur l'adresse de " + hruid + "."; + } else { + msg += " sur ton addresse."; + } + $('#mail_sent').successMessage($url + '?token=' + token, msg); + return false; } // }}} + +/*************************************************************************** + * The real OnLoad + */ + +$(document).ready(function() { + auto_links(); + getNow(); + setInterval(getNow, 1000); + $("#quick") + .focus(function() { + if ($(this).val() === 'Recherche dans l\'annuaire') { + $(this).val(''); + } + $("#quick_button").show(); + }) + .blur(function() { + $("#quick_button").hide(); + }); + $("#quick_button").click(function() { + if ($("#quick").val() === 'Recherche dans l\'annuaire' + || $("#quick").val() === '') { + return false; + } + return true; + }); +}); + // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: