Last active
December 28, 2017 16:41
-
-
Save gemp/43cef8a9ea7723300459 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name Forums ASI | |
// @namespace none | |
// @author gemp | |
// @description Une extension pour les forums du site Arrêt sur Images | |
// @version 2.4.3 | |
// @run-at document-end | |
// @include http://*.arretsurimages.net/forum* | |
// @include https://*.arretsurimages.net/forum* | |
// @require https://gemp.ch/forums-asi/firefox/jquery-v2.js | |
// @require https://gemp.ch/forums-asi/firefox/jquery.tablesorter.min.js | |
// @require https://gemp.ch/forums-asi/firefox/jquery.easydate.js | |
// @grant none | |
// @icon64 https://gemp.ch/forums-asi/firefox/icon-64.png | |
// @updateURL https://gist.github.com/gemp/43cef8a9ea7723300459/raw/forums-asi.user.js | |
// @downloadURL https://gist.github.com/gemp/43cef8a9ea7723300459/raw/forums-asi.user.js | |
// @supportURL http://gemp.ch/forums-asi | |
// ==/UserScript== | |
/* ****************************************************************************** | |
* Extension pour les forums du site Arrêt sur Images | |
* Version 2.4.3 - 28 décembre 2017 | |
* Fait par gemp http://gemp.ch/forums-asi/ | |
* Aucune licence, z'en faites ce que vous voulez | |
****************************************************************************** */ | |
jQuery(document).ready(function(){ | |
css = '//gemp.ch/forums-asi/firefox/forums-asi-v22.css'; | |
protocol = document.location.protocol; | |
$('head').append('<link href="'+protocol+css+'" type="text/css" rel="stylesheet" media="screen">'); | |
// copy | |
/* ****************************************************************************** | |
* CORE: INFOS ET FONCTIONS GLOBALES | |
****************************************************************************** */ | |
var core = { | |
version: '2.4.3', | |
messname: 'v2transfert',// le nom du message qui s'affiche en haut et qui nomme le "cookie" | |
messheight: 150, // la hauteur du message en haut | |
firefox: false, // ne sert plus | |
debug: false, // pour avoir les messages console | |
page: '', // contiendra le type de page sur lequel on est après core.detection | |
idprefix: 'post-', // le préfixe des div des commentaires | |
msgprefix: 'msg-', // le préfixe des ancres | |
classprefix: 'uid-', // le préfixe de classe des commentaires | |
newclass: '.new-flag', // la classe des "nouveau" | |
votedclass: '.vote', // la classe du com qu'on a éventuellement voté -- est '.voter' sinon | |
exturl: 'https://gemp.ch/forums-asi/', // safari.extension.baseURI, // | |
detection: function() { // savoir sur quelle page on est | |
var page; | |
var fid = $('#post-form input[name=forum_id]').val(); // l'id du forum | |
var tid = $('#post-form input[name=thread]').val(); // l'id de l'article | |
if (fid && tid) { // normalement on est sur un fil ou la preview | |
core.forumID = fid; // on stocke dans core | |
core.filID = tid; | |
if ($('#phorum').find('.message.prime:first').length) { // on est sur le fil | |
page = 'fil'; | |
} else { // on est sur la preview ou l'accusé de réception d'un commentaire ? | |
page = 'preview'; | |
} | |
} else { // ailleurs | |
var som = $('#phorum').find('td.titre'); | |
if (som.length >= 18) { // sommaire principal | |
page = 'sommaire'; | |
} else if (som.length) { // sous-sommaire d'une section | |
page = 'sous-sommaire'; | |
} else { | |
page = 'ailleurs'; | |
} | |
// À FAIRE ÉVENTUELLEMENT LES PM : | |
// $('form#phorum-mp-list') = inbox ou outbox | |
// input hidden name="forler_id" value="inbox" | |
// input hidden name="forler_id" value="outbox" | |
// etc. -- a big pain | |
} | |
core.page = page; | |
return page; | |
}, | |
divID: function(id, diese) { // fabrique l'ID du div post-gemp | |
var diese = diese ? '#' : ''; | |
return diese + core.idprefix + id; | |
}, | |
divClass: function(uid, point) { // fabrique la classe uid-* du div post-gemp | |
var point = point ? '.' : ''; | |
return point + core.classprefix + uid; | |
}, | |
msgID: function(id, diese) { // fabrique le name des ancres | |
var diese = diese ? '#' : ''; | |
return diese + core.msgprefix + id; | |
}, | |
makeQID: function(id) { // fabrique le QID, càd le PID préfixé de l'identifiant du forum | |
return core.forumID+','+id; | |
}, | |
checkstructure: function() { // vérifie si on a besoin de reconstruire la page @@@@ À REFAIRE ?!! | |
if ($('a[name^="'+ core.msgprefix +'"]:first').length) { | |
return $('a[name^="'+ core.msgprefix +'"]:first').closest('div').attr('id').match(core.idprefix); | |
} else { | |
return false; | |
} | |
}, | |
getIgnoreClass: function(uid) { | |
var uid_index = core.ignoreArr.map(function(obj) {return obj.id;}).indexOf(uid); | |
var ignoreclass = uid_index !== -1 ? core.ignoreArr[uid_index].ignore : ''; | |
return ignoreclass; | |
}, | |
sortByName:function(a, b){ // la gestion du sorting de la liste des gens | |
var aName = a.nom.toLowerCase(); | |
var bName = b.nom.toLowerCase(); | |
return ((aName < bName) ? -1 : ((aName > bName) ? 1 : 0)); | |
}, | |
sortByDate: function(a, b){ | |
return ((a.tSort < b.tSort) ? -1 : ((a.tSort > b.tSort) ? 1 : 0)); | |
}, | |
sortByOrder: function(a, b){ | |
return ((a.nSort < b.nSort) ? -1 : ((a.nSort > b.nSort) ? 1 : 0)); | |
}, | |
sortByOption: function(arr){ | |
if (core.sort == 'linear') { | |
return arr.sort(core.sortByOrder); | |
} else { | |
return arr.sort(core.sortByDate) | |
} | |
}, | |
// fonctions debuggage | |
t: function(nom, end){ | |
if (core.debug) end ? console.timeEnd(nom) : console.time(nom) | |
}, | |
log: function(what){ | |
if (core.debug) console.log(what); | |
} | |
} // core end | |
/* ****************************************************************************** | |
* FAG: RECONSTRUCTION ET AJOUTS | |
****************************************************************************** */ | |
var fag = { | |
rebuilded: false, | |
init: function() { | |
timer.start(); | |
temps.asistart = temps.timestamp() - temps.transformDate('08:00', '12/09/2007')[0]; // les débuts d’ASI | |
var page = core.detection(); // sur quelle page est-on | |
core.egoName = $('#user-info .coleft').text(); // my name | |
core.egoPID = $('#post input[name=user_id]').val(); // my id | |
core.egoQID = core.makeQID(core.egoPID); // son propre qid tel qu'il est utilisé dans les liens | |
if (page == 'fil') { | |
// core.forumID = ''; // l'id du forum, déféni par core.detection | |
// core.filID = ''; // l'id de l'article, défini par core.detection | |
fag.$messages = $('.message.prime:not(:first)').clone(); // mise de tous les commentaires en cache | |
fag.$messages.find('.pas-elu').css('margin-top', '16px'); // hacks pour ces putain de CSS | |
$('#phorum').find('div.nav:last').css('margin-top', '16px'); // hack | |
// - Pour que "Répondre" sur l'article original ne mette plus un titre vide avec seulement "Re: " | |
$('.message.prime:first').addClass('firstmessage') | |
.find('.generic').append('<h2 style="display: none">'+ $('.message.prime:first h1').text() + '</h2>'); | |
core.people = {}; // objet pour stocker les contributeurs | |
core.peopleArr = []; // array pour stocker le lien avec le contributeur | |
core.fullArr = []; // array pour stocker tous les commentaires | |
core.fullTree = []; // array de l'arbre de tous les commentaires --> NEW | |
core.egoArr = []; // array pour stocker l'ego (peuplée par core.people[core.egoPID]) | |
core.newArr = []; // array pour stocker les nouveaux | |
core.ignoreArr = []; // array pour stocker les contributeurs ignorés | |
gdb.init(); // rappel des nouveaux | |
cykl.init(); // bon endroit ? | |
// Bon endroit ? | |
var json_ignore = store.get('gemp:ignore'); | |
if(json_ignore) core.ignoreArr = JSON.parse(json_ignore); | |
core.needrebuild = !core.checkstructure(); // doit-on reconstruire? <------- à modifier ? @@@@ | |
if (core.needrebuild) { // plus vraiment nécessaire, vu qu'on ne "reconstruit" plus | |
$('#btn_cycle .n').text('Reconstruction'); | |
setTimeout(fag.rebuild, 10); // on lance le rebuild avec un petit décalage | |
} else { // fonctions aussi présentres dans fag.endbuild | |
fag.construct(); | |
} | |
keyb.init(); // bon endroit ? | |
} else if (page == 'sommaire' || page == 'sous-sommaire') { | |
sommaire.init(); | |
} else if (page == 'preview') { | |
fag.linking(); | |
} | |
}, | |
rebuild: function() { // "reconstruction" de la page, le terme est moins approprié | |
// puisqu'à l'origine, je reconstruisais comme j'attendais qu'ASI le fasse en dur | |
// ce qui n'arrivera sans doute jamais, donc je fais autrement | |
core.t('rebuildfull'); | |
var niveaux = []; // array temporaire des niveaux | |
var commentaires_id = []; // collection rapide des ID des commentaires | |
var current_div = []; // l'array qui va contenir l'indication du niveau | |
var $ancres = $('a[name^="msg"]'); // ancres en cache, supprimées à la première boucle | |
// --> core.t('niveaux'); | |
$.each(fag.$messages, function(i, $v) { // première boucle | |
var id = $ancres.eq(i).attr('name').substr(core.msgprefix.length); | |
commentaires_id.push(id); // on récupère l'ID depuis le href de l'ancre | |
var niv = parseInt($(this).css('margin-left'), 10)/20; | |
niveaux.push(niv); // on récupère l'indentation, seule indication de la structure | |
}); | |
$ancres.remove(); // suppression des ancres en global | |
// --> core.t('niveaux', true); | |
for (var i = 0; i < fag.$messages.length; i++) { // seconde boucle | |
var niv = niveaux[i]; | |
var id = commentaires_id[i]; | |
var $mess = fag.$messages.eq(i); // le message courant | |
// --> core.t('wrap'); | |
// ON NE WRAPE PLUS, ON AJOUTE JUSTE ID ET CLASSES | |
var divid = core.divID(id); | |
var classes = 'post-gemp niveau-'+niv+' reponse-ouverte'; | |
$mess.addClass(classes).attr('id', divid); // --> NEW ajout de la classe au div existant | |
var data = fag.infopeople(id, $mess, i); // on stocke les infos people | |
var ignoreclass = core.getIgnoreClass(data.pid); | |
var divclass = core.divClass(data.pid); | |
var ignoreclasses = ignoreclass + ' ' + divclass; | |
$mess.addClass(ignoreclasses); | |
if(ignoreclass == 'ewarning') $mess.find('.content').addClass('com-origine'); | |
data.nouveau = $(core.newclass, $mess).length; // si c'est un nouveau | |
if (data.nouveau) core.newArr.push(data); // on ajoute les nouveaux | |
var nom = core.people[data.pid]['nom']; // on récupère le nom | |
var ref = {'id': id, 'nom': nom}; // les données pour le lien éventuel à une réponse | |
current_div[niv] = ref; // initialisation du niveau | |
if (niv > 1) { // c'est une réponse, on ajoute les informations de son origine | |
data.origine = current_div[niv-1]; // ... qui se trouvent un niveau plus haut | |
// et on ajoute ce commentaire à tous les autres des niveaux précédents | |
for (var j = 1; j < niv; j++) core.fullTree[current_div[j].id].push(id); | |
} | |
core.fullArr.push(data); // on stocke les données du commentaire | |
core.fullTree[id] = []; // pour y mettre les éventuelles réponses | |
// --> core.t('wrap', true); | |
} | |
// On applique les classes aux messages élus | |
$('.messages_vote .message').each(function(){ | |
var plink = $(this).find('.message-infos a').attr('href').split(','); | |
var uid = plink[plink.length -1]; | |
var ignoreclasses = core.getIgnoreClass(uid) + ' ' + core.divClass(uid); | |
$(this).addClass(ignoreclasses); | |
}); | |
fag.endbuild(); | |
}, | |
endbuild: function() { // fin de la "reconstruction" y'a plus grand chose | |
fag.rebuilded = true; | |
// *--> | |
core.t('rebuildfull', true); | |
$('#btn_cycle .n').text('Navigation'); | |
setTimeout(fag.construct, 10); // on lance la suite avec un petit décalage | |
}, | |
construct: function() { // fabrication des éléments de navigation | |
// *--> | |
core.t('construct'); | |
for (var i = 0; i < core.fullArr.length; i++) { // 3e boucle | |
// --> core.t('h2'); | |
var $mess = fag.$messages.eq(i); // le commentaire courant | |
var m = core.fullArr[i]; // les infos du commentaire courant | |
var id = m.id; | |
var niv = m.origine; // | |
var classe = core.fullTree[id].length ? 'repondu' : 'pas-de-reponse'; | |
$mess.addClass(classe).find('h2:first').attr('rel', id); // on stocke l'ID dans le titre | |
// on pourrait virer ce stockage d'ID, mais bon, ça ne prend presque rien et c'est pratique | |
if (niv) { // on est sur une réponse | |
var refid = m.origine.id; | |
var refnom = m.origine.nom; | |
$mess.find('.message-infos:first') | |
.append(' en réponse à <b class="retour-com" rel="'+refid+'">'+refnom+' </b>'); | |
} | |
// --> core.t('h2', true); | |
fag.constructed = true; | |
// *--> | |
core.t('construct', true); | |
} | |
fag.endfag(); | |
}, // construct end | |
endfag: function() { // les fonctions appelées à la fin de construct, ça s'est étoffé | |
// *--> | |
core.t('fagend'); | |
// on remplit l'array egoArr | |
if (core.people[core.egoPID]) { | |
core.egoArr = core.people[core.egoPID]['com'].slice(); // doit-on dupliquer?! | |
} | |
// les boutons d'ouverture et de fermeture des commentaires | |
var bouton0 = $('<div class="eye"></div>'); | |
var bouton1 = $('<p class="seul">Ouvrir ce commentaire</p>'); | |
var bouton2 = $('<p class="ouvrir">Ouvrir toutes les réponses</p>'); | |
var bouton3 = $('<p class="fermer">Fermer les réponses</p>'); | |
var bouton = $(bouton0).add(bouton1).add(bouton2).add(bouton3); | |
fag.$messages.find('.message-user-info').append(bouton); | |
fag.$messages.find('.content') | |
.append('<span class="develop" title="Afficher l’intégralité du commentaire"><b> + </b></span>') | |
.find('.develop').click(function(){ | |
$(this).parent().removeClass('com-origine'); | |
}); | |
$newfil = $('<div id="forums-asi-extended" />').append(fag.$messages); // on range nos clones | |
$newfil.find('.post-gemp').each(function() { // on recrée les ancres | |
$(this).before('<a name="'+ this.id.replace(core.idprefix, core.msgprefix) +'" />'); | |
}); | |
$('.message.prime:not(:first)').wrapAll('<div id="raz" />'); // on range tous les commentaires | |
$('#raz').remove(); // on vire les commentaires rangés | |
$newfil.insertAfter($('.messages_vote:first')); // insertion des clones | |
// délégations des clicks des boutons et autres | |
$('#forums-asi-extended h2').on('click', function() { | |
$('.retour-btn').remove(); // au cas où, on supprime les boutons de retour *** faire une fonction ? | |
window.location.hash = core.msgID( $(this).attr('rel') ); | |
}); | |
$('#forums-asi-extended .retour-com').on('click', function(){ | |
$('.retour-btn').remove(); | |
core.gotocom = 'reponse'; | |
$( core.divID($(this).attr('rel'), true) ) | |
.find('.message-infos:first') | |
.append(' <b class="retour-btn" rel="'+ $(this) | |
.parents().find('h2:first').attr('rel') +'"> Revenir à la réponse </b>') | |
.find('.retour-btn') | |
.click(function(){ | |
$('.retour-btn').remove(); | |
window.location.hash = core.msgID( $(this).attr('rel') ); | |
core.gotocom = 'origine'; | |
}); | |
var reltmp = $(this).attr('rel'); | |
$( core.divID(reltmp, true )).scrollView(); // pour être sûr | |
window.location.hash = core.msgID( reltmp ); | |
}); | |
$('#forums-asi-extended .seul').on('click', function(){ | |
manip.ouvrirSeule(manip.idfromH2(this)); | |
}); | |
$('#forums-asi-extended .ouvrir').on('click', function(){ | |
manip.ouvrirToutes(manip.idfromH2(this)); | |
}); | |
$('#forums-asi-extended .fermer').on('click', function(){ | |
manip.fermerToutes(manip.idfromH2(this)); | |
}); | |
$('.eye').click(function () { | |
manip.ignoreAction($(this)); | |
}); | |
core.articleDate = temps.recupereDate( $(core.divID(core.filID, true)).find('.message-infos:first') ); | |
// pour ranger le header un peu | |
$('.header-first-post') | |
.insertAfter($('.messages_vote:first')) | |
.before('<a name="liste-com"></a>') | |
.wrap('<div class="message" />') | |
.after('<div id="commentateurs" />') | |
.after('<div id="gemp-options" />') | |
.after('<span id="fagtimer" />'); | |
$('.header-first-post, #gemp-options, #fagtimer').hover( | |
function(){ | |
if (keyb.altdown) { | |
$('#gemp-options').hide(0); | |
$('#fagtimer').show(0); | |
} | |
},function(){ | |
$('#gemp-options').show(0); | |
$('#fagtimer').hide(0); | |
}); | |
gdb.process(); | |
cykl.endbuild(); | |
faglist.init(); | |
fag.formFromFixForAsi(); | |
fag.eluscontexte(); | |
fag.vote(); | |
fag.linking(); | |
// pour essayer d'arriver où on veut dans la page | |
if (window.location.hash.match(core.msgprefix)) { | |
var finalgoto = function() { | |
var hash = window.location.hash; | |
$(hash.replace(core.msgprefix, core.idprefix)).scrollView(); | |
} | |
setTimeout(finalgoto, 100); | |
} | |
aide.init(); | |
// *--> | |
core.t('fagend', true); | |
timer.stop(); | |
core.log('timer: '+timer.totalTime); | |
var t = 'Temps de reconstruction : <b>'+timer.formatTime()+'</b>'; | |
var m = "Réafficher le dernier message de l'extension"; | |
var v = ' (version: <a id="re-message">'+core.version+'</a>)'; | |
// - jQ: '+$().jquery+')'; | |
$('#fagtimer').html(t+v); | |
$('#re-message').attr('title', "Réafficher le dernier message de l'extension") | |
.css('cursor', 'pointer').click(function(){ | |
if (!$('#ifmess').length) { // pour ne pas l'afficher deux fois | |
aide.message(core.messname, core.messheight, true); | |
} | |
return false; | |
}); | |
}, // fagend end | |
infopeople: function(id, mess, order) { // les infos d'un commentaire | |
var identite = $('.message-infos a:first', mess); | |
var qid = identite.attr('href').split('?')[1]; // identifiant asi --------> est en fait QID | |
var pid = qid.split(',')[1]; | |
if ($.inArray(pid, core.peopleArr) < 0) { // s'il n'a pas d'entrée dans l'array des contributeurs | |
core.peopleArr.push(pid); // dans l'array | |
core.people[pid] = {}; // dans l'objet | |
core.people[pid]['nom'] = identite.text(); | |
core.people[pid]['com'] = []; // l'array de tous ses commentaires | |
} | |
var infos = $('.message-user-info:first', mess); | |
var t = temps.recupereDate(infos); | |
// PID != QID -- verif "store" @@@@ | |
var data = {'id': id, 'pid': pid, 'date': t[1], 'heure': t[2], 'tSort': t[0], 'nSort': order}; | |
core.people[pid]['com'].push(data); | |
return data; | |
}, | |
linking: function() { // rend les liens faits dans le même fil sans ouverture de fenêtre ou changement de page | |
// et images à la fin - version 2.2 | |
var displayimages = store.get('gemp:images'); | |
var icon = 'https://www.arretsurimages.net/forum/mods/bbcode/icons/image.gif'; | |
var local = new RegExp("https:\/\/(www\.)?arretsurimages\.net\/forum\/read\.php\?", "i"); | |
var vitedit = new RegExp("https:\/\/(www\.)?arretsurimages\.net\/vite-dit\.php#([\\d]+)", "i"); | |
var image = new RegExp("https?:\/\/[^$]+\.(gif|jpg|png)$", "i"); | |
var $content = core.page == 'fil' ? $('.post-gemp .content a') : $('.message-body a'); | |
$content.each(function(){ | |
var h = this.href; | |
if (h.match(local)) { | |
var msg = "Lien vers un autre fil des forums d'ASI \nsur lequel il peut y avoir des ´nouveau´...!"; | |
$(this).wrap('<span />').attr('title', msg); | |
$(this).parent() | |
.append('<a href="'+h+'" title="'+msg+'" class="lien-interne"> ↺</a>') | |
.mouseenter(function(){ | |
var msg = "lien vers un commentaire du même fil, \ndonc ne changera pas de fenêtre"; | |
var local = new RegExp("https:\/\/(www\.)?arretsurimages\.net\/forum\/read\.php.\\d,"+core.filID+"[^#]*(#msg-[\\d,]+)", "i"); | |
if (m = h.match(local)) { | |
$(this).parent().find('a') | |
.attr({target: '_self', 'title': msg, href: m[2]}) | |
.eq(1).removeClass('lien-interne').addClass('lien-page'); | |
} | |
}); | |
} else if (m = h.match(vitedit)) { // corriger les liens "ancres" vers les vite-dits | |
// local en ancre: https://www.arretsurimages.net/vite-dit.php#14552 | |
// absolus: https://www.arretsurimages.net/vite.php?id=14552 | |
this.href = 'https://www.arretsurimages.net/vite.php?id='+m[2]; | |
} else if (m = h.match(image)) { // afficher les images | |
// console.log('found: '+m[0]) // DEBUG | |
var txt = "Afficher ou masquer l'image"; | |
var display = displayimages == 'true' ? '' : ' class="hidden-img"'; | |
var img = '<div class="insert-img"><br /><img src="'+m[0]+'"><br /><br /></div>'; | |
var insert = ' <span'+display+'><img src="'+icon+'" class="click-img" title="'+txt+'">'+img+'</span>'; | |
// DEBUG | |
insert += '<!--[img]-->'; | |
$(this).after(insert); | |
} | |
}); | |
$('.click-img').click(function() { | |
$(this).parent().toggleClass('hidden-img'); | |
}); | |
if (displayimages == 'true') { | |
var opc = ''; | |
var txt = "Toujours masquer les images dans les commentaires"; | |
} else { | |
var opc = ' class="display-off"'; | |
var txt = "Toujours afficher les images dans les commentaires"; | |
} | |
var imgbtn = '<img src="'+icon+'" title="'+txt+'">' | |
var html = '<span'+opc+' id="display-images">'+imgbtn+'</span>'; | |
$('#gemp-options').append(html); | |
$('#display-images').click(function() { | |
if ($(this).hasClass('display-off')) { | |
$(this).removeClass('display-off'); | |
$('.insert-img').parent().removeClass('hidden-img'); | |
store.set('gemp:images', 'true'); | |
} else { | |
$(this).addClass('display-off'); | |
$('.insert-img').parent().addClass('hidden-img'); | |
store.set('gemp:images', 'false'); | |
} | |
}); | |
}, | |
vote: function() { | |
var v = $('.post-gemp .vote'); | |
if (v.length) v = manip.idfromH2(v); | |
else v = false; | |
fag.showvote(v); | |
$('.post-gemp .vote, .post-gemp .voter').live('click', function(){ | |
var v = manip.idfromH2(this); | |
fag.showvote(v); | |
}); | |
// function voter(el,p) { // la fonction d'ASI - on n'override pas | |
// if ($(el).attr('class')=='vote') | |
// return; | |
// $.get("voter.php", p , | |
// function(){ | |
// $('a.vote').text('VOTER'); | |
// $('a.vote').addClass('voter'); | |
// $('a.voter').removeClass('vote'); | |
// $(el).text('VOTÉ'); | |
// $(el).removeClass('voter'); | |
// $(el).addClass('vote'); | |
// }); | |
// | |
// } | |
}, | |
showvote: function(id) { // indique son vote dans la barre et le marque s'il est élu | |
var vote = '<img src="/forum/templates/asi/icon/message-elu.gif" />'; | |
var icon = '<img src="/forum/templates/asi/icon/voter.gif" />'; | |
if (id) { | |
var lnk = '<a href="'+core.msgID(id, true)+'">_X_</a>'; | |
var txt = lnk.replace('_X_', ' votre vote'); | |
var opc = 1; | |
vote = lnk.replace('_X_', vote); | |
store.write('ego:vote', id); | |
} else { | |
var txt = ' pas de vote'; | |
var opc = .7; | |
} | |
var html = '<span style="opacity: '+opc+'" id="yourvote">'+vote+txt+'</span>'; | |
if ($('#yourvote').length) $('#yourvote').replaceWith(html) | |
else $('#gemp-options').append(html); | |
$('#youvoted').remove(); | |
$('.content-elu').each(function(){ | |
var elu = this.id.split('_')[1]; | |
if (elu == id) { // marquage de son vote s'il est élu | |
var com = "Vous avez voté pour ce commentaire"; | |
$(this).parents().closest('.elu') | |
.find('h2').prepend('<span id="youvoted" title="'+com+'">'+icon+'</span> '); | |
} | |
}); | |
}, | |
formHeader: function(source) { | |
if (!source || !$(source).attr('id')) { | |
// on réinitialise, soit parce qu'on a cliqué sur le bouton, soit on est sur l'article original | |
store.removeAsi('form'); | |
$('div#post').find('input[name=parent_id]').attr('value', core.filID).end() | |
.find('h1').text('Ajouter un commentaire général').css('color', '#333'); | |
} else { | |
if (core.page == 'fil') { // on est sur le fil | |
var nom = $(source).find('.message-infos a').text(); | |
var de = nom.match(/^[aeiouyh]/i) ? "d'" : "de "; | |
var heure = $(source).find('.message-user-info .heure').text(); | |
var txt = "Répondre au commentaire "+de+"<b style=\"color: #000; font-size: 105%\">"+nom+"</b> écrit à "+heure; | |
store.writeAsi('form', txt); | |
} else { // preview ?! | |
var txt = store.read('form'); | |
} | |
if (txt != null) { | |
var empty = $('<span id="formempty">Répondre en général</span>'); | |
$('div#post').find('h1').css('color', '#666').html(txt).append(empty); | |
$('#formempty').live('click', function(){ | |
fag.formHeader(false); | |
}); | |
} | |
} | |
}, | |
// Je pense ça ne fonctionne pas... | |
formFromFixForAsi: function() { // récup des fonctions du formulaire annulées par .clone() | |
// ajouts pour éviter les posts mal placés: | |
// si on suit un lien direct read.php?9,1111531,1198278#msg-1198278 | |
// au lieu de read.php?9,1111531#msg-1198278 | |
// le "parent_id" est pré-rempli, donc on le réinitialise par sécurité, sauf sur la preview: | |
if ($('#post').length) fag.formHeader(!fag.$messages.length > 0); | |
$('a.repondre, a.citer').click(function(e){ | |
e.preventDefault(); | |
var div = $(this).parents('div.message:first'); | |
var id = new RegExp('([0-9]+)#REPLY').exec($('.repondre', div).attr('href'))[1]; | |
fag.formHeader(div); // ajout | |
$('div#post') | |
.find('h1,form').css('width','auto').end() | |
.find('input[name=parent_id]').attr('value',id).end() | |
.remove() | |
.appendTo(div) | |
.width(div.width()); | |
var subject = $('h2:first', div).text(); | |
subject = (subject.match(/^Re:/) ? "" : "Re: ")+subject; | |
if ($('h2:first',div).find('span.new-flag').length>0) { | |
subject = subject.replace(/nouveau *$/i,""); | |
} | |
$('#subject').attr('value',subject); | |
if ($(this).hasClass('citer')) { | |
// apparemment, c'est pas moi qui fait ça... je ne peux pas y toucher | |
var txtQuote = '[quote]\n'+$('.content', div).text()+'\n[/quote]'; | |
$('#post-body textarea').value = txtQuote; | |
} | |
}); | |
}, | |
eluscontexte: function() { // gestion des liens "lire en contexte" des élus | |
var elus = $('.messages_vote .elu'); | |
for(var i = 0; i < elus.length; i++) { | |
elus.eq(i).find('a').last().click(function(){ | |
var id = this.href.match(/msg-(\d+)/)[1]; | |
window.location.hash = core.msgID(id, true); | |
return false; | |
}); | |
} | |
}, | |
} // fag end | |
/* ****************************************************************************** | |
* AIDE: AFFICHER L'AIDE ET NAVIGUER DEDANS | |
****************************************************************************** */ | |
var aide = { | |
init: function() { | |
var title = "Aide pour l'extension Forums ASI"; | |
var $html = $('<span id="gemp-aide" title="'+title+'">aide</span>').click(function(){ | |
aide.disp(); | |
}); | |
if (core.page == 'sommaire' || core.page == 'sous-sommaire') { | |
$('#search-area').after($html); | |
}; | |
$('#gemp-options').append($html); | |
if(core.debug) { // @@@@ DEBUG | |
window.localStorage.removeItem('gemp:pref:'+core.messname); // réaffiche le dernier message | |
// $('#gemp-aide').click(); | |
} | |
aide.message(core.messname, core.messheight); // second élément: height | |
}, | |
message: function(page, height, re) { | |
var display = store.get('gemp:pref:'+page); | |
if(store.get('gemp:pref:'+page) == null || re) { // on ne l'a jamais vu ou on veut le revoir | |
var icon = '<img src="'+core.exturl+'/images/icon-92.png" id="iconmess" />'; | |
var height = height ? ' style="height: '+height+'px"' : ''; | |
var $iframe = $('<iframe id="ifmess" src="'+core.exturl+'messages/'+page+'.php"'+height+' />'); | |
var $bouton = $('<span id="closemess" rel="'+page+'">Fermer ce message</span>').click(function(){ | |
var url = $(this).attr('rel'); | |
$('#closemess').css('color', 'transparent'); | |
$('#ifmess, #closemess').animate({height: 1, opacity: .2}, 500, function(){ | |
$('#ifmess, #closemess, #iconmess').remove(); | |
}); | |
$('#iconmess').animate({left: -100, opacity: 0}, 500); | |
store.set('gemp:pref:'+page, 1); // on dit qu'on est passé | |
}); | |
$('#top').append(icon).append($iframe).append($bouton); | |
} | |
}, | |
disp: function() { | |
var layer = ('<iframe id="aide-frame" src="'+core.exturl+'aide/index.php" />'); | |
var bouton = ('<span id="closeaide">Fermer l’aide</span>'); | |
layer = ('<span id="aide-main" style="margin-top: -1000px">'+bouton+layer+'</span>'); | |
var $layer = $('<span id="aide-over">'+layer+'</span>').click(function(){ | |
$('#aide-main').animate({marginTop: '640px'}, 1000); | |
$('#aide-over').animate({opacity: 0}, 1000, function(){ | |
$('#aide-over').remove(); | |
}); | |
}); | |
$('body').append($layer.css({opacity: 0})); | |
$('#closeaide').click(function(){ | |
$('#aide-over').click(); | |
}); | |
// affichage | |
$('#aide-main').animate({marginTop: 0}, 700); | |
$('#aide-over').animate({opacity: 1}, 500, function(){ | |
}); | |
}, | |
} // aide end | |
/* ****************************************************************************** | |
* CYKL: LA GESTION DU CYCLE WIDGET | |
****************************************************************************** */ | |
var cykl = { | |
init: function() { | |
cykl.cycle = $('<div id="fix-gemp" class="cycle" />') | |
.append('<span id="ego_cycle" />') | |
.append('<span id="new_cycle" />') | |
.append('<span id="com_cycle" />'); | |
cykl.btncycle(); | |
cykl.cycle.wrapInner('<div id="fix-cycle-inner" />').appendTo('body'); | |
// si on veut naviguer en lineaire ou en chronologique | |
core.sort = store.get('gemp:pref:sort') != null ? store.get('gemp:pref:sort') : 'linear'; | |
}, // cykl.init end | |
btncycle: function() { | |
var $base = $('<span id="btn_cycle" />'); // ATTENTION ! a changé d'ID **** | |
$base.html('<i><img src="https://www.arretsurimages.net/forum/templates/asi/icon/monter.gif" alt="^" /></i>'); | |
if (core.needrebuild) { | |
$base.append('<b id="rebuild" class="n">Reconstruction</b> ').addClass('loading'); | |
$('#rebuild').live('click', function(){ | |
$('#fix-gemp').hide(); // on permet de fermer le widget si on a interrompu le script | |
}); // click: Annulation...? | |
} | |
cykl.cycle.append($base); | |
}, | |
comment_cycle: function(type, obj, current) { | |
core.t('comcykl'); | |
var total = obj.length; | |
var num = '#'+type+'_num'; | |
if (type == 'com') var cur_color = 'rgba(204,102,0,.1)' | |
else if (type == 'ego') var cur_color = 'rgba(0,102,0,.1)' | |
else if (type == 'new') var cur_color = 'rgba(255,0,0,.1)' | |
if (keyb.altdown) { | |
if (--current < 0) current = total-1; // si alt est enfoncé, on recule | |
} else { | |
++current; | |
if (type == 'new') store.currentCheck(current); // pour indiquer le nombre éventuel de non-lus | |
if (current > total) current = 0; | |
} | |
if (current >= total) { | |
current = -1; | |
anchor = 'liste-com'; | |
$(num).html(total); | |
} else { | |
$(num).html((current+1)+'/'+total); | |
var pid = obj[current].id; | |
var first = $( core.divID(pid, true) ).hasClass('niveau-1'); | |
anchor = core.msgID(pid); | |
} | |
var post = $( core.divID(pid, true) ); | |
core.t('manips'); | |
$('.retour-btn').remove(); | |
$('.com-origine, .goto-origine, .goto-reponse, .current') // goto-reponse est le "current", sauf en niveau-1 | |
.removeClass('com-origine goto-origine goto-reponse, .current') | |
.find('.generic').css('background-color', 'transparent'); | |
$('.ewarning .content').addClass('com-origine'); | |
core.t('manips',1); | |
manip.ouvrirToutes(false); | |
window.location.hash = anchor; // @@@@ ????? | |
if (!first && anchor != 'liste-com') { | |
var origineID = post.find('.retour-com').attr('rel'); | |
var origine = $(core.divID(origineID, true)); | |
if (!keyb.capdown) { // on ne va pas sur le commentaire d'origine si capslocl est on | |
origine.scrollView(); | |
if (core.fullTree[origineID].length > 1) { // inutile de fermer s'il n'y a q'un commentaire | |
manip.fermerToutes(origineID); | |
} else { | |
manip.ouvrirToutes(origineID); // pour actualiser le message du bouton | |
} | |
origine.find('.content').addClass('com-origine'); // sinon, ça fout la zone avec window.location.hash | |
} | |
origine.addClass('goto-origine') | |
.find('.message-infos:first').append(' <b class="retour-btn" rel="'+ core.divID(pid) +'">Aller au commentaire </b>') | |
.find('.retour-btn').click(function(){ | |
$('#'+ $(this).attr('rel') ).scrollView(); | |
$(this).remove(); | |
core.gotocom = 'origine'; | |
}).end().end(); | |
manip.ouvrirSeule(post.addClass('goto-reponse').find('h2').attr('rel')); | |
core.gotocom = !keyb.capdown ? 'reponse' : 'origine'; | |
} | |
post.addClass('current').find('.generic:first').css('background-color', cur_color); // class & couleur | |
core.t('comcykl',1); | |
return current; | |
}, | |
btnego: function() { // CIRCULATION DANS LES EGO | |
cykl.currentEgo = -1; | |
var $egoStr = $('<span id="ego_cycle"><b id="ego_num">'+cykl.totalEgo+'</b> <b class="n">ego</b> </span>').click(function(){ | |
if (!cykl.testEgo) { | |
core.t('egostart'); | |
for (i = 0; i < cykl.totalEgo; i++) { | |
a = core.egoArr[i].id; | |
$( core.divID(a, true)+' .pas-elu h2:first').before('<b class="ego-badge badge">'+(i+1)+'</b>'); | |
} | |
cykl.testEgo = true; | |
core.t('egostart', true); | |
} | |
$('.badge').hide(); | |
$('.ego-badge').show(); | |
cykl.currentEgo = cykl.comment_cycle('ego', core.egoArr, cykl.currentEgo); | |
}); | |
$('#ego_cycle').replaceWith($egoStr); | |
}, | |
btnnew: function() { // CIRCULATION DANS LES NEW | |
cykl.currentNew = -1; | |
var displayNew = cykl.totalNew; | |
if (store.read('nouveaux:current')) { | |
cykl.currentNew = store.read('nouveaux:current')-1; | |
displayNew = (cykl.currentNew+1)+'/'+displayNew; | |
} | |
var $newStr = $('<span id="new_cycle"><b id="new_num">'+displayNew+'</b> <b class="n">nouveau</b> </span>').click(function(){ | |
if (!cykl.testNew) { | |
for (i = 0; i < cykl.totalNew; i++) { | |
a = core.newArr[i].id; | |
$( core.divID(a, true)+' .pas-elu h2:first').before('<b class="new-badge badge">'+(i+1)+'</b>'); | |
} | |
cykl.testNew = true; | |
} | |
$('.badge').hide(); | |
$('.new-badge').show(); | |
cykl.currentNew = cykl.comment_cycle('new', core.newArr, cykl.currentNew); | |
}); | |
$('#new_cycle').replaceWith($newStr); | |
}, | |
show_people_comment: function(pid) { // CIRCULATION DANS LES COMMENTATEURS | |
$('#fix-gemp').hide(); // hack | |
var anchor = 'liste-com'; | |
var com = core.people[pid].com.slice(); | |
// if (sort) com.sort(core.sortByDate); // on sort si on arrive depuis la liste, pas le standard "ego" @@@@ --> SORT | |
core.sortByOption(com); // le nouveau sort, selon préfs | |
cykl.currentCom = -1; | |
$('.com-badge').remove(); | |
for (i=0; i<com.length; i++) { | |
$( core.divID(com[i].id, true)+' .pas-elu h2:first').before('<b class="com-badge badge">'+(i+1)+'</b>'); | |
} | |
var $comStr = $('<span id="com_cycle"><b id="com_num">'+com.length+'</b> <b class="n">'+core.people[pid].nom+'</b> </span>').click(function(){ | |
cykl.currentCom = cykl.comment_cycle('com', com, cykl.currentCom); | |
$('.badge').hide(); | |
$('.com-badge').show(); | |
}); | |
$('#com_cycle').replaceWith($comStr); | |
$('#fix-gemp').show(); | |
}, | |
show_recent_comment: function(str) { // CIRCULATION DANS LES RECENTS | |
$('#fix-gemp').hide(); // hack | |
var anchor = 'liste-com'; | |
// var r = core.recentArr.sort(core.sortByDate); //.reverse(); @@@@ --> old before sortByOption | |
var r = core.recentArr; | |
core.sortByOption(r); // le nouveau sort, selon préfs | |
cykl.currentCom = -1; | |
$('.com-badge').remove(); | |
for (i=0; i<r.length; i++) $( core.divID(r[i].id, true)+' .pas-elu h2:first').before('<b class="com-badge badge">'+(i+1)+'</b>'); | |
var $comStr = $('<span id="com_cycle"><b id="com_num">'+r.length+'</b> <b class="n">Depuis '+str+'</b> </span>').click(function(){ | |
cykl.currentCom = cykl.comment_cycle('com', r, cykl.currentCom); | |
$('.badge').hide(); | |
$('.com-badge').show(); | |
}); | |
$('#com_cycle').replaceWith($comStr); | |
$('#fix-gemp').show(); | |
}, | |
displaybuild: function(num, total) { // sert pour Firefox | |
if ($('#btn_num').length < 1) $('#btn_cycle .n').after(' <b id="btn_num"></b> '); | |
$('#btn_num').text(num+':'+total); | |
}, | |
endbuild: function() { | |
//$.each(core.people, function(k, v){ core.peopleArr.push(v); }); // on transforme l'objet en array | |
//core.peopleArr.sort(core.sortByName); | |
cykl.totalNew = core.newArr.length; | |
cykl.totalEgo = core.egoArr.length; | |
cykl.testNew = false; | |
cykl.testEgo = false; | |
$('#btn_cycle').removeClass('loading').mouseover(function(){ | |
keyb.altdown ? $(this).attr('title', 'Revenir au sommaire ('+core.version+')') : $(this).attr('title', 'Revenir en haut'); | |
}).click(function(){ | |
// si alt est enfoncé, on revient au sommaire du forum, sinon en haut de la page | |
keyb.altdown ? window.location = '/forum/' : window.location.hash = 'header-menu'; | |
}); | |
if (cykl.totalEgo > 0) cykl.btnego(); | |
if (cykl.totalNew > 0) cykl.btnnew(); | |
} | |
} // cycl end | |
/* ****************************************************************************** | |
* GDB: RAPPEL DES NOUVEAUX | |
****************************************************************************** */ | |
var gdb = { | |
prefix: 'gemp:', | |
init: function() { | |
if (core.page == 'fil' || core.page == 'preview') { // normalement on est sur un fil ou la preview | |
gdb.nid = core.makeQID(core.filID); | |
// ne fonctionne pas?! on ne se sert pas de ce 'securite' | |
var checkSecurite = store.read('securite'); | |
if (checkSecurite != null) { | |
// faire un truc avec checkSecurite...? | |
} else { | |
var securite = []; | |
$(core.newclass).each(function(){ | |
// securite.push($(this).what?????); // ne marche pas... | |
}); | |
if (securite.length > 0) store.write('securite', securite); // pas la peine d'écrire si c'est vide | |
} | |
} | |
}, | |
process: function() { | |
if (core.page == 'fil' || core.page == 'preview') { // sur un fil ou la preview <-- NON, pas la preview | |
$('#fix-gemp').show(); // on a pu cliquer sur "Reconstruction" pendant le chargement | |
$('.fix.cycle').css('display', 'none !important'); // in case | |
gdb.restorenew = store.read('nouveaux:restore'); // on regarde si on veut les anciens "nouveau" | |
gdb.lastvisit = store.read('ego:time'); // on lit l'heure de la dernière visite | |
if (core.page == 'fil') { // normalement on est sur le fil lui-même | |
if (fag.constructed) { | |
store.remove('securite'); // on supprime gdb.securite, in case | |
// on est sur le fil donc on vide nouveaux:restore qu'on a stocké plus haut: on ne fait plus ça | |
if (gdb.restorenew) { | |
store.mergeNew() ; // merge newArr avec store.read('nouveaux') | |
store.writeAsi('nouveaux', core.newArr); // on écrit les nouveaux | |
} else { // on n'a pas demandé la restauration | |
store.removeAsi('nouveaux'); // on réinitialise les nouveaux | |
} | |
store.writeAsi('ego', core.egoArr); // on écrit les ego s'il y en a, ou juste le timestamp | |
} else { // on a eu un problème, le script ne s'est pas fini | |
// *--> core.log('problème gdb process: '+ fag.constructed); | |
} | |
} else { // on est sur la preview <-- NON, le process ne prend que le core.page == 'fil' | |
// *--> core.log('-->preview: restore? ' + gdb.restorenew); | |
} | |
if (core.newArr.length) { | |
var $checkrestore = $(' <span id="restorenew"><input type="checkbox" /> Garder les "nouveau"</span> ') | |
.append(' <span class="newcount" />'); | |
if (gdb.restorenew) $('input', $checkrestore).attr('checked', true); | |
$('#post-form input[name=finish]').after($checkrestore); | |
$('#gemp-options').prepend($checkrestore.clone().attr('id', 'restorenewtop')); | |
store.currentCheck(); // sans paramètre | |
$('#restorenew input, #restorenewtop input').live('click', function(){ | |
store.restorenewToggle(); | |
}); | |
} | |
} | |
}, | |
} | |
/* ****************************************************************************** | |
* STORE: LES FONCTIONS DE STOCKAGE | |
****************************************************************************** */ | |
var store = { | |
set: function(what, entry) { // fontcion d'écriture globale, avec erreur "full" | |
if (!gdb.full) try { | |
window.localStorage.setItem(what, entry); | |
// --> core.log('[W]' + what + '//' + entry); | |
} catch(e) { store.full(e); } | |
}, | |
get: function(what) { // fonction de lecture globale, pas de gestion d'erreur === null | |
return window.localStorage.getItem(what); | |
}, | |
del: function(what) { // fonction de supression globale, erreur possible? | |
try { | |
// --> if (!what.match(/nouveaux/)) core.log('[D]' + what + ' // ' + window.localStorage.getItem(what)); // DEBUG | |
window.localStorage.removeItem(what); | |
} catch(e) { } | |
}, | |
write: function(what, entry, id) { // fonction écriture propore à un fil: nid + what | |
var id = id || gdb.nid; | |
id = store.makeNID(id); | |
store.set(id + what, JSON.stringify(entry)); | |
}, | |
writeAsi: function(what, entry, id) { // écriture avec count et timestamp | |
var id = id || gdb.nid; | |
id = store.makeNID(id); | |
store.set(id + what +':time', temps.timestamp()); | |
if (entry.length > 0) store.set(id + what, JSON.stringify(entry)); | |
}, | |
read: function(what, id) { // lecture d'un unique storeWrite | |
var id = id || gdb.nid; | |
id = store.makeNID(id); | |
return JSON.parse(store.get(id + what)); | |
}, | |
count: function(what, id) { // le nombre d'items d'un storeWriteAsi | |
var id = id || gdb.nid; | |
id = store.makeNID(id); | |
return store.read(what, id) ? store.read(what).length : 0; | |
}, | |
timeDiff: function(what, id) { // l'âge en secondes d'un storeWriteAsi | |
var id = id || gdb.nid; | |
id = store.makeNID(id); | |
return temps.timestamp() - store.get(id + what +':time'); | |
}, | |
remove: function(what, id) { // on supprime un storeWrite | |
var id = id || gdb.nid; | |
id = store.makeNID(id); | |
store.del(id + what); | |
}, | |
removeAsi: function(what, id) { // on supprime tout un storeWriteAsi | |
var id = id || gdb.nid; | |
id = store.makeNID(id); | |
// --> core.log('RemoveASI: ' + what+' ('+id+')'); | |
store.del(id + what); | |
store.del(id + what +':time'); | |
store.del(id + what +':current'); | |
store.del(id + what +':restore'); | |
store.del(id + what +':vote'); // pour ego:vote | |
}, | |
full: function(e) { | |
if (e == QUOTA_EXCEEDED_ERR) { | |
alert('Votre base de données est pleine! Prévenez gemp...'); | |
gdb.full = true; | |
} | |
}, | |
mergeNew: function() { | |
// NB: si on fait un SORT, on ne peut plus savoir lesquels sont lus ou pas | |
if (store.read('nouveaux')) { | |
if (core.newArr.length > 0) { | |
core.newArr = store.read('nouveaux').concat(core.newArr); | |
} else { | |
core.newArr = store.read('nouveaux'); | |
} | |
} | |
}, | |
removeNew: function(id) { | |
var id = id || gdb.nid; | |
// ---> core.log('>>> Effacement: '+id); | |
store.removeAsi('nouveaux'); | |
}, | |
restorenewToggle: function() { | |
var current = store.read('nouveaux:current') || 0; // @@@@ | |
if (store.read('nouveaux:restore')) { // on a des "nouveau" stockés | |
store.removeNew(); // était : store.removeConfirm(current); mais trop compliqué | |
$('#restorenew input, #restorenewtop input').attr('checked', false); | |
} else { // on n'a pas de nouveaux stockés | |
store.writeAsi('nouveaux', core.newArr); // on écrit les nouveaux | |
store.write('nouveaux:restore', core.newArr.length); | |
store.write('nouveaux:current', cykl.currentNew+1); | |
$('#restorenew input, #restorenewtop input').attr('checked', true); | |
} | |
}, | |
// NE SERT PLUS | |
removeConfirm: function(current, id) { // message d'alerte éventuel *** NE SERT PLUS | |
var id = id || gdb.nid; | |
if (current && current >= 0 && current < gdb.restorenew) { // on avait des non-lus dans les gardés | |
var c = gdb.restorenew - current; | |
var s = c > 1 ? 's' : ''; | |
var v = c > 1 ? 'sont' : 'est'; | |
var p1 = c+' commentaire'+s+' conservé'+s+' '+v+' peut-être non-lu'+s+'.'; | |
var p2 = '<br>Voulez-vous vraiment effacer ?'; | |
jConfirm(p1+p2, "Confirmation", function(answer) { | |
if (answer) { | |
store.removeNew(); | |
} else { | |
if (id == gdb.nid) { // on est sur le fil | |
$('#restorenew input, #restorenewtop input').attr('checked', 'checked'); // on recoche | |
} | |
} | |
}); | |
} else { | |
store.removeNew(); | |
} | |
}, | |
currentCheck: function(current) { | |
// pour vérifier si tous les new on été cliqués et ramener sur le bon | |
var cur = store.read('nouveaux:current') || 0; | |
var total = core.newArr.length; // était store.count('nouveaux') mais on ne les stocke plus automatiquement | |
if (current != null && cur < total && cur == current) { // si on a indiqué "current": on utilise la fonction à l'arrivée | |
store.write('nouveaux:current', ++cur); | |
} | |
if (cur >= total) { | |
$('#restorenew .newcount').html(''); | |
$('#restorenewtop').attr('title', 'apparemment tous lus'); | |
} else { | |
var plur = total-cur > 1 ? 's' : ''; | |
var txt = 'peut-être '+(total-cur)+' non lu'+plur; | |
$('#restorenew .newcount').html(' ('+txt+')'); | |
$('#restorenewtop').attr('title', txt); | |
} | |
}, | |
cleanup: function() { | |
var now = temps.timestamp(); | |
var sho = temps.jour; // day | |
var med = temps.semaine; // week | |
var lon = temps.annee; // very late | |
// --> core.log('cleanup?'); | |
store.cleanupdb(); // à déplacer ? | |
var log = window.localStorage.length; | |
for(var i = 0; i < log; i++) { | |
if (localStorage.key(i) == null) break; // parce qu'on détruit des paquets | |
var key = localStorage.key(i); | |
if (key != null && key.match(/^gemp/)) { | |
var k = key.split(':'); // k[0] == gemp | |
if (k[3] == 'time') { | |
var delay = now - window.localStorage.getItem(key); | |
if (k[2] == 'ego' && delay > lon) { | |
////////////////// store.removeAsi('ego', k[1]); // NE PAS VIRER, trop dangereux | |
} | |
if (k[2] == 'nouveaux' && delay > med) { // ---> passer en sho ? | |
store.removeAsi('nouveaux', k[1]); | |
} | |
if (k[2] == 'form' && delay > sho) { | |
store.removeAsi('form', k[1]); | |
} | |
} | |
} else { // on a une merde | |
// --> core.log('problème db: '+key); | |
} | |
} | |
}, | |
cleanupdb: function() { // MAJOR CLEANUP | |
if (store.get('gemp:cleanup2011') == null) { | |
//localStorage.clear(); --------------> faire une alerte ou regarder pourquoi je faisais ça ? | |
//store.set('gemp:cleanup2011', 1); | |
} | |
if(core.debug) window.localStorage.removeItem('gemp:cleanup2012'); // @@@@ DEBUG | |
if (store.get('gemp:cleanup2012') == null) { | |
var log = localStorage.length; | |
for(var i = 0; i < log; i++) { | |
var key = localStorage.key(i); | |
if (key != null && key.match(/^gemp/)) { | |
var k = key.split(':'); // k[0] == gemp | |
if(k[2] != 'ego' && !k[1].match(/(^cleanup|^pref)/)) { // on ne garde que ceux-là | |
store.del(key); | |
} | |
if(k[3] == 'sort') { // normalement, c'est k[2]: gemp:pref:sort | |
store.del(key); // juste pour ma base perso | |
} | |
} else { // on vire tout le reste | |
store.del(key); | |
} | |
} | |
store.set('gemp:cleanup2012', 1); | |
} | |
}, | |
makeNID: function(id){ | |
return gdb.prefix + id + ':'; | |
}, | |
/* documentation | |
unique in array: http://stackoverflow.com/questions/1584370/how-to-merge-two-arrays-in-javascript | |
webstorage: http://sixrevisions.com/html/introduction-web-storage/ | |
tuto: http://www.diveintojavascript.com/tutorials/web-storage-tutorial-creating-an-address-book-application | |
+ link: http://www.diveintojavascript.com/javascript-apis/web-storage-dom-storage | |
git add -u: http://stackoverflow.com/questions/572549/difference-of-git-add-a-and-git-add | |
*/ | |
} // store end | |
/* ****************************************************************************** | |
* TAGS: LE TAGUAGE DES CONTRIBUTEURS | |
****************************************************************************** */ | |
var tags = { | |
init: function() { | |
}, | |
} // tags end | |
/* ****************************************************************************** | |
* FAGLIST: LES FONCTIONS COMPLÉMENTAIRES | |
****************************************************************************** */ | |
var faglist = { | |
init: function() { | |
var header = $('#phorum').find('.header-first-post:first'); | |
var com_num = core.fullArr.length; | |
var plur = com_num > 1 ? 's' : ''; | |
var detail = ' • <a onclick="return false" style="font-size: 12px">détail</a>'; | |
header.html(com_num+' commentaire'+plur+' de '+core.peopleArr.length+' personne'+plur+detail) | |
.css('cursor', 'pointer').css('color', '#000') | |
.click(function(){ | |
if ( $('#commentateurs').html().length <= 1) { | |
var increment = 0 | |
var html = '<table id="all_com">'; | |
var table = []; | |
table.push('<thead><tr>', faglist.faire_ligne('', 'nom', 'premier', 'dernier', true), '</tr></thead>'); // header | |
$.each(core.peopleArr, function(key, pid){ | |
var v = core.people[pid]; | |
v.com.sort(core.sortByDate); | |
var c = v.com.length; | |
var p = v.com[0]; // le premier commentaire | |
var d = v.com[c-1]; // le dernier commentaire | |
table.push( | |
'<tr class="' + core.divClass(pid) + ' ' + core.getIgnoreClass(pid) + '">', | |
faglist.faire_ligne( | |
c, | |
'<div class="eye"></div> <a href="'+pid+'">'+v.nom+'</a>', | |
'<a href="'+core.msgID(p.id, true)+'">'+ p.heure +' - '+ p.date +'</a>', | |
'<a href="'+core.msgID(d.id, true)+'">'+ d.heure +' - '+ d.date +'</a>', | |
false), | |
'</tr>'); | |
}); | |
html += table.join("\n"); //.replace(/\d+§/, ''); | |
html += '</table>'; | |
$('#commentateurs').html(html).css('margin-bottom', '16px'); | |
$('#all_com, #all_com a').css('font-size', '12px') | |
.find('th:not(:first)').css({ fontWeight: 'bold', cursor: 'pointer', color: '#94c41b', backgroundColor: '#fff' }).end() | |
.find('tr').css({ | |
marginBottom: '1px' | |
}).find('.cnom a').click(function(e){ | |
e.preventDefault(); | |
cykl.show_people_comment( $(this).attr('href') ); | |
$(this).text = $(this).attr('href'); | |
return false; | |
}).end() | |
// .find('.cnum').css({ | |
// width: '30px', | |
// paddingRight: '6px', | |
// fontWeight: 'bold', | |
// color: '#fff', | |
// borderBottom: '1px solid #fff', | |
// backgroundColor: '#a4d658', | |
// textAlign: 'right' | |
// }).end().find('.cnom, .cprem, .cdern, .cplus').css({ | |
// paddingLeft: '20px' | |
// }).end() | |
.end().tablesorter({ | |
dateFormat: 'uk', | |
sortList: [[1,0]], | |
headers: { | |
1: { sorter: 'linked-names'}, | |
2: { sorter: 'custom-date'}, | |
3: { sorter: 'custom-date'} | |
} | |
}); | |
$('#all_com .eye').click(function () { | |
manip.ignoreAction($(this)); | |
}); | |
faglist.sortchoice(); | |
faglist.recent(); | |
} else { | |
$('#commentateurs').toggle(); | |
} | |
}).after('<a name="liste-com"></a>'); | |
faglist.sorter(); | |
$('#all_com .cprem a, #all_com .cdern a').live({ | |
mouseenter: function() { | |
var tmp = $(this).text().split('-'); | |
$(this).data('rel', {html: $(this).html()} ); | |
var inter = $.easydate.format_date( temps.transformDate( tmp[0], tmp[1] )[3] ); | |
$(this).html( inter ); | |
}, | |
mouseleave: function() { | |
var restore = $(this).data('rel').html; | |
$(this).html( restore ); | |
} | |
}); | |
}, | |
sortchoice: function() { | |
var sort = core.sort == 'linear' ? 0 : 1; | |
var titre = "<b>Ordre de navigation :</b> "; | |
var line = ' <input type="radio" name="choice" value="linear" /> Linéaire '; | |
var chro = ' <input type="radio" name="choice" value="chrono" /> Chronologique '; | |
var choice = $('<span id="sortchoice">'+titre+line+chro+'</span>'); | |
choice.find('input:nth('+sort+')').attr('checked', true); | |
choice.find('input').change(function(){ | |
var val = $('input:checked').val(); | |
store.set('gemp:pref:sort', val); | |
core.sort = val; | |
}); | |
$('#commentateurs').prepend( choice ); // on ajoute l'objet | |
}, | |
recent: function() { // NOUVEAU: commentaires après une certaine date | |
var now = temps.timestamp(); | |
core.recentdata = {j: 0, h: 0, m: 0}; | |
core.sortedFullArr = core.fullArr.slice(); // duplication par slice() sans paramètre | |
core.sortedFullArr.sort(core.sortByDate).reverse(); //.shift(); // on n'a plus besoin, on ne stocke plus le 1er | |
if (gdb.lastvisit != null && now - gdb.lastvisit < temps.asistart) { // pas plus de 99 jours | |
var lasttxt = "• votre dernière visite à " + temps.makeDate(gdb.lastvisit); | |
} else { | |
var lasttxt = "depuis une journée à " + temps.makeDate(now - temps.jour); | |
} | |
if (core.egoArr.length > 0) { // j'ai commenté, depuis le dernier commentaire? | |
var com = core.people[core.egoPID]['com']; // on ne prend pas core.egoArr qui est trié par "order" | |
var com = com.sort(core.sortByDate).reverse()[0]; | |
var lastcomtxt = '• votre dernier commentaire à '+ temps.makeDate(com.tSort); | |
} else { | |
var lastcomtxt = ' '; | |
} | |
var choix = $('<span class="comchoix">0</span>'); // la case d'affichage des nombres | |
var plus = $('<span class="complus combouton"><b>+</b></span>'); // le bouton plus | |
var moins = $('<span class="commoins combouton"><b>–</b></span>'); // le bouton moins | |
var select = $('<span class="comselect">').append(choix).append(plus).append(moins); // un sélecteur complet | |
var selectJour = select.clone().addClass('comjour').after('<b class="j"> jours </b>'); | |
var selectHeure = select.clone().addClass('comheure').after('<b class="n">h </b>'); | |
var selectMinute = select.clone().addClass('comminute').after('<b class="n">min </b>'); | |
var selectwrap = $('<span class="selectwrap" />') // on wrappe... | |
.append(selectJour).append(selectHeure).append(selectMinute); // ... avec toutes les cases | |
var touscom = '<h4 id="touscom" class="actif">Rechercher les commentaires depuis...</h4>'; | |
var tousliens = ''; // '<h4 id="tousliens">Tous les liens</h4>'; -----------------------------> à faire TODO | |
var header = $('<span id="comheader" />') | |
.append('<div>'+touscom+' '+tousliens+'</div>') | |
.append('<span id="comlastvisit">'+lasttxt+'</span>') | |
.append('<br><span id="comlastcomment">'+lastcomtxt+'</span>') // depuis son dernier commentaire | |
.append(selectwrap) | |
.append('<span id="comcommentsnum"> </span>') | |
var combefore = $('<span id="combefore" />') | |
.append(header) | |
.append('<span id="comcomments" />').append('<span style="clear:both" />') | |
.wrapInner('<span class="wrap" />'); | |
$('#combefore .combouton').live('click', function() { // la fonction des boutons | |
function pad(n) {return n<10 ? '0'+n : n} // in case | |
var select = $(this).closest('.comselect'); // le sélecteur qui contient le | |
var type = select.hasClass('comjour') ? 'j' : select.hasClass('comheure') ? 'h' : 'm'; // son type | |
var max = type == 'j' ? Math.round(temps.asistart / temps.jour) : type == 'h' ? 23 : 55; // les valeurs maxi | |
var choix = select.find('.comchoix'); // la case des chiffre... | |
var num = parseInt(choix.text()); // ... et sa valeur | |
var time = core.recentdata; // on récupère les infos globales | |
var x = type == 'm' ? 5 : 1; // on incrémente de 5 min, le reste à l'unité | |
if (keyb.altdown && type == 'j') x = 7; // par semaines avec alt appuyé | |
var val = $(this).hasClass('complus') ? num+x : num-x; // on ajoute ou on retranche, selon le bouton cliqué | |
val = val < 0 ? max : val > max ? 0 : val; // on vérifie les maximums | |
choix.text(val); // on renseigne la case | |
time[type] = val; // on update l'info dans l'objet "time"... | |
core.recentdata = time; // ... qu'on met à jour dans le container global | |
faglist.recentcheck(); // on affiche des résultats | |
}); | |
$('#comlastvisit, #comlastcomment').live('click', function() { | |
var str = $(this).text(); | |
var ts = temps.timestamp() - temps.transformDate(str)[0]; | |
var j = Math.floor(ts / temps.jour); | |
var r = ts % temps.jour; | |
var h = Math.floor(r / temps.heure); | |
r = r % temps.heure; | |
var m = Math.round(r / temps.minute); | |
$('#combefore') | |
.find('.comjour .comchoix').text(j).end() | |
.find('.comheure .comchoix').text(h).end() | |
.find('.comminute .comchoix').text(m); | |
core.recentdata = {j: j, h: h, m: m}; | |
faglist.recentcheck(); // on affiche des résultats | |
}); | |
$('#commentateurs').prepend( combefore ); // on ajoute l'objet | |
// on force sa taille à celle du tableau des commentateurs | |
var maxheight = $('#all_com').height() - $('#comheader').height() - 60; | |
if (maxheight > 80) $('#comcomments').css('max-height', maxheight+'px'); | |
}, | |
recentcheck: function() { // la fonction d'affichage de la liste | |
core.recentArr = []; | |
var w = temps.timestamp(); | |
var time = core.recentdata; | |
var j = time.j * temps.jour; | |
var h = time.h * temps.heure; | |
var m = time.m * temps.minute; | |
var t = w - (j+h+m); | |
var n = 0; // le nombe de commentaires | |
var e = 0; // le nombre de ses commentaires | |
var table = ''; | |
for(var i = 0; i < core.sortedFullArr.length; i++) { | |
var c = core.sortedFullArr[i]; | |
if (c.tSort > t) { | |
n++; | |
var self = ''; | |
var nom = core.people[c.pid]['nom'] | |
if (c.pid == core.egoPID) { | |
self = ' class="self"'; | |
e++; | |
} | |
core.recentArr.push(c); | |
table += '<tr'+self+'><td class="nom">'+nom+'</td>'; | |
table += '<td><a href="'+core.msgID(c.id, true)+'">'+c.heure+' – '+c.date+'</a></td>'; | |
} | |
} | |
var s = n > 1 ? 's' : ''; // le pluriel | |
var quand = t < w-temps.asistart+temps.jour ? "les débuts d'ASI" : temps.makeDate(t); | |
var result = '<span id="comresult">' + n + ' commentaire'+s+' depuis <b>'+ quand +'</b></span>'; | |
$('#comcommentsnum').html(result); | |
if (e > 0) $('#comcommentsnum').append(' ('+e+' des vôtres)') | |
$('#comcomments').html('<table>'+table+'</table>'); | |
$('#comresult').click(function() { | |
cykl.show_recent_comment( $(this).find('b').text() ); | |
}); | |
}, | |
sorter: function() { // réglages de tablesorter | |
$.tablesorter.addParser({ | |
id: 'linked-names', // set a unique id | |
is: function(s) { | |
return false; // return false so this parser is not auto detected | |
}, | |
format: function(s) { | |
return s.replace(new RegExp(/<.*?>/),'').toLowerCase(); // format your data for normalization | |
}, | |
type: 'text' // set type, either numeric or text | |
}); | |
$.tablesorter.addParser({ | |
id: 'custom-date', | |
is: function(s) { | |
return s.match(new RegExp(/(\d+)/)); | |
}, | |
format: function(s) { | |
s = s.replace(/[^\d]+/g, ' ').split(' '); | |
return $.tablesorter.formatFloat(new Date(s[4], s[3]-1, s[2], s[0], s[1], 0).getTime()); | |
}, | |
type: 'numeric' | |
}); | |
}, | |
ligne: '<td class="cnum">_C_</td><td class="cnom">_N_</td><td class="cprem">_P_</td><td class="cdern_O_">_D_</td>', | |
faire_ligne: function(count, nom, first, last, ishead) { | |
var ligne = faglist.ligne; | |
var onlyone = first == last ? ' only-one' : ''; | |
if (ishead) ligne = ligne.replace(/td/g, 'th'); | |
ligne = ligne.replace('_C_', count); | |
ligne = ligne.replace('_N_', nom); | |
ligne = ligne.replace('_P_', first); | |
ligne = ligne.replace('_O_', onlyone); | |
ligne = ligne.replace('_D_', last); | |
return ligne; | |
}, | |
} | |
/* ****************************************************************************** | |
* SOMMAIRE: LA GESTION DU SOMMAIRE | |
****************************************************************************** */ | |
var sommaire = { | |
init: function() { | |
store.cleanup(); // regular cleanup ----------------------------------------------------------> à réactiver | |
var compact = store.get('gemp:compact'); | |
if (compact == 'true') { | |
$('#phorum').addClass('compact'); | |
$('#search-area').after('<span id="gemp-compact">affichage normal</span>'); | |
} else { | |
$('#phorum').removeClass('compact'); | |
$('#search-area').after('<span id="gemp-compact">affichage compact</span>'); | |
} | |
$('#gemp-compact').click(function(){ | |
if ($('#phorum').hasClass('compact')) { | |
store.set('gemp:compact', 'false'); | |
window.location = window.location; | |
} else { | |
store.set('gemp:compact', 'true'); | |
window.location = window.location; | |
} | |
}); | |
var newtest = false; // une variable pour voir si on ajoute une petite aide en haut | |
$('#phorum table.col-list tr').each(function(){ | |
// on supprime la virgule dans le total | |
var total = $(this).find('.total').text(); | |
if(total) { | |
total = parseInt(total.replace(',', '')); | |
$(this).find('.total').text(total); | |
} | |
if ($(this).find('span').hasClass('new')) { // nombre de nouveaux | |
var nbrnew; | |
var nbrsize = 'one'; | |
$(this).find('.new').each(function(intI,objNode ){ | |
var objChildNode = objNode.firstChild; | |
while (objChildNode) { | |
if (objChildNode.nodeType === 8) { // Check to see if this node is a comment | |
nbrnew = parseInt(objChildNode.nodeValue.replace(/[^\d]+/g, '')); | |
} | |
objChildNode = objChildNode.nextSibling; | |
} | |
}); | |
if (nbrnew == undefined) nbrnew = '+'; | |
else nbrsize = nbrnew > 99 ? 'three' : nbrnew > 9 ? 'two' : 'one'; | |
$(this).addClass('with-new').find('.total') | |
.append('<span class="new-badge-sommaire '+nbrsize+'-size">'+nbrnew+'</span>') | |
} | |
// egotrip et easydate | |
var id = $(this).find('.titre h1 a'); | |
if (id.attr('href')) { | |
var dernier = $(this).find('.dernier'); | |
var tps = temps.recupereDate(dernier)[3]; | |
var comdate = $('<span class="quand">il y a <span class="easydate">'+tps+'</span></span>'); | |
dernier.prepend(comdate); | |
//.prepend('<b>commentaire</b><br>'); | |
id = id.attr('href').split('?')[1]; | |
var egotime = store.read('ego:time', id); | |
var egovote = store.read('ego:vote', id); | |
if (egotime != null) { | |
var egonum = store.read('ego', id); | |
if (egonum && egonum.length > 0) { // badge | |
var nbrego = egonum.length; | |
var nbrsize = nbrego > 99 ? 'three' : nbrego > 9 ? 'two' : 'one'; | |
$(this).addClass('with-ego').find('.total') | |
.append('<span class="ego-badge-sommaire '+nbrsize+'-size">'+nbrego+'</span>') | |
} | |
// dernière visite | |
// var vote = egovote ? '<img src="/forum/templates/asi/icon/voter.gif" class="visitevote" />' : ''; | |
var vote = egovote ? '<img src="/forum/templates/asi/icon/message-elu.gif" class="visitevote" />' : ''; | |
var lastdate = '<span class="easydate" title="'+ new Date(egotime*1000) + '"></span>'; | |
dernier.append('<span class="visite normal"><b>visite</b> '+vote+'<br/>il y a '+lastdate+'</span>'); | |
dernier.append('<span class="visite compact"><b>v:</b> '+lastdate+' '+vote+'</span>'); | |
} | |
var newget = store.read('nouveaux', id); // commentaires gardés | |
if (newget && newget.length > 0) { // s'il y en a | |
newtest = true; | |
var newnbr = newget.length; // leur nombre | |
var plur1 = newnbr > 1 ? 's' : ''; | |
var newtext = newnbr+" commentaire"+plur1+" gardé"+plur1+" \n"; | |
var newread = store.read('nouveaux:current', id); | |
var newunread = newnbr-newread; | |
var plur2 = newunread > 1 ? 's' : ''; | |
var newleft = newread < newnbr ? "Peut-être "+newunread+" non-lu"+plur2 : "Tous lus"; | |
var opacity = newread < newnbr ? '' : ' style="opacity: .4"'; // "+" translucide si on a tout lu | |
var newhelp = "\nCliquez pour les effacer" | |
$(this).find('.total') // | |
.prepend('<span class="keep-badge-sommaire" rel="'+id+'" title="'+newtext+newleft+newhelp+'"'+opacity+'>+</span>') | |
.find($('.keep-badge-sommaire')).click(function(){ // suppression des gardés si on clique sur le + | |
var id = $(this).attr('rel'); | |
store.removeAsi('nouveaux', id); // on supprime le storage | |
$(this).animate({opacity: 0},'2000', function(){ | |
$(this).remove(); // on supprime le plus | |
if (!$('.keep-badge-sommaire').length) $('.keep-badge-aide').remove(); // si y'en a pu on supprime l'aide | |
}); | |
}); | |
} | |
} | |
$('.dernier .easydate').easydate(); | |
}); | |
if ((core.page == 'sommaire' || core.page == 'sous-sommaire') && $('.keep-badge-sommaire').length) { | |
$('a.icon-feed').text('Flux RSS') | |
.after('<span class="keep-badge-aide"><b>+</b> indique des commentaires gardés</span>'); | |
} | |
aide.init(); | |
}, | |
} | |
/* ****************************************************************************** | |
* KEYB: GESTION DES TOUCHES ALT, MAJ ET DES FLÈCHES | |
****************************************************************************** */ | |
var keyb = { | |
init: function() { | |
keyb.editing = false; | |
keyb.altdown = false; | |
keyb.capdown = false; | |
keyb.cmddown = false; | |
keyb.ctrldown = false; | |
$(document).keydown(function(event){ | |
// http://www.webonweboff.com/tips/js/event_key_codes.aspx | |
switch(event.keyCode) { | |
case 17: // ctrl | |
keyb.ctrldown = true; | |
break; | |
case 91: // cmd | |
keyb.cmddown = true; | |
break; | |
case 18: // alt | |
keyb.altdown = true; | |
$('#btn_cycle').addClass('back-to-forum'); | |
break; | |
case 20: // capslock | |
keyb.capdown = true; | |
break; | |
case 37: // left arrow | |
keyb.altdown = true; | |
if (!keyb.editing && !keyb.cmddown && !keyb.ctrldown) $('#new_cycle').click(); | |
keyb.altdown = false; | |
break; | |
case 39: // right arrow | |
if (!keyb.editing && !keyb.cmddown && !keyb.ctrldown) $('#new_cycle').click(); | |
break; | |
} | |
}); | |
$(document).keyup(function(event){ | |
switch(event.keyCode) { | |
case 17: // ctrl | |
keyb.ctrldown = false; | |
break; | |
case 91: // cmd | |
keyb.cmddown = false; | |
break; | |
case 18: | |
keyb.altdown = false; | |
$('#btn_cycle').removeClass('back-to-forum'); | |
break; | |
case 20: | |
keyb.capdown = false; | |
break; | |
} | |
}); | |
// Pour ne pas causer de problèmes avec la navigation par flèche | |
// VERSION FF ! | |
$('body').on('focus', '#post input, #post textarea, #header-search-form input', function(){ | |
keyb.editing = true; | |
}).on('blur', '#post input, #post textarea, #header-search-form input', function(){ | |
keyb.editing = false; | |
}); | |
} // keyb.init end | |
} // keyb end | |
/* ****************************************************************************** | |
* FONCTIONS DIVERSES | |
****************************************************************************** */ | |
$.fn.scrollView = function() { | |
return this.each(function() { | |
$('html, body').animate({ | |
scrollTop: $(this).offset().top | |
}, 0); | |
}); | |
} | |
$.fn.parser = function() { // conditional JSON parser | |
return typeof this == 'string' ? JSON.parse(this) : this; | |
} | |
var manip = { | |
idfromH2: function(it) { | |
return $(it).parents('.post-gemp:first').find('h2').attr('rel'); | |
}, | |
fermerToutes: function(id) { | |
if (!id) { | |
var divAll = $('.reponse-ouverte, .reponse-ouvrirtoutes'); | |
} else { | |
var sep = ','+core.divID('', true); | |
var divAll = $(core.divID(id, true) + sep + core.fullTree[id].join(sep)); | |
var z = divAll.length -1; | |
var txt = z > 1 ? 'Ouvrir les '+z+' réponses' : 'Ouvrir la réponse'; | |
$(core.divID(id, true)).find('.ouvrir:first').text(txt); | |
} | |
divAll | |
.removeClass('reponse-ouverte reponse-ouvrirtoutes') | |
.addClass('reponse-fermee') | |
.eq(0) | |
.removeClass('reponse-ouverte reponse-fermee') | |
.addClass('reponse-ouvrirtoutes'); | |
}, | |
ouvrirToutes: function(id) { | |
if (!id) { | |
var divAll = $('.reponse-fermee, .reponse-ouvrirtoutes'); | |
} else { | |
var sep = ','+core.divID('', true); | |
var divAll = $(core.divID(id, true) + sep + core.fullTree[id].join(sep)); | |
var z = divAll.length -1; | |
var txt = z > 1 ? 'Fermer les '+z+' réponses' : 'Fermer la réponse'; | |
$(core.divID(id, true)).find('.fermer:first').text(txt); | |
} | |
divAll | |
.removeClass('reponse-fermee reponse-ouvrirtoutes') | |
.addClass('reponse-ouverte') | |
.eq(0) | |
.removeClass('reponse-ouvrirtoutes reponse-fermee') | |
.addClass('reponse-ouverte'); | |
}, | |
ouvrirSeule: function(id) { | |
var o = id; //this.find('h2').attr('rel'); | |
var divID = core.divID(o, true); | |
var z = core.fullTree[o].length; | |
var ouvr = z > 1 ? 'Ouvrir les '+z+' réponses' : 'Ouvrir la réponse'; | |
var ferm = z > 1 ? 'Fermer les '+z+' réponses' : 'Fermer la réponse'; | |
$(divID).find('.ouvrir:first').text(ouvr) | |
$(divID).find('.fermer:first').text(ferm); | |
$(divID) //.find('.message:first') | |
.removeClass('reponse-fermee') | |
.addClass('reponse-ouvrirtoutes'); | |
}, | |
ignoreAction: function(eye) { | |
var parent = eye.closest('tr, .message'); | |
var uidclass = parent.attr('class').match(/uid-\d+/)[0]; | |
var uid = uidclass.replace('uid-', ''); | |
var uid_index = core.ignoreArr.map(function(obj) {return obj.id;}).indexOf(uid); | |
var actions = ['ewarning', 'eko']; | |
var current_screen_position = parent.offset().top - $(window).scrollTop(); | |
if(parent.hasClass(actions[0])) { | |
if(uid_index !== -1) { | |
core.ignoreArr[uid_index].ignore = actions[1]; | |
} else { | |
core.ignoreArr.push({id:uid, ignore:actions[1]}); | |
} | |
$('.' + uidclass).toggleClass(actions.join(' ')); | |
$('.' + uidclass).find('.content').removeClass('com-origine'); | |
} else if(parent.hasClass(actions[1])) { | |
if(uid_index !== -1) core.ignoreArr.splice(uid_index, 1); | |
$('.' + uidclass).toggleClass(actions[1]); | |
} else { | |
if(uid_index !== -1) { | |
core.ignoreArr[uid_index].ignore = actions[0]; | |
} else { | |
core.ignoreArr.push({id:uid, ignore:actions[0]}); | |
} | |
$('.' + uidclass).toggleClass(actions[0]); | |
$('.' + uidclass).find('.content').addClass('com-origine'); | |
} | |
//Déplacer au message courant | |
if(parent.is('div')) $(window).scrollTop(parent.offset().top - current_screen_position); | |
store.set('gemp:ignore', JSON.stringify(core.ignoreArr)); | |
} | |
} | |
/* ****************************************************************************** | |
* TEMPS: FONCTIONS TEMPORELLES | |
****************************************************************************** */ | |
var temps = { | |
minute: 60, | |
heure: 3600, | |
jour: 86400, | |
semaine: 604800, | |
mois: 2629744, | |
annee: 31556926, | |
maxjours: 8553600, // 99 jours | |
timestamp: function() { // unix timestamp | |
var date = new Date(); | |
return parseInt(date.getTime()/1000); // secondes | |
}, | |
makeDate: function(timestamp) { // faire une date à partir d'un timestamp | |
function pad(n) {return n<10 ? '0'+n : n} | |
var t = timestamp || temps.timestamp(); | |
var n = new Date(); | |
var d = new Date(t*1000); | |
var str = pad(d.getHours())+':' | |
+ pad(d.getMinutes()) + ' le ' | |
+ pad(d.getDate()) + '/' | |
+ pad(d.getMonth()+1) + '/' | |
+ d.getFullYear(); | |
return str; | |
}, | |
recupereDate: function(from) { // prend une date du site HH:MM DD/MM/YYYY et retourne ses valeurs | |
var heure = from.find('.heure').text(); | |
var date = from.find('.date').text(); | |
return temps.transformDate(heure, date); | |
}, | |
transformDate: function(heure, date) { | |
if (heure.length) { | |
var datestr = ':'+date || ''; | |
t = (heure+datestr).match(/(\d+)/g); | |
datetime = new Date(t[4],t[3]-1,t[2],t[0],t[1],0,0); // date js | |
ts = datetime.getTime()/1000; // timestamp pour faciliter le tri | |
return [ts, date, heure, datetime]; // timestamp, date, heure, format Date() | |
} | |
}, | |
} | |
/* ****************************************************************************** | |
* TIMER | |
****************************************************************************** */ | |
var timer = { | |
totalTime: 0, | |
startTime: 0, | |
stopTime: 0, | |
start: function(){ | |
var t = new Date(); | |
this.startTime = t.getTime(); | |
}, | |
stop: function(){ | |
var t = new Date(); | |
this.stopTime = t.getTime(); | |
this.totalTime = (this.stopTime - this.startTime)/1000; | |
}, | |
formatTime: function() { | |
var t = Math.round(timer.totalTime); | |
var txt = t > 1 ? t + ' secondes' : t > 0 ? t + ' seconde' : "moins d'une seconde"; | |
return txt; | |
} | |
} | |
/* ****************************************************************************** | |
* TRANSFERT DE HTTP À HTTPS | |
* | |
* TODO | |
* - faire la fonction en HTTPS qui affiche l'iframe et propose le transfert | |
* - faire la fonction en HTTP qui récupère la DB et l'envoie en POST | |
* - prévenir des préférences selon le navigateur | |
* Chrome: https://stackoverflow.com/a/35532931/4681418 | |
* Safari: https://stackoverflow.com/a/22477896/4681418 | |
* - faire le message en haut de page | |
* - mettre à jour la doc | |
****************************************************************************** */ | |
var transfert = { | |
init: function() { | |
// doit-on faire le transfert? | |
if (store.get('gemp:transfert2017') == null) { | |
this.button() | |
if (document.location.protocol == 'https:' && transfert.test()) { | |
this.popup('coller'); | |
} else if (transfert.test()) { | |
this.popup('copier'); | |
} | |
} | |
}, | |
button: function() { | |
var title = "Transfert de la base données de HTTP à HTTPS"; | |
var $html = $('<span id="gemp-aide" title="'+title+'">transfert</span>').click(function(){ | |
if (document.location.protocol == 'https:') { | |
if (transfert.test()) { | |
transfert.popup('coller'); | |
} else { | |
document.location.href = "https://www.arretsurimages.net/forum?transfert=coller"; | |
} | |
} else { | |
if (transfert.test()) { | |
transfert.popup('copier'); | |
} else { | |
document.location.href = "http://www.arretsurimages.net/forum?transfert=copier"; | |
} | |
} | |
}); | |
if (core.page == 'sommaire' || core.page == 'sous-sommaire') { | |
$('#search-area').after($html); | |
}; | |
$('#gemp-options').append($html); | |
}, | |
test: function() { | |
if (document.location.protocol == 'https:') { | |
// on est sur la nouvelle version du site | |
return window.location.href.match('transfert=coller'); | |
} else { | |
return window.location.href.match('transfert=copier'); | |
} | |
}, | |
popup: function(type) { | |
var bouton = ('<span id="closeaide">Ne pas transférer maintentant</span>'); | |
var key = (/Macintosh/).test(navigator.userAgent) ? 'cmd' : 'ctrl'; | |
if (type == 'copier') { | |
var data = this.getstorage(); | |
var count = Object.keys(data).length; | |
var json = JSON.stringify(data); | |
var zone = ('<textarea id="copier">'+json+'</textarea>'); | |
var titre = '<h3>Copie de l’historique Forums ASI de HTTP vers HTTPS</h3><p>Copiez tout le texte du '; | |
titre += 'formulaire ci-dessous avec <b>' + key + '+C</b>, puis cliquez sur "Continuer".</p>' | |
var action = $('<button id="action" value="">Continuer ➔</button>').click(function(){ | |
document.location.href = "https://www.arretsurimages.net/forum?transfert=coller"; | |
}); | |
} else { | |
var zone = ('<textarea id="copier"></textarea>'); | |
var titre = '<h3>Transfert de l’historique Forums ASI en HTTP<u>S</u></h3><p class="message">'; | |
titre += 'Collez le texte copié avec <b>' + key + '+V</b>, puis cliquez sur "Tester les données".</p>' | |
var action = $('<button id="action" value="">Tester les données ➔</button>').click(function(){ | |
transfert.valide($('#copier').val()); | |
}); | |
} | |
var contenu = bouton+titre+zone; | |
layer = $('<span id="aide-main" class="transfert" style="margin-top: -1000px">'+contenu+'</span>'); | |
var $layer = $('<span id="aide-over" />').append(layer.append(action)); | |
$('body').append($layer.css({opacity: 0})); | |
$('#closeaide').click(function(){ | |
$('#aide-main').animate({marginTop: '640px'}, 1000); | |
$('#aide-over').animate({opacity: 0}, 1000, function(){ | |
$('#aide-over').remove(); | |
}); | |
}); // affichage | |
$('#aide-main').animate({marginTop: 0}, 700); | |
$('#aide-over').animate({opacity: 1}, 500, function(){ | |
$this = $('#copier'); | |
$this.select(); | |
// Work around Chrome's little problem | |
$this.mouseup(function() { | |
// Prevent further mouseup intervention | |
$this.unbind("mouseup"); | |
return false; | |
}); | |
//window.prompt("Copier la base: "+key+"+C, Enter", $this.val()); | |
}); | |
}, | |
getstorage: function() { | |
// se fait en HTTP | |
if (transfert.test()) { | |
var database = {}; | |
database['count'] = 0; | |
var log = localStorage.length; | |
for(var i = 0; i < log; i++) { | |
var key = localStorage.key(i); | |
if (key != null && key.match(/^gemp/)) { | |
database[key] = store.get(key); | |
database['count']++; | |
} | |
} | |
} | |
return database; | |
}, | |
feedback: function(type, message) { | |
var span; | |
if (type == 'erreur') { | |
span = '<span class="erreur"><b>Erreur:</b> TXT</span>'; | |
} else { | |
span = '<span class="succes"><b>Succès:</b> TXT</span>'; | |
} | |
$('#aide-main .message').html(span.replace('TXT', message)); | |
}, | |
valide: function(json) { | |
if (json.charAt(0) == '{') { | |
try { | |
this.data = JSON.parse(json); | |
} catch(e) { | |
console.log(e); | |
return this.feedback('erreur', e); | |
} | |
} else { | |
return this.feedback('erreur', 'le texte ne commence pas par "<b>{</b>"'); | |
} | |
var count = this.data.count; | |
var actual = Object.keys(this.data).length - 1; | |
if (count != actual) { | |
return this.feedback('erreur', 'nombre d’enregistrements inconsistant: '+count+' pour '+ actual); | |
} else { | |
$('#action').addClass('succes').text('Transférer ➔').unbind('click').on('click', function() { | |
transfert.fillin(); | |
$(this).remove(); | |
$('#copier').remove(); | |
}); | |
return this.feedback('succes', 'les données sont valides, cliquez sur "Transférer"!'); | |
} | |
}, | |
fillin: function() { | |
var count = Object.keys(this.data).length; | |
var existants = 0; | |
var ecrits = 0; | |
var message = "Transfert en cours, " + (count - 1) + " enregistrements à traiter."; | |
$('#aide-main .message').html(message); | |
for (var key in this.data) { | |
if (key != 'count') { | |
if (key.match(/gemp:\d/)) { | |
if (store.get(key)) { | |
existants++; | |
} else { | |
store.set(key, this.data[key]); | |
ecrits++; | |
} | |
} else { // les préfs, a priori | |
store.set(key, this.data[key]); | |
ecrits++; | |
} | |
} | |
} | |
var message = ecrits + " enregistrements écrits<br>" + existants + " existants"; | |
message += '<br><br><a href="/forum">Retour au site</a>'; | |
$('#aide-main .message').html(message); | |
$('#closeaide').text('Fermer'); | |
store.set('gemp:transfert2017', 1); | |
}, | |
} | |
fag.init(); // On commence... | |
transfert.init(); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment