Aller au contenu

Utilisateur:Dr Brains/LiensPageAuHasard.js

Une page de Wikipédia, l'encyclopédie libre.
Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
LiensPageAuHasard = new Object();
LiensPageAuHasard.Params = new Object();
LiensPageAuHasard.Params.Timeout = 8;
LiensPageAuHasard.Variables = new Object();
LiensPageAuHasard.Variables.Timers = new Array();
LiensPageAuHasard.Variables.Links = new Array();
LiensPageAuHasard.Variables.Pages = new Array();
LiensPageAuHasard.Variables.PagesOK = new Array();
LiensPageAuHasard.Variables.AllPagesOK = false;
LiensPageAuHasard.Variables.Cats = new Array();
LiensPageAuHasard.Fonctions = new Object();

LiensPageAuHasard.Variables.APILimit = ( (mw.config.get('wgUserGroups').indexOf("sysop")!=-1 || mw.config.get('wgUserGroups').indexOf("bot")!=-1) ? 4999 : 499);

LiensPageAuHasard.Fonctions.Init = function(){
    if(typeof(LiensPageAuHasard.Fonctions.CustomParams) == "function") LiensPageAuHasard.Fonctions.CustomParams();
    var AllSpans = getElementsByClassName(document, "span", "PageAuHasard");
    for(var a=0,l=AllSpans.length;a<l;a++){
        var ThisSPan = AllSpans[a];
        var CatSpan = ThisSPan.getElementsByTagName("span")[0];
        var RandomLink = ThisSPan.getElementsByTagName("a")[0];
        if(!RandomLink || !CatSpan) continue;
        RandomLink.id="RandomLink"+a;
        LiensPageAuHasard.Variables.Links[a] = RandomLink;
        var Cat = mw.html.escape(CatSpan.innerHTML);
        LiensPageAuHasard.Fonctions.GetPages(a, Cat);
        LiensPageAuHasard.Variables.Timers[a] = setTimeout("LiensPageAuHasard.Fonctions.AnotherPage("+a+");", LiensPageAuHasard.Params.Timeout*1000+parseInt((a/AllSpans.length)*LiensPageAuHasard.Params.Timeout*1000));
    }
}

LiensPageAuHasard.Fonctions.GetPages = function(index, Cat, categorycontinue){
    var CatURL = mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?format=xml&action=query&list=categorymembers'
               + '&cmlimit=' + LiensPageAuHasard.Variables.APILimit
               + '&cmtitle=' + mw.config.get('wgFormattedNamespaces')[14]+":" + encodeURIComponent(Cat) 
               + ( categorycontinue ? categorycontinue : "");
    var Link = LiensPageAuHasard.Variables.Links[index];
    Link.innerHTML = Link.innerHTML + '<span style="text-decoration:blink">…</span>';
    LiensPageAuHasard.Variables.PagesOK[index] = 0;
    LiensPageAuHasard.Fonctions.ajax.http({
          url: CatURL,
          cat: Cat,
          index:index,
          onSuccess:LiensPageAuHasard.Fonctions.GetPagesDone
    });
}

LiensPageAuHasard.Fonctions.GetPagesDone = function(Req, data){
     var index = data.index;
     var Cat = data.cat;
     if(!LiensPageAuHasard.Variables.Pages[index]) LiensPageAuHasard.Variables.Pages[index] = new Array();
     if(!LiensPageAuHasard.Variables.Cats[index]) LiensPageAuHasard.Variables.Cats[index] = Cat;
     var ElementTraitement = Req.responseXML; 
     if(!ElementTraitement){
         prompt("!Problème", data.url);
         return;
     }
     var Pages = ElementTraitement.getElementsByTagName('cm');
     for(a=0;a<Pages.length;a++){
          var TitrePage = Pages[a].getAttribute('title');
          if(LiensPageAuHasard.Variables.Pages[index].indexOf(TitrePage)==-1) LiensPageAuHasard.Variables.Pages[index].push(TitrePage);
     }
     var CatContinue = ElementTraitement.getElementsByTagName('query-continue')[0];
     if(CatContinue){
          var AutreRequeteContinue = '&cmcontinue=' + encodeURIComponent(CatContinue.firstChild.getAttribute("cmcontinue"));
          LiensPageAuHasard.Fonctions.GetPages(index, Cat, AutreRequeteContinue);
     }else{
          LiensPageAuHasard.Variables.PagesOK[index] =1;
          LiensPageAuHasard.Variables.AllPagesOK = true;
          for(var Page in LiensPageAuHasard.Variables.PagesOK){
              if(LiensPageAuHasard.Variables.PagesOK[Page] != 1) LiensPageAuHasard.Variables.AllPagesOK = false;
          }
     }
}

LiensPageAuHasard.Fonctions.AnotherPage = function(index){
     clearTimeout(LiensPageAuHasard.Variables.Timers[index]);

     var Cat = LiensPageAuHasard.Variables.Cats[index];
     var ListeLiens = LiensPageAuHasard.Variables.Pages[index];
     var Link = LiensPageAuHasard.Variables.Links[index];
     var Max = ListeLiens.length;
     if(!Cat || !ListeLiens || !Link || !Max || !LiensPageAuHasard.Variables.AllPagesOK){
     LiensPageAuHasard.Variables.Timers[index] = setTimeout("LiensPageAuHasard.Fonctions.AnotherPage("+index+");", LiensPageAuHasard.Params.Timeout*1000);
         return;
     }
     var ChosenLink = parseInt(Math.random()*Max);
     var NewLink = ListeLiens[ChosenLink];
     Link.innerHTML = NewLink;
     Link.title = NewLink;
     Link.href = mw.config.get('wgServer') + mw.config.get('wgArticlePath').split("$1").join(encodeURIComponent(NewLink));
     LiensPageAuHasard.Variables.Timers[index] = setTimeout("LiensPageAuHasard.Fonctions.AnotherPage("+index+");", LiensPageAuHasard.Params.Timeout*1000);
}


LiensPageAuHasard.Fonctions.ajax = {
  http:function(bundle){ var xmlhttp; try{ xmlhttp = new XMLHttpRequest(); }catch(e){ try{ xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }catch(e){ try{ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){ xmlhttp = false; }}}; if(xmlhttp){ xmlhttp.onreadystatechange = function(){ if (xmlhttp.readyState == 4){ LiensPageAuHasard.Fonctions.ajax.httpComplete(xmlhttp,bundle);}}; xmlhttp.open(bundle.method ? bundle.method : "GET",bundle.url,bundle.async == false ? false : true); if (bundle.headers) { for (var field in bundle.headers){ try{ xmlhttp.setRequestHeader(field,bundle.headers[field]); }catch(err){}}}; xmlhttp.send(bundle.data ? bundle.data : null); }; return xmlhttp;}, 
  httpComplete: function(xmlhttp,bundle){ if(xmlhttp.status == 200 || xmlhttp.status == 302){ if(bundle.onSuccess) bundle.onSuccess(xmlhttp,bundle); }else if(bundle.onFailure){ bundle.onFailure(xmlhttp,bundle); }else{ }}
};


$(LiensPageAuHasard.Fonctions.Init);