User:OldBee/MassEval.js

This is an archived version of this page, as edited by OldBee (talk | contribs) at 01:23, 3 July 2018. It may differ significantly from the current version.

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
//<source lang=javascript>

if(typeof(window.PortalEval_Portals)==="undefined")
  window.PortalEval_DefaultPortal = "Colombie";

window.PortalEval = {
  texts : {
    "LinkText"         : "Évaluer",
    "LinkTitle"        : "Évaluer les articles de cette catégorie",
    "Portal"           : "Thème à évaluer",
    "EvalResume"       : "[[m:User:OldBee/PortalEval.js|Mise à jour de l'évaluation]]",
    "GoListText"       : "Vérifier l'évaluation",
    "GoListTitle"      : "Vérifier l'évaluation des pages de cette catégorie",
    "GoSortText"       : "Trier",
    "GoSortTitle"      : "Trier les pages de la liste",
    "SortTitle"        : "Pages",
    "SortTitleTip"     : "Tri alphabétique selon le titre de la page",
    "SortEval"         : "Évaluation",
    "SortEvalTip"      : "Tri selon le statut d'évaluation",
    "SortStub"         : "Ébauches",
    "SortStubTip"      : "Tri selon le statut d'ébauche",
    "SortAVT"          : "Avancement",
    "SortAVTTip"       : "Tri selon l'avancement",
    "SortIMP"          : "Importance",
    "SortIMPTip"       : "Tri selon l'importance dans le thème sélectionné",
    "GoChangeLabel"    : "Changements",
    "GoChangeText"     : "Valider",
    "GoChangeTitle"    : "Valider les changements d'évaluation des pages de cette catégorie",
    "GoCancelText"     : "Annuler",
    "GoCancelTitle"    : "Annuler les changements d'évaluation des pages de cette catégorie",
    "GoCloseTitle"     : "Fermer",
    "TalkText"         : "D",
    "PreviewText"      : "$1 (preview)",
    "PreviewDown"      : "Agrandir la prévisualisation",
    "PreviewUp"        : "Rétrécir la prévisualisation",
    "PreviewClose"     : "Fermer la prévisualisation",
    "GoChangeOneText"  : "Valider",
    "GoChangeOneTitle" : "Valider les changements d'évaluation de cette page",
    "GoCancelOneText"  : "Annuler",
    "GoCancelOneTitle" : "Annuler les changements d'évaluation de cette page",
    "DeleteIMPText"    : "(-)",
    "DeleteIMPTitle"   : "Supprimer cette évaluation d'importance",
    "AddIMPText"       : "(+)",
    "AddIMPTitle"      : "Ajouter une évaluation d'importance",
    "THtexts"          :  ["Page", "Ébauche ?", "Évaluée ?", "Avancement", "Importances", "Actions"],
  },
  params : {
    "THwidths"          : ["",     "75px",      "75px",      "150px",      "250px",       "100px"  ],
    "PreviewHeight"     : 200,
    "PreviewHeightStep" : 20,
    "StubTemplate"      : "Ébauche",
    "EvalTemplate"      : "Wikiprojet",
    "EvalCategory"      : "Wikiprojet",
    "EvalCatPrefixes"   : ["Wikiprojet ", "Wikiprojet:"],
    "ImageURL"          : "//upload.wikimedia.org/wikipedia/commons/",
    "YesSymbol"         : "thumb/f/fb/Yes_check.svg/16px-Yes_check.svg.png",
    "NoSymbol"          : "thumb/1/1d/Arbcom_ru_declined.svg/16px-Arbcom_ru_declined.svg.png",
    "CloseIcon"         : "thumb/8/80/Icon_no.svg/24px-Icon_no.svg.png",
    "DownIcon"          : "thumb/f/f3/HSR_1996_II_3.4f.svg/16px-HSR_1996_II_3.4f.svg.png",
    "UpIcon"            : "thumb/1/1a/HSR_1996_II_3.4i.svg/16px-HSR_1996_II_3.4i.svg.png",
    "RunningIcon"       : "a/a7/HAPPI_Loading.gif",
    "LinkPortletID"     : "p-cactions",
    "ManuPortals"       : ["GNU/Linux"],
    "Importance" : [
      { wiki : "maximum",  text : "Maximum",  color : "#FF00FF" },
      { wiki : "élevée",   text : "Élevée",   color : "#FF88FF" },
      { wiki : "moyenne",  text : "Moyenne",  color : "#FFCCFF" },
      { wiki : "faible",   text : "Faible",   color : "#FFEEFF" },
      { wiki : "?",        text : "Inconnue", color : "#666666", textcolor:"white" }
    ],
    "Avancement" : [
      { wiki : "AdQ",     text : "Article de qualité", color : "#6699FF" },
      { wiki : "BA",      text : "Bon article",        color : "#66FF66" },
      { wiki : "A",       text : "Avancé",             color : "#66FFFF" },
      { wiki : "B",       text : "Bien",               color : "#FFFF66" },
      { wiki : "BD",      text : "Bon début",          color : "#FFAA66" },
      { wiki : "ébauche", text : "Ébauche",            color : "#FF6666" },
      { wiki : "?",       text : "Inconnu",            color : "#666666", textcolor:"white" }      
    ],
    "AllPortals"        : [],
    "PageList"          : [],
    "Namespaces"        : mw.config.get("wgFormattedNamespaces"),
    "APILimit"          : ((mw.config.get("wgUserGroups").indexOf("bot")!==-1 || mw.config.get("wgUserGroups").indexOf("syspo")!==-1) ? 4999 : 499),
  },
  functions : {
    ucFirst : function(text){
      return text.substr(0,1).toUpperCase() + text.substr(1,text.length);
    },
    lcFirst : function(text){
      return text.substr(0,1).toLowerCase() + text.substr(1,text.length);
    },
    getTalkPage : function(page){
      return PortalEval.params.Namespaces[(PortalEval.functions.getNamespaceInfoFromPage(page)+1)]+":"+page;
    },
    getMainPage : function(page){
      var NS = PortalEval.functions.getNamespaceInfoFromPage(page);
      if(NS % 2 == 0) return page;
      else return (NS==1 ? "" : PortalEval.params.Namespaces[(NS-1)]+":")+PortalEval.functions.getNamespaceInfoFromPage(page, "PageName");
    },
    getNamespaceInfoFromPage : function(Page, ToReturn){
      if(!ToReturn || !Page) ToReturn = false;
      var NamespaceNumber = 0;
      var NamespaceName = "";
      var PageName = Page;
      var Found = false;
      var AllNS = PortalEval.params.Namespaces;
      for(var NS in AllNS ){
        if(Found) continue;
        var ThisNamespaceName = AllNS[NS];
        if(ThisNamespaceName==="") continue;
        var NamespaceNameRegExp = new RegExp("^"+ThisNamespaceName+":", "ig");
        var Matches = Page.match(NamespaceNameRegExp);
        if(Matches!=null && Matches.length == 1){
          NamespaceNumber = parseInt(NS);
          NamespaceName = ThisNamespaceName;
          PageName = Page.replace(NamespaceNameRegExp, "");
          Found = true;
          continue;
        }
      }
      if(ToReturn==="NamespaceName") return NamespaceName;
      if(ToReturn==="PageName") return PageName;
      return NamespaceNumber;
    },
    getPages : function(portal, queryopt){
      if(!queryopt){
        PortalEval.functions.alertControl("Getting Category Members", true);
        PortalEval.params.PageList = [];
        queryopt = {
          action  : 'query',
          list    : 'categorymembers',
          cmlimit : PortalEval.params.APILimit,
          cmtitle : mw.config.get("wgPageName"),
          cmtype  : 'page'
        };
      }
      var api = new mw.Api();
      api.get(queryopt).then(function(data){
        if(data.query.categorymembers){
          for(var a=0,l=data.query.categorymembers.length;a<l;a++){
            var page = data.query.categorymembers[a];
            var title = PortalEval.functions.getMainPage(page.title);
            PortalEval.params.PageList.push({ 
              "title" : title,
              "talktitle" : PortalEval.functions.getTalkPage(title),
            });
            PortalEval.functions.alertControl("Getting Category Members : "+title, true);
          }
        }
        if(data.continue && data.continue.cmcontinue){
          queryopt.cmcontinue = data.continue.cmcontinue;
          PortalEval.functions.getPages(portal, queryopt);
        }else{
          PortalEval.functions.getPageEval(portal);
        }
      });
    },
    getPageEval : function(portal, index){
      if(!index) index = 0;
      var page = PortalEval.params.PageList[index];
      if(!page){
        PortalEval.functions.alertControl();
        PortalEval.functions.sortPagesGo.SortTitle(portal, true);
        return;
      }
      PortalEval.functions.alertControl("Getting Eval : "+page.title, true);
      PortalEval.functions.getPageStub(portal, index, function(portal, index, queryopt){
        var page = PortalEval.params.PageList[index];
        var title = page.title;
        var talktitle = page.talktitle;
        if(!queryopt){
          queryopt = {
            action      : 'query',
            prop        : 'templates',
            tllimit     : PortalEval.params.APILimit,
            titles      : talktitle,
            tltemplates : mw.config.get("wgFormattedNamespaces")[10]+":"+PortalEval.params.EvalTemplate,
          };
        }
        var api = new mw.Api();
        api.get(queryopt).then(function(data){
          if(data.query.pages){
            for(var id in data.query.pages){
              var templates = data.query.pages[id].templates;
              if(templates){
                for(var a=0,l=templates.length;a<l;a++){
                  var template = templates[a].title;
                  if(template.indexOf(":"+PortalEval.params.EvalTemplate)===-1) continue;
                  PortalEval.params.PageList[index]["eval"] = 1;
                }
              }else{
                var missing = (id == -1);
                if(missing) PortalEval.params.PageList[index]["talkmissing"] = 1;
              }
            }
          }
          if(PortalEval.params.PageList[index]["eval"] == 1){
            var URL = mw.config.get('wgServer')+mw.config.get('wgScript')+ "?title="+encodeURIComponent(talktitle)+"&action=raw";
            $.ajax({url:URL, complete: function(Req){
              PortalEval.functions.getEvalParams(Req.responseText, index, portal);
              PortalEval.functions.fillBoardLine(index, portal);
              PortalEval.functions.getPageEval(portal, (index+1));
            }});
          }else{
            PortalEval.functions.fillBoardLine(index, portal);
            PortalEval.functions.getPageEval(portal, (index+1));
          }
        });
      });
    },
    getPageStub : function(portal, index, callback, queryopt){
      var page = PortalEval.params.PageList[index];
      var title = page.title;
      if(!queryopt){
        queryopt = {
          action      : 'query',
          prop        : 'templates',
          tllimit     : PortalEval.params.APILimit,
          titles      : title,
          tltemplates : mw.config.get("wgFormattedNamespaces")[10]+":"+PortalEval.params.StubTemplate,
        };
      }
      var api = new mw.Api();
      api.get(queryopt).then(function(data){
        if(data.query.pages){
          for(var id in data.query.pages){
            var templates = data.query.pages[id].templates;
            if(templates){
              for(var a=0,l=templates.length;a<l;a++){
                var template = templates[a].title;
                if(template.indexOf(":"+PortalEval.params.StubTemplate)===-1) continue;
                PortalEval.params.PageList[index]["stub"] = 1;
                return callback(portal, index);
              }
            }
          }
        }
        if(data.continue && data.continue.tlcontinue){
          queryopt.tlcontinue = data.continue.tlcontinue;
          PortalEval.functions.getPageStub(portal, index, callback, queryopt);
        }else{
          return callback(portal, index);
        }
      });
    },
    getEvalParams : function(WikiText, index, portal){
      var Reg = new RegExp("\\{\\{ *"+PortalEval.params.EvalTemplate+"[^\\{]*\\}\\}", "ig");
      var matches = WikiText.match(Reg);
      var Wikitext = "";
      if(matches != null){
        for(var a=0,l=matches.length;a<l;a++){
          var thismatch = matches[a];
          Wikitext += thismatch;
          thismatch = thismatch.split("\n").join("");
          thismatch = thismatch.split("{{").join("");
          thismatch = thismatch.split("}}").join("");
          thismatch = thismatch.split("||").join("|?|");
          var implicitparams = [];
          thismatch = thismatch.split("|");
          for(var av=0,avlen=thismatch.length;av<avlen;av++){
            var thisparam = thismatch[av];
            if(thisparam === "") thisparam = "?";
            thisparam = thisparam.replace(/^[ ]*/g, "");
            thisparam = thisparam.replace(/[ ]*$/g, "");
            if(thisparam.indexOf("=") == -1) implicitparams.push(thisparam);
            if(thisparam.indexOf("avancement")!=-1){
              var AVT = thisparam.replace(/.*=[ ]*/g, "").replace(/\\n/g, "").replace(/\W/g, "");
              for(var avt=0,avtlen=PortalEval.params.Avancement.length;avt<avtlen;avt++){
                var thisavt = PortalEval.params.Avancement[avt];
                if(AVT == thisavt.wiki.replace(/\W/g, "")) PortalEval.params.PageList[index].evalAVT = avt;
              }
            } 
          }
          for(var p=0,plen=implicitparams.length;p<plen;p++){
            var thisimplicitparam = implicitparams[p];
            for(var imp=0,implen=PortalEval.params.Importance.length;imp<implen;imp++){
              var thisimp = PortalEval.params.Importance[imp];
              if(thisimplicitparam.replace(/\W/g, "") == thisimp.wiki.replace(/\W/g, "")){
                if(implicitparams[(p-1)].toLowerCase() == portal.toLowerCase()){
                  PortalEval.params.PageList[index].evalIMP = imp;
                }
                if(!PortalEval.params.PageList[index].allIMP) PortalEval.params.PageList[index].allIMP = {};
                PortalEval.params.PageList[index].allIMP[implicitparams[(p-1)]] = imp;
              }
            }
          }
        }
      }
      PortalEval.params.PageList[index].evalWT = Wikitext;
    },
    getPortals : function(queryopt){
      if(!queryopt){
        PortalEval.functions.alertControl("Listage des thèmes", true);
        queryopt = {
          action  : 'query',
          list    : 'categorymembers',
          cmlimit : PortalEval.params.APILimit,
          cmtitle : mw.config.get("wgFormattedNamespaces")[14]+":"+PortalEval.params.EvalCategory,
          cmtype  : 'subcat'
        };
      }
      var api = new mw.Api();
      api.get(queryopt).then(function(data){
        if(data.query.categorymembers){
          for(var a=0,l=data.query.categorymembers.length;a<l;a++){
            var page = data.query.categorymembers[a];
            var title = page.title
            for(var p=0,plen=PortalEval.params.EvalCatPrefixes.length;p<plen;p++){
              var EvalCatPrefix = PortalEval.params.EvalCatPrefixes[p];
              title = title.split(mw.config.get("wgFormattedNamespaces")[14]+":"+EvalCatPrefix).join("");
            }
            title = PortalEval.functions.ucFirst(title);
            if(title.indexOf("/")!==-1 && PortalEval.params.ManuPortals.indexOf(title) === -1) continue;
            if(PortalEval.params.AllPortals.indexOf(title)!==-1) continue;
            PortalEval.params.AllPortals.push(title);
            PortalEval.functions.alertControl("Listage des thèmes : "+title, true);
          }
        }
        if(data.continue && data.continue.cmcontinue){
          queryopt.cmcontinue = data.continue.cmcontinue;
          PortalEval.functions.getPortals(queryopt);
        }else{
          PortalEval.params.AllPortals.sort();
          var PortalSelect = document.getElementById("PortalEval_OptionPortal");
          if(PortalSelect) PortalEval.functions.createThemeSelect(PortalSelect, PortalEval_DefaultPortal);
          PortalEval.functions.alertControl();
        }
      });
    },
    createThemeSelect : function(Select, defaultoption){
      if(!Select){
        Select = document.createElement('select');
        Select.style.width = "150px";
      }else{
        while(Select.firstChild) Select.removeChild(Select.firstChild);
      }
      for(var a=0,l=PortalEval.params.AllPortals.length;a<l;a++){
        var title = PortalEval.params.AllPortals[a];
        var opt = document.createElement('option');
        opt.innerHTML = title;
        opt.value = title;
        if(typeof(defaultoption)!=="undefined" && title == defaultoption) opt.selected = "selected";
        Select.appendChild(opt);
      }
      return Select;
    },
    createLink : function(page, options){
      var link = document.createElement("a");
      link.href = mw.config.get("wgServer")+mw.config.get("wgArticlePath").split("$1").join(page);
      link.title = (options && options.title ? options.title : page );
      link.innerHTML = (options && options.text ? options.text : page );
      if(options && options.class) link.className = options.class;
      if(options && typeof(options.preview)=="number"){
        link.title =  PortalEval.texts.PreviewText.split("$1").join(link.title);
        link.onclick = function(){ PortalEval.functions.previewPage(page, options.preview); return false; }
      }
      return link;
    },
    createBoard : function(){
      var board = document.getElementById("PortalEvalBoard");
      if(board) return;
      var globalWrapper = document.getElementById("globalWrapper");
      if(globalWrapper) globalWrapper.style.display = "none";
      board = document.createElement("div");
      board.id = "PortalEvalBoard";
      document.body.appendChild(board);      
      var boardHead = document.createElement("div");  
      boardHead.id = "PortalEvalBoardHead";
      var HeadTable = document.createElement("table");
      HeadTable.width = "100%";
      var HeadTR = document.createElement("tr");
      var TDControl = document.createElement("td");
      TDControl.id = "PortalEvalBoardControl";
      TDControl.width = "10%";
      var TDMainHead = document.createElement("td");
      TDMainHead.style.textAlign = "center";
      var OptionForm = document.createElement("form");
      OptionForm.onsubmit = function(){ return false; };
      OptionForm.id = "PortalEvalBoardOptions";
      var PortalLabel = document.createElement('label');
      PortalLabel.setAttribute("for", "Portal");
      PortalLabel.innerHTML = PortalEval.texts.Portal
      OptionForm.appendChild(PortalLabel);
      OptionForm.appendChild(document.createTextNode(" : "));
      var PortalSelect = document.createElement('select');
      PortalSelect.id = "PortalEval_OptionPortal";
      PortalSelect.name = "PortalEval_OptionPortal";
      PortalSelect.style.width = "300px";
      OptionForm.appendChild(document.createTextNode(" "));
      OptionForm.appendChild(PortalSelect);
      var PortalListInput = document.createElement("input");
      PortalListInput.type = "button";
      PortalListInput.value = PortalEval.texts.GoListText;
      PortalListInput.title = PortalEval.texts.GoListTitle;
      PortalListInput.onclick = function(){
        PortalEval.functions.clearBoard();
        var Select = document.getElementById("PortalEval_OptionPortal");
        PortalEval.functions.getPages(Select.value);
      }
      OptionForm.appendChild(document.createTextNode(" "));
      OptionForm.appendChild(PortalListInput);
      var SortHidden = document.createElement('input');
      SortHidden.id = "PortalEval_SortHidden";
      SortHidden.type = "hidden";
      var SortSelect = document.createElement('select');
      SortSelect.id = "PortalEval_OptionSort";
      SortSelect.name = "PortalEval_OptionSort";
      var SortOptions = ["SortTitle","SortEval","SortStub","SortAVT","SortIMP"];
      for(var a=0,l=SortOptions.length;a<l;a++){
        var optD = document.createElement('option');
        optD.innerHTML = PortalEval.texts[SortOptions[a]] + " ↓";
        optD.title = PortalEval.texts[(SortOptions[a]+"Tip")];
        optD.value = SortOptions[a]+"_DOWN";
        if(a==0){
          optD.selected = "selected";
          SortHidden.value = optD.value;
        }
        SortSelect.appendChild(optD);
        var optU = document.createElement('option');
        optU.innerHTML = PortalEval.texts[SortOptions[a]] + " ↑";
        optU.title = PortalEval.texts[(SortOptions[a]+"Tip")];
        optU.value = SortOptions[a]+"_UP";
        SortSelect.appendChild(optU);
      }
      SortSelect.onchange = function(){
        var SortSelect = document.getElementById("PortalEval_OptionSort");
        var SortHidden = document.getElementById("PortalEval_SortHidden");
        var SortButton = document.getElementById("PortalEval_SortButton");
        var dis = ((SortHidden.value == SortSelect.value) ? "disabled" : false);
        SortButton.disabled = dis;
      }
      OptionForm.appendChild(document.createTextNode(" • "));
      OptionForm.appendChild(SortHidden);
      OptionForm.appendChild(SortSelect);
      var SortListInput = document.createElement("input");
      SortListInput.type = "button";
      SortListInput.id = "PortalEval_SortButton";
      SortListInput.value = PortalEval.texts.GoSortText;
      SortListInput.title = PortalEval.texts.GoSortTitle;
      SortListInput.disabled = "disabled";
      SortListInput.onclick = function(){
        var Portal_Select = document.getElementById("PortalEval_OptionPortal");
        var Sort_Select = document.getElementById("PortalEval_OptionSort");
        var Sort_Hidden = document.getElementById("PortalEval_SortHidden");
        Sort_Hidden.value = Sort_Select.value;
        this.disabled = "disabled";
        PortalEval.functions.sortPages(Sort_Select.value, Portal_Select.value);        
      }
      OptionForm.appendChild(document.createTextNode(" "));
      OptionForm.appendChild(SortListInput);
      var ChangeLabel = document.createElement('label');
      ChangeLabel.setAttribute("for", "Change");
      ChangeLabel.innerHTML = PortalEval.texts.GoChangeLabel;
      var GlobalChangeInput = document.createElement("input");
      GlobalChangeInput.name = "Change";
      GlobalChangeInput.id = "GlobalChangeInput";
      GlobalChangeInput.type = "button";
      GlobalChangeInput.value = PortalEval.texts.GoChangeText;
      GlobalChangeInput.title = PortalEval.texts.GoChangeTitle;
      GlobalChangeInput.disabled = "disabled";
      GlobalChangeInput.onclick = function(){
        var SortInput = document.getElementById("PortalEval_SortButton");
        var CancelInput = document.getElementById("GlobalCancelInput");
        SortInput.disabled = "disabled";
        CancelInput.disabled = "disabled";
        this.disabled = "disabled";
        var boardList = document.getElementById("PortalEvalBoardList");
        var TRs = boardList.getElementsByTagName("tr");
        for(var a=1,l=TRs.length;a<l;a++){
          PortalEval.functions.processThatLineChanges((a-1));
        }
      }
      var GlobalCancelInput = document.createElement("input");
      GlobalCancelInput.type = "button";
      GlobalCancelInput.name = "Change";
      GlobalCancelInput.id = "GlobalCancelInput";
      GlobalCancelInput.value = PortalEval.texts.GoCancelText;
      GlobalCancelInput.title = PortalEval.texts.GoCancelTitle;
      GlobalCancelInput.disabled = "disabled";
      GlobalCancelInput.onclick = function(){
        PortalEval.functions.cancelAllChanges();
      }
      OptionForm.appendChild(document.createTextNode(" • "));
      OptionForm.appendChild(ChangeLabel);
      OptionForm.appendChild(document.createTextNode(" : "));
      OptionForm.appendChild(GlobalChangeInput);
      OptionForm.appendChild(document.createTextNode(" "));
      OptionForm.appendChild(GlobalCancelInput);
      TDMainHead.appendChild(OptionForm);
      var TDButtons = document.createElement("td");
      TDButtons.width = "10%";
      TDButtons.style.textAlign = "right";
      TDButtons.valign = "top";
      var CloseButton = document.createElement("a");
      CloseButton.href = "javascript:PortalEval.functions.removeBoard()";
      CloseButton.title = PortalEval.texts.GoCloseTitle;
      var CloseButtonImage = document.createElement("img");
      CloseButtonImage.width = 24;
      CloseButtonImage.height = 24;
      CloseButtonImage.src = PortalEval.params.ImageURL + PortalEval.params.CloseIcon;
      CloseButton.appendChild(CloseButtonImage);
      TDButtons.appendChild(CloseButton);
      HeadTR.appendChild(TDControl);
      HeadTR.appendChild(TDMainHead);
      HeadTR.appendChild(TDButtons);
      HeadTable.appendChild(HeadTR);
      boardHead.appendChild(HeadTable);
      board.appendChild(boardHead);     
      var boardListDiv = document.createElement("div");
      boardListDiv.id = "PortalEvalBoardListDiv";
      var boardList = document.createElement("table");
      boardList.className = "wikitable centre";
      boardList.width = "100%";
      boardList.id = "PortalEvalBoardList";
      var TR1 = document.createElement("tr");
      boardList.appendChild(TR1);
      for(var a=0,l=PortalEval.texts.THtexts.length;a<l;a++){
        var TH = document.createElement("th");
        TH.innerHTML = PortalEval.texts.THtexts[a];
        if(PortalEval.params.THwidths[a]) TH.width = PortalEval.params.THwidths[a];
        TR1.appendChild(TH);
      }      
      boardListDiv.appendChild(boardList);
      board.appendChild(boardListDiv);
      PortalEval.functions.getPortals();
    },
    alertControl : function(text, running){
      var control = document.getElementById("PortalEvalBoardControl");
      if(!control) return; 
      if(!text){
        control.innerHTML = '<img width="16"  height="16" src="'+PortalEval.params.ImageURL + PortalEval.params.YesSymbol +'" />';
        return;
      }else{
        control.innerHTML = ''
        + (running ? ('<img width="16"  height="16" src="'+PortalEval.params.ImageURL + PortalEval.params.RunningIcon+'" />' + " ") : "")
        + text;
      }
    },
    removeBoard : function(){
      var board = document.getElementById("PortalEvalBoard");
      if(board) board.parentNode.removeChild(board);  
      var globalWrapper = document.getElementById("globalWrapper");
      if(globalWrapper) globalWrapper.style.display = "";    
    },
    clearBoard : function(){      
      var boardList = document.getElementById("PortalEvalBoardList");
      if(boardList){
        while(boardList.getElementsByTagName("tr").length > 1){
          boardList.getElementsByTagName("tr")[1].parentNode.removeChild(boardList.getElementsByTagName("tr")[1]);
          if(boardList.getElementsByTagName("tr").length < 2) break;
        }
      };
    },
    fillBoardLine : function(index, portal){
      var BoardList = document.getElementById("PortalEvalBoardList");
      if(!BoardList) return;
      var Target = BoardList.getElementsByTagName("tr")[0].parentNode;
      var TR = document.createElement('tr');  
      Target.appendChild(TR);
      var pagedatas = PortalEval.params.PageList[index];
      var title = pagedatas.title;
      var talktitle = pagedatas.talktitle;
      var talkmissing = pagedatas.talkmissing;
      var isstub = pagedatas.stub === 1;
      var eval = pagedatas.eval === 1;
      var evalWT = pagedatas.evalWT;
      var evalAVT = pagedatas.evalAVT;
      var evalIMP = pagedatas.evalIMP;
      var allIMP = pagedatas.allIMP;
      TR.id = "IDtr_"+index;
      var classes = [];
      if(eval) classes.push("evaluated");
      if(isstub) classes.push("stub");
      if(typeof(evalAVT)=="number") classes.push("AVT_"+evalAVT);
      if(typeof(evalIMP)=="number") classes.push("IMP_"+evalIMP);
      TR.className = classes.join(" ");
      var TD1 = document.createElement("td"); // "Page"
      TD1.className = "TD1";
      var PageLink = PortalEval.functions.createLink(title, {preview:index});
      var TalkPageLink = PortalEval.functions.createLink(talktitle, {text:PortalEval.texts.TalkText, preview:index, class:(talkmissing ? "new" : "")});
      TD1.appendChild(PageLink)
      TD1.appendChild(document.createTextNode(" ("))
      TD1.appendChild(TalkPageLink)
      TD1.appendChild(document.createTextNode(")"))
      var TD2 = document.createElement("td"); // "Ébauche ?"
      TD2.className = "TD2";
      TD2.style.textAlign = "center";
      var StubImage = document.createElement('img');
      StubImage.width = 16
      StubImage.height = 16;
      StubImage.src = PortalEval.params.ImageURL + (isstub ? PortalEval.params.YesSymbol : PortalEval.params.NoSymbol );
      TD2.appendChild(StubImage);
      var TD3 = document.createElement("td"); // "Éval ?"
      TD3.className = "TD3";
      TD3.style.textAlign = "center";
      var EvalImage = document.createElement('img');
      EvalImage.width = 16
      EvalImage.height = 16;
      EvalImage.src = PortalEval.params.ImageURL + (eval ? PortalEval.params.YesSymbol : PortalEval.params.NoSymbol );
      if(eval) EvalImage.title = evalWT
      TD3.appendChild(EvalImage);
      var TD4 = document.createElement("td"); // "Avancement"
      TD4.className = "TD4";
      TD4.style.textAlign = "center";
      if(typeof(evalAVT)=="number"){
        TD4.appendChild(PortalEval.functions.createAVTSelect(evalAVT, index));
        var col = PortalEval.params.Avancement[evalAVT].color;
        var textcolor = PortalEval.params.Avancement[evalAVT].textcolor;
        TD4.style.backgroundColor = col;
        if(textcolor) TD4.style.color = textcolor;
        if( (isstub && evalAVT != 5) || (!isstub && evalAVT == 5) ){
          TD2.style.border = "2px solid red";
          TD4.style.border = "2px solid red";
        } 
      }else{
        TD4.appendChild(PortalEval.functions.createAVTSelect(-1, index, true));
      }
      var TD5 = document.createElement("td"); // "Importances"
      TD5.className = "TD5";
      TD5.style.textAlign = "right";
      if(typeof(evalIMP)=="number"){
        TD5.appendChild(PortalEval.functions.createIMPSelect(evalIMP, portal, index, 0));
        var col = PortalEval.params.Importance[evalIMP].color;
        var textcolor = PortalEval.params.Importance[evalIMP].textcolor;
        TD5.style.backgroundColor = col;
        if(textcolor) TD5.style.color = textcolor;
      }
      if(allIMP){
        var count = 1;
        for(var port in allIMP){
          if(port == portal) continue;
          var thisimp = allIMP[port];
          TD5.appendChild(PortalEval.functions.createIMPSelect(thisimp, port, index, count));
          count++
        }
      }
      var AddIMPForm = document.createElement('form');   
      AddIMPForm.id = "add_"+index; 
      var AddInput = document.createElement("input");
      AddInput.type = "button";
      AddInput.value = PortalEval.texts.AddIMPText;
      AddInput.title = PortalEval.texts.AddIMPTitle;
      AddInput.onclick = function(){
        PortalEval.functions.addOneIMPForm(index);
      }
      AddIMPForm.appendChild(AddInput);
      TD5.appendChild(AddIMPForm);
      var TD6 = document.createElement("td"); // "Actions"
      TD6.className = "TD6";
      TD6.style.textAlign = "center";      
      var ChangeInput = document.createElement("input");
      ChangeInput.id = "change_"+index;
      ChangeInput.type = "button";
      ChangeInput.value = PortalEval.texts.GoChangeOneText;
      ChangeInput.title = PortalEval.texts.GoChangeOneTitle;
      ChangeInput.disabled = "disabled";
      ChangeInput.onclick = function(){
        PortalEval.functions.processThatLineChanges(index);
      }
      TD6.appendChild(ChangeInput);
      TD6.appendChild(document.createElement("br")); 
      var CancelInput = document.createElement("input");
      CancelInput.type = "button";
      CancelInput.id = "cancel_"+index;
      CancelInput.value = PortalEval.texts.GoCancelOneText;
      CancelInput.title = PortalEval.texts.GoCancelOneTitle;
      CancelInput.disabled = "disabled";
      CancelInput.onclick = function(){
        PortalEval.functions.cancelOneChanges(index);
      }
      TD6.appendChild(CancelInput); 
      TR.appendChild(TD1);
      TR.appendChild(TD2);
      TR.appendChild(TD3);
      TR.appendChild(TD4);
      TR.appendChild(TD5);
      TR.appendChild(TD6);
      return TR;
    },
    createIMPSelect : function(evalIMP, portal, index, count){
      var form = document.createElement("form");
      form.onsubmit = function(){ return false; };
      form.id = "IMPform_"+count+"_"+index;
      form.style.whiteSpace = "nowrap";
      var Hidden = document.createElement("input");
      Hidden.type = "hidden";
      Hidden.id = "IMP_"+count+"_"+index;
      form.appendChild(Hidden); 
      var Label = document.createElement('label');
      Label.setAttribute("for", "Importance "+portal);
      Label.innerHTML = portal;
      if(count==0){
        Label.style.fontWeight = "bold";
        Label.className = "portal";
      }
      form.appendChild(Label);
      form.appendChild(document.createTextNode(" : "));
      var Select = document.createElement("select");
      Select.name = "Importance "+portal;
      for(var a=0,l=PortalEval.params.Importance.length;a<l;a++){
        var thisimp = PortalEval.params.Importance[a];
        var opt = document.createElement('option');
        opt.innerHTML = thisimp.text;
        opt.value = a;
        opt.style.backgroundColor = thisimp.color;
        if(thisimp.textcolor) opt.style.color = thisimp.textcolor;
        if(a == evalIMP){
          opt.selected = "selected";
          Hidden.value = opt.value;
        }
        Select.appendChild(opt);
      }
      Select.onchange = function(){
        PortalEval.functions.setChangeCancelOneIMPInputDisabled(this, count, index);
      }
      form.appendChild(Select);
      var suplink = document.createElement("input");
      suplink.type = "button";      
      suplink.value = PortalEval.texts.DeleteIMPText;
      suplink.title = PortalEval.texts.DeleteIMPTitle;
      suplink.onclick = function(){
        var F = this.parentNode;
        thisSelect = F.getElementsByTagName("select")[0];
        thisSelect.disabled = "disabled";
        F.style.display = "none";
        $(F).addClass("Removed");
        PortalEval.functions.setChangeCancelOneIMPInputDisabled(this, count, index);
      }
      form.appendChild(document.createTextNode(" "));
      form.appendChild(suplink);
      return form;
    },
    setChangeCancelOneIMPInputDisabled : function(Select, count, index) {
        var val = (Select.tagName.toLowerCase == "select" ? Select.value : false);
        var defval = document.getElementById("IMP_"+count+"_"+index).value;
        var dis = (val == defval ? "disabled" : false );
        var F = Select.parentNode;
        if(dis) $(F).removeClass("Modified");
        else $(F).addClass("Modified");
        PortalEval.functions.setChangeCancelOneInputDisabled(index);
        PortalEval.functions.setChangeCancelInputDisabled();
    },
    setChangeCancelOneInputDisabled : function(index) {
        var TR = document.getElementById("IDtr_"+index);
        var ChangeInput = document.getElementById("change_"+index);
        var CancelInput = document.getElementById("cancel_"+index);
        var forms = TR.getElementsByTagName("form");
        var dis = "disabled";
        for(var a=0,l=forms.length;a<l;a++){
          if($(forms[a]).hasClass("Modified")) dis = false;
        }        
        if(dis) $(TR).removeClass("Modified");
        else $(TR).addClass("Modified");
        CancelInput.disabled = dis;
        ChangeInput.disabled = dis;
    },
    createAVTSelect : function(evalAVT, index, empty){
      var form = document.createElement("form");
      form.onsubmit = function(){ return false; };
      form.style.whiteSpace = "nowrap";
      var Hidden = document.createElement("input");
      Hidden.type = "hidden";
      Hidden.id = "AVT_"+index;
      form.appendChild(Hidden); 
      var Select = document.createElement("select");
      Select.name = "Avancement";
      if(empty){
        var emptyopt = document.createElement('option');
        emptyopt.innerHTML = "";
        emptyopt.value = "???";
        Select.appendChild(emptyopt);
        Hidden.value = "???";
      }
      for(var a=0,l=PortalEval.params.Avancement.length;a<l;a++){
        var thisavt = PortalEval.params.Avancement[a];
        var opt = document.createElement('option');
        opt.innerHTML = thisavt.text;
        opt.value = a;
        opt.style.backgroundColor = thisavt.color;
        if(thisavt.textcolor) opt.style.color = thisavt.textcolor;
        if(a == evalAVT){
          opt.selected = "selected";
          Hidden.value = a;
        }
        Select.appendChild(opt);
      }
      Select.onchange = function(){
        var val = this.value;
        var defval = document.getElementById("AVT_"+index).value;
        var dis = (val == defval ? "disabled" : false );
        var F = Select.parentNode;
        if(dis) $(F).removeClass("Modified");
        else $(F).addClass("Modified");
        PortalEval.functions.setChangeCancelOneInputDisabled(index);
        PortalEval.functions.setChangeCancelInputDisabled();
      }
      form.appendChild(Select);      
      return form;
    },
    setChangeCancelInputDisabled : function() {
      var BoardList = document.getElementById("PortalEvalBoardList");
      var ChangeInput = document.getElementById("GlobalChangeInput");
      var CancelInput = document.getElementById("GlobalCancelInput");
      if(!BoardList || !ChangeInput || !CancelInput ) return;
      var AnyChange = false;
      var TRs = BoardList.getElementsByTagName('tr');
      for(var a=0,l=TRs.length;a<l;a++){
        if($(TRs[a]).hasClass("Modified")){
          ChangeInput.disabled = false;
          CancelInput.disabled = false;
          return;
        }
      }
      ChangeInput.disabled = "disabled";
      CancelInput.disabled = "disabled";
    },
    cancelOneChanges : function(index){
      var TR = document.getElementById("IDtr_"+index);
      var forms = TR.getElementsByTagName("form");
      for(var a=0,l=forms.length;a<l;a++){
        var thisform = forms[a];
        if(!($(thisform).hasClass("Modified"))) continue;
        if($(thisform).hasClass("Added")){
          thisform.parentNode.removeChild(thisform);
          a--;
          continue;
        }
        var Select = thisform.getElementsByTagName("select")[0];
        var Hidden = thisform.getElementsByTagName("input")[0];
        var opt = Select.getElementsByTagName("option");
        for(o=0,olen=opt.length;o<olen;o++){
          var thisopt = opt[o];
          if(thisopt.value == Hidden.value) thisopt.selected = "selected";
        }
        $(thisform).removeClass("Modified");
        $(thisform).removeClass("Removed");
        thisform.style.display = "";      
        Select.disabled = false;  
      }
      PortalEval.functions.setChangeCancelOneInputDisabled(index);
      PortalEval.functions.setChangeCancelInputDisabled();
    },
    cancelAllChanges : function(){
      var BoardList = document.getElementById("PortalEvalBoardList");
      if(!BoardList) return;  
      var TRs = BoardList.getElementsByTagName('tr');
      for(var a=0,l=TRs.length;a<l;a++){
        var TR = TRs[a];
        if(!TR.id) continue;
        var index = parseInt(TR.id.replace(/[^0-9]/g, ""));
        PortalEval.functions.cancelOneChanges(index);
      }
    },
    addOneIMPForm : function(index){
      var AddIMPForm = document.getElementById("add_"+index);
      var TD = AddIMPForm.parentNode;
      var count = (TD.getElementsByTagName('form').length);
      var form = document.createElement("form");
      form.onsubmit = function(){ return false; };
      form.id = "IMPform_"+count+"_"+index;
      form.className = "Modified Added";
      form.style.whiteSpace = "nowrap";
      var Hidden = document.createElement("input");
      Hidden.type = "hidden";
      Hidden.id = "IMP_"+count+"_"+index;
      Hidden.value = ".";
      form.appendChild(Hidden); 
      var ThemeSelect = PortalEval.functions.createThemeSelect();
      var Label = document.createElement('input');
      ThemeSelect.name = "portal";
      form.appendChild(ThemeSelect);
      form.appendChild(document.createTextNode(" : "));
      var Select = document.createElement("select");
      Select.name = "Importance NEW";
      for(var a=0,l=PortalEval.params.Importance.length;a<l;a++){
        var thisimp = PortalEval.params.Importance[a];
        var opt = document.createElement('option');
        opt.innerHTML = thisimp.text;
        opt.value = a;
        opt.style.backgroundColor = thisimp.color;
        if(thisimp.textcolor) opt.style.color = thisimp.textcolor;
        if(a == (PortalEval.params.Importance.length-1)) opt.selected = "selected";
        Select.appendChild(opt);
      }
      Select.onchange = function(){
        PortalEval.functions.setChangeCancelOneIMPInputDisabled(this, count, index);
      }
      form.appendChild(Select);
      var suplink = document.createElement("input");
      suplink.type = "button";      
      suplink.value = PortalEval.texts.DeleteIMPText;
      suplink.title = PortalEval.texts.DeleteIMPTitle;
      suplink.onclick = function(){
        var F = this.parentNode;
        F.parentNode.removeChild(F);
        PortalEval.functions.setChangeCancelOneInputDisabled(index);
      }
      form.appendChild(document.createTextNode(" "));
      form.appendChild(suplink);
      AddIMPForm.parentNode.insertBefore(form, AddIMPForm);
      Label.focus();
      PortalEval.functions.setChangeCancelOneIMPInputDisabled(Select, count, index);
    },
    sortPages : function(selectvalue, portal) {
      var DOWN = selectvalue.indexOf("_DOWN")!==-1;
      selectvalue = selectvalue.replace(/_.*/g, "");
      PortalEval.functions.sortPagesGo[selectvalue](portal, DOWN);
    },
    sortPagesGo : { 
      SortTitle : function(portal, updown) {
        var BoardList = document.getElementById("PortalEvalBoardList");
        if(!BoardList) return;
        PortalEval.functions.clearBoard();
        var PageList = PortalEval.params.PageList;
        var NewPageList = [];
        var b, m, added = false;
        while(PageList.length > 0){
          var thispage = PageList[0];
          var thispagetitle = thispage.title;
          added = false;
          for(b=0, m=NewPageList.length;b<m;b++){
            if(added) continue;
            var thisnewpage = NewPageList[b];
            var thisnewpagetitle = thisnewpage.title;
            var comparison = (updown ? thispagetitle : thisnewpagetitle);
            if([thisnewpagetitle, thispagetitle].sort()[0] == comparison){
              NewPageList.splice(b, 0, thispage);
              PageList.shift();
              added = true;
            }
          }
          if(!added){
            NewPageList.push(thispage);
            PageList.shift();
          }
          if(PageList.length == 0) break;
        }
        PortalEval.params.PageList = NewPageList;
        for(var a=0,l=NewPageList.length;a<l;a++){
          PortalEval.functions.fillBoardLine(a, portal);
        }
      },
      SortEval : function(portal, updown) {
        var BoardList = document.getElementById("PortalEvalBoardList");
        if(!BoardList) return;
        PortalEval.functions.clearBoard();
        var PageList = PortalEval.params.PageList;
        var NewPageList = [];
        var b, m, added = false;
        while(PageList.length > 0){
          var thispage = PageList[0];
          var thispageeval = ( thispage.eval ? 0 : 1);
          added = false;
          for(b=0, m=NewPageList.length;b<m;b++){
            if(added) continue;
            var thisnewpage = NewPageList[b];
            var thisnewpageeval = (thisnewpage.eval ? 0 : 1);
            var comparison = (updown ? thispageeval : thisnewpageeval);
            if([thisnewpageeval, thispageeval].sort()[0] == comparison){
              NewPageList.splice(b, 0, thispage);
              PageList.shift();
              added = true;
            }
          }
          if(!added){
            NewPageList.push(thispage);
            PageList.shift();
          }
          if(PageList.length == 0) break;
        }
        PortalEval.params.PageList = NewPageList;
        for(var a=0,l=NewPageList.length;a<l;a++){
          PortalEval.functions.fillBoardLine(a, portal);
        }
      },
      SortStub : function(portal, updown) {
        var BoardList = document.getElementById("PortalEvalBoardList");
        if(!BoardList) return;
        PortalEval.functions.clearBoard();
        var PageList = PortalEval.params.PageList;
        var NewPageList = [];
        var b, m, added = false;
        while(PageList.length > 0){
          var thispage = PageList[0];
          var thispagestub = ( thispage.stub ? 1 : 0);
          added = false;
          for(b=0, m=NewPageList.length;b<m;b++){
            if(added) continue;
            var thisnewpage = NewPageList[b];
            var thisnewpagestub = (thisnewpage.stub ? 1 : 0);
            var comparison = (updown ? thispagestub : thisnewpagestub);
            if([thisnewpagestub, thispagestub].sort()[0] == comparison){
              NewPageList.splice(b, 0, thispage);
              PageList.shift();
              added = true;
            }
          }
          if(!added){
            NewPageList.push(thispage);
            PageList.shift();
          }
          if(PageList.length == 0) break;
        }
        PortalEval.params.PageList = NewPageList;
        for(var a=0,l=NewPageList.length;a<l;a++){
          PortalEval.functions.fillBoardLine(a, portal);
        }
      },
      SortAVT : function(portal, updown) {
        var BoardList = document.getElementById("PortalEvalBoardList");
        if(!BoardList) return;
        PortalEval.functions.clearBoard();
        var PageList = PortalEval.params.PageList;
        var NewPageList = [];
        var b, m, added = false;
        while(PageList.length > 0){
          var thispage = PageList[0];
          var thispageevalAVT = thispage.evalAVT;
          if(typeof(thispageevalAVT)!="number") thispageevalAVT = 99;
          added = false;
          for(b=0, m=NewPageList.length;b<m;b++){
            if(added) continue;
            var thisnewpage = NewPageList[b];
            var thisnewpageevalAVT = thisnewpage.evalAVT;
            if(typeof(thisnewpageevalAVT)!="number") thisnewpageevalAVT = 99;
            var comparison = (updown ? thisnewpageevalAVT : thispageevalAVT);
            if([thisnewpageevalAVT, thispageevalAVT].sort()[0] == comparison){
              NewPageList.splice(b, 0, thispage);
              PageList.shift();
              added = true;
            }
          }
          if(!added){
            NewPageList.push(thispage);
            PageList.shift();
          }
          if(PageList.length == 0) break;
        }
        PortalEval.params.PageList = NewPageList;
        for(var a=0,l=NewPageList.length;a<l;a++){
          PortalEval.functions.fillBoardLine(a, portal);
        }
      },
      SortIMP : function(portal, updown) {
        var BoardList = document.getElementById("PortalEvalBoardList");
        if(!BoardList) return;
        PortalEval.functions.clearBoard();
        var PageList = PortalEval.params.PageList;
        var NewPageList = [];
        var b, m, added = false;
        while(PageList.length > 0){
          var thispage = PageList[0];
          var thispageevalIMP = 99;
          try{ 
            thispageevalIMP = thispage.allIMP[portal];
            if(typeof(thispageevalIMP)!="number") thispageevalIMP = 99;
          }catch(e){ }
          added = false;
          for(b=0, m=NewPageList.length;b<m;b++){
            if(added) continue;
            var thisnewpage = NewPageList[b];
            var thisnewpageevalIMP = 99;
            try{
              thisnewpageevalIMP = thisnewpage.allIMP[portal];
              if(typeof(thisnewpageevalIMP)!="number") thisnewpageevalIMP = 99;
            }catch(e){ }
            var comparison = (updown ? thispageevalIMP : thisnewpageevalIMP);
            if([thisnewpageevalIMP, thispageevalIMP].sort()[0] == comparison){
              NewPageList.splice(b, 0, thispage);
              PageList.shift();
              added = true;
            }
          }
          if(!added){
            NewPageList.push(thispage);
            PageList.shift();
          }
          if(PageList.length == 0) break;
        }
        PortalEval.params.PageList = NewPageList;
        for(var a=0,l=NewPageList.length;a<l;a++){
          PortalEval.functions.fillBoardLine(a, portal);
        }
      }
    },
    processThatLineChanges : function(index){
      var TR = document.getElementById("IDtr_"+index);
      if(!($(TR).hasClass("Modified"))) return;
      var OldParams = PortalEval.params.PageList[index];
      var NewParams = {
        title : OldParams.title,
        talktitle : OldParams.talktitle,
        talkmissing : 0,
        eval : 1,
        stub : OldParams.stub,
        allIMP : {}
      };
      var TD1 = TR.getElementsByTagName('td')[0];
      var IMG = document.createElement('img');
      IMG.width = 14;
      IMG.height = 14;
      IMG.src = PortalEval.params.ImageURL + PortalEval.params.RunningIcon;
      TD1.insertBefore(document.createTextNode(" "), TD1.firstChild);
      TD1.insertBefore(IMG, TD1.firstChild);
      var ChangeInput = document.getElementById("change_"+index);
      ChangeInput.disabled = "disabled";
      var CancelInput = document.getElementById("cancel_"+index);
      CancelInput.disabled = "disabled";
      var Forms = TR.getElementsByTagName('form');
      for(var a=0,l=Forms.length;a<l;a++){
        var thisForm = Forms[a];
        if($(thisForm).hasClass("Removed")) continue;
        var Label = thisForm.getElementsByTagName("label")[0];
        var Inputs = thisForm.getElementsByTagName("input");
        for(var i=0,ilen=Inputs.length;i<ilen;i++){
          var ThisInput = Inputs[i];
          if(ThisInput.type == "button" || ThisInput.type == "text") ThisInput.disabled = "disabled";
        }
        var Selects = thisForm.getElementsByTagName("select");
        for(var s=0,slen=Selects.length;s<slen;s++){
          var ThisSelect = Selects[s];
          ThisSelect.disabled = "disabled";
          var SelectValue = ThisSelect.value;
          var SelectName = ThisSelect.name;
          if(SelectName == "Avancement"){
            NewParams.evalAVT = parseInt(SelectValue);
          }else if(SelectName == "Importance NEW"){
            var ThemeSelect = Selects[(s-1)];
            var thisportal = ThemeSelect.value;
            if(thisportal != ""){
              NewParams.allIMP[thisportal] = parseInt(SelectValue);
              var PortalSelect = document.getElementById("PortalEval_OptionPortal");
              if(PortalSelect && PortalSelect.value == thisportal) NewParams.evalIMP = parseInt(SelectValue);
            }
          }else if(SelectName.indexOf("Importance")==0){              
            if($(Label).hasClass("portal")) NewParams.evalIMP = parseInt(SelectValue);
            NewParams.allIMP[Label.innerHTML] = parseInt(SelectValue);
          }
        }
      }
      var NewWikitext = "{{"+PortalEval.params.EvalTemplate+"\n";
      for(var imp in NewParams.allIMP){
        NewWikitext += "|"+imp+"|"+PortalEval.params.Importance[NewParams.allIMP[imp]].wiki+"\n"
      }
      NewWikitext += "|avancement="+PortalEval.params.Avancement[NewParams.evalAVT].wiki+"\n"
      var OldWikitext = OldParams.evalWT;
      if(OldWikitext){
        OldWikitext = OldParams.evalWT.split("\n").join("");
        OldWikitext = OldWikitext.split("|");
        for(var a=1,l=OldWikitext.length;a<l;a++){
          var thisparam = OldWikitext[a].split("}}").join("");
          if(thisparam.indexOf("=")===-1) continue;
          if(thisparam.indexOf("avancement")!==-1) continue;
          NewWikitext += "|"+thisparam+"\n";     
        }   
      }
      NewWikitext += "}}";
      NewParams.evalWT = NewWikitext;
      // return alert(NewWikitext);
      PortalEval.functions.doThatLineChanges(index, OldParams, NewParams);
    },
    doThatLineChanges : function(index, OldParams, NewParams){
      $.ajax({
        url: mw.util.wikiScript('api'),
        data: {
          action: 'query',
          prop: 'revisions',
          rvlimit : 1,
          rvprop: 'timestamp|content',
          titles: NewParams.talktitle,
          format: 'json',
        },
        success: function(data) {
          var NewWikitext = "";
          var timestamp = "now";
          if(OldParams.talkmissing){
            NewWikitext = NewParams.evalWT;
          }else{
            timestamp = data.query.pages[Object.keys(data.query.pages)[0]].revisions[0].timestamp;
            var OldWikitext = data.query.pages[Object.keys(data.query.pages)[0]].revisions[0]["*"];
            var Reg = new RegExp("\\{\\{ *"+PortalEval.params.EvalTemplate+"[^\\{]*\\}\\}", "ig");
            var matches = OldWikitext.match(Reg);
            if(matches == null){
              NewWikitext = NewParams.evalWT + "\n" + OldWikitext;
            }else{
              for(var a=0,l=matches.length;a<l;a++){
                var thismatch = matches[a];
                if(a!==0){
                  NewWikitext = OldWikitext.replace(thismatch, "");
                }else{
                  NewWikitext = OldWikitext.replace(thismatch, NewParams.evalWT);
                }
              }
            }
          }
          $.ajax({
            url: mw.util.wikiScript('api'),
            data: {
              action: 'query',
              meta: 'tokens',
              format: 'json',
              type: 'csrf',
            },
            dataType: 'json'
          }).then(function(data) {
            $.ajax({
              url: mw.util.wikiScript('api'),
              method: 'POST',
              data: {
                action: 'edit',
                title: NewParams.talktitle,
                text: NewWikitext,
                summary: PortalEval.texts.EvalResume,
                basetimestamp: timestamp,
                format: 'json',
                token: data.query.tokens.csrftoken
              },
              dataType: 'json',
              success: function(data){
                PortalEval.functions.updateThatLine(index, NewParams);
              }
            });
          });
        }
      });
    },
    updateThatLine : function(index, NewParams){
      PortalEval.params.PageList[index] = NewParams;
      var portalSelect = document.getElementById("PortalEval_OptionPortal");
      var portal = portalSelect.value;
      var OldTR = document.getElementById("IDtr_"+index);
      var NewTR = PortalEval.functions.fillBoardLine(index, portal);
      OldTR.parentNode.insertBefore(NewTR, OldTR);
      OldTR.parentNode.removeChild(OldTR);
    },
    previewPage : function(title, index){
      var previewDiv = document.getElementById("previewDiv_"+index);
      if(previewDiv) return;
      previewDiv = document.createElement('div');
      previewDiv.id = "previewDiv_"+index;
      previewDiv.style.maxHeight = PortalEval.params.PreviewHeight + "px";
      previewDiv.style.width = "100%";
      previewDiv.style.overflowY = "scroll";
      previewDiv.style.borderTop = "1px dashed #a2a9b1";
      previewDiv.innerHTML = '<img width="16"  height="16" src="'+PortalEval.params.ImageURL + PortalEval.params.RunningIcon+'" /> Loading preview';
      var TR = document.getElementById("IDtr_"+index);
      var TD1 = TR.getElementsByTagName('td')[0];
      TD1.appendChild(previewDiv);
      var URL = mw.config.get('wgServer')+mw.config.get('wgArticlePath').split("$1").join(encodeURIComponent(title));
      $.ajax({url:URL, complete: function(Req){
        var TEMP = document.createElement("div");
        TEMP.style.display = "none";
        TEMP.innerHTML = Req.responseText;
        document.body.appendChild(TEMP);
        var Divs = TEMP.getElementsByTagName('div');
        while(previewDiv.firstChild){ previewDiv.removeChild(previewDiv.firstChild); }
        for(var a=0,l=Divs.length;a<l;a++){
          var thisDiv = Divs[a];
          if(!thisDiv) continue;
          if(thisDiv.id && thisDiv.id === "mw-content-text"){
            var contentdiv = document.createElement('div');
            previewDiv.insertBefore(contentdiv, previewDiv.firstChild);
            contentdiv.innerHTML = thisDiv.innerHTML;
            var closespan = document.createElement('span');
            closespan.style.float = "right";
            TD1.insertBefore(closespan, TD1.firstChild);
            var downlink = document.createElement('a');
            downlink.title = PortalEval.texts.PreviewDown;
            downlink.innerHTML = '<img width="16"  height="16" src="'+PortalEval.params.ImageURL + PortalEval.params.DownIcon+'" />';
            downlink.href = "javascript:;";
            downlink.onclick = function(){ PortalEval.functions.updownPreview(PortalEval.params.PreviewHeightStep, previewDiv); return false; }
            var uplink = document.createElement('a');
            uplink.title = PortalEval.texts.PreviewUp;
            uplink.innerHTML = '<img width="16"  height="16" src="'+PortalEval.params.ImageURL + PortalEval.params.UpIcon+'" />';
            uplink.href = "javascript:;";
            uplink.onclick = function(){ PortalEval.functions.updownPreview(-PortalEval.params.PreviewHeightStep, previewDiv); return false; }
            closespan.appendChild(downlink);
            closespan.appendChild(uplink);
            closespan.appendChild(document.createTextNode(" "));
            var closelink = document.createElement('a');
            closelink.title = PortalEval.texts.PreviewClose;
            closelink.innerHTML = '<img width="16"  height="16" src="'+PortalEval.params.ImageURL + PortalEval.params.CloseIcon+'" />';
            closelink.href = "javascript:;";
            closelink.onclick = function(){ PortalEval.functions.closePreview(index, closespan); return false; }
            closespan.appendChild(closelink);
          }else if(thisDiv.id && thisDiv.id === "catlinks"){
            previewDiv.appendChild(thisDiv);          
          }
        }
        TEMP.parentNode.removeChild(TEMP);
        PortalEval.functions.enhancePreview(previewDiv);
      }});
    },
    enhancePreview : function(previewDiv){ // See MediaWiki:Commons.js
      try{ Palette(previewDiv); }catch(e){}
      try{ BoiteDeroulante(previewDiv); }catch(e){}
      try{ GeoBox_Init(previewDiv); }catch(e){}
    },
    updownPreview(val, previewDiv){
      var oldval = parseInt(previewDiv.style.maxHeight.split("px").join(""));
      previewDiv.style.maxHeight = (oldval+val) + "px";
    },
    closePreview : function(index, link){
      var previewDiv = document.getElementById("previewDiv_"+index);
      if(previewDiv) previewDiv.parentNode.removeChild(previewDiv);
      link.parentNode.removeChild(link);
    },
    addlink : function() {
      if(mw.config.get("wgNamespaceNumber") != 14) return;
      var portlet = document.getElementById(PortalEval.params.LinkPortletID);
      if(!portlet)return;
      var tabs = portlet.getElementsByTagName('ul')[0];
      var newli = document.createElement('li');
      tabs.appendChild(newli);
      var link = document.createElement("a");
      link.innerHTML = PortalEval.texts.LinkText;
      link.title = PortalEval.texts.LinkTitle;
      link.href = "javascript:PortalEval.functions.createBoard();";
      newli.appendChild(link);
    }
  }
}

if( mw.config.get('wgServer') == '//fr.wikipedia.org' && mw.config.get('wgNamespaceNumber')==14 && ["edit","submit"].indexOf(mw.config.get('wgAction')) === -1 ){
    mw.loader.using(['mediawiki.util', 'mediawiki.api'], function(){ 
      if(typeof(PortalEval_LangCustom) == "function") PortalEval_LangCustom();
      if(typeof(PortalEval_SiteCustom) == "function") PortalEval_SiteCustom();
      if(typeof(PortalEval_UserCustom) == "function") PortalEval_UserCustom();
      $(PortalEval.functions.addlink); 
    });
}

//</source>