X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=htdocs%2Fjavascript%2Fxorg.js;h=7b49f179e9ac29d3ee7b877e24f471089e116f2d;hb=0c9edc89377266444fa06b77104dc5781eae1698;hp=f82cc9f03247e7ece551da212e0d58b79e614480;hpb=0c50ac76147e7c3bffa90501559bdef63bb689e3;p=platal.git diff --git a/htdocs/javascript/xorg.js b/htdocs/javascript/xorg.js index f82cc9f..7b49f17 100644 --- a/htdocs/javascript/xorg.js +++ b/htdocs/javascript/xorg.js @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2003-2008 Polytechnique.org * + * Copyright (C) 2003-2011 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'] + var hr = dt.getHours(); + var mi = dt.getMinutes(); + if (mi < 10) { + mi = '0' + mi; + } + var se = dt.getSeconds(); + if (se < 10) { + se = '0' + se; + } - return days[dy]+' '+wd+' '+months[mh]+' '+yr+'
'+time; + $(".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"); - } - } -} - -// }}} -// {{{ 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); + 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"); + } } - 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 = {}; @@ -147,139 +129,126 @@ RegExp.escape = function(text) { * POPUP THINGS */ -// {{{ function popWin() - -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); -} - -// }}} // {{{ 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('prefs/rss') < 0 && (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_active = true; -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'}, - {'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_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!'}, - {'url_prefix': 'http://www.newsgator.com/ngs/subscriber/subext.aspx?url=', - 'img': 'images/goodies/add-newsgator.gif', - 'alt': 'Subscribe in NewsGator Online', - 'title': 'Ajouter à Newsgator'} -]; - -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() { - if (__goodies_active) { - 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')); -} - -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; }; + 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) { + var node = $(this); + var href = this.href; + if(!href || node.hasClass('xdx') + || href.indexOf('mailto:') > -1 || href.indexOf('javascript:') > -1) { + return; } - if (node.href.indexOf(fqdn) > -1 && light) { - node.href = node.href.replace(/([^\#\?]*)\??([^\#]*)(\#.*)?/, - "$1?display=light&$2$3"); + if ((href.indexOf(fqdn) < 0 && this.className.indexOf('popup') < 0) || node.hasClass('popup')) { + node.click(function () { + window.open(href); + return 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); - } + if (href.indexOf(fqdn) > -1 && light) { + href = href.replace(/([^\#\?]*)\??([^\#]*)(\#.*)?/, "$1?display=light&$2$3"); + this.href = href; } - if(node.className == 'popup2') { - node.onclick = function () { popWin(this,840,600); return false; }; + var rss = href.indexOf('rss') > -1; + var ical = href.indexOf('ical') > -1; + if (rss || ical) { + if (href.indexOf('http') < 0) { + href = 'http://' + fqdn + '/' + href; + } } - if(node.className == 'popup3') { - node.onclick = function () { popWin(this, 640, 800); return false; }; + 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(node.className)) { + if(matches = (/^popup_([0-9]*)x([0-9]*)$/).exec(this.className)) { var w = matches[1], h = matches[2]; - node.onclick = function () { popWin(this,w,h); return false; }; + node.popWin(w, h); } - } + }); + $('.popup2').popWin(840, 600); + $('.popup3').popWin(640, 800); } -// }}} +// }}} /*************************************************************************** * Password check @@ -287,39 +256,54 @@ function auto_links_nodes(nodes) { // {{{ function checkPassword -function getType(char) { - if (char >= 'a' && char <= 'z') { +function getType(c) { + if (c >= 'a' && c <= 'z') { return 1; - } else if (char >= 'A' && char <= 'Z') { + } else if (c >= 'A' && c <= 'Z') { return 2; - } else if (char >= '0' && char <= '9') { + } else if (c >= '0' && c <= '9') { return 3; } else { return 4; } } -function checkPassword(box) { +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; + } + prev = type; + } + return false; +} + +function passwordStrength(password) { var prop = 0; - var pass = box.value; - var types = Array(0, 0, 0, 0, 0); + var prev = 0; var firstType = true; - for (i = 0 ; i < pass.length ; ++i) { - type = getType(pass.charAt(i)); + 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; } prop += i; if (types[type] == 0 && !firstType) { prop += 15; - } else { - firstType = false; } types[type]++; prev = type; } - if (pass.length < 6) { + if (password.length < 6) { + prop *= 0.75; + } + if (firstType) { prop *= 0.75; } if (prop > 100) { @@ -327,11 +311,19 @@ function checkPassword(box) { } 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 >= 40) { + } else if (prop >= 35) { color = "#ff4"; bgcolor = "#750"; ok = true; @@ -347,27 +339,212 @@ function checkPassword(box) { }, 750) .parent().stop() .animate({ backgroundColor: bgcolor }, 750); - var submitButton = $(":submit[@name='" + passwordprompt_submit + "']"); - if (ok && pass.length >= 6) { + 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($) { + /* Add new functions to jQuery namesapce */ + $.extend({ + /* The goal of the following functions is to provide an AJAX API that + * take a different callback in case of HTTP success code (2XX) and in + * other cases. + */ + + xajax: function(source, method, data, onSuccess, onError, type) { + /* Shift argument */ + if ($.isFunction(data)) { + type = type || onError; + onError = onSuccess; + onSuccess = data; + data = null; + } + if (onError != null && !$.isFunction(onError)) { + type = type || onError; + onError = null; + } + function ajaxHandler(data, textStatus, xhr) { + if (textStatus == 'success') { + if (onSuccess) { + onSuccess(data, textStatus, xhr); + } + } else if (textStatus == 'error') { + if (onError) { + onError(data, textStatus, xhr); + } else { + alert("Une error s'est produite lors du traitement de la requête.\n" + + "Ta session a peut-être expiré"); + } + } + } + return $.ajax({ + url: source, + type: method, + success: ajaxHandler, + data : data, + dataType: type + }); + }, + + xget: function(source, data, onSuccess, onError, type) { + return $.xajax(source, 'GET', data, onSuccess, onError, type); + }, + + xgetJSON: function(source, data, onSuccess, onError) { + return $.xget(source, data, onSuccess, onError, 'json'); + }, + + xgetScript: function(source, onSuccess, onError) { + return $.xget(source, null, onSuccess, onError, 'script'); + }, + + xgetText: function(source, data, onSuccess, onError) { + return $.xget(source, data, onSuccess, onError, 'text'); + }, + + xpost: function(source, data, onSuccess, onError, type) { + return $.xajax(source, 'POST', data, onSuccess, onError, type); + }, + + closeOnEsc: function() { + return $(window).keydown(function (e) { + if (e.keyCode == 27) { + window.close(); + } + }); + } + }); + + /* Add new functions to jQuery objects */ + $.fn.extend({ + tmpMessage: function(message, success) { + if (success) { + this.html(" " + message) + .css('color', 'green'); + } else { + this.html(" " + message) + .css('color', 'red'); + } + return this.css('fontWeight', 'bold') + .show() + .delay(1000) + .fadeOut(500); + }, + + updateHtml: function(source, callback) { + var elements = this; + function handler(data) { + elements.html(data); + if (callback) { + callback(data); + } + } + $.xget(source, handler, 'text'); + return this; + }, + + successMessage: function(source, message) { + var elements = this; + $.xget(source, function() { + elements.tmpMessage(message, true); + }); + return this; + }, + + 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; + }, + + popWin: function(w, h) { + return this.click(function() { + window.open(this.href, '_blank', + 'toolbar=0,location=0,directories=0,status=0,' + +'menubar=0,scrollbars=1,resizable=1,' + +'width='+w+',height='+h); + return false; + }); + } + }); +})(jQuery); -/*************************************************************************** - * The real OnLoad - */ +// }}} +// {{{ preview wiki + +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 + */ + +$(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: