User:OldBee/MassEval.js

From Meta, a Wikimedia project coordination wiki
This is an archived version of this page, as edited by OldBee (talk | contribs) at 20:47, 9 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)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
//<source lang=javascript>

// Documentation : [[m:User:OldBee/PortalEval.js/doc]]

window.PortalEval = {
// ############################### PARTIE PERSONNALISABLE ###############################
// ------------------------------- Textes -------------------------------
  texts : {
    "LinkText"            : "Évaluer",
    "LinkTitle"           : "Évaluer les articles de cette catégorie",
    "SpecialpageText"     : "(S)",
    "SpecialpageTip"      : "Page spéciale : Évaluation par catégorie",
    "Cat"                 : "Catégorie",
    "Portal"              : "Thème d’évaluation",
    "Sort"                : "Options de tri",
    "Actions"             : "Actions",
    "EvalResume"          : "[[$docpage|Mise à jour de l’évaluation]] : $template",
    "StubResume"          : "[[$docpage|Mise à jour du bandeau d’ébauche]] : $template",
    "SaveParamsResume"    : "[[$docpage|Sauvegarde des paramètres]]",
    "GoListText"          : "Vérifier l’évaluation",
    "GoListTitle"         : "Vérifier l’évaluation des pages de cette catégorie",
    "SubCatTitle"         : "Inclure les sous-catégories",
    "GoSortText"          : "Trier",
    "GoSortTitle"         : "Trier les pages de la liste",
    "SortTitle"           : "Pages",
    "SortTitleTip"        : "Tri selon le titre de la page",
    "SortDS"              : "Defaultsort",
    "SortDSTip"           : "Tri selon la clé de tri",
    "SortStub"            : "Ébauches",
    "SortStubTip"         : "Tri selon le nombre de thèmes d’ébauche",
    "SortAVT"             : "Avancement",
    "SortAVTTip"          : "Tri selon l’avancement",
    "SortIMP"             : "Importance",
    "SortIMPTip"          : "Tri selon l’importance dans le thème sélectionné",
    "SortUPTip"           : "$1 (tri croissant)",
    "SortDOWNTip"         : "$1 (tri décroissant)",
    "SortUPArrow"         : "$1 (↑)",
    "SortDOWNArrow"       : "$1 (↓)",
    "GoChangeText"        : "Valider",
    "GoChangeTitle"       : "Valider les $1changements d’évaluation des pages de cette catégorie",
    "GoCancelText"        : "Annuler",
    "GoCancelTitle"       : "Annuler les $1changements d’évaluation des pages de cette catégorie",
    "GoOptionsText"       : "Options",
    "GoOptionsTitle"      : "Modifier les options",
    "GoCloseTitle"        : "Fermer",
    "TH0text"             : "Page", 
    "TH1text"             : "Bandeau d’ébauche", 
    "TH2text"             : "Avancement", 
    "TH3text"             : "Importances", 
    "TH4text"             : "Actions",
    "TalkText"            : "D",
    "PreviewText"         : "$1 (preview)",
    "RedirectText"        : "Page redirigée vers la page : $page",
    "DisambigTitle"       : "Homonymie",
    "PreviewDown"         : "Agrandir la prévisualisation",
    "PreviewUp"           : "Rétrécir la prévisualisation",
    "PreviewClose"        : "Fermer la prévisualisation",
    "DeleteSTUBText"      : "(-)",
    "DeleteSTUBTitle"     : "Supprimer ce bandeau d’ébauche",
    "AddSTUBText"         : "(+)",
    "AddSTUBTitle"        : "Ajouter un bandeau d’ébauche",
    "DeleteIMPText"       : "(-)",
    "DeleteIMPTitle"      : "Supprimer cette évaluation d’importance",
    "AddIMPText"          : "(+)",
    "AddIMPTitle"         : "Ajouter une évaluation d’importance",
    "GoChangeOneText"     : "Valider",
    "GoChangeOneTitle"    : "Valider les changements d’évaluation de cette page",
    "GoCancelOneText"     : "Annuler",
    "GoCancelOneTitle"    : "Annuler les changements d’évaluation de cette page",
    "NoEdition"           : "L’édition via ce script a été désactivée.\n"
                          + "Voici le texte qui aurait dû être pris en compte :\n"
                          + "----------AVANT----------\n"
                          + "$1\n"
                          + "----------APRÈS----------\n"
                          + "$2\n"
                          + "-------------------------\n",
    "Warning"             : "Ce script en cours de maintenance. Son fonctionnement n’est pas assuré !",
    "AlertMsgThemes"      : "Listage des thèmes d’ébauche et d’évaluation",
    "AlertMsgPages"       : "Listage des pages ($count) : $cat",
    "AlertMsgParams"      : "Recherche des paramètres d’ébauche et d’évaluation ($count) : $page",
    "AlertMsgSort"        : "Tri des lignes",
    "AlertMsgSaveParams"  : "Sauvegarde des options personnalisées sur la page $page",
    "AlertMsgPreview"     : "$running Chargement de la prévisualisation",
    "OptionValidate"      : "Valider les changements",
    "OptionValidateTip"   : "Valider les changements d’options",
    "DefButtonText"       : "(D)",
    "DefButtonTitle"      : "Rétablir l’option par défaut : $1",
    "OptionModified"      : "Paramètre différent du paramètre par défaut",
    "SpecialpageName"     : "Évaluation par catégorie",
    "SpecialpageNameH"    : "$1 — Wikipédia",
    "CatDaughters"        : "Catégorie filles",
    "CatParents"          : "Catégorie parentes",
    "HiddenCat"           : "Catégorie cachée",
    "CatExistsNo"         : "La catégorie <b>$cat</b> n’existe pas.",
    "CatExistsYes"        : "La catégorie <b>$cat</b> comprend :",
    "CatPages"            : "$1 page(s)",
    "CatCats"             : "$1 catégorie(s)",


    "OPTIONparams"        : "Paramètres",
    "OPTIONtexts"         : "Textes",
    "OPTIONmoreparams"    : "Paramétrage manuel supplémentaire",
   // -------------------- Textes de description des textes et paramètres --------------------
     // -------------------- Descriptions des paramètres --------------------
    "OPTIONAddWarning"          : "Afficher un avertissement en haut de page",
    "OPTIONAutoLaunchList"      : "Lancer automatiquement le listage des page après l’apparition du tableau",
    "OPTIONAutoLaunchPreview"   : "Lancer automatiquement la prévisualisation des pages à la création de la ligne du tableau",
    "OPTIONPreloadPreview"      : "Précharger la prévisualisation des pages",
    "OPTIONAllowEdition"        : "Permettre l’édition",
    "OPTIONTH1width"            : "Largeur en pixels de la colonne \"Bandeau d’ébauche\"",
    "OPTIONTH2width"            : "Largeur en pixels de la colonne \"Avancement\"",
    "OPTIONTH3width"            : "Largeur en pixels de la colonne \"Importances\"",
    "OPTIONTH4width"            : "Largeur en pixels de la colonne \"Actions\"",
    "OPTIONOptionsHeight"       : "Hauteur en pixels de la fenêtre des options",
    "OPTIONPreviewHeight"       : "Hauteur en pixels de la fenêtre de prévisualisation",
    "OPTIONPreviewHeightStep"   : "Nombre de pixels ajoutés ou retirés de la fenêtre de prévisualisation lors de son agrandissement/rétrécissement",
    "OPTIONCatInputWidth"       : "Largeur en pixels du champ de texte \"Catégorie\"",
    "OPTIONMainEvalThemeWidth"  : "Largeur en pixels de la liste des thèmes d’évaluation (options principales)",
    "OPTIONEvalThemeWidth"      : "Largeur en pixels de la liste des thèmes d’évaluation (colonne \"Importances\")",
    "OPTIONStubThemeWidth"      : "Largeur en pixels de la liste des thèmes d’ébauche",
    "OPTIONOptionUlColumnWidth" : "Largeur en pixels d’une colonne dans les options",
    "OPTIONOptionStringWidth"   : "Largeur en pixels des champs de texte dans les options (texte demandé)",
    "OPTIONOptionNumberWidth"   : "Largeur en pixels des champs de texte dans les options (nombre demandé)",
    "OPTIONMoreParamsRows"      : "Nombre de ligne du champ de texte pour le paramétrage manuel supplémentaire",
    "OPTIONDefaultPortal"       : "Thème d’évaluation sélectionné par défaut",
    "OPTIONDefaultSort"         : "Tri de pages par défaut",
    "OPTIONLinkPortletID"       : "Attribut id de l’élément où est ajouté le lien \"Évaluer\"",
    "OPTIONDocPage"             : "Titre de la page de documentation",
    "OPTIONDocURL"              : "URL de la page de documentation",
    "OPTIONImageURL"            : "URL de base pour les images",
    "OPTIONRunningIcon"         : "Image de l’icône \"En cours\"",
    "OPTIONOKIcon"              : "Image de l’icône \"OK\"",
    "OPTIONCloseIcon"           : "Image de l’icône \"Fermer\"",
    "OPTIONDownIcon"            : "Image de l’icône \"Agrandir\"",
    "OPTIONUpIcon"              : "Image de l’icône \"Rétrécir\"",
    "OPTIONRedirectIcon"        : "Image de l’icône \"Redirection\"",
    "OPTIONDisambigIcon"        : "Image de l’icône \"Homonymie\"",
     // -------------------- Descriptions des textes --------------------
    "OPTIONLinkText"            : "Intitulé du lien \"Évaluer\"",
    "OPTIONLinkTitle"           : "Infobulle du lien \"Évaluer\"",
    "OPTIONSpecialpageText"     : "Intitulé du lien vers la page spéciale",
    "OPTIONSpecialpageTip"      : "Infobulle du lien vers la page spéciale",
    "OPTIONCat"                 : "Label de la catégorie sélectionnée",
    "OPTIONPortal"              : "Label de la liste des thèmes d’évaluation",
    "OPTIONSort"                : "Label des options de tri",
    "OPTIONActions"             : "Label des boutons d’action",
    "OPTIONEvalResume"          : "Résumé de modification lors de la mise à jour de l’évaluation",
    "OPTIONStubResume"          : "Résumé de modification lors de la mise à jour du bandeau d’ébauche",
    "OPTIONSaveParamsResume"    : "Résumé de modification lors de la sauvegarde des paramètres]]",
    "OPTIONGoListText"          : "Intitulé du bouton \"Vérifier l’évaluation\"",
    "OPTIONGoListTitle"         : "Infobulle du bouton \"Vérifier l’évaluation\"",
    "OPTIONSubCatTitle"         : "Infobulle de la case pour inclure ou non les sous-catégories",
    "OPTIONGoSortText"          : "Intitulé du bouton \"Trier\"",
    "OPTIONGoSortTitle"         : "Intitulé du bouton \"Trier\"",
    "OPTIONSortTitle"           : "Intitulé de l’option de tri \"Pages\"",
    "OPTIONSortTitleTip"        : "Infobulle de l’option de tri \"Pages\"",
    "OPTIONSortDS"              : "Infobulle de l’option de tri \"Defaultsort\"",
    "OPTIONSortDSTip"           : "Infobulle de l’option de tri \"Defaultsort\"",
    "OPTIONSortStub"            : "Intitulé de l’option de tri \"Ébauches\"",
    "OPTIONSortStubTip"         : "Infobulle de l’option de tri \"Ébauches\"",
    "OPTIONSortAVT"             : "Intitulé de l’option de tri \"Avancement\"",
    "OPTIONSortAVTTip"          : "Infobulle de l’option de tri \"Avancement\"",
    "OPTIONSortIMP"             : "Intitulé de l’option de tri \"Importance\"",
    "OPTIONSortIMPTip"          : "Infobulle de l’option de tri \"Importance\"",
    "OPTIONSortUPTip"           : "Modèle pour l’infobulle des options de tri (tri croissant)",
    "OPTIONSortDOWNTip"         : "Modèle pour l’infobulle des options de tri (tri décroissant)",
    "OPTIONSortUPArrow"         : "Modèle pour le texte des options de tri (tri croissant)",
    "OPTIONSortDOWNArrow"       : "Modèle pour le texte des options de tri (tri décroissant)",
    "OPTIONGoChangeText"        : "Intitulé du bouton \"Valider\" (options principales)",
    "OPTIONGoChangeTitle"       : "Infobulle du bouton \"Valider\" (options principales)",
    "OPTIONGoCancelText"        : "Intitulé du bouton \"Annuler\" (options principales)",
    "OPTIONGoCancelTitle"       : "Infobulle du bouton \"Annuler\" (options principales)",
    "OPTIONGoOptionsText"       : "Intitulé du bouton \"Options\"",
    "OPTIONGoOptionsTitle"      : "Infobulle du bouton \"Options\"",
    "OPTIONGoCloseTitle"        : "Infobulle du bouton pour fermer le tableau",
    "OPTIONTH0text"             : "Intitulé de la colonne \"Page\"", 
    "OPTIONTH1text"             : "Intitulé de la colonne \"Bandeau d’ébauche\"", 
    "OPTIONTH2text"             : "Intitulé de la colonne \"Avancement\"", 
    "OPTIONTH3text"             : "Intitulé de la colonne \"Importances\"", 
    "OPTIONTH4text"             : "Intitulé de la colonne \"Actions\"",
    "OPTIONTalkText"            : "Intitulé des liens vers les pages de discussion",
    "OPTIONPreviewText"         : "Modèle d’infobulle du bouton pour les liens de pages",
    "OPTIONRedirectText"        : "Infobulle de l’icône \"Redirection\"",
    "OPTIONDisambigTitle"       : "Infobulle de l’icône \"Homonymie\"",
    "OPTIONPreviewDown"         : "Infobulle du bouton pour agrandir la prévisualisation",
    "OPTIONPreviewUp"           : "Infobulle du bouton pour rétrécir la prévisualisation",
    "OPTIONPreviewClose"        : "Infobulle du bouton pour fermer la prévisualisation",
    "OPTIONDeleteSTUBText"      : "Intitulé du bouton pour supprimer un bandeau d’ébauche",
    "OPTIONDeleteSTUBTitle"     : "Infobulle du bouton pour supprimer un bandeau d’ébauche",
    "OPTIONAddSTUBText"         : "Intitulé du bouton pour ajouter un bandeau d’ébauche",
    "OPTIONAddSTUBTitle"        : "Infobulle du bouton pour ajouter un bandeau d’ébauche",
    "OPTIONDeleteIMPText"       : "Intitulé du bouton pour supprimer une évaluation d’importance",
    "OPTIONDeleteIMPTitle"      : "Infobulle du bouton pour supprimer une évaluation d’importance",
    "OPTIONAddIMPText"          : "Intitulé du bouton pour ajouter une évaluation d’importance",
    "OPTIONAddIMPTitle"         : "Infobulle du bouton pour ajouter une évaluation d’importance",
    "OPTIONGoChangeOneText"     : "Intitulé du bouton \"Valider\" (ligne)",
    "OPTIONGoChangeOneTitle"    : "Infobulle du bouton \"Valider\" (ligne)",
    "OPTIONGoCancelOneText"     : "Intitulé du bouton \"Annuler\" (ligne)",
    "OPTIONGoCancelOneTitle"    : "Infobulle du bouton \"Annuler\" (ligne)",
    "OPTIONNoEdition"           : "Message par défaut lorsque l’édition n’est pas permise",
    "OPTIONWarning"             : "Message d’avertissement",
    "OPTIONAlertMsgThemes"      : "Message lors du listage des thèmes d’ébauche et d’évaluation",
    "OPTIONAlertMsgPages"       : "Message lors du listage des pages",
    "OPTIONAlertMsgParams"      : "Message lors de la recherche des paramètres d’ébauche et d’évaluation d’une page",
    "OPTIONAlertMsgSort"        : "Message lors du tri des lignes",
    "OPTIONAlertMsgSaveParams"  : "Message lors de la sauvegarde des options personnalisées",
    "OPTIONAlertMsgPreview"     : "Message lors du chargement de la prévisualisation d’une page",
    "OPTIONOptionValidate"      : "Intitulé du bouton \"Valider les changements\"",
    "OPTIONOptionValidateTip"   : "Infobulle du bouton \"Valider les changements\"",
    "OPTIONDefButtonText"       : "Intitulé du bouton pour rétablir une option par défaut",
    "OPTIONDefButtonTitle"      : "Infobulle du bouton pour rétablir une option par défaut",
    "OPTIONOptionModified"      : "Infobulle expliquant d’un paramètre est différent du paramètre par défaut",
    "OPTIONSpecialpageName"     : "Titre de la page spéciale",
    "OPTIONSpecialpageNameH"    : "Modèle du titre de l’onglet du navigateur",
    "OPTIONOPTIONparams"        : "Intitulé du bouton \"Paramètres\"",
    "OPTIONOPTIONtexts"         : "Intitulé du bouton \"Textes\"",
    "OPTIONOPTIONmoreparams"    : "Intitulé du bouton \"Paramétrage manuel supplémentaire\"",
  },
  params : {
// ------------------------------- Paramètres modifiables -------------------------------
    "AllowEdition"        : true,
    "AutoLaunchList"      : false,
    "AutoLaunchPreview"   : false,
    "PreloadPreview"      : false,
    "AddWarning"          : false,
    "TH1width"            : 200,     
    "TH2width"            : 150,      
    "TH3width"            : 300,       
    "TH4width"            : 100,
    "OptionsHeight"       : 400,
    "PreviewHeight"       : 250,
    "PreviewHeightStep"   : 50,
    "CatInputWidth"       : 200,
    "MainEvalThemeWidth"  : 200,
    "EvalThemeWidth"      : 150,
    "StubThemeWidth"      : 100,
    "OptionUlColumnWidth" : 705,
    "OptionStringWidth"   : 400,
    "OptionNumberWidth"   : 50,
    "MoreParamsRows"      : 20,
    "CategorySelectSize"  : 4,
    "CategorySuggestions" : 12,
    "DefaultPortal"       : "",
    "DefaultSort"         : "SortDS_UP",
    "LinkPortletID"       : "p-cactions",
    "DocPage"             : "m:User:OldBee/PortalEval.js/doc",
    "DocURL"              : "https://meta.wikimedia.org/wiki/User:OldBee/PortalEval.js/doc",
    "ImageURL"            : "//upload.wikimedia.org/wikipedia/commons/",
    "RunningIcon"         : "2/2a/Loading_Key.gif",
    "OKIcon"              : "thumb/f/fb/Yes_check.svg/24px-Yes_check.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",
    "RedirectIcon"        : "thumb/7/71/Symbol_redirect_arrow_with_gradient.svg/12px-Symbol_redirect_arrow_with_gradient.svg.png",
    "DisambigIcon"        : "thumb/c/c3/Disambiguation.svg/12px-Disambiguation.svg.png",

// ############################### PARTIE NON PERSONNALISABLE ###############################
// ------------------------------- Paramètres non modifiables -------------------------------
    "EditableParams" : [
      "AllowEdition",
      "AutoLaunchList",
      "AutoLaunchPreview",
      "PreloadPreview",
      "AddWarning",
      "TH1width",     
      "TH2width",      
      "TH3width",       
      "TH4width",
      "OptionsHeight",
      "PreviewHeight",
      "PreviewHeightStep",
      "CatInputWidth",
      "MainEvalThemeWidth",
      "EvalThemeWidth",
      "StubThemeWidth",
      "OptionUlColumnWidth",
      "OptionStringWidth",
      "OptionNumberWidth",
      "MoreParamsRows",
      "CategorySelectSize",
      "CategorySuggestions",
      "DefaultPortal",
      "DefaultSort",
      "LinkPortletID",
      "DocPage",
      "DocURL",
      "ImageURL",
      "RunningIcon",
      "OKIcon",
      "CloseIcon",
      "DownIcon",
      "UpIcon",
      "RedirectIcon",
      "DisambigIcon",
    ],
    "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" }      
    ],
    "EvalTemplate"            : "Wikiprojet",
    "EvalCategory"            : "Wikiprojet",
    "EvalCatPrefixes"         : ["Wikiprojet ", "Wikiprojet:"],
    "EvalThemes"              : [],
    "FakeEvalThemes"          : ["Statistique"],
    "ManuEvalThemes"          : ["GNU/Linux"],
    "EvalThemesOK"            : false,
    "StubTemplate"            : "Ébauche",
    "StubThemesPage"          : "Module:Bandeau/Ébauche",
    "StubThemes"              : [],
    "FakeStubThemes"          : ["thème", /* "et", */ "exemple doc"],
    "StubAdj"                 : [],
    "StubAdjM"                : [],
    "StubAdjF"                : [],
    "StubThemesOK"            : false,
    "OptionsSubPage"          : "PortalEvalparams",
    "OptionsSubPageOK"        : false,
    "OptionsMoreParams"       : "",
    "OptionsPageTemplate"     : "window.PortalEval_UserCustom = function(){\n$1\n}\n",
    "OptionsPageCommentStart" : "/* Paramètrage supplémentaire du script PortalEval. */ try{  /* NE PAS MODIFIER CETTE LIGNE  */\n",
    "OptionsPageCommentEnd"   : "\n/* Paramètrage supplémentaire du script PortalEval. */ }catch(e){ console.error(e.message); }  /* NE PAS MODIFIER CETTE LIGNE  */",
    "PageList"                : [],
    "SubCatList"              : [],
    "StubEditsRunning"        : [],
    "EvalEditsRunning"        : [],
    "PreviewSaved"            : {},
    "APILimit"                : ((mw.config.get("wgUserGroups").indexOf("bot")!==-1 || mw.config.get("wgUserGroups").indexOf("syspo")!==-1) ? 4999 : 499),
    "ContenIDs"               : ["globalWrapper","mw-wrapper","mw-page-base","mw-head-base","content","mw-navigation","footer","mw_header","mw_main","p-personal","mw-mf-viewport"],
    "DivIDsToPreview"         : ["contentSub", "mw-content-text", "catlinks"],
    "Accents"                 : {
                                  "A"  : ["À","Â","Ä","Á"],
                                  "C"  : ["Ç"],
                                  "E"  : ["É","È","Ê","Ë"],
                                  "I"  : ["Î","Ï","Í"],
                                  "O"  : ["Ô","Ö","Ó"],
                                  "U"  : ["Ù","Û","Ü","Ú"],
                                  "Y"  : ["ÿ","Ÿ"],
                                  "Ae" : ["Æ"],
                                  "Oe" : ["Œ"],
                                },
    "SortOptions"             : ["SortDS","SortTitle","SortStub","SortAVT","SortIMP"],
    "OptionSelectWidthPlus"   : {"monobook":6,"vector":6,"modern":6,"cologneblue":6},
  },
//</source><source lang=javascript>
// ------------------------------- Fonctions -------------------------------
  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);
    },
    deleteAccents : function(text){
      for(var letter in PortalEval.params.Accents){
        var letters = PortalEval.params.Accents[letter];
        for(var a=0,l=letters.length;a<l;a++){
          var thisaccent = letters[a];
          text = text.split(thisaccent).join(letter);
          text = text.split(thisaccent.toLowerCase()).join(letter.toLowerCase());
        }        
      }
      return text;
    },
    disableThings : function(IDs, dis){
      DIS = (dis ? "disabled" : false);
      var tags = ["button","input","select","textarea"];
      for(var a=0,l=IDs.length;a<l;a++){
        var thisID = IDs[a];
        var N = null;
        if(typeof(thisID)==="string") N = document.getElementById(thisID);
        else N = thisID;
        try{
          if(N.tagName && tags.indexOf(N.tagName.toLowerCase())!== -1) N.disabled = DIS;
        }catch(e){
          console.warn("PortalEval.functions.disableThings()\n\n"+e.message);
        }
      }
    },
    displayNodesById : function(IDs, display){
      if(typeof(IDs)!=="object" && !IDs.length) return;
      display = (display ? "" : "none");
      for(var a=0,l=IDs.length;a<l;a++){
        var thisNode = document.getElementById(IDs[a]);
        if(thisNode) thisNode.style.display = display;
      }
    },
    getFirstElementByName : function(node, tags, name){
      for(var a=0,l=tags.length;a<l;a++){
        var els = node.getElementsByTagName(tags[a]);
        for(var n=0,nlen=els.length;n<nlen;n++){
          var N = els[n];
          if(N.name && (N.name == name || name=="*")) return N;
        }
      }
      return null;
    },
    createLink : function(page, options){
      var link = document.createElement("a");
      link.href = (options && options.href ? options.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;
    },
    createInput : function(datas){
      if(datas.type == 'textarea'){
        var Input = document.createElement('textarea');
      }else{
        var Input = document.createElement('input');
        Input.type = datas.type || 'text';
      }
      if(datas.name) Input.name = datas.name;
      if(datas.value) Input.value = datas.value;
      if(datas.title) Input.title = datas.title;
      return Input;
    },
    getNamespaceInfoFromPage : function(Page, ToReturn){
      if(!ToReturn || !Page) ToReturn = false;
      var NamespaceNumber = 0;
      var NamespaceName = "";
      var PageName = Page;
      var Found = false;
      var AllNS = mw.config.get("wgFormattedNamespaces");
      for(var NS in AllNS ){
        if(Found) continue;
        var ThisNamespaceName = AllNS[NS];
        if(ThisNamespaceName==="") continue;
        var Matches = Page.match(new RegExp("^"+ThisNamespaceName+":", "ig"));
        if(Matches!=null && Matches.length == 1){
          NamespaceNumber = parseInt(NS);
          NamespaceName = ThisNamespaceName;
          PageName = Page.replace(Matches[0], "");
          Found = true;
        }
      }
      if(ToReturn==="NamespaceName") return NamespaceName;
      if(ToReturn==="PageName") return PageName;
      return NamespaceNumber;
    },
    getTalkPage : function(page){
      return mw.config.get("wgFormattedNamespaces")[(PortalEval.functions.getNamespaceInfoFromPage(page)+1)]+":"+page;
    },
    getMainPage : function(page){
      var NS = PortalEval.functions.getNamespaceInfoFromPage(page);
      if(NS % 2 == 0) return page;
      return (NS==1 ? "" : mw.config.get("wgFormattedNamespaces")[(NS-1)]+":")+PortalEval.functions.getNamespaceInfoFromPage(page, "PageName");
    },
    getPages : function(catindex, portal, queryopt){
      var CheckBox = document.getElementById("PortalEval_SubCats");
      var subcat = ((CheckBox && CheckBox.checked) ? "|subcat" : "");
      if(catindex === -1){
        PortalEval.params.PreviewSaved = {};
        catindex = 0;
        PortalEval.params.PageList = [];
        PortalEval.params.SubCatList = [];
        var FirstCat = document.getElementById("PortalEval_Cat").value;
        PortalEval.params.SubCatList.push( (mw.config.get("wgFormattedNamespaces")[14]+":"+FirstCat) );
      }
      if(!queryopt){
        var cat = PortalEval.params.SubCatList[catindex];
        if(!cat) return PortalEval.functions.getPageEval(portal);
        var count = (catindex+1)+"/"+PortalEval.params.SubCatList.length;
        PortalEval.functions.alertControl(PortalEval.texts.AlertMsgPages.split("$count").join(count).split("$cat").join(cat), true);
        queryopt = {action:'query',list:'categorymembers',
          cmlimit : PortalEval.params.APILimit,
          cmprop  : 'title',
          cmtitle : cat,
          cmtype  : 'page'+subcat
        };
      }
      PortalEval.functions.disableThings([ "PortalEval_Cat", "PortalEval_OptionPortal", "PortalEval_OptionPortalInput", "PortalEval_SubCats","PortalEval_SortButton" ], true);
      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;
            var ns = page.ns;
            if(ns=="14"){
              if(PortalEval.params.SubCatList.indexOf(title)===-1) PortalEval.params.SubCatList.push(title);
            }else{
              title = PortalEval.functions.getMainPage(title);
              PortalEval.params.PageList.push({ 
                "title"       : title,
                "talktitle"   : PortalEval.functions.getTalkPage(title)
              });

            }
          }
        }
        if(data.continue && data.continue.cmcontinue){
          queryopt.cmcontinue = data.continue.cmcontinue;
          PortalEval.functions.getPages(catindex, portal, queryopt);
        }else{
          PortalEval.functions.getPages((catindex+1), portal);
        }
      });
    },
    getAllPagesInfos : function(info){
      var pageinfos = [];
      var pagedatas = PortalEval.params.PageList;
      for(var a=0,l=pagedatas.length;a<l;a++){
        pageinfos.push(pagedatas[a][info]);
      }
      return pageinfos;
    },
    getPageEval : function(portal, index){
      if(!index) index = 0;
      var page = PortalEval.params.PageList[index];
      if(!page){
        PortalEval.functions.alertControl();
        var sortValue = document.getElementById("PortalEval_OptionSort").value;
        if(sortValue !== "SortDS_UP") PortalEval.functions.sortPages(sortValue, portal);
        PortalEval.functions.disableThings(["PortalEval_SortButton","PortalEval_OptionPortal","PortalEval_OptionPortalInput","PortalEval_SubCats"], false);
        PortalEval.functions.disableThings(["PortalEval_Cat"], (PortalEval.functions.getLaunchCondition() != 2));
        return;
      }
      if(PortalEval.params.PreloadPreview){
        PortalEval.functions.preloadPage(page.title, index);
        PortalEval.functions.preloadPage(page.talktitle, index);
      }
      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','info'],
            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){
          var hasEval = false;
          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;
                  hasEval = true;
                }
              }else{
                if(id == -1) PortalEval.params.PageList[index]["talkmissing"] = 1;
              }
            }
          }
          if(hasEval){
            var URL = mw.config.get('wgServer')+mw.config.get('wgScript')+ "?title="+encodeURIComponent(talktitle)+"&action=raw&section=0";
            $.ajax({url:URL, complete: function(Req){
              PortalEval.functions.getEvalParams(Req.responseText, index, portal);
              var add = PortalEval.functions.fillBoardLine(index, portal);
              if(add) PortalEval.functions.getPageEval(portal, (index+1));
            }});
          }else{
            var add = PortalEval.functions.fillBoardLine(index, portal);
            if(add) PortalEval.functions.getPageEval(portal, (index+1));
          }
        });
      });
    },
    getPageStub : function(portal, index, callback){
      var page = PortalEval.params.PageList[index];
      var title = page.title;
      var count = (index+1)+"/"+PortalEval.params.PageList.length;
      PortalEval.functions.alertControl(PortalEval.texts.AlertMsgParams.split("$count").join(count).split("$page").join(title), true);
      var queryopt = {action:'query',prop:['templates','info','links','pageprops'],
            pllimit     : 1,
            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){
        var hasStub = false;
        if(data.query.pages){
          for(var id in data.query.pages){
            var datas = data.query.pages[id];
            var isRedirect = datas.redirect === "";
            if(isRedirect){
              var links = datas.links;
              if(links){
                for(var a=0,l=links.length;a<l;a++){
                  var realtitle = links[a].title;
                  var alltitles = PortalEval.functions.getAllPagesInfos("title");
                  if(alltitles.indexOf(realtitle)!=-1) return PortalEval.functions.getPageEval(portal, (index+1));
                  var realtalktitle = PortalEval.functions.getTalkPage(realtitle);
                  PortalEval.params.PageList[index].redirectfrom = title;
                  PortalEval.params.PageList[index].title = realtitle;
                  PortalEval.params.PageList[index].talktitle = realtalktitle;
                  return PortalEval.functions.getPageEval(portal, index);
                }
              }
            }
            var templates = datas.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;
                hasStub = true;
              }
            }
            var pageprops = datas.pageprops;
            if(pageprops && pageprops.disambiguation === "") PortalEval.params.PageList[index].disambig = true;
          }
        }
        if(hasStub){
          var URL = mw.config.get('wgServer')+mw.config.get('wgScript')+ "?title="+encodeURIComponent(title)+"&action=raw&section=0";
          $.ajax({url:URL, complete: function(Req){
            PortalEval.functions.getStubParams(Req.responseText, index, portal);
            if(typeof(callback) == "function") callback(portal, index);
          }});
        }else{
          if(typeof(callback) == "function") callback(portal, index);
        }
      });
    },
    getStubParams : function(WT, index, portal){
      var Reg = new RegExp("\\{\\{ *"+PortalEval.params.StubTemplate+"[^\\{]*\\}\\}", "ig");
      var matches = WT.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("|");
          for(var av=0,avlen=thismatch.length;av<avlen;av++){
            var thisparam = thismatch[av];
            thisparam = thisparam.replace(/^[ ]*/g, "");
            thisparam = thisparam.replace(/[ ]*$/g, "");
            if(thisparam.indexOf(PortalEval.functions.ucFirst(PortalEval.params.StubTemplate)) != -1) continue;
            if(thisparam.indexOf(PortalEval.functions.lcFirst(PortalEval.params.StubTemplate)) != -1) continue;
            if(thisparam.indexOf("=") == -1){
              var stubtheme = PortalEval.functions.ucFirst(thisparam);
              if(!PortalEval.params.PageList[index]["stub"]) PortalEval.params.PageList[index]["stub"] = [];
              if(PortalEval.params.PageList[index]["stub"].indexOf(stubtheme)==-1) PortalEval.params.PageList[index]["stub"].push(stubtheme);
              if(typeof(PortalEval.params.StubThemes[stubtheme]) == "undefined"){
                var adjDatas = PortalEval.functions.getAdjDatas(stubtheme);
                if(adjDatas.type === null){
                  PortalEval.params.StubThemes[stubtheme] = { };
                }
              }
            }
          }
        }
      }
      PortalEval.params.PageList[index].stubWT = Wikitext;
    },
    getEvalParams : function(WT, index, portal){
      var Reg = new RegExp("\\{\\{ *"+PortalEval.params.EvalTemplate+"[^\\{]*\\}\\}", "ig");
      var matches = WT.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;
    },
    getStubThemes : function(){
      if(Object.keys(PortalEval.params.StubThemes).length>0) return PortalEval.functions.checkThemes();
      var stubthemepage = PortalEval.params.StubThemesPage;
      PortalEval.functions.alertControl();
      PortalEval.functions.alertControl(PortalEval.texts.AlertMsgThemes, true);
      var URL = mw.config.get('wgServer')+mw.config.get('wgScript')+"?title="+encodeURIComponent(stubthemepage)+"&action=raw";
      $.ajax({url:URL, complete: function(Req){
        var Wikitext = Req.responseText;
        var commStart = "[==[";
        var commEnd = "]==]";
        var SplitedWikitext = Wikitext.split(commStart);
        var TempWikitext = "";
        for(var a=0,l=SplitedWikitext.length;a<l;a++){
          var ThisSplit = SplitedWikitext[a];
          if(ThisSplit.indexOf(commEnd)!==-1) TempWikitext += ThisSplit.split(commEnd)[1];
          else TempWikitext += ThisSplit;
        }
        Wikitext = [];
        TempWikitext = TempWikitext.split("\n");
        for(var a=0,l=TempWikitext.length;a<l;a++){
          Wikitext.push(TempWikitext[a].replace(/--[^"]*/g, ""));
        }
        Wikitext = Wikitext.join("\n");
        var cleaned = function(txt){
          txt = txt.replace(/= *"/g, ': "');
          txt = txt.replace(/selon =/g, 'selon :');
          txt = txt.replace(/ selonCommune/g, ' "selonCommune"');
          txt = txt.replace(/estFeminin =/g, 'estFeminin :');
          return txt;
        }
        var p = {};
        var RegP1 = /p\["[^\}]*\}/g
        var P1 = Wikitext.match(RegP1);
        if(P1 !== null){
          for(var a=0,l=P1.length;a<l;a++){
            var ThisP1 = P1[a];
            Wikitext = Wikitext.replace(ThisP1, "");
            ThisP1 = cleaned(ThisP1);
            try{ eval(ThisP1); }catch(e){ console.warn("P1["+a+"] FAILED :\n"+e.message+"\n----------\n"+ThisP1+"\n----------"); };
          }
        }
        var FakeStubThemes =  PortalEval.params.FakeStubThemes;
        for(var a=0,l=FakeStubThemes.length;a<l;a++){
          var faketheme = FakeStubThemes[a];
          if(typeof(p[faketheme]) !== "undefined") delete p[faketheme];
        }
        var allP = Object.keys(p);
        var a = {};
        var RegA1 = /a\["[^\}]*\}/g
        var A1 = Wikitext.match(RegA1);
        if(A1 !== null){
          for(var i=0,l=A1.length;i<l;i++){
            var ThisA1 = A1[i];
            Wikitext = Wikitext.replace(ThisA1, "");
            ThisA1 = cleaned(ThisA1);
            try{ eval(ThisA1); }catch(e){ console.warn("A1["+i+"] FAILED :\n"+e.message+"\n----------\n"+ThisA1+"\n----------"); };
          }
        }
        var adjM = Object.keys(a);
        Wikitext = Wikitext + '\n';
        var alias = {};
        var RegP2 = /p\["[^\]]*\][^\]]*\]/g
        var P2 = Wikitext.match(RegP2);
        if(P2 !== null){
          for(var a=0,l=P2.length;a<l;a++){
            var ThisP2 = P2[a]+"\n";
            ThisP2 = ThisP2.replace(/= *p\[/g, '= ');
            ThisP2 = ThisP2.split(']\n').join('\n');
            ThisP2 = ThisP2.split('p[').join('alias[');
            try{ eval(ThisP2); }catch(e){ console.warn("P2["+a+"] FAILED :\n"+e.message+"\n----------\n"+ThisP2+"\n----------"); };
          }
        }
        var adjF = [];
        var adj = [];
        for(var ad=0,l=adjM.length;ad<l;ad++){
          var thisF = adjM[ad];
          var lastOne = thisF.substr((thisF.length-1), 1);
          var lastTwo = thisF.substr((thisF.length-2), 2);
          if(lastTwo == "en"){
            thisF = thisF + "ne";
          }else if(lastOne != "e" && lastOne != ")"){
            thisF = thisF + "e";
          }else if(lastOne == ")"){
            var parenth = thisF.substring(thisF.indexOf(" ("));
            var befparenth = thisF.split(parenth).join("");
            var lastOneB = befparenth.substr((befparenth.length-1), 1);
            var lastTwoB = befparenth.substr((befparenth.length-2), 2);
            if(lastTwoB == "en"){
              thisF = befparenth + "ne" + parenth;
            }else if(lastOneB != "e"){
              thisF = befparenth + "e" + parenth;   
            }
          }
          adjF[ad] = thisF;
        }
        for(var th in p){
          var fem = p[th].feminin;
          if(fem) alias[fem] = th;
        }
        for(var al in alias){
          var target = alias[al];
          if(adjM.indexOf(target)!==-1) adjM.push(al);
          if(adjF.indexOf(target)!==-1) adjF.push(al);
          if(adj.indexOf(target)!==-1) adj.push(al);
          if(allP.indexOf(target)!==-1 && typeof(p[al])==-1) p[al] = p[target];          
        }
        PortalEval.params.StubAdjM = adjM.sort();
        PortalEval.params.StubAdjF = adjF.sort();
        PortalEval.params.StubAdj = adj.concat(adjM, adjF).sort();
        allP = Object.keys(p);
        for(var i=0,l=allP.length;i<l;i++){ allP[i] = PortalEval.functions.ucFirst(allP[i]); }
        allP.sort();
        for(var i=0,l=allP.length;i<l;i++){
          var key = allP[i]
          var P = p[key] || p[PortalEval.functions.lcFirst(key)];
          PortalEval.params.StubThemes[key] = P;
        }
        PortalEval.params.StubThemesOK = true;
        PortalEval.functions.checkThemes();
      }});
    },
    getEvalThemes : function(queryopt){
      if(!queryopt){
        if(PortalEval.params.EvalThemes.length>0) return PortalEval.functions.checkThemes();
        queryopt = {action :'query',list:'categorymembers',
          cmlimit : PortalEval.params.APILimit,
          cmtitle : mw.config.get("wgFormattedNamespaces")[14]+":"+PortalEval.params.EvalCategory,
          cmtype  : 'subcat'
        };
      }
      PortalEval.functions.alertControl();
      PortalEval.functions.alertControl(PortalEval.texts.AlertMsgThemes, true);
      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.ManuEvalThemes.indexOf(title) === -1) continue;
            if(PortalEval.params.FakeEvalThemes.indexOf(title)!==-1) continue;
            if(PortalEval.params.EvalThemes.indexOf(title)!==-1) continue;
            PortalEval.params.EvalThemes.push(title);
          }
        }
        if(data.continue && data.continue.cmcontinue){
          queryopt.cmcontinue = data.continue.cmcontinue;
          PortalEval.functions.getEvalThemes(queryopt);
        }else{
          PortalEval.params.EvalThemes.sort();
          PortalEval.params.EvalThemesOK = true;
          PortalEval.functions.checkThemes();
        }
      });
    },
    createThemeSelect : function(Select, defaultoption, addemptyoption){
      if(!Select){
        Select = document.createElement('select');
        Select.style.width = PortalEval.params.EvalThemeWidth+"px";
      }else{
        while(Select.firstChild) Select.removeChild(Select.firstChild);
      }
      var Themes = PortalEval.functions.sortTextList(PortalEval.params.EvalThemes);
      if(addemptyoption) Themes.unshift("");
      for(var a=0,l=Themes.length;a<l;a++){
        var title = Themes[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;
    },
    checkThemes : function(){
      PortalEval.functions.disableThings(["GlobalOptionsInput"], (!(PortalEval.params.EvalThemesOK && PortalEval.params.OptionsSubPageOK)));
      if(PortalEval.params.StubThemesOK && PortalEval.params.EvalThemesOK){
        var PortalListInput = document.getElementById("PortalEval_OptionPortalInput");
        PortalEval.functions.disableThings([ PortalListInput ], false);
        var PortalSelect = document.getElementById("PortalEval_OptionPortal");
        if(PortalSelect){
          PortalEval.functions.createThemeSelect(PortalSelect, PortalEval.params.DefaultPortal);
          if(PortalEval.params.AutoLaunchList) PortalEval.functions.getPages(-1, PortalSelect.value);
          else PortalEval.functions.alertControl();
        }
      }
    },
    updateOptions : function(){
      var F = document.getElementById("PortalEvalOptionsFS");
      if(!F) return;
      var NewParamText = [];
      var MoreParams = ""
      var ULs = F.getElementsByTagName('ul');
      for(var a=0,l=ULs.length;a<l;a++){
        var UL = ULs[a];       
        if(!$(UL).hasClass("optionsUL") || !UL.id) continue;
        var type = UL.id.split("OPTIONUL").join("");
        var Lis = UL.getElementsByTagName('li');
        for(var i=0,ilen=Lis.length;i<ilen;i++){
          var LI = Lis[i];
          var More = PortalEval.functions.getFirstElementByName(LI, ["textarea"], "moreparams");
          if(More) MoreParams = More.value;
          else{
            var Type = PortalEval.functions.getFirstElementByName(LI, ["input"], "type");
            var Name = PortalEval.functions.getFirstElementByName(LI, ["input"], "name");
            var DefaultNode = PortalEval.functions.getFirstElementByName(LI, ["input",], "default");
            var ActualNode = PortalEval.functions.getFirstElementByName(LI, ["textarea","select","input"], "actual");
            Type = Type.value;
            Name = Name.value;
            var Actual  = (Type=="boolean" ? ActualNode.checked         : ActualNode.value);
            var Default = (Type=="boolean" ? (DefaultNode.value == "true") : DefaultNode.value);
            Actual  = (Type=="string" ? '"'+Actual.replace(/"/g, '\\"')+'"'  : Actual);
            Default = (Type=="string" ? '"'+Default.replace(/"/g, '\\"')+'"' : Default);
            Actual  = (Type=="number" ? parseInt(Actual)  : Actual);
            Default = (Type=="number" ? parseInt(Default) : Default);
            if(Actual === Default) continue;
            Actual  = (Type=="string" ? Actual.split("\n").join("\\n\"\n  + \"")  : Actual);
            NewParamText.push("  PortalEval.functions.customize('"+type+"','"+Name+"',"+Actual+");");
          }
        }
      }
      NewParamText = "\n"+NewParamText.join("\n")+'\n\n'+PortalEval.params.OptionsPageCommentStart+MoreParams+PortalEval.params.OptionsPageCommentEnd;
      NewParamText = PortalEval.params.OptionsPageTemplate.split("$1").join(NewParamText);
      // return alert(NewParamText);
      PortalEval.functions.saveOptions(NewParamText, MoreParams);
    },
    saveOptions : function(NewParamText, MoreParams){
      var title = mw.config.get('wgFormattedNamespaces')[2]+':'+mw.config.get('wgUserName')+'/'+PortalEval.params.OptionsSubPage+'.js';
      PortalEval.functions.alertControl(PortalEval.texts.AlertMsgSaveParams.split("$page").join(title), true);
      $.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: title,
            text: NewParamText,
            summary: PortalEval.texts.SaveParamsResume.split("$docpage").join(PortalEval.params.DocPage),
            basetimestamp: "now",
            format: 'json',
            token: data.query.tokens.csrftoken
          },
          dataType: 'json',
          success: function(data){
            var DEFAULTparams = PortalEval.params.DEFAULTparams;
            for(var dp in DEFAULTparams){ PortalEval.params[dp] = DEFAULTparams[dp]; }
            var DEFAULTtexts = PortalEval.params.DEFAULTtexts;
            for(var dt in DEFAULTtexts){ PortalEval.texts[dt] = DEFAULTtexts[dt]; }
            try{
              eval(NewParamText);
              window.PortalEval_UserCustom();
            }catch(e){ console.error(e.message); }
            PortalEval.params.OptionsMoreParams = MoreParams;
            PortalEval.functions.alertControl();
            PortalEval.functions.openOptionsForm();
            PortalEval.functions.openOptionsForm();
          }
        });
      });
    }, 
    customize : function(type, optname, optvalue){
      if(!type || !optname || typeof(optvalue)==="undefined") return;
      var Default = PortalEval.params[("DEFAULT"+type)];
      if(typeof(Default)!=="object") return;
      Default = Default[optname];
      if(typeof(Default)==="undefined") return;
      PortalEval[type][optname] = optvalue;
    }, 
    createParamsUL : function(){
      var Div = document.createElement('div');
      Div.style.height = PortalEval.params.OptionsHeight + "px";
      Div.style.overflowY = "scroll";
      Div.id = "OPTIONparams";
      Div.className = "optionsDiv";
      var UL = document.createElement('ul');
      UL.id = "OPTIONULparams";
      UL.className = "optionsUL";
      var ColWidth = PortalEval.params.OptionUlColumnWidth;
      UL.setAttribute("style", "-webkit-columns:"+ColWidth+"px; -moz-columns:"+ColWidth+"; columns:"+ColWidth+"px;");
      UL.style.marginRight = "1em";
      Div.appendChild(UL)
      var ActualParams = PortalEval.params;
      var EditableParams = PortalEval.params.EditableParams;
      var DEFAULTparams = PortalEval.params.DEFAULTparams;
      for(var a=0,l=EditableParams.length;a<l;a++){
        var paramname = EditableParams[a];
        var modified = false;
        var LI = document.createElement('li');
        var defaultparam = DEFAULTparams[paramname];
        var actualparam = ActualParams[paramname];
        var HiddenName = PortalEval.functions.createInput({type:'hidden',name:"name",value:paramname});
        LI.appendChild(HiddenName);
        var HiddenType = PortalEval.functions.createInput({type:'hidden',name:"type",value:typeof(defaultparam)});
        LI.appendChild(HiddenType);
        if(actualparam !== defaultparam) modified = true;
        var DefaultHidden = PortalEval.functions.createInput({type:'hidden',name:"default",value:defaultparam});
        LI.appendChild(DefaultHidden);
        var DefaultInput = PortalEval.functions.createInput({type:'button',name:"defaultB",value:PortalEval.texts.DefButtonText,
                                                             title:PortalEval.texts.DefButtonTitle.split("$1").join(defaultparam)});
        LI.appendChild(DefaultInput);
        if(typeof(defaultparam)==="boolean"){
          DefaultInput.onclick = function(){ this.nextSibling.checked = ( this.previousSibling.value =="true" ? "checked" : false ); }
          var ActualInput = PortalEval.functions.createInput({type:'checkbox',name:"actual",value:actualparam});
          if(actualparam) ActualInput.checked = "checked";
        }else if(typeof(defaultparam)!=="object"){
          DefaultInput.onclick = function(){ this.nextSibling.value = this.previousSibling.value; }
          if(paramname == "DefaultPortal" || paramname == "DefaultSort"){
            var ActualInput;
            if(paramname == "DefaultSort") ActualInput = PortalEval.functions.createSortSelect(PortalEval.params.DefaultSort);
            if(paramname == "DefaultPortal") ActualInput = PortalEval.functions.createThemeSelect(null, actualparam, (actualparam === ""));
            ActualInput.name = "actual";
            var MoreWidth = PortalEval.params.OptionSelectWidthPlus[(mw.config.get("skin"))];
            ActualInput.style.width = (PortalEval.params.OptionStringWidth+(MoreWidth ? MoreWidth : 0))+"px";
          }else{
            var ActualInput = PortalEval.functions.createInput({type:'text',name:"actual",value:actualparam});
            ActualInput.style.width = PortalEval.params[("Option"+( typeof(defaultparam) === "number" ? "Number" : "String" )+"Width")]+"px";
          }
        }
        LI.appendChild(ActualInput);
        var Label = document.createElement('label');
        Label.innerHTML = PortalEval.texts[("OPTION"+paramname)] || ("OPTION"+paramname);
        if(modified){
          Label.style.color = "red";
          Label.title = PortalEval.texts.OptionModified;
        }
        Label.setAttribute('for', paramname);
        LI.appendChild(document.createTextNode(" : "));
        LI.appendChild(Label);
        UL.appendChild(LI);
      }
      return Div;
    },
    createTextsUL : function(){
      var Div = document.createElement('div');
      Div.style.height = PortalEval.params.OptionsHeight + "px";
      Div.style.overflowY = "scroll";
      Div.id = "OPTIONtexts";
      Div.className = "optionsDiv";
      var UL = document.createElement('ul');
      UL.id = "OPTIONULtexts";
      var ColWidth = PortalEval.params.OptionUlColumnWidth;
      UL.setAttribute("style", "-webkit-columns:"+ColWidth+"px; -moz-columns:"+ColWidth+"; columns:"+ColWidth+"px;");
      UL.style.marginRight = "1em";
      UL.className = "optionsUL";
      Div.appendChild(UL);
      var DEFAULTtexts = PortalEval.params.DEFAULTtexts;
      var ActualTexts = PortalEval.texts;
      for(var textname in DEFAULTtexts){
        var modified = false;
        var defaulttext = DEFAULTtexts[textname];
        var actualtext = ActualTexts[textname];
        var LI = document.createElement('li');
        var HiddenName = PortalEval.functions.createInput({type:'hidden',name:"name",value:textname});
        LI.appendChild(HiddenName);
        var HiddenType = PortalEval.functions.createInput({type:'hidden',name:"type",value:typeof(defaulttext)});
        LI.appendChild(HiddenType);
        if(typeof(defaulttext)!="object"){
          if(actualtext !== defaulttext) modified = true;
          var DefaultHidden = PortalEval.functions.createInput({type:'hidden',name:"default",value:defaulttext});
          LI.appendChild(DefaultHidden);
          var ActualInput = PortalEval.functions.createInput({type:'textarea',name:"actual",value:actualtext,
                                                              title : (PortalEval.texts[("OPTION"+textname)] || PortalEval.texts[textname] || textname)});
          ActualInput.setAttribute('rows', 1);
          if(modified) ActualInput.style.color = 'red';
          LI.appendChild(ActualInput);
        }
        UL.appendChild(LI);
      }
      return Div;
    },
    createMoreParamsUL : function(){
      var Div = document.createElement('div');
      Div.style.height = PortalEval.params.OptionsHeight + "px";
      Div.style.overflowY = "scroll";
      Div.id = "OPTIONmoreparams";
      Div.className = "optionsDiv";
      var UL = document.createElement('ul');
      UL.id = "OPTIONULmoreparams";
      UL.style.marginRight = "1em";
      UL.className = "optionsUL";
      Div.appendChild(UL);
      var OptionsMoreParams = (PortalEval.params.OptionsMoreParams || "");
      var MoreLI = document.createElement('li');
      MoreLI.style.marginTop = "1em";
      MoreLI.style.paddingBottom = "1em";
      MoreLI.style.paddingLeft = "2px";
      MoreLI.style.paddingRight = "2px";
      var Textarea = PortalEval.functions.createInput({type:"textarea",name:'moreparams',value:OptionsMoreParams});
      Textarea.setAttribute('rows', PortalEval.params.MoreParamsRows);
      if(OptionsMoreParams){
        Textarea.style.color = "red";
        Textarea.title = PortalEval.texts.OptionModified;
      }
      MoreLI.appendChild(Textarea);
      UL.appendChild(MoreLI);
      return Div;
    },
    openOptionsForm : function(){
      var TROptions = document.getElementById("PortalEvalOptionsTR");
      var OptionsDiv = document.getElementById("PortalEvalOptionsFS");
      if(!TROptions || !OptionsDiv) return;
      if(TROptions.style.display != "none"){
        TROptions.style.display = "none";
        while(OptionsDiv.firstChild){  OptionsDiv.removeChild(OptionsDiv.firstChild); }
      }else{
        var Legend = document.createElement('legend');
        var OKInput = PortalEval.functions.createInput({type:'button',value:PortalEval.texts.OptionValidate,title:PortalEval.texts.OptionValidateTip});
        OKInput.onclick = function(){
          PortalEval.functions.updateOptions();
        }
        Legend.appendChild(OKInput);
        OptionsDiv.appendChild(Legend);
        var P = OptionsDiv.appendChild(document.createElement('p'));
        P.style.textAlign = "center";
        OptionsDiv.appendChild(PortalEval.functions.createParamsUL());
        OptionsDiv.appendChild(PortalEval.functions.createTextsUL());
        OptionsDiv.appendChild(PortalEval.functions.createMoreParamsUL());
        var ULs = OptionsDiv.getElementsByTagName('div');
        var ulcount = 0;
        for(var a=0,l=ULs.length;a<l;a++){
          var thisUL = ULs[a];
          if(!$(thisUL).hasClass("optionsDiv") || !thisUL.id) continue;
          var ID = thisUL.id;
          var Input = PortalEval.functions.createInput({type:'button',name:ID,value:(PortalEval.texts[ID] || ID)});
          Input.onclick = function(){
            PortalEval.functions.showThisUL(this);
          }
          if(a>0) Input.style.marginLeft = "0.5em";
          if(ulcount !== 0) thisUL.style.display = "none";
          else Input.style.textDecoration = "underline";
          P.appendChild(Input);
          ulcount++;
        }
        TROptions.style.display = "";
      }
    },
    showThisUL : function(I){
      var P = I.parentNode;
      var F = document.getElementById("PortalEvalOptionsFS");
      if(!P || !F) return;
      var ELID = I.name;
      var ELs = F.getElementsByTagName('div');
      for(var a=0,l=ELs.length;a<l;a++){
        var thisEL = ELs[a];
        if(!$(thisEL).hasClass("optionsDiv") || !thisEL.id) continue;
        if(thisEL.id == ELID) thisEL.style.display = "";
        else thisEL.style.display = "none";
      }
      var Inputs = P.getElementsByTagName('input');
      for(var a=0,l=Inputs.length;a<l;a++){
        var Input = Inputs[a];
        if(I == Input) Input.style.textDecoration = "underline";
        else Input.style.textDecoration = "";
      }
    },
    createCategorySelect : function(InputText){
      var CategorySelect = document.createElement('select');
      CategorySelect.id = "PortalEval_CatSelect";
      CategorySelect.style.display = "none";
      InputText.parentNode.insertBefore(CategorySelect, InputText.nextSibling);
      var Cat = InputText.value;
      if(Cat !== "") PortalEval.functions.getSelectedPrefixCats(Cat);
    },
    setCategorySelectPosition : function(){
      var InputText = document.getElementById("PortalEval_Cat");
      var CategorySelect = document.getElementById("PortalEval_CatSelect");
      var Options = CategorySelect.getElementsByTagName('option');
      var Taille = PortalEval.params.CategorySelectSize;
      if(Options.length < Taille) Taille = Options.length;
      var H = (Taille * 20);
      CategorySelect.size = Taille;
      CategorySelect.style.align = "left";
      CategorySelect.style.Zindex = 5;
      CategorySelect.style.position = "relative";
      CategorySelect.style.width = InputText.offsetWidth + "px" ;
      CategorySelect.style.height = H + "px" ;
      CategorySelect.style.top = "-20px" ;
      CategorySelect.style.marginTop = "-" + H + "px" ;
      CategorySelect.style.marginRight = -CategorySelect.offsetWidth + "px";
      CategorySelect.style.marginLeft = -InputText.offsetWidth + "px";
    },
    onSelectClick : function(option){
      var NewCat = option.value;
      var CatInput = document.getElementById("PortalEval_Cat");
      CatInput.value = NewCat;
      option.parentNode.style.display = "none";
      PortalEval.functions.getSelectedPrefixCats(NewCat);
      PortalEval.functions.getSelectedCatInfos(NewCat);
      PortalEval.functions.getSelectedCatParents(NewCat);
      PortalEval.functions.getSelectedCatDaughters(NewCat);
      CatInput.focus();
    },
    checkSelectedCat : function(){
      var CatInput = document.getElementById("PortalEval_Cat");
      if(!CatInput) return;
      var Cat = CatInput.value;
      setTimeout(function(){
        PortalEval.functions.getSelectedPrefixCats(Cat);
        PortalEval.functions.getSelectedCatInfos(Cat);
        PortalEval.functions.getSelectedCatParents(Cat);
        PortalEval.functions.getSelectedCatDaughters(Cat);
      },1000);
    },
    getSelectedPrefixCats(Cat){
      var CatInput = document.getElementById("PortalEval_Cat");
      var CatSelect = document.getElementById("PortalEval_CatSelect");
      if(CatInput.value != Cat) return;
      // https://fr.wikipedia.org/w/api.php?action=query&aclimit=20&list=allcategories&acprefix=Colo
      var datas = {
          action   : 'query',
          list     : 'allcategories',
          acprefix : Cat,
          aclimit  : PortalEval.params.CategorySuggestions,
          format   : 'json'
      };
      $.ajax({
      url: mw.util.wikiScript('api'), data: datas,dataType: 'json'
      }).then(function(data) {
        CatInput = document.getElementById("PortalEval_Cat");
        if(CatInput.value.indexOf(Cat)!==0) return;
        var categories = data.query.allcategories;
        if(categories.length == 0) return CatSelect.style.display = "none";
        while(CatSelect.firstChild){ CatSelect.removeChild(CatSelect.firstChild); }
        var titles = [];
        for(var a=0,l=categories.length;a<l;a++){
          var catdata = categories[a];
          var category = catdata[(Object.keys(catdata)[0])];
          titles.push(category);
          var option = document.createElement('option');
          option.value = category;
          option.innerHTML = category;
          option.onclick = function(){
            PortalEval.functions.onSelectClick(this);
          }
          CatSelect.insertBefore(option, CatSelect.firstChild);
          if(a == 0) option.selected = "selected";
        }
        if(categories.length > 0) CatSelect.style.display = "inline";
        if(titles[0] == Cat ) CatSelect.style.display = "none"; 
        PortalEval.functions.setCategorySelectPosition();
      });
    },
    getSelectedCatInfos(Cat){
      var CatInput = document.getElementById("PortalEval_Cat");
      if(CatInput.value != Cat) return;
      var CatInfosDiv = document.getElementById("CatInfosDiv");
      if(!CatInfosDiv) return;
      CatInfosDiv.style.visibility = "hidden";
      var datas = {
          action:'query',
          prop:'categoryinfo',
          titles:mw.config.get('wgFormattedNamespaces')[14]+":"+Cat,
          format:'json'
      };
      $.ajax({
      url: mw.util.wikiScript('api'), data: datas,dataType: 'json'
      }).then(function(data) {
        CatInput = document.getElementById("PortalEval_Cat");
        if(CatInput.value != Cat) return;
        var page = data.query.pages[(Object.keys(data.query.pages)[0])];
        var missing = page.missing === "";
        var Pinfos = document.getElementById("Pinfos");
        var LIpages = document.getElementById("LIpages");
        var LIsubcats = document.getElementById("LIsubcats");
        LIpages.style.visibility = "hidden";
        LIsubcats.style.visibility = "hidden";
        if(missing){
          var CatInput = document.getElementById("PortalEval_Cat");
          if(CatInput.value != Cat) return;
          $(Pinfos).addClass("nocat");
          Pinfos.innerHTML = PortalEval.texts.CatExistsNo.split("$cat").join(Cat);
        }else{
          $(Pinfos).removeClass("nocat");
          var categoryinfo = page.categoryinfo;
          if(categoryinfo){
            var pages = categoryinfo.pages;
            var subcats = categoryinfo.subcats;
            Pinfos.innerHTML = PortalEval.texts.CatExistsYes.split("$cat").join(Cat);
            if(pages){
              LIpages.innerHTML = PortalEval.texts.CatPages.split("$1").join(pages);
              LIpages.style.visibility = "visible";
            }
            if(subcats){
              LIsubcats.innerHTML = PortalEval.texts.CatCats.split("$1").join(subcats);
              LIsubcats.style.visibility = "visible";
            }
          }
        }
        CatInfosDiv.style.visibility = "visible";
      });
    },
    getSelectedCatParents(Cat, ParentList, clcontinue){
      var CatInput = document.getElementById("PortalEval_Cat");
      if(CatInput.value != Cat) return;
      if(!ParentList){
        ParentList = [];
        var CatParentsDiv = document.getElementById("CatParentsDiv");
        CatParentsDiv.style.visibility= "hidden";
        while(CatParentsDiv.firstChild){ CatParentsDiv.removeChild(CatParentsDiv.firstChild); }
      }
      var datas = {
          action:'query',
          prop:'categories',
          clprop:'hidden',
          cllimit:PortalEval.params.APILimit,
          titles:mw.config.get('wgFormattedNamespaces')[14]+":"+Cat,
          format:'json'
      };
      if(clcontinue) datas.clcontinue = clcontinue;
      $.ajax({
      url: mw.util.wikiScript('api'), data: datas,dataType: 'json'
      }).then(function(data) {
        CatInput = document.getElementById("PortalEval_Cat");
        if(CatInput.value != Cat) return;
        var page = data.query.pages[(Object.keys(data.query.pages)[0])];
        var categories = page.categories;
        if(!categories) return;
        for(var a=0,l=categories.length;a<l;a++){
          ParentList.push([categories[a].title,(categories[a].hidden===""?true:false)]);
        }
        var cont = data.continue;
        if(cont){
          PortalEval.functions.getSelectedCatParents(Cat, ParentList, cont.clcontinue)
        }else{
          var UL = document.createElement('ul');
          CatParentsDiv.appendChild(UL);
          for(var a=0,l=ParentList.length;a<l;a++){
            var page = ParentList[a][0];
            var title = PortalEval.functions.getNamespaceInfoFromPage(page, "PageName");
            var hidden = ParentList[a][1];
            var LI = document.createElement('li');
            var link = PortalEval.functions.createLink(page,{text:title});
            var span = document.createElement('span');
            if(hidden){
              span = document.createElement('abbr');
              span.style.color = "DarkGray";
              span.title = PortalEval.texts.HiddenCat;
            }
            $(span).addClass("CategoryTreeToggle");
            span.appendChild(document.createTextNode("►"));
            LI.appendChild(span);
            LI.appendChild(document.createTextNode(" "));
            LI.appendChild(link);
            UL.appendChild(LI);
          }
          PortalEval.functions.addSelectCatOnclickTolinks(UL);
          CatParentsDiv.style.visibility= "visible";
        }
      });
    },
    getSelectedCatDaughters(Cat){
      var CatInput = document.getElementById("PortalEval_Cat");
      if(CatInput.value != Cat) return;
    //  "//fr.wikipedia.org/w/api.php?format=json&action=categorytree&category=Colombie";
      var CatDaughtersDiv = document.getElementById("CatDaughtersDiv");
      CatDaughtersDiv.style.visibility= "hidden";
      $.ajax({
      url: mw.util.wikiScript('api'),
        data: {
          action:'categorytree',
          options:{showcount:1},
          category:Cat,
          format:'json'
        },
        dataType: 'json'
      }).then(function(data) {
        CatInput = document.getElementById("PortalEval_Cat");
        if(CatInput.value != Cat) return;
        var HTML = data.categorytree["*"];
        CatDaughtersDiv.innerHTML = HTML;
        PortalEval.functions.addSelectCatOnclickTolinks(CatDaughtersDiv);
        CatDaughtersDiv.style.visibility= "visible";
      });
    },
    addSelectCatOnclickTolinks(node){
      var alllinks = node.getElementsByTagName('a');
      for(var a=0,l=alllinks.length;a<l;a++){
        var link = alllinks[a];
        link.onclick = function(){
          var cat = this.innerHTML;
          var Input = document.getElementById("PortalEval_Cat");
          if(Input){
            Input.value = cat;
            PortalEval.functions.checkSelectedCat();
          }
          return false;
        }
      }
    },
    prepareSpecialpage : function(){
      var Title = document.getElementsByTagName('title')[0];
      var TitleH = document.getElementsByTagName('h1')[0];
      var Content = document.getElementById('mw-content-text');
      if(!Title || !TitleH || !Content) return;
      Title.innerHTML = PortalEval.texts.SpecialpageNameH.split("$1").join(PortalEval.texts.SpecialpageName);
      TitleH.innerHTML = PortalEval.texts.SpecialpageName;
      while(Content.firstChild){ Content.removeChild(Content.firstChild); }
      PortalEval.functions.createSpecialpageBoard(Content);
    },
    createSpecialpageBoard : function(contentNode){
      var PortalEvalBoard = document.createElement('div');
      PortalEvalBoard.id = "PortalEvalBoard";
      contentNode.appendChild(PortalEvalBoard);
      var PortalEvalBoardHead = document.createElement('fieldset');
      PortalEvalBoardHead.id = "PortalEvalBoardHead";
      PortalEvalBoard.appendChild(PortalEvalBoardHead);
      var MainOptions = PortalEval.functions.createMainOptions();
      for(var a=0,l=MainOptions.length;a<l;a++) PortalEvalBoardHead.appendChild(MainOptions[a]);
      var BoardListDiv = PortalEval.functions.createBoardListDiv();
      BoardListDiv.style.display = "none";
      PortalEvalBoard.appendChild(BoardListDiv);
      var OptionsInput = document.getElementById("GlobalOptionsInput");
      var GoInput = document.getElementById("PortalEval_OptionPortalInput");
      var ControlSpan = document.createElement('span');
      ControlSpan.innerHTML = "<span id='PortalEvalBoardControlRunning'> </span><span id='PortalEvalBoardControlTR'><span id='PortalEvalBoardControl'> </span></span>";
      GoInput.parentNode.appendChild(ControlSpan);
      var OptionDiv = document.createElement('div');
      OptionDiv.style.display = "none";
      OptionDiv.id = "PortalEvalOptionsTR";
      OptionsInput.parentNode.appendChild(OptionDiv);
      var OptionFS = document.createElement('fieldset');
      OptionFS.id = "PortalEvalOptionsFS";
      OptionDiv.appendChild(OptionFS);
      GoInput.parentNode.appendChild(OptionDiv);
      var ValidateInput = document.getElementById("GlobalChangeInput");
      var SortFS = document.getElementById("fieldsetSort");
      while(SortFS.firstChild){
        var node = SortFS.removeChild(SortFS.firstChild);
        if(node.tagName && node.tagName.toLowerCase() != "legend") ValidateInput.parentNode.insertBefore(node, ValidateInput);
      }
      SortFS.parentNode.removeChild(SortFS);
      var TDCat = document.createElement('td');
      var CatFS = document.getElementById("fieldsetCat");
      var CatSelect = document.getElementById("PortalEval_Cat");
      CatSelect.onkeyup = PortalEval.functions.checkSelectedCat;
      var CatInput = document.getElementById("PortalEval_SubCats");
      var nodes = [CatSelect, CatInput];
      for(var a=0,l=nodes.length;a<l;a++){
        var node = nodes[a];
        node.parentNode.removeChild(node);
        var Form = document.createElement('form');
        Form.onsubmit = function(){ return false; };
        Form.appendChild(node);
        if(a==1){
          var Label = document.createElement('label');
          Label.setAttribute('for', 'subcats');
          Label.innerHTML = PortalEval.texts.SubCatTitle;
          Form.appendChild(document.createTextNode(' '));
          Form.appendChild(Label);
        }
        TDCat.appendChild(Form);
      }
      TDCat.style.width = (parseInt(CatSelect.style.width.split("px").join(""))+100)+"px";
      var Table = document.createElement('table');
      Table.style.width = "100%";
      var TR1 = document.createElement('tr');
      var TR2 = document.createElement('tr');
      var TDInfos = document.createElement('td');
      var TDFamily = document.createElement('td');
      TDFamily.setAttribute('rowspan', 2);
      TR1.appendChild(TDCat);
      TR1.appendChild(TDFamily);
      TR2.appendChild(TDInfos);
      var FamilyTable = document.createElement('table')
      var FamilyTR = document.createElement('tr');
      TDFamily.appendChild(FamilyTable);
      FamilyTable.appendChild(FamilyTR);
      var TDParents = document.createElement('td');
      var TDDaughters = document.createElement('td');
      FamilyTR.appendChild(TDParents);
      FamilyTR.appendChild(TDDaughters);
      Table.appendChild(TR1);
      Table.appendChild(TR2);
      CatFS.appendChild(Table);
      var DivInfos = TDInfos.appendChild(document.createElement('div'));
      DivInfos.id = "CatInfosDiv";
      var Pinfos = DivInfos.appendChild(document.createElement('p'));
      Pinfos.id = "Pinfos";
      var ULinfos = DivInfos.appendChild(document.createElement('ul'));
      var LIpages = ULinfos.appendChild(document.createElement('li'));
      LIpages.id = "LIpages";
      var LIsubcats = ULinfos.appendChild(document.createElement('li'));
      LIsubcats.id = "LIsubcats";
      var Pparents = TDParents.appendChild(document.createElement('p'))
      Pparents.style.textAlign = "center";
      Pparents.innerHTML = PortalEval.texts.CatParents;
      var DivParents = TDParents.appendChild(document.createElement('div'));
      DivParents.id = "CatParentsDiv";
      var Pdaughters = TDDaughters.appendChild(document.createElement('p'))
      Pdaughters.style.textAlign = "center";
      Pdaughters.innerHTML = PortalEval.texts.CatDaughters;
      var DivDaughters = TDDaughters.appendChild(document.createElement('div'));
      DivDaughters.id = "CatDaughtersDiv";
      FamilyTable.style.width = "100%";
      TDParents.style.width = "50%";
      TDDaughters.style.width = "50%";
      TDParents.setAttribute('valign',"top");
      TDDaughters.setAttribute('valign',"top");
      DivParents.style.height = "150px";
      DivDaughters.style.height = "150px";
      DivInfos.style.height= "80px";
      DivParents.style.overflowY = "scroll";
      DivDaughters.style.overflowY = "scroll";
      DivParents.style.visibility = "hidden";
      DivDaughters.style.visibility = "hidden";
      DivInfos.style.visibility = "hidden";
      PortalEval.functions.createCategorySelect(CatSelect);
      PortalEval.functions.checkSelectedCat();
      PortalEval.functions.getEvalThemes();
      PortalEval.functions.getStubThemes();
      PortalEval.functions.getUserSubPage();
    },
    createCategoryBoard : function(){
      var board = document.getElementById("PortalEvalBoard");
      if(board){
        board.style.display = ""; 
        return PortalEval.functions.displayNodesById(PortalEval.params.ContenIDs, false);
      }
      PortalEval.functions.displayNodesById(PortalEval.params.ContenIDs, false);
      board = document.createElement("div");
      board.id = "PortalEvalBoard";
      board.style.backgroundColor = "white";
      document.body.appendChild(board);      
      var boardHead = document.createElement("div");  
      boardHead.id = "PortalEvalBoardHead";
      var HeadTable = document.createElement("table");
      HeadTable.width = "100%";
      if(PortalEval.params.AddWarning){
      var Caption = document.createElement("caption");
        $(Caption).addClass("error");
        Caption.innerHTML = PortalEval.texts.Warning;
        HeadTable.appendChild(Caption);
      }
      var HeadTR = document.createElement("tr");
      var TDRunning = document.createElement("td"); // Icone Running
      TDRunning.id = "PortalEvalBoardControlRunning";
      TDRunning.width = "30px";
      HeadTR.appendChild(TDRunning);
      var TDMainHead = document.createElement("td");
      TDMainHead.id = "PortalEvalMainOptionsFS";
      TDMainHead.style.textAlign = "center";
      TDMainHead.style.whiteSpace = "nowrap";
      var Center = document.createElement('center');
      TDMainHead.appendChild(Center);
      var MainOptions = PortalEval.functions.createMainOptions();
      for(var a=0,l=MainOptions.length;a<l;a++) Center.appendChild(MainOptions[a]);
      var TDButtons = document.createElement("td"); // Bouton Fermer
      TDButtons.width = "30px";
      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(TDMainHead);
      HeadTR.appendChild(TDButtons);
      HeadTable.appendChild(HeadTR);    
      var TRControl = document.createElement("tr");
      TRControl.id = "PortalEvalBoardControlTR";
      var TDControl = document.createElement("td");
      TDControl.setAttribute("colspan", "3");
      var ControlSpan = document.createElement('span');      
      ControlSpan.style.whiteSpace = "nowrap";
      ControlSpan.id = "PortalEvalBoardControl";
      TDControl.appendChild(ControlSpan);
      TRControl.appendChild(TDControl);
      HeadTable.appendChild(TRControl);
      var TROptions = document.createElement("tr");
      TROptions.id = "PortalEvalOptionsTR";
      TROptions.style.display = "none";
      var TDOptions = document.createElement("td");
      TDOptions.setAttribute("colspan", "3");
      var OptionsDiv = document.createElement('div');
      OptionsDiv.style.margin = "0 1em 0 1em";
      var OptionsFieldset = document.createElement('fieldset');
      OptionsFieldset.id = "PortalEvalOptionsFS";
      OptionsDiv.appendChild(OptionsFieldset);
      TDOptions.appendChild(OptionsDiv);
      TROptions.appendChild(TDOptions);
      HeadTable.appendChild(TROptions);
      boardHead.appendChild(HeadTable);
      board.appendChild(boardHead); 
      board.appendChild(PortalEval.functions.createBoardListDiv());
      PortalEval.functions.getEvalThemes();
      PortalEval.functions.getStubThemes();
      PortalEval.functions.getUserSubPage();
    },
    alertControl : function(text, running){
      var control = document.getElementById("PortalEvalBoardControl");
      var controlTR = document.getElementById("PortalEvalBoardControlTR");
      var controlRunning = document.getElementById("PortalEvalBoardControlRunning");
      if(!control || !controlTR || !controlRunning) return; 
      if(!text){
        controlRunning.innerHTML = '<img width="24"  height="24" src="'+PortalEval.params.ImageURL + PortalEval.params.OKIcon+'" />';
        control.innerHTML = '';
        controlTR.style.display = 'none';
      }else{
        controlRunning.innerHTML = (running ? ('<img width="24"  height="24" src="'+PortalEval.params.ImageURL + PortalEval.params.RunningIcon+'" />' + " ") : "")
        control.innerHTML = text;
        controlTR.style.display = '';
      }
    },
    createMainOptions : function(){
      var CatLI = document.createElement('fieldset'); // Catégorie
      CatLI.id = "fieldsetCat";
      var CatLabel = document.createElement('legend');
      CatLabel.innerHTML = PortalEval.texts.Cat;
      var Cond = PortalEval.functions.getLaunchCondition();
      var CatTitle = "";
      var wgTitle = mw.config.get("wgTitle");
      if(Cond == 1) CatTitle = wgTitle;
      else if(Cond == 2 && wgTitle.indexOf("PortalEval/")!=-1) CatTitle = wgTitle.split("PortalEval/")[1];
      var PortalCat = PortalEval.functions.createInput({type:"text",value:CatTitle,name:'cat'});
      PortalCat.id = "PortalEval_Cat";
      PortalCat.style.width = PortalEval.params.CatInputWidth+"px";
      PortalEval.functions.disableThings([ PortalCat ], (Cond != 2) );
      var PortalListCubCat = PortalEval.functions.createInput({type:"checkbox",title:PortalEval.texts.SubCatTitle,name:'subcats'});
      PortalListCubCat.id = "PortalEval_SubCats";
      CatLI.appendChild(CatLabel);
      CatLI.appendChild(PortalCat);
      CatLI.appendChild(PortalListCubCat);
      var EvalLI = document.createElement('fieldset'); // Évaluations
      EvalLI.id = "fieldsetEval";
      var PortalLabel = document.createElement('legend');
      PortalLabel.innerHTML = PortalEval.texts.Portal
      var PortalSelect = document.createElement('select');
      PortalSelect.id = "PortalEval_OptionPortal";
      PortalSelect.name = "PortalEval_OptionPortal";
      PortalSelect.style.width = PortalEval.params.MainEvalThemeWidth+"px";
      EvalLI.appendChild(PortalLabel);
      EvalLI.appendChild(PortalSelect);
      var SortLI = document.createElement('fieldset'); // Tri
      SortLI.id = "fieldsetSort";
      var SortLabel = document.createElement('legend');
      SortLabel.innerHTML = PortalEval.texts.Sort;
      var SortHidden = PortalEval.functions.createInput({type:"hidden"});
      SortHidden.id = "PortalEval_SortHidden";
      var SortSelect = PortalEval.functions.createSortSelect(PortalEval.params.DefaultSort, SortHidden);
      SortSelect.id = "PortalEval_OptionSort";
      SortSelect.name = "PortalEval_OptionSort";
      var SortListInput = PortalEval.functions.createInput({type:"button",value:PortalEval.texts.GoSortText,title:PortalEval.texts.GoSortTitle});
      SortListInput.id = "PortalEval_SortButton";
      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;
        PortalEval.functions.disableThings([ this ], true);
        PortalEval.functions.sortPages(Sort_Select.value, Portal_Select.value);        
      }
      SortLI.appendChild(SortLabel);
      SortLI.appendChild(SortHidden);
      SortLI.appendChild(SortSelect);
      SortLI.appendChild(SortListInput);
      var ActionsLI = document.createElement('fieldset'); // Actions
      ActionsLI.id = "fieldsetActions";
      var ActionsLabel = document.createElement('legend');
      ActionsLabel.innerHTML = PortalEval.texts.Actions;
      var PortalListInput = PortalEval.functions.createInput({type:"button",value:PortalEval.texts.GoListText,title:PortalEval.texts.GoListTitle});
      PortalListInput.id = "PortalEval_OptionPortalInput";
      PortalListInput.onclick = function(){
        PortalEval.functions.clearBoard();
        var Select = document.getElementById("PortalEval_OptionPortal");
        PortalEval.functions.getPages(-1, Select.value);
      }
      var GlobalChangeInput = PortalEval.functions.createInput({type:"button",name:"Change",value:PortalEval.texts.GoChangeText,title:PortalEval.texts.GoChangeTitle.split("$1").join("")});
      GlobalChangeInput.id = "GlobalChangeInput";
      GlobalChangeInput.onclick = function(){
        var CancelInput = document.getElementById("GlobalCancelInput");
        PortalEval.functions.disableThings([ CancelInput, this ], true);
        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));
        }
      }
      if(!PortalEval.params.AllowEdition) GlobalChangeInput.style.fontStyle = "italic";
      var GlobalCancelInput = PortalEval.functions.createInput({type:"button",name:"Change",value:PortalEval.texts.GoCancelText,title:PortalEval.texts.GoCancelTitle.split("$1").join("")});
      GlobalCancelInput.id = "GlobalCancelInput";
      GlobalCancelInput.onclick = function(){
        PortalEval.functions.cancelAllChanges();
      }
      var PortalListInput = PortalEval.functions.createInput({type:"button",value:PortalEval.texts.GoListText,title:PortalEval.texts.GoListTitle});
      PortalListInput.id = "PortalEval_OptionPortalInput";
      PortalListInput.onclick = function(){
        PortalEval.functions.clearBoard();
        var Select = document.getElementById("PortalEval_OptionPortal");
        PortalEval.functions.getPages(-1, Select.value);
      }
      var ParamsInput = PortalEval.functions.createInput({type:"button",name:"Change",value:PortalEval.texts.GoOptionsText,title:PortalEval.texts.GoOptionsTitle});
      ParamsInput.id = "GlobalOptionsInput";
      PortalEval.functions.disableThings([ ParamsInput ], !PortalEval.params.OptionsSubPageOK);
      ParamsInput.onclick = function(){
        PortalEval.functions.openOptionsForm();
      }
      ActionsLI.appendChild(ActionsLabel);
      ActionsLI.appendChild(PortalListInput);
      ActionsLI.appendChild(GlobalChangeInput);
      ActionsLI.appendChild(GlobalCancelInput);
      ActionsLI.appendChild(ParamsInput);
      PortalEval.functions.disableThings([ PortalListInput, GlobalChangeInput, GlobalCancelInput ], true);
      return [ CatLI, EvalLI, SortLI, ActionsLI ];
    },
    createBoardListDiv : function(){
      var boardListDiv = document.createElement("div");
      boardListDiv.id = "PortalEvalBoardListDiv";
      var boardList = document.createElement("table");
      boardList.className = "evaltable wikitable centre";
      boardList.width = "100%";
      boardList.id = "PortalEvalBoardList";
      boardList.style.marginTop = "0";
      var TR1 = document.createElement("tr");
      boardList.appendChild(TR1);
      for(var a=0,l=5;a<l;a++){
        var TH = document.createElement("th");
        TH.innerHTML = PortalEval.texts[("TH"+a+"text")];
        if(a !=0) TH.width = PortalEval.params[("TH"+a+"width")]+"px";
        TR1.appendChild(TH);
      }      
      boardListDiv.appendChild(boardList);
      return boardListDiv;
    },
    removeBoard : function(){
      var board = document.getElementById("PortalEvalBoard");
      if(board) board.style.display = "none"; 
      PortalEval.functions.displayNodesById(PortalEval.params.ContenIDs, true);  
    },
    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 BoardListDiv = document.getElementById("PortalEvalBoardListDiv");
      var BoardList = document.getElementById("PortalEvalBoardList");
      if(!BoardList || !BoardListDiv) return false;
      BoardListDiv.style.display = "";
      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 redirectfrom = pagedatas.redirectfrom;
      var disambig = pagedatas.disambig;
      var stub = pagedatas.stub;
      var evalWT = pagedatas.evalWT;
      var evalAVT = pagedatas.evalAVT;
      var evalIMP = pagedatas.evalIMP;
      var allIMP = pagedatas.allIMP;
      TR.id = "IDtr_"+index;
      var classes = [];
      if(stub) 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((redirectfrom ? redirectfrom : title), {preview:index, class:(redirectfrom ? "mw-redirect" : "")});
      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(")"));
      if(disambig){
        var Dspan = document.createElement('abbr');
        Dspan.innerHTML = '<img width="12"  src="'+PortalEval.params.ImageURL + PortalEval.params.DisambigIcon+'" />';
        Dspan.title = PortalEval.texts.DisambigTitle;
        TD1.appendChild(document.createTextNode(" — "));
        TD1.appendChild(Dspan);
      }
      if(redirectfrom){
        var Rspan = document.createElement('abbr');
        var Ricon = '<img width="12"  src="'+PortalEval.params.ImageURL + PortalEval.params.RedirectIcon+'" />';
        Rspan.innerHTML = Ricon;
        Rspan.title = PortalEval.texts.RedirectText.split("$page").join(title);
        TD1.appendChild(document.createTextNode(" — "));
        TD1.appendChild(Rspan);
      }
      var TD2 = document.createElement("td"); // "Bandeau d'ébauche"
      TD2.className = "TD2";
      TD2.style.textAlign = "right";
      if(stub){
        for(var a=0,l=stub.length;a<l;a++){
          TD2.appendChild(PortalEval.functions.createStubSelect(index, a));
        }
      }
      var AddStubForm = document.createElement('form'); 
      if(stub && stub.length > 5) AddStubForm.style.display = "none";    
      AddStubForm.id = "STUBadd_"+index; 
      var AddStubInput = PortalEval.functions.createInput({type:"button",value:PortalEval.texts.AddSTUBText,title:PortalEval.texts.AddSTUBTitle});
      AddStubInput.onclick = function(){
        PortalEval.functions.addOneStubForm(index);
      }
      AddStubForm.appendChild(AddStubInput);
      TD2.appendChild(AddStubForm);
      var TD3 = document.createElement("td"); // "Avancement"
      TD3.className = "TD3";
      TD3.style.textAlign = "center";
      if(typeof(evalAVT)=="number"){
        TD3.appendChild(PortalEval.functions.createAVTSelect(evalAVT, index));
        var col = PortalEval.params.Avancement[evalAVT].color;
        var textcolor = PortalEval.params.Avancement[evalAVT].textcolor;
        TD3.style.backgroundColor = col;
        if(textcolor) TD3.style.color = textcolor;
        if( (stub && evalAVT != 5) || (!stub && evalAVT == 5) ){
          TD2.style.border = "2px solid red";
          TD3.style.border = "2px solid red";
        } 
      }else TD3.appendChild(PortalEval.functions.createAVTSelect(-1, index, true));
      var TD4 = document.createElement("td"); // "Importances"
      TD4.className = "TD4";
      TD4.style.textAlign = "right";
      if(typeof(evalIMP)=="number"){
        TD4.appendChild(PortalEval.functions.createIMPSelect(evalIMP, portal, index, 0));
        var col = PortalEval.params.Importance[evalIMP].color;
        var textcolor = PortalEval.params.Importance[evalIMP].textcolor;
        TD4.style.backgroundColor = col;
        if(textcolor) TD4.style.color = textcolor;
      }
      if(allIMP){
        var count = 1;
        for(var port in allIMP){
          if(port == portal) continue;
          var thisimp = allIMP[port];
          TD4.appendChild(PortalEval.functions.createIMPSelect(thisimp, port, index, count));
          count++
        }
      }
      var AddIMPForm = document.createElement('form');   
      AddIMPForm.id = "IMPadd_"+index; 
      var AddIMPInput = PortalEval.functions.createInput({type:"button",value:PortalEval.texts.AddIMPText,title:PortalEval.texts.AddIMPTitle});
      AddIMPInput.onclick = function(){
        PortalEval.functions.addOneIMPForm(index);
      }
      AddIMPForm.appendChild(AddIMPInput);
      TD4.appendChild(AddIMPForm);
      var TD5 = document.createElement("td"); // "Actions"
      TD5.className = "TD6";
      TD5.style.textAlign = "center";      
      var ChangeInput = PortalEval.functions.createInput({type:"button",value:PortalEval.texts.GoChangeOneText,title:PortalEval.texts.GoChangeOneTitle});
      ChangeInput.id = "change_"+index;
      if(!PortalEval.params.AllowEdition) ChangeInput.style.fontStyle = "italic";
      ChangeInput.onclick = function(){
        PortalEval.functions.processThatLineChanges(index);
      }
      TD5.appendChild(ChangeInput);
      TD5.appendChild(document.createElement("br")); 
      var CancelInput = PortalEval.functions.createInput({type:"button",value:PortalEval.texts.GoCancelOneText,title:PortalEval.texts.GoCancelOneTitle});
      CancelInput.id = "cancel_"+index;
      CancelInput.onclick = function(){
          PortalEval.functions.updateThatLine(index, pagedatas, true);
      }
      TD5.appendChild(CancelInput); 
      PortalEval.functions.disableThings([ ChangeInput, CancelInput ], true);
      TR.appendChild(TD1);
      TR.appendChild(TD2);
      TR.appendChild(TD3);
      TR.appendChild(TD4);
      TR.appendChild(TD5);
      if(PortalEval.params.AutoLaunchPreview) PortalEval.functions.previewPage(title, index);
      return TR;
    },
    updateAdjSelect : function(type, index, count, def){ // type = "", "M", "F"
      var Hidden = document.getElementById("adjHidden_"+count+"_"+index);
      if(!Hidden){
        form = document.createElement("span");
        form.id = "AdjForm_"+count+"_"+index;
        Hidden = PortalEval.functions.createInput({type:"hidden"});
        Hidden.id = "adjHidden_"+count+"_"+index;
        form.appendChild(Hidden);
        var HiddenType = PortalEval.functions.createInput({type:"hidden",value:type});
        HiddenType.id = "TypeadjHidden_"+count+"_"+index;
        form.appendChild(HiddenType);
        var Select = document.createElement("select");
        Select.id = "adjSelect_"+count+"_"+index;
        Select.name = "adjHidden_"+count+"_"+index;
        Select.className = "adj";
        Select.style.width = PortalEval.params.StubThemeWidth+"px";
        form.appendChild(Select);
        Select.onchange = function(){
          var Select = this;
          var val = Select.value;
          var defval = document.getElementById(Select.name).value;
          if(val == defval) $(Select).removeClass("Modified");
          else $(Select).addClass("Modified");
          PortalEval.functions.setChangeCancelOneSTUBInputDisabled(this, count, index);
        }
      }else{
        var Select = Hidden.parentNode.getElementsByTagName('select')[0];
        while(Select.firstChild){ Select.removeChild(Select.firstChild); }
      }
      var opt = document.createElement('option');
      opt.innerHTML = "";
      opt.value = -1;
      Select.appendChild(opt);
      $(Select).removeClass("M");  
      $(Select).removeClass("F");
      if(type !== null){
        $(Select).addClass(type);        
        var list = PortalEval.params[("StubAdj"+type)];
        for(var a=0,l=list.length;a<l;a++){
          var thisadj = list[a];
          var opt = document.createElement('option');
          opt.innerHTML = thisadj;
          opt.value = a;
          if(thisadj == def){
            opt.selected = "selected";
            Hidden.value = opt.value;
          }
          Select.appendChild(opt);
        }
      }
      return form;
    },
    getStubAdjType : function(STUBtheme){
      var type = null;
      var theme = PortalEval.params.StubThemes[STUBtheme];
      if(!theme) return null;
      var catpattern = theme.categ;
      if(catpattern){
        if(catpattern.indexOf("<adj>")!=-1) type = "M";
        if(catpattern.indexOf("<adjF>")!=-1) type = "F";
      }
      return type;
    },
    getAdjDatas : function(STUBtheme){
      var adjDatas = {type:null, adj:"", strippedtheme:STUBtheme};
      var adjTypes = ["M", "F"];
      for(var t=0,tlen=adjTypes.length;t<tlen;t++){
        var thistype = adjTypes[t];
        var adjList = PortalEval.params[("StubAdj"+thistype)];
        for(var a=0,l=adjList.length;a<l;a++){
          var thisadj = adjList[a];
          if(STUBtheme.indexOf(" "+thisadj) != -1){
            var catpattern = STUBtheme.split(" "+thisadj).join(" <adj"+(thistype=="F"?"F":"")+">"); 
            var strippedtheme = STUBtheme.split(" "+thisadj).join(""); 
            var realtheme1 = PortalEval.params.StubThemes[PortalEval.functions.lcFirst(strippedtheme)];
            var realtheme2 = PortalEval.params.StubThemes[PortalEval.functions.ucFirst(strippedtheme)];
            if(typeof(realtheme1) != "undefined"){
              adjDatas.type = thistype;
              adjDatas.adj = thisadj;
              adjDatas.strippedtheme = PortalEval.functions.lcFirst(strippedtheme);
              if(!realtheme1.categ) PortalEval.params.StubThemes[PortalEval.functions.lcFirst(strippedtheme)].categ = catpattern;
            }else if(typeof(realtheme2) != "undefined"){
              adjDatas.type = thistype;
              adjDatas.adj = thisadj;
              adjDatas.strippedtheme = PortalEval.functions.ucFirst(strippedtheme);
              if(!realtheme2.categ) PortalEval.params.StubThemes[PortalEval.functions.ucFirst(strippedtheme)].categ = catpattern;
            }
          }
        }
      }
      return adjDatas;
    },
    createStubSelect : function(index, count){
      var thisstub = PortalEval.params.PageList[index].stub[count];
      var STUBthemeDatas = PortalEval.functions.getAdjDatas(thisstub);
      var form = document.createElement("form");
      form.onsubmit = function(){ return false; };
      form.id = "STUBform_"+count+"_"+index;
      form.className = "Stub";
      form.style.whiteSpace = "nowrap";
      var Hidden = PortalEval.functions.createInput({type:"hidden"});
      Hidden.id = "Ébauche_"+count+"_"+index;
      form.appendChild(Hidden); 
      var Select = document.createElement("select");
      Select.name = "Ébauche_"+count+"_"+index;
      Select.style.width = PortalEval.params.StubThemeWidth+"px";
      Select.onchange = function(){
        PortalEval.functions.checkStubFormChanged(this, count, index);
      }
      form.appendChild(Select);
      var allthemes = PortalEval.functions.sortTextList(Object.keys(PortalEval.params.StubThemes));
      for(var a=0,l=allthemes.length;a<l;a++){
        var thistheme = allthemes[a];
        var themedatas = PortalEval.params.StubThemes[thistheme];
        var opt = document.createElement('option');
        opt.innerHTML = thistheme;
        opt.value = thistheme;
        if(thistheme == STUBthemeDatas.strippedtheme){
          opt.selected = "selected";
          Hidden.value = opt.value;
        }
        Select.appendChild(opt);
      }
      var type = ( STUBthemeDatas.type || PortalEval.functions.getStubAdjType(STUBthemeDatas.strippedtheme));
      form.appendChild(PortalEval.functions.updateAdjSelect(type, index, count, STUBthemeDatas.adj));
      var suplink = PortalEval.functions.createInput({type:"button",value:PortalEval.texts.DeleteSTUBText,title:PortalEval.texts.DeleteSTUBTitle});
      suplink.onclick = function(){
        var F = this.parentNode;
        thisSelect = F.getElementsByTagName("select")[0];
        F.style.display = "none";
        $(F).addClass("Removed");
        PortalEval.functions.checkStubFormNumbers(index);
        PortalEval.functions.setChangeCancelOneSTUBInputDisabled(this, count, index);
      }
      form.appendChild(document.createTextNode(" "));
      form.appendChild(suplink);
      return form;
    },
    getSelectCountValue : function(TD, index, classname, prefix){
      var count = 0;
      var OK = false;
      var counts = [];
      var AllForms = TD.getElementsByTagName('form');
      for(var a=0,l=AllForms.length;a<l;a++){
        if( $(AllForms[a]).hasClass(classname) ){
          var ID = AllForms[a].id;
          ID = ID.split(prefix+"_").join("");
          ID = parseInt(ID.split("_"+index).join(""));
          counts.push(ID);
        }
      }
      while(!OK){
        if(counts.indexOf(count)===-1){
          OK = true;
          break;
        }
        count++;
      }
      return count;
    },
    addOneStubForm : function(index){
      var AddStubForm = document.getElementById("STUBadd_"+index);
      var TD = AddStubForm.parentNode;
      var count = PortalEval.functions.getSelectCountValue(TD, index, "Stub", "STUBform");
      var form = document.createElement("form");
      form.onsubmit = function(){ return false; };
      form.id = "STUBform_"+count+"_"+index;
      form.className = "Stub Modified Added";
      form.style.whiteSpace = "nowrap";
      var Hidden = PortalEval.functions.createInput({type:"hidden",value:"."});
      Hidden.id = "Ébauche NEW_"+count+"_"+index;
      form.appendChild(Hidden);
      var Select = document.createElement("select");
      Select.name = "Ébauche NEW_"+count+"_"+index;
      $(Select).addClass("Modified");
      Select.style.width = PortalEval.params.StubThemeWidth+"px";
      var allthemes = PortalEval.functions.sortTextList(Object.keys(PortalEval.params.StubThemes));
      for(var a=0,l=allthemes.length;a<l;a++){
        var thistheme = allthemes[a];
        var opt = document.createElement('option');
        opt.innerHTML = thistheme;
        opt.value = thistheme;
        if(a == 0) opt.selected = "selected";
        Select.appendChild(opt);
        allthemes.push(thistheme);
      }
      Select.onchange = function(){
        PortalEval.functions.checkStubFormChanged(this, count, index);
      }
      form.appendChild(Select);
      form.appendChild(PortalEval.functions.updateAdjSelect(null, index, count, ""));
      var suplink = PortalEval.functions.createInput({type:"button",value:PortalEval.texts.DeleteSTUBText,title:PortalEval.texts.DeleteSTUBTitle});
      suplink.onclick = function(){
        var F = this.parentNode;
        F.parentNode.removeChild(F);
        PortalEval.functions.checkStubFormNumbers(index);
        PortalEval.functions.setChangeCancelOneInputDisabled(index);
      }
      form.appendChild(document.createTextNode(" "));
      form.appendChild(suplink);
      AddStubForm.parentNode.insertBefore(form, AddStubForm);
      PortalEval.functions.checkStubFormNumbers(index);
      PortalEval.functions.setChangeCancelOneSTUBInputDisabled(Select, count, index);
      Select.focus();
    },
    checkStubFormChanged : function(Select, count, index){
        var val = Select.value;
        var defval = document.getElementById(Select.name).value;
        var adjSelect = document.getElementById("adjSelect_"+count+"_"+index);
        var adjHidden = document.getElementById("adjHidden_"+count+"_"+index);
        var Oldtype = null;
        var def = -1;
        if($(adjSelect).hasClass("M")) Oldtype = "M";  
        if($(adjSelect).hasClass("F")) Oldtype = "F";  
        var NewType = PortalEval.functions.getStubAdjType(val);
        if(NewType!=null){
          var paramAdj = PortalEval.params[("StubAdj"+NewType)];
          if(Oldtype != null) def = paramAdj[adjSelect.value];
          else def = paramAdj[adjHidden.value];
        }
        if(val == defval && !$(Select.parentNode).hasClass("Added")) $(Select).removeClass("Modified");
        else $(Select).addClass("Modified");
        PortalEval.functions.updateAdjSelect(NewType, index, count, def);
        PortalEval.functions.setChangeCancelOneSTUBInputDisabled(Select, count, index);
    },
    checkStubFormNumbers : function(index){
      var AddStubForm = document.getElementById("STUBadd_"+index);
      var TD = AddStubForm.parentNode;
      var count = 0;
      var AllForms = TD.getElementsByTagName('form');
      for(var a=0,l=AllForms.length;a<l;a++){
        if( $(AllForms[a]).hasClass("Stub") && !$(AllForms[a]).hasClass("Removed") ) count++
      }
      if(count>5) AddStubForm.style.display = "none";
      else AddStubForm.style.display = "";
    },
    setChangeCancelOneSTUBInputDisabled : function(Select, count, index){
      var Form = Select.parentNode;
      while(Form.tagName.toLowerCase() != "form") Form = Form.parentNode;
      var Selects = Form.getElementsByTagName('select');
      $(Form).removeClass("Modified");
      for(var a=0,l=Selects.length;a<l;a++){
        if($(Selects[a]).hasClass("Modified") || $(Form).hasClass("Removed")) $(Form).addClass("Modified");
      }
      PortalEval.functions.setChangeCancelOneInputDisabled(index);
    },
    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";
      form.className = "Eval";
      var Hidden = PortalEval.functions.createInput({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 = PortalEval.functions.createInput({type:"button",value:PortalEval.texts.DeleteIMPText,title:PortalEval.texts.DeleteIMPTitle});
      suplink.onclick = function(){
        var F = this.parentNode;
        thisSelect = F.getElementsByTagName("select")[0];
        PortalEval.functions.disableThings([ thisSelect ], true);
        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 F = Select.parentNode;
      if(val == defval) $(F).removeClass("Modified");
      else $(F).addClass("Modified");
      PortalEval.functions.setChangeCancelOneInputDisabled(index);
    },
    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");
      PortalEval.functions.disableThings([ CancelInput, ChangeInput ], dis);
      PortalEval.functions.setChangeCancelInputDisabled();
    },
    createAVTSelect : function(evalAVT, index, empty){
      var form = document.createElement("form");
      form.onsubmit = function(){ return false; };
      form.style.whiteSpace = "nowrap";
      var Hidden = PortalEval.functions.createInput({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 F = Select.parentNode;
        if(val == defval) $(F).removeClass("Modified");
        else $(F).addClass("Modified");
        PortalEval.functions.setChangeCancelOneInputDisabled(index);
      }
      form.appendChild(Select);      
      return form;
    },
    setChangeCancelInputDisabled : function() {
      var BoardList = document.getElementById("PortalEvalBoardList");
      var ChangeInput = document.getElementById("GlobalChangeInput");
      var CancelInput = document.getElementById("GlobalCancelInput");
      var ListInput = document.getElementById("PortalEval_OptionPortalInput");
      if(!BoardList || !ChangeInput || !CancelInput || !ListInput) return;
      var ChangeNumber = 0;
      var TRs = BoardList.getElementsByTagName('tr');
      for(var a=0,l=TRs.length;a<l;a++){
        if($(TRs[a]).hasClass("Modified")) ChangeNumber++
      }
      if(ChangeNumber > 0){
        ChangeInput.title = PortalEval.texts.GoChangeTitle.split("$1").join(ChangeNumber+" ");
        CancelInput.title = PortalEval.texts.GoCancelTitle.split("$1").join(ChangeNumber+" ");
        PortalEval.functions.disableThings([ ChangeInput, CancelInput ], false);
        PortalEval.functions.disableThings([ ListInput ], true);
      }else{
        ChangeInput.title = PortalEval.texts.GoChangeTitle.split("$1").join("");
        CancelInput.title = PortalEval.texts.GoCancelTitle.split("$1").join("");
        PortalEval.functions.disableThings([ ChangeInput, CancelInput ], true);
        PortalEval.functions.disableThings([ ListInput ], false);
      }
    },
    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, ""));
        if(!$(TR).hasClass('Modified')) continue;
        PortalEval.functions.updateThatLine(index, PortalEval.params.PageList[index], true);
      }
    },
    addOneIMPForm : function(index){
      var AddIMPForm = document.getElementById("IMPadd_"+index);
      var TD = AddIMPForm.parentNode;
      var count = PortalEval.functions.getSelectCountValue(TD, index, "Eval", "IMPform");
      var form = document.createElement("form");
      form.onsubmit = function(){ return false; };
      form.id = "IMPform_"+count+"_"+index;
      form.className = "Eval Modified Added";
      form.style.whiteSpace = "nowrap";
      var Hidden = PortalEval.functions.createInput({type:"hidden",value:"."});
      form.appendChild(Hidden); 
      Hidden.id = "IMP_"+count+"_"+index;
      var ThemeSelect = PortalEval.functions.createThemeSelect();
      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 = PortalEval.functions.createInput({type:"button",value:PortalEval.texts.DeleteIMPText,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);
      PortalEval.functions.setChangeCancelOneIMPInputDisabled(Select, count, index);
      ThemeSelect.focus();
    },
    createSortSelect : function(DefaultSort, SortHidden){
      var SortSelect = document.createElement('select');
      var SortOptions = PortalEval.params.SortOptions;
      var SortTypes = ["UP","DOWN"];
      for(var a=0,l=SortOptions.length;a<l;a++){
        var SortOption = SortOptions[a];
        for(var t=0,tlen=SortTypes.length;t<tlen;t++){
          var SortType = SortTypes[t];
          var SortValue = SortOption+"_"+SortType;
          var opt = document.createElement('option');
          opt.innerHTML = PortalEval.texts[("Sort"+SortType+"Arrow")].split("$1").join(PortalEval.texts[SortOption]);
          opt.title = PortalEval.texts[("Sort"+SortType+"Tip")].split("$1").join(PortalEval.texts[(SortOption+"Tip")]);
          opt.value = SortValue;
          SortSelect.appendChild(opt);
          if((a==0 && t==0) || SortValue==DefaultSort){
            opt.selected = "selected";
            if(SortHidden) SortHidden.value = opt.value;
          }
        }
      }
      return SortSelect;
    },
    sortTextList : function(textlist) {
      return textlist.sort(function(a,b){ var A = [PortalEval.functions.deleteAccents(b.toLowerCase()),PortalEval.functions.deleteAccents(a.toLowerCase())].sort(); return ( A[1] == PortalEval.functions.deleteAccents(a.toLowerCase()) ? 1 : -1 ); });
    },
    sortPages : function(selectvalue, portal) {
      PortalEval.functions.alertControl(PortalEval.texts.AlertMsgSort);
      var getsortFunc = {
        SortDS    : function(a,b){ var A = [b[1],a[1]].sort(); return ( A[0] == a[1] ? 1 : -1 ); },
        SortTitle : function(a,b){ var A = [b[1],a[1]].sort(); return ( A[0] == a[1] ? 1 : -1 ); },
        SortStub  : function(a,b){ return (b[1] - a[1]); },
        SortAVT   : function(a,b){ return (a[1] - b[1]); },
        SortIMP   : function(a,b){ return (a[1] - b[1]); }
      };
      var getsortParam = {
        SortDS    : function(p, a){ return a; },
        SortTitle : function(p){ return PortalEval.functions.deleteAccents(p.title); },
        SortStub  : function(p){ return (p.stub && p.stub.length > 0 ? p.stub.length : 0); },
        SortAVT   : function(p){ return (typeof(p.evalAVT)=="number" ? p.evalAVT : 99 ); },
        SortIMP   : function(p, a, portal) { return (p.allIMP && typeof(p.allIMP[portal])=="number" ? p.allIMP[portal] : 99); }
      };
      var down = selectvalue.indexOf("_DOWN")!==-1;
      var type = selectvalue.replace(/_.*/g, "");
      var func = getsortFunc[type];
      var NewPageList = [];
      var PageList = PortalEval.params.PageList;
      for(var a=0, l=PageList.length;a<l;a++){
        NewPageList.push([ a, getsortParam[type](PageList[a], a, portal) ]);
      }
      NewPageList = NewPageList.sort(func);
      for(var a=0, l=NewPageList.length;a<l;a++){
        var index = NewPageList[a][0];
        var TR = document.getElementById("IDtr_"+index);
        if(!TR) continue;
        var target = TR.parentNode;
        target.removeChild(TR);
        if(down) target.appendChild(TR); 
        else target.insertBefore(TR, target.firstChild.nextSibling); 
      }
      PortalEval.functions.alertControl();
    },
    processThatLineChanges : function(index){
      PortalEval.functions.closePreview(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 : OldParams.talkmissing,
        allIMP : {}
      };
      var ChangeInput = document.getElementById("change_"+index);
      var CancelInput = document.getElementById("cancel_"+index);
      if(PortalEval.params.AllowEdition) PortalEval.functions.disableThings([ ChangeInput, CancelInput ], true);
      var talkpageedit = false, pageedit = false;
      var Forms = TR.getElementsByTagName('form');
      for(var a=0,l=Forms.length;a<l;a++){
        var thisForm = Forms[a];
        if($(thisForm).hasClass("Removed")){
          if($(thisForm).hasClass("Stub")) pageedit = true;
          if($(thisForm).hasClass("Eval")) talkpageedit = true;
          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(PortalEval.params.AllowEdition && ["button","text"].indexOf(ThisInput)!=-1) PortalEval.functions.disableThings([ ThisInput ], true);
        }
        var Selects = thisForm.getElementsByTagName("select");
        if(PortalEval.params.AllowEdition) PortalEval.functions.disableThings( Selects, true);
        for(var s=0,slen=Selects.length;s<slen;s++){
          var ThisSelect = Selects[s];
          var SelectValue = ThisSelect.value;
          var SelectName = ThisSelect.name;
          if(SelectName == "Avancement"){
            if($(thisForm).hasClass("Modified")) talkpageedit = true;
            NewParams.evalAVT = parseInt(SelectValue);
          }else if(SelectName == "Importance NEW"){
            var ThemeSelect = Selects[(s-1)];
            var thisportal = ThemeSelect.value;
            if(thisportal != ""){
              talkpageedit = true;
              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($(thisForm).hasClass("Modified")) talkpageedit = true;            
            if($(Label).hasClass("portal")) NewParams.evalIMP = parseInt(SelectValue);
            NewParams.allIMP[Label.innerHTML] = parseInt(SelectValue);
          }else if(SelectName.indexOf("Ébauche")==0){
            if($(thisForm).hasClass("Modified")){
              pageedit = true;
              if(!NewParams.stub) NewParams.stub = [];
            }
            var StubTheme = ThisSelect.value;
            if(StubTheme != ""){
              StubThemeParams = PortalEval.params.StubThemes[StubTheme];
              var catPattern = StubThemeParams.categ;
              if(catPattern){
                catPattern = PortalEval.functions.ucFirst(catPattern);
                var AdjSelect = document.getElementById(SelectName.split("Ébauche").join("adjSelect").split(" NEW").join(""));
                var type = null;
                if($(AdjSelect).hasClass("M")) type = "M";  
                if($(AdjSelect).hasClass("F")) type = "F";
                var adjID = AdjSelect.value;
                if(type && adjID != "-1"){
                  var adj = PortalEval.params[("StubAdj"+type)][adjID];
                  if(adj){
                    type = type.replace(/M/, "");
                    StubTheme = catPattern.split("<adj"+type+">").join(adj);
                  }
                }
              }
              if(!NewParams.stub) NewParams.stub = [];
              NewParams.stub.push(StubTheme);
            }
          }
        }
      }
      if(PortalEval.params.AllowEdition && (talkpageedit || pageedit)){
        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);
      }
      if(talkpageedit){
        NewParams.talkmissing = 0;
        var NewEvalWikitext = "{{"+PortalEval.params.EvalTemplate+"\n";
        for(var imp in NewParams.allIMP){
          NewEvalWikitext += "|"+imp+"|"+PortalEval.params.Importance[NewParams.allIMP[imp]].wiki+"\n"
        }
        NewEvalWikitext += "|avancement="+PortalEval.params.Avancement[NewParams.evalAVT].wiki+"\n"
        var OldEvalWikitext = OldParams.evalWT;
        if(OldEvalWikitext){
          OldEvalWikitext = OldEvalWikitext.split("\n").join("");
          OldEvalWikitext = OldEvalWikitext.split("|");
          for(var a=1,l=OldEvalWikitext.length;a<l;a++){
            var thisparam = OldEvalWikitext[a].split("}}").join("");
            if(thisparam.indexOf("=")===-1) continue;
            if(thisparam.indexOf("avancement")!==-1) continue;
            NewEvalWikitext += "|"+thisparam+"\n";     
          }   
        }
        NewEvalWikitext += "}}";
        NewParams.evalWT = NewEvalWikitext;
        if(PortalEval.params.AllowEdition){
          PortalEval.functions.updatePage(index, OldParams, NewParams, false);
        }else{
          var OldEvalWikitext = ( OldParams.evalWT ? OldParams.evalWT : "");
          alert(PortalEval.texts.NoEdition.split("$1").join(OldEvalWikitext).split("$2").join(NewEvalWikitext));
        }
      }
      if(pageedit){
        var NewStubWikitext = "";
        if(NewParams.stub && NewParams.stub.length > 0 ){
          NewStubWikitext = "{{"+PortalEval.params.StubTemplate;
          NewStubWikitext += "|"+NewParams.stub.join("|");
          var OldStubWikitext = OldParams.stubWT;
          if(OldStubWikitext){
            OldStubWikitext = OldStubWikitext.split("\n").join("");
            OldStubWikitext = OldStubWikitext.split("|");
            for(var a=1,l=OldStubWikitext.length;a<l;a++){
              var thisparam = OldStubWikitext[a].split("}}").join("");
              if(thisparam.indexOf("{{")!==-1) continue;
              if(thisparam.indexOf("=")===-1) continue;
              NewStubWikitext += "|"+thisparam;     
            }
          }
          NewStubWikitext += "}}";
        }
        NewParams.stubWT = NewStubWikitext;
        if(PortalEval.params.AllowEdition){
          PortalEval.functions.updatePage(index, OldParams, NewParams, true);
        }else{
          var OldStubWikitext = ( OldParams.stubWT ? OldParams.stubWT : "");
          alert(PortalEval.texts.NoEdition.split("$1").join(OldStubWikitext).split("$2").join(NewStubWikitext));
        }
      }
    },
    updatePage : function(index, OldParams, NewParams, main){
      if(main) PortalEval.params.StubEditsRunning[index] = true;
      else PortalEval.params.EvalEditsRunning[index] = true;  
      var page = (main ? NewParams.title : NewParams.talktitle);
      $.ajax({
        url: mw.util.wikiScript('api'),
        data: {
          action:'query',prop:'revisions',
          rvlimit : 1,
          rvprop: 'timestamp|content',
          titles: page,
          rvsection: 0,
          format: 'json',
        },
        success: function(data) {
          var timestamp = ( (!main && OldParams.talkmissing) ? 'now' : data.query.pages[Object.keys(data.query.pages)[0]].revisions[0].timestamp );
          var func = (main ? "updateMainPage" : "updateTalkpage");
          var NewWikitext = PortalEval.functions[func](OldParams, NewParams, data);
          var summary = PortalEval.texts[(main ? "StubResume" : "EvalResume")];
          var template = NewParams[(main ? "stubWT" : "evalWT")].split("\n").join("");
          $.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: page,
                text: NewWikitext,
                summary: summary.split("$docpage").join(PortalEval.params.DocPage).split("$template").join(template),
                basetimestamp: timestamp,
                section: 0,
                format: 'json',
                token: data.query.tokens.csrftoken
              },
              dataType: 'json',
              success: function(data){
                if(main) PortalEval.params.StubEditsRunning[index] = false;
                else PortalEval.params.EvalEditsRunning[index] = false;
                if(!PortalEval.params.StubEditsRunning[index] && !PortalEval.params.EvalEditsRunning[index]){
                  PortalEval.functions.updateThatLine(index, NewParams);
                }
              }
            });
          });
        }
      });
    },
    updateMainPage : function(OldParams, NewParams, data){
      var OldWikitext = data.query.pages[Object.keys(data.query.pages)[0]].revisions[0]["*"];
      var NewWikitext = "";
      var Reg = new RegExp("\\{\\{ *"+PortalEval.params.StubTemplate+"[^\\{]*\\}\\}", "ig");
      var matches = OldWikitext.match(Reg);
      if(matches == null) NewWikitext = NewParams.stubWT + "\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.stubWT);
          }
        }
      }
      NewWikitext = NewWikitext.replace(/^\\n/g, "").replace(/\\n\\n\\n/g, "\n\n");
      return NewWikitext;
    },
    updateTalkpage : function(OldParams, NewParams, data){
      var NewWikitext = "";
      if(OldParams.talkmissing){
        NewWikitext = NewParams.evalWT;
      }else{
        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);
            }
          }
        }
        NewWikitext = NewWikitext.replace(/^\\n/g, "").replace(/\\n\\n\\n/g, "\n\n");
      }
      return NewWikitext;
    },
    updateThatLine : function(index, NewParams, KeepPreview){
      PortalEval.params.PageList[index] = NewParams;
      if(!KeepPreview){
        delete PortalEval.params.PreviewSaved[NewParams.title];
        delete PortalEval.params.PreviewSaved[NewParams.talktitle];
      }
      var portal = document.getElementById("PortalEval_OptionPortal").value;
      var OldTR = document.getElementById("IDtr_"+index);
      while(OldTR.firstChild){ OldTR.removeChild(OldTR.firstChild); }
      var target = OldTR.parentNode;
      var NewTR = PortalEval.functions.fillBoardLine(index, portal);
      target.insertBefore(NewTR, OldTR);
      target.removeChild(OldTR);
      PortalEval.functions.setChangeCancelOneInputDisabled(index);
    },
    preloadPage : function(title, index, callback){
      var 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";
      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');
        var IDs = PortalEval.params.DivIDsToPreview;
        for(var a=0,l=Divs.length;a<l;a++){
          var thisDiv = Divs[a];
          if(!thisDiv) continue;
          if(thisDiv.id && IDs.indexOf(thisDiv.id) !==-1) previewDiv.appendChild(thisDiv);
        }
        TEMP.parentNode.removeChild(TEMP);
        PortalEval.functions.enhancePreview(previewDiv);
        PortalEval.params.PreviewSaved[title] = previewDiv;
        if(typeof(callback)==="function") callback(title, index);
      }});
    },
    previewPage : function(title, index){
      var TR = document.getElementById("IDtr_"+index);
      var TD1 = TR.getElementsByTagName('td')[0];
      var previewDiv = document.getElementById("previewDiv_"+index);
      if(!previewDiv){
        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";
        TD1.appendChild(previewDiv);
        var closespan = document.createElement('span');
        closespan.style.float = "right";
        closespan.id = "closespan_"+index;
        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); return false; }
        closespan.appendChild(closelink);
      }
      if(PortalEval.params.PreviewSaved[title]){
        var SavedpreviewDiv = PortalEval.params.PreviewSaved[title];
        previewDiv.parentNode.insertBefore(SavedpreviewDiv, previewDiv);
        previewDiv.parentNode.removeChild(previewDiv);
      }else{
        var RunningIcon = '<img width="16"  height="16" src="'+PortalEval.params.ImageURL + PortalEval.params.RunningIcon+'" />';
        previewDiv.innerHTML = PortalEval.texts.AlertMsgPreview.split("$running").join(RunningIcon);
        PortalEval.functions.preloadPage(title, index, PortalEval.functions.previewPage);
      }
    },
    enhancePreview : function(previewDiv){ // See MediaWiki:Commons.js
/*
      try{ mw.hook( 'wikipage.content' ).fire( previewDiv ); }catch(e){ console.warn("enhancePreview()\n mw.hook()\n------\n"+e.message); }
      try{ window.Palette([ previewDiv ]);         }catch(e){ console.warn("enhancePreview()\n Palette()\n------\n"+e.message); }
      try{ window.BoiteDeroulante([ previewDiv ]); }catch(e){ console.warn("enhancePreview()\n BoiteDeroulante()\n------\n"+e.message); }
      try{ window.GeoBox_Init([ previewDiv ]);     }catch(e){ console.warn("enhancePreview()\n GeoBox_Init()\n------\n"+e.message); }
*/
    },
    updownPreview(val, previewDiv){
      var oldval = parseInt(previewDiv.style.maxHeight.split("px").join(""));
      var newval = (oldval+val);
      if(newval<0) newval = 0;
      previewDiv.style.maxHeight = newval + "px";
    },
    closePreview : function(index, link){
      var previewDiv = document.getElementById("previewDiv_"+index);
      if(previewDiv) previewDiv.parentNode.removeChild(previewDiv);
      var link = document.getElementById("closespan_"+index);
      if(link) link.parentNode.removeChild(link);
    },
    getUserSubPage : function() {
      if(PortalEval.params.OptionsSubPageOK) return;
      var Page = mw.config.get('wgFormattedNamespaces')[2]+':'+mw.config.get('wgUserName')+'/'+PortalEval.params.OptionsSubPage+'.js';
      $.ajax({
        url: mw.util.wikiScript('api'),
        data: {
          action: 'query',prop:'revisions',
          rvlimit : 1,
          rvprop: 'ids',
          titles: Page,
          format: 'json',
        },
        success: function(data) {
          var revisions = data.query.pages[Object.keys(data.query.pages)[0]].revisions;
          if(!revisions){
            PortalEval.params.OptionsSubPageOK = true;
            PortalEval.functions.disableThings([ "GlobalOptionsInput" ], (!(PortalEval.params.EvalThemesOK && PortalEval.params.OptionsSubPageOK)));
          }else{
            var oldid = revisions[0].revid;
            PortalEval.functions.getUserParams(Page, oldid);
          }
        }
      });
    },
    getUserParams : function(Page, oldid) {
      var URL = mw.config.get('wgServer')+mw.config.get('wgScript')+'?title='+Page+'&action=raw&oldid='+oldid;
      $.ajax({url:URL, complete: function(Req){
        var Text = Req.responseText;
        var CommentStart = PortalEval.params.OptionsPageCommentStart;
        var CommentEnd = PortalEval.params.OptionsPageCommentEnd;
        var More = (Text.indexOf(CommentStart) != -1 && Text.indexOf(CommentEnd) != -1);
        if(More){
          var MoreParams = Text.split(CommentStart)[1];
          if(MoreParams.indexOf(CommentEnd) != -1){
            MoreParams = MoreParams.split(CommentEnd)[0];
            MoreParams = MoreParams.replace(/^\n/g, "");
            MoreParams = MoreParams.replace(/\n$/g, "");
            PortalEval.params.OptionsMoreParams = MoreParams;
          }
        }
        PortalEval.params.OptionsSubPageOK = true;
        PortalEval.functions.disableThings([ "GlobalOptionsInput" ], false);
      }});
    },
    setDefaultParams : function() {
      PortalEval.params.DEFAULTparams = {};
      var EditableParams = PortalEval.params.EditableParams;
      for(var a=0,l=EditableParams.length;a<l;a++){
        var paramname = EditableParams[a];
        PortalEval.params.DEFAULTparams[paramname] = PortalEval.params[paramname];
      }
      PortalEval.params.DEFAULTtexts = {};
      var Texts = PortalEval.texts;
      for(var textname in Texts){
        PortalEval.params.DEFAULTtexts[textname] = Texts[textname];
      }
    },
    getCustomParams : function() {
      var customFunc = ["Lang", "Site", "User"];
      for(var a=0,l=customFunc.length;a<l;a++){
        var funcName = "PortalEval_"+customFunc[a]+"Custom";        
        if(typeof(window[funcName])==="function") try{ window[funcName](); }catch(e){ console.warn(funcName+"()\n------\n"+e.message); }
      }
    },
    addlink : function() {
      var portlet = document.getElementById(PortalEval.params.LinkPortletID);
      if(!portlet)return;
      var tabs = portlet.getElementsByTagName('li')[0];
      var newli = document.createElement('li');
      newli.id = 'ca-eval';
      tabs.parentNode.appendChild(newli);

      var link = PortalEval.functions.createLink(null, {
        text  : PortalEval.texts.LinkText,
        title : PortalEval.texts.LinkTitle,
        href  : "javascript:PortalEval.functions.createCategoryBoard();"
      });
      link.id = 'ca-eval-category';
      newli.appendChild(link);
      var Slink = PortalEval.functions.createLink("Special:PortalEval/"+mw.config.get('wgTitle'), {
        text  : PortalEval.texts.SpecialpageText,
        title : PortalEval.texts.SpecialpageTip,
      });
      Slink.id = 'ca-eval-special';
      newli.appendChild(Slink);
    },
    addlinktoSpecialpage(){
      var Content = document.getElementById('mw-content-text');
      var Divs = Content.getElementsByTagName('div');
      var divcount = 0;
      for(var a=0,l=Divs.length;a<l;a++){
        var Div = Divs[a];
        if(!$(Div).hasClass("mw-specialpages-list")) continue;
        divcount++
        if(divcount != 10) continue;
        var UL = Div.getElementsByTagName('ul')[0];
        if(!UL) continue;
        var LI = document.createElement('li');
        UL.appendChild(LI);
        LI.appendChild(PortalEval.functions.createLink(mw.config.get('wgFormattedNamespaces')[-1]+":PortalEval",{text:PortalEval.texts.SpecialpageName}));
      }
    },
    launch : function() {
      var custom = mw.config.get('wgServer')+mw.config.get('wgScript') + '?title='
                 + mw.config.get('wgFormattedNamespaces')[2]+':'+mw.config.get('wgUserName')+'/'+PortalEval.params.OptionsSubPage+'.js'
                 + '&action=raw&ctype=text/javascript';
      $.when.apply( null, $.map([ custom ], function ( url ) {
        return $.ajax({ url: url, dataType: 'script', cache: true });
      })).done(function(){
        PortalEval.functions.setDefaultParams();
        PortalEval.functions.getCustomParams();
        var LaunchThis = PortalEval.functions.getLaunchCondition();
        if(LaunchThis === 1) PortalEval.functions.addlink();
        if(LaunchThis === 2) PortalEval.functions.prepareSpecialpage();
        if(LaunchThis === 3) PortalEval.functions.addlinktoSpecialpage();
      }); 
    },
    getLaunchCondition : function() { 
      if(mw.config.get('wgServer') !== '//fr.wikipedia.org') return false;
      if(mw.config.get('wgNamespaceNumber')==14 && ["edit","submit"].indexOf(mw.config.get('wgAction')) === -1) return 1;
      var Title = mw.config.get('wgTitle');
      if(mw.config.get('wgNamespaceNumber')==-1 && (Title == "PortalEval" || Title.indexOf("PortalEval/")!=-1)) return 2;
      if(mw.config.get('wgCanonicalSpecialPageName')==="Specialpages") return 3;
      return false;
    }
  }
}

if( PortalEval.functions.getLaunchCondition()){
    mw.loader.using(['mediawiki.util', 'mediawiki.api'], function(){ 
      mw.loader.addStyleTag(""
      + "#p-cactions #ca-eval-category { padding-right:0.2em; }"
      + "#p-cactions #ca-eval-special  { padding-left:0.2em; }"
      + "#PortalEvalOptionsFS .mw-redirect { green !important }"
      + "#PortalEvalOptionsFS li { list-style:none; }"
      + "#PortalEvalOptionsFS li:hover { background-color:#eaecf0; }"
      + "#PortalEvalMainOptionsFS { padding: 0;margin:0; }"
      + "#PortalEvalMainOptionsFS fieldset { display:inline;margin:0 1em 0.5em 1em;padding:0.2em;background-color:#f8f8f8; }"
      + "#PortalEvalMainOptionsFS legend { margin:0;padding:0; }"
      + "#PortalEvalMainOptionsFS fieldset:hover { background-color:#eaecf0; }"
      + "#PortalEvalBoard fieldset { border:1px solid #a2a9b1;}"
      + "#PortalEvalBoardList tr:hover td { background-color:#eaecf0; }"
      + "#PortalEvalBoard table.evaltable :not(.navbox .infobox_v2) th { background-color: #eaecf0;border:1px solid #a2a9b1; }"
      + "#PortalEvalBoard table.evaltable :not(.navbox .infobox_v2) td { background-color: #ffffff;border:1px solid #a2a9b1; }"
      + "#fieldsetActions #PortalEval_OptionSort, #fieldsetActions #GlobalChangeInput, #fieldsetActions #GlobalOptionsInput { margin-left:1em; }"
      + "#fieldsetCat form input[type=text] { margin-bottom:0.5em; }"
      + "#CatParentsDiv ul {list-style: none;margin-left: 0; }"
      + "#Pinfos b { color:#002bb8; }"
      + "#Pinfos.nocat b { color:red !important; }"
      + "#PortalEvalBoardControlRunning { margin-left:1em; }"
      + "#PortalEvalBoard abbr { text-decoration:none !important; }"
      );
      $(PortalEval.functions.launch); 
    });
}

//</source>