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.
var MunicipalitiesPage = "Utilisateur:Dr Brains/MunicipalitesColombiennes.js";

importScript(MunicipalitiesPage);

if(mw.config.get('wgAction')=="edit" || mw.config.get('wgAction')=="submit") addOnloadHook(BacASable_Special);

var GetDataIndex = 0;
function BacASable_Special(){
    for(var a=0,l=municipalites.length;a<l;a++){
        if(mw.config.get('wgTitle') = municipalites[a]["article"]) return BacASable_SpecialGetDataLink(a);
    } 
    BacASable_SpecialGetDataLink(0);
}

function BacASable_SpecialGetDataLink(index){
     GetDataIndex = index;
     var OngletsCactions = document.getElementById('p-cactions');
     if(OngletsCactions){
          var CactionsUl = OngletsCactions.getElementsByTagName('ul')[0];
          CactionsUl.innerHTML += '<li>'
                                + '<a href="javascript:BacASable_SpecialGetData(false, -1);">-1</a>'
                                + ' '
                                + '<a href="javascript:BacASable_SpecialGetThisData('+index+');">?</a>'
                                + ' '
                                + '<a href="javascript:BacASable_SpecialGetData(false, 1);">+1</a></li>';
          $(OngletsCactions).removeClass("emptyPortlet");
     }
}

function BacASable_SpecialGetThisData(index){
     var TheIndex = prompt("Index ? " , index);
     if(TheIndex || TheIndex===0) BacASable_SpecialGetData(TheIndex, 0)
}

function BacASable_SpecialGetData(index, diff){
    GetDataIndex = (index===false ? GetDataIndex : index) + diff;
    var Line = municipalites[GetDataIndex];
    if(!Line) return;
    var Text = "";
    for(var thing in Line){
        if(Line[thing]) Text += "| " + thing + " = " + Line[thing] + "\n";
    }
    var TextArea = document.getElementById("SpecialTextArea");
    if(!TextArea){
        TextArea = document.createElement('textarea');
        TextArea.id = "SpecialTextArea";
        TextArea.rows = "10";
        var Target = document.getElementById("wpTextbox1");
        Target.parentNode.insertBefore(TextArea, Target);
    }
    TextArea.value = Text;
}






var indexInterval = 1;
var BacASable_APILimit = ( (mw.config.get('wgUserGroups').indexOf("sysop")!=-1 || mw.config.get('wgUserGroups').indexOf("bot")!=-1) ? 4999 : 499 );
var RequestsDone = new Array();

function BacASable_Run(index){
    if(!index) index = 0;
    if(index>3) return;
    var Line = municipalites[index];
    if(!Line){
        window.location.reload();
        return;
    }
    var AlertText = "";
    var Article = Line["article"];
    for(var thing in Line){
        if(Line[thing]) AlertText += thing + " = " + Line[thing] + "\n";
    }
    alert(AlertText);
    var URL = mw.config.get('wgServer') + mw.config.get('wgScript') + "?title=" + encodeURIComponent(Article) + "&action=edit";
    BacASable_GetPage(URL, BacASable_GotPage, index);
}

var BacASable_Summary = "Bot : Mise à jour infobox";

function BacASable_GotPage(Req, data){
    var index = data.params;
    if(!index) index = 0;
    BacASable_Summary = "Bot : Mise à jour infobox";
    var Response = Req.responseText;
    while(document.body.firstChild){ document.body.removeChild(document.body.firstChild); }
    document.body.innerHTML = Response;
    var TextArea = document.getElementById("wpTextbox1");
    var SummaryBox = document.getElementById("wpSummary");
    var Text = TextArea.value;
    var NewText = BacASable_CheckInfoboxParams(Text, index);
    TextArea.value = NewText;
    SummaryBox.value = BacASable_Summary;
    if(Text == NewText){
        BacASable_Run((index+1)); 
        return;
    }
    //BacASable_SavePage(function(){ BacASable_Run((index+1))});
}

var InfoboxParams = new Array("nom             =",
                              "image           =",
                              "légende         =",
                              "blason          =",
                              "lien blason     =",
                              "drapeau         =",
                              "lien drapeau    =",
                              "dep             =",
                              "latitude        =",
                              "longitude       =",
                              "géolocalisation =",
                              "altitude        =",
                              "référence       =",
                              "fondation       =",
                              "supkm2          =",
                              "code            =",
                              "gentilé         =",
                              "maire           =",
                              "site            =",
                              "carte           =");

function BacASable_CheckInfoboxParams(Text, index){
    if(!index) index=0;
    var Line = municipalites[index];
    var TextLines = Text.split('\n');
    var InfoboxLines = new Array();
    var NewInfoboxLines = new Array();
    var IsInfobox = false;
    var GotInfobox = false;
    var InfoboxRegExp = new RegExp("\\{\\{(I|i)nfobox (Municipalité|municipalité|Ville) de Colombie", "g");
    for(var a=0,l=TextLines.length;a<l;a++){
        if(GotInfobox) continue;
        var ThisLine = TextLines[a];
        if(ThisLine.match(InfoboxRegExp)!=null){
            IsInfobox = true
            continue;
        }
        if(!IsInfobox) continue;
        if(ThisLine=="}}" || ThisLine.indexOf("}}")==0) GotInfobox = true;
        if(GotInfobox) continue;
        InfoboxLines.push(ThisLine);
    }
    var Recap = Line["article"] + "\n\n";
    var ParamFound = false;
    for(var a=0,l=InfoboxParams.length;a<l;a++){
        var Param = InfoboxParams[a].replace(/ =/g, "=").replace(/=/g, "");
        var ParamRegExp = new RegExp("\\|[ ]*"+Param+"[ ]*=");
        ParamFound = false;
        var OldValue = ""
        var NewValue = Line[Param];
        Recap += Param + " : " + Line[Param] + "\n";
        var Value = "";
        for(var b=0, m=InfoboxLines.length;b<m;b++){
            if(ParamFound) continue;
            var InfoboxLine = InfoboxLines[b];
            if(InfoboxLine.indexOf("=")==-1) continue;
            if(InfoboxLine.match(ParamRegExp)!=null){
                ParamFound = true;                
                OldValue = InfoboxLine.split("=")[1].replace(/^ /g, "");
                if(NewValue){ 
                     Value = NewValue; 
                }else if(OldValue){
                    Value = OldValue;
                }                        
            }
        } 
        NewInfoboxLines[a] = " | "+InfoboxParams[a]+" "+Value;  
    }
    alert(Recap);
    var OldInfobox = InfoboxLines.join("\n");
    var NewInfobox = NewInfoboxLines.join("\n").replace(/\n\n/g, "\n");
    //alert(OldInfobox);
    //alert(NewInfobox);
    Text = Text.replace(OldInfobox, NewInfobox);
    return Text;
}

// =================================================================================================================
// ///////////////////////////////////////////////////// FONCTION DE REQUÊTE ///////////////
// =================================================================================================================
 
function BacASable_Ajax(bundle) {
    // mandatory: bundle.url
    // optional:  bundle.async
    // optional:  bundle.method
    // optional:  bundle.headers
    // optional:  bundle.data
    // optional:  bundle.onSuccess (xmlhttprequest, bundle)
    // optional:  bundle.onFailure (xmlhttprequest, bundle)
    // optional:  bundle.otherStuff OK too, passed to onSuccess and onFailure
    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)
            if (xmlhttp.status == 200 || xmlhttp.status == 302) {
              if (bundle.onSuccess)
                bundle.onSuccess(xmlhttp,bundle);
            } else if (bundle.onFailure) {
              bundle.onFailure(xmlhttp,bundle); 
            } else {
              // A activer en debug mode ?
                 alert(xmlhttp.status+xmlhttp.responseText);
            }
      };
      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) {
            //Argos42 : pour rendre LiveRC fonctionnel sur chrome
          }
      }
      xmlhttp.send(bundle.data ? bundle.data : null); 
    }
    return xmlhttp;
};

function BacASable_GetPage(URL, NextFunc, params){
    BacASable_Ajax({ url: URL,
                     onSuccess:NextFunc,
                     params : (params ? params : false)
    });
}
 
function BacASable_SavePage(NextFunc, params){
    //if(!confirm("Publier ?")) return;
    var Form = document.getElementById('editform');
    var action = Form.action;
    var headers = new Array();
    headers['Content-Type'] = 'application/x-www-form-urlencoded';
    BacASable_Ajax({ url: action,
                     method: "POST",
                     headers: headers,
                     data: BacASable_createURLFromParams(BacASable_getFormParams(Form)),
                     onSuccess:(NextFunc ? NextFunc : function(){ window.location.reload(); } ),
                     params : (params ? params : false)
    });
}

function BacASable_getFormParams(Form){
     var Params = new Array();
     var Tags = new Array("textarea", "select", "input");
     for(var a=0,l=Tags.length;a<l;a++){
          var Elements = Form.getElementsByTagName(Tags[a]);
          for(var b=0,m=Elements.length;b<m;b++){
               var Element = Elements[b];
               var ElName = Element.name;
               var ElValue = Element.value;
               var ElType = Element.type;
               if(Tags[a].toLowerCase()=='input' && (ElType == "checkbox" || ElType == "radio") && Element.checked){
                    Params[ElName] = ElValue;
               }else if(Tags[a].toLowerCase()=='input' && (ElType == "text" || ElType == "hidden") ){
                    Params[ElName] = ElValue;
               }else if(Tags[a].toLowerCase()!='input'){
                    Params[ElName] = ElValue;
               }
          }
     }
     return Params;
}
 
 
function BacASable_createURLFromParams(Params){
    var ParamsInURL = new Array();
    for(var P in Params){
        if(typeof(Params[P])=="string") ParamsInURL.push(P+"="+encodeURIComponent(Params[P]));
    }
    return ParamsInURL.join('&');
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


if(mw.config.get('wgTitle') == "Dr Brains/BacASable.js" && mw.config.get('wgNamespaceNumber')==2){
    addOnloadHook(BacASable_Init);
}


function BacASable_Init(){
    var Pre = document.getElementsByTagName("pre")[0];
    if(!Pre) return;
    var Button = document.createElement('img');
    Button.src = "//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Crystal_Clear_action_exit.svg/100px-Crystal_Clear_action_exit.svg.png";
    Button.alt = "Lancer le JS";
    Button.title = "Lancer le JS";
    Button.width = 100
    Button.height = 100
    var Link = document.createElement("a");
    Link.href = "javascript:BacASable_Run();";
    Link.appendChild(Button);
    Pre.parentNode.insertBefore(Link, Pre);
    var Control = document.createElement('ul');
    Control.id = "Control";
    Control.setAttribute('style', '-moz-column-count:15;-webkit-column-count:15;column-count:15;');
    Pre.parentNode.insertBefore(Control, Pre);    
}