User:OldBee/MassEval.js

From Meta, a Wikimedia project coordination wiki

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.
// Ci-dessous le début du script. Seule la partie personnalisable est transcluse. [[{{fullurl:{{FULLPAGENAME}}|action=purge}} purger]]<noinclude>

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

//<source lang=javascript>
window.MassEval = {
/* ############################### PARTIE PERSONNALISABLE ############################### </source></noinclude>__TOC__

== Textes ==

=== Textes de l'interface ===

<source lang=javascript> // ------------------------------- Textes ------------------------------- */
  texts : {

// Liens en haut de page
    "LinkText"              : "Évaluer",
    "LinkPageTitle"         : "Vérifier l’évaluation de cette page",
    "LinkCatTitle"          : "Vérifier l’évaluation des articles de cette catégorie",
    "LinkLinksTitle"        : "Vérifier l’évaluation des liens de la page",
    "LinkLinkshereTitle"    : "Vérifier l’évaluation des pages pointant vers cette page",
    "LinkTemplateTitle"     : "Vérifier l’évaluation des pages incluant le modèle",
    "LinkNewpagesTitle"     : "Vérifier l’évaluation des nouvelles pages",
    "LinkCreationsTitle"    : "Vérifier l’évaluation des articles créés par l’utilisateur",
    "LinkPrefixindexTitle"  : "Vérifier l’évaluation des pages commençant par...",

// Page spéciale
    "SpecialpageName"       : "Évaluation de masse",
    "SpecialpageNameH"      : "$1 — Wikipédia",
    "contentSubTemplate"    : "← $1",

// Formulaires principaux
    "Warning"               : "Ce script en cours de maintenance. Son fonctionnement n’est pas garanti !",
    "Show"                  : "(+)",
    "ShowTip"               : "Afficher",
    "Hide"                  : "(-)",
    "HideTip"               : "Masquer",

  // Thème d'évaluation
    "EvalTheme"             : "Thème d’évaluation",
    "Portal"                : "Portail associé",
    "UpdateTableEvalText"   : "Màj",
    "UpdateTableEvalTip"    : "Mettre à jour le tableau",
    "AVT"                   : "Avancement",
    "IMP"                   : "Importance",
    "ThemeCats"             : "Catégories liées",
    "TableEvalTotal"        : "Total",

  // Modes
    "Modes"                 : "Mode",
    "MainNamespace"         : "- Articles -",
    "TimeDateLabel"         : "Horodatage",

  // Informations sur la page ou l'utilisateur
    "INFOmissing"           : "Page inexistante ?",
    "INFOpageid"            : "Identifiant de la page",
    "INFOns"                : "Espace de noms",
    "INFOtitle"             : "Titre",
    "INFOcontentmodel"      : "Type de contenu",
    "INFOpagelanguage"      : "Language du contenu",
    "INFOtouched"           : "Dernière mise à jour",
    "INFOlastrevid"         : "Identifiant de la dernière version",
    "INFOlength"            : "Taille (octets)",
    "INFOprotection"        : "Protections",
    "INFOwatched"           : "Page suivie ?",
    "INFOwatchers"          : "Nombre de suiveurs",
    "INFOvisitingwatchers"  : "Nombre de suiveurs ayant visité la dernière révision",
    "INFOsubjectid"         : "Identifiant de la page principale",
    "INFOtalkid"            : "Identifiant de la page de discussion",
    "INFOuserid"            : "Identifiant de l’utilisateur",
    "INFOname"              : "Nom",
    "INFOeditcount"         : "Compteur d’éditions",
    "INFOregistration"      : "Date d’enregistrement",
    "INFOgroups"            : "Groupes",
    "INFOgender"            : "Genre",
    "INFOgenderunknown"     : "inconnu",
    "INFOgenderfemale"      : "féminin",
    "INFOgendermale"        : "masculin",
    "TimeDateTemplate"      : "le $j $m $a à $h:$min",

  // Page
    "pageMode"              : "Page",
    "PageLabel"             : "Titre de la page",
    "PageInfosLabel"        : "Informations sur la page",
    "pageExistsNo"          : "La page $page n’existe pas.",
    "pageExistsYes"         : "La page $page existe",

  // Catégorie
    "catMode"               : "Catégorie", 
    "SubCatTitle"           : "Inclure les sous-catégories $count",
    "CatDaughters"          : "Catégorie filles",
    "CatParents"            : "Catégorie parentes",
    "HiddenCat"             : "Catégorie cachée",
    "CatExistsNo"           : "La catégorie $cat n’existe pas.",
    "CatExistsYes"          : "La catégorie $cat comprend :",
    "CatPages"              : "$1 page(s)",
    "CatCats"               : "$1 catégorie(s)",
    "CatButtonClosed"       : "►",
    "CatButtonExpand"       : "Développer",
    "CatButtonOpened"       : "▼",
    "CatButtonHide"         : "Réduire",
    "CatInfos"              : " → $1 $P, $2 $C",
    "CatInfosNOP"           : " → $2 $C",
    "CatInfosNOC"           : " → $1 $P",
    "CatAllPagesCount"      : "$1 $P",
    "CatInfosPageTip"       : "Pages",
    "CatInfosCatTip"        : "Catégories",
    "CatInfosPageText"      : "P",
    "CatInfosCatText"       : "C",
    "SubCatDepthText"       : "Niveau : ",
    "SelectCat"             : "Sélectionner la catégorie : $1",
    "TooMuchSubCatsSel"     : "La catégorie $1 n’est pas sélectionnable car elle contient trop de sous-catégories (plus de $limit)",
    "TooMuchSubCatsExp"     : "La catégorie $1 n’est pas expansible car elle contient trop de sous-catégories (plus de $limit)",
    "CatDoesntExistSel"     : "La catégorie $1 n’est pas sélectionnable car elle n’existe pas",

  // Liens
    "linksMode"             : "Liens", 
    "LinksLabel"            : "Titre de la page",
    "LinksInfosLabel"       : "Informations sur la page",
    "linksExistsNo"         : "La page $page n’existe pas.",
    "linksExistsYes"        : "La page $page comprend :",
    "linksInfos"            : "$1 lien(s)",

  // Pages liées
    "linkshereMode"         : "Pages liées", 
    "LinkshereLabel"        : "Titre de la page",
    "LinkshereInfosLabel"   : "Informations sur la page",
    "linkshereExistsNo"     : "La page $page n’existe pas.",
    "linkshereExistsYes"    : "La page $page a :",
    "linkshereInfos"        : "$1 page(s) liée(s)",

  // Inclusions
    "templateMode"          : "Inclusions", 
    "TemplateLabel"         : "Nom du modèle",
    "TemplateInfosLabel"    : "Informations sur le modèle",
    "TemplateDocLabel"      : "Documentation du modèle",
    "templateExistsNo"      : "Le modèle $page n’existe pas.",
    "templateExistsYes"     : "Le modèle $page est inclus dans :",
    "templateInfos"         : "$1 page(s)",

  // Nouvelles pages
    "newpagesMode"          : "Nouvelles pages",
    "newpagesInfosLabel"    : "Liste des nouvelles pages",
    "newpagesExistsYes"     : "Il y a :",
    "newpagesExistsNo"      : "Il n’y a pas de nouvelles pages.",
    "newpagesInfos"         : "$1 nouvelle(s) page(s)",

  // Créations
    "creationsMode"         : "Créations", 
    "UserLabel"             : "Nom de l’utilisateur",
    "UserInfosLabel"        : "Informations sur l’utilisateur",
    "creationsExistsNo"     : "L’utilisateur $page n’existe pas.",
    "creationsExistsYes"    : "L’utilisateur $page a créé :",
    "creationsInfos"        : "$1 page(s)",

  // Pages commençant par
    "prefixesMode"          : "Préfixe",
    "PrefixLabel"           : "Préfixe",
    "prefixesInfosLabel"    : "Liste des pages",
    "prefixesExistsYes"     : "Il y existe :",
    "prefixesExistsNo"      : "Il n’y a pas de pages commençant par \"$1\".",
    "prefixesInfos"         : "$1 page(s) commençant par \"$2\".",

  // Filtrage
    "Search"                : "Options de filtrage",
    "RangeViewerTip"        : "Pages sélectionnées pour la vérification.\nCliquer pour toutes les sélectionner.",
    "RangeSelectorTip"      : "Faire glisser pour choisir quelles pages vérifier",
    "RangeSelectorTempl"    : "$from ↔ $to",
    "STUB"                  : "Bandeau d’ébauche",
    "YES"                   : "Oui",
    "NO"                    : "Non",
    "AVTOptNone"            : "Aucun",
    "IMPOptNone"            : "Aucune",
    "SearchAND"             : "ET",
    "SearchOR"              : "OU",
    "FilteredCount"         : "$shown / $total",
    "NotFilteredCount"      : "Nombre de lignes affichées par rapport au total de lignes.\nCliquer pour tout afficher.",

  // Actions
    "Actions"               : "Actions",
    "GoListText"            : "Vérifier l’évaluation",
    "GoVerifOne"            : "Vérifier l’évaluation de la page",
    "GoVerifCat"            : "Vérifier l’évaluation des pages de la catégorie",
    "GoVerifLinks"          : "Vérifier l’évaluation des pages en liens dans la page",
    "GoVerifLinkshere"      : "Vérifier l’évaluation des pages pointant vers cette page",
    "GoVerifTemplate"       : "Vérifier l’évaluation des pages incluant le modèle",
    "GoVerifNewpages"       : "Vérifier l’évaluation des nouvelles pages",
    "GoVerifCreations"      : "Vérifier l’évaluation des articles créés par l’utilisateur",
    "GoVerifPrefixes"       : "Vérifier l’évaluation des articles commançant par...",
    "EmergencyStop"         : "Arrêter d’urgence la requête en cours",
    "GoAddEvalText"         : "Ajouter une évaluation",
    "GoAddOne"              : "Ajouter une évaluation à la page",
    "GoAddCat"              : "Ajouter une évaluation aux pages de la catégorie ciblée.",
    "GoAddLinks"            : "Ajouter une évaluation aux pages en liens dans la page ciblée.",
    "GoAddLinkshere"        : "Ajouter une évaluation aux pages pointant vers la page ciblée.",
    "GoAddTemplate"         : "Ajouter une évaluation aux pages incluant le modèle ciblé.",
    "GoAddNewpages"         : "Ajouter une évaluation aux nouvelles pages.",
    "GoAddCreations"        : "Ajouter une évaluation aux articles créés par l’utilisateur ciblé.",
    "GoAddPrefixes"         : "Ajouter une évaluation aux articles commançant par...",
    "GoAddCancelText"       : "◄",
    "GoAddCancelTip"        : "Annuler l’ajout d’évaluation",
    "GoChangeText"          : "Valider",
    "GoChangeTitle"         : "Valider les $1changements d’évaluation de page",
    "GoCancelText"          : "Annuler",
    "GoCancelTitle"         : "Annuler les $1changements d’évaluation de page",
    "GoOptionsText"         : "Options",
    "GoOptionsTitle"        : "Modifier les options",
    "GoDocText"             : "Documentation",
    "GoDocTitle"            : "Ouvrir la page de documentation (nouvel onglet)",
    "GoCloseTitle"          : "Fermer",

// Tableau des pages
    "PageListTable"         : "Tableau des pages",
    "SortTitleUP"           : "Tri selon le titre de la page (alphabétique)",
    "SortTitleDOWN"         : "Tri selon le titre de la page (alphabétique inversé",
    "SortStubUP"            : "Tri selon le nombre de thèmes d’ébauche (croissant)",
    "SortStubDOWN"          : "Tri selon le nombre de thèmes d’ébauche (décroissant)",
    "SortAVTUP"             : "Tri selon l’avancement (du moins avancé au plus avancé)",
    "SortAVTDOWN"           : "Tri selon l’avancement (du plus avancé au moins avancé)",
    "SortIMPUP"             : "Tri selon l’importance dans le thème sélectionné (du moins important au plus important)",
    "SortIMPDOWN"           : "Tri selon l’importance dans le thème sélectionné (du plus important au moins important)",
    "SortUPArrow"           : "▲",
    "SortDOWNArrow"         : "▼",
    "TH0text"               : "Page", 
    "TH1text"               : "Portails", 
    "TH2text"               : "Bandeau d’ébauche", 
    "TH3text"               : "Avancement", 
    "TH4text"               : "Importances", 
    "TH5text"               : "Actions",
    "TalkText"              : "D",
    "PreviewText"           : "$1 (prévisualiser)",
    "RedirectText"          : "Redirection vers la page : $page",
    "DisambigTitle"         : "Homonymie",
    "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",
    "GoHideOneText"         : "Masquer",
    "GoHideOneTitle"        : "Masquer les informations sur cette page",
    "GoShowOneText"         : "Afficher",
    "GoShowOneTitle"        : "Afficher les informations sur cette page",
    "bottomlinkstemplate"   : "▲ $1 ▲",

// Édition
    "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",
    "EvalResume"            : "[[$docpage|Mise à jour de l’évaluation]] : $template",
    "StubResume"            : "[[$docpage|Mise à jour du bandeau d’ébauche]] : $template",
    "SaveParamsResume"      : "[[$docpage|Sauvegarde des paramètres]]",

// Messages d'alerte
    "AlertMsgNone"          : "Pas de requête en cours",
    "AlertMsgStopNeeded"    : "Arrêt d’urgence demandé",
    "AlertMsgStopDone"      : "Arrêt d’urgence effectué",
    "AlertMsgThemes"        : "Listage des thèmes d’ébauche et d’évaluation",
    "AlertMsgPages"         : "$cat : Listage des pages ($count)",
    "AlertMsgParams"        : "$page : Recherche des paramètres d’ébauche et d’évaluation ($count)",
    "AlertMsgSort"          : "Tri des lignes",
    "AlertMsgSaveParams"    : "Sauvegarde des options personnalisées sur la page $page",
    "AlertMsgPreview"       : "$running Chargement de la prévisualisation",
    "AlertMsgCatAnalys"     : "Analyse des pages de la catégorie : $cat",
    "AlertMsgLinks"         : "Analyse des pages liées dans la page : $page",
    "AlertMsgLinkshere"     : "Analyse des pages pointant vers la page : $page",
    "AlertMsgTemplate"      : "Analyse des inclusions du modèle : $template",
    "AlertMsgNewpages"      : "Analyse des nouvelles pages",
    "AlertMsgCreations"     : "Analyse des pages créées par l’utilisateur : $user",
    "AlertMsgPrefixes"      : "Analyse des pages commençant par : $1",
    "AlertMsgEvals"         : "Analyse des évaluations du thème $theme",
    "AlertMsgEdit"          : "$page : Édition",
    "AlertMsgFilterSTUB"    : "Vous devez sélectionner au moins une option de bandeau d’ébauche !",
    "AlertMsgFilterAVT"     : "Vous devez sélectionner au moins une option de bandeau d’évaluation d’avancement !",
    "AlertMsgFilterIMP"     : "Vous devez sélectionner au moins une option de bandeau d’évaluation d’importance !",
    "AlertMsgSizeUnit"      : "Un champ de texte attend une valeur en unité de longueur valable ($units) !",
    "AlertMsgColorInput"    : "Un champ de texte attend un code couleur exprimé en hexadécimal de 3 ou 6 digits précédés d’un #",

// Menu d'options
    "OptionValidate"        : "Valider les changements",
    "OptionValidateTip"     : "Valider les changements d’options",
    "OptionSubPageText"     : "?",
    "OptionSubPageTip"      : "Ouvrir la sous-page de configuration : $page (nouvel onglet)",
    "DefButtonText"         : "RAZ",
    "DefButtonTitle"        : "Rétablir la valeur par défaut : $1",
    "GlobDefButtonText"     : "RAZ",
    "GlobDefButtonTitle"    : "Rétablir les valeurs par défaut : $1",
    "params"                : "Paramètres",
    "styles"                : "Styles CSS",
    "texts"                 : "Textes",
    "param"                 : "Paramètre personnalisable",
    "readonlyparam"         : "Paramètre non personnalisable",
    "style"                 : "Style CSS",
    "text"                  : "Texte",
    "moreparams"            : "Paramétrage manuel supplémentaire",
    "TestMoreParamsText"    : "Tester",
    "TestMoreParamsTip"     : "Tester le code ci-dessous",
    "MoreParamsTestOK"      : "Pas d’erreur javascript détectée",
    "MoreParamsTestKO"      : "Erreur javascript détectée : $1",
    "OptionModified"        : "Valeur différente de la valeur par défaut",
    "SizeUnitTip"           : "La valeur de ce champ doit impérativement être exprimée en unité de longueur valable ($units)",
    "ColorInput"            : "La valeur de ce champ doit être un code couleur exprimé en hexadécimal de 3 ou 6 digits précédés d’un #",

// Menu des données
    "GoDatasText"           : "Données",
    "GoDatasTitle"          : "Vérifier les données",
    "evaldataUL"            : "Thèmes d’évaluation",
    "stubdataUL"            : "Thèmes d’ébauche",
    "divdataUL"             : "Divers",
    "RAZdataUL"             : "Gestion localStorage",
    "localStorageExpiryT"   : "$h heures et $m mimutes",
    "GoDatasRAZText"        : "Effacer",
    "GoDatasRAZTitle"       : "Effacer les données (cela n’affectera pas la session en cours)",

// Divers
    "Month01"               :"janvier",
    "Month02"               :"février",
    "Month03"               :"mars",
    "Month04"               :"avril",
    "Month05"               :"mai",
    "Month06"               :"juin",
    "Month07"               :"juillet",
    "Month08"               :"août",
    "Month09"               :"septembre",
    "Month10"               :"octobre",
    "Month11"               :"novembre",
    "Month12"               :"décembre",


/* </source><noinclude>// -------------------- Textes de description des textes, styles et paramètres -------------------- </noinclude>

=== Descriptions des paramètres ===

<source lang=javascript> // -------------------- Descriptions des paramètres -------------------- */
    "OPTIONAllowEdition"        : "Permettre l’édition",
    "OPTIONUseTopFormInNS0"     : "Utiliser le formulaire réduit dans les articles et les pages de discussion",
    "OPTIONAutoLaunchPreview"   : "Lancer automatiquement la prévisualisation des pages à la création de la ligne du tableau",
    "OPTIONPreloadPreview"      : "Précharger la prévisualisation des pages",
    "OPTIONAddWarning"          : "Afficher un avertissement en haut de page",
    "OPTIONSearchForPortalTag"  : "Vérifier la présence de bandeaux de portail",
    "OPTIONUseFancyInputs"      : "Utiliser les cases à cocher fantaisie",
    "OPTIONMoreParamsRows"      : "Nombre de ligne du champ de texte pour le paramétrage manuel supplémentaire",
    "OPTIONSuggestSelectSize"   : "Taille de la liste de suggestion de catégories",
    "OPTIONSuggestNumber"       : "Nombre maximum de catégories suggérées",
    "OPTIONKeyUpDelay"          : "Délai en ms avant la prise en compte d’un changement dans un champ de texte",
    "OPTIONMaxSubcatLevel"      : "Niveau maximum pour la recherche dans les sous-catégories",
    "OPTIONMaxSubCatAllowedSel" : "Maximum de sous-catégories qu’une catégorie peut contenir pour être sélectionnable",
    "OPTIONMaxSubCatAllowedExp" : "Maximum de sous-catégories qu’une catégorie peut contenir pour être expansible",
    "OPTIONDefaultPortal"       : "Thème d’évaluation sélectionné 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",
    "OPTIONOKIcon"              : "Image de l’icône \"OK\"",
    "OPTIONRunningIcon"         : "Image de l’icône \"En cours\"",
    "OPTIONWarningIcon"         : "Image de l’icône \"Attention\"",
    "OPTIONStopIcon"            : "Image de l’icône \"Stop\"",
    "OPTIONCloseIcon"           : "Image de l’icône \"Fermer\"",
    "OPTIONRedirectIcon"        : "Image de l’icône \"Redirection\"",
    "OPTIONDisambigIcon"        : "Image de l’icône \"Homonymie\"",
    "OPTIONHiddenCatIcon"       : "Image de l’icône \"Catégorie cachée\"",

/* </source>

=== Descriptions des styles ===

<source lang=javascript> // -------------------- Descriptions des styles -------------------- */

//-- font-family
    "OPTIONMainff"             : "Famille de la police (général)",

//-- font-size
    "OPTIONMainfs"             : "Taille de la police (général)",
    "OPTIONPrvwfs"             : "Taille de la police dans la prévisualisation",
    "OPTIONTempDocfs"          : "Taille de la police de la documentation du modèle",
    "OPTIONPortListfs"         : "Taille de la police de la liste des portails (lignes du tableau des pages)",
    "OPTIONAlertfs"            : "Taille de la police du bandeau de message",

//-- height
    "OPTIONPrvwhght"           : "Hauteur de la fenêtre de prévisualisation",
    "OPTIONCatListhght"        : "Hauteur des cadres déroulants des formulaires \"Modes\"",
    "OPTIONOptImgPrevhght"     : "Hauteur des images prévisualisées (menu des options)",

//-- width
    "OPTIONEvalTableIcowidth"  : "Largeur des images dans la table d’évaluations",
    "OPTIONRunIcowidth"        : "Largeur de l’image \"En cours\"",
    "OPTIONPrevCloseIcowidth"  : "Largeur de l’image \"Fermer\" (prévisualisation)",
    "OPTIONRedirectIcowidth"   : "Largeur de l’image \"Redirection\" (lignes du tableau)",
    "OPTIONDisambigIcowidth"   : "Largeur de l’image \"Homonymie\" (lignes du tableau)",
    "OPTIONHiddenCatIcowidth"  : "Largeur de l’image \"Catégorie cachée\"",
    "OPTIONAlertIcowidth"      : "Largeur de l’image du bandeau de message",
    "OPTIONMainCloseIcowidth"  : "Largeur de l’image \"Fermer\" (bandeau réduit du formulaire des articles)",
    "OPTIONTH2width"           : "Largeur de la colonne \"Portails\"",
    "OPTIONTH3width"           : "Largeur de la colonne \"Bandeau d’ébauche\"",
    "OPTIONTH4width"           : "Largeur de la colonne \"Avancement\"",
    "OPTIONTH5width"           : "Largeur de la colonne \"Importances\"",
    "OPTIONTH6width"           : "Largeur de la colonne \"Actions\"",
    "OPTIONModSelwidth"        : "Largeur des options du sélecteur de modes",
    "OPTIONTimewidth"          : "Largeur des champs de texte d’heure",
    "OPTIONDatewidth"          : "Largeur des champs de texte de date",
    "OPTIONOptcolwdth"         : "Largeur minimum d’une colonne dans les options",
    "OPTIONPIcolwdth"          : "Largeur minimum d’une colonne dans les infos de page",
    "OPTIONTempDocwidth"       : "Largeur de la documentation du modèle",
    "OPTIONOptStrwdth"         : "Largeur des champs de texte dans les options (texte demandé)",
    "OPTIONOptNbrwdth"         : "Largeur des champs de texte dans les options (nombre demandé)",
    "OPTIONOptStywdth"         : "Largeur des champs de texte dans les options (styles)",
    "OPTIONSpeImpCatwdth"      : "Largeur du champ de texte principaux (page spéciale)",
    "OPTIONMainEvalTwidth"     : "Largeur du champ de texte \"Thème d’évaluation\" (hors page spéciale)",
    "OPTIONStubTwidth"         : "Largeur des listes déroulantes des thèmes d’ébauche (thème)",
    "OPTIONStubAwidth"         : "Largeur des listes déroulantes des thèmes d’ébauche (adjectif)",
    "OPTIONAvtwidth"           : "Largeur des listes déroulantes des avancements (colonne \"Avancement\")",
    "OPTIONImpTwidth"          : "Largeur des listes déroulantes des thèmes d’évaluation (colonne \"Importances\")",
    "OPTIONImpwidth"           : "Largeur des listes déroulantes des importance (colonne \"Importances\")",
    "OPTIONEmStopwidth"        : "Diamètre du bouton d’arrêt d’urgence",

//-- border-radius
    "OPTIONWrapperbdr"         : "Arrondi du bandeau d’évaluation (hors page spéciale)",
    "OPTIONSmallFSbdr"         : "Arrondi des formulaires de configuration (hors page spéciale)",
    "OPTIONBigFSbdr"           : "Arrondi des formulaires de configuration (page spéciale)",
    "OPTIONEvalTbdr"           : "Arrondi du tableau d’évaluation",
    "OPTIONModSelbdr"          : "Arrondi des sélecteurs de mode",
    "OPTIONFilSelbdr"          : "Arrondi des options de filtrage",
    "OPTIONFiltAbbrbdr"        : "Arrondi de des afficheurs des options de filtrage",
    "OPTIONLinesTbdr"          : "Arrondi du tableau de vérification",
    "OPTIONSortbdr"            : "Arrondi des liens de tri",
    "OPTIONAlertbdr"           : "Arrondi du bandeau de message",
    "OPTIONImpButbdr"          : "Arrondi des boutons",
    "OPTIONImpTexbdr"          : "Arrondi des champs de texte",
    "OPTIONSelectbdr"          : "Arrondi des listes déroulantes",
    "OPTIONPILIbdr"            : "Arrondi des lignes des infos de page",
    "OPTIONOptLIbdr"           : "Arrondi des lignes des options",
    "OPTIONDTpickbdr"          : "Arrondi des sélecteurs d'horaire et de date",

//-- border-style
    "OPTIONMainbds"            : "Style des bordures (général)",
    "OPTIONWrapperbds"         : "Style de la bordure du bandeau d’évaluation (hors page spéciale)",
    "OPTIONInnerbds"           : "Style des bordures intérieures des formulaires (page spéciale)",
    "OPTIONFiltAbbrbds"        : "Style de la bordure des afficheurs des options de filtrage",
    "OPTIONAlertbds"           : "Style de la bordure du bandeau de message",
    "OPTIONPrvwbds"            : "Style de la bordure supérieure de la prévisualisation",

//-- border-color
    "OPTIONMainbdc"            : "Couleur des bordures (général)",
    "OPTIONWrapperbdc"         : "Couleur de la bordure du bandeau d’évaluation (hors page spéciale)",
    "OPTIONFiltAbbrMbdc"       : "Couleur de la bordure des afficheurs des options de filtrage (actif)",
    "OPTIONPILIbdc"            : "Couleur de la bordure des infos de page",
    "OPTIONHoverPILIbdc"       : "Couleur de la bordure des infos de page (au survol)",
    "OPTIONTHListbdc"          : "Couleur de la bordure des en-têtes du tableau de vérification",
    "OPTIONSortbdc"            : "Couleur de la bordure des liens de tri",
    "OPTIONLinesbdc"           : "Couleur de la bordure des lignes du tableau de vérification",
    "OPTIONAlertbdc"           : "Couleur de la bordure du bandeau de message",
    "OPTIONOptLIbdc"           : "Couleur de la bordure des lignes des options",
    "OPTIONHoverOptLIbdc"      : "Couleur de la bordure des lignes des options (au survol)",
    "OPTIONDTpickCSelbdc"      : "Couleur de la bordure des éléments sélectionnés (sélecteurs d'horaire et de date)",

//-- background-color
    "OPTIONMainbgc"            : "Couleur d’arrière plan du bandeau d’évaluation (hors page spéciale)",
    "OPTIONSmallFSbgc"         : "Couleur d’arrière plan des formulaires de configuration (hors page spéciale)",
    "OPTIONBigFSbgc"           : "Couleur d’arrière plan des formulaires de configuration (page spéciale)",
    "OPTIONModSelbgc"          : "Couleur d’arrière plan des sélecteurs de modes", 
    "OPTIONHoverModSelbgc"     : "Couleur d’arrière plan des sélecteurs de modes (au survol)", 
    "OPTIONModSelCurrbgc"      : "Couleur d’arrière plan du sélecteur de modes activé",
    "OPTIONHoverModSelCurrbgc" : "Couleur d’arrière plan du sélecteur de modes activé (au survol)",
    "OPTIONPILIbgc"            : "Couleur d’arrière plan des infos de page",
    "OPTIONHoverPILIbgc"       : "Couleur d’arrière plan des infos de page (au survol)",
    "OPTIONFiltNSbgc"          : "Couleur d’arrière plan du sélecteur de pages (partie non sélectionnée)",
    "OPTIONFiltSbgc"           : "Couleur d’arrière plan du sélecteur de pages (partie sélectionnée)",
    "OPTIONFiltDISbgc"         : "Couleur d’arrière plan du sélecteur de pages (désactivé)",
    "OPTIONFiltAbbrbgc"        : "Couleur d’arrière plan des afficheurs des options de filtrage (inactif)",
    "OPTIONFiltAbbrMbgc"       : "Couleur d’arrière plan des afficheurs des options de filtrage (actif)",
    "OPTIONTHListbgc"          : "Couleur d’arrière plan des en-têtes du tableau de vérification",
    "OPTIONSortbgc"            : "Couleur d’arrière plan des liens de tri",
    "OPTIONLinesbgc"           : "Couleur d’arrière plan des lignes du tableau de vérification",
    "OPTIONHoverLinesbgc"      : "Couleur d’arrière plan des lignes du tableau de vérification (au survol)",
    "OPTIONPrvwbgc"            : "Couleur d’arrière plan de la prévisualisation",
    "OPTIONImpButbgc"          : "Couleur d’arrière plan des boutons",
    "OPTIONImpButDisbgc"       : "Couleur d’arrière plan des boutons désactivés",
    "OPTIONImpTexbgc"          : "Couleur d’arrière plan des champs de texte et des listes déroulantes",
    "OPTIONImpTexDisbgc"       : "Couleur d’arrière plan des champs de texte et des listes déroulantes désactivés",
    "OPTIONAlertbgc"           : "Couleur d’arrière plan du bandeau de message",
    "OPTIONOptLIbgc"           : "Couleur d’arrière plan des lignes des options",
    "OPTIONHoverOptLIbgc"      : "Couleur d’arrière plan des lignes des options (au survol)",
    "OPTIONOptLIMbgc"          : "Couleur d’arrière plan des lignes des options modifiées",
    "OPTIONHoverOptLIMbgc"     : "Couleur d’arrière plan des lignes des options modifiées (au survol)",
    "OPTIONDTpickbgc"          : "Couleur d’arrière plan des sélecteurs d'horaire et de date",
    "OPTIONDTpickCbgc"         : "Couleur d’arrière plan de l’intérieur des sélecteurs d'horaire et de date",
    "OPTIONDTpickCSelbgc"      : "Couleur d’arrière plan des éléments sélectionnés (sélecteurs d'horaire et de date)",
    "OPTIONHoverDTpickCbgc"    : "Couleur d’arrière plan des éléments au survol (sélecteurs d'horaire et de date)",

//-- color
    "OPTIONMaincol"            : "Couleur du texte (général)",
    "OPTIONLinkscol"           : "Couleur des liens (général)",
    "OPTIONSortcol"            : "Couleur des liens de tri",
    "OPTIONAlertcol"           : "Couleur du texte du bandeau de message",
    "OPTIONDTpickDiscol"       : "Couleur du texte des éléments inactifs (sélecteurs d'horaire et de date)",
    "OPTIONDTpickUnSelcol"     : "Couleur du texte des éléments non sélectionnables (sélecteurs d'horaire et de date)",


/*</source>

=== Descriptions des textes ===

<source lang=javascript> // -------------------- Descriptions des textes -------------------- */

// Liens en haut de page
    "OPTIONLinkText"             : "Intitulé du lien \"Évaluer\"",
    "OPTIONLinkCatTitle"         : "Infobulle du lien \"Évaluer\" (catégories)",
    "OPTIONLinkPageTitle"        : "Infobulle du lien \"Évaluer\" (articles et pages de discussion)",
    "OPTIONLinkLinksTitle"       : "Infobulle du lien \"Évaluer\" (sous-page utilisateur)",
    "OPTIONLinkLinkshereTitle"   : "Infobulle du lien \"Évaluer\" (pages pointant vers cette page)",
    "OPTIONLinkTemplateTitle"    : "Infobulle du lien \"Évaluer\" (modèles)",
    "OPTIONLinkNewpagesTitle"    : "Infobulle du lien \"Évaluer\" (nouvelles pages)",
    "OPTIONLinkCreationsTitle"   : "Infobulle du lien \"Évaluer\" (créations de l’utilisateur)",
    "OPTIONLinkPrefixindexTitle" : "Infobulle du lien \"Évaluer\" (préfixe)",

// Page spéciale
    "OPTIONSpecialpageName"      : "Titre de la page spéciale",
    "OPTIONSpecialpageNameH"     : "Modèle du titre de l’onglet du navigateur",
    "OPTIONcontentSubTemplate"   : "Modèle pour l’élément \"contentSub\"",

// Formulaires principaux
    "OPTIONWarning"              : "Message d’avertissement",
    "OPTIONShow"                 : "Intitulé du lien \"Afficher\"",
    "OPTIONShowTip"              : "Infobulle du lien \"Afficher\"",
    "OPTIONHide"                 : "Intitulé du lien \"Masquer\"",
    "OPTIONHideTip"              : "Infobulle du lien \"Masquer\"",

  // Thème d'évaluation
    "OPTIONEvalTheme"            : "Label du formulaire \"Thèmes d’évaluation\"",
    "OPTIONPortal"               : "Label du sélecteur de portail",
    "OPTIONTableEvalTotal"       : "Texte \"Total\" dans le tableau d’évaluation",
    "OPTIONIMP"                  : "Texte \"Importance\" dans le tableau d’évaluation",
    "OPTIONAVT"                  : "Texte \"Avancement\" dans le tableau d’évaluation",
    "OPTIONUpdateTableEvalText"  : "Intitulé du bouton pour mettre à jour le tableau d’évaluation",
    "OPTIONUpdateTableEvalTip"   : "Infobulle du bouton pour mettre à jour le tableau d’évaluation",
    "OPTIONThemeCats"            : "Label du tableau des catégories liées",

  // Modes
    "OPTIONModes"                : "Label du formulaire \"Mode\"",
    "OPTIONMainNamespace"        : "Nom de l’espace de noms principal",
    "OPTIONTimeDateLabel"        : "Label des sélecteurs de timestamp",

  // Informations sur la page ou l'utilisateur,
    "OPTIONINFOmissing"          : "Page inexistante ?",
    "OPTIONINFOpageid"           : "Identifiant de la page",
    "OPTIONINFOns"               : "Espace de noms",
    "OPTIONINFOtitle"            : "Titre",
    "OPTIONINFOcontentmodel"     : "Type de contenu",
    "OPTIONINFOpagelanguage"     : "Language du contenu",
    "OPTIONINFOtouched"          : "Dernière mise à jour",
    "OPTIONINFOlastrevid"        : "Identifiant de la dernière version",
    "OPTIONINFOlength"           : "Taille (octets)",
    "OPTIONINFOprotection"       : "Protections",
    "OPTIONINFOwatched"          : "Page suivie ?",
    "OPTIONINFOwatchers"         : "Nombre de suiveurs",
    "OPTIONINFOvisitingwatchers" : "Nombre de suiveurs ayant visité la dernière révision",
    "OPTIONINFOsubjectid"        : "Identifiant de la page principale",
    "OPTIONINFOtalkid"           : "Identifiant de la page de discussion",
    "OPTIONINFOuserid"           : "Identifiant de l’utilisateur",
    "OPTIONINFOname"             : "Nom",
    "OPTIONINFOeditcount"        : "Compteur d’éditions",
    "OPTIONINFOregistration"     : "Date d’enregistrement",
    "OPTIONINFOgroups"           : "Groupes",
    "OPTIONINFOgender"           : "Genre",
    "OPTIONINFOgenderunknown"    : "inconnu",
    "OPTIONINFOgenderfemale"     : "féminin",
    "OPTIONINFOgendermale"       : "masculin",
    "OPTIONTimeDateTemplate"     : "Modèle pour les timestamps",

  // Page
    "OPTIONpageMode"             : "Label du formulaire \"Page\"",
    "OPTIONPageLabel"            : "Label du champ de texte \"page\"",
    "OPTIONPageInfosLabel"       : "Label de la liste des informations sur la page (mode page)",
    "OPTIONpageExistsNo"         : "Texte d’information pour une page inexistante",
    "OPTIONpageExistsYes"        : "Texte d’information pour une page existante",

  // Catégorie
    "OPTIONcatMode"              : "Label du formulaire \"Catégorie\"",
    "OPTIONSubCatTitle"          : "Infobulle de la case pour inclure ou non les sous-catégories",
    "OPTIONCatDaughters"         : "Titre de la liste des catégorie filles",
    "OPTIONCatParents"           : "Titre de la liste des catégorie parentes",
    "OPTIONHiddenCat"            : "Infobulle  pour une catégorie cachée",
    "OPTIONCatExistsNo"          : "Texte d’information pour une catégorie inexistante",
    "OPTIONCatExistsYes"         : "Texte d’information pour une catégorie existante",
    "OPTIONCatPages"             : "Ligne de décompte des pages",
    "OPTIONCatCats"              : "Ligne de décompte des sous-catégories",
    "OPTIONSelectCat"            : "Infobulle d’un lien de catégorie sélectionnable",
    "OPTIONCatDoesntExistSel"    : "Infobulle d’un lien de catégorie inexistante",
    "OPTIONTooMuchSubCatsSel"    : "Infobulle d’un lien de catégorie non sélectionnable",
    "OPTIONTooMuchSubCatsExp"    : "Infobulle d’un lien d’expansion de catégorie non sélectionnable",
    "OPTIONCatButtonClosed"      : "Texte de la puce des listes de catégories (fermée)",
    "OPTIONCatButtonOpened"      : "Texte de la puce des listes de catégories (ouverte)",
    "OPTIONCatButtonExpand"      : "Infobulle de la puce des listes de catégories (fermée)",
    "OPTIONCatButtonHide"        : "Infobulle de la puce des listes de catégories (ouverte)",
    "OPTIONCatInfos"             : "Modèle d’information des catégories",
    "OPTIONCatInfosNOP"          : "Modèle d’information des catégories (sous-catégories uniquement)",
    "OPTIONCatInfosNOC"          : "Modèle d’information des catégories (pages uniquement)",
    "OPTIONCatAllPagesCount"     : "Modèle d’information pour le nombre total de pages",
    "OPTIONCatInfosPageTip"      : "Tooltip \"Pages\"",
    "OPTIONCatInfosCatTip"       : "Tooltip \"Catégories\"",
    "OPTIONCatInfosPageText"     : "Texte \"Pages\"",
    "OPTIONCatInfosCatText"      : "Texte \"Catégories\"",
    "OPTIONSubCatDepthText"      : "Label du sélecteur de niveau de profondeur des catégories",

  // Liens
    "OPTIONlinksMode"            : "Label du formulaire \"Liens\"",
    "OPTIONLinksLabel"           : "Label du champ de texte \"page\"",
    "OPTIONLinksInfosLabel"      : "Label de la liste des informations sur la page (mode liens)",
    "OPTIONlinksExistsNo"        : "Texte d’information pour une page inexistante (liens)",
    "OPTIONlinksExistsYes"       : "Texte d’information pour une page existante (liens)",
    "OPTIONlinksInfos"           : "Modèle pour le comptage des liens",

  // Pages liées 
    "OPTIONlinkshereMode"        : "Label du formulaire \"Pages liées\"",
    "OPTIONLinkshereLabel"       : "Label du champ de texte \"page\"",
    "OPTIONLinkshereInfosLabel"  : "Label de la liste des informations sur la page (mode pages liées)",
    "OPTIONlinkshereExistsNo"    : "Texte d’information pour une page inexistante (pages liées)",
    "OPTIONlinkshereExistsYes"   : "Texte d’information pour une page existante (pages liées)",
    "OPTIONlinkshereInfos"       : "Modèle pour le comptage des pages liées",

  // Inclusions
    "OPTIONtemplateMode"         : "Label du formulaire \"Inclusions\"",
    "OPTIONTemplateLabel"        : "Label du champ de texte \"modèle\"",
    "OPTIONTemplateInfosLabel"   : "Label de la liste des informations sur le modèle",
    "OPTIONTemplateDocLabel"     : "Label de la documentation du modèle",
    "OPTIONtemplateExistsNo"     : "Texte d’information pour un modèle inexistant",
    "OPTIONtemplateExistsYes"    : "Texte d’information pour un modèle existant",
    "OPTIONtemplateInfos"        : "Modèle pour le comptage des inclusions",

  // Nouvelles pages
    "OPTIONnewpagesMode"         : "Label du formulaire \"Nouvelles pages\"",
    "OPTIONnewpagesInfosLabel"   : "Label de la liste des nouvelles pages",
    "OPTIONnewpagesExistsNo"     : "Texte d’information lorsqu’il n’y a pas de nouvelles pages",
    "OPTIONnewpagesExistsYes"    : "Texte d’information lorsqu’il y a des nouvelles pages",
    "OPTIONnewpagesInfos"        : "$1 nouvelle(s) page(s)",

  // Créations
    "OPTIONcreationsMode"        : "Label du formulaire \"Créations\"",
    "OPTIONUserLabel"            : "Label du champ de texte \"utilisateur\"",
    "OPTIONUserInfosLabel"       : "Label de la liste des informations sur l’utilisateur",
    "OPTIONcreationsExistsNo"    : "Texte d’information pour un utilisateur inexistant",
    "OPTIONcreationsExistsYes"   : "Texte d’information pour un utilisateur existant",
    "OPTIONcreationsInfos"       : "Modèle pour le comptage des créations d’articles",

  // Préfixe
    "OPTIONprefixesMode"         : "Label du formulaire \"Préfixe\"",
    "OPTIONPrefixLabel"          : "Label du champ de texte \"Préfixe\"",
    "OPTIONprefixesInfosLabel"   : "Label de la liste des pages avec préfixe",
    "OPTIONprefixesExistsYes"    : "Texte d’information lorsqu’il y a des pages avec le préfixe",
    "OPTIONprefixesExistsNo"     : "Texte d’information lorsqu’il n’y a pas de pages avec le préfixe",
    "OPTIONprefixesInfos"        : "Modèle pour le comptage des pages avec préfixe",

  // Filtrage
    "OPTIONSearch"               : "Label du formulaire \"Filtrage\"",
    "OPTIONRangeViewerTip"       : "Infobulle de l’afficheur du sélecteur de pages",
    "OPTIONRangeSelectorTip"     : "Infobulle du sélecteur de pages",
    "OPTIONRangeSelectorTempl"   : "Modèle du sélecteur de pages",
    "OPTIONSTUB"                 : "Label du sélecteur de bandeau d’ébauche du formulaire de filtrage",
    "OPTIONYES"                  : "Mot \"Oui\" pour les sélecteurs du formulaire de filtrage (bandeaux d’ébauche)",
    "OPTIONNO"                   : "Mot \"Non\" pour les sélecteurs du formulaire de filtrage (bandeaux d’ébauche)",
    "OPTIONAVTOptNone"           : "Terme désignant l’absence d’évaluation d’avancement",
    "OPTIONIMPOptNone"           : "Terme désignant l’absence d’évaluation d’importance",
    "OPTIONSearchAND"            : "Mot \"et\" pour les sélecteurs du formulaire de filtrage",
    "OPTIONSearchOR"             : "Mot \"ou\" pour les sélecteurs du formulaire de filtrage",
    "OPTIONNotFilteredCount"     : "Infobulle du compteur de lignes non filtrées",
    "OPTIONFilteredCount"        : "Modèle du compteur de lignes non filtrées",

  // Actions
    "OPTIONActions"              : "Label du formulaire \"Actions\"",
    "OPTIONGoListText"           : "Intitulé du bouton \"Vérifier l’évaluation\"",
    "OPTIONGoVerifOne"           : "Infobulle du bouton \"Vérifier l’évaluation\" (page)",
    "OPTIONGoVerifCat"           : "Infobulle du bouton \"Vérifier l’évaluation\" (pages de la catégorie)",
    "OPTIONGoVerifLinks"         : "Infobulle du bouton \"Vérifier l’évaluation\" (pages en lien)",
    "OPTIONGoVerifLinkshere"     : "Infobulle du bouton \"Vérifier l’évaluation\" (pages pointant vers la page",
    "OPTIONGoVerifTemplate"      : "Infobulle du bouton \"Vérifier l’évaluation\" (pages incluant le modèle",
    "OPTIONGoVerifNewpages"      : "Infobulle du bouton \"Vérifier l’évaluation\" (nouvelles pages",
    "OPTIONGoVerifCreations"     : "Infobulle du bouton \"Vérifier l’évaluation\" (articles créés par l’utilisateur",
    "OPTIONGoVerifPrefixes"      : "Infobulle du bouton \"Vérifier l’évaluation\" (préfixe)",
    "OPTIONEmergencyStop"        : "Infobulle du bouton d’arrêt d’urgence",
    "OPTIONGoAddEvalText"        : "Intitulé du bouton \"Ajouter une évaluation\"",
    "OPTIONGoAddOne"             : "Infobulle du bouton \"Ajouter une évaluation\" (page)",
    "OPTIONGoAddCat"             : "Infobulle du bouton \"Ajouter une évaluation\" (pages de la catégorie)",
    "OPTIONGoAddLinks"           : "Infobulle du bouton \"Ajouter une évaluation\" (pages en lien)",
    "OPTIONGoAddLinkshere"       : "Infobulle du bouton \"Ajouter une évaluation\" (pages pointant vers la page)",
    "OPTIONGoAddTemplate"        : "Infobulle du bouton \"Ajouter une évaluation\" (pages incluant le modèle)",
    "OPTIONGoAddNewpages"        : "Infobulle du bouton \"Ajouter une évaluation\" (nouvelles pages)",
    "OPTIONGoAddCreations"       : "Infobulle du bouton \"Ajouter une évaluation\" (articles créés par l’utilisateur)",
    "OPTIONGoAddPrefixes"        : "Infobulle du bouton \"Ajouter une évaluation\" (préfixe)",
    "OPTIONGoAddCancelText"      : "Intitulé du bouton \"Annuler l’ajout d’évaluation\"",
    "OPTIONGoAddCancelTip"       : "Infobulle du bouton \"Annuler l’ajout d’évaluation\"",
    "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\"",
    "OPTIONGoDocText"            : "Intitulé du bouton \"Documentation\"",
    "OPTIONGoDocTitle"           : "Infobulle du bouton \"Documentation\"",
    "OPTIONGoCloseTitle"         : "Infobulle du bouton pour fermer le formulaire",

// Tableau des pages
    "OPTIONPageListTable"        : "Titre du tableau des pages",
    "OPTIONTH0text"              : "Intitulé de la colonne \"Page\"", 
    "OPTIONTH1text"              : "Intitulé de la colonne \"Portails\"", 
    "OPTIONTH2text"              : "Intitulé de la colonne \"Bandeau d’ébauche\"", 
    "OPTIONTH3text"              : "Intitulé de la colonne \"Avancement\"", 
    "OPTIONTH4text"              : "Intitulé de la colonne \"Importances\"", 
    "OPTIONTH5text"              : "Intitulé de la colonne \"Actions\"",
    "OPTIONSortTitleUP"          : "Infobulle du lien pour le tri selon le titre de la page (alphabétique)",
    "OPTIONSortTitleDOWN"        : "Infobulle du lien pour le tri selon le titre de la page (alphabétique inversé",
    "OPTIONSortStubUP"           : "Infobulle du lien pour le tri selon le nombre de thèmes d’ébauche (croissant)",
    "OPTIONSortStubDOWN"         : "Infobulle du lien pour le tri selon le nombre de thèmes d’ébauche (décroissant)",
    "OPTIONSortAVTUP"            : "Infobulle du lien pour le tri selon l’avancement (du moins avancé au plus avancé)",
    "OPTIONSortAVTDOWN"          : "Infobulle du lien pour le tri selon l’avancement (du plus avancé au moins avancé)",
    "OPTIONSortIMPUP"            : "Infobulle du lien pour le tri selon l’importance dans le thème sélectionné (du moins important au plus important)",
    "OPTIONSortIMPDOWN"          : "Infobulle du lien pour le tri selon l’importance dans le thème sélectionné (du plus important au moins important)",
    "OPTIONSortUPArrow"          : "Intitulé du lien pour le tri (up)",
    "OPTIONSortDOWNArrow"        : "Intitulé du lien pour le tri (down)",
    "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\"",
    "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)",
    "OPTIONGoHideOneText"        : "Intitulé du bouton \"Masquer\"",
    "OPTIONGoHideOneTitle"       : "Infobulle du bouton \"Masquer\"",
    "OPTIONGoShowOneText"        : "Intitulé du bouton \"Afficher\"",
    "OPTIONGoShowOneTitle"       : "Infobulle du bouton \"Afficher\"",
    "OPTIONbottomlinkstemplate"  : "Modèle des liens du bas",

// Édition
    "OPTIONNoEdition"            : "Message par défaut lorsque l’édition n’est pas permise",
    "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]]",

// Messages d'alerte
    "OPTIONAlertMsgNone"         : "Infobulle de l'icône \"OK\"",
    "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",
    "OPTIONAlertMsgCatAnalys"    : "Message lors de l’analyse de la catégorie sélectionnée",
    "OPTIONAlertMsgLinks"        : "Message lors de l’analyse des pages liées dans l’article",
    "OPTIONAlertMsgLinkshere"    : "Message lors de l’analyse des pages pointant vers la page",
    "OPTIONAlertMsgTemplate"     : "Message lors de l’analyse des inclusions du modèle",
    "OPTIONAlertMsgNewpages"     : "Message lors de l’analyse des nouvelles pages",
    "OPTIONAlertMsgCreations"    : "Message lors de l’analyse des pages créées par l’utilisateur",
    "OPTIONAlertMsgPrefixes"     : "Message lors de l’analyse des pages commençant par un préfixe",
    "OPTIONAlertMsgEvals"        : "Message lors de l’analyse des évaluations du thème sélectionné",
    "OPTIONAlertMsgEdit"         : "Message lors d’une édition",
    "OPTIONAlertMsgFilterSTUB"   : "Message lorsqu’aucune option de bandeau d’ébauche n’est sélectionnée",
    "OPTIONAlertMsgFilterAVT"    : "Message lorsqu’aucune option de bandeau d’évaluation d’avancement n’est sélectionnée",
    "OPTIONAlertMsgFilterIMP"    : "Message lorsqu’aucune option de bandeau d’évaluation d’importance n’est sélectionnée",
    "OPTIONAlertMsgSizeUnit"     : "Message lorsqu’un champ de texte attendant une valeur en unité de longueur valable n’en contient pas",
    "OPTIONAlertMsgColorInput"   : "Message lorsqu’un champ de texte attendant un code couleur valide n’en contient pas",
    "OPTIONAlertMsgStopNeeded"   : "Message lorsqu’un arrêt d’urgence est demandé",
    "OPTIONAlertMsgStopDone"     : "Message lorsqu’un arrêt d’urgence est effectué",
    "OPTIONOptionValidate"       : "Intitulé du bouton \"Valider les changements\"",
    "OPTIONOptionValidateTip"    : "Infobulle du bouton \"Valider les changements\"",
    "OPTIONOptionSubPageText"    : "Intitulé du bouton pour ouvrir la sous-page de configuration",
    "OPTIONOptionSubPageTip"     : "Infobulle du bouton pour ouvrir la sous-page de configuration",
    "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",

// Menu d'options
    "OPTIONSizeUnitTip"          : "Infobulle d’un champ de texte attendant une valeur en unité de longueur valable",
    "OPTIONColorInput"           : "Infobulle d’un champ de texte attendant un code couleur valable",
    "OPTIONparams"               : "Intitulé du bouton \"Paramètres\"",
    "OPTIONstyles"               : "Intitulé du bouton \"Styles CSS\"",
    "OPTIONtexts"                : "Intitulé du bouton \"Textes\"",
    "OPTIONmoreparams"           : "Intitulé du bouton \"Paramétrage manuel supplémentaire\"",
    "OPTIONparam"                : "Label d’un texte de description d’un paramètre personnalisable",
    "OPTIONreadonlyparam"        : "Label d’un texte de description d’un paramètre non personnalisable",
    "OPTIONstyle"                : "Label d’un texte de description d’un style CSS",
    "OPTIONtext"                 : "Label d’un texte de description d’un texte",
    "OPTIONGlobDefButtonText"    : "Intitulé du bouton pour rétablir les valeurs par défaut de tout un onglet",
    "OPTIONGlobDefButtonTitle"   : "Infobulle du bouton pour rétablir les valeurs par défaut de tout un onglet",
    "OPTIONTestMoreParamsText"   : "Intitulé du bouton pour tester le paramétrage manuel supplémentaire",
    "OPTIONTestMoreParamsTip"    : "Infobulle du bouton pour tester le paramétrage manuel supplémentaire",
    "OPTIONMoreParamsTestOK"     : "Message lorsqu’aucune erreur javascript n’est détectée",
    "OPTIONMoreParamsTestKO"     : "Message lorsqu’une erreur javascript est détectée",

// Menu des données
    "OPTIONGoDatasText"          : "Intitulé de l’onglet \"Données\"",
    "OPTIONGoDatasTitle"         : "Infobulle de l’onglet \"Données\"",
    "OPTIONGoDatasRAZText"       : "Intitulé du bouton pour effacer les données",
    "OPTIONGoDatasRAZTitle"      : "Infobulle du bouton pour effacer les données",
    "OPTIONlocalStorageExpiryT"  : "Modèle pour le temps restant avant expiration",
    "OPTIONevaldataUL"           : "Intitulé de l’onglet \"Thèmes d’évaluation\" (menu des données)",
    "OPTIONstubdataUL"           : "Intitulé de l’onglet \"Thèmes d’ébauche\" (menu des données)",
    "OPTIONdivdataUL"            : "Intitulé de l’onglet \"Divers\" (menu des données)",
    "OPTIONRAZdataUL"            : "Intitulé de l’onglet \"Gestion localStorage\" (menu des données)",

// Divers
    "OPTIONMonth01" : "Nom du mois de janvier",
    "OPTIONMonth02" : "Nom du mois de février",
    "OPTIONMonth03" : "Nom du mois de mars",
    "OPTIONMonth04" : "Nom du mois d’avril",
    "OPTIONMonth05" : "Nom du mois de mai",
    "OPTIONMonth06" : "Nom du mois de juin",
    "OPTIONMonth07" : "Nom du mois de juillet",
    "OPTIONMonth08" : "Nom du mois d’août",
    "OPTIONMonth09" : "Nom du mois de septembre",
    "OPTIONMonth10" : "Nom du mois d’octobre",
    "OPTIONMonth11" : "Nom du mois de novembre",
    "OPTIONMonth12" : "Nom du mois de décembre",


/* </source>

=== Descriptions des données (paramètres non modifiables) ===

<source lang=javascript> // -------------------- Descriptions des données -------------------- */


    "OPTIONEvalTemplate"                 : "Modèle pour l’évaluation",
    "OPTIONEvalThemes"                   : "Liste des thèmes d’évaluation",
    "OPTIONEvalThemesAliasesPage"        : "Page à analyser pour les alias des thèmes d’évaluation",
    "OPTIONEvalThemesAliases"            : "Liste des alias des thèmes d’évaluation",
    "OPTIONEvalCategory"                 : "Catégorie-mère des projets d’évaluation",
    "OPTIONEvalCatPrefixes"              : "Préfixes des projets d’évaluation",
    "OPTIONEvalThemesDefaultCat"         : "Préfixe par défaut pour les catégories d’évaluation",
    "OPTIONEvalThemesUsusualCats"        : "Page à analyser pour les catégories d’évaluation spéciales",
    "OPTIONEvalThemesUnusualCatTemplate" : "Préfixe pour les catégories d’évaluation spéciales",
    "OPTIONEvalCatsPrefixes"             : "Préfixes pour la catégorie-mère des catégories d’évaluation",
    "OPTIONEvalCatsCommonPrefix"         : "Préfixes commun pour la catégorie-mère des catégories d’évaluation",
    "OPTIONEvalThemesCat"                : "Catégories d’évaluation",
    "OPTIONMisplacedEvalThemes"          : "Thème dont les catégories d’évaluation sont mal placées (pas dans une catégorie \"Wikiprojet\")",
    "OPTIONPortalCatTemplate"            : "Modèle pour les catégories de portails",
    "OPTIONPortalList"                   : "Liste des portails",
    "OPTIONAvancement"                   : "Données pour les évaluations d’avancement",
    "OPTIONImportance"                   : "Données pour les évaluations d’importance",

    "OPTIONStubTemplate"                 : "Modèle de bandeau d’ébauche",
    "OPTIONStubThemesPage"               : "Page à analyser pour récupérer les thèmes d’ébauche",
    "OPTIONStubThemes"                   : "Liste des thèmes d’ébauche",
    "OPTIONStubAdjM"                     : "Liste des adjectifs masculins associables aux thèmes d’ébauche",
    "OPTIONStubAdjF"                     : "Liste des adjectifs féminins associables aux thèmes d’ébauche",
    "OPTIONBeforeStubTemplatesCats"      : "Catégories où sont listés des modèles à maintenir au-dessus du bandeau d’ébauche",
    "OPTIONBeforeStubTemplates"          : "Modèles à maintenir au-dessus du bandeau d’ébauche (avec les redirections)",

    "OPTIONMissingTexts"                 : "Textes d’explication manquants",
    "OPTIONUnusedTexts"                  : "Textes d’explication inutilisés",
    "OPTIONModesMap"                     : "Données sur les modes de fonctionnement",
    "OPTIONSortOptions"                  : "Types de tri possibles",
    "OPTIONBorderStyles"                 : "Types de style de bordure possibles",
    "OPTIONSizeUnits"                    : "Unités de mesures autorisées",
    "OPTIONDivIDsToPreview"              : "Identifiants des éléments d’une page à intégrer à la prévisualisation",
    "OPTIONTalkSubPagesToAvoid"          : "Sous-pages de discussion à ne jamais lister",
    "OPTIONAccents"                      : "Lettres accentuées et composées à transformer pour le tri alphabétique",
    "OPTIONFontFamilies"                 : "Familles de polices",
    "OPTIONEvalCatAllpages"              : "Modèle pour les catégories /Articles liés",
    "OPTIONEvalCatStubpages"             : "Modèle pour les catégories d’ébauche",
    "OPTIONSpecialpageName"              : "Titre de la page spéciale",
    "OPTIONOptionsSubPage"               : "Sous-page utilisateur de personnalisation",
    "OPTIONTestPage"                     : "Sous-page utilisateur de  test du mode \"article\"",
    "OPTIONTimeCorrection"               : "Décalage horaire",
    "OPTIONAPILimit"                     : "Limite de requête API",
    "OPTIONlocalStorageExpiry"           : "Délai d’expiration du localStorage (en heures)",
    "OPTIONChangesToMakeDelay"           : "Délai en ms imposé entre deux éditions",

  }, 
/*</source>

== Styles CSS ==

<source lang=javascript> // ------------------------------- Styles CSS modifiables ------------------------------- */
  styles : { 
//-- font-family
    "Mainff"             : "Arial",
//-- font-size
    "Mainfs"             : "100%",
    "Prvwfs"             : "85%",
    "TempDocfs"          : "85%",
    "PortListfs"         : "85%",
    "Alertfs"            : "175%",
//-- height  
    "Prvwhght"           : "250px", 
    "CatListhght"        : "175px", 
    "OptImgPrevhght"     : "50px",
//-- width
    "EvalTableIcowidth"  : "14px",
    "RunIcowidth"        : "16px",
    "PrevCloseIcowidth"  : "16px",
    "RedirectIcowidth"   : "14px",
    "DisambigIcowidth"   : "12px",
    "HiddenCatIcowidth"  : "14px",
    "AlertIcowidth"      : "20px",
    "MainCloseIcowidth"  : "32px",
    "TH2width"           : "140px", 
    "TH3width"           : "240px",     
    "TH4width"           : "125px",      
    "TH5width"           : "300px",       
    "TH6width"           : "80px",
    "ModSelwidth"        : "12%",
    "Timewidth"          : "75px",
    "Datewidth"          : "100px",
    "TempDocwidth"       : "60%",
    "PIcolwdth"          : "600px",
    "Optcolwdth"         : "600px", 
    "OptStrwdth"         : "350px", 
    "OptNbrwdth"         : "50px",  
    "OptStywdth"         : "195px", 
    "SpeImpCatwdth"      : "250px", 
    "MainEvalTwidth"     : "200px", 
    "StubTwidth"         : "100px", 
    "StubAwidth"         : "100px", 
    "Avtwidth"           : "125px", 
    "ImpTwidth"          : "150px", 
    "Impwidth"           : "80px", 
    "EmStopwidth"        : "16px",
//-- border-radius
    "Wrapperbdr"         : "1em",
    "SmallFSbdr"         : "0.5em",
    "BigFSbdr"           : "1em",
    "EvalTbdr"           : "0.5em",
    "ModSelbdr"          : "2em",
    "PILIbdr"            : "0.5em",
    "FiltAbbrbdr"        : "0.25em",
    "FilSelbdr"          : "0.5em",
    "LinesTbdr"          : "0.375em",
    "Sortbdr"            : "0.5em",
    "Alertbdr"           : "5px",
    "ImpButbdr"          : "0.375em",
    "ImpTexbdr"          : "0.375em",
    "Selectbdr"          : "0.375em",
    "OptLIbdr"           : "0.5em",
    "DTpickbdr"          : "10px",
//-- border-style
    "Mainbds"            : "solid",
    "Wrapperbds"         : "solid",
    "Innerbds"           : "dashed",
    "FiltAbbrbds"        : "solid",
    "Alertbds"           : "solid",
    "Prvwbds"            : "dashed",
//-- border-color
    "Mainbdc"            : "#a2a9b1",
    "Wrapperbdc"         : "#a2a9b1",
    "PILIbdc"            : "#dcdcdc",
    "HoverPILIbdc"       : "#a2a9b1",
    "Sortbdc"            : "#a2a9b1",
    "THListbdc"          : "#a2a9b1",
    "Linesbdc"           : "#a2a9b1",
    "FiltAbbrMbdc"       : "#8b0000",
    "OptLIbdc"           : "#dcdcdc",
    "HoverOptLIbdc"      : "#a2a9b1",
    "Alertbdc"           : "#a2a9b1",
    "DTpickCSelbdc"      : "#0095dd",
//-- background-color
    "Mainbgc"            : "#ffffff",
    "SmallFSbgc"         : "#f8f8f8",
    "BigFSbgc"           : "#f8fcff",
    "ModSelbgc"          : "#f8f8f8",
    "HoverModSelbgc"     : "#e0e0e0",
    "ModSelCurrbgc"      : "#eaf7e8",
    "HoverModSelCurrbgc" : "#b2eaa9",
    "FiltAbbrbgc"        : "#f8f8f8",
    "FiltNSbgc"          : "#ff0000",
    "FiltSbgc"           : "#00ff00",
    "FiltDISbgc"         : "#dcdcdc",
    "FiltAbbrMbgc"       : "#ffd700",
    "ImpButbgc"          : "#f0f0f0",
    "ImpButDisbgc"       : "#c7c7c7",
    "ImpTexbgc"          : "#ffffff",
    "ImpTexDisbgc"       : "#f0f0f0",
    "PILIbgc"            : "#fafdff",
    "HoverPILIbgc"       : "#eaecf0",
    "THListbgc"          : "#d3d3d3",
    "Sortbgc"            : "#f8f8f8",
    "Linesbgc"           : "#f8f8f8",
    "HoverLinesbgc"      : "#eaecf0",
    "Prvwbgc"            : "#ffffff",
    "OptLIbgc"           : "#fafdff",
    "HoverOptLIbgc"      : "#eaecf0",
    "OptLIMbgc"          : "#ffffe0",
    "HoverOptLIMbgc"     : "#f0e68c",
    "Alertbgc"           : "#ffffff",
    "DTpickbgc"          : "#f8f8f8",
    "DTpickCbgc"         : "#ffffff",
    "HoverDTpickCbgc"    : "#c0e5f7",
    "DTpickCSelbgc"      : "#e5f2ff",
//-- color
    "Maincol"            : "#000000",
    "Alertcol"           : "#ff0000",
    "Linkscol"           : "#002bb8",
    "Sortcol"            : "#000000",
    "DTpickDiscol"       : "#cccccc",
    "DTpickUnSelcol"     : "#999999",


  },
/*</source>

== Paramètres ==

<source lang=javascript> // ------------------------------- Paramètres modifiables ------------------------------- */
  params : {
    "AllowEdition"        : true,
    "UseTopFormInNS0"     : true,
    "AutoLaunchPreview"   : false,
    "PreloadPreview"      : false,
    "AddWarning"          : false,
    "SearchForPortalTag"  : true,
    "UseFancyInputs"      : false,
    "SuggestSelectSize"   : 4,
    "SuggestNumber"       : 12,
    "KeyUpDelay"          : 500,
    "MaxSubcatLevel"      : 6,
    "MaxSubCatAllowedSel" : 200,
    "MaxSubCatAllowedExp" : 500,
    "MoreParamsRows"      : 20,
    "DefaultPortal"       : "",
    "LinkPortletID"       : "p-cactions",
    "DocPage"             : "m:User:OldBee/MassEval.js/doc/fr",
    "DocURL"              : "https://meta.wikimedia.org/wiki/User:OldBee/MassEval.js/doc/fr",
    "ImageURL"            : "//upload.wikimedia.org/wikipedia/commons/",
    "RunningIcon"         : "2/2a/Loading_Key.gif",
    "OKIcon"              : "thumb/f/fb/Yes_check.svg/32px-Yes_check.svg.png",
    "CloseIcon"           : "thumb/8/80/Icon_no.svg/32px-Icon_no.svg.png",
    "RedirectIcon"        : "thumb/7/71/Symbol_redirect_arrow_with_gradient.svg/32px-Symbol_redirect_arrow_with_gradient.svg.png",
    "DisambigIcon"        : "thumb/c/c3/Disambiguation.svg/32px-Disambiguation.svg.png",
    "HiddenCatIcon"       : "thumb/1/1f/Tools.svg/32px-Tools.svg.png",
    "WarningIcon"         : "thumb/d/d6/Dialog-warning-custom.svg/32px-Dialog-warning-custom.svg.png",
    "StopIcon"            : "thumb/b/b8/Crystal_Project_Logout.png/32px-Crystal_Project_Logout.png",

//</source><noinclude><source lang="javascript">
// ############################### PARTIE NON PERSONNALISABLE ###############################
// ------------------------------- Paramètres non modifiables -------------------------------
    "EditableParams" : [
      "AllowEdition",
      "UseTopFormInNS0",
      "SearchForPortalTag",
      "AutoLaunchPreview",
      "PreloadPreview",
      "AddWarning",
      "UseFancyInputs",
      "SuggestSelectSize",
      "SuggestNumber",
      "KeyUpDelay",
      "MaxSubcatLevel",
      "MaxSubCatAllowedSel",
      "MaxSubCatAllowedExp",
      "MoreParamsRows",
      "DefaultPortal",
      "LinkPortletID",
      "DocPage",
      "DocURL",
      "ImageURL",
      "OKIcon",
      "RunningIcon",
      "WarningIcon",
      "StopIcon",
      "CloseIcon",
      "RedirectIcon",
      "DisambigIcon",
      "HiddenCatIcon",
    ],
    "SpecialpageName" : "MassEval",
    "OptionsSubPage"  : "/MassEvalparams.js",
    "TestPage"        : "/MassEvalTest",
    "EditTag" : "",
    "UserCanTag" : true, // droit MW "applychangetags"
    "AddDeveloperLinks" : false,
    "TimeCorrection" : 0,
    "UserInfosOK" : false,
    "MissingTexts" : [],
    "UnusedTexts" : [],
    "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" , icon : "//upload.wikimedia.org/wikipedia/commons/thumb/6/66/Fairytale_bookmark_gold.svg/14px-Fairytale_bookmark_gold.svg.png"},
      { wiki : "BA",        text : "Bon article",        color : "#66FF66" , icon : "//upload.wikimedia.org/wikipedia/commons/thumb/a/a0/Fairytale_bookmark_silver.svg/14px-Fairytale_bookmark_silver.svg.png"},
      { 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 : "homonymie", text : "Homonymie",          color : "#66ff66" , icon : "//upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Disambiguation.svg/14px-Disambiguation.svg.png" },
      { wiki : "?",         text : "Inconnu",            color : "#666666", textcolor:"white" }      
    ],
    "EvalTemplate"            : "Wikiprojet",
    "EvalTemplatNoCat"        : "|nocat=1\n",
    "EvalCategory"            : "Wikiprojet",
    "EvalCatPrefixes"         : ["Wikiprojet ", "Wikiprojet:"],
    "EvalThemes"              : [],
    "EvalThemesCat"           : {},
    "FakeEvalThemes"          : ["Statistique", "sur le management"],
    "ManuEvalThemes"          : ["GNU/Linux"],
    "MisplacedEvalThemes"     : [ // ----------------------- Liste à réduire ! 
                                  "Disney",
                                  "Time Warner",
                                  "Pologne",
                                  "Cynophilie",
                                  "Nintendo",
                                  "Droits de l'homme",
                                  "URSS",
                                  "Ordre du Temple",
                                  "criminologie",
                                  "protestantisme", 
                                  "Bible", 
                                  "Origine et évolution du vivant", 
                                  "Aude", 
                                  "Képi blanc", 
                                  "Massif du Jura", 
                                  "Var", 
                                  "Alsace", 
                                  "Aube", 
                                  "Matériaux", 
                                  "Bicyclette", 
                                  "Parcs de loisirs", 
                                  "Hautes-Alpes", 
                                  "Brest",
                                  "Hautes-Pyrénées",
                                  "Abbeville", 
                                  "Sécurité civile et sapeurs-pompiers",
                                  "Ligne Maginot",
                                  "Baroque",
                                  "Dauphiné",
                                  "Anatomie",
                                  "Bosnie-Herzégovine",
                                  "horreur",
                                  "Athéisme",
                                  "Wiki Loves Earth",
                                  "Christianisme évangélique",
                                  "Pink Floyd",
                                  "Tunisie",
                                  "Eurovision",
                                  "X-Files",
                                  "Limoges",
                                  "Kosovo",
                                  "autisme",
                                  "transidentité",
                                  "Historiographie",
                                  "Biologie marine",
                                  "Firefly",
                                  "Cher",
                                  "Maghreb",
                                  "Champagne-Ardenne",
                                  "syndicalisme",
                                  "numismatique",
                                  "Terre du Milieu",
                                  "Languedoc-Roussillon",
                                  "écologie",
                                  "équidés",
                                  "Provence-Alpes-Côte d'Azur",
                                  "Libye",
                                  "Seine-Saint-Denis",
                                ],

    "EvalThemesUsusualCats"   : "Modèle:Wikiprojet/catégorisation",
    "EvalThemesDefaultCat"    : "Article $1 d'",
    "EvalThemesUnusualCatTemplate" : "$1 d'",
    "EvalCatsPrefixes"        : ["Évaluation des articles ","Évaluation d'article "],
    "EvalCatsCommonPrefix"    : "Évaluation d",
    "EvalCatsMatches"         : {"importance":{param:"Importance",id:"IMP"},"avancement":{param:"Avancement",id:"AVT"}},
    "EvalThemesAliasesPage"   : "Modèle:Wikiprojet/alias",
    "EvalThemesAliases"       : {},
    "EvalTableRequests"       : 0,
    "EvalThemesOK"            : false,
    "PortalList"              : [],
    "PortalListOK"            : false,
    "PortalCatTemplate"       : "Portail:$1/Articles liés",
    "StubTemplate"            : "Ébauche",
    "StubThemesPage"          : "Module:Bandeau/Ébauche",
    "StubThemes"              : {},
    "FakeStubThemes"          : ["thème", /* "et", */ "exemple doc"],
    "StubAdjM"                : [],
    "StubAdjF"                : [],
    "StubThemesOK"            : false,
    "EvalThemeStuffsOK"       : false,
    "OptionsStuffsOK"         : false,
    "AllStuffsOK"             : false,
    "EvalCatAllpages"         : "Portail:$1/Articles liés",
    "EvalCatStubpages"        : "Wikipédia:ébauche $1",
    "BeforeStubTemplatesReq"  : 0,
    "BeforeStubTemplatesCats" : [ "Modèle de titre", "Modèle de bandeau renvoyant vers des homonymes", "Modèle Unicode" ],
    "BeforeStubTemplates"     : [
                                  "Article général",
                                  "Page annexe",
                                  "Av. J.-C.",
                                ],
    "OptionsSubPageOK"        : false,
    "OptionsMoreParams"       : "",
    "OptionsPageTemplate"     : "window.MassEval_UserCustom = function(){\n$1\n}\n",
    "OptionsPageCommentStart" : "/* Paramètrage supplémentaire du script MassEval. */ try{  /* NE PAS MODIFIER CETTE LIGNE  */\n",
    "OptionsPageCommentEnd"   : "\n/* Paramètrage supplémentaire du script MassEval. */ }catch(e){ console.error(e.message); }  /* NE PAS MODIFIER CETTE LIGNE  */",
    "CatSubPageCountOK"       : false,
    "PageTitleList"           : [],
    "PageList"                : [],
    "SubCatList"              : [],
    "StubEditsRunning"        : [],
    "EvalEditsRunning"        : [],
    "PreviewSaved"            : {},
    "APILimit"                : ((mw.config.get("wgUserGroups").indexOf("bot")!==-1 || mw.config.get("wgUserGroups").indexOf("syspo")!==-1) ? 5000 : 500),
    "DivIDsToPreview"         : ["contentSub", "mw-content-text", "catlinks"],
    "Accents"                 : {
                                  "A"  : ["À","Â","Ä","Á"],
                                  "C"  : ["Ç"],
                                  "E"  : ["É","È","Ê","Ë"],
                                  "I"  : ["Î","Ï","Í"],
                                  "O"  : ["Ô","Ö","Ó"],
                                  "U"  : ["Ù","Û","Ü","Ú"],
                                  "Y"  : ["ÿ","Ÿ"],
                                  "Ae" : ["Æ"],
                                  "Oe" : ["Œ"],
                                },
    "SortOptions"             : ["SortTitle","SortPortal","SortStub","SortAVT","SortIMP"],
    "OptionSelectWidthPlus"   : {"monobook":6,"vector":6,"modern":6,"cologneblue":6},
    "BorderStyles"            : ["dotted","dashed","solid","double","groove","ridge","inset","outset"],
    "SizeUnits"               : ["%","em","cn","in","px","pt","pc"],
    "CatListRunning"          : false,
    "SuggestTimeout"          : false,
    "SuggestRunning"          : {},
    "SpecialOptionLinkOK"     : false,
    "LaunchCondition"         : false,
    "CurrentCatOnSpecialpage" : false,
    "SubCatCount"             : {catlist:[],pagelist:[]},
    "SubCatCountReq"          : 0,


    "TalkSubPagesToAvoid"     : [ "/Suppression",
                                  "/Neutralité",
                                  "/Droit d'auteur",
                                  "/Article de qualité",
                                  "/Bon article",
                                  "/Lumière sur",
                                  "/À faire",
                                  "/Archive",
                                  "/archive"
                                ],
    "CurrentHeights"          : {},
    "ChangesToMake"           : [],
    "ChangesToMakeDelay"      : 50,
    "CurrentMaxSubcatLevel"   : 1,
    "DisplayedOptionsUL"      : 0,
    "ColorPickers"            : {},
    "ActualStyleTag"          : false,
    "BeforeStubTemplatesOK"   : false,
    "DatasStuffsOK"           : false,
    "localStorageItems"       : [],
    "localStorageTimestamps"  : {},
    "localStorageExpiry"      : 24,
    "DisplayedDatasUL"        : 0,
    "ModesMap"                : {
                                 "page"      : {id:"fieldsetPage",     veriftitle:"GoVerifOne",       addtitle:"GoAddOne",       updatefunc:"checkSelectedPage",      listfunc:"getOnePageStatus"   }, 
                                 "cat"       : {id:"fieldsetCat",      veriftitle:"GoVerifCat",       addtitle:"GoAddCat",       updatefunc:"checkSelectedCat",       listfunc:"getCategoryStatus"  }, 
                                 "links"     : {id:"fieldsetLinks",    veriftitle:"GoVerifLinks",     addtitle:"GoAddLinks",     updatefunc:"checkSelectedLinks",     listfunc:"getLinksStatus"     }, 
                                 "linkshere" : {id:"fieldsetLinkshere",veriftitle:"GoVerifLinkshere", addtitle:"GoAddLinkshere", updatefunc:"checkSelectedLinkshere", listfunc:"getLinkshereStatus" }, 
                                 "template"  : {id:"fieldsetTemplate", veriftitle:"GoVerifTemplate",  addtitle:"GoAddTemplate",  updatefunc:"checkSelectedTemplate",  listfunc:"getTemplateStatus"  }, 
                                 "newpages"  : {id:"fieldsetNewpages", veriftitle:"GoVerifNewpages",  addtitle:"GoAddNewpages",  updatefunc:"checkSelectedNewpages",  listfunc:"getNewpagesStatus"  }, 
                                 "creations" : {id:"fieldsetCreations",veriftitle:"GoVerifCreations", addtitle:"GoAddCreations", updatefunc:"checkSelectedCreations", listfunc:"getCreationsStatus" }, 
                                 "prefixes"  : {id:"fieldsetPrefixes", veriftitle:"GoVerifPrefixes",  addtitle:"GoAddPrefixes",  updatefunc:"checkSelectedPrefixes",  listfunc:"getPrefixesStatus"  }
                                },
    "CurrentMode"             : null,
    "PageLinksList"           : [],
    "PageLinkshereList"       : [], 
    "PageTemplateList"        : [], 
    "TemplateDocPage"         : "/Documentation",
    "FontFamilies"            : {
                                  "sans-serif" : ["Arial","Bahnschrift","Calibri","Candara","Corbel","Ebrima","Franklin Gothic","Gadugi","Geneva","Helvetica","Lucida Grande","Lucida Sans","Lucida Sans Unicode","Malgun Gothic","Microsoft Yi Baiti","MS PGothic","Tahoma","Trebuchet MS","Verdana"],
                                  "serif"      : ["Antiqua","Book Antiqua","Cambria","Constantia","Garamond","Georgia","Mongolian Baiti","Palatino","Palatino Linotype","PMingLiU-ExtB","SimSun","Sylfaen","Times New Roman"],
                                  "monospace"  : ["Andale Mono","Consolas","Courier","Courier New","Lucida Console","Lucida Sans Typewriter","MS Gothic","Monaco"],
                                  "cursive"    : ["Comic Sans MS","Comic Sans","Gabriola","Lucida Handwriting","Lucida Caligraphy","MV Boli","Segoe Script",],
                                  "fantasy"    : ["Arial Black","Blackletter","Charcoal","Fraktur","Gadget","Impact"]
                                },
  },
// =============================== Fonctions -------------------------------
  // ------------------------------- Fonctions génériques -------------------------------
  functions : {
    generateID : function(){
      return "AutoID"+Math.floor(Math.random() * 1000000000);
    },
    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 MassEval.params.Accents){
        var letters = MassEval.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;
    },
    formatNumber : function(number){
      number = number.toString();
      var parts = [];
      while(number.length>3){
        var lastthree = number.substr((number.length-3),number.length);
        parts.splice(0,0,lastthree);
        number = number.substr(0,(number.length-3));
      }
      parts.splice(0,0,number);
      return parts.join(" ");
    },
    addZero : function(num){
      var Text = num.toString();
      if(Text.length == 1) Text = "0"+Text;
      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;
        if(N && N.tagName && tags.indexOf(N.tagName.toLowerCase()) !== -1){
          N.disabled = DIS;
        }else 
        if(N && N.tagName){
          for(var t=0,tlen=tags.length;t<tlen;t++){
            MassEval.functions.disableThings(N.getElementsByTagName(tags[t]), dis);
          }
        }
      }
    },
    displayNodes : 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 = IDs[a];
        if(typeof(thisNode)=="string") 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;
        }
      }
      //console.log("item not found : tags = "+tags.join(", ")+" | name = "+name);
      return null;
    },
    createLink : function(page, options){
      var link = document.createElement("a");
      link.href = (options && options.href ? options.href : mw.util.getUrl(page));
      link.title = (options && options.title ? options.title : page );
      link.innerHTML = ((options && typeof(options.text)==="string") ? options.text : page );
      if(options && options.class) link.className = options.class;
      if(options && typeof(options.preview)=="number"){
        link.title =  MassEval.texts.PreviewText.split("$1").join(link.title);
        link.onclick = function(){ MassEval.functions.previewPage(page, options.preview); return false; };
      }
      return link;
    },
    neutralizeLinks : function(node){
      var links = node.getElementsByTagName("a");
      for(var a=0,l=links.length;a<l;a++){
        if(links[a].href.indexOf("#")===-1 && links[a].href.indexOf("javascript:")===-1) links[a].onclick = function(){ return false; }
      }
    },
    createInput : function(datas){
      var Input = document.createElement('textarea');
      if(datas.type != 'textarea'){
        Input = document.createElement('input');
        Input.type = datas.type || 'text';
      }
      if(typeof(datas.name)!=="undefined") Input.name = datas.name;
      if(typeof(datas.value)!=="undefined") Input.value = datas.value;
      if(typeof(datas.title)!=="undefined") Input.title = datas.title;
      if(typeof(datas.id)!=="undefined") Input.id = datas.id;
      return Input;
    },
    createSelect : function(options, selectedoption, sname){
      var Select = document.createElement('select');
      for(var val in options){
        var opt = Select.appendChild(document.createElement('option'));
        opt.value = val;
        opt.innerHTML = options[val];
        if(val == selectedoption) opt.selected = "selected";
      }
      if(sname) Select.name = sname;
      return Select;
    },
    createTimeSelector : function(updatefunc){
      var Today = new Date();
      var ThisMinute = Today.getMinutes();
      var ThisHour = Today.getHours();
      var ThisDay = Today.getDate();
      var ThisMonth = Today.getMonth();
      var ThisYear = parseInt(Today.getFullYear());
      var FS = document.createElement("fieldset");
      $(FS).addClass("NoBorderFieldset NoShowHideLinks");
      var Label = FS.appendChild(document.createElement('legend'));
      Label.innerHTML = MassEval.texts.TimeDateLabel;
      var Form = FS.appendChild(document.createElement('form'));
      Form.onsubmit = function(){ return false; };
      var TimeValue = MassEval.functions.addZero(ThisHour)+":"+MassEval.functions.addZero(ThisMinute);
      var TimeInput = Form.appendChild(MassEval.functions.createInput({type:"text",name:"time",value:TimeValue}));
      $(TimeInput).addClass('timeinput');
      $(TimeInput).clockpicker({
        autoclose : true,
        align     : 'right',
        afterDone : function(){ if(typeof(updatefunc)==="function") updatefunc(); }
      });
      var DateInput = Form.appendChild(MassEval.functions.createInput({type:"text",name:'date'}));
      $(DateInput).addClass('dateinput');
      DateInput.setAttribute("data-toggle","datepicker");
      var DatePickerContainer = Form.appendChild(document.createElement('div'));
      var TimeSelector = $(DateInput).datepicker({
        container : DatePickerContainer,
        language  : 'fr-FR',
        endDate   : Today,
        autoPick  : true,
        autoHide : true
      });
      if(typeof(updatefunc)==="function"){
        TimeInput.onkeyup = updatefunc;
        DateInput.onkeyup = updatefunc;
        $(DateInput).on('pick.datepicker', function (e) {
          if (e.date < new Date()) {
            e.preventDefault(); // Prevent to pick the date  
          }
          DateInput.value = $(DateInput).datepicker('getDate', true);
          updatefunc();
       });
      }
      $(Form).addClass("TimeSelector");
      return FS;
    },
    getTimeSelectorValue : function(FormID){
     var TS = "y-m-dTh:min:00Z";
     var Form = document.getElementById(FormID);
     if(!Form) return "";
     var thisTime = MassEval.functions.getFirstElementByName(Form, ["input"], "time").value;
     var H = parseInt(thisTime.split(":")[0]);
     var M = parseInt(thisTime.split(":")[1]);
     var DateSelector = MassEval.functions.getFirstElementByName(Form, ["input"], "date");
     var thisDate = $(DateSelector).datepicker('parseDate', DateSelector.value);
     var Time = thisDate.getTime();
     Time = new Date(Time + (((H*60)+M-MassEval.params.TimeCorrection)*60*1000));
     var Minute = Time.getMinutes();
     var Hour = Time.getHours()
     var Day = Time.getDate();
     var Month =  Time.getMonth();
     var Year = Time.getFullYear();
     TS = TS.split("min").join(MassEval.functions.addZero(Minute));
     TS = TS.split("h").join(MassEval.functions.addZero(Hour));
     TS = TS.split("d").join(MassEval.functions.addZero(Day));
     TS = TS.split("m").join(MassEval.functions.addZero(Month+1));
     TS = TS.split("y").join(Year);
     return TS;
    },
    createNamespaceSelect : function(DefaultNS){
      if(!DefaultNS) DefaultNS = "0";
      var NSobject = JSON.parse(JSON.stringify(mw.config.get("wgFormattedNamespaces")));
      NSobject["0"] = MassEval.texts.MainNamespace;
      delete NSobject["-1"];
      delete NSobject["-2"];
      return MassEval.functions.createSelect(NSobject, DefaultNS);
    },
    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")[(MassEval.functions.getNamespaceInfoFromPage(page)+1)]+":"+MassEval.functions.getNamespaceInfoFromPage(page, "PageName");
    },
    getMainPage : function(page){
      var NS = MassEval.functions.getNamespaceInfoFromPage(page);
      if(NS % 2 == 0) return page;
      return (NS==1 ? "" : mw.config.get("wgFormattedNamespaces")[(NS-1)]+":")+MassEval.functions.getNamespaceInfoFromPage(page, "PageName");
    },
    sortTextList : function(textlist) {
      var NA = MassEval.functions.deleteAccents;
      return textlist.sort(function(a,b){ var A = [NA(b.toLowerCase()),NA(a.toLowerCase())].sort(); return ( A[1] == NA(a.toLowerCase()) ? 1 : -1 ); });
    },
    compareObjects : function(object1, object2){
      if( typeof(object1)==="undefined" || typeof(object2)==="undefined") return false;
      if( typeof(object1)!=="object" || typeof(object2)!=="object") return (object1 === object2);
      for(var id1 in object1){
        if( MassEval.functions.compareObjects(object1[id1], object2[id1]) === false ) return false;
      }
      for(var id2 in object2){
        if( MassEval.functions.compareObjects(object2[id2], object1[id2]) === false ) return false;
      }
      return true;
    },
    makeGroupsFromArray : function(arr, grouplength, modfunc){
      if(typeof(arr)!="object") return false;
      if(typeof(grouplength)!="number") return false;
      var ARR = JSON.parse(JSON.stringify( arr ));
      var groupedarray = [];
      while(ARR.length > 0){
        var group = [];
        for(var x=0,xlen=grouplength;x<xlen;x++){
          var item = ARR.shift();
          if(typeof(item)==="undefined") continue;
          if(typeof(modfunc)==="function") item = modfunc(item);
          group.push(item);
        }
        groupedarray.push(group);
        delete group;
        if(ARR.length === 0) break;
      }
      return groupedarray;
    },
    setSynchronizedResizeV : function(ElmsIDs, delay){
      var Elms = [];
      for(var a=0,l=ElmsIDs.length;a<l;a++){
        var currentElement = document.getElementById(ElmsIDs[a]);
        if(!currentElement) continue;
        Elms.push(currentElement);    
        currentElement.style.resize = "vertical";
        var currentHeight = $(currentElement).height();
        MassEval.params.CurrentHeights[currentElement.id] = currentHeight;
      }
      var ResizeFunc = function(){
        var NewHeight = null;
        for(var a=0,l=Elms.length;a<l;a++){
          var El = Elms[a];
          if(El.style.display == "none" || El.style.visibility == "hidden") continue;
          var ElHeight = $(El).height();
          var oldHeight = MassEval.params.CurrentHeights[El.id];
          if(ElHeight !== oldHeight) NewHeight = ElHeight;
        }
        if(NewHeight === null || NewHeight === 0) return;
        for(var a=0,l=Elms.length;a<l;a++){
          var El = Elms[a];
          El.style.height = NewHeight+"px";
          MassEval.params.CurrentHeights[El.id] = NewHeight;
        }
      };
      setInterval(ResizeFunc, (delay ? delay : 50));
    },
    fontTest : function(fontName){
      var canvas = document.createElement("canvas");
      var context = canvas.getContext("2d");     
      var text = "abcdefghijklmnopqrstuvwxyz0123456789";
      context.font = "72px monospace";
      var baselineSize = context.measureText(text).width;     
      context.font = "72px '" + fontName + "', monospace";
      var newSize = context.measureText(text).width;
      canvas = null;
      return (newSize != baselineSize);
    },
  // ------------------------------- Fonctions localStorage -------------------------------
    localStorage : {
      getItem : function(itemname){
        if(MassEval.params.localStorageItems.indexOf(itemname)===-1) MassEval.params.localStorageItems.push(itemname);
        var TS = localStorage.getItem(itemname+"_TS");
        if(!TS) return false
        TS = parseInt(TS);
        var now = new Date().getTime();
        if( (now - TS) > (MassEval.params.localStorageExpiry*60*60*1000) ){
          localStorage.removeItem(itemname);
          localStorage.removeItem(itemname+"_TS");
          return false;
        }else{ 
          MassEval.params.localStorageTimestamps[(itemname+"_TS")] = now;
          return localStorage.getItem(itemname);
        }
      },
      setItem : function(itemname, itemvalue){
        if(MassEval.params.localStorageItems.indexOf(itemname)===-1) MassEval.params.localStorageItems.push(itemname);
        var now = new Date().getTime();
        MassEval.params.localStorageTimestamps[(itemname+"_TS")] = now;
        localStorage.setItem((itemname+"_TS"), now);
        return localStorage.setItem(itemname, itemvalue);
      }
    },
  // ------------------------------- Fonctions API -------------------------------
    getAPIUsercontribs : function(Q){
      if(!Q || !Q.user) return console.error('Manque paramètre "user" pour MassEval.functions.getAPIUsercontribs');
      if(!Q || !Q.timestamp) return console.error('Manque paramètre "timestamp" pour MassEval.functions.getAPIUsercontribs');
      if(!Q.datas){
        Q.datas = {format:'json',action:'query',list:'usercontribs',
          uclimit     : MassEval.params.APILimit,
          ucshow      : 'new',
          ucprop      : 'title',
          ucnamespace : 0,
          ucstart     : 'now',
          ucend       : Q.timestamp,
          ucuser      : Q.user
        };
      }
      $.ajax({url: mw.util.wikiScript('api'),data:Q.datas,dataType:'json'
      }).then(function(data) {
        if(!Q.result) Q.result = [];
        var query = data.query;
        if(query){
          var usercontribs = query.usercontribs;
          for(var a=0,l=usercontribs.length;a<l;a++){
            var pageinfo = usercontribs[a];
            var title = pageinfo.title;
            if(Q.result.indexOf(title) ===-1) Q.result.push(title);
          }
        }
        var cont = data.continue;
        if(cont){
          Q.datas.uccontinue = cont.uccontinue;
          MassEval.functions.getAPIUsercontribs(Q);
        }else{
          if(typeof(Q.callback) == "function") Q.callback(Q);
        }
      });
    },
    getAPIRecentchanges : function(Q){
      if(!Q || !Q.timestamp) return console.error('Manque paramètre "timestamp" pour MassEval.functions.getAPIRecentchanges');
      if(!Q.datas){
        Q.datas = {format:'json',action:'query',generator:'recentchanges',
          grclimit  : MassEval.params.APILimit,
          grcshow : '!redirect',
          grcprop : 'title',
          grctype : 'new',
          grcnamespace : 0,
          prop : 'info',
          grcstart : 'now',
          grcend : Q.timestamp
        };
      }
      $.ajax({url: mw.util.wikiScript('api'),data:Q.datas,dataType:'json'
      }).then(function(data) {
        if(!Q.result) Q.result = [];
        var query = data.query;
        if(query){
          var pages = query.pages;
          for(var id in pages){
            var pageinfo = pages[id];
            var title = pageinfo.title;
            var timestamp = pageinfo.touched;
            var missing = (pageinfo.missing === "");
            if(!missing) Q.result.push({title:title, timestamp:timestamp});
          }
        }
        var cont = data.continue;
        if(cont){
          Q.datas.grccontinue = cont.grccontinue;
          MassEval.functions.getAPIRecentchanges(Q);
        }else{
          Q.result.sort(function(a,b){
            var S = [a.timestamp, b.timestamp].sort();
            return ( S[0] == a.timestamp ? 1 : -1);
          });
          if(typeof(Q.callback) == "function") Q.callback(Q);
        }
      });
    },
    getAPIEmbeddedin : function(Q){
      if(!Q || !Q.title) return console.error('Manque paramètre "title" pour MassEval.functions.getAPIEmbeddedin');
      if(!Q.datas){
        Q.datas = {format:'json',action:'query',list:'embeddedin',
          eilimit  : MassEval.params.APILimit,
          eititle  : Q.title          
        };
        if(Q.einamespace) Q.datas.einamespace =  Q.einamespace;
      }
      $.ajax({url: mw.util.wikiScript('api'),data:Q.datas,dataType:'json'
      }).then(function(data) {
        if(!Q.result) Q.result = [];
        var query = data.query;
        if(query){
          var embeddedin = query.embeddedin;
          for(var pageinfo in embeddedin){
            var title = embeddedin[pageinfo].title;
            if(Q.result.indexOf(title) === -1) Q.result.push(title);
          }
        }
        var cont = data.continue;
        if(cont){
          Q.datas.eicontinue = cont.eicontinue;
          MassEval.functions.getAPIEmbeddedin(Q);
        }else{
          if(typeof(Q.callback) == "function") Q.callback(Q);
        }
      });
    },
    getAPILinkshere : function(Q){
      if(!Q || !Q.title) return console.error('Manque paramètre "title" pour MassEval.functions.getAPILinkshere');
      if(!Q.datas){
        Q.datas = {format:'json',action:'query',prop:'linkshere',
          lhprop      : (Q.lhprop ? Q.lhprop : 'pageid|title|redirect'),
          lhlimit     : MassEval.params.APILimit,
          titles      : Q.title          
        };
        if(Q.lhshow) Q.datas.lhshow =  Q.lhshow;
        if(Q.lhnamespace) Q.datas.lhnamespace =  Q.lhnamespace;
      }
      $.ajax({url: mw.util.wikiScript('api'),data:Q.datas,dataType:'json'
      }).then(function(data) {
        if(!Q.result) Q.result = {};
        var query = data.query;
        if(query){
          var pages = query.pages;
          for(var id in pages){
            var pageinfo = pages[id];
            var title = pageinfo.title;
            if(!Q.result[title]) Q.result[title] = pageinfo;
            else{
              var linkshere = pageinfo.linkshere;
              if(linkshere){
                if(!Q.result[title].linkshere) Q.result[title].linkshere = linkshere;
                else{
                  for(var a=0,l=linkshere.length;a<l;a++){
                    Q.result[title].linkshere.push(linkshere[a]);
                  }
                }
              }
            }
          }
        }
        var cont = data.continue;
        if(cont){
          Q.datas.lhcontinue = cont.lhcontinue;
          MassEval.functions.getAPILinkshere(Q);
        }else{
          if(typeof(Q.callback) == "function") Q.callback(Q);
        }
      });
    },
    getAPILinks : function(Q){
      if(!Q || !Q.title) return console.error('Manque paramètre "title" pour MassEval.functions.getAPILinks');
      if(!Q.datas) Q.datas = {format:'json',action:'query',generator:'links',gpllimit:MassEval.params.APILimit,gplnamespace:'0|1',titles:Q.title,prop:'info'};
      $.ajax({url:mw.util.wikiScript('api'),data:Q.datas,dataType:'json'
      }).then(function(data){
        if(!Q.result) Q.result = [];
        var query = data.query;
        if(query){
          var pages = query.pages;
          if(pages){
            for(var id in pages){
              var pageinfo = pages[id];
              var ns = pageinfo.ns;
              if(pageinfo.missing !== "" && [0,1].indexOf(ns)!==-1){
                var title = pageinfo.title;
                Q.result.push(title);
              }
            }
          }
        }
        var cont = data.continue;
        if(cont){
          Q.datas.gplcontinue = cont.gplcontinue;
          MassEval.functions.getAPILinks(Q);
        }else{
          if(typeof(Q.callback) == "function") Q.callback(Q);
        }
      });
    },
    getAPICategoryinfo : function(Q){
      if(!Q || !Q.title) return console.error('Manque paramètre "title" pour MassEval.functions.getAPICategoryinfo');  
      var datas = {format:'json',action:'query',prop:'categoryinfo',titles:mw.config.get('wgFormattedNamespaces')[14]+":"+Q.title};
      $.ajax({url: mw.util.wikiScript('api'), data: datas,dataType: 'json'
      }).then(function(data){
          var result = {};
          var page = data.query.pages[(Object.keys(data.query.pages)[0])];
          var missing = (page.missing === "");
          if(missing) result.missing = true;
          var categoryinfo = page.categoryinfo;
          if(categoryinfo){
            result.pages = categoryinfo.pages;
            result.subcats = categoryinfo.subcats;
            result.files = categoryinfo.files;
            result.size = categoryinfo.size;
          }
          Q.result = result;
          if(typeof(Q.callback) == "function") Q.callback(Q);
      });
    },
    getAPICategories : function(Q){
      if(!Q || !Q.title) return console.error('Manque paramètre "title" pour MassEval.functions.getAPICategories');
      if(!Q.datas){
        Q.datas = {format:'json',action:'query',prop:'categories',
          clprop:'hidden|sortkey',
          cllimit:MassEval.params.APILimit,
          titles:Q.title          
        };
      }
      $.ajax({url: mw.util.wikiScript('api'),data:Q.datas,dataType:'json'
      }).then(function(data) {
        var page = data.query.pages[(Object.keys(data.query.pages)[0])];
        var categories = page.categories;
        if(categories){
          if(!Q.result) Q.result = {};
          for(var a=0,l=categories.length;a<l;a++){
            var category = categories[a];
            Q.result[category.title] = category;
          }
          var cont = data.continue;
          if(cont){
            Q.datas.clcontinue = cont.clcontinue;
            MassEval.functions.getAPICategories(Q);
          }else{
            if(typeof(Q.callback) == "function") Q.callback(Q);
          }
        }else{
          if(typeof(Q.callback) == "function") Q.callback(Q);
        }
      });
    },
    getAPICategorymembers : function(Q){
      if(!Q || !Q.title) return console.error('Manque paramètre "title" pour MassEval.functions.getAPICategorymembers');
      if(!Q.datas){
        Q.datas = {format:'json',action:'query',list:'categorymembers',
          cmprop  : Q.cmprop || 'ids|title|type|sortkey|timestamp',
          cmlimit : MassEval.params.APILimit,
          cmtitle : Q.title, 
          cmsort  : (Q.cmsort ? Q.cmsort : 'sortkey'),  
          cmdir  : (Q.cmdir ? Q.cmdir : 'asc'),   
          cmtype  : Q.cmtype || 'page|subcat|file',
        };
        
      }
      $.ajax({url:mw.util.wikiScript('api'),data:Q.datas,dataType:'json'
      }).then(function(data) {
        var query = data.query;
        if(!query) return;
        var categorymembers = query.categorymembers;
        if(categorymembers && categorymembers.length > 0){
          if(!Q.result) Q.result = {};
          for(var a=0,l=categorymembers.length;a<l;a++){
            var page = categorymembers[a];
            Q.result[page.title] = page;
          }
          var cont = data.continue;
          if(cont){
            Q.datas.cmcontinue = cont.cmcontinue;
            MassEval.functions.getAPICategorymembers(Q);
          }else{
            if(typeof(Q.callback) == "function") Q.callback(Q);
          }
        }else{
          if(typeof(Q.callback) == "function") Q.callback(Q);
        }
      });
    },
    getAPICategorymembersGenerator : function(Q){
      if(!Q || !Q.title) return console.error('Manque paramètre "title" pour MassEval.functions.getAPICategorymembersGenerator');
      if(!Q || !Q.prop) return console.error('Manque paramètre "prop" pour MassEval.functions.getAPICategorymembersGenerator '+Q.title);
      if(!Q.datas){
        Q.datas = {format:'json',action:'query',generator:'categorymembers',
          gcmprop  : Q.gcmprop || 'ids|title|type|sortkey|timestamp',
          gcmlimit : MassEval.params.APILimit,
          gcmtitle : Q.title,    
          gcmsort  : (Q.gcmsort ? Q.gcmsort : 'sortkey'),  
          gcmdir  : (Q.gcmdir ? Q.gcmdir : 'asc'),   
          gcmtype  : Q.gcmtype || 'page|subcat|file',
          prop     : Q.prop
        };
      }
      $.ajax({url:mw.util.wikiScript('api'),data:Q.datas,dataType:'json'
      }).then(function(data) {
        var query = data.query;
        if(!query) return;
        if(!Q.result) Q.result = {};
        var pages = query.pages;
        for(var id in pages){
          var pageinfo = pages[id];
          var index = pageinfo.title; 
          if(Q.result[index]){
            for(var info in pageinfo){ 
              var thisinfo = pageinfo[info]; 
              if(typeof(thisinfo)!=="object"){ 
                if(typeof(Q.result[index][info])==="undefined") Q.result[index][info] = thisinfo;
              }else{
                if(typeof(Q.result[index][info])!=="object") Q.result[index][info] = thisinfo;
                else{
                  for(var i=0,ilen=thisinfo.length;i<ilen;i++){
                     Q.result[index][info].push(thisinfo[i]);
                  }
                }
              }
            }            
          }else{
            Q.result[index] = pageinfo;
          }
        }
        var cont = data.continue;
        if(cont){
          for(var contname in cont){
            if(contname === "continue") continue;     
            Q.datas[contname] = cont[contname];       
          }
          MassEval.functions.getAPICategorymembersGenerator(Q);
        }else{
          if(typeof(Q.callback) == "function") Q.callback(Q);
        }
      });
    },
    getAPIAllcategories : function(Q){
      if(!Q.datas){
        Q.datas = {format:'json',action:'query',generator:'allcategories',
          gaclimit : MassEval.params.APILimit,
        };
      }
      if(Q.gacprop) Q.datas.gacprop = Q.gacprop;
      if(Q.gacfrom) Q.datas.gacfrom = Q.gacfrom;
      if(Q.gacprefix) Q.datas.gacprefix = Q.gacprefix;
      $.ajax({url:mw.util.wikiScript('api'),data:Q.datas,dataType:'json'
      }).then(function(data) {
        var query = data.query;
        if(!query) return;
        if(!Q.result) Q.result = {};
        var categories = query.pages;
        for(var id in categories){
          var page = categories[id];
          Q.result[page.title] = page;
        }
        var cont = data.continue;
        if(cont){
          Q.datas.gaccontinue = cont.gaccontinue;
          MassEval.functions.getAPIAllcategories(Q);
        }else{
          if(typeof(Q.callback) == "function") Q.callback(Q);
        }
      });
    },
  // ------------------------------- Fonctions pour le listing des pages -------------------------------
    startPageAnalysis : function(){
      var ElementsToDisable = [
                              "EvalThemeInput",
                              "PortalInput",
                              "CatInput",
                              "SubCatsCheckBox",
                              "LinksCheckbox",
                              "GlobalVerifInput",
                              "GlobalAddEvalInput",
                              "subcatdepthForm",
                              "fieldsetModes"
      ];
      MassEval.functions.disableThings(ElementsToDisable, true);
      var FromToSelector = document.getElementById("FromToSelector");
      if(FromToSelector) $(FromToSelector.parentNode).addClass("RangeSelectorDisabled");
      var RangeSelectorAbbrLink = document.getElementById("RangeSelectorAbbrLink");
      if(RangeSelectorAbbrLink) $(RangeSelectorAbbrLink).addClass("RangeSelectorDisabled");
    },
    endPageAnalysis : function(){
      var ElementsToEnable = [
                              "EvalThemeInput",
                              "CatInput",
                              "SubCatsCheckBox",
                              "LinksCheckbox",
                              "GlobalVerifInput",
                              "GlobalAddEvalInput",
                              "fieldsetModes"
      ];
      MassEval.functions.disableThings(ElementsToEnable, false);
      MassEval.functions.updatePortalSelect();
      var SubCats = document.getElementById("SubCatsCheckBox");
      MassEval.functions.disableThings(["subcatdepthForm"], (!SubCats || (SubCats && !SubCats.checked)));
      var FromToSelector = document.getElementById("FromToSelector");
      if(FromToSelector) $(FromToSelector.parentNode).removeClass("RangeSelectorDisabled");
      var RangeSelectorAbbrLink = document.getElementById("RangeSelectorAbbrLink");
      if(RangeSelectorAbbrLink) $(RangeSelectorAbbrLink).removeClass("RangeSelectorDisabled");
      MassEval.functions.alertControl("listpages");
      MassEval.functions.alertControl("getstatus");
    },
    getOnePageStatus : function(Q){
      var Input = document.getElementById("PageInput");
      if(!Input) return;
      MassEval.functions.startPageAnalysis();
      var PageFilteredCount = document.getElementById("PageFilteredCount");
      if(PageFilteredCount) PageFilteredCount.style.visibility = "hidden";
      MassEval.functions.getThesePagesStatus([ Input.value ], Q.onlymissingeval);
    }, 
    getCategoryStatus : function(Q){
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.checkPagesEvalDone(true);
      var CheckBox = document.getElementById("SubCatsCheckBox");
      if(typeof(Q.catindex)==="undefined"){
        var Conditions = MassEval.functions.getFilterConditions();
        if(!Conditions) return;
        MassEval.params.CatListRunning = true;
        MassEval.params.PreviewSaved = {};
        Q.catindex = 0;
        MassEval.params.PageTitleList = [];
        MassEval.params.PageList = [];
        MassEval.params.SubCatList = [];
        var PageFilteredCount = document.getElementById("PageFilteredCount");
        if(PageFilteredCount) PageFilteredCount.style.visibility = "hidden";
        var FirstCat = document.getElementById("CatInput").value;
        if(!FirstCat) return;
        MassEval.params.SubCatList.push({title:(mw.config.get("wgFormattedNamespaces")[14]+":"+FirstCat),depth:0});
      }
      var catinfo = MassEval.params.SubCatList[Q.catindex];
      if(!catinfo){
        var PageList = MassEval.params.PageTitleList;
        var ChosenPages = [];
        var Range = MassEval.functions.getFromToSelectorValues();
        var from = (Range.from-1), to = (Range.to-1);
        for(var a=0,l=PageList.length;a<l;a++){
          if(a < from) continue;
          if(a > to) continue;
          ChosenPages.push(PageList[a]);
        }
        MassEval.functions.alertControl("listpages");
        return MassEval.functions.getThesePagesStatus(ChosenPages, (Q.onlymissingeval ? true : false));
      }
      if(MassEval.params.PageTitleList.length > (Q.maxpages-1)) return MassEval.functions.getPageStatus(Q.evaltheme);
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.checkPagesEvalDone(true);
      MassEval.functions.startPageAnalysis();
      var count = (Q.catindex+1)+"/"+MassEval.params.SubCatList.length;
      MassEval.functions.alertControl("listpages", MassEval.texts.AlertMsgPages.split("$count").join(count).split("$cat").join(catinfo.title), "Running");
      MassEval.functions.getAPICategorymembers({
        onlymissingeval : Q.onlymissingeval,
        catindex   : Q.catindex,
        evaltheme  : Q.evaltheme,
        startpages : Q.startpages,
        endpages   : Q.endpages,
        maxpages   : Q.maxpages,
        title      : catinfo.title,
        depth      : catinfo.depth,
        cmprop     : 'title',
        cmdir      : (Q.onlymissingeval ? 'desc' : 'asc'),
        cmsort     : (Q.onlymissingeval ? 'timestamp' : 'sortkey'),
        cmtype     : ((CheckBox && CheckBox.checked) ? 'page|subcat' : 'page'),
        callback   : function(R){
          var CanContinue = MassEval.functions.checkEmergencyStop();
          if(!CanContinue) return MassEval.functions.checkPagesEvalDone(true);
          var alltitles = Object.keys(R.result);
          if(alltitles.length == 0){
            MassEval.functions.alertControl("listpages");
            MassEval.functions.endPageAnalysis();
            return;
          }
          for(var pi in R.result){
            var pageinfo = R.result[pi];     
            var title = pageinfo.title;
            var ns = parseInt(pageinfo.ns);
            if(ns == 14 && MassEval.params.SubCatList.indexOf(title)===-1 && R.depth<MassEval.params.CurrentMaxSubcatLevel){
              MassEval.params.SubCatList.push({title:title,depth:(R.depth+1)});
            }else if(ns < 2){
              title = MassEval.functions.getMainPage(title);
              if(MassEval.params.PageTitleList.indexOf(title)==-1){
                MassEval.params.PageTitleList.push(title);
              }
            }
          }
          R.catindex++
          MassEval.functions.getCategoryStatus(R);
        }
      });
    },
    getLinksStatus : function(Q){
      var Input = document.getElementById("LinksInput");
      var NSInput = document.getElementById("LinksInputNS");
      if(!Input || !NSInput) return;
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.checkPagesEvalDone(true);
      var PageName = MassEval.functions.ucFirst(Input.value);
      var NS = parseInt(NSInput.value);
      Input.value = PageName;
      Q.title = mw.config.get("wgFormattedNamespaces")[NS]+(NS===0 ? "" : ":")+PageName;
      Q.result = [];
      Q.onlymissingeval = !!Q.onlymissingeval;
      Q.callback = function(R){
        var CanContinue = MassEval.functions.checkEmergencyStop();
        if(!CanContinue) return MassEval.functions.checkPagesEvalDone(true);
        var TalkSubPagesToAvoid = MassEval.params.TalkSubPagesToAvoid;
        MassEval.params.PageLinksList = [];
        var titles = R.result;
        for(var a=0,l=titles.length;a<l;a++){
          var title = titles[a];
          var OK = true;
          for(var tp=0,tplen=TalkSubPagesToAvoid.length;tp<tplen;tp++){
            if(title.indexOf(TalkSubPagesToAvoid[tp]) !==-1 ) OK = false;
          }
          if(OK) MassEval.params.PageLinksList.push(title);
        }
        var Range = MassEval.functions.getFromToSelectorValues();
        var from = (Range.from-1), to = (Range.to-1);
        var Newlist = [];
        for(var a=0,l=MassEval.params.PageLinksList.length;a<l;a++){
          if(a < from) continue
          if(a > to) continue;
          var thistitle = MassEval.params.PageLinksList[a];
          if(thistitle) Newlist.push(thistitle);
          else console.warn("title manquant : "+a);
        }
        MassEval.functions.alertControl("listpages"); 
        MassEval.functions.getThesePagesStatus(Newlist, R.onlymissingeval);
      }
      MassEval.functions.alertControl("listpages", MassEval.texts.AlertMsgLinks.split("$page").join(Q.title), "Running");
      MassEval.functions.startPageAnalysis();
      var PageFilteredCount = document.getElementById("PageFilteredCount");
      if(PageFilteredCount) PageFilteredCount.style.visibility = "hidden";
      if(MassEval.params.PageLinksList.length == 0) MassEval.functions.getAPILinks(Q);
      else Q.callback({result:MassEval.params.PageLinksList,onlymissingeval:Q.onlymissingeval});
    }, 
    getLinkshereStatus : function(Q){
      var Input = document.getElementById("LinkshereInput");
      var NSInput = document.getElementById("LinkshereInputNS");
      if(!Input || !NSInput) return;
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.checkPagesEvalDone(true);
      var PageName = MassEval.functions.ucFirst(Input.value);
      var NS = parseInt(NSInput.value);
      Q.title = mw.config.get("wgFormattedNamespaces")[NS]+(NS===0 ? "" : ":")+PageName;
      Q.result = [];
      Q.onlymissingeval = !!Q.onlymissingeval;
      Q.lhprop = 'title';
      Q.lhnamespace = '0|1';
      Q.lhshow = '!redirect';
      Q.callback = function(R){
        var onlymissingeval = R.onlymissingeval;
        var CanContinue = MassEval.functions.checkEmergencyStop();
        if(!CanContinue) return MassEval.functions.checkPagesEvalDone(true);
        var TalkSubPagesToAvoid = MassEval.params.TalkSubPagesToAvoid;
        MassEval.params.PageLinkshereList = [];
        var titles = R.result;
        for(var a=0,l=titles.length;a<l;a++){
          var title = titles[a];
          var OK = true;
          for(var tp=0,tplen=TalkSubPagesToAvoid.length;tp<tplen;tp++){
            if(title.indexOf(TalkSubPagesToAvoid[tp]) !==-1 ) OK = false;
          }
          if(OK) MassEval.params.PageLinkshereList.push(title);
        }
        var Range = MassEval.functions.getFromToSelectorValues();
        var from = (Range.from-1), to = (Range.to-1);
        var Newlist = [];
        for(var a=0,l=MassEval.params.PageLinkshereList.length;a<l;a++){
          if(a < from) continue
          if(a > to) continue;
          var thistitle = MassEval.params.PageLinkshereList[a];
          if(thistitle) Newlist.push(thistitle);
          else console.warn("title manquant : "+a);
        }
        MassEval.functions.alertControl("listpages"); 
        MassEval.functions.getThesePagesStatus(Newlist, R.onlymissingeval);
      }
      MassEval.functions.alertControl("listpages", MassEval.texts.AlertMsgLinkshere.split("$page").join(Q.title), "Running");
      MassEval.functions.startPageAnalysis();
      var PageFilteredCount = document.getElementById("PageFilteredCount");
      if(PageFilteredCount) PageFilteredCount.style.visibility = "hidden";
      if(MassEval.params.PageLinkshereList.length == 0) MassEval.functions.getAPILinkshere(Q);
      else Q.callback({result:MassEval.params.PageLinkshereList,onlymissingeval:Q.onlymissingeval});
    }, 
    getTemplateStatus : function(Q){
      var Input = document.getElementById("TemplateInput");
      if(!Input) return;
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.checkPagesEvalDone(true);
      var PageName = MassEval.functions.ucFirst(Input.value);
      Q.title = mw.config.get("wgFormattedNamespaces")[10]+":"+PageName;
      Q.result = [];
      Q.onlymissingeval = !!Q.onlymissingeval;
      Q.einamespace = '0';
      Q.callback = function(R){
        var CanContinue = MassEval.functions.checkEmergencyStop();
        if(!CanContinue) return MassEval.functions.checkPagesEvalDone(true);
        MassEval.params.PageTemplateList = R.result;
        var Range = MassEval.functions.getFromToSelectorValues();
        var from = (Range.from-1), to = (Range.to-1);
        var Newlist = [];
        for(var a=0,l=MassEval.params.PageTemplateList.length;a<l;a++){
          if(a < from) continue
          if(a > to) continue;
          var thistitle = MassEval.params.PageTemplateList[a];
          if(thistitle) Newlist.push(thistitle);
          else console.warn("title manquant : "+a);
        }
        MassEval.functions.alertControl("listpages"); 
        MassEval.functions.getThesePagesStatus(Newlist, R.onlymissingeval);
      }
      MassEval.functions.alertControl("listpages", MassEval.texts.AlertMsgTemplate.split("$template").join(PageName), "Running");
      MassEval.functions.startPageAnalysis();
      var PageFilteredCount = document.getElementById("PageFilteredCount");
      if(PageFilteredCount) PageFilteredCount.style.visibility = "hidden";
      if(MassEval.params.PageTemplateList.length == 0) MassEval.functions.getAPIEmbeddedin(Q);
      else Q.callback({result:MassEval.params.PageTemplateList,onlymissingeval:Q.onlymissingeval});
    }, 
    getNewpagesStatus : function(Q){
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.checkPagesEvalDone(true);
      MassEval.functions.alertControl("listpages", MassEval.texts.AlertMsgNewpages, "Running");
      MassEval.functions.startPageAnalysis();
      var PageFilteredCount = document.getElementById("PageFilteredCount");
      if(PageFilteredCount) PageFilteredCount.style.visibility = "hidden";
      var Timestamp = MassEval.functions.getTimeSelectorValue("NewpagesTimeSelector");
      Q.onlymissingeval = !!Q.onlymissingeval;
      MassEval.functions.getAPIRecentchanges({timestamp:Timestamp,onlymissingeval:Q.onlymissingeval,callback:function(R){
        var CanContinue = MassEval.functions.checkEmergencyStop();
        if(!CanContinue) return MassEval.functions.checkPagesEvalDone(true);
        var titles = R.result;
        var Range = MassEval.functions.getFromToSelectorValues();
        var from = (Range.from-1), to = (Range.to-1);
        var Newlist = [];
        for(var a=0,l=titles.length;a<l;a++){
          if(a < from) continue
          if(a > to) continue;
          var thistitle = titles[a].title;
          if(thistitle) Newlist.push(thistitle);
          else console.warn("title manquant : "+a);
        }
        MassEval.functions.alertControl("listpages"); 
        MassEval.functions.getThesePagesStatus(Newlist, R.onlymissingeval);      
      }});
    }, 
    getCreationsStatus : function(Q){
      var Input = document.getElementById("UserInput");
      if(!Input) return;
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.checkPagesEvalDone(true);
      MassEval.functions.alertControl("listpages", MassEval.texts.AlertMsgCreations.split("$user").join(Input.value), "Running");
      MassEval.functions.startPageAnalysis();
      var PageFilteredCount = document.getElementById("PageFilteredCount");
      if(PageFilteredCount) PageFilteredCount.style.visibility = "hidden";
      var Timestamp = MassEval.functions.getTimeSelectorValue("CreationsTimeSelector");
      Q.onlymissingeval = !!Q.onlymissingeval;
      MassEval.functions.getAPIUsercontribs({timestamp:Timestamp,user:Input.value,onlymissingeval:Q.onlymissingeval,callback:function(R){
        var CanContinue = MassEval.functions.checkEmergencyStop();
        if(!CanContinue) return MassEval.functions.checkPagesEvalDone(true);
        var titles = R.result;
        var Range = MassEval.functions.getFromToSelectorValues();
        var from = (Range.from-1), to = (Range.to-1);
        var Newlist = [];
        for(var a=0,l=titles.length;a<l;a++){
          if(a < from) continue
          if(a > to) continue;
          var thistitle = titles[a];
          if(thistitle) Newlist.push(thistitle);
          else console.warn("title manquant : "+a);
        }
        MassEval.functions.alertControl("listpages"); 
        MassEval.functions.getThesePagesStatus(Newlist, R.onlymissingeval);      
      }});
    },
    getPrefixesStatus : function(Q){
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.checkPagesEvalDone(true);
      Q.Prefix = document.getElementById("PrefixInput").value;
      if(!Q.datas){
        Q.PageList = [];
        Q.datas = { format:'json',action:'query',list:'allpages',
          apprefix : Q.Prefix,
          apnamespace : 0,
          aplimit : MassEval.params.APILimit 
        };
        MassEval.functions.alertControl("listpages", MassEval.texts.AlertMsgPrefixes.split("$1").join(Q.Prefix), "Running");
        MassEval.functions.startPageAnalysis();
        var PageFilteredCount = document.getElementById("PageFilteredCount");
        if(PageFilteredCount) PageFilteredCount.style.visibility = "hidden";    
      }
      Q.onlymissingeval = !!Q.onlymissingeval;
      $.ajax({url: mw.util.wikiScript('api'), data: Q.datas,dataType: 'json'
      }).then(function(data) {
        var query = data.query;
        if(query){
          var pages = query.allpages;
          for(var a=0,l=pages.length;a<l;a++){
            var pagedata = pages[a];
            var page = pagedata.title;
            Q.PageList.push(page);
          }
        }
        var cont = data.continue;
        if(cont){
          Q.datas.apcontinue = cont.apcontinue;
          return MassEval.functions.getPrefixesStatus(Q);            
        }
        var titles = Q.PageList;
        var Range = MassEval.functions.getFromToSelectorValues();
        var from = (Range.from-1), to = (Range.to-1);
        var Newlist = [];
        for(var a=0,l=titles.length;a<l;a++){
          if(a < from) continue
          if(a > to) continue;
          var thistitle = titles[a];
          if(thistitle) Newlist.push(thistitle);
          else console.warn("title manquant : "+a);
        }
        MassEval.functions.alertControl("listpages"); 
        MassEval.functions.getThesePagesStatus(Newlist, Q.onlymissingeval);
      });
    },
    getThesePagesStatus : function(titles, onlymissingeval){
      if(!titles || titles.length == 0) return;
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.checkPagesEvalDone(true);
      MassEval.functions.startPageAnalysis();
      MassEval.functions.clearBoardList();
      var EvalThemeSelect = document.getElementById('EvalThemeInput');
      var PageFilteredCount = document.getElementById("PageFilteredCount");
      if(PageFilteredCount) PageFilteredCount.style.visibility = "hidden";
      MassEval.params.PageList = [];
      MassEval.params.PageTitleList = [];
      MassEval.params.SubCatList = [];
      MassEval.params.PreviewSaved ={};
      for(var a=0,l=titles.length;a<l;a++){
        var title = MassEval.functions.getMainPage(titles[a]);
        MassEval.params.PageList.push({title:title,talktitle:MassEval.functions.getTalkPage(title)});
      }
      MassEval.functions.getPageStatus(EvalThemeSelect.value, 0, onlymissingeval);
    },
    getPageStatus : function(evaltheme, index, onlymissingeval){
      if(!index) index = 0;
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.checkPagesEvalDone(true);
      var page = MassEval.params.PageList[index];
      if(!page){ return MassEval.functions.checkPagesEvalDone(); }
      if(MassEval.params.PreloadPreview){
        MassEval.functions.preloadPage(page.title, index);
        MassEval.functions.preloadPage(page.talktitle, index);
      }
      var count = (index+1)+"/"+MassEval.params.PageList.length;
      MassEval.functions.alertControl("getstatus", MassEval.texts.AlertMsgParams.split("$count").join(count).split("$page").join(page.title), "Running");
      var ReqDatas = {format:'json',action:'query',prop:'revisions|info|links|pageprops',rvprop:'content',rvsection:0,pllimit:1,titles:page.title+"|"+page.talktitle};
      if(MassEval.params.SearchForPortalTag){
        ReqDatas.prop += "|categories";
        ReqDatas.cllimit = MassEval.params.APILimit;
        ReqDatas.clshow = "hidden";
      }
      $.ajax({
        url: mw.util.wikiScript('api'),
        data:ReqDatas,
        success: function(data) {
          var CanContinue = MassEval.functions.checkEmergencyStop();
          if(!CanContinue) return MassEval.functions.checkPagesEvalDone(true);
          var query = data.query;
          if(!query) return MassEval.functions.getPageStatus(evaltheme, (index+1), onlymissingeval);
          var pages = query.pages;
          for(var id in pages){
            var pageinfo = pages[id];
            var title = pageinfo.title;
            var redirect = (pageinfo.redirect === "");
            var missing = (pageinfo.missing === "");
            var wikitexte = "";
            if(!missing) wikitexte = pageinfo.revisions[0]["*"];
            if(title == page.title){
              if(redirect){
                var links = pageinfo.links;
                if(links){
                  var getAllPagesInfos = function(info){
                    var pageinfos = [];
                    var pagedatas = MassEval.params.PageList;
                    for(var a=0,l=pagedatas.length;a<l;a++){
                      pageinfos.push(pagedatas[a][info]);
                    }
                    return pageinfos;
                  };
                  for(var a=0,l=links.length;a<l;a++){
                    var realtitle = links[a].title;
                    var alltitles = getAllPagesInfos("title");
                    if(alltitles.indexOf(realtitle)!==-1) return MassEval.functions.getPageStatus(evaltheme, (index+1));
                    var realtalktitle = MassEval.functions.getTalkPage(realtitle);
                    MassEval.params.PageList[index].redirectfrom = title;
                    MassEval.params.PageList[index].title = realtitle;
                    MassEval.params.PageList[index].talktitle = realtalktitle;
                    return MassEval.functions.getPageStatus(evaltheme, index, onlymissingeval);
                  }
                }
              }else if(missing){
                MassEval.params.PageList[index].pagemissing = 1;
              }else{
                var pageprops = pageinfo.pageprops;
                if(pageprops && pageprops.disambiguation === "") MassEval.params.PageList[index].disambig = true;
                var StubParams = MassEval.functions.getStubParams(wikitexte, evaltheme);
                for(var id in StubParams){
                  MassEval.params.PageList[index][id] = StubParams[id];
                }
                var categories = pageinfo.categories;
                if(categories && categories.length > 0){
                  var CatTemplate = MassEval.params.PortalCatTemplate;
                  var Prefix = CatTemplate.split("$1")[0];
                  var Suffix = CatTemplate.split("$1")[1];
                  var SuffixLength = Suffix.length;
                  MassEval.params.PageList[index].portals = [];
                  for(var a=0,l=categories.length;a<l;a++){
                    var thiscat = categories[a];
                    var pagetitle = thiscat.title.split(mw.config.get('wgFormattedNamespaces')[14]+':').join("");
                    var thisSuffix = pagetitle.substr((pagetitle.length-SuffixLength), SuffixLength);
                    if(pagetitle.indexOf(Prefix)===0 && thisSuffix === Suffix){
                      var portalName = pagetitle.split(Prefix).join("").split(Suffix).join("");
                      MassEval.params.PageList[index].portals.push(portalName);
                    }
                  }
                }
              }
            }else if(title ==  page.talktitle){
              if(missing){
                MassEval.params.PageList[index].talkmissing = 1;
              }else{
                var EvalParams = MassEval.functions.getEvalParams(wikitexte, evaltheme);
                for(var id in EvalParams){
                  MassEval.params.PageList[index][id] = EvalParams[id];
                }
              }
            }
          }
          if(onlymissingeval){
            if(MassEval.functions.setStubEvalDefaultParams(index, evaltheme)){
              MassEval.functions.fillBoardLine(index, evaltheme, true);
              MassEval.functions.checkFilterOptions();
            }
          }else{
            MassEval.functions.fillBoardLine(index, evaltheme, false);
            MassEval.functions.checkFilterOptions();
          }
          MassEval.functions.getPageStatus(evaltheme, (index+1), onlymissingeval);
        }
      });
    },
    setStubEvalDefaultParams : function(index, evaltheme){
      var show = false;
      var DefaultAVT = parseInt(document.getElementById("GlobalAddEvalAVTSelect").value);
      var DefaultIMP = parseInt(document.getElementById("GlobalAddEvalIMPSelect").value);
      var Infos = MassEval.params.PageList[index];
      var BEFORE = "BEF "+JSON.stringify(Infos);
      if(Infos.talkmissing == 1) show = true;
      if(Infos.evalAVT === null || typeof(Infos.evalAVT)==="undefined"){
        if(Infos.stub !== null) MassEval.params.PageList[index].evalAVT = 5;
        else MassEval.params.PageList[index].evalAVT = DefaultAVT;
        show = true;
      }
      if(Infos.evalIMP===null || typeof(Infos.evalIMP)==="undefined"){
        MassEval.params.PageList[index].evalIMP = DefaultIMP;
        show = true;
      }
      if(typeof(Infos.allIMP)==="undefined"){
        MassEval.params.PageList[index].allIMP = {};
        MassEval.params.PageList[index].allIMP[evaltheme] = DefaultIMP;
        show = true;
      }else if(typeof(Infos.allIMP[evaltheme])==="undefined"){
        MassEval.params.PageList[index].allIMP[evaltheme] = DefaultIMP;
        show = true;
      }
      return show;
    },
    checkPagesEvalDone : function(EmergencyStop){
      MassEval.functions.endPageAnalysis();
      MassEval.functions.checkFilterOptions();
      MassEval.functions.updateSortLink();
      MassEval.params.CatListRunning = false;
      if(EmergencyStop) MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopDone, "Stop");
    },
    getStubParams : function(WT, evaltheme){
      var StubParams = {
        stub : null,
        stubWT : ""
      };
      var Reg = new RegExp("\\{\\{ *"+MassEval.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(MassEval.functions.ucFirst(MassEval.params.StubTemplate)) != -1) continue;
            if(thisparam.indexOf(MassEval.functions.lcFirst(MassEval.params.StubTemplate)) != -1) continue;
            if(thisparam.indexOf("=") == -1){
              var stubtheme = MassEval.functions.ucFirst(thisparam);
              if(!StubParams.stub) StubParams.stub = [];
              if(StubParams.stub.indexOf(stubtheme)==-1) StubParams.stub.push(stubtheme);
              var ExistingTheme = (typeof(MassEval.params.StubThemes[MassEval.functions.ucFirst(stubtheme)]) !== "undefined");
              var existingTheme = (typeof(MassEval.params.StubThemes[MassEval.functions.lcFirst(stubtheme)]) !== "undefined");
              if( !ExistingTheme && !existingTheme){
                var adjDatas = MassEval.functions.getAdjDatas(stubtheme);
                if(adjDatas.type === null){
                  MassEval.params.StubThemes[stubtheme] = { };
                }
              }
            }
          }
        }
      }
      StubParams.stubWT = Wikitext;
      return StubParams;
    },
    getEvalParams : function(WT, evaltheme){
      var EvalParams = {
        evalAVT : null,
        evalIMP : null,
        evalWT : "",
        haseval : false
      };
      var Reg = new RegExp("\\{\\{ *"+MassEval.params.EvalTemplate+"[^\\{]*\\}\\}", "ig");
      var matches = WT.match(Reg);
      var Wikitext = "";
      if(matches != null){
        EvalParams.haseval = true
        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=MassEval.params.Avancement.length;avt<avtlen;avt++){
                var thisavt = MassEval.params.Avancement[avt];
                if(AVT == thisavt.wiki.replace(/\W/g, "")) EvalParams.evalAVT = avt;
              }
            } 
          }
          for(var p=0,plen=implicitparams.length;p<plen;p++){
            var thisimplicitparam = implicitparams[p];
            for(var imp=0,implen=MassEval.params.Importance.length;imp<implen;imp++){
              var thisimp = MassEval.params.Importance[imp];
              if(thisimplicitparam.replace(/\W/g, "") == thisimp.wiki.replace(/\W/g, "")){
                var theme = MassEval.functions.getForEvalThemeAlias(implicitparams[(p-1)]);
                if(theme.toLowerCase() == evaltheme.toLowerCase()) EvalParams.evalIMP = imp;
                if(!EvalParams.allIMP) EvalParams.allIMP = {};
                EvalParams.allIMP[theme] = imp;
              }
            }
          }
        }
      }
      for(var theme in EvalParams.allIMP){
        var ExistingTheme = (MassEval.params.EvalThemes.indexOf(MassEval.functions.ucFirst(theme)) === -1);
        var existingTheme = (MassEval.params.EvalThemes.indexOf(MassEval.functions.lcFirst(theme)) === -1);
        if(!ExistingTheme && !existingTheme){
          MassEval.functions.createNewEvalTheme(theme, false);
          var EvalThemeSelect = document.getElementById("EvalThemeInput");
          MassEval.functions.createEvalThemeSelect(EvalThemeSelect, EvalThemeSelect.value);
        }
      }
      EvalParams.evalWT = Wikitext;
      return EvalParams;
    },
    getForEvalThemeAlias : function(theme){
      var UCtheme = MassEval.functions.ucFirst(theme);
      var LCtheme = MassEval.functions.lcFirst(theme);
      if(MassEval.params.EvalThemesAliases[UCtheme]) return MassEval.params.EvalThemesAliases[UCtheme];
      if(MassEval.params.EvalThemesAliases[LCtheme]) return MassEval.params.EvalThemesAliases[LCtheme];
      return theme;
    },
  // ------------------------------- Fonctions pour le chargement des thèmes -------------------------------
    getStubThemes : function(){
      if(Object.keys(MassEval.params.StubThemes).length>0) return MassEval.functions.checkPreliminaryLoadings();
      var lastStubThemes = MassEval.functions.localStorage.getItem("StubThemes");
      var lastStubAdjM = MassEval.functions.localStorage.getItem("StubAdjM");
      var lastStubAdjF = MassEval.functions.localStorage.getItem("StubAdjF");
      if(lastStubThemes && lastStubAdjM && lastStubAdjF){
        MassEval.params.StubThemes = JSON.parse(lastStubThemes);
        MassEval.params.StubAdjM = JSON.parse(lastStubAdjM);
        MassEval.params.StubAdjF = JSON.parse(lastStubAdjF);
        console.info(Object.keys(MassEval.params.StubThemes).length+" thèmes d'ébauche retrouvés, ainsi que "+MassEval.params.StubAdjM.length+" adjectifs masculins et "+MassEval.params.StubAdjF.length+" adjectifs féminins. [localStorage]");
        MassEval.params.StubThemesOK = true;
        return MassEval.functions.checkPreliminaryLoadings();
      }
      var stubthemepage = MassEval.params.StubThemesPage;
      MassEval.functions.alertControl("getthemes", MassEval.texts.AlertMsgThemes, "Running");
      $.ajax({
        url: mw.util.wikiScript('api'),
        data: {format:'json',action:'query',prop:'revisions',rvprop:'content',rvlimit:1,titles:stubthemepage},
        success: function(data){
        var query = data.query;
        var page = query.pages[Object.keys(query.pages)[0]];        
        var Wikitext = page.revisions[0]["*"];
        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 =  MassEval.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 = [];
        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(allP.indexOf(target)!==-1 && typeof(p[al])==-1) p[al] = p[target];          
        }
        MassEval.params.StubAdjM = adjM.sort();
        MassEval.params.StubAdjF = adjF.sort();
        allP = Object.keys(p);
        for(var i=0,l=allP.length;i<l;i++){ allP[i] = MassEval.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[MassEval.functions.lcFirst(key)];
          MassEval.params.StubThemes[key] = P;
        }
        MassEval.functions.localStorage.setItem("StubThemes", JSON.stringify(MassEval.params.StubThemes));
        MassEval.functions.localStorage.setItem("StubAdjM", JSON.stringify(MassEval.params.StubAdjM));
        MassEval.functions.localStorage.setItem("StubAdjF", JSON.stringify(MassEval.params.StubAdjF));
        console.info(allP.length+" thèmes d'ébauche trouvés, ainsi que "+adjM.length+" adjectifs masculins et "+adjF.length+" adjectifs féminins.");
        MassEval.params.StubThemesOK = true;
        MassEval.functions.checkPreliminaryLoadings();
      }});
    },
    getEvalThemes : function(){
      if(MassEval.params.EvalThemes.length>0) return MassEval.functions.checkPreliminaryLoadings();
      var lastEvalThemes = MassEval.functions.localStorage.getItem("EvalThemes");
      var lastEvalThemesCat = MassEval.functions.localStorage.getItem("EvalThemesCat");
      var lastEvalThemesAliases = MassEval.functions.localStorage.getItem("EvalThemesAliases");
      if(lastEvalThemes && lastEvalThemesCat && lastEvalThemesAliases){
        MassEval.params.EvalThemes = JSON.parse(lastEvalThemes);
        MassEval.params.EvalThemesCat = JSON.parse(lastEvalThemesCat);
        MassEval.params.EvalThemesAliases = JSON.parse(lastEvalThemesAliases);
        console.info(MassEval.params.EvalThemes.length+" thèmes d'évaluation retrouvés, ainsi que "+Object.keys(MassEval.params.EvalThemesAliases).length+" alias. [localStorage]");
        MassEval.params.EvalThemesOK = true;
        return MassEval.functions.checkPreliminaryLoadings();
      }
      MassEval.functions.alertControl("getthemes", MassEval.texts.AlertMsgThemes, "Running");
      MassEval.functions.getAPIAllcategories({
        gacprefix : MassEval.params.EvalCategory,
        callback : function(R){
          var result = R.result;
          var CatList = Object.keys(result);
          for(var a=0,l=CatList.length;a<l;a++){
            var thiscat = result[CatList[a]];
            if(thiscat.missing==="") continue;
            var pagetitle = thiscat.title.split(mw.config.get('wgFormattedNamespaces')[14]+':').join("");
            var title = pagetitle;
            for(var p=0,plen=MassEval.params.EvalCatPrefixes.length;p<plen;p++){
              var EvalCatPrefix = MassEval.params.EvalCatPrefixes[p];
              title = title.split(EvalCatPrefix).join("");
            }
            if(title == pagetitle) continue;
            if(title.indexOf("/")!==-1 && MassEval.params.ManuEvalThemes.indexOf(title) === -1) continue;
            if(MassEval.params.FakeEvalThemes.indexOf(title)!==-1) continue;
            if(MassEval.params.EvalThemes.indexOf(title)!==-1) continue;
            MassEval.params.EvalThemes.push(title);            
          }
          if(MassEval.params.DefaultPortal && MassEval.params.EvalThemes.indexOf(MassEval.params.DefaultPortal)===-1) MassEval.params.EvalThemes.push(MassEval.params.DefaultPortal);
          for(var a=0,l=MassEval.params.MisplacedEvalThemes.length;a<l;a++){
            var thismanutheme = MassEval.params.MisplacedEvalThemes[a];
            if(MassEval.params.EvalThemes.indexOf(thismanutheme)===-1) MassEval.params.EvalThemes.push(thismanutheme);
          }
          MassEval.functions.getEvalThemesCats();
        }
      });
    },
    getEvalThemesCats : function(){
      var Page =  MassEval.params.EvalThemesUsusualCats;
      var DefaultCatTitle =  MassEval.params.EvalThemesDefaultCat;
      var NotDefaultCatTitle = MassEval.params.EvalThemesUnusualCatTemplate;
      $.ajax({
        url: mw.util.wikiScript('api'),
        data: {format:'json',action:'query',prop:'revisions',rvprop:'content',rvlimit:1,titles:Page},
        success: function(data){
          var query = data.query;
          var page = query.pages[Object.keys(query.pages)[0]];        
          var Wikitext = page.revisions[0]["*"];
          var Lines = Wikitext.split("\n");
          var SpecialCat = {};
          for(var a=0,l=Lines.length;a<l;a++){
            var Line = Lines[a];
            if(Line.indexOf("=")===-1) continue;
            if(Line.indexOf("#")!==-1) continue;
            var Project = Line.split("=")[0];
            Project = Project.replace(/.*\|/g, "");
            Project = Project.replace(/^ */g, "");
            Project = Project.replace(/ *$/g, "");
            if(MassEval.params.EvalThemes.indexOf(Project)===-1 && MassEval.params.EvalThemes.indexOf(MassEval.functions.lcFirst(Project))===-1){
              MassEval.params.EvalThemes.push(Project);
            }
            var CatTitle = Line.split("=")[1];
            CatTitle = CatTitle.replace(/^ /g, "");
            CatTitle = CatTitle.replace(/ $/g, "");
            SpecialCat[Project] = CatTitle;
          }
          for(var t=0,tlen=MassEval.params.EvalThemes.length;t<tlen;t++){
            var theme = MassEval.params.EvalThemes[t];
            var Theme = MassEval.functions.ucFirst(theme);
            if(typeof(SpecialCat[Theme])!=="undefined") MassEval.params.EvalThemesCat[theme] = NotDefaultCatTitle.split("$1").join(SpecialCat[Theme]);
            else MassEval.params.EvalThemesCat[theme] = DefaultCatTitle.split("$1").join(MassEval.functions.ucFirst(theme));
          }
          MassEval.params.EvalThemes.sort();
          MassEval.functions.getEvalThemesAliases();
        }
      });
    },
    getEvalThemesAliases : function(){
      var Page = MassEval.params.EvalThemesAliasesPage;
      $.ajax({
        url: mw.util.wikiScript('api'),
        data: {format:'json',action:'query',prop:'revisions',rvprop:'content',rvlimit:1,titles:Page},
        success: function(data){
          var query = data.query;
          var page = query.pages[Object.keys(query.pages)[0]];        
          var Wikitext = page.revisions[0]["*"];
          var Lines = Wikitext.split("\n");
          for(var a=0,l=Lines.length;a<l;a++){
            var Line = Lines[a];
            if(Line.indexOf("=")===-1) continue;
            if(Line.indexOf("#")!==-1) continue;
            if(Line.indexOf("}")!==-1) continue;
            if(Line.indexOf("{")!==-1) continue;
            var Aliases = Line.split("=")[0];
            Aliases = Aliases.replace(/^ *\|/g, "");
            Aliases = Aliases.replace(/ *$/g, "");
            Aliases = Aliases.replace(/ +\|/g, "|");
            Aliases = Aliases.replace(/\| +/g, "|");
            Aliases = Aliases.split("|");
            var Theme = Line.split("=")[1];
            Theme = Theme.replace(/^ /g, "");
            Theme = Theme.replace(/ $/g, "");
            for(var al=0,allen=Aliases.length;al<allen;al++){
              var Alias = MassEval.functions.ucFirst(Aliases[al]);
              var alias = MassEval.functions.lcFirst(Aliases[al]);
              MassEval.params.EvalThemesAliases[Alias] = Theme;
              MassEval.params.EvalThemesAliases[alias] = Theme;
            }
          }
          console.info(MassEval.params.EvalThemes.length+" thèmes d'évaluation trouvés, ainsi que "+Object.keys(MassEval.params.EvalThemesAliases).length+" alias.");
          MassEval.functions.localStorage.setItem("EvalThemes", JSON.stringify(MassEval.params.EvalThemes));
          MassEval.functions.localStorage.setItem("EvalThemesCat", JSON.stringify(MassEval.params.EvalThemesCat));
          MassEval.functions.localStorage.setItem("EvalThemesAliases", JSON.stringify(MassEval.params.EvalThemesAliases));
          MassEval.params.EvalThemesOK = true;
          MassEval.functions.checkPreliminaryLoadings();
        }
      });
    },
    createNewEvalTheme : function(theme, category){
      MassEval.params.EvalThemes.push(theme);
      MassEval.params.EvalThemesCat[theme] = category;
      MassEval.functions.localStorage.setItem("EvalThemes", JSON.stringify(MassEval.params.EvalThemes));
      MassEval.functions.localStorage.setItem("EvalThemesCat", JSON.stringify(MassEval.params.EvalThemesCat));
    },
    createEvalThemeSelect : function(Select, defaultoption, addemptyoption){
      if(!Select){
        Select = document.createElement('select');
        Select.className = "IMPtheme";
      }else{
        while(Select.firstChild) Select.removeChild(Select.firstChild);
      }
      $(Select).addClass("EvalThemeSelect");
      var Themes = MassEval.functions.sortTextList(MassEval.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 = MassEval.functions.ucFirst(title);
        opt.value = title;
        if(typeof(defaultoption)!=="undefined" && title == defaultoption) opt.selected = "selected";
        Select.appendChild(opt);
      }
      return Select;
    },
    getPortalList : function(){
      if(MassEval.params.PortalList.length > 0) return MassEval.functions.checkPreliminaryLoadings();
      var lastPortalList = MassEval.functions.localStorage.getItem("PortalList");
      if(lastPortalList){
        MassEval.params.PortalList = JSON.parse(lastPortalList);
        console.info(MassEval.params.PortalList.length+" catégories de portail retrouvées. [localStorage]");
        MassEval.params.PortalListOK = true;
        return MassEval.functions.checkPreliminaryLoadings();
      }
      MassEval.functions.alertControl("getthemes", MassEval.texts.AlertMsgThemes, "Running");
      var CatTemplate = MassEval.params.PortalCatTemplate;
      var Prefix = CatTemplate.split("$1")[0];
      var Suffix = CatTemplate.split("$1")[1];
      var SuffixLength = Suffix.length;
      MassEval.functions.getAPIAllcategories({
        gacprefix : Prefix,
        callback : function(R){
          var result = R.result;
          var CatList = Object.keys(result);
          for(var a=0,l=CatList.length;a<l;a++){
            var thiscat = result[CatList[a]];
            if(thiscat.missing==="") continue;
            var pagetitle = thiscat.title.split(mw.config.get('wgFormattedNamespaces')[14]+':').join("");
            var thisSuffix = pagetitle.substr((pagetitle.length-SuffixLength), SuffixLength);
            if(thisSuffix !== Suffix) continue;
            var portalName = pagetitle.split(Prefix).join("").split(Suffix).join("");
            if(MassEval.params.PortalList.indexOf(portalName)===-1) MassEval.params.PortalList.push(portalName);
          }
          console.info(MassEval.params.PortalList.length+" catégories de portail trouvées.");
          MassEval.functions.localStorage.setItem("PortalList", JSON.stringify(MassEval.params.PortalList));
          MassEval.params.PortalListOK = true;
          MassEval.functions.checkPreliminaryLoadings();
        }
      });
    },
    createPortalSelect : function(defaultvalue){
      var Select = document.getElementById("PortalInput");
      if(!Select){
        Select = document.createElement('select');
        Select.id = "PortalInput";
        Select.name = "PortalInput";
        $(Select).addClass("PortalSelect");
        Select.title = MassEval.texts.Portal;
      }else{
        while(Select.firstChild) Select.removeChild(Select.firstChild);
      }
      var Portals = MassEval.functions.sortTextList(MassEval.params.PortalList);
      if(Portals.length > 0){
        var emptyopt = Select.appendChild(document.createElement('option'));
        emptyopt.innerHTML = "";
        emptyopt.value = "";
        if(typeof(defaultoption)==="undefined") emptyopt.selected = "selected";
      }
      for(var a=0,l=Portals.length;a<l;a++){
        var title = Portals[a];
        var opt = Select.appendChild(document.createElement('option'));
        opt.innerHTML = MassEval.functions.ucFirst(title);
        opt.value = title;
        if(typeof(defaultoption)!=="undefined" && title == defaultoption) opt.selected = "selected";
      }
      MassEval.functions.updatePortalSelect();
      return Select;
    },
    updatePortalSelect : function(){
      var EvalThemeSelect = document.getElementById("EvalThemeInput");
      var PortalSelect = document.getElementById("PortalInput");
      if(!EvalThemeSelect || !PortalSelect) return;
      var EvalTheme = EvalThemeSelect.value;
      var PortalList = MassEval.params.PortalList;
      MassEval.functions.disableThings(["PortalInput"], true);
      PortalSelect.style.borderColor = "";
      if(PortalList.indexOf(MassEval.functions.ucFirst(EvalTheme))!==-1){
        PortalSelect.value = MassEval.functions.ucFirst(EvalTheme);
      }else if(PortalList.indexOf(MassEval.functions.lcFirst(EvalTheme))!==-1){
        PortalSelect.value = MassEval.functions.lcFirst(EvalTheme);
      }else{
        PortalSelect.value = "";
        MassEval.functions.disableThings(["PortalInput"], false);
        PortalSelect.style.borderColor = "red";
      }
    },
    getPortalSelectValue : function(){
      var PortalSelect = document.getElementById("PortalInput");
      if(!PortalSelect) return false;
      return PortalSelect.value;
    },
    getAPIUserInfos : function(){
      var lastTimeCorrection = MassEval.functions.localStorage.getItem("TimeCorrection");
      var lastAPILimit = MassEval.functions.localStorage.getItem("APILimit");
      if(lastTimeCorrection && lastAPILimit){
        MassEval.params.TimeCorrection = parseInt(JSON.parse(lastTimeCorrection));
        console.info("Correction des horaires "+MassEval.params.TimeCorrection+" retrouvée. [localStorage]");
        MassEval.params.APILimit = parseInt(JSON.parse(lastAPILimit));
        console.info("Limite API "+MassEval.params.APILimit+" retrouvée. [localStorage]");
        MassEval.params.UserInfosOK = true;
        return MassEval.functions.checkPreliminaryLoadings();
      }
      $.ajax({url: mw.util.wikiScript('api'),data:{format:'json',action:'query',meta:'userinfo',uiprop:'options|rights'},dataType:'json'}).then(function(data) {
        var query = data.query;
        if(query){
          var userinfo = query.userinfo;
          if(userinfo){
            var options = userinfo.options;
            if(options){
              var timecorrection = options.timecorrection;
              if(timecorrection){
                timecorrection = parseInt(timecorrection.replace(/.*\|/g, ""));  // "Offset|-75"
                if(!isNaN(timecorrection)){
                  MassEval.params.TimeCorrection = timecorrection;
                  console.info("Correction des horaires "+MassEval.params.TimeCorrection+" trouvée.");
                  MassEval.functions.localStorage.setItem("TimeCorrection", MassEval.params.TimeCorrection);
                }
              }
            }
            var rights = userinfo.rights;
            if(rights){
              var apihighlimits = (rights.indexOf("apihighlimits")!==-1);
              if(apihighlimits) MassEval.params.APILimit = 5000;
              else MassEval.params.APILimit = 500;
              console.info("Limite API "+MassEval.params.APILimit+" trouvée.");
              MassEval.functions.localStorage.setItem("APILimit", MassEval.params.APILimit);
            }
          }
        }
        MassEval.params.UserInfosOK = true;
        MassEval.functions.checkPreliminaryLoadings();
      });
    },
    checkPreliminaryLoadings : function(){
      var PARAMS = MassEval.params;
      var EvalThemeSelect = document.getElementById("EvalThemeInput");
      var Cond = PARAMS.LaunchCondition;
      if(PARAMS.EvalThemesOK && PARAMS.PortalListOK && !PARAMS.EvalThemeStuffsOK){
        MassEval.params.EvalThemeStuffsOK = true;
        MassEval.functions.createEvalThemeSelect(EvalThemeSelect, MassEval.params.DefaultPortal);
        MassEval.functions.createPortalSelect(MassEval.params.DefaultPortal);
        MassEval.functions.updateEvalTable(EvalThemeSelect.value);
        MassEval.functions.disableThings(["EvalThemeInput"], false);
      }
      if(PARAMS.EvalThemesOK && PARAMS.OptionsSubPageOK && !PARAMS.OptionsStuffsOK){
        MassEval.params.OptionsStuffsOK = true;
        MassEval.functions.disableThings(["GlobalOptionsInput"], false);
        var taboptionlink = document.getElementById("optionlinkintab");
        if(taboptionlink) $(taboptionlink).removeClass("disabledoptionlink");
      }
      if(PARAMS.StubThemesOK && PARAMS.EvalThemesOK && PARAMS.BeforeStubTemplatesOK && PARAMS.PortalListOK && !PARAMS.DatasStuffsOK){
        MassEval.params.DatasStuffsOK = true;
        var datalinkintab = document.getElementById("datalinkintab");
        if(datalinkintab) $(datalinkintab).removeClass("disableddatlink");
      }
      if(PARAMS.StubThemesOK && PARAMS.EvalThemesOK && PARAMS.PortalListOK && PARAMS.CatSubPageCountOK && PARAMS.UserInfosOK && !PARAMS.AllStuffsOK){
        MassEval.params.AllStuffsOK = true;
        MassEval.functions.disableThings([ "SubCatsCheckBox"], false);
        MassEval.functions.disableThings([ "GlobalVerifInput","GlobalAddEvalInput"], (Cond === 2));
        MassEval.functions.alertControl("getthemes");
        if(Cond === 4) MassEval.functions.getThesePagesStatus([mw.config.get('wgTitle')]);
      }
    },
  // ------------------------------- Fonctions pour le chargement des modèles à mettre avant le bandeau d'ébauche -------------------------------
    getBeforeStubTemplates : function(){
      if(MassEval.params.BeforeStubTemplatesOK) return; 
      var lastBeforeStubTemplates = MassEval.functions.localStorage.getItem("BeforeStubTemplates");
      if(lastBeforeStubTemplates){
        MassEval.params.BeforeStubTemplates = JSON.parse(lastBeforeStubTemplates);
        console.info(MassEval.params.BeforeStubTemplates.length + " modèles pré-{{Ébauche}} trouvés (redirects inclus). [localStorage]");
        MassEval.params.BeforeStubTemplatesOK = true 
        return;
      }
      var Cats = MassEval.params.BeforeStubTemplatesCats;
      for(var a=0,l=Cats.length;a<l;a++){
        var cat = Cats[a];
        MassEval.params.BeforeStubTemplatesReq++
        MassEval.functions.getAPICategorymembers({
          title      : (mw.config.get("wgFormattedNamespaces")[14]+":"+cat),
          cmprop     : 'title',
          cmtype     : 'page',
          callback   : function(R){
            MassEval.params.BeforeStubTemplatesReq--
            var result = R.result;
            for(var pi in R.result){
              var pageinfo = R.result[pi];
              var title = pageinfo.title;
              var ns = parseInt(pageinfo.ns);
              if(ns == 10){
                title = MassEval.functions.getNamespaceInfoFromPage(title, "PageName");
                if(MassEval.params.BeforeStubTemplates.indexOf(title)===-1) MassEval.params.BeforeStubTemplates.push(title);
              }
            }
            if(MassEval.params.BeforeStubTemplatesReq ===0){
              MassEval.functions.getBeforeStubTemplatesRedirects();
            }
          }
        });         
      }
    },
    getBeforeStubTemplatesRedirects : function(){
      var AddNsName = function(t){ return (mw.config.get("wgFormattedNamespaces")[10]+":"+t); }
      var BeforeStubTemplates = MassEval.functions.makeGroupsFromArray(MassEval.params.BeforeStubTemplates, 50, AddNsName);
      for(var a=0,l=BeforeStubTemplates.length;a<l;a++){
        MassEval.params.BeforeStubTemplatesReq++
        MassEval.functions.getAPILinkshere({
          title       : (BeforeStubTemplates[a].join("|")),
          lhshow      : 'redirect',
          lhprop      : 'title',
          lhnamespace : 10,
          callback: function(R){
            MassEval.params.BeforeStubTemplatesReq--
            var result = R.result;
            for(var page in result){
              var pageinfo = result[page];
              var linkshere = pageinfo.linkshere;
              if(linkshere){
                for(var item in linkshere){
                  var iteminfo = linkshere[item];
                  var title = iteminfo.title;
                  var ns = iteminfo.ns;
                  if(ns === 10){
                    title = MassEval.functions.getNamespaceInfoFromPage(title, "PageName");
                    if(MassEval.params.BeforeStubTemplates.indexOf(title)===-1) MassEval.params.BeforeStubTemplates.push(title);
                  }
                }
              }
            }
            if(MassEval.params.BeforeStubTemplatesReq ===0){
              MassEval.params.BeforeStubTemplates.sort();
              console.info(MassEval.params.BeforeStubTemplates.length + " modèles pré-{{Ébauche}} trouvés (redirects inclus).");
             // alert("MassEval.params.BeforeStubTemplates :\n\n" + MassEval.params.BeforeStubTemplates.join("\n")); 
              MassEval.functions.localStorage.setItem("BeforeStubTemplates", JSON.stringify(MassEval.params.BeforeStubTemplates));
              MassEval.params.BeforeStubTemplatesOK = true; 
            }
          }
        });
      }
    },
  // ------------------------------- Fonctions pour l'onglet des données -------------------------------
    openDatasForm : function(){
      var DatasDiv = document.getElementById("fieldsetDatasContainer");
      var DatasFS = document.getElementById("fieldsetDatas");
      if(!DatasDiv || !DatasFS) return;
      if(DatasDiv.style.display != "none"){
        return MassEval.functions.closeDatasForm();
      }else{
        DatasDiv.style.display = "";
        var Legend = DatasFS.appendChild(document.createElement('legend'));
        Legend.innerHTML = MassEval.texts.GoDatasText;
        var P = DatasFS.appendChild(document.createElement('p'));
        P.style.textAlign = "center";
        var ULs = [
          DatasFS.appendChild(MassEval.functions.createEvalUL("evaldataUL")),
          DatasFS.appendChild(MassEval.functions.createStubUL("stubdataUL")),
          DatasFS.appendChild(MassEval.functions.createDiversUL("divdataUL")),
          DatasFS.appendChild(MassEval.functions.createRAZUL("RAZdataUL")) 
        ];
        for(var a=0,l=ULs.length;a<l;a++){
          MassEval.functions.setColumnsWidth(ULs[a].getElementsByTagName('ul')[0]);
        }
        MassEval.functions.createToggleButtons(P, ULs, "Datas");
      }
    },
    createDataSimple : function(UL, Data){
      var LI = UL.appendChild(document.createElement('li'));
      $(LI).addClass('DataLI');
      var Label = LI.appendChild(document.createElement('label'));
      Label.innerHTML = MassEval.texts[("OPTION"+Data)] || Data;
      LI.appendChild(document.createTextNode(' : '));
      var Span = LI.appendChild(document.createElement('span'));
      $(Span).addClass('DataInfo');
      Span.innerHTML = JSON.stringify(MassEval.params[Data]);
    },
    createDataMultiple : function(UL, Data){
      var multiple = MassEval.params[Data];
      var LI = UL.appendChild(document.createElement('li'));
      $(LI).addClass('DataLI');
      var Label = LI.appendChild(document.createElement('label'));
      Label.innerHTML = MassEval.texts[("OPTION"+Data)] || Data;
      LI.appendChild(document.createTextNode(' : '));
      var subUL = LI.appendChild(document.createElement('ul'));
      $(subUL).addClass('DatasubUL');
      for(var id in multiple){
        if(multiple.hasOwnProperty(id)){
          var subLI = subUL.appendChild(document.createElement('li'));
          var SpanWrapper = subLI.appendChild(document.createElement('span'));
          if(typeof(parseInt(id)) !== "number" || (""+parseInt(id)) === "NaN"){
            var Label = SpanWrapper.appendChild(document.createElement('label'));
            Label.innerHTML = MassEval.texts[("OPTION"+id)] || id;
            SpanWrapper.appendChild(document.createTextNode(' : '));
          }
          var Span = SpanWrapper.appendChild(document.createElement('span'));
          $(Span).addClass('DataInfo');
          Span.style.whiteSpace = "nowrap";
          Span.innerHTML = JSON.stringify(multiple[id]);
        }
      }
    },
    createEvalUL : function(ID){
      var Div = document.createElement('div');
      Div.id = ID;
      var UL = Div.appendChild(document.createElement('ul'));
      var Datas = [ 
        {name:"EvalTemplate"},
        {name:"EvalThemes",type:"multiple"},
        {name:"EvalThemesAliasesPage"},
        {name:"EvalThemesAliases",type:"multiple"},
        {name:"EvalCategory"},
        {name:"EvalCatPrefixes"},
        {name:"EvalThemesDefaultCat"},
        {name:"EvalThemesUsusualCats"},
        {name:"EvalThemesUnusualCatTemplate"},
        {name:"EvalCatsPrefixes"},
        {name:"EvalCatsCommonPrefix"},
        {name:"EvalThemesCat",type:"multiple"},
        {name:"MisplacedEvalThemes",type:"multiple"},
        {name:"PortalCatTemplate"},
        {name:"PortalList",type:"multiple"},
        {name:"Avancement",type:"multiple"},
        {name:"Importance",type:"multiple"},
      ];
      for(var a=0,l=Datas.length;a<l;a++){
        if(Datas[a].type === "multiple") MassEval.functions.createDataMultiple(UL, Datas[a].name);
        else MassEval.functions.createDataSimple(UL, Datas[a].name);
      }
      return Div;
    },
    createStubUL : function(ID){
      var Div = document.createElement('div');
      Div.id = ID;
      var UL = Div.appendChild(document.createElement('ul'));
      var Datas = [ 
        {name:"StubTemplate"},
        {name:"StubThemesPage"},
        {name:"StubThemes",type:"multiple"},
        {name:"StubAdjM",type:"multiple"},
        {name:"StubAdjF",type:"multiple"},
      ];
      for(var a=0,l=Datas.length;a<l;a++){
        if(Datas[a].type === "multiple") MassEval.functions.createDataMultiple(UL, Datas[a].name);
        else MassEval.functions.createDataSimple(UL, Datas[a].name);
      }
      return Div;
    },
    createDiversUL : function(ID){
      var Div = document.createElement('div');
      Div.id = ID;
      var UL = Div.appendChild(document.createElement('ul'));
      MassEval.params.MissingTexts = MassEval.functions.getMissingTexts();
      MassEval.params.UnusedTexts = MassEval.functions.getUnusedTexts();
      var Datas = [ 
        {name:"MissingTexts",type:"multiple"},
        {name:"UnusedTexts",type:"multiple"},
        {name:"BeforeStubTemplatesCats"},
        {name:"BeforeStubTemplates",type:"multiple"},
        {name:"ModesMap",type:"multiple"},
        {name:"CurrentHeights"},
        {name:"SortOptions"},
        {name:"BorderStyles"},
        {name:"SizeUnits"},
        {name:"DivIDsToPreview"},
        {name:"TalkSubPagesToAvoid"},
        {name:"Accents",type:"multiple"},
        {name:"FontFamilies",type:"multiple"},
        {name:"EvalCatAllpages"},
        {name:"EvalCatStubpages"},
        {name:"SpecialpageName"},
        {name:"OptionsSubPage"},
        {name:"TestPage"},
        {name:"APILimit"},
        {name:"TimeCorrection"},
        {name:"localStorageExpiry"},
        {name:"ChangesToMakeDelay"},
      ];
      for(var a=0,l=Datas.length;a<l;a++){
        if(Datas[a].type === "multiple") MassEval.functions.createDataMultiple(UL, Datas[a].name);
        else MassEval.functions.createDataSimple(UL, Datas[a].name);
      }
      return Div;
    },
    createRAZUL : function(ID){
      var Div = document.createElement('div');
      Div.id = ID;
      var UL = Div.appendChild(document.createElement('ul'));
      var Items = MassEval.params.localStorageItems;
      for(var a=0,l=Items.length;a<l;a++){
        var itemname = Items[a];
        var LI = UL.appendChild(document.createElement('li'));
        $(LI).addClass('DataLI');
        var RAZInput = LI.appendChild(MassEval.functions.createInput({type:"button",name:itemname,value:MassEval.texts.GoDatasRAZText,title:MassEval.texts.GoDatasRAZTitle}));
        RAZInput.onclick = function(){
          localStorage.removeItem(this.name);
          localStorage.removeItem((this.name+"_TS"));
          delete MassEval.params.localStorageTimestamps[(this.name+"_TS")];
        }
        var Label = LI.appendChild(document.createElement('label'));
        Label.setAttribute("for", itemname);
        Label.innerHTML = " <code>"+itemname+"</code> : "+(MassEval.texts[("OPTION"+itemname)] || itemname);
        Label.title = MassEval.functions.calculateRemainingTime(MassEval.params.localStorageTimestamps[(itemname+"_TS")]);
        var multiple = MassEval.params[itemname];
        if(typeof(multiple)==="object"){
          var subUL = LI.appendChild(document.createElement('ul'));
          $(subUL).addClass('DatasubUL');
          for(var id in multiple){
            if(multiple.hasOwnProperty(id)){
              var subLI = subUL.appendChild(document.createElement('li'));
              var SpanWrapper = subLI.appendChild(document.createElement('span'));
              if(typeof(parseInt(id)) !== "number" || (""+parseInt(id)) === "NaN"){
                var Label = SpanWrapper.appendChild(document.createElement('label'));
                Label.innerHTML = MassEval.texts[("OPTION"+id)] || id;
                SpanWrapper.appendChild(document.createTextNode(' : '));
              }
              var Span = SpanWrapper.appendChild(document.createElement('span'));
              $(Span).addClass('DataInfo');
              Span.style.whiteSpace = "nowrap";
              Span.innerHTML = JSON.stringify(multiple[id]);
            }
          }
        }else{
          LI.appendChild(document.createTextNode(" : "));
          var Span = LI.appendChild(document.createElement('span'));
          $(Span).addClass('DataInfo');
          Span.innerHTML = JSON.stringify(multiple);
        }
      }
      return Div;
    },
    calculateRemainingTime(timestamp){
      if(typeof(timestamp)!== "number") return false;
      var now = new Date().getTime();
      var remaining = ( (MassEval.params.localStorageExpiry*60*60*1000) - (now-timestamp));
      var Hremaining = Math.floor(remaining / (60*60*1000));
      var Mremaining = Math.floor( (remaining-(Hremaining*60*60*1000)) / (60*1000));
      var template = MassEval.texts.localStorageExpiryT; // "$h heures et $m mimutes",
      return template.split("$h").join(Hremaining).split("$m").join(Mremaining)
    },
    getMissingTexts : function(){
      var missingExplaination = {};
      for(var text in MassEval.texts){
        if(text.indexOf("OPTION")!=-1) continue;
        var opt = "OPTION"+text;
        if(typeof(MassEval.texts[opt])!="string") missingExplaination[('OPTION'+text)] = MassEval.texts[text];
      }
      for(var text in MassEval.styles){
        var opt = "OPTION"+text;
        if(typeof(MassEval.texts[opt])!="string") missingExplaination[('OPTION'+text)] = MassEval.styles[text];
      }
      return missingExplaination;
    },
    getUnusedTexts : function(){
      var NOTunused = ["params","styles","texts","moreparams","evaldataUL","stubdataUL","divdataUL","RAZdataUL","UnusedTexts"];
      var unusedExplaination = {};
      var Texts = MassEval.texts;
      var Styles = MassEval.styles;
      var Params = MassEval.params;
      for(var text in Texts){
        if(text.indexOf("OPTION")===-1) continue;
        var thisExpl = text.substr(6, (text.length-6));
        if(NOTunused.indexOf(thisExpl)!==-1) continue;
        if(typeof( Texts[thisExpl])!=="undefined") continue;
        if(typeof(Styles[thisExpl])!=="undefined") continue;
        if(typeof(Params[thisExpl])!=="undefined") continue;
        unusedExplaination[text] = Texts[text];
      }
      return unusedExplaination;
    },
    setColumnsWidth : function(UL){
      if(!UL) return;
      var subULs = UL.getElementsByTagName('ul');
      for(var a=0,l=subULs.length;a<l;a++){
        var subUL = subULs[a];
        var max = 0;
        var subLIs = subUL.getElementsByTagName('li');
        for(var li=0,lilen=subLIs.length;li<lilen;li++){
          var W = $(subLIs[li].firstChild).width();
          if(W > max) max = W;
        }
        subUL.setAttribute("style", "-webkit-columns:"+(max+5)+"px;-moz-columns:"+(max+5)+"px;columns:"+(max+5)+"px;");
        var toggleLink = subUL.parentNode.insertBefore(MassEval.functions.createLink(null,{text:MassEval.texts.Show,title:MassEval.texts.ShowTip,href:"javascript:;"}), subUL);
        toggleLink.style.marginLeft = "1.5em";
        toggleLink.onclick = function(){
          if(this.innerHTML == MassEval.texts.Show){
            this.nextSibling.style.display = "";
            this.innerHTML = MassEval.texts.Hide;
            this.title = MassEval.texts.HideTip;
          }else{
            this.nextSibling.style.display = "none";
            this.innerHTML = MassEval.texts.Show;
            this.title = MassEval.texts.ShowTip;
          }
        }
        subUL.style.display = "none";
      }
    },
    closeDatasForm : function(){
      var DatasDiv = document.getElementById("fieldsetDatasContainer");
      var DatasFS = document.getElementById("fieldsetDatas");
      if(!DatasDiv || !DatasFS) return;
      DatasDiv.style.display = "none";
      while(DatasFS.firstChild){  DatasFS.removeChild(DatasFS.firstChild); }
    },
  // ------------------------------- Fonctions pour la personnalisation automatique -------------------------------
    getUserSubPage : function() {
      if(MassEval.params.OptionsSubPageOK) return;
      var Page = mw.config.get('wgFormattedNamespaces')[2]+':'+mw.config.get('wgUserName')+MassEval.params.OptionsSubPage;
      $.ajax({
        url: mw.util.wikiScript('api'),
        data: { format:'json',action:'query',prop:'revisions|info',rvlimit:1,rvprop:'content',titles:Page},
        success: function(data) {
          var query = data.query;
          if(!query){
            MassEval.params.OptionsSubPageOK = true;
            return MassEval.functions.checkPreliminaryLoadings();
          }
          var pageinfo = query.pages[Object.keys(query.pages)[0]];
          var missing = (pageinfo.missing === "");
          if(missing){
            MassEval.params.OptionsSubPageOK = true;
            return MassEval.functions.checkPreliminaryLoadings();
          } 
          var Text = pageinfo.revisions[0]["*"];
          var CommentStart = MassEval.params.OptionsPageCommentStart;
          var CommentEnd = MassEval.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, "");
              MassEval.params.OptionsMoreParams = MoreParams;
              if(MoreParams) console.info("Trouvé personnalisation supplémentaire.");
              else console.info("Pas trouvé de personnalisation supplémentaire.");
            }
          }
          MassEval.params.OptionsSubPageOK = true;
          MassEval.functions.checkPreliminaryLoadings();
        }
      });
    },
    setDefaultParams : function() {
      MassEval.params.DEFAULTparams = {};
      var EditableParams = MassEval.params.EditableParams;
      for(var a=0,l=EditableParams.length;a<l;a++){
        var paramname = EditableParams[a];
        if(typeof(MassEval.params[paramname])!=="undefined") MassEval.params.DEFAULTparams[paramname] = MassEval.params[paramname];
      }
      MassEval.params.DEFAULTtexts = {};
      var Texts = MassEval.texts;
      for(var textname in Texts){
        MassEval.params.DEFAULTtexts[textname] = Texts[textname];
      }
      MassEval.params.DEFAULTstyles = {};
      var Styles = MassEval.styles;
      for(var stylename in Styles){
        MassEval.params.DEFAULTstyles[stylename] = Styles[stylename];
      }
    },
    getCustomParams : function() {
      var customFunc = ["Lang", "Site", "User"];
      for(var a=0,l=customFunc.length;a<l;a++){
        var funcName = "MassEval_"+customFunc[a]+"Custom";        
        if(typeof(window[funcName])==="function") try{ window[funcName](); }catch(e){ console.warn(funcName+"()\n------\n"+e.message); }
      }
    },
    updateOptions : function(){
      var F = document.getElementById("fieldsetOptions");
      if(!F) return;
      var NewParamText = [];
      var MoreParams = "";
      var ULs = F.getElementsByTagName('ul');
      var foundIssues = [];
      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];
          if($(LI).hasClass("dummyLI")) continue;
          var More = MassEval.functions.getFirstElementByName(LI, ["textarea"], "moreparams");
          if(More){
            MoreParams = More.value;
          }else{
            var Type = MassEval.functions.getFirstElementByName(LI, ["input"], "type");
            var Name = MassEval.functions.getFirstElementByName(LI, ["input"], "name");
            var DefaultNode = MassEval.functions.getFirstElementByName(LI, ["input",], "default");
            var ActualNode = MassEval.functions.getFirstElementByName(LI, ["textarea","select","input"], "actual");
            if(!Type || !Name || !DefaultNode || !ActualNode){
              if(!Type) console.log("item Type manquant : "+type+" "+i);
              if(!Name) console.log("item Name manquant : "+type+" "+i);
              if(!DefaultNode) console.log("item DefaultNode manquant : "+type+" "+i);
              if(!ActualNode) console.log("item ActualNode manquant : "+type+" "+i);              
              continue;
            }
            var Test = MassEval.functions.checkThatModifiedOption(LI, ActualNode, ActualNode.value);
            if(Test) foundIssues.push(Test);
            Type = Type.value;
            Name = Name.value;
            var Actual  = (Type=="boolean" ? ActualNode.checked         : ActualNode.value);
            var Default = (Type=="boolean" ? (DefaultNode.value == "true") : DefaultNode.value);
            if(Type=="string" && (Default.split("/n").length-1) === 0) Actual = Actual.split("/n").join("");
            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("  MassEval.functions.customize('"+type+"','"+Name+"',"+Actual+");\n");
          }
        }
      }
      if(foundIssues.length > 0) return MassEval.functions.alertControl(("foundoptionissue_"+a+"_"+i), foundIssues.join("</br>"), "Warning");
      else MassEval.functions.alertControl(("foundoptionissue_"+a+"_"+i));
      NewParamText = "\n"+NewParamText.join("\n")+'\n\n'+MassEval.params.OptionsPageCommentStart+MoreParams+MassEval.params.OptionsPageCommentEnd;
      NewParamText = MassEval.params.OptionsPageTemplate.split("$1").join(NewParamText);
      // return alert(NewParamText);
      MassEval.functions.saveOptions(NewParamText, MoreParams);
    },
    saveOptions : function(NewParamText, MoreParams){
      var title = mw.config.get('wgFormattedNamespaces')[2]+':'+mw.config.get('wgUserName')+MassEval.params.OptionsSubPage;
      MassEval.functions.alertControl("saveoptions", MassEval.texts.AlertMsgSaveParams.split("$page").join(title), "Running");
      $.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: MassEval.texts.SaveParamsResume.split("$docpage").join(MassEval.params.DocPage),
            basetimestamp: "now",
            format: 'json',
            token: data.query.tokens.csrftoken
          },
          dataType: 'json',
          success: function(data){
            var DEFAULTparams = MassEval.params.DEFAULTparams;
            for(var dp in DEFAULTparams){ MassEval.params[dp] = DEFAULTparams[dp]; }
            var DEFAULTstyles = MassEval.params.DEFAULTstyles;
            for(var ds in DEFAULTstyles){ MassEval.styles[ds] = DEFAULTstyles[ds]; }
            var DEFAULTtexts = MassEval.params.DEFAULTtexts;
            for(var dt in DEFAULTtexts){ MassEval.texts[dt] = DEFAULTtexts[dt]; }
            try{
              eval(NewParamText);
              window.MassEval_UserCustom();
              MassEval.functions.setCSSstyles();
            }catch(e){ console.error(e.message); }
            MassEval.params.OptionsMoreParams = MoreParams;
            if(MassEval.params.SearchForPortalTag) $(document.body).removeClass("hideportals");
            else $(document.body).addClass("hideportals");
            MassEval.functions.alertControl("saveoptions");
            MassEval.functions.openOptionsForm(true);
          }
        });
      });
    }, 
    customize : function(type, optname, optvalue){
      if(!type || !optname || typeof(optvalue)==="undefined") return;
      if(typeof(type)!=="string" || typeof(optname)!=="string") return; 
      if(['params','texts','styles'].indexOf(type)===-1) return;
      if(typeof(optvalue)!=="string" && typeof(optvalue)!=="number" && typeof(optvalue)!=="boolean") return;      
      var Default = MassEval.params[("DEFAULT"+type)];
      if(typeof(Default)!=="object") return;
      Default = Default[optname];
      if(typeof(Default)==="undefined") return;
      MassEval[type][optname] = optvalue;
      var p = { texts:"texte",params:"paramètre",styles:"style"};
      var msg = "Personnalisation " + p[type] + " \""+optname+"\" : "
              + (typeof(Default)==="string" ? "\""+Default+"\" → \""+optvalue+"\"" : Default+" → "+optvalue)
      console.info(msg);
    }, 
    unsafeCustomize : function(type, optname, optvalue){
      MassEval[type][optname] = optvalue;
    }, 
    createParamsUL : function(){
      var Div = document.createElement('div');
      Div.id = "params";
      var UL = document.createElement('ul');
      UL.id = "OPTIONULparams";
      UL.className = "optionsUL"; 
      Div.appendChild(UL)
      var ActualParams = MassEval.params;
      var EditableParams = MassEval.params.EditableParams;
      var DEFAULTparams = MassEval.params.DEFAULTparams;
      for(var a=0,l=EditableParams.length;a<l;a++){
        var paramname = EditableParams[a];
        var LI = UL.appendChild(document.createElement('li'));
        $(LI).addClass("OptionparamsLI");
        var defaultparam = DEFAULTparams[paramname];
        var actualparam = ActualParams[paramname];
        var modified = (actualparam !== defaultparam);
        var HiddenName = LI.appendChild(MassEval.functions.createInput({type:'hidden',name:"name",value:paramname}));
        var HiddenType = LI.appendChild(MassEval.functions.createInput({type:'hidden',name:"type",value:typeof(defaultparam)}));
        var DefaultHidden = LI.appendChild(MassEval.functions.createInput({type:'hidden',name:"default",value:defaultparam}));
        var DefaultInput = LI.appendChild(MassEval.functions.createInput({type:'button',name:"defaultB",value:MassEval.texts.DefButtonText,
                                                             title:MassEval.texts.DefButtonTitle.split("$1").join(defaultparam)}));
        DefaultInput.onclick = function(){ 
          MassEval.functions.razModifiedOption(this, "params"); 
        }
        var ActualInput;
        if(typeof(defaultparam)==="boolean"){
          ActualInput = LI.appendChild(MassEval.functions.createInput({type:'checkbox',name:"actual",value:actualparam}));
          if(actualparam) ActualInput.checked = "checked";
        }else{
          ActualInput = LI.appendChild(MassEval.functions.createInput({type:'text',name:"actual",value:actualparam}));
          ActualInput.className = ("OptInput" + (typeof(defaultparam) === "number" ? "Nbr" : "Str" ));
        }
        LI.appendChild(ActualInput);
        LI.appendChild(document.createTextNode(" : "));
        var Label = LI.appendChild(document.createElement('label'));
        Label.innerHTML = MassEval.texts[("OPTION"+paramname)] || ("OPTION"+paramname);
        if(modified){
          $(LI).addClass("modifiedoption");
          Label.title = MassEval.texts.OptionModified;
        }else{
          DefaultInput.disabled = "disabled";
        }
        Label.setAttribute('for', paramname);
        if(ActualInput.tagName.toLowerCase() == "input" && ActualInput.type == "checkbox")
          ActualInput.onclick = function(){ MassEval.functions.checkModifiedOption(this, "params"); };
        else if(ActualInput.tagName.toLowerCase() == "input")
          ActualInput.onkeyup = function(){ MassEval.functions.checkModifiedOption(this, "params"); };
      }
      return Div;
    },
    setInputToSelects : function(){
      var UL = document.getElementById("OPTIONULparams");
      if(!UL) return;
      var MoreWidth = (MassEval.params.OptionSelectWidthPlus[(mw.config.get("skin"))] ? 4 : 0 );
      var Lis = UL.getElementsByTagName('li');
      var NewActualSelect;
      for(var a=0,l=Lis.length;a<l;a++){
        LI = Lis[a];
        var NameInput = MassEval.functions.getFirstElementByName(LI, ["input"], "name");
        var ActualInput = MassEval.functions.getFirstElementByName(LI, ["input"], "actual");
        if(!NameInput || !ActualInput) continue;
        var paramname = NameInput.value;
        var actualparam = ActualInput.value;
        var modified = false;
        if(paramname == "DefaultPortal"){
          NewActualSelect = MassEval.functions.createEvalThemeSelect(null, actualparam, (actualparam === ""));
          modified = true;
        }
        if(modified){
          NewActualSelect.name = "actual";
          NewActualSelect.style.width = ($(ActualInput).width() + MoreWidth)+"px";
          ActualInput.parentNode.insertBefore(NewActualSelect, ActualInput);
          ActualInput.parentNode.removeChild(ActualInput);
          NewActualSelect.onchange = function(){ MassEval.functions.checkModifiedOption(this, "params"); };
        }
      }
    },
    setIconPreview : function(){
      var UL = document.getElementById("OPTIONULparams");
      if(!UL) return;
      var Lis = UL.getElementsByTagName('li');
      for(var a=0,l=Lis.length;a<l;a++){
        LI = Lis[a];
        var NameInput = MassEval.functions.getFirstElementByName(LI, ["input"], "name");
        var ActualInput = MassEval.functions.getFirstElementByName(LI, ["input"], "actual");
        if(!NameInput || !ActualInput) continue;
        var paramname = NameInput.value;
        var actualparam = ActualInput.value;
        var suffix = paramname.substr((paramname.length-4), 4);
        if(suffix == "Icon"){
          ActualInput.id = paramname;
          ActualInput.onfocus = function(){
            var ID = this.id;
            var ExistingPreview = document.getElementById("ImagePreview_"+ID);
            if(!ExistingPreview){
              var ExistingPreviewSpan = this.parentNode.insertBefore(document.createElement('span'), this.nextSibling);
              $(ExistingPreviewSpan).addClass("ImagePreviewSpan");
              ExistingPreview = ExistingPreviewSpan.appendChild(document.createElement('img'));
              ExistingPreview.id = "ImagePreview_"+ID;
              ExistingPreview.className = "ImagePreview";
            }
            ExistingPreview.src = (MassEval.params.ImageURL + this.value);
            $(ExistingPreview).fadeIn("fast");
          }
          ActualInput.onkeyup = function(){
            var ID = this.id;
            var ExistingPreview = document.getElementById("ImagePreview_"+ID);
            if(!ExistingPreview){
              var ExistingPreviewSpan = this.parentNode.insertBefore(document.createElement('span'), this.nextSibling);
              $(ExistingPreviewSpan).addClass("ImagePreviewSpan");
              ExistingPreview = ExistingPreviewSpan.appendChild(document.createElement('img'));
              ExistingPreview.id = "ImagePreview_"+ID;
              ExistingPreview.className = "ImagePreview";
              $(ExistingPreview).fadeIn("fast");
            }
            ExistingPreview.src = (MassEval.params.ImageURL + this.value);
            MassEval.functions.checkModifiedOption(this, "params");
          }
          ActualInput.onblur = function(){
            var ID = this.id;
            var ExistingPreview = document.getElementById("ImagePreview_"+ID);
            if(ExistingPreview) $(ExistingPreview).fadeOut("fast");
          }
        }
      }
    },
    createStylesUL : function(){
      var Div = document.createElement('div');
      Div.id = "styles";
      var UL = document.createElement('ul');
      UL.id = "OPTIONULstyles";
      UL.className = "optionsUL";
      Div.appendChild(UL)
      var ActualStyles = MassEval.styles;
      var DEFAULTstyles = MassEval.params.DEFAULTstyles;
      for(var stylename in DEFAULTstyles){
        var modified = false;
        var LI = UL.appendChild(document.createElement('li'));
        $(LI).addClass("OptionstylesLI");
        var defaultstyle = DEFAULTstyles[stylename];
        var actualstyle = ActualStyles[stylename];
        if(actualstyle !== defaultstyle) modified = true;
        var FORM = LI.appendChild(document.createElement('form'));
        FORM.onsubmit = function(){ return false; };
        var HiddenName = FORM.appendChild(MassEval.functions.createInput({type:'hidden',name:"name",value:stylename}));
        var HiddenType = FORM.appendChild(MassEval.functions.createInput({type:'hidden',name:"type",value:typeof(defaultstyle)}));
        var DefaultHidden = FORM.appendChild(MassEval.functions.createInput({type:'hidden',name:"default",value:defaultstyle}));
        var DefaultInput = FORM.appendChild(MassEval.functions.createInput({type:'button',name:"defaultB",
                           value:MassEval.texts.DefButtonText,title:MassEval.texts.DefButtonTitle.split("$1").join(defaultstyle)}));
        DefaultInput.onclick = function(){
          MassEval.functions.razModifiedOption(this, "styles"); 
        }
        var ActualInput = FORM.appendChild(MassEval.functions.createInput({type:'text',name:"actual",value:actualstyle}));
        ActualInput.className = "OptInputCSS";
        ActualInput.onkeyup = function(){ MassEval.functions.checkModifiedOption(this, "styles"); };
        LI.appendChild(document.createTextNode(" : "));
        var Label = LI.appendChild(document.createElement('label'));
        var SizeUnits = MassEval.params.SizeUnits
        for(var a=0,l=SizeUnits.length;a<l;a++){
          var thisunit = SizeUnits[a];
          if(defaultstyle.indexOf(thisunit)!==-1){
            $(ActualInput).addClass("SizeUnit");
            ActualInput.title = MassEval.texts.SizeUnitTip.split("$units").join(SizeUnits.join(", "));
          }
        }
        Label.innerHTML = MassEval.texts[("OPTION"+stylename)] || ("OPTION"+stylename);
        if(modified){
          $(LI).addClass("modifiedoption");
          Label.title = MassEval.texts.OptionModified;
        }else{
          DefaultInput.disabled = "disabled";
        }
        Label.setAttribute('for', stylename);
      }
      return Div;
    },
    setFontFamilySelector : function(){
      var UL = document.getElementById("OPTIONULstyles");
      if(!UL) return;
      var li = UL.getElementsByTagName('li')[0];
      if(!li) return;
      var Input = MassEval.functions.getFirstElementByName(li, ["input"], "actual");
      if(!Input) return;
      var Select = document.createElement("select");
      var FontFamilies = MassEval.params.FontFamilies;
      for(var fam in FontFamilies){
        var optgroup = Select.appendChild(document.createElement("optgroup"));
        optgroup.setAttribute("label", "— "+fam+" —");
        var Families = FontFamilies[fam].sort();
        for(var a=0,l=Families.length;a<l;a++){
          var thisfam = Families[a];
          if(MassEval.functions.fontTest(thisfam, fam)){
            var opt = Select.appendChild(document.createElement("option"));
            opt.value = thisfam;
            opt.innerHTML = thisfam;
            opt.style.fontFamily = thisfam;
            opt.onmouseover = function(){ $("#FontTester").style.style.fontFamily = this.value; }
          }
        }
      }
      Select.onchange = function(){
        this.nextSibling.style.fontFamily = this.value;
        MassEval.functions.checkModifiedOption(this, "styles");
      }
      Select.value = Input.value;
      Select.name = "actual";
      var Width = Input.clientWidth;
      var MoreWidth = (MassEval.params.OptionSelectWidthPlus[(mw.config.get("skin"))] ? 4 : 0);
      Select.style.width = (Width+ MoreWidth)+"px";
      Input.parentNode.insertBefore(Select, Input);
      var FontTester = Input.parentNode.insertBefore(document.createElement("div"), Input);
      FontTester.id = "FontTester";
      FontTester.style.display = "none";
      FontTester.innerHTML = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit.";
      Select.onfocus = function(){ 
        this.nextSibling.style.fontFamily = Select.value;
        $("#FontTester").fadeIn("fast");
      };
      Select.onblur = function(){ $("#FontTester").fadeOut("fast"); };
      Input.parentNode.removeChild(Input);
    },
    setColorPickers : function(){
      var UL = document.getElementById("OPTIONULstyles");
      if(!UL) return;
      var Lis = UL.getElementsByTagName('li');
      var stylescount = 0;
      for(var a=0,l=Lis.length;a<l;a++){
        LI = Lis[a];
        var DefaultInput = MassEval.functions.getFirstElementByName(LI, ["input"], "default");
        var TextInput = MassEval.functions.getFirstElementByName(LI, ["input"], "actual");
        if(!DefaultInput || !TextInput ) continue;
        var defaultstyle = DefaultInput.value;
        if(defaultstyle.indexOf("#")===0){
          TextInput.title = MassEval.texts.ColorInput;
          var colorpickerDiv = TextInput.parentNode.insertBefore(document.createElement('div'), TextInput.nextSibling);
          colorpickerDiv.id = "Divcolorpicker"+stylescount;
          colorpickerDiv.style.display = "none";
          colorpickerDiv.className = "colorpickerDiv";
          var colorpicker = colorpickerDiv.appendChild(document.createElement('div'));
          colorpicker.id = "colorpicker"+stylescount;
          colorpicker.className = "colorpicker";
          TextInput.id = "Inputcolorpicker"+stylescount;
          $(TextInput).addClass("Inputcolorpicker");
          TextInput.parentNode.id = "Formcolorpicker"+stylescount;
          TextInput.parentNode.onmouseout = function(){
            var ColorpickerID = ("Divcolorpicker" + this.id.split("colorpicker")[1]);
            $("#"+ColorpickerID).stop();
            $("#"+ColorpickerID).fadeOut("fast");
            MassEval.functions.checkModifiedOption(MassEval.functions.getFirstElementByName(this, ["input"], "actual"), "styles"); 
          };
          TextInput.parentNode.onmouseover = function(){
            var ColorpickerID = ("Divcolorpicker" + this.id.split("colorpicker")[1]);
            $("#"+ColorpickerID).stop();
            $("#"+ColorpickerID).fadeIn("fast");
          };
          MassEval.params.ColorPickers[stylescount] = $('#colorpicker'+stylescount).farbtastic('#Inputcolorpicker'+stylescount);
          stylescount++;
        }
      }
    },
    createBorderStyleSelectors : function(){
      var UL = document.getElementById("OPTIONULstyles");
      if(!UL) return;
      var Lis = UL.getElementsByTagName('li');
      var stylescount = 0;
      for(var a=0,l=Lis.length;a<l;a++){
        LI = Lis[a];
        var ActualInput = MassEval.functions.getFirstElementByName(LI, ["input"], "actual");
        MassEval.functions.createBorderStyleSelector(ActualInput);
      }
    },
    createBorderStyleSelector : function(Input){
      if(!Input || !Input.parentNode) return;
      var possibles = MassEval.params.BorderStyles;
      if(possibles.indexOf(Input.value)===-1) return;
      var Select = document.createElement("select");
      Select.name = Input.name;
      for(var a=0,l=possibles.length;a<l;a++){
        var thisstyle = possibles[a];
        var opt = Select.appendChild(document.createElement('option'));
        opt.value = thisstyle;
        opt.innerHTML = thisstyle;
        if(thisstyle === Input.value) opt.selected = "selected";
      }
      var Width = Input.clientWidth;
      var MoreWidth = (MassEval.params.OptionSelectWidthPlus[(mw.config.get("skin"))] ? 4 : 0);
      Select.style.width = (Width+(MoreWidth ? MoreWidth : 0))+"px"; 
      Select.onchange = function(){ MassEval.functions.checkModifiedOption(this, "styles"); };
      Input.parentNode.insertBefore(Select, Input);
      Input.parentNode.removeChild(Input);      
    },
    createTextsUL : function(){
      var Div = document.createElement('div');
      Div.id = "texts";
      var UL = document.createElement('ul');
      UL.id = "OPTIONULtexts";
      UL.className = "optionsUL";
      Div.appendChild(UL);
      var DEFAULTtexts = MassEval.params.DEFAULTtexts;
      var ActualTexts = MassEval.texts;
      var LIcount = 0;
      for(var textname in DEFAULTtexts){
        LIcount++;
        var modified = false;
        var defaulttext = DEFAULTtexts[textname];
        var rows = defaulttext.split("\n").length;
        var actualtext = ActualTexts[textname];
        var LI = UL.appendChild(document.createElement('li'));
        $(LI).addClass("OptiontextsLI");
        var labelText = MassEval.texts[("OPTION"+textname)];
        if(typeof(labelText)!=="undefined"){
          var Label = LI.appendChild(document.createElement('label'));
          Label.appendChild(document.createTextNode(labelText));
          Label.setAttribute('for', textname);
        }else{
          var strippedtextname = textname.replace(/^OPTION/,"");
          var text = MassEval.texts[strippedtextname];
          var style = MassEval.styles[strippedtextname];
          var param = (MassEval.params.EditableParams.indexOf(strippedtextname) !==-1);
          var ROparam = MassEval.params[strippedtextname];
          if(typeof(text)!=="undefined"){
            var Label = LI.appendChild(document.createElement('label'));
            Label.appendChild(document.createTextNode(MassEval.texts.text));
            Label.setAttribute('for', textname);
          }else if(typeof(style)!=="undefined"){
            var Label = LI.appendChild(document.createElement('label'));
            Label.appendChild(document.createTextNode(MassEval.texts.style));
            Label.setAttribute('for', textname);
          }else if(param){
            var Label = LI.appendChild(document.createElement('label'));
            Label.appendChild(document.createTextNode(MassEval.texts.param));
            Label.setAttribute('for', textname);
          }else if(typeof(ROparam)!=="undefined"){
            var Label = LI.appendChild(document.createElement('label'));
            Label.appendChild(document.createTextNode(MassEval.texts.readonlyparam));
            Label.setAttribute('for', textname);
          }          
        }
        var F = LI.appendChild(document.createElement("form"));
        F.onsubmit = function(){ return false; }
        var HiddenName = F.appendChild(MassEval.functions.createInput({type:'hidden',name:"name",value:textname}));
        var HiddenType = F.appendChild(MassEval.functions.createInput({type:'hidden',name:"type",value:typeof(defaulttext)}));
        if(actualtext !== defaulttext) modified = true;
        var DefaultHidden = F.appendChild(MassEval.functions.createInput({type:'hidden',name:"default",value:defaulttext}));;
        var DefaultInput = F.appendChild(MassEval.functions.createInput({type:'button',name:"defaultB",
                           value:MassEval.texts.DefButtonText,title:MassEval.texts.DefButtonTitle.split("$1").join(defaulttext)}));
        DefaultInput.onclick = function(){
          MassEval.functions.razModifiedOption(this, "texts"); 
        }
        var ActualInput = F.appendChild(MassEval.functions.createInput({type:'textarea',name:"actual",value:actualtext,
                                                           title : (MassEval.texts[("OPTION"+textname)] || MassEval.texts[textname] || textname)}));
        ActualInput.onkeyup = function(){ MassEval.functions.checkModifiedOption(this, "texts"); };
        ActualInput.setAttribute('rows', rows);
        if(modified){
          $(LI).addClass("modifiedoption");
          Label.title = MassEval.texts.OptionModified;
        }else{
          DefaultInput.disabled = "disabled";
        }
      }
      return Div;
    },
    createMoreParamsUL : function(){
      var Div = document.createElement('div');
      Div.id = "moreparams";
      var UL = document.createElement('ul');
      UL.id = "OPTIONULmoreparams";
      UL.className = "optionsUL";
      Div.appendChild(UL);
      var OptionsMoreParams = (MassEval.params.OptionsMoreParams || "");
      var MoreLI = document.createElement('li');
      MoreLI.style.marginTop = "1em";
      MoreLI.style.padding = "2px";
      var TestZone = document.createElement('span');
      var TestButton = MassEval.functions.createInput({type:"button",value:MassEval.texts.TestMoreParamsText,title:MassEval.texts.TestMoreParamsTip});
      TestButton.onclick = function(){ MassEval.functions.testMoreParamsCode(); };
      var TestResult = document.createElement('span');
      TestResult.id = "MoreParamsTestResult";
      TestZone.appendChild(TestButton);
      TestZone.appendChild(TestResult);
      var Textarea = MassEval.functions.createInput({type:"textarea",name:'moreparams',value:OptionsMoreParams,id:'moreparamsTextarea'});
      Textarea.setAttribute('rows', MassEval.params.MoreParamsRows);
      Textarea.style.resize = "vertical";
      if(OptionsMoreParams){
        Textarea.style.color = "red";
        Textarea.title = MassEval.texts.OptionModified;
      }
      MoreLI.appendChild(TestZone);
      MoreLI.appendChild(Textarea);
      UL.appendChild(MoreLI);
      return Div;
    },
    testMoreParamsCode : function(){
      var Textarea = document.getElementById("moreparamsTextarea");
      var TestResultArea = document.getElementById("MoreParamsTestResult");
      if(!Textarea || !TestResultArea ) return false;
      var Code = Textarea.value;
      if(!Code) return true;
      try{
       eval(Code);
       TestResultArea.innerHTML = MassEval.texts.MoreParamsTestOK;
       return false;
      }catch(e){
       TestResultArea.innerHTML = MassEval.texts.MoreParamsTestKO.split("$1").join("<span>" +e.message+ "</span>");
       return e.message;
      }
    },
    openOptionsForm : function(recreate){
      var TROptions = document.getElementById("fieldsetOptionsContainer");
      var OptionsDiv = document.getElementById("fieldsetOptions");
      if(!TROptions || !OptionsDiv) return;
      if(TROptions.style.display != "none" && !recreate){
        return MassEval.functions.closeOptionsForm();
      }else{
        if(recreate) while(OptionsDiv.firstChild){ OptionsDiv.removeChild(OptionsDiv.firstChild);}
        TROptions.style.display = "";
        if(!OptionsDiv.firstChild){
          var Legend = OptionsDiv.appendChild(document.createElement('legend'));
          var OKInput = Legend.appendChild(MassEval.functions.createInput({type:'button',value:MassEval.texts.OptionValidate,title:MassEval.texts.OptionValidateTip,id:"SaveOptionsInput"}));
          OKInput.onclick = function(){
            MassEval.functions.updateOptions();
          }
          var subpagename = mw.config.get('wgFormattedNamespaces')[2]+':'+mw.config.get('wgUserName')+MassEval.params.OptionsSubPage;
          var SPTip = MassEval.texts.OptionSubPageTip.split("$page").join(subpagename);
          var SPInput = Legend.appendChild(MassEval.functions.createInput({type:'button',value:MassEval.texts.OptionSubPageText,title:SPTip,id:"lastSPInput"}));
          SPInput.onclick = function(){
            var URL = mw.util.getUrl(subpagename,{'diff':'cur','oldid':'prev'});
            window.open(URL);
          }
          var RAZInput = Legend.appendChild(MassEval.functions.createInput({type:'button',value:MassEval.texts.GlobDefButtonText,id:"GlobalRAZoptionInput"}));
          RAZInput.onclick = function(){
            MassEval.functions.razModifiedOptionsInShownTab();
          }
          var P = OptionsDiv.appendChild(document.createElement('p'));
          P.style.textAlign = "center";
          var ULs = [
            OptionsDiv.appendChild(MassEval.functions.createParamsUL()),
            OptionsDiv.appendChild(MassEval.functions.createStylesUL()),
            OptionsDiv.appendChild(MassEval.functions.createTextsUL()),
            OptionsDiv.appendChild(MassEval.functions.createMoreParamsUL())   
          ];
          MassEval.functions.setInputToSelects();
          MassEval.functions.setIconPreview();
          MassEval.functions.setFontFamilySelector();
          MassEval.functions.createBorderStyleSelectors();
          MassEval.functions.setColorPickers();
          MassEval.functions.createToggleButtons(P, ULs, "Options");
        }
      }
    },
    closeOptionsForm : function(){
      var TROptions = document.getElementById("fieldsetOptionsContainer");
      if(TROptions){
        if(MassEval.params.LaunchCondition !== 2) $(TROptions).slideUp("slow");
        else TROptions.style.display = "none";
      }
    },
    createToggleButtons : function(P, ULs, Type){
      if(!P) return;
      var RAZInput = document.getElementById("GlobalRAZoptionInput");
      var ulcount = 0;
      for(var a=0,l=ULs.length;a<l;a++){
        var thisUL = ULs[a];
        $(thisUL).addClass(Type+"Div");
        var ID = thisUL.id;
        var Input = MassEval.functions.createInput({type:'button',name:ID,value:(MassEval.texts[ID] || ID)});
        Input.onclick = function(){
          MassEval.functions.showThisUL(this, Type);
        }
        if(a>0) Input.style.marginLeft = "0.5em";
        if(ulcount !== MassEval.params[("Displayed"+Type+"UL")]) thisUL.style.display = "none";
        else{
          Input.style.textDecoration = "underline";
          if(RAZInput) RAZInput.title = MassEval.texts.GlobDefButtonTitle.split("$1").join(Input.value);
        }
        P.appendChild(Input);
        ulcount++;
      }     
    },
    showThisUL : function(I, Type){
      var P = I.parentNode;
      var F = document.getElementById("fieldset"+Type);
      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(Type+"Div") || !thisEL.id) continue;
        if(thisEL.id == ELID){
          thisEL.style.display = "";
        }
        else thisEL.style.display = "none";
      }
      var RAZInput = document.getElementById("GlobalRAZoptionInput");
      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";
          MassEval.params[("Displayed"+Type+"UL")] = a;
          if(RAZInput && Type === "Options") RAZInput.title = MassEval.texts.GlobDefButtonTitle.split("$1").join(I.value);
        }else Input.style.textDecoration = "";
      }
    },
    checkModifiedOption : function(actualnode, type){
      if(!type) type = "params";
      var LI = actualnode.parentNode;
      var defaultN = MassEval.functions.getFirstElementByName(LI, ["input"], "defaultB");
      var nameP = MassEval.functions.getFirstElementByName(LI, ["input"], "name").value;
      var typeP = MassEval.functions.getFirstElementByName(LI, ["input"], "type").value;
      var newvalue = actualnode.value;
      if(typeP=="number") newvalue = parseInt(newvalue);
      if(typeP=="boolean") newvalue = actualnode.checked;
      var defparam = MassEval.params[("DEFAULT"+type)][nameP];
      if(defparam === newvalue) defaultN.disabled = "disabled";
      else{
        defaultN.disabled = false;
      }
      var Msg = MassEval.functions.checkThatModifiedOption(LI, actualnode, newvalue);
      if(Msg) MassEval.functions.alertControl("issue_"+nameP, Msg, "Warning");
      else MassEval.functions.alertControl("issue_"+nameP);
    },
    checkThatModifiedOption : function(LI, actualnode, newvalue){
      if($(actualnode).hasClass("SizeUnit")){
        var goodunit = false;
        var SizeUnits = MassEval.params.SizeUnits;
        var reg1 = newvalue.match(new RegExp("^[0-9]*\\.?[0-9]+("+SizeUnits.join("|")+")$"));
        var reg2 = newvalue.match(new RegExp("\\.+[0-9]*\\.+")); 
        if(reg1 !==null && reg2 === null) LI.parentNode.removeAttribute("style");
        else{
          LI.parentNode.style.border = "1px solid red";
          return MassEval.texts.AlertMsgSizeUnit.split("$units").join(SizeUnits.join(", "));
        }
      }else if($(actualnode).hasClass("Inputcolorpicker") ){
        var l = newvalue.length;
        var reg1 = newvalue.match(new RegExp("#[0-9a-fA-F]{6}"));
        var reg2 = newvalue.match(new RegExp("#[0-9a-fA-F]{3}"));
        if((l==7 && reg1 !==null) || (reg2!==null && l==4)) LI.parentNode.removeAttribute("style");
        else{
          LI.parentNode.style.border = "1px solid red";
          return MassEval.texts.AlertMsgColorInput;
        }
      }
      return false;
    },
    razModifiedOption : function(defaultbutton, type, global){
      var Parent = defaultbutton.parentNode;
      var defaultP = MassEval.functions.getFirstElementByName(Parent, ["input"], "default").value;
      var nameP = MassEval.functions.getFirstElementByName(Parent, ["input"], "name").value;
      var typeP = MassEval.functions.getFirstElementByName(Parent, ["input"], "type").value;
      var actualT = MassEval.functions.getFirstElementByName(Parent, ["input","select","textarea"], "actual");
      if(typeP == "boolean"){
        actualT.checked = (defaultP === "true" ? "checked" : false );
      }else{
        actualT.value = defaultP;
        if($(actualT).hasClass("Inputcolorpicker")){
          var index = actualT.id.split("colorpicker")[1];
          $.farbtastic(MassEval.params.ColorPickers[index]).setColor(defaultP);
        }
      }
      if(!global) actualT.focus();
      MassEval.functions.checkModifiedOption(actualT, type);
    },
    razModifiedOptionsInShownTab : function(){
      var FS = document.getElementById("fieldsetOptions");
      if(!FS) return;
      var ULs = FS.getElementsByTagName("ul");
      for(var a=0,l=ULs.length;a<l;a++){
        var ul = ULs[a];
        if(!$(ul).hasClass("optionsUL") || !ul.id || ul.id.indexOf("OPTIONUL")===-1) continue;
        if(ul.parentNode.style.display == "none") continue;
        var type = ul.id.split("OPTIONUL").join("");
        if(type==="Moreparamas"){
          var MoreparamsTextarea = ul.getElementsByTagName('textarea')[0];
          if(MoreparamsTextarea) MoreparamsTextarea.value = "";
        }else{
          var LIs = ul.getElementsByTagName('li');
          for(var b=0,m=LIs.length;b<m;b++){
            var li = LIs[b];
            var defaultbutton = MassEval.functions.getFirstElementByName(li, ["input"], "defaultB");
            if(defaultbutton) MassEval.functions.razModifiedOption(defaultbutton, type, true);
          }
        }
      }
    },
  // ------------------------------- Fonctions pour les suggestions -------------------------------
    newAnalysisID : function(suggestcount){
      var id = MassEval.functions.generateID();
      MassEval.params.SuggestRunning[id] = [];
      for(var a=0,l=suggestcount;a<l;a++){
        MassEval.params.SuggestRunning[id].push(true);
      }
      return id;
    },
    checkAnalysisID : function(id, endrequest){   
      var Suggest =  MassEval.params.SuggestRunning[id];
      if(!Suggest) return true;
      MassEval.params.SuggestRunning[id][endrequest] = true;
      for(var a=0,l=Suggest.length;a<l;a++){
        if(Suggest[a] === false) return false;
      }
      return true;
    },
    createSuggestSelect : function(InputText){
      var Form = document.createElement('form');
      Form.onsubmit = function(){ return false; };
      Form.id = InputText.id + "Form";
      $(Form).addClass("SuggestForm");
      var SuggestSelect = Form.appendChild(document.createElement('select'));
      SuggestSelect.id = InputText.id + "Select";
      SuggestSelect.style.display = "none";
      SuggestSelect.style.zIndex = 5;
      Form.appendChild(InputText);
      return Form;
    },
    updateSuggestionElements : function(titles, OldInputValue, InputID){
      var Input = document.getElementById(InputID);
      var Select = document.getElementById(InputID+"Select");
      if(titles.length == 0){
        return Select.style.display = "none";
      }
      while(Select.firstChild){ Select.removeChild(Select.firstChild); }
      for(var a=0,l=titles.length;a<l;a++){
        var title = titles[a];
        var option = Select.insertBefore(document.createElement('option'), Select.firstChild);
        option.value = title;
        option.innerHTML = title;
        option.onclick = function(){
          MassEval.functions.onSelectClick(this, InputID);
        }
        if(a == 0) option.selected = "selected";
      }
      Select.style.display = "";
      if(titles.length>MassEval.params.SuggestSelectSize){
         var opt = Select.firstChild;
         try{ $(Select).scrollTop((opt.offsetHeight * titles.length)); }catch(e){  }
      }
      var suggestion = titles[0];
/*
      if(suggestion.indexOf(OldInputValue) === 0 && OldInputValue!==suggestion){
        var text = Input.value;
        Input.value = suggestion;
        if(Input.createTextRange){
          var ra = Input.createTextRange();
          ra.moveStart("character", text.length);
          ra.moveEnd("character", suggestion.length);
          ra.select();
        }else if(Input.setSelectionRange){
          Input.setSelectionRange(text.length, suggestion.length);
        }else{
          Input.selectionStart = text.length;
          Input.selectionEnd = suggestion.length;
        }
      }
*/
      if(titles.length == 1 && OldInputValue!==suggestion) MassEval.functions.getRelevantModeFieldset(MassEval.params.CurrentMode);
      if(titles.length == 1) Select.style.display = "none";
      if(OldInputValue == suggestion) Select.style.display = "none";
      MassEval.functions.setSuggestSelectPosition(InputID);
    },
    setSuggestSelectPosition : function(InputID){
      var Input = document.getElementById(InputID);
      var Select = document.getElementById(InputID+"Select");
      var Options = Select.getElementsByTagName('option');
      var Taille = MassEval.params.SuggestSelectSize;
      if(Options.length < Taille) Taille = Options.length;
      var H = (Taille * 21);
      Select.size = Taille;
      Select.style.height = H + "px" ;
      Select.style.marginTop = "-" + H + "px" ;
      Select.style.marginRight = "-" + ( $(Input.parentNode).width() - $(Input).width() ) + "px" ;
    },
    onSelectClick : function(option, InputID){
      var NewValue = option.value;
      var Input = document.getElementById(InputID);
      Input.value = NewValue;
      option.parentNode.style.display = "none";
      Input.focus();
      MassEval.functions.getRelevantModeFieldset(MassEval.params.CurrentMode);
    },
  // ------------------------------- Fonctions pour le tableau dans [[Special:MassEval]] -------------------------------
    prepareSpecialpage : function(){
      var Title = document.getElementsByTagName('title')[0];
      var TitleH = document.getElementById('firstHeading');
      if(!TitleH) TitleH = document.getElementById('section_0');
      if(!TitleH) TitleH = document.getElementsByTagName('h1')[0];
      var Content = document.getElementById('mw-content-text');
      if(!Title || !TitleH || !Content) return;
      $(document.body).removeClass("mw-invalidspecialpage");
      Title.innerHTML = MassEval.texts.SpecialpageNameH.split("$1").join(MassEval.texts.SpecialpageName);
      TitleH.innerHTML = MassEval.texts.SpecialpageName;
      while(Content.firstChild){ Content.removeChild(Content.firstChild); }
      var Datas = {
        mode  : "cat",
        title : false
      };
      var wgTitle = mw.config.get("wgTitle");
      if(wgTitle.indexOf(MassEval.params.SpecialpageName+"/")!=-1){
        var params = wgTitle.split(MassEval.params.SpecialpageName+"/")[1];
        var mode = params.match(new RegExp("^mode=[^\/]*"));
        if(mode !== null){
          var thismode  = mode[0].split("mode=").join("");
          var AllModes = Object.keys(MassEval.params.ModesMap);
          if(AllModes.indexOf(thismode)!==-1) Datas.mode = thismode;
          Datas.title = MassEval.functions.getMainPage(params.replace(mode[0], "").replace(/^\//, ""));
        }else{
          Datas.title = MassEval.functions.getMainPage(params);
        }
      }
      MassEval.params.CurrentMode = Datas.mode;
      MassEval.functions.createSpecialpageBoard(Content, Datas);
    },
    updateContentSub : function(selection, NS){
      var contentSub = document.getElementById("contentSub");
      if(!contentSub) return;
      contentSub.style.marginBottom = 0;
      var template = MassEval.texts.contentSubTemplate; // "← $1"
      var Mode = MassEval.params.CurrentMode;
      var link = false;
      if(selection){
        if(Mode == "page"){
          var title = selection;
          link = '<a href="'+mw.util.getUrl(title)+'" title="'+title+'" >'+title+'</a>';
        }else if(Mode == "cat"){
          var title = mw.config.get('wgFormattedNamespaces')[14]+":"+selection;
          link = '<a href="'+mw.util.getUrl(title)+'" title="'+title+'" >'+title+'</a>';
        }else if(Mode == "links"){
          var title = NS + (NS === "" ? "" : ":") +selection;
          link = '<a href="'+mw.util.getUrl(title)+'" title="'+title+'" >'+title+'</a>';
        }else if(Mode == "linkshere"){
          var title = "Special:Whatlinkshere/"+NS + (NS === "" ? "" : ":") +selection;
          link = '<a href="'+mw.util.getUrl(title)+'" title="'+title+'" >'+title+'</a>';
        }else if(Mode == "template"){
          var title = mw.config.get('wgFormattedNamespaces')[10]+":"+selection;
          link = '<a href="'+mw.util.getUrl(title)+'" title="'+title+'" >'+title+'</a>';
        }else if(Mode == "newpages"){
          var title = "Special:Newpages";
          link = '<a href="'+mw.util.getUrl(title)+'" title="'+title+'" >'+title+'</a>';
        }else if(Mode == "creations"){
          var title = mw.config.get('wgFormattedNamespaces')[2]+":"+selection;
          link = '<a href="'+mw.util.getUrl(title)+'" title="'+title+'" >'+title+'</a>';
        }
      }
      if(link){
        contentSub.style.visibility = "visible";
        contentSub.innerHTML = template.split("$1").join(link);
      }else{
        contentSub.style.visibility = "hidden";
        contentSub.innerHTML = template;
      }
    },
    createSpecialpageBoard : function(contentNode, Datas){
      $(document.body).addClass('MultiplePagesAnalysis');
      var MassEvalBoard = document.createElement('div');
      MassEvalBoard.id = "MassEvalBoard";
      contentNode.appendChild(MassEvalBoard);
      if(MassEval.params.AddWarning){
        var Caption = MassEvalBoard.appendChild(document.createElement("p"));
        $(Caption).addClass("error");
        Caption.style.textAlign = "center";
        Caption.innerHTML = MassEval.texts.Warning;
      }
      var MainContainer = MassEvalBoard.appendChild(document.createElement('div'));
      MainContainer.id = "MassEvalBoardHead";
      $(MainContainer).addClass("FieldsetContent");
      MassEvalBoard.appendChild(MassEval.functions.createBoardListDiv());
      var EvalFieldset = MainContainer.appendChild(MassEval.functions.createEvalFieldset());  // Thème d'évaluation
      MassEval.functions.setEvalTableSizes();
      var ModesFieldset = MainContainer.appendChild(MassEval.functions.createModesFieldset(Datas.mode));  // Sélecteur de modes
      var ModesContainer = ModesFieldset.firstChild.nextSibling.appendChild(document.createElement('div'));
      var PageFieldset = ModesContainer.appendChild(MassEval.functions.createPageFieldset(Datas.title));  // Mode Page
      var CategoryFieldset = ModesContainer.appendChild(MassEval.functions.createCategoryFieldset(Datas.title));  // Mode Catégorie
      var LinksFieldset = ModesContainer.appendChild(MassEval.functions.createLinksFieldset(Datas.title));  // Mode Links
      var LinkshereFieldset = ModesContainer.appendChild(MassEval.functions.createLinkshereFieldset(Datas.title));  // Mode Linkshere
      var TemplateFieldset = ModesContainer.appendChild(MassEval.functions.createTemplateFieldset(Datas.title));  // Mode Template
      var NewpagesFieldset = ModesContainer.appendChild(MassEval.functions.createNewpagesFieldset());  // Mode Newpages
      var CreationsFieldset = ModesContainer.appendChild(MassEval.functions.createCreationsFieldset(Datas.title));  // Mode Creations
      var PrefixesFieldset = ModesContainer.appendChild(MassEval.functions.createPrefixesFieldset(Datas.title));  // Mode Prefixes
      var ActionFieldset = MainContainer.appendChild(MassEval.functions.createFilterFieldset());  // Filtrage
      MassEval.functions.setFromSelectorAnchor();
      MassEval.functions.setToSelectorAnchor();
      MassEval.functions.setMoveSelectorAnchor();
      MassEval.functions.setFromToSelectorValues();
      var ActionFieldset = MainContainer.appendChild(MassEval.functions.createActionFieldset());  // Actions
      var OptionsInput = document.getElementById("GlobalOptionsInput"); // Options
      var OptionDiv = document.createElement('div');
      OptionDiv.style.display = "none";
      OptionDiv.id = "fieldsetOptionsContainer";
      var OptionFS = document.createElement('fieldset');
      OptionFS.id = "fieldsetOptions";
      $(OptionFS).addClass("NoShowHideLinks");
      OptionDiv.appendChild(OptionFS);
      MassEval.functions.addOptionLinkInSpecialpage();
      if(MassEval.params.SpecialOptionLinkOK){
          MassEvalBoard.appendChild(OptionDiv);
          OptionsInput.style.display = "none";
          OptionDiv.style.display = "none";
      }else{
        OptionsInput.parentNode.appendChild(OptionDiv);
      }
      var DatasDiv = MassEvalBoard.appendChild(document.createElement('div'));    // Données
      DatasDiv.style.display = "none";
      DatasDiv.id = "fieldsetDatasContainer";
      var DatasFS = DatasDiv.appendChild(document.createElement('fieldset'));
      DatasFS.id = "fieldsetDatas";
      $(DatasFS).addClass("NoShowHideLinks");

      var CatInput = document.getElementById("CatInput");  //  Largeurs
      var InputWidth = CatInput.clientWidth+"px";
      var SelectWidth = (CatInput.clientWidth + MassEval.params.OptionSelectWidthPlus[(mw.config.get("skin"))])+"px";
      var TDWidth = (CatInput.clientWidth+10) +"px";
      var IDs = [
        "EvalThemeTD","EvalThemeInput","PortalInput",
        "TDPage","PageInput",
        "TDCat","CatInput",
        "TDLinks","LinksInput","LinksInputNS",
        "TDLinkshere","LinkshereInput","LinkshereInputNS",
        "TDTemplate","TemplateInput",
        "TDNewpages",
        "TDUser","UserInput",
        "TDPrefixes","PrefixInput",
      ];
      for(var a=0,l=IDs.length;a<l;a++){
        var id = IDs[a];
        var N = document.getElementById(id);
        if(!N || !N.tagName) continue;
        var T = N.tagName.toLowerCase();
        if(T === "input") N.style.width = InputWidth;
        if(T === "select") N.style.width = SelectWidth;
        if(T === "td"){
          N.style.width = TDWidth;
          $(N).addClass("TDSelector");
        }
      }
      $("#EvalThemeTD").width(($("#EvalThemeTD").width()+8));
      MassEval.functions.setSynchronizedResizeV([    // ----------- Hauteurs
        "PageInputInfo",
        "CatParentsDiv",
        "CatDaughtersDiv",
        "LinksInputInfo",
        "LinkshereInputInfo",
        "TemplateInputInfo",
        "TemplateDoc",
        "NewpagesInputInfo",
        "UserInputInfo"
      ], 50);
      MassEval.functions.displayNodes(["SPInput"], false);
      MassEval.functions.createShowHideLinks(MassEvalBoard);
      MassEval.params.CatSubPageCountOK = true;
      MassEval.functions.getAPIUserInfos();
      MassEval.functions.getRelevantModeFieldset(Datas.mode);
      MassEval.functions.getEvalThemes();
      MassEval.functions.getStubThemes();
      MassEval.functions.getUserSubPage();
      MassEval.functions.getBeforeStubTemplates();
      MassEval.functions.getPortalList();
    },
    createShowHideLinks : function(Parent){
      if(!Parent) return;
      var Fieldsets = Parent.getElementsByTagName('fieldset');
      for(var a=0,l=Fieldsets.length;a<l;a++){
        var Fieldset = Fieldsets[a];
        if($(Fieldset).hasClass("NoShowHideLinks")) continue;
        var Legend = Fieldset.getElementsByTagName('legend')[0];
        if(!Legend) continue;
        var showhidelink = Legend.appendChild(MassEval.functions.createLink(null,{text:MassEval.texts.Hide,title:MassEval.texts.HideTip,href:"javascript:;"}));
        $(showhidelink).addClass("showhideConfigForm");
        showhidelink.onclick = function(){
          MassEval.functions.clickShowHideLinks(this);
        }
      }
    },
    clickShowHideLinks : function(link){
      var legend = link.parentNode;
      var fieldset = legend.parentNode;
      var nodes = [];
      var Node = legend.nextSibling;
      while(Node){
        if(!Node.tagName || (Node.tagName && Node.tagName.toLowerCase() != 'legend')) nodes.push(Node);
        Node = Node.nextSibling;
        if(!Node) break;
      }
      if(link.title == MassEval.texts.HideTip){
        for(var n=0,nlen=nodes.length;n<nlen;n++){ $(nodes[n]).slideUp(); }
        link.innerHTML = MassEval.texts.Show;
        link.title = MassEval.texts.ShowTip;
      }else{
        for(var n=0,nlen=nodes.length;n<nlen;n++){ $(nodes[n]).slideDown() }
        link.innerHTML = MassEval.texts.Hide;
        link.title = MassEval.texts.HideTip;
      }
    },
  // ------------------------------- Fonctions pour le tableau dans les articles, pages de discussion et sous-pages utilisateur -------------------------------
    createPageBoard : function(){  
      var LaunchCondition = MassEval.params.LaunchCondition;
      var target = document.getElementById("mw-content-text");
      if(!target) return;
      var board = document.getElementById("MassEvalBoard");
      if(board){
        if(board.style.display == "none"){ 
          $(board).slideDown("slow");
        }else{
          $(board).slideUp("slow");
        }
        return 
      }
      $(document.body).addClass('SinglePageAnalysis');
      board = document.createElement("div");
      board.id = "MassEvalBoard";
      target.insertBefore(board, target.firstChild);
      var boardHead = board.appendChild(document.createElement("div"));  
      boardHead.id = "MassEvalBoardHead";
      var CloseButton = boardHead.appendChild(document.createElement("a"));
      CloseButton.id = "CloseButton";
      CloseButton.href = "javascript:MassEval.functions.createPageBoard()";
      CloseButton.title = MassEval.texts.GoCloseTitle;
      var CloseButtonImage = CloseButton.appendChild(document.createElement("img"));
      CloseButtonImage.src = MassEval.params.ImageURL + MassEval.params.CloseIcon;
      $(CloseButtonImage).addClass("ButtonImage MainCloseIcon");
      CloseButtonImage.id = "CloseButtonImage";
      if(MassEval.params.AddWarning){
        var Caption = boardHead.appendChild(document.createElement("p"));
        $(Caption).addClass("error");
        Caption.innerHTML = MassEval.texts.Warning;
      }
      var MainOptions = boardHead.appendChild(document.createElement("div"));
      MainOptions.id = "MassEvalMainOptionsFS";
      var StandardMainOptions = MainOptions.appendChild(document.createElement("div"));
      StandardMainOptions.appendChild(MassEval.functions.createEvalFieldset());
      StandardMainOptions.appendChild(MassEval.functions.createActionFieldset());
      board.appendChild(MassEval.functions.createBoardListDiv());
      var VerifInput = document.getElementById('GlobalVerifInput');
      VerifInput.title = MassEval.texts.GoVerifOne;
      VerifInput.onclick = function(){
        if(LaunchCondition === 4) MassEval.functions.getThesePagesStatus([mw.config.get('wgTitle')]);
        if(LaunchCondition === 5) MassEval.functions.getThesePagesStatus([mw.config.get('wgPageName').split("_").join(" ")]);
      }
      MassEval.functions.displayNodes(["EmergencyStop","LinksActions","GlobalOptionsInput","MassEval_TH6"], false);
      MassEval.params.CatSubPageCountOK = true;
      MassEval.params.UserInfosOK = true;
      MassEval.functions.getEvalThemes();
      MassEval.functions.getStubThemes();
      MassEval.functions.getUserSubPage();
      MassEval.functions.getBeforeStubTemplates();
      MassEval.functions.getPortalList();
    },

  // ------------------------------- Formulaire "Thème d'évaluation" -------------------------------
    createEvalFieldset : function(){
      var LaunchCond = MassEval.params.LaunchCondition;
      var EvalFieldset = document.createElement('fieldset');
      EvalFieldset.id = "fieldsetEval";
      var PortalLabel = document.createElement('legend');
      PortalLabel.innerHTML = MassEval.texts.EvalTheme;
      EvalFieldset.appendChild(PortalLabel);
      var EvalContainer = document.createElement('div');
      $(EvalContainer).addClass("FieldsetContent");
      if(LaunchCond === 2) EvalFieldset.appendChild(EvalContainer);
      var MainEvalTable = EvalContainer.appendChild(document.createElement('table'));
      MainEvalTable.style.width = "100%";
      MainEvalTable.style.marginTop = "-1em";
      var EvalTR = MainEvalTable.appendChild(document.createElement('tr'));
      var EvalSelectTD = EvalTR.appendChild(document.createElement('td'));
      EvalSelectTD.setAttribute("rowspan", 2);
      EvalSelectTD.id = "EvalThemeTD";
      var EvalTableTD = EvalTR.appendChild(document.createElement('td'));
      var EvalTable = EvalTableTD.appendChild(MassEval.functions.createEvalTable());
      var evalinputFS = EvalSelectTD.appendChild(document.createElement('fieldset'));
      evalinputFS.id = "EvalThemeInputfieldset";
      $(evalinputFS).addClass("NoBorderFieldset NoShowHideLinks")
      var evalinputL = evalinputFS.appendChild(document.createElement('legend'));
      evalinputL.innerHTML = MassEval.texts.EvalTheme;
      var EvalThemeSelect = document.createElement('select');
      EvalThemeSelect.id = "EvalThemeInput";
      EvalThemeSelect.name = "EvalThemeInput";
      $(EvalThemeSelect).addClass("EvalThemeSelect");
      EvalThemeSelect.onchange = function(){
        if(MassEval.params.LaunchCondition === 2) MassEval.functions.updateEvalTable(this.value);
        MassEval.functions.updatePortalSelect();
      }
      EvalThemeSelect.title = MassEval.texts.EvalTheme;
      if(LaunchCond !== 2){
        EvalFieldset.appendChild(EvalThemeSelect);
      }else{
        evalinputFS.appendChild(EvalThemeSelect);
      }
      var portalinputFS = EvalSelectTD.appendChild(document.createElement('fieldset'));
      portalinputFS.id = "PortalInputfieldset";
      $(portalinputFS).addClass("NoBorderFieldset NoShowHideLinks")
      var portalinputL = portalinputFS.appendChild(document.createElement('legend'));
      portalinputL.innerHTML = MassEval.texts.Portal;
      var PortalSelect = EvalFieldset.appendChild(MassEval.functions.createPortalSelect());
      if(LaunchCond !== 2){
        EvalFieldset.appendChild(PortalSelect);
      }else{
        portalinputFS.style.margin = "1em 0";
        portalinputFS.appendChild(PortalSelect);
      }
      MassEval.functions.disableThings([ EvalThemeSelect ], true );
      return EvalFieldset;
    },
    createEvalTable : function(){
      var IMP = MassEval.params.Importance;
      var AVT = MassEval.params.Avancement;
      var EvalTable = document.createElement('table');
      EvalTable.id = "EvalTable";
      var TRAVT = EvalTable.appendChild(document.createElement('tr'));
      var TDupdate = TRAVT.appendChild(document.createElement('td'));
      TDupdate.id = "EvalTableUpdateTD";
      TDupdate.style.paddingLeft = "3px";
      TDupdate.style.textAlign = "center";
      TDupdate.setAttribute('rowspan', 3);
      var updateButton = TDupdate.appendChild( MassEval.functions.createInput({type:'button',value:MassEval.texts.UpdateTableEvalText,title:MassEval.texts.UpdateTableEvalTip,id:"EvalTable_update"}));
      updateButton.onclick = function(){
        var EvalThemeSelect = document.getElementById("EvalThemeInput");
        var Theme = EvalThemeSelect.value;
        if(!Theme) return;
        MassEval.functions.updateEvalTable(Theme);
      }
      var TDAVT = TRAVT.appendChild(document.createElement('td'));
      var TRIMP = EvalTable.appendChild(document.createElement('tr'));
      var TDIMP = TRIMP.appendChild(document.createElement('td')); 
      var AVTTable = TDAVT.appendChild(document.createElement('table'));
      AVTTable.id = "EvalTable_AVT";
      AVTTable.style.width = "100%";
      var AVTCaption = AVTTable.appendChild(document.createElement('caption'));
      AVTCaption.innerHTML = MassEval.texts.AVT;
      var TRAVT1 = AVTTable.appendChild(document.createElement('tr'));
      var TRAVT2 = AVTTable.appendChild(document.createElement('tr'));
      for(var a=0,l=AVT.length;a<l;a++){
        var AVTa = AVT[a];
        var TH = TRAVT1.appendChild(document.createElement('th'));
        if(a==0) $(TH).addClass("EvalTableFirstTH");
        var icon = "";
        if(AVTa.icon) icon = '<img alt="'+AVTa.wiki+'" src="'+AVTa.icon+'" class="EvalTableIcon" /> ';
        TH.innerHTML = icon + AVTa.text;
        TH.style.whiteSpace = "nowrap";
        TH.style.backgroundColor = AVTa.color;
        if(AVTa.textcolor) TH.style.color = AVTa.textcolor;
        var TD = TRAVT2.appendChild(document.createElement('td'));
        TD.style.textAlign = "center";
        TD.id = "EvalTable_AVT"+a;
      }
      var TotAVTTH = TRAVT1.appendChild(document.createElement('th'));
      $(TotAVTTH).addClass("EvalTableLastTH");
      TotAVTTH.innerHTML = MassEval.texts.TableEvalTotal;
      var TotAVTTD = TRAVT2.appendChild(document.createElement('td'));
      TotAVTTD.style.textAlign = "center";
      TotAVTTD.style.fontWeight = "bold";
      TotAVTTD.id = "EvalTable_AVTtotal";
      var IMPTable = TDIMP.appendChild(document.createElement('table'));
      IMPTable.id = "EvalTable_IMP";
      IMPTable.style.width = "100%";
      var IMPCaption = IMPTable.appendChild(document.createElement('caption'));
      IMPCaption.innerHTML = MassEval.texts.IMP;
      var TRIMP1 = IMPTable.appendChild(document.createElement('tr'));
      var TRIMP2 = IMPTable.appendChild(document.createElement('tr'));
      for(var a=0,l=IMP.length;a<l;a++){
        var IMPa = IMP[a];
        var TH = TRIMP1.appendChild(document.createElement('th'));
        if(a==0) $(TH).addClass("EvalTableFirstTH");
        TH.innerHTML = IMPa.text;
        TH.style.whiteSpace = "nowrap";
        TH.style.backgroundColor = IMPa.color;
        if(IMPa.textcolor) TH.style.color = IMPa.textcolor;
        var TD = TRIMP2.appendChild(document.createElement('td'));
        TD.style.textAlign = "center";
        TD.id = "EvalTable_IMP"+a;
      }
      var TotIMPTH = TRIMP1.appendChild(document.createElement('th'));
      $(TotIMPTH).addClass("EvalTableLastTH");
      TotIMPTH.innerHTML = MassEval.texts.TableEvalTotal;
      var TotIMPTD = TRIMP2.appendChild(document.createElement('td'));
      TotIMPTD.style.textAlign = "center";
      TotIMPTD.style.fontWeight = "bold";
      TotIMPTD.id = "EvalTable_IMPtotal";
      var EvalCatsTR = EvalTable.appendChild(document.createElement('tr'));
      var EvalCatsTD = EvalCatsTR.appendChild(document.createElement('td'));
      EvalCatsTD.id = "ThemeCatsTD";
      var ThemeCats = EvalCatsTD.appendChild(document.createElement('table'));
      ThemeCats.id = "ThemeCats";
      ThemeCats.style.width = "100%";
      var ThemeCatsCaption = ThemeCats.appendChild(document.createElement('caption'));
      ThemeCatsCaption.innerHTML = MassEval.texts.ThemeCats;
      var ThemeCatsTR = ThemeCats.appendChild(document.createElement('tr'));
      var CatAllpages = ThemeCatsTR.appendChild(document.createElement('td'));
      CatAllpages.id = "CatAllpages";
      CatAllpages.style.visibility = "hidden";
      var CatStubpages = ThemeCatsTR.appendChild(document.createElement('td'));
      CatStubpages.id = "CatStubpages";
      CatStubpages.style.visibility = "hidden";
      var CatMaincat = ThemeCatsTR.appendChild(document.createElement('td'));
      CatMaincat.id = "CatMaincat";
      CatMaincat.style.visibility = "hidden";
      return EvalTable;
    },
    setEvalTableSizes : function(){
      var EvalTableIMP = document.getElementById("EvalTable_IMP");
      var EvalTableAVT = document.getElementById("EvalTable_AVT");
      var TableCats = document.getElementById("ThemeCats");
      var TDIMP = EvalTableIMP.getElementsByTagName('td');
      var TDAVT = EvalTableAVT.getElementsByTagName('td');
      var TDCAT = TableCats.getElementsByTagName('td');
      var SetSize = function(TDs){
        var maxsize = 10;
        for(var a=0,l=TDs.length;a<l;a++){
          var width = TDs[a].clientWidth;
          if(width > maxsize) maxsize = width;
        }
        for(var a=0,l=TDs.length;a<l;a++){
          TDs[a].width = maxsize+"px";
          TDs[a].style.height = "1.5em";
        }
      }
      SetSize(TDIMP);
      SetSize(TDAVT);
      SetSize(TDCAT);
    },
    clearEvalTable : function(){
      var TableAVT = document.getElementById('EvalTable_AVT');
      var TableIMP = document.getElementById('EvalTable_IMP');
      if(TableAVT){
        var TDs = TableAVT.getElementsByTagName('td');
        for(var a=0,l=TDs.length;a<l;a++){
          TDs[a].innerHTML = "";
        }
      }
      if(TableIMP){
        var TDs = TableIMP.getElementsByTagName('td');
        for(var a=0,l=TDs.length;a<l;a++){
          TDs[a].innerHTML = "";
        }
      }
    },
    updateEvalTable : function(EvalTheme){
      if(!EvalTheme) return;
      MassEval.params.EvalTableRequests = 0;
      var Table = document.getElementById('EvalTable');
      if(!Table) return;
      MassEval.functions.clearEvalTable();
      MassEval.functions.disableThings([ "EvalTable_update" ], true);
      MassEval.functions.alertControl("updateevaltable", MassEval.texts.AlertMsgEvals.split("$theme").join(EvalTheme), "Running");
      MassEval.functions.updateCatAllpages(EvalTheme);
      MassEval.functions.updateCatStubpages(EvalTheme);
      MassEval.functions.updateCatMaincat(EvalTheme);
      var catprefix = MassEval.params.EvalThemesCat[EvalTheme];
      if(!catprefix) return MassEval.functions.updateEvalTable2(EvalTheme);
      console.info("updateEvalTable : Requête 1 - thème="+EvalTheme+' - catprefix="'+catprefix+'"');
      MassEval.params.EvalTableRequests++
      MassEval.functions.getAPIAllcategories({
        gacprefix : catprefix,
        theme     : EvalTheme,
        callback  : function(R){
          MassEval.params.EvalTableRequests--
          var result = R.result;
          var CatList = Object.keys(result);
          if(CatList.length === 0) return MassEval.functions.checkCatinfosEvalTable();
          var EvalCatsMatches = MassEval.params.EvalCatsMatches;
          var allcats = {};
          for(var a=0,l=CatList.length;a<l;a++){
            var catinfo = result[CatList[a]];
            if(catinfo.missing==="") continue;
            var thiscattitle = catinfo.title;
            for(var Match in EvalCatsMatches){
              var thismatch = Match;
              if(thiscattitle.indexOf(thismatch)!==-1){
                var params = EvalCatsMatches[thismatch];
                var Type = MassEval.params[(params.param)];
                var ID = params.id;
                for(var v=0,vlen=Type.length;v<vlen;v++){
                  var typeindex = v
                  var thistype = Type[v];
                  var wiki = thistype.wiki;
                  if(wiki==="?") wiki = MassEval.functions.lcFirst(thistype.text);
                  if((thiscattitle+"|").indexOf((thismatch+" "+wiki+"|"))!==-1){
                    allcats[thiscattitle] = {
                      cattitle     : thiscattitle,
                      type         : Type,
                      typeindex    : typeindex,
                      idnode       : ID
                    }                   
                  }
                }
              }
            }
          }
          var catlengths = Object.keys(allcats);
          if(catlengths.length == 0) return  MassEval.functions.checkCatinfosEvalTable();
          var totalIMP = document.getElementById("EvalTable_IMPtotal");
          if(totalIMP) totalIMP.innerHTML = "";
          var totalAVT = document.getElementById("EvalTable_AVTtotal");
          if(totalAVT) totalAVT.innerHTML = "";
          for(var cat in allcats){
            MassEval.functions.setCatinfosEvalTable(allcats[cat]);
          }
        }
      });
    },
    updateEvalTable2 : function(EvalTheme){
      console.info("updateEvalTable : Requête 2 - thème="+EvalTheme);
      MassEval.params.EvalTableRequests++
      MassEval.functions.getAPIAllcategories({
        gacprefix : MassEval.params.EvalCatsCommonPrefix,
        theme : EvalTheme,
        callback : function(R1){
          MassEval.params.EvalTableRequests--
          var allcats = {};
          var result = R1.result;
          if(!result) return MassEval.functions.checkCatinfosEvalTable();
          var alltitles = Object.keys(result);
          if(alltitles.length == 0) return MassEval.functions.checkCatinfosEvalTable();
          var category = false
          for(var a=0,l=alltitles.length;a<l;a++){
            var thiscat = alltitles[a];
            var goodcat = false;
            for(var p=0,plen=MassEval.params.EvalCatsPrefixes.length;p<plen;p++){
              if(thiscat.indexOf(mw.config.get('wgFormattedNamespaces')[14]+":"+MassEval.params.EvalCatsPrefixes[p])===0) goodcat = true;
           }
            if(goodcat && thiscat.indexOf(R1.theme) !== -1) category = thiscat;
          }
          if(!category) return MassEval.functions.checkCatinfosEvalTable();
          MassEval.params.EvalTableRequests++
          MassEval.functions.getAPICategorymembers({
            title    : category,
            cmprop   : 'title',
            cmtype   : 'subcat',
            callback : function(R2){
              MassEval.params.EvalTableRequests--
              var allcats = {};
              var result = R2.result;
              if(!result) return MassEval.functions.checkCatinfosEvalTable();
              var alltitles = Object.keys(result);
              if(alltitles.length == 0) return MassEval.functions.checkCatinfosEvalTable();
              var EvalCatsMatches = MassEval.params.EvalCatsMatches;
              for(var a=0,l=alltitles.length;a<l;a++){
                var thiscattitle = alltitles[a];
                for(var Match in EvalCatsMatches){
                  var thismatch = Match;
                  if(thiscattitle.indexOf(thismatch)!==-1){
                    var params = EvalCatsMatches[thismatch];
                    var Type = MassEval.params[(params.param)];
                    var ID = params.id;
                    for(var v=0,vlen=Type.length;v<vlen;v++){
                      var typeindex = v
                      var thistype = Type[v];
                      var wiki = thistype.wiki;
                      if(wiki==="?") wiki = MassEval.functions.lcFirst(thistype.text);
                      if((thiscattitle+"|").indexOf((thismatch+" "+wiki+"|"))!==-1){
                        allcats[thiscattitle] = {
                          cattitle     : thiscattitle,
                          type         : Type,
                          typeindex    : typeindex,
                          idnode       : ID
                        }                   
                      }
                    }
                  }
                }
              }
              var catlengths = Object.keys(allcats);
              if(catlengths.length == 0) return  MassEval.functions.checkCatinfosEvalTable();
              var totalIMP = document.getElementById("EvalTable_IMPtotal");
              if(totalIMP) totalIMP.innerHTML = "";
              var totalAVT = document.getElementById("EvalTable_AVTtotal");
              if(totalAVT) totalAVT.innerHTML = "";
              for(var cat in allcats){
                MassEval.functions.setCatinfosEvalTable(allcats[cat]);
              }
            }
          });
        }
      });
    },
    setCatinfosEvalTable : function(Infos){
      MassEval.params.EvalTableRequests++
      MassEval.functions.getAPICategoryinfo({
        infos : Infos,
        title : Infos.cattitle.split(mw.config.get('wgFormattedNamespaces')[14]+":").join(""),
        callback : function(R){
          MassEval.params.EvalTableRequests--
          var result = R.result;
          if(!result) return MassEval.functions.checkCatinfosEvalTable();
          var Infos = R.infos;
          var pages = R.result.pages;
          var formattedpages = MassEval.functions.formatNumber(pages);
          var NodeID = "EvalTable_" + Infos.idnode + Infos.typeindex;
          var totalNodeID = "EvalTable_" + Infos.idnode + "total";
          var Node = document.getElementById(NodeID);
          if(!Node) return MassEval.functions.checkCatinfosEvalTable();
          while(Node.firstChild){ Node.removeChild(Node.firstChild); };          
          var link = Node.appendChild(MassEval.functions.createLink(Infos.cattitle,{text:formattedpages}));
          var totalNode = document.getElementById(totalNodeID);
          if(!totalNode) return MassEval.functions.checkCatinfosEvalTable();
          var ActualValue = totalNode.innerHTML.split(" ").join("");          
          ActualValue = (ActualValue ? parseInt(ActualValue) : 0);
          totalNode.innerHTML = MassEval.functions.formatNumber(ActualValue+pages);
          MassEval.functions.addSelectCatOnclickTolink(link, Infos.cattitle.split(mw.config.get('wgFormattedNamespaces')[14]+":").join(""))
          MassEval.functions.checkCatinfosEvalTable();
        }
      });                    
    },  
    checkCatinfosEvalTable : function(){  
      if(MassEval.params.EvalTableRequests===0){
        MassEval.functions.disableThings([ "EvalTable_update" ], false); 
        MassEval.functions.alertControl("updateevaltable");
      }      
    },
    updateCatAllpages : function(evaltheme){
      var CatAllpages = document.getElementById("CatAllpages");
      if(!evaltheme || !CatAllpages) return;
      CatAllpages.style.visibility = "hidden";
      CatAllpages.innerHTML = "?";
      evaltheme = MassEval.functions.ucFirst(evaltheme);
      var Page = MassEval.params.EvalCatAllpages.split("$1").join(evaltheme);
      MassEval.functions.getAPICategoryinfo({title:Page,callback:function(R){
        CatAllpages.innerHTML = "";
        var Link = CatAllpages.appendChild(MassEval.functions.createLink(mw.config.get('wgFormattedNamespaces')[14]+":"+Page,{text:Page}));
        CatAllpages.style.visibility = "visible";
        MassEval.functions.addSelectCatOnclickTolinks(CatAllpages);
        MassEval.functions.getCatInfoFromLink(Link, Page, true);
      }});
    },
    updateCatStubpages : function(evaltheme){
      var CatStubpages = document.getElementById("CatStubpages");
      if(!evaltheme || !CatStubpages) return;
      CatStubpages.innerHTML = "?";
      CatStubpages.style.visibility = "hidden";
      var Page = MassEval.params.EvalCatStubpages.split("$1").join(MassEval.functions.ucFirst(evaltheme));
      var page = MassEval.params.EvalCatStubpages.split("$1").join(MassEval.functions.lcFirst(evaltheme));
      var CallBack = function(R){
        if(!R.result.missing){
          CatStubpages.innerHTML = "";
          var Link = CatStubpages.appendChild(MassEval.functions.createLink(mw.config.get('wgFormattedNamespaces')[14]+":"+R.title,{text:R.title}));
          CatStubpages.style.visibility = "visible";
          MassEval.functions.addSelectCatOnclickTolinks(CatStubpages);
          MassEval.functions.getCatInfoFromLink(Link, R.title, true);
        }
      }
      MassEval.functions.getAPICategoryinfo({title:Page,callback:CallBack});
      MassEval.functions.getAPICategoryinfo({title:page,callback:CallBack});
    },
    updateCatMaincat : function(evaltheme){
      var CatMaincat = document.getElementById("CatMaincat");
      if(!evaltheme || !CatMaincat) return;
      CatMaincat.style.visibility = "hidden";
      CatMaincat.innerHTML = "?";
      evaltheme = MassEval.functions.ucFirst(evaltheme);
      MassEval.functions.getAPICategoryinfo({title:evaltheme,callback:function(R){
        CatMaincat.innerHTML = "";
        var Link = CatMaincat.appendChild(MassEval.functions.createLink(mw.config.get('wgFormattedNamespaces')[14]+":"+evaltheme,{text:evaltheme}));
        CatMaincat.style.visibility = "visible";
        MassEval.functions.addSelectCatOnclickTolinks(CatMaincat);
        MassEval.functions.getCatInfoFromLink(Link, evaltheme, true);
      }});
    },
  // ------------------------------- Formulaire sélecteur de mode -------------------------------
    createModesFieldset : function(){
      var SelectedMode = MassEval.params.CurrentMode;
      var LaunchCond = MassEval.params.LaunchCondition;
      var ModesFieldset = document.createElement('fieldset');
      ModesFieldset.id = "fieldsetModes";
      var PortalLabel = ModesFieldset.appendChild(document.createElement('legend'));
      PortalLabel.innerHTML = MassEval.texts.Modes;
      var EvalContainer = ModesFieldset.appendChild(document.createElement('div'));
      $(EvalContainer).addClass("FieldsetContent");
      var Form = EvalContainer.appendChild(document.createElement('form'));
      Form.onsubmit = function(){ return false; };
      var AllModes = Object.keys(MassEval.params.ModesMap);
      for(var a=0,l=AllModes.length;a<l;a++){
        var Mode = AllModes[a];
        var Text = MassEval.texts[(Mode+"Mode")];
        var Title = MassEval.texts[(MassEval.params.ModesMap[Mode].veriftitle)];

        var Button = Form.appendChild(MassEval.functions.createInput({type:'button',value:Text,title:Title,name:Mode,id:Text}));
        Button.onclick = function(){
          MassEval.functions.getRelevantModeFieldset(this.name);
        }
        if(Mode == SelectedMode) $(Button).addClass("modeselected");
      }
      return ModesFieldset;
    },
    getRelevantModeFieldset : function(Mode){
      console.info("Mode = "+Mode);
      var AllModes = Object.keys(MassEval.params.ModesMap);
      if(AllModes.indexOf(Mode)===-1) return;
      MassEval.params.CurrentMode = Mode;
      var AllModesInfo = MassEval.params.ModesMap;
      for(var mode in AllModesInfo){
        var B = document.getElementById(MassEval.texts[(mode+"Mode")]);
        var FS = document.getElementById(AllModesInfo[mode].id);
        if(!FS || !B) continue;
        if(mode === Mode){
          $(B).addClass("modeselected");
          FS.style.display = "";
        }else{
          $(B).removeClass("modeselected");
          FS.style.display = "none";
        }
      }
      var VerifTitle = MassEval.texts[AllModesInfo[Mode].veriftitle];
      var VerifInput = document.getElementById("GlobalVerifInput");
      if(VerifInput && VerifTitle) VerifInput.title = VerifTitle;
      var AddTitle = MassEval.texts[AllModesInfo[Mode].addtitle];
      var AddInput = document.getElementById("GlobalAddEvalInput");
      if(AddInput && AddTitle) AddInput.title = AddTitle;
      var func = MassEval.functions[AllModesInfo[Mode].updatefunc];
      if(typeof(func) === "function") func();
    },
    getPageInfos : function(OldInputValue, NS, InputID){
      var DIV = document.getElementById(InputID+"Info");
      if(!DIV) return console.log("Manque élément "+InputID+"Info");
      var P = document.getElementById(InputID+"InfoExist");
      if(!P) return console.log("Manque élément "+InputID+"InfoExist");
      P.style.visibility = "hidden";
      var LI = document.getElementById(InputID+"Count");
      if(LI){ 
        var OldLIcontent = LI.innerHTML;
        LI.innerHTML = '<img class="RunningIcon" src="'+MassEval.params.ImageURL + MassEval.params.RunningIcon+'" />';
      }
      var title = mw.config.get("wgFormattedNamespaces")[NS]+(NS===0 ? "" : ":")+OldInputValue;
      var datas = {format:'json',action:'query',prop:'info',
        titles : title,
        inprop : 'protection|talkid|watched|watchers|visitingwatchers|subjectid',  
      };
      $.ajax({url: mw.util.wikiScript('api'), data: datas,dataType: 'json'
      }).then(function(data) {
        var Input = document.getElementById(InputID);
        if(Input.value.indexOf(OldInputValue)===0){
          var UL = document.createElement('ul');
          $(UL).addClass("PageInfos");
          var CurrentMode = MassEval.params.CurrentMode;
          var template = CurrentMode+"Exists";
          var linktext = (CurrentMode === "template" ? OldInputValue : title );
          var link = '<a href="'+mw.config.get('wgArticlePath').split('$1').join(title)+'" title="'+title+'">'+linktext+'</a>';
          P.style.visibility = "hidden";
          var unwantedinfo = ["restrictiontypes","pagelanguagehtmlcode","pagelanguagedir"];
          var pages = data.query.pages;
          if(CurrentMode == "page") MassEval.functions.setFromToSelectorValues(1);
          var exists = true;
          var invalid = false;
          for(var id in pages){
            var pageinfo = pages[id];
            for(var infoname in pageinfo){
              if(unwantedinfo.indexOf(infoname)===-1){
                var infovalue = pageinfo[infoname];
                if(infoname === "missing"){
                  if(infovalue === "") exists = false;
                }else if(infoname == "invalid"){
                  invalid = true;
                }
                var LI = UL.appendChild(document.createElement('li'));
                MassEval.functions.cleanPageUserInfos(LI, infoname, infovalue);
              }
            }
          }
          if(invalid){
            LI.innerHTML = OldLIcontent;
            MassEval.functions.neutralizeLinks(LI);
            P.style.visibility = "visible";
            return;
          }
          while(DIV.firstChild){ DIV.removeChild(DIV.firstChild); };
          DIV.appendChild(UL);
          if(exists){
            $(P.parentNode).removeClass("pagenoexists");
            template = MassEval.texts[(template+"Yes")];
            MassEval.functions.updateContentSub(OldInputValue, mw.config.get("wgFormattedNamespaces")[NS]);
          }else{
            $(P.parentNode).addClass("pagenoexists");
            template = MassEval.texts[(template+"No")];
            if(CurrentMode == "page") MassEval.functions.setFromToSelectorValues(0);
            MassEval.functions.updateContentSub();
          }
          template = template.split("$page").join('<b>'+link+'</b>');
          P.innerHTML = template;
          MassEval.functions.neutralizeLinks(P);
          P.style.visibility = "visible";
        }
        if(MassEval.functions.checkAnalysisID(id, 0)) MassEval.functions.alertControl("inputanalysis");
      });
    },
    cleanPageUserInfos_checkBoolean : function(infovalue){
      return MassEval.texts[( (infovalue === "") ? "YES" : "NO" )];
    },
    cleanPageUserInfos_checkNamespace : function(infovalue){
      if(infovalue == 0) return MassEval.texts.MainNamespace;
      else return mw.config.get("wgFormattedNamespaces")[infovalue];
    },
    cleanPageUserInfos_checkGender : function(infovalue){
      return MassEval.texts[("INFOgender"+infovalue)]
    },
    cleanPageUserInfos_checkTimestamp : function(infovalue){
     if(!infovalue || infovalue === null) return "";
      var Template = MassEval.texts.TimeDateTemplate;
      infovalue = infovalue.split("Z").join("");
      var time = infovalue.split("T")[1].split(":");
      var date = infovalue.split("T")[0].split("-");
      var Time = new Date(parseInt(date[0]), (parseInt(date[1])-1), parseInt(date[2]), parseInt(time[0]), parseInt(time[1])  );
      Time = new Date(Time.getTime()+(MassEval.params.TimeCorrection*60*1000));      
      Template = Template.split("$min").join(  MassEval.functions.addZero(Time.getMinutes())    );
      Template = Template.split("$h").join(    MassEval.functions.addZero(Time.getHours())   );
      Template = Template.split("$j").join(    Time.getDate()    );
      Template = Template.split("$m").join(    MassEval.texts[("Month"+MassEval.functions.addZero(Time.getMonth()+1)      )]);
      Template = Template.split("$a").join(    Time.getFullYear());
      return Template;
    },
    cleanPageUserInfos_checkUserName : function(infovalue){
      return MassEval.functions.createLink("User:"+infovalue, {text:infovalue});
    },
    cleanPageUserInfos : function(LI, infoname, infovalue){
      var cleanPageUserInfosFuncs = {
        missing          : MassEval.functions.cleanPageUserInfos_checkBoolean,
        pageid           : null,
        ns               : MassEval.functions.cleanPageUserInfos_checkNamespace,
        title            : MassEval.functions.createLink,
        contentmodel     : null,
        pagelanguage     : null,
        touched          : MassEval.functions.cleanPageUserInfos_checkTimestamp,
        lastrevid        : null,
        length           : MassEval.functions.formatNumber,
        protection       : JSON.stringify,
        watched          : MassEval.functions.cleanPageUserInfos_checkBoolean,
        watchers         : MassEval.functions.formatNumber,
        visitingwatchers : MassEval.functions.formatNumber,
        subjectid        : null,
        talkid           : null,
        userid           : null,
        name             : MassEval.functions.cleanPageUserInfos_checkUserName,
        editcount        : MassEval.functions.formatNumber,
        registration     : MassEval.functions.cleanPageUserInfos_checkTimestamp,
        groups           : JSON.stringify,
        gender           : MassEval.functions.cleanPageUserInfos_checkGender
      };
      var infoRealName = MassEval.texts[("INFO"+infoname)] || infoname;
      var Span = LI.appendChild(document.createElement('span'));
      Span.innerHTML = infoRealName + " : ";
      Span.style.fontWeight = "bold";
      var CleanFunc = cleanPageUserInfosFuncs[infoname];
      if(CleanFunc !== null && typeof(CleanFunc)==="function") infovalue = CleanFunc(infovalue);
      if(typeof(infovalue)==="string" || typeof(infovalue)==="number") LI.appendChild(document.createTextNode(infovalue));
      else LI.appendChild(infovalue);
      MassEval.functions.neutralizeLinks(LI);
      return LI;
    },
    getPageSuggestions : function(OldInputValue, NS, InputID){
      var Input = document.getElementById(InputID);
      var Select = document.getElementById(InputID+"Select");
      if(Input.value !== OldInputValue){
        if(Input.value.indexOf(OldInputValue)===0) return MassEval.functions.getPageSuggestions(Input.value, NS, InputID);
        if(MassEval.functions.checkAnalysisID(id, 1)) MassEval.functions.alertControl("inputanalysis");
        return;
      }
      var datas = {format:'json',action:'query',list:'allpages',
        apprefix : OldInputValue,
        apnamespace : NS,
        apfilterredir : 'nonredirects',
        aplimit  : (MassEval.params.SuggestNumber*2)        
      };
      $.ajax({url: mw.util.wikiScript('api'), data: datas,dataType: 'json'
      }).then(function(data) {
        Input = document.getElementById(InputID);
        if(Input.value.indexOf(OldInputValue)===0){
          var query = data.query;
          if(query){
            var pages = query.allpages;
            var titles = [];
            for(var a=0,l=pages.length;a<l;a++){
              var pagedata = pages[a];
              var page = pagedata.title;
              if(NS != 10 || page.indexOf(MassEval.params.TemplateDocPage) === -1)  titles.push(MassEval.functions.getNamespaceInfoFromPage(page, "PageName"));
            }
            while(titles.length > MassEval.params.SuggestNumber){ titles.pop(); }
            MassEval.functions.updateSuggestionElements(titles, OldInputValue, InputID);
          }
        }
      });
    },
    getUserSuggestions : function(OldInputValue, InputID){
      var Input = document.getElementById(InputID);
      if(Input.value !== OldInputValue){
        if(Input.value.indexOf(OldInputValue)===0) return MassEval.functions.getUserSuggestions(Input.value, InputID);
        if(MassEval.functions.checkAnalysisID(id, 1)) MassEval.functions.alertControl("useranalysis");
        return;
      }
      var datas = {format:'json',action:'query',list:'allusers',
        auprefix : OldInputValue,
        aplimit  : MassEval.params.SuggestNumber        
      };
      $.ajax({url: mw.util.wikiScript('api'), data: datas,dataType: 'json'
      }).then(function(data) {
        Input = document.getElementById(InputID);
        if(Input.value.indexOf(OldInputValue)===0){
          var query = data.query;
          if(query){
            var users = []
            var allusers = query.allusers;
            for(var a=0,l=allusers.length;a<l;a++){
              users.push(allusers[a].name);
            }
            MassEval.functions.updateSuggestionElements(users, OldInputValue, InputID);
          }
        }
      });
    },
    setInfosCount : function(count, LiID, InputValue){
      var LI = document.getElementById(LiID);
      if(!LI) return console.log("Manque élément "+LiID);
      var CurrentMode = MassEval.params.CurrentMode;
      var template = MassEval.texts[(CurrentMode+"Infos")].split("$1").join(MassEval.functions.formatNumber(count));
      if(InputValue) template = template.split("$2").join(InputValue);
      LI.innerHTML = template;
    },
  // ------------------------------- Formulaire "Page" -------------------------------
    createPageFieldset : function(title){  // Mode Page
      if(!title) title = "";
      else{
        var CurrentMode = MassEval.params.CurrentMode;
        if(CurrentMode==="cat") title = mw.config.get("wgFormattedNamespaces")[14] + ":" + title;
        if(CurrentMode==="template") title = mw.config.get("wgFormattedNamespaces")[10] + ":" + title;
        if(CurrentMode==="creations") title = mw.config.get("wgFormattedNamespaces")[2] + ":" + title;
      }
      var Fieldset = document.createElement('fieldset');
      Fieldset.id = "fieldsetPage";
      $(Fieldset).addClass("NoShowHideLinks");
      var Label = Fieldset.appendChild(document.createElement('legend'));
      Label.innerHTML = MassEval.texts.pageMode;
      var Container = Fieldset.appendChild(document.createElement('div'));
      $(Container).addClass("FieldsetContent");
      var Table = Container.appendChild(document.createElement('table'));
      Table.style.width = "100%";
      var TR = Table.appendChild(document.createElement('tr'));
      var TDPage = TR.appendChild(document.createElement('td'));
      TDPage.id = "TDPage";
      var FS = TDPage.appendChild(document.createElement("fieldset"));
      $(FS).addClass("NoBorderFieldset NoShowHideLinks");
      var Legend = FS.appendChild(document.createElement("legend"));
      Legend.innerHTML = MassEval.texts.PageLabel;
      var Input = MassEval.functions.createInput({type:"text",value:title,name:'page',id:"PageInput"});
      var Form = FS.appendChild(MassEval.functions.createSuggestSelect(Input));
      Input.onkeyup = function(){ MassEval.functions.checkSelectedPage(MassEval.params.KeyUpDelay); };
      var TD = TR.appendChild(document.createElement('td'));
      TD.setAttribute("rowspan", 2);
      TD.setAttribute('valign',"top");
      var InfoTable = TD.appendChild(document.createElement('table'));
      InfoTable.width = "100%";
      var InfoTR = InfoTable.appendChild(document.createElement('tr'));
      var TDinfos = InfoTR.appendChild(document.createElement('td'));
      TDinfos.setAttribute('valign',"top");
      var P = TDinfos.appendChild(document.createElement('p'));
      $(P).addClass("InfosP");
      P.innerHTML = MassEval.texts.PageInfosLabel;
      var Div = TDinfos.appendChild(document.createElement('div'));
      Div.id = "PageInputInfo";
      $(Div).addClass("PageInfosDiv");
      var TR2 = Table.appendChild(document.createElement('tr'));
      var TDInfos = TR2.appendChild(document.createElement('td'));
      $(TDInfos).addClass("TDInfos pagenoexists");
      var Pinfos = TDInfos.appendChild(document.createElement('p'));
      Pinfos.id = "PageInputInfoExist";
      Pinfos.innerHTML = MassEval.texts.PageExistsNo;
      Pinfos.style.visibility = "hidden";
      return Fieldset;
    },
    checkSelectedPage : function(Delay){
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopDone, "Stop");
      var Input = document.getElementById("PageInput");
      if(!Input) return;
      var PageName = MassEval.functions.ucFirst(Input.value);
      if(!PageName || PageName.length < 1) return;
      var NS = 0;
      Input.value = PageName;
      var funcs = ["getPageSuggestions","getPageInfos"];
      var mainfunc = function(){
        for(var a=0,l=funcs.length;a<l;a++){
          MassEval.functions[funcs[a]](PageName, NS, Input.id);
        }
      }
      clearTimeout(MassEval.params.SuggestTimeout);
      if(typeof(delay)=="number" && delay > 0) MassEval.params.SuggestTimeout = setTimeout(mainfunc, delay);
      else mainfunc();
    }, 
  // ------------------------------- Formulaire "Catégorie" -------------------------------

    createCategoryFieldset : function(CatTitle){
      if(!CatTitle) CatTitle = "";
      var Fieldset = document.createElement('fieldset');
      Fieldset.id = "fieldsetCat";
      $(Fieldset).addClass("NoShowHideLinks");
      var CatLabel = Fieldset.appendChild(document.createElement('legend'));
      CatLabel.innerHTML = MassEval.texts.catMode;
      var CategoryContainer = Fieldset.appendChild(document.createElement('div'));
      $(CategoryContainer).addClass("FieldsetContent");
      var Table = CategoryContainer.appendChild(document.createElement('table'));
      Table.style.width = "100%";
      var TR1 = Table.appendChild(document.createElement('tr'));
      var TDCat = TR1.appendChild(document.createElement('td'));
      TDCat.id = "TDCat";
      var CatInput = MassEval.functions.createInput({type:"text",value:CatTitle,name:'cat',id:"CatInput"});
      CatInput.onkeyup = function(){ MassEval.functions.checkSelectedCat(MassEval.params.KeyUpDelay); };
      TDCat.appendChild(MassEval.functions.createSuggestSelect(CatInput));
      var CatSubcatForm = TDCat.appendChild(document.createElement('form'));
      CatSubcatForm.onsubmit = function(){ return false; };
      CatSubcatForm.id = "subcatcheckboxform";
      var PortalListCubCat = CatSubcatForm.appendChild(MassEval.functions.createInput({type:"checkbox",title:MassEval.texts.SubCatTitle.split("$count").join(""),name:'subcats',id:"SubCatsCheckBox"}));
      PortalListCubCat.onclick = function(){ MassEval.functions.getSelectedCatPageCountInSubcats(); }
      var Label = CatSubcatForm.appendChild(document.createElement('label'));
      Label.setAttribute('for', 'subcats');
      Label.innerHTML = MassEval.texts.SubCatTitle.split("$count").join('<span id="pagesinsubcatscount"> </span>');
      var Radioform = TDCat.appendChild(document.createElement('form'));
      Radioform.id = "subcatdepthForm";
      var Radioslabel = Radioform.appendChild(document.createElement('label'));
      Radioslabel.setAttribute('for', 'subcatdepth');
      Radioslabel.innerHTML = MassEval.texts.SubCatDepthText;
      MassEval.params.CurrentMaxSubcatLevel = 1;
      for(var a=1,l=(MassEval.params.MaxSubcatLevel+1);a<l;a++){        
        var RLabel = Radioform.appendChild(document.createElement('label'));
        RLabel.innerHTML = a;
        var Radio = Radioform.appendChild(MassEval.functions.createInput({type:'radio',value:a,title:a,name:'subcatdepth',id:"subcatdepth"+a}));
        Radio.disabled = "disabled";
        Radio.onclick = function(){
          if(this.disabled) return;
          MassEval.params.CurrentMaxSubcatLevel = this.value;
          MassEval.functions.getSelectedCatPageCountInSubcats();
        }
        if(a==1) Radio.checked = "checked";
      }
      var TDFamily = TR1.appendChild(document.createElement('td'));
      TDFamily.setAttribute('rowspan', 2);
      TDFamily.setAttribute('valign', 'top');
      var FamilyTable = TDFamily.appendChild(document.createElement('table'));
      FamilyTable.width = "100%";
      var FamilyTR = FamilyTable.appendChild(document.createElement('tr'));
      var TDParents = FamilyTR.appendChild(document.createElement('td'));
      TDParents.width = "50%";
      TDParents.id = "TDParents";
      TDParents.setAttribute('valign',"top");
      var Pparents = TDParents.appendChild(document.createElement('p'))
      $(Pparents).addClass("InfosP");
      Pparents.innerHTML = MassEval.texts.CatParents;
      var DivParents = TDParents.appendChild(document.createElement('div'));
      DivParents.id = "CatParentsDiv";
      var TDDaughters = FamilyTR.appendChild(document.createElement('td'));
      TDDaughters.id = "TDDaughters";
      TDDaughters.width = "50%";
      TDDaughters.setAttribute('valign',"top");
      var Pdaughters = TDDaughters.appendChild(document.createElement('p'))
      $(Pdaughters).addClass("InfosP");
      Pdaughters.innerHTML = MassEval.texts.CatDaughters;
      var DivDaughters = TDDaughters.appendChild(document.createElement('div'));
      DivDaughters.id = "CatDaughtersDiv";
      var TR2 = Table.appendChild(document.createElement('tr'));
      var TDCatInfos = TR2.appendChild(document.createElement('td'));
      TDCatInfos.id = "TDCatInfos";
      $(TDCatInfos).addClass("TDInfos pagenoexists");
      var DivInfos = TDCatInfos.appendChild(document.createElement('div'));
      DivInfos.id = "CatInfosDiv";
      var Pinfos = DivInfos.appendChild(document.createElement('p'));
      Pinfos.id = "Pinfos";
      DivInfos.style.visibility = "hidden";
      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";
      return Fieldset;
    },
    checkSelectedCat : function(delay){
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopDone, "Stop");
      var CatInput = document.getElementById("CatInput");
      if(!CatInput) return;
      var Cat = MassEval.functions.ucFirst(CatInput.value);
      if(Cat.length<1) return;
      CatInput.value = Cat;
      var funcs = ["PrefixCats","CatInfos","CatParents","CatDaughters","CatPageCountInSubcats"];
      clearTimeout(MassEval.params.SuggestTimeout);
      var mainfunc = function(){
        MassEval.functions.alertControl("selectoranalysis", MassEval.texts.AlertMsgCatAnalys.split("$cat").join(Cat), "Running");
        MassEval.functions.disableThings([ "SubCatsCheckBox","subcatdepthForm"], false);
        for(var a=0,l=funcs.length;a<l;a++) MassEval.functions[("getSelected"+funcs[a])](Cat, "CatInput");
      }
      if(typeof(delay)=="number" && delay > 0) MassEval.params.SuggestTimeout = setTimeout(mainfunc,delay);
      else mainfunc();
    },
    getSelectedPrefixCats(OldInputValue, InputID){
      var Input = document.getElementById(InputID);
      var Select = document.getElementById(InputID+"Select");
      if(Input.value !== OldInputValue){
        if(Input.value.indexOf(OldInputValue)===0) return MassEval.functions.getSelectedPrefixCats(Input.value, InputID);
        if(MassEval.functions.checkAnalysisID(id, 0)) MassEval.functions.alertControl("selectoranalysis");
        return;
      }
      var datas = {
          action   : 'query',
          list     : 'allcategories',
          acprefix : OldInputValue,
          aclimit  : MassEval.params.SuggestNumber,
          format   : 'json'
      };
      $.ajax({url: mw.util.wikiScript('api'), data: datas,dataType: 'json'
      }).then(function(data) {
        Input = document.getElementById(InputID);
        if(Input.value.indexOf(OldInputValue)===0){
          var categories = data.query.allcategories;
          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);
          }
          MassEval.functions.updateSuggestionElements(titles, OldInputValue, InputID);
        }
      });
    },
    getSelectedCatInfos : function(Cat){
      var CatInput = document.getElementById("CatInput");
      if(CatInput.value != Cat) return MassEval.functions.updateContentSub();
      var CatInfosDiv = document.getElementById("CatInfosDiv");
      if(!CatInfosDiv) return MassEval.functions.alertControl("selectoranalysis");
      CatInfosDiv.style.visibility = "hidden";
      MassEval.functions.getAPICategoryinfo({
        title : Cat,
        callback : function(R){
          var CatInput = document.getElementById("CatInput");
          if(CatInput.value.indexOf(R.title) ===0){
            var Pinfos = document.getElementById("Pinfos");
            var LIpages = document.getElementById("LIpages");
            var LIsubcats = document.getElementById("LIsubcats");
            var SubCats = document.getElementById("SubCatsCheckBox");
            LIpages.style.visibility = "hidden";
            LIsubcats.style.visibility = "hidden";
            if(R.result.missing){
              $(Pinfos.parentNode.parentNode).addClass("pagenoexists");
              Pinfos.innerHTML = MassEval.texts.CatExistsNo.split("$cat").join('<b>'+R.title+'</b>');
              MassEval.functions.updateContentSub();
            }else{
              $(Pinfos.parentNode.parentNode).removeClass("pagenoexists");
              MassEval.functions.updateContentSub(R.title, mw.config.get('wgFormattedNamespaces')[14]);
              var pages = R.result.pages;
              var subcats = R.result.subcats;
              var link = '<a href="'+mw.config.get('wgArticlePath').split('$1').join(mw.config.get('wgFormattedNamespaces')[14]+":"+encodeURIComponent(R.title))+'" title="'+mw.config.get('wgFormattedNamespaces')[14]+":"+R.title+'">'+R.title+'</a>';
              if(MassEval.params.CurrentCatOnSpecialpage == R.title) link = R.title;
              Pinfos.innerHTML = MassEval.texts.CatExistsYes.split("$cat").join('<b>'+link+'</b>');
              LIpages.innerHTML = MassEval.texts.CatPages.split("$1").join(MassEval.functions.formatNumber(pages));
              LIpages.style.visibility = "visible";
              LIsubcats.innerHTML = MassEval.texts.CatCats.split("$1").join(MassEval.functions.formatNumber(subcats));
              LIsubcats.style.visibility = "visible";
            }
            if(!SubCats.checked){
              MassEval.functions.setFromToSelectorValues((R.result.pages ? R.result.pages : 0));
              MassEval.functions.alertControl("selectoranalysis");
            }
            CatInfosDiv.style.visibility = "visible";
          }
          if(MassEval.functions.checkAnalysisID(R.id, 1)) MassEval.functions.alertControl("selectoranalysis");
        }
      });
    },
    createCategoryLinkInList(pageinfo){
      var LI = document.createElement('li');
      var page = pageinfo.title;
      var title = MassEval.functions.getNamespaceInfoFromPage(page, "PageName");
      var span = document.createElement('span');
      $(span).addClass("CategoryTreeToggle");
      span.innerHTML = MassEval.texts.CatButtonClosed;
      LI.appendChild(span);
      LI.appendChild(document.createTextNode(" "));
      LI.appendChild(MassEval.functions.createLink(page,{text:title}));
      if(pageinfo.hidden === ""){
        var abbr = LI.appendChild(document.createElement('abbr'));
        $(abbr).addClass("hiddencaticon");
        abbr.title = MassEval.texts.HiddenCat;
        abbr.innerHTML = '<img class="HiddenCatIcon" src="'+MassEval.params.ImageURL+MassEval.params.HiddenCatIcon+'" />';
      }
      return LI;
    },
    getSelectedCatParents(Cat){
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopDone, "Stop");
      var CatInput = document.getElementById("CatInput");
      if(CatInput.value != Cat) return;
      var CatParentsDiv = document.getElementById("CatParentsDiv");
      while(CatParentsDiv.firstChild){ CatParentsDiv.removeChild(CatParentsDiv.firstChild); }
      MassEval.functions.getAPICategories({
        node     : CatParentsDiv,
        catname  : Cat,
        title    : mw.config.get('wgFormattedNamespaces')[14]+":"+Cat,
        callback : function(R){
          var CanContinue = MassEval.functions.checkEmergencyStop();
          if(!CanContinue) return MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopDone, "Stop");
          var CatInput = document.getElementById("CatInput");
          if(CatInput.value.indexOf(R.catname)===0){
            while(R.node.firstChild){ R.node.removeChild(R.node.firstChild); }
            var allcats = R.result;
            if(typeof(allcats)=="object"){
              var alltitles = Object.keys(allcats);
              if(alltitles.length > 0){
                var UL = R.node.appendChild(document.createElement('ul'));
                for(var pi in R.result){
                  UL.appendChild(MassEval.functions.createCategoryLinkInList(R.result[pi]));
                }
                MassEval.functions.addSelectCatOnclickTolinks(UL);
                MassEval.functions. getCatInfoFromLinks(UL);
              }
            }
          }
        }
      });
    },
    getSelectedCatDaughters(Cat){
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopDone, "Stop");
      var CatInput = document.getElementById("CatInput");
      if(CatInput.value != Cat) return;
      var CatDaughtersDiv = document.getElementById("CatDaughtersDiv");
      while(CatDaughtersDiv.firstChild){ CatDaughtersDiv.removeChild(CatDaughtersDiv.firstChild); }
      MassEval.functions.getAPICategorymembers({
        node     : CatDaughtersDiv,
        catname  : Cat,
        title    : mw.config.get('wgFormattedNamespaces')[14]+":"+Cat,
        cmtype   : 'subcat',
        callback : function(R){
          var CanContinue = MassEval.functions.checkEmergencyStop();
          if(!CanContinue) return MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopDone, "Stop");
          var CatInput = document.getElementById("CatInput");
          if(CatInput.value.indexOf(R.catname)===0){
            while(CatDaughtersDiv.firstChild){ CatDaughtersDiv.removeChild(CatDaughtersDiv.firstChild); }
            var c = 0;
            var UL = R.node.appendChild(document.createElement('ul'));
            for(var pi in R.result){
              UL.appendChild(MassEval.functions.createCategoryLinkInList(R.result[pi]));
              c++
            }
            if(c>0){
              MassEval.functions.addSelectCatOnclickTolinks(UL);
              MassEval.functions. getCatInfoFromLinks(UL);
            }
          }
        }
      });
    },
    addSelectCatOnclickTolinks : function(node){
      var alllinks = node.getElementsByTagName('a');
      for(var a=0,l=alllinks.length;a<l;a++){
        var link = alllinks[a];
        MassEval.functions.addSelectCatOnclickTolink(link, link.innerHTML);
      }
    },
    addSelectCatOnclickTolink : function(link, cattitle, limitation){
      link.onclick = function(){
        if(limitation || $(link).hasClass("new")) return false;
        MassEval.functions.getRelevantModeFieldset("cat");
        var cat = cattitle;
        var Input = document.getElementById("CatInput");
        if(Input){
          Input.value = cat;
          MassEval.functions.checkSelectedCat();
        }
        return false;
      }
      if(!limitation && !$(link).hasClass("new")){
        link.title = MassEval.texts.SelectCat.split("$1").join(cattitle);
      }else{
        if(!$(link).hasClass("new")) link.title = MassEval.texts.TooMuchSubCatsSel.split("$1").join(cattitle).split("$limit").join(MassEval.params.MaxSubCatAllowedSel);
        else link.title = MassEval.texts.CatDoesntExistSel.split("$1").join(cattitle);
        link.style.cursor = "not-allowed";
      }
    },
    getCatInfoFromLinks : function (node, noexpand){
      if(!node) return;
      var links = node.getElementsByTagName('a');
      for(var a=0,l=links.length;a<l;a++){
        MassEval.functions.getCatInfoFromLink(links[a], links[a].innerHTML, noexpand);
      }
    },
    getCatInfoFromLink : function (link, catname, noexpand){
      MassEval.functions.getAPICategoryinfo({
        link : link,
        title : catname,
        callback : function(R){
          var Parent = R.link.parentNode;
          if(R.result.missing === true || !Parent){
            $(link).addClass("new");
            MassEval.functions.addSelectCatOnclickTolink(R.link, R.link.innerHTML);
            return
          }
          var template = MassEval.texts.CatInfos;
          if(!R.result.pages && R.result.subcats) template = MassEval.texts.CatInfosNOP;
          if(R.result.pages && !R.result.subcats) template = MassEval.texts.CatInfosNOC;
          var pages = '<abbr title="'+MassEval.texts.CatInfosPageTip+'">'+MassEval.texts.CatInfosPageText+'</abbr>';
          var subcats = '<abbr title="'+MassEval.texts.CatInfosCatTip+'">'+MassEval.texts.CatInfosCatText+'</abbr>';
          template = template.split("$P").join(pages);
          template = template.split("$C").join(subcats);
          template = template.split("$1").join(MassEval.functions.formatNumber(R.result.pages));
          template = template.split("$2").join(MassEval.functions.formatNumber(R.result.subcats));
          var infospan = Parent.appendChild(document.createElement('span'));
          infospan.innerHTML = template;
          if(R.result.subcats > MassEval.params.MaxSubCatAllowedSel){
            MassEval.functions.addSelectCatOnclickTolink(R.link, R.link.innerHTML, true);
          }
          if(R.result.subcats > 0 && !noexpand){
            var ToggleSpan = Parent.firstChild;
            var ToggleLink = Parent.insertBefore(MassEval.functions.createLink(null, {text:"",title:MassEval.texts.CatButtonExpand,href:"javascript:;"}), ToggleSpan);
            ToggleSpan.parentNode.removeChild(ToggleSpan);
            ToggleLink.appendChild(ToggleSpan);
            ToggleLink.className = ToggleSpan.className;
            ToggleSpan.className = "";
            if(R.result.subcats > MassEval.params.MaxSubCatAllowedExp){              
              ToggleLink.title = MassEval.texts.TooMuchSubCatsExp.split("$1").join(catname).split("$limit").join(MassEval.params.MaxSubCatAllowedExp);
              ToggleLink.style.cursor = "not-allowed";
            }else{
              ToggleLink.onclick = function(){
                var UL = Parent.getElementsByTagName('ul')[0];
                if(UL){
                  if(UL.style.display == "none"){
                    UL.style.display = "";
                    ToggleSpan.innerHTML = MassEval.texts.CatButtonOpened;
                    this.title = MassEval.texts.CatButtonHide;
                  }else{
                    UL.style.display = "none";
                    ToggleSpan.innerHTML = MassEval.texts.CatButtonClosed;
                    this.title = MassEval.texts.CatButtonExpand;
                  }
                }else{
                  MassEval.functions.categorytreeExpand(catname, Parent, this);
                }
              }
            }
          }
        }
      });
    },
    categorytreeExpand : function(catname, LI, ToggleLink){
      if(!LI.parentNode) return;
      MassEval.functions.getAPICategorymembers({
        node     : LI,
        link     : ToggleLink,
        title    : mw.config.get('wgFormattedNamespaces')[14]+":"+catname,
        cmtype   : 'subcat',
        callback : function(R){
          if(!R.node.parentNode || !R.link || !R.link.firstChild) return;
          var UL = R.node.appendChild(document.createElement('ul'));
          for(var pi in R.result){
            var pageinfo = R.result[pi];
            var page = pageinfo.title;
            var title = MassEval.functions.getNamespaceInfoFromPage(page, "PageName");
            var LI = UL.appendChild(document.createElement('li'));
            var span = document.createElement('span');
            $(span).addClass("CategoryTreeToggle");
            span.innerHTML = MassEval.texts.CatButtonClosed;
            LI.appendChild(span);
            LI.appendChild(document.createTextNode(" "));
            LI.appendChild(MassEval.functions.createLink(page,{text:title}));
            if(pageinfo.hidden === ""){
              LI.appendChild(MassEval.functions.createHiddenCatIcon());
            }
          }
          R.link.firstChild.innerHTML = MassEval.texts.CatButtonOpened;
          R.link.title = MassEval.texts.CatButtonHide;
          MassEval.functions.addSelectCatOnclickTolinks(UL);
          MassEval.functions. getCatInfoFromLinks(UL);
        }
      });
    },
    getSelectedCatPageCountInSubcats : function(Cat){
      var catinput = document.getElementById("CatInput");
      var subcatcheckbox = document.getElementById("SubCatsCheckBox");
      var countspan = document.getElementById("pagesinsubcatscount");
      if(!catinput || !subcatcheckbox || !countspan) return MassEval.functions.alertControl("selectoranalysis");;
      if(subcatcheckbox.checked && !subcatcheckbox.disabled){
        MassEval.functions.disableThings(["subcatdepthForm"], false);
        var catname = catinput.value;
        if(!catname){
          countspan.style.display = "none";
          return MassEval.functions.alertControl("selectoranalysis");
        }
        countspan.style.display = "";
        var Hidden = document.getElementById("lastcategorycounted");
        var LHidden = document.getElementById("lastsubcatlevel");
        if( Hidden && Hidden.value == catname && LHidden && LHidden.value == MassEval.params.CurrentMaxSubcatLevel){
          var b = countspan.getElementsByTagName('b')[0];
          if(b){
            var pageCount = parseInt(b.innerHTML.replace(/[^0-9]/g, ""));
            MassEval.functions.setFromToSelectorValues(pageCount);
          }
        }else{
          MassEval.functions.getPageCountInSubcats({start:true,title:catname});
        }
      }else{
        MassEval.functions.disableThings(["subcatdepthForm"], true);
        countspan.style.display = "none";
        MassEval.functions.alertControl("selectoranalysis");
        var LIpages = document.getElementById("LIpages");
        if(LIpages){
          var pageCount = parseInt(LIpages.innerHTML.replace(/[^0-9]/g, ""))
          MassEval.functions.setFromToSelectorValues(pageCount);
        }
      }
    },
    getPageCountInSubcats: function(Q){
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopDone, "Stop");
      if(Q.start === true){ 
        MassEval.params.SubCatCount = {catlist:[],pagelist:[]};
        MassEval.params.SubCatCountReq = 0;
        Q.maxdepth = MassEval.params.CurrentMaxSubcatLevel;
        Q.currentdepth = 0;
        Q.catname = Q.title;
        Q.title = (mw.config.get('wgFormattedNamespaces')[14]+":"+Q.title);
      }
      MassEval.functions.disableThings([ "SubCatsCheckBox","subcatdepthForm"], true);
      Q.start = false;
      delete Q.datas;
      MassEval.params.SubCatCountReq++;
      Q.cmprop = 'title';
      Q.cmtype = 'page|subcat';
      Q.callback = function(R){
        var CanContinue = MassEval.functions.checkEmergencyStop();
        if(!CanContinue) return MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopDone, "Stop");
        var newcatvalue = document.getElementById("CatInput").value;
        if(newcatvalue.indexOf(R.catname)!==0 || R.maxdepth != MassEval.params.CurrentMaxSubcatLevel){
          MassEval.functions.disableThings([ "SubCatsCheckBox","subcatdepthForm"], false);
          return;
        }
        var catstocheck = [];
        for(var pi in R.result){
          var pageinfo = R.result[pi];
          var ns = parseInt(pageinfo.ns);
          var title = pageinfo.title;
          if(ns === 14 && MassEval.params.SubCatCount.catlist.indexOf(title)===-1 && R.currentdepth<MassEval.params.CurrentMaxSubcatLevel){
            MassEval.params.SubCatCount.catlist.push(title);
            catstocheck.push({
              title : title,
              depth : R.currentdepth
            });
          }else if(ns<2 && MassEval.params.SubCatCount.pagelist.indexOf(title)===-1){
            MassEval.params.SubCatCount.pagelist.push(title);
          }
        }
        var TooMuchCats = (catstocheck.length > MassEval.params.MaxSubCatAllowedSel)
        if(!TooMuchCats){
          for(var a=0,l=catstocheck.length;a<l;a++){
            var cattocheck = catstocheck[a];
            MassEval.functions.getPageCountInSubcats({
              title        : cattocheck.title,
              currentdepth : (cattocheck.depth+1),
              catname      : R.catname,
              maxdepth     : R.maxdepth
            });
          }
        }
        MassEval.params.SubCatCountReq--;
        MassEval.functions.setPageCountInSubcats(R, TooMuchCats);
      };
      MassEval.functions.getAPICategorymembers(Q);
    },
    setPageCountInSubcats : function(Q, TooMuchCats){
      var cb = document.getElementById("SubCatsCheckBox");
      var cs = document.getElementById("pagesinsubcatscount");
      if((!cb.checked || TooMuchCats) && cs){
        cs.style.display = "none";
        MassEval.params.CatSubPageCountOK = true;
        MassEval.functions.checkPreliminaryLoadings();
        return;
      }
      var newcatvalue = document.getElementById("CatInput").value;
      if(newcatvalue.indexOf(Q.catname)===0){
        var bold = (MassEval.params.SubCatCountReq == 0);
        var template = MassEval.texts.CatAllPagesCount;
        template = template.split("$1").join(MassEval.functions.formatNumber(MassEval.params.SubCatCount.pagelist.length));
        if(cs){
          template = template.split("$P").join('<abbr title="'+MassEval.texts.CatInfosPageTip+'">'+MassEval.texts.CatInfosPageText+'</abbr>');
          template = (bold ? '<b>'+template+'</b>' : template);
          cs.innerHTML = "("+template+")";
          if(bold){
            var Hidden = cs.appendChild(MassEval.functions.createInput({type:'hidden',value:Q.catname,id:"lastcategorycounted"}));
            var RHidden = cs.appendChild(MassEval.functions.createInput({type:'hidden',value:Q.maxdepth,id:"lastsubcatlevel"}));
            MassEval.functions.disableThings([ "SubCatsCheckBox","subcatdepthForm"], false);
          }
          cs.style.display = "";
        }else if(bold){
          template = "("+template.split("$P").join(MassEval.texts.CatInfosPageTip.toLowerCase())+")";
          cb.title = MassEval.texts.SubCatTitle.split("$count").join(template);
          MassEval.functions.disableThings([ "SubCatsCheckBox" ], false);
          MassEval.params.CatSubPageCountOK = true;
          MassEval.functions.checkPreliminaryLoadings();
          MassEval.functions.alertControl("selectoranalysis");
        }
        MassEval.functions.setFromToSelectorValues(MassEval.params.SubCatCount.pagelist.length);
      }else{
        cs.style.display = "none";
      }
    },
  // ------------------------------- Formulaire "Liens" -------------------------------
    createLinksFieldset : function(title){  // Mode Links
      var DefaultNS = 0;
      if(!title) title = "";
      else{
        var CurrentMode = MassEval.params.CurrentMode;
        if(CurrentMode==="cat") DefaultNS = 14;
        if(CurrentMode==="template") DefaultNS = 10;
        if(CurrentMode==="creations") DefaultNS = 2;
      }
      var Fieldset = document.createElement('fieldset');
      Fieldset.id = "fieldsetLinks";
      $(Fieldset).addClass("NoShowHideLinks");
      var Label = Fieldset.appendChild(document.createElement('legend'));
      Label.innerHTML = MassEval.texts.linksMode;
      var Container = Fieldset.appendChild(document.createElement('div'));
      $(Container).addClass("FieldsetContent");
      var Table = Container.appendChild(document.createElement('table'));
      Table.style.width = "100%";
      var TR = Table.appendChild(document.createElement('tr'));
      var TDLinks = TR.appendChild(document.createElement('td'));
      TDLinks.id = "TDLinks";
      var FS = TDLinks.appendChild(document.createElement("fieldset"));
      $(FS).addClass("NoBorderFieldset NoShowHideLinks");
      var Legend = FS.appendChild(document.createElement("legend"));
      Legend.innerHTML = MassEval.texts.LinksLabel;
      var Input = MassEval.functions.createInput({type:"text",value:title,name:'linkshere',id:"LinksInput"});
      var Form = FS.appendChild(MassEval.functions.createSuggestSelect(Input));
      Input.onkeyup = function(){ MassEval.functions.checkSelectedLinks(MassEval.params.KeyUpDelay); };
      var NSInput = Form.insertBefore(MassEval.functions.createNamespaceSelect(DefaultNS), Form.firstChild);
      NSInput.onchange = function(){ MassEval.functions.checkSelectedLinks(MassEval.params.KeyUpDelay); };
      NSInput.id = "LinksInputNS";
      var TD = TR.appendChild(document.createElement('td'));
      TD.setAttribute("rowspan", 2);
      TD.setAttribute('valign',"top");
      var InfoTable = TD.appendChild(document.createElement('table'));
      InfoTable.width = "100%";
      var InfoTR = InfoTable.appendChild(document.createElement('tr'));
      var TDinfos = InfoTR.appendChild(document.createElement('td'));
      TDinfos.setAttribute('valign',"top");
      var P = TDinfos.appendChild(document.createElement('p'))
      $(P).addClass("InfosP");
      P.innerHTML = MassEval.texts.LinksInfosLabel;
      var Div = TDinfos.appendChild(document.createElement('div'));
      Div.id = "LinksInputInfo";
      $(Div).addClass("PageInfosDiv");
      var TR2 = Table.appendChild(document.createElement('tr'));
      var TDInfos = TR2.appendChild(document.createElement('td'));
      $(TDInfos).addClass("TDInfos pagenoexists");
      var Pinfos = TDInfos.appendChild(document.createElement('p'));
      Pinfos.id = "LinksInputInfoExist";
      Pinfos.innerHTML = MassEval.texts.PageExistsNo;
      Pinfos.style.visibility = "hidden";      
      var ULinfos = TDInfos.appendChild(document.createElement('ul'));
      var LIpages = ULinfos.appendChild(document.createElement('li'));
      LIpages.id = "LinksInputCount";
      return Fieldset;
    },
    checkSelectedLinks : function(Delay){
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopDone, "Stop");
      var Input = document.getElementById("LinksInput");
      var NSInput = document.getElementById("LinksInputNS");
      if(!Input || !NSInput) return;
      var PageName = MassEval.functions.ucFirst(Input.value);
      if(!PageName || PageName.length < 1) return MassEval.functions.updateContentSub();
      var NS = parseInt(NSInput.value);
      Input.value = PageName;
      var Title = mw.config.get("wgFormattedNamespaces")[NS]+(NS===0 ? "" : ":")+PageName;
      var funcs = ["getPageSuggestions","getPageInfos","getLinksCount"];
      var mainfunc = function(){
        MassEval.functions.alertControl("selectoranalysis", MassEval.texts.AlertMsgLinks.split("$page").join(Title), "Running");
        for(var a=0,l=funcs.length;a<l;a++){
          MassEval.functions[funcs[a]](PageName, NS, Input.id);
        }
      }
      clearTimeout(MassEval.params.SuggestTimeout);
      if(typeof(delay)=="number" && delay > 0) MassEval.params.SuggestTimeout = setTimeout(mainfunc, delay);
      else mainfunc();
    },
    getLinksCount : function(title, NS, InputID){
      MassEval.params.PageLinksList = [];
      var Title = mw.config.get("wgFormattedNamespaces")[NS]+(NS===0 ? "" : ":")+title;
      MassEval.functions.getAPILinks({title:Title,result:[],callback:function(R){
        var CanContinue = MassEval.functions.checkEmergencyStop();
        if(!CanContinue) return MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopDone, "Stop");
        var TalkSubPagesToAvoid = MassEval.params.TalkSubPagesToAvoid;
        var titles = R.result;
        for(var a=0,l=titles.length;a<l;a++){
          var title = titles[a];
          var OK = true;
          for(var tp=0,tplen=TalkSubPagesToAvoid.length;tp<tplen;tp++){
            if(title.indexOf(TalkSubPagesToAvoid[tp]) !==-1 ) OK = false;
          }
          if(OK) MassEval.params.PageLinksList.push(title);
        }
        var count = MassEval.params.PageLinksList.length;
        MassEval.functions.setInfosCount(count, (InputID+"Count"));
        MassEval.functions.setFromToSelectorValues(count);
        MassEval.functions.alertControl("selectoranalysis");
      }});
    },
  // ------------------------------- Formulaire "Pages liées" -------------------------------
    createLinkshereFieldset : function(title){  // Mode Linkshere
      var DefaultNS = 0;
      if(!title) title = "";
      else{
        var CurrentMode = MassEval.params.CurrentMode;
        if(CurrentMode==="cat") DefaultNS = 14;
        if(CurrentMode==="template") DefaultNS = 10;
        if(CurrentMode==="creations") DefaultNS = 2;
      }
      var Fieldset = document.createElement('fieldset');
      Fieldset.id = "fieldsetLinkshere";
      $(Fieldset).addClass("NoShowHideLinks");
      var Label = Fieldset.appendChild(document.createElement('legend'));
      Label.innerHTML = MassEval.texts.linkshereMode;
      var Container = Fieldset.appendChild(document.createElement('div'));
      $(Container).addClass("FieldsetContent");
      var Table = Container.appendChild(document.createElement('table'));
      Table.style.width = "100%";
      var TR = Table.appendChild(document.createElement('tr'));
      var TDLinkshere = TR.appendChild(document.createElement('td'));
      TDLinkshere.id = "TDLinkshere";
      var FS = TDLinkshere.appendChild(document.createElement("fieldset"));
      $(FS).addClass("NoBorderFieldset NoShowHideLinks");
      var Legend = FS.appendChild(document.createElement("legend"));
      Legend.innerHTML = MassEval.texts.LinkshereLabel;
      var Input = MassEval.functions.createInput({type:"text",value:title,name:'linkshere',id:"LinkshereInput"});
      var Form = FS.appendChild(MassEval.functions.createSuggestSelect(Input));
      Input.onkeyup = function(){ MassEval.functions.checkSelectedLinkshere(MassEval.params.KeyUpDelay); };
      var NSInput = Form.insertBefore(MassEval.functions.createNamespaceSelect(DefaultNS), Form.firstChild);
      NSInput.onchange = function(){ MassEval.functions.checkSelectedLinkshere(MassEval.params.KeyUpDelay); };
      NSInput.id = "LinkshereInputNS";
      var TD = TR.appendChild(document.createElement('td'));
      TD.setAttribute("rowspan", 2);
      TD.setAttribute('valign',"top");
      var InfoTable = TD.appendChild(document.createElement('table'));
      InfoTable.width = "100%";
      var InfoTR = InfoTable.appendChild(document.createElement('tr'));
      var TDinfos = InfoTR.appendChild(document.createElement('td'));
      TDinfos.setAttribute('valign',"top");
      var P = TDinfos.appendChild(document.createElement('p'))
      $(P).addClass("InfosP");
      P.innerHTML = MassEval.texts.LinkshereInfosLabel;
      var Div = TDinfos.appendChild(document.createElement('div'));
      Div.id = "LinkshereInputInfo";
      $(Div).addClass("PageInfosDiv");
      var TR2 = Table.appendChild(document.createElement('tr'));
      var TDInfos = TR2.appendChild(document.createElement('td'));
      $(TDInfos).addClass("TDInfos pagenoexists");
      var Pinfos = TDInfos.appendChild(document.createElement('p'));
      Pinfos.id = "LinkshereInputInfoExist";
      Pinfos.innerHTML = MassEval.texts.PageExistsNo;
      Pinfos.style.visibility = "hidden";
      var ULinfos = TDInfos.appendChild(document.createElement('ul'));
      var LIpages = ULinfos.appendChild(document.createElement('li'));
      LIpages.id = "LinkshereInputCount";
      return Fieldset;
    },
    checkSelectedLinkshere : function(Delay){
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopDone, "Stop");
      var Input = document.getElementById("LinkshereInput");
      var NSInput = document.getElementById("LinkshereInputNS");
      if(!Input || !NSInput) return;
      var PageName = MassEval.functions.ucFirst(Input.value);
      if(!PageName || PageName.length < 1) return MassEval.functions.updateContentSub();
      var NS = parseInt(NSInput.value);
      Input.value = PageName;
      var Title = mw.config.get("wgFormattedNamespaces")[NS]+(NS===0 ? "" : ":")+PageName;
      var funcs = ["getPageSuggestions","getPageInfos","getLinkshereCount"];
      var mainfunc = function(){
        MassEval.functions.alertControl("selectoranalysis", MassEval.texts.AlertMsgLinkshere.split("$page").join(Title), "Running");
        for(var a=0,l=funcs.length;a<l;a++){
          MassEval.functions[funcs[a]](PageName, NS, Input.id);
        }
      }
      clearTimeout(MassEval.params.SuggestTimeout);
      if(typeof(delay)=="number" && delay > 0) MassEval.params.SuggestTimeout = setTimeout(mainfunc, delay);
      else mainfunc();
    }, 
    getLinkshereCount : function(title, NS, InputID){
      var Title = mw.config.get("wgFormattedNamespaces")[NS]+(NS===0 ? "" : ":")+title;
      MassEval.params.PageLinkshereList = [];
      MassEval.functions.getAPILinkshere({title:Title,result:[],lhprop:'title',lhnamespace:'0|1',lhshow:'!redirect',callback:function(R){
        var CanContinue = MassEval.functions.checkEmergencyStop();
        if(!CanContinue) return MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopDone, "Stop");
        var TalkSubPagesToAvoid = MassEval.params.TalkSubPagesToAvoid;
        var Infos = R.result[Title];
        if(Infos){
          var titles = Infos.linkshere;
          if(titles && titles.length > 0){
            for(var a=0,l=titles.length;a<l;a++){
              var title = titles[a].title;
              var OK = true;
              for(var tp=0,tplen=TalkSubPagesToAvoid.length;tp<tplen;tp++){
                if(title.indexOf(TalkSubPagesToAvoid[tp]) !==-1 ) OK = false;
              }
              if(OK) MassEval.params.PageLinkshereList.push(title);
            }
          }
        }
        var count = MassEval.params.PageLinkshereList.length;
        MassEval.functions.setInfosCount(count, (InputID+"Count"));
        MassEval.functions.setFromToSelectorValues(count);
        MassEval.functions.alertControl("selectoranalysis");
      }});
    },
  // ------------------------------- Formulaire "Inclusions" -------------------------------
    createTemplateFieldset : function(title){  // Mode Template
      if(!title) title = "";
      var Fieldset = document.createElement('fieldset');
      Fieldset.id = "fieldsetTemplate";
      $(Fieldset).addClass("NoShowHideLinks");
      var Label = Fieldset.appendChild(document.createElement('legend'));
      Label.innerHTML = MassEval.texts.templateMode;
      var Container = Fieldset.appendChild(document.createElement('div'));
      $(Container).addClass("FieldsetContent");
      var Table = Container.appendChild(document.createElement('table'));
      Table.style.width = "100%";
      var TR = Table.appendChild(document.createElement('tr'));
      var TDTemplate = TR.appendChild(document.createElement('td'));
      TDTemplate.id = "TDTemplate";
      var FS = TDTemplate.appendChild(document.createElement("fieldset"));
      $(FS).addClass("NoBorderFieldset NoShowHideLinks");
      var Legend = FS.appendChild(document.createElement("legend"));
      Legend.innerHTML = MassEval.texts.TemplateLabel;
      var Input = MassEval.functions.createInput({type:"text",value:title,name:'template',id:"TemplateInput"});
      var Form = FS.appendChild(MassEval.functions.createSuggestSelect(Input));
      Input.onkeyup = function(){ MassEval.functions.checkSelectedTemplate(MassEval.params.KeyUpDelay); };
      var TD = TR.appendChild(document.createElement('td'));
      TD.setAttribute("rowspan", 2);
      TD.setAttribute('valign',"top");
      var InfoTable = TD.appendChild(document.createElement('table'));
      InfoTable.width = "100%";
      var InfoTR = InfoTable.appendChild(document.createElement('tr'));
      var TDinfos = InfoTR.appendChild(document.createElement('td'));
      TDinfos.setAttribute('valign',"top");
      var P = TDinfos.appendChild(document.createElement('p'));
      $(P).addClass("InfosP");
      P.innerHTML = MassEval.texts.TemplateInfosLabel;
      var Div = TDinfos.appendChild(document.createElement('div'));
      Div.id = "TemplateInputInfo";
      $(Div).addClass("PageInfosDiv");
      var TDdoc = InfoTR.appendChild(document.createElement('td'));
      TDdoc.id = "TDtemplatedoc";
      TDdoc.setAttribute('valign',"top");
      var Pdoc = TDdoc.appendChild(document.createElement('p'))
      $(Pdoc).addClass("InfosP");
      Pdoc.innerHTML = MassEval.texts.TemplateDocLabel;
      var Divdoc = TDdoc.appendChild(document.createElement('div'));
      Divdoc.id = "TemplateDoc";
      $(Divdoc).addClass("PageInfosDiv");
      var TR2 = Table.appendChild(document.createElement('tr'));
      var TDInfos = TR2.appendChild(document.createElement('td'));
      $(TDInfos).addClass("TDInfos pagenoexists");
      var Pinfos = TDInfos.appendChild(document.createElement('p'));
      Pinfos.id = "TemplateInputInfoExist";
      Pinfos.innerHTML = MassEval.texts.TemplateExistsNo;
      Pinfos.style.visibility = "hidden";
      var ULinfos = TDInfos.appendChild(document.createElement('ul'));
      var LIpages = ULinfos.appendChild(document.createElement('li'));
      LIpages.id = "TemplateInputCount";
      return Fieldset;
    },
    checkSelectedTemplate : function(Delay){
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopDone, "Stop");
      var Input = document.getElementById("TemplateInput");
      if(!Input) return;
      var PageName = MassEval.functions.ucFirst(Input.value);
      if(!PageName || PageName.length < 1) return MassEval.functions.updateContentSub();
      var NS = 10;
      Input.value = PageName;
      var funcs = ["getPageSuggestions","getPageInfos","getEnbeddedinCount","getTemplateDoc"];
      var mainfunc = function(){
        MassEval.functions.alertControl("selectoranalysis", MassEval.texts.AlertMsgTemplate.split("$template").join(PageName), "Running");
        for(var a=0,l=funcs.length;a<l;a++){
          MassEval.functions[funcs[a]](PageName, NS, Input.id);
        }
      }
      clearTimeout(MassEval.params.SuggestTimeout);
      if(typeof(delay)=="number" && delay > 0) MassEval.params.SuggestTimeout = setTimeout(mainfunc, delay);
      else mainfunc();
    }, 
    getEnbeddedinCount : function(title, NS, InputID){
      MassEval.params.PageTemplateList = [];
      var Title = mw.config.get("wgFormattedNamespaces")[NS]+(NS===0 ? "" : ":")+title;
      MassEval.functions.getAPIEmbeddedin({title:Title,result:[],einamespace:'0',callback:function(R){
        var CanContinue = MassEval.functions.checkEmergencyStop();
        if(!CanContinue) return MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopDone, "Stop");
        var TalkSubPagesToAvoid = MassEval.params.TalkSubPagesToAvoid;
        MassEval.params.PageTemplateList = R.result;
        var count = MassEval.params.PageTemplateList.length;
        MassEval.functions.setInfosCount(count, (InputID+"Count"));
        MassEval.functions.setFromToSelectorValues(count);
        MassEval.functions.alertControl("selectoranalysis");
      }});
    },
    getTemplateDoc : function(title, NS, InputID){
      var DocDiv = document.getElementById("TemplateDoc");
      if(!DocDiv) return;
      while(DocDiv.firstChild){ DocDiv.removeChild(DocDiv.firstChild); }
      var DocTitle = mw.config.get("wgFormattedNamespaces")[NS]+(NS===0 ? "" : ":")+title; // +MassEval.params.TemplateDocPage;
      var URL = mw.util.getUrl(DocTitle);
      $.ajax({url:URL, complete: function(Req){
        while(DocDiv.firstChild){ DocDiv.removeChild(DocDiv.firstChild); }
        var TEMP = document.createElement("div");
        TEMP.style.display = "none";
        TEMP.innerHTML = Req.responseText;
        document.body.appendChild(TEMP);
        var Divs = TEMP.getElementsByTagName('div');
        var IDs = MassEval.params.DivIDsToPreview;
        var noarticletext = false;
        for(var a=0,l=Divs.length;a<l;a++){
          if($(Divs[a]).hasClass("noarticletext")) noarticletext = true;
        }
        if(!noarticletext){
          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) continue;
            DocDiv.appendChild(thisDiv);
            if(thisDiv.id === "catlinks") MassEval.functions.addSelectCatOnclickTolinks(thisDiv);
            else MassEval.functions.neutralizeLinks(thisDiv);
          }
        }
        TEMP.parentNode.removeChild(TEMP);
      }});
    },
  // ------------------------------- Formulaire "Nouvelles pages" -------------------------------
    createNewpagesFieldset : function(){  // Mode Newpages
      var Fieldset = document.createElement('fieldset');
      Fieldset.id = "fieldsetNewpages";
      $(Fieldset).addClass("NoShowHideLinks");
      var Label = Fieldset.appendChild(document.createElement('legend'));
      Label.innerHTML = MassEval.texts.newpagesMode;
      var Container = Fieldset.appendChild(document.createElement('div'));
      $(Container).addClass("FieldsetContent");
      var Table = Container.appendChild(document.createElement('table'));
      Table.style.width = "100%";
      var TR = Table.appendChild(document.createElement('tr'));
      var TDNewpages = TR.appendChild(document.createElement('td'));
      TDNewpages.id = "TDNewpages";
      var TimeSelector =  TDNewpages.appendChild(MassEval.functions.createTimeSelector(MassEval.functions.checkSelectedNewpages));
      TimeSelector.id = "NewpagesTimeSelector";
      var TD = TR.appendChild(document.createElement('td'));
      TD.setAttribute("rowspan", 2);
      TD.setAttribute('valign',"top");
      var InfoTable = TD.appendChild(document.createElement('table'));
      InfoTable.width = "100%";
      var InfoTR = InfoTable.appendChild(document.createElement('tr'));
      var TDinfos = InfoTR.appendChild(document.createElement('td'));
      TDinfos.setAttribute('valign',"top");
      var P = TDinfos.appendChild(document.createElement('p'));
      $(P).addClass("InfosP");
      P.innerHTML = MassEval.texts.newpagesInfosLabel;
      var Div = TDinfos.appendChild(document.createElement('div'));
      Div.id = "NewpagesInputInfo";
      $(Div).addClass("PageInfosDiv");
      var TR2 = Table.appendChild(document.createElement('tr'));
      var TDInfos = TR2.appendChild(document.createElement('td'));
      $(TDInfos).addClass("TDInfos pagenoexists");
      TDInfos.id = "NewpagesExistInfos";
      var Pinfos = TDInfos.appendChild(document.createElement('p'));
      Pinfos.id = "NewpagesExist";
      Pinfos.innerHTML = MassEval.texts.newpagesExistsNo;
      Pinfos.style.visibility = "hidden";
      var ULinfos = TDInfos.appendChild(document.createElement('ul'));
      var LIpages = ULinfos.appendChild(document.createElement('li'));
      LIpages.id = "NewpagesInfos";
      return Fieldset;
    },
    checkSelectedNewpages : function(Delay){
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopDone, "Stop");
      MassEval.functions.updateContentSub(true);
      var LI = document.getElementById("NewpagesInfos");
      if(LI) LI.innerHTML = '<img class="RunningIcon" src="'+MassEval.params.ImageURL + MassEval.params.RunningIcon+'" />';
      var Timestamp = MassEval.functions.getTimeSelectorValue("NewpagesTimeSelector");
      MassEval.functions.alertControl("selectoranalysis", MassEval.texts.AlertMsgNewpages, "Running");
      MassEval.functions.getAPIRecentchanges({timestamp:Timestamp,callback:function(R){
        var CanContinue = MassEval.functions.checkEmergencyStop();
        if(!CanContinue) return MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgNewpages, "Stop");
        var titles = R.result;
        var count = Object.keys(titles).length;  
        var P = document.getElementById("NewpagesExist");
        var LI = document.getElementById("NewpagesInfos");
        if(count==0){
          var template = MassEval.texts.newpagesExistsNo;
          $(P.parentNode).addClass("pagenoexists");  
        }else{
          var template = MassEval.texts.newpagesExistsYes;
          $(P.parentNode).removeClass("pagenoexists");        
        }
        P.innerHTML = template;
        P.style.visibility = "visible";
        MassEval.functions.setInfosCount(count, "NewpagesInfos");
        MassEval.functions.setFromToSelectorValues(count);
        var DIV = document.getElementById("NewpagesInputInfo"); 
        while(DIV.firstChild){ DIV.removeChild(DIV.firstChild); }
        var UL = DIV.appendChild(document.createElement('ul'));
        $(UL).addClass("PageInfos");
        for(var a=0,l=titles.length;a<l;a++){
          var title = titles[a].title;
          var timestamp = titles[a].timestamp;
          var LI = UL.appendChild(document.createElement('li'));
          var link = LI.appendChild(MassEval.functions.createLink(title)); 
          link.onclick = function(){ return false; };
          LI.appendChild(document.createTextNode(" : "));
          LI.appendChild(document.createTextNode(MassEval.functions.cleanPageUserInfos_checkTimestamp(timestamp)));     
        }
        MassEval.functions.alertControl("selectoranalysis");
      }});
    },
  // ------------------------------- Formulaire "Créations" -------------------------------
    createCreationsFieldset : function(title){  // Mode Creations
      if(!title) title = "";
      var Fieldset = document.createElement('fieldset');
      Fieldset.id = "fieldsetCreations";
      $(Fieldset).addClass("NoShowHideLinks");
      var Label = Fieldset.appendChild(document.createElement('legend'));
      Label.innerHTML = MassEval.texts.creationsMode;
      var Container = Fieldset.appendChild(document.createElement('div'));
      $(Container).addClass("FieldsetContent");
      var Table = Container.appendChild(document.createElement('table'));
      Table.style.width = "100%";
      var TR = Table.appendChild(document.createElement('tr'));
      var TDUser = TR.appendChild(document.createElement('td'));
      TDUser.id = "TDUser";
      var UserFS = TDUser.appendChild(document.createElement("fieldset"));
      $(UserFS).addClass("NoBorderFieldset NoShowHideLinks");
      var Legend = UserFS.appendChild(document.createElement("legend"));
      Legend.innerHTML = MassEval.texts.UserLabel;
      var Input = MassEval.functions.createInput({type:"text",value:title,name:'user',id:"UserInput"});
      var Form = UserFS.appendChild(MassEval.functions.createSuggestSelect(Input));
      Input.onkeyup = function(){ MassEval.functions.checkSelectedCreations(MassEval.params.KeyUpDelay); };
      var TimeSelector =  TDUser.appendChild(MassEval.functions.createTimeSelector(MassEval.functions.checkSelectedCreations));
      TimeSelector.id = "CreationsTimeSelector";
      var TD = TR.appendChild(document.createElement('td'));
      TD.setAttribute("rowspan", 2);
      TD.setAttribute('valign',"top");
      var InfoTable = TD.appendChild(document.createElement('table'));
      InfoTable.width = "100%";
      var InfoTR = InfoTable.appendChild(document.createElement('tr'));
      var TDinfos = InfoTR.appendChild(document.createElement('td'));
      TDinfos.setAttribute('valign',"top");
      var P = TDinfos.appendChild(document.createElement('p'));
      $(P).addClass("InfosP");
      P.innerHTML = MassEval.texts.UserInfosLabel;
      var Div = TDinfos.appendChild(document.createElement('div'));
      Div.id = "UserInputInfo";
      $(Div).addClass("PageInfosDiv");
      var TR2 = Table.appendChild(document.createElement('tr'));
      var TDInfos = TR2.appendChild(document.createElement('td'));
      $(TDInfos).addClass("TDInfos pagenoexists");
      var Pinfos = TDInfos.appendChild(document.createElement('p'));
      Pinfos.id = "UserInputInfoExist";
      Pinfos.innerHTML = MassEval.texts.creationsExistsNo;
      Pinfos.style.visibility = "hidden";
      var ULinfos = TDInfos.appendChild(document.createElement('ul'));
      var LIpages = ULinfos.appendChild(document.createElement('li'));
      LIpages.id = "UserInputCount";
      return Fieldset;
    },
    checkSelectedCreations : function(Delay){
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopDone, "Stop");
      var Input = document.getElementById("UserInput");
      if(!Input) return;
      var PageName = MassEval.functions.ucFirst(Input.value);
      if(!PageName || PageName.length < 1) return MassEval.functions.updateContentSub();
      Input.value = PageName;
      var funcs = ["getUserSuggestions","getUserInfos","getUsercontribsCount"];
      var mainfunc = function(){
        MassEval.functions.alertControl("selectoranalysis", MassEval.texts.AlertMsgCreations.split("$user").join(PageName), "Running");
        for(var a=0,l=funcs.length;a<l;a++){
          MassEval.functions[funcs[a]](PageName, Input.id);
        }
      }
      clearTimeout(MassEval.params.SuggestTimeout);
      if(typeof(delay)=="number" && delay > 0) MassEval.params.SuggestTimeout = setTimeout(mainfunc, delay);
      else mainfunc();
    },
    getUserInfos : function(OldInputValue, InputID){
      var DIV = document.getElementById(InputID+"Info");
      if(!DIV) return console.log("Manque élément "+InputID+"Info");
      var P = document.getElementById(InputID+"InfoExist");
      if(!P) return console.log("Manque élément "+InputID+"InfoExist");     
      P.style.visibility = "hidden";
      var LI = document.getElementById(InputID+"Count");
      if(LI) LI.innerHTML = '<img class="RunningIcon" src="'+MassEval.params.ImageURL + MassEval.params.RunningIcon+'" />';
      while(DIV.firstChild){ DIV.removeChild(DIV.firstChild); };
      var Datas = {format:'json',action:'query',list:'users',
          usprop      : 'blockinfo|groups|editcount|registration|emailable|gender',
          ususers     : OldInputValue
        };
      $.ajax({url: mw.util.wikiScript('api'), data: Datas,dataType: 'json'
      }).then(function(data) {
        var link = '<a href="'+mw.config.get('wgArticlePath').split('$1').join(mw.config.get("wgFormattedNamespaces")[2]+":"+OldInputValue)+'" title="'+mw.config.get("wgFormattedNamespaces")[2]+":"+OldInputValue+'">'+OldInputValue+'</a>';
        var unwantedinfo = [];
        Input = document.getElementById(InputID);
        if(Input.value.indexOf(OldInputValue)===0){
          while(DIV.firstChild){ DIV.removeChild(DIV.firstChild); };
          var UL = DIV.appendChild(document.createElement("ul"));
          $(UL).addClass("PageInfos");
          var found = false;
          var query = data.query;
          if(query){
            var user = query.users[0];
            if(user){
              var username = user.name;
              if(username === OldInputValue){
                found = true;
                for(var infoname in user){
                  if(unwantedinfo.indexOf(infoname)===-1){
                    var infovalue = user[infoname];
                    if(infoname === "missing" && infovalue === "") found = false;
                    var LI = UL.appendChild(document.createElement('li'));
                    MassEval.functions.cleanPageUserInfos(LI, infoname, infovalue);
                  }
                }
              }
            }
          }
        }
        if(found){
          var template = MassEval.texts.creationsExistsYes;
          $(P.parentNode).removeClass("pagenoexists");
          MassEval.functions.updateContentSub(OldInputValue);
        }else{
          var template = MassEval.texts.creationsExistsNo;
          $(P.parentNode).addClass("pagenoexists");   
          MassEval.functions.updateContentSub();       
        }
        template = template.split("$page").join('<b>'+link+'</b>');
        P.innerHTML = template;
        MassEval.functions.neutralizeLinks(P);
        P.style.visibility = "visible";
      });
    },
    getUsercontribsCount : function(user, InputID){
      var Timestamp = MassEval.functions.getTimeSelectorValue("CreationsTimeSelector");
      MassEval.functions.getAPIUsercontribs({timestamp:Timestamp,user:user,callback:function(R){
        var CanContinue = MassEval.functions.checkEmergencyStop();
        if(!CanContinue) return MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopDone, "Stop");
        var titles = R.result;
        var count = titles.length;   
        MassEval.functions.setInfosCount(count, (InputID+"Count"));     
        MassEval.functions.setFromToSelectorValues(count);
        MassEval.functions.alertControl("selectoranalysis");
      }});
    },
  // ------------------------------- Formulaire "Prefixes" -------------------------------
    createPrefixesFieldset : function(title){
      if(!title) title = "";
      var Fieldset = document.createElement('fieldset');
      Fieldset.id = "fieldsetPrefixes";
      $(Fieldset).addClass("NoShowHideLinks");
      var Label = Fieldset.appendChild(document.createElement('legend'));
      Label.innerHTML = MassEval.texts.prefixesMode;
      var Container = Fieldset.appendChild(document.createElement('div'));
      $(Container).addClass("FieldsetContent");
      var Table = Container.appendChild(document.createElement('table'));
      Table.style.width = "100%";
      var TR = Table.appendChild(document.createElement('tr'));
      var TDPrefixes = TR.appendChild(document.createElement('td'));
      TDPrefixes.id = "TDPrefixes";
      var FS = TDPrefixes.appendChild(document.createElement("fieldset"));
      $(FS).addClass("NoBorderFieldset NoShowHideLinks");
      var Legend = FS.appendChild(document.createElement("legend"));
      Legend.innerHTML = MassEval.texts.PrefixLabel;
      var Input = MassEval.functions.createInput({type:"text",value:title,name:'prefix',id:"PrefixInput"});
      var Form = FS.appendChild(MassEval.functions.createSuggestSelect(Input));
      Input.onkeyup = function(){ MassEval.functions.checkSelectedPrefixes(MassEval.params.KeyUpDelay); };
      var TD = TR.appendChild(document.createElement('td'));
      TD.setAttribute("rowspan", 2);
      TD.setAttribute('valign',"top");
      var InfoTable = TD.appendChild(document.createElement('table'));
      InfoTable.width = "100%";
      var InfoTR = InfoTable.appendChild(document.createElement('tr'));
      var TDinfos = InfoTR.appendChild(document.createElement('td'));
      TDinfos.setAttribute('valign',"top");
      var P = TDinfos.appendChild(document.createElement('p'));
      $(P).addClass("InfosP");
      P.innerHTML = MassEval.texts.prefixesInfosLabel;
      var Div = TDinfos.appendChild(document.createElement('div'));
      Div.id = "PrefixInputInfo";
      $(Div).addClass("PageInfosDiv");
      var TR2 = Table.appendChild(document.createElement('tr'));
      var TDInfos = TR2.appendChild(document.createElement('td'));
      $(TDInfos).addClass("TDInfos pagenoexists");
      var Pinfos = TDInfos.appendChild(document.createElement('p'));
      Pinfos.id = "PrefixInputInfoExist";
      Pinfos.innerHTML = MassEval.texts.prefixesExistsNo;
      Pinfos.style.visibility = "hidden";
      var ULinfos = TDInfos.appendChild(document.createElement('ul'));
      var LIpages = ULinfos.appendChild(document.createElement('li'));
      LIpages.id = "PrefixInputCount";
      return Fieldset;
    },
    checkSelectedPrefixes : function(delay){
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue) return MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopDone, "Stop");
      var Input = document.getElementById("PrefixInput");
      if(!Input) return;
      var Prefix = MassEval.functions.ucFirst(Input.value);
      if(!Prefix || Prefix.length < 1) return;
      Input.value = Prefix;
      var funcs = ["getPageSuggestions","getPrefixedPageCount"];
      var mainfunc = function(){
        MassEval.functions.alertControl("selectoranalysis", MassEval.texts.AlertMsgPrefixes.split("$1").join(Prefix), "Running");
        for(var a=0,l=funcs.length;a<l;a++){
          MassEval.functions[funcs[a]](Prefix, 0, Input.id);
        }
      }
      clearTimeout(MassEval.params.SuggestTimeout);
      if(typeof(delay)=="number" && delay > 0) MassEval.params.SuggestTimeout = setTimeout(mainfunc, delay);
      else mainfunc();
    },
    getPrefixedPageCount : function(OldInputValue, NS, InputID, pagelist, contvalue){
      var P = document.getElementById("PrefixInputInfoExist");
      var Div = document.getElementById("PrefixInputInfo");
      if(!P || !Div) return MassEval.functions.alertControl("selectoranalysis");
      var LI = document.getElementById("PrefixInputCount");
      if(LI) LI.innerHTML = '<img class="RunningIcon" src="'+MassEval.params.ImageURL + MassEval.params.RunningIcon+'" />';
      while(Div.firstChild){ Div.removeChild(Div.firstChild); };
      if(!pagelist) pagelist = [];
      var datas = {format:'json',action:'query',list:'allpages',
        apprefix : OldInputValue,
        apnamespace : NS,
        aplimit : MassEval.params.APILimit       
      };
      if(contvalue) datas.apcontinue = contvalue;
      $.ajax({url: mw.util.wikiScript('api'), data: datas,dataType: 'json'
      }).then(function(data) {
        Input = document.getElementById(InputID);
        if(Input.value.indexOf(OldInputValue)===0){
          var query = data.query;
          if(query){
            var pages = query.allpages;
            for(var a=0,l=pages.length;a<l;a++){
              var pagedata = pages[a];
              var page = pagedata.title;
              pagelist.push(page);
            }
          }
          var cont = data.continue;
          if(cont){
            var apcontinue = cont.apcontinue;
            if(apcontinue) return MassEval.functions.getPrefixedPageCount(OldInputValue, NS, InputID, pagelist, apcontinue);            
          }
          var count = pagelist.length;
          if(count==0){
            var template = MassEval.texts.prefixesExistsNo.split("$1").join(OldInputValue);
            $(P.parentNode).addClass("pagenoexists");  
          }else{
            var template = MassEval.texts.prefixesExistsYes.split("$1").join(OldInputValue);
            $(P.parentNode).removeClass("pagenoexists");        
          }
          P.innerHTML = template;
          P.style.visibility = "visible";
          MassEval.functions.setInfosCount(count, (InputID+"Count"), OldInputValue);
          MassEval.functions.setFromToSelectorValues(count);          
          while(Div.firstChild){ Div.removeChild(Div.firstChild); };
          var UL = Div.appendChild(document.createElement('ul'));
          $(UL).addClass("PageInfos");
          for(var a=0,l=pagelist.length;a<l;a++){
            var t = pagelist[a];
            var LI = UL.appendChild(document.createElement('li'));
            var link = LI.appendChild(MassEval.functions.createLink(t)); 
            link.onclick = function(){ return false; };        
          }          
          MassEval.functions.alertControl("selectoranalysis");
        }
      });
    },
  // ------------------------------- Formulaire "Filtrage" -------------------------------
    createFilterFieldset : function(){
      var SearchFieldset = document.createElement('fieldset');
      SearchFieldset.id = "fieldsetSearch";
      var SearchLegend =  SearchFieldset.appendChild(document.createElement('legend'));
      SearchLegend.innerHTML = MassEval.texts.Search;
      var SearchContainer = SearchFieldset.appendChild(document.createElement('div'));
      $(SearchContainer).addClass("FieldsetContent");
      var SearchForm = SearchContainer.appendChild(document.createElement('form'));
      SearchForm.onsubmit = function(){ return false; };
      SearchForm.id = "EvalSearchForm"; 
      var FromToSelectorContainer = SearchForm.appendChild(document.createElement('div'));
      FromToSelectorContainer.id = "FromToSelectorContainer";
      var FromToSelectorDiv = FromToSelectorContainer.appendChild(document.createElement('div'));
      FromToSelectorDiv.title = MassEval.texts.RangeSelectorTip
      FromToSelectorDiv.id = "FromToSelectorDiv";
      FromToSelectorDiv.style.width = "100%";
      $(FromToSelectorDiv).addClass("RangeSelectorDisabled");
      var FromHidden = SearchForm.appendChild(MassEval.functions.createInput({type:'hidden',value:0,id:"FromToSelectorFrom"}));
      var ToHidden = SearchForm.appendChild(MassEval.functions.createInput({type:'hidden',value:0,id:"FromToSelectorTo"}));
      var CatSizeHidden = SearchForm.appendChild(MassEval.functions.createInput({type:'hidden',value:0,id:"FromToSelectorCatSize"}));
      var FromToSelector = FromToSelectorDiv.appendChild(document.createElement('div'));
      FromToSelector.id = "FromToSelector";
      FromToSelector.style.position = "relative";
      FromToSelector.style.top = 0;
      FromToSelector.style.left = "0%";
      FromToSelector.style.width = "100%";
      var FromDiv = FromToSelector.appendChild(document.createElement('div'));
      FromDiv.id = "FromSelector";
      FromDiv.style.position = "relative";
      FromDiv.style.top = 0;
      FromDiv.style.left = 0;
      var ToDiv = FromToSelector.appendChild(document.createElement('div'));
      ToDiv.id = "ToSelector";
      ToDiv.style.float = "right";
      ToDiv.style.position = "relative";
      ToDiv.style.top = 0;
      ToDiv.style.right = 0;
      var MoveDiv = FromToSelector.appendChild(document.createElement('div'));
      MoveDiv.id = "FromSelectorMove";
      var table = SearchForm.appendChild(document.createElement('table'));
      table.width = "100%";
      var tr = table.appendChild(document.createElement('tr'));
      var tdRange = tr.appendChild(document.createElement('td'));
      var tdFilter = tr.appendChild(document.createElement('td'));
      var tdCounter = tr.appendChild(document.createElement('td'));
      tdRange.width = "125px";
      tdCounter.width = "125px";
      var CounterA = tdRange.appendChild(document.createElement('a'));
      CounterA.href = "javascript:;";
      CounterA.id = "RangeSelectorAbbrLink";
      CounterA.onclick = function (){ 
         if(!$(this).hasClass("RangeSelectorDisabled")) MassEval.functions.razFromToSelector();
      }
      var Counter = CounterA.appendChild(document.createElement('span'));
      var Template = MassEval.texts.RangeSelectorTempl;
      Counter.innerHTML = Template.split("$from").join("<span id='FromSelectorValue'>0</span>").split("$to").join("<span id='ToSelectorValue'>0</span>");
      Counter.id = "RangeSelectorAbbr";
      Counter.title = MassEval.texts.RangeViewerTip;
      var PageFilteredCount = tdCounter.appendChild(MassEval.functions.createLink(null,{text:"",href:"javascript:;",title:MassEval.texts.NotFilteredCount}));
      PageFilteredCount.id = "PageFilteredCount";
      PageFilteredCount.style.visibility = "hidden";
      PageFilteredCount.onclick = function(){ MassEval.functions.razFilterOptions(); };
      var Center = tdFilter.appendChild(document.createElement('center')); 
      Center.id = "FilterOptions";           
      var STUBform = Center.appendChild(document.createElement('span'));
      STUBform.id = "FilterForm_STUB";
      var STUBLabel = STUBform.appendChild(document.createElement('label'));
      STUBLabel.innerHTML = MassEval.texts.STUB + " : ";
      STUBLabel.setAttribute("for", "StubFilterCheckbox");
      var StubParams = [
       { text : MassEval.texts.NO , color: MassEval.params.Avancement[1].color },
       { text : MassEval.texts.YES, color: MassEval.params.Avancement[5].color }
      ];
      for(var a=0,l=StubParams.length;a<l;a++){
        var STUB = StubParams[a];
        var Span = STUBform.appendChild(document.createElement('span'));
        Span.style.backgroundColor = STUB.color;
        var STUBInput = Span.appendChild(MassEval.functions.createInput({type:'checkbox',value:a,title:STUB.text,name:"StubFilterCheckbox"}));
        STUBInput.checked = "checked";
        if(a===0) $(Span).addClass('startFilterOption');
        else $(Span).addClass('endFilterOption');
      }
      var ANDORselect1 = Center.appendChild(document.createElement('select'));
      ANDORselect1.id = "ANDORselect1";
      var AND = ANDORselect1.appendChild(document.createElement('option'));
      AND.value = "AND";
      AND.innerHTML = MassEval.texts.SearchAND;
      AND.selected = "selected";
      var OR = ANDORselect1.appendChild(document.createElement('option'));
      OR.value = "OR";
      OR.innerHTML = MassEval.texts.SearchOR;
      var AVTform = Center.appendChild(document.createElement('span'));
      AVTform.id = "FilterForm_AVT";
      var AVTLabel = AVTform.appendChild(document.createElement('label'));
      AVTLabel.innerHTML = MassEval.texts.AVT + " : ";
      AVTLabel.setAttribute("for", "Avancement_Filter");
      var Avancements = MassEval.params.Avancement;
      for(var a=0,l=Avancements.length;a<l;a++){
        var AVT = Avancements[a];
        var Span = AVTform.appendChild(document.createElement('span'));
        Span.style.backgroundColor = AVT.color;
        var AVTInput = Span.appendChild(MassEval.functions.createInput({type:'checkbox',value:a,title:AVT.text,name:"Avancement_Filter"}));
        AVTInput.checked = "checked";
        if(a===0) $(Span).addClass('startFilterOption');
      }
      var NoAVTSpan = AVTform.appendChild(document.createElement('span'));
      NoAVTSpan.style.backgroundColor = "black";
      $(NoAVTSpan).addClass('endFilterOption');
      var NoAVTInput = NoAVTSpan.appendChild(MassEval.functions.createInput({type:'checkbox',value:-1,title:MassEval.texts.AVTOptNone,name:"Avancement_Filter"}));
      NoAVTInput.checked = "checked";
      var ANDORselect2 = Center.appendChild(document.createElement('select'));
      ANDORselect2.id = "ANDORselect2";
      var AND = ANDORselect2.appendChild(document.createElement('option'));
      AND.value = "AND";
      AND.innerHTML = MassEval.texts.SearchAND;
      AND.selected = "selected";
      var OR = ANDORselect2.appendChild(document.createElement('option'));
      OR.value = "OR";
      OR.innerHTML = MassEval.texts.SearchOR;
      var IMPform = Center.appendChild(document.createElement('span'));
      IMPform.id = "FilterForm_IMP";
      var IMPLabel = IMPform.appendChild(document.createElement('label'));
      IMPLabel.innerHTML = MassEval.texts.IMP + " : ";
      IMPLabel.setAttribute("for", "Importance_Filter");
      var Importances = MassEval.params.Importance;
      for(var a=0,l=Importances.length;a<l;a++){
        var IMP = Importances[a];
        var Span = IMPform.appendChild(document.createElement('span'));
        Span.style.backgroundColor = IMP.color;
        var IMPInput = Span.appendChild(MassEval.functions.createInput({type:'checkbox',value:a,title:IMP.text,name:"Importance_Filter"}));
        IMPInput.checked = "checked";
        if(a===0) $(Span).addClass('startFilterOption');
      }
      var NoIMPSpan = IMPform.appendChild(document.createElement('span'));
      NoIMPSpan.style.backgroundColor = "black";
      $(NoIMPSpan).addClass('endFilterOption');
      var NoIMPInput = NoIMPSpan.appendChild(MassEval.functions.createInput({type:'checkbox',value:-1,title:MassEval.texts.IMPOptNone,name:"Importance_Filter"}));
      NoIMPInput.checked = "checked";
      var inputs = Center.getElementsByTagName('input');
      for(var a=0,l=inputs.length;a<l;a++){ inputs[a].onclick = function(){ MassEval.functions.checkFilterOptions(); } }
      var selects = Center.getElementsByTagName('select');
      for(var a=0,l=selects.length;a<l;a++){ selects[a].onclick = function(){ MassEval.functions.checkFilterOptions(); } }
      return SearchFieldset;
    },
    setFromToSelectorValues : function(totalpages){
      if(typeof(totalpages) !== "number" || (""+totalpages) === "NaN") return;
      var CatSizeHidden = document.getElementById("FromToSelectorCatSize");
      var FromToSelectorDiv = document.getElementById("FromToSelectorDiv");
      var FromHidden = document.getElementById("FromToSelectorFrom");
      var ToHidden = document.getElementById("FromToSelectorTo");
      var FromToSelector = document.getElementById("FromToSelector");
      var FromSelectorValue = document.getElementById("FromSelectorValue");
      var ToSelectorValue = document.getElementById("ToSelectorValue");
      var RangeSelectorLink = document.getElementById("RangeSelectorAbbrLink");
      if(!CatSizeHidden || !FromToSelectorDiv || !FromHidden || !ToHidden || !FromToSelector || !FromSelectorValue || !ToSelectorValue || !RangeSelectorLink) return;
      if(totalpages===0){
        CatSizeHidden.value = 0;
        FromHidden.value = 0;
        FromSelectorValue.innerHTML = 0;
        ToHidden.value = 0;
        ToSelectorValue.innerHTML = 0;
        $(FromToSelectorDiv).addClass("RangeSelectorDisabled");
        MassEval.functions.disableThings(["GlobalVerifInput","GlobalAddEvalInput"], true);
        RangeSelectorLink.style.visibility = "hidden";
      }else{
        CatSizeHidden.value = totalpages;
        FromHidden.value = 1;
        FromSelectorValue.innerHTML = 1;
        ToHidden.value = totalpages;
        ToSelectorValue.innerHTML = totalpages;
        $(FromToSelectorDiv).removeClass("RangeSelectorDisabled");
        MassEval.functions.disableThings(["GlobalVerifInput","GlobalAddEvalInput"], false);
        RangeSelectorLink.style.visibility = "visible";
      }
      FromToSelector.style.left = "0%";
      FromToSelector.style.width = "100%";      
      $(FromSelectorValue.parentNode).removeClass("NotAllPages");
    },
    updateFromToSelectorValues : function(data){
      var CatSizeHidden = document.getElementById("FromToSelectorCatSize");
      var FromHidden = document.getElementById("FromToSelectorFrom");
      var ToHidden = document.getElementById("FromToSelectorTo");
      var FromToSelector = document.getElementById("FromToSelector");
      var FromSelectorValue = document.getElementById("FromSelectorValue");
      var ToSelectorValue = document.getElementById("ToSelectorValue");
      if(!CatSizeHidden || !FromHidden || !ToHidden || !FromToSelector || !FromSelectorValue || !ToSelectorValue) return;
      var NEWfrom = data.from;
      var NEWto = data.to;
      var Total = parseInt(CatSizeHidden.value);
      if((NEWfrom != 1 || NEWto != Total) && Total !==1) $(FromSelectorValue.parentNode).addClass("NotAllPages");
      else $(FromSelectorValue.parentNode).removeClass("NotAllPages");
      FromHidden.value = NEWfrom;
      FromSelectorValue.innerHTML = NEWfrom;
      ToHidden.value = NEWto;
      ToSelectorValue.innerHTML = NEWto;
    },
    getFromToSelectorValues : function(){
      var Hidden = document.getElementById("FromToSelectorCatSize");
      var FromHidden = document.getElementById("FromToSelectorFrom");
      var ToHidden = document.getElementById("FromToSelectorTo");
      if(!Hidden || !FromHidden || !ToHidden) return null;
      var values =  {
                      from  : parseInt(FromHidden.value),
                      to    : parseInt(ToHidden.value),
                      total : parseInt(Hidden.value)
      };
      return values;
    },
    razFromToSelector : function(){
      var CatSizeHidden = document.getElementById("FromToSelectorCatSize");
      if(!CatSizeHidden) return;
      MassEval.functions.setFromToSelectorValues(parseInt(CatSizeHidden.value));
    },
    getNav : (function () {
      var agt = navigator.userAgent.toLowerCase();
      var is_ie = agt.indexOf("msie") !== -1 && agt.indexOf("opera") === -1;
      return function () {
          return is_ie;
      };
    })(),
    getXmousePosition : function(e){
      var X;
      if(MassEval.functions.getNav()){
        X = parseInt( e.clientX + document.getElementsByTagName('body')[0].scrollLeft );
      }else{
        X = parseInt( e.clientX );
      }
      return X;
    },
    setFromSelectorAnchor : function(){
      var anchorNode = document.getElementById("FromSelector");
      var ElementToMoveAndResize = document.getElementById("FromToSelector");
      if(!anchorNode || !ElementToMoveAndResize) return;
      anchorNode.onmousedown = function(e){
        if(!e) { e = window.event; }
        var totalWidth = parseInt(ElementToMoveAndResize.parentNode.clientWidth);
        var values = MassEval.functions.getFromToSelectorValues();
        var initialX = MassEval.functions.getXmousePosition(e);
        ElementToMoveAndResize.initialX = initialX;        
        ElementToMoveAndResize.Step = (100/values.total);
        ElementToMoveAndResize.initialFrom = (values.from-1);
        ElementToMoveAndResize.initialTo = (values.to+1);
        ElementToMoveAndResize.initialTotal = values.total;
        //console.log("# X = "+initialX+" | totalWidth = "+totalWidth+" | Move = 0 | Step = "+ElementToMoveAndResize.Step+" | From = "+ElementToMoveAndResize.initialFrom+" | To = "+ElementToMoveAndResize.initialTo);
        $(document.body).addClass("MouseFunctionRunning");
        $(document.body).addClass("ResizeFunctionRunning");
        document.body.onmousemove = function(e){
          if(!e) { e = window.event; }
          var X = MassEval.functions.getXmousePosition(e);
          var PercentMove = parseFloat((X - ElementToMoveAndResize.initialX)/(totalWidth*100)*10000);
          var NewSteps = Math.round(PercentMove/ElementToMoveAndResize.Step);
          var NewLeft = (ElementToMoveAndResize.initialFrom + NewSteps);
          if(NewLeft < 0) NewLeft = 0;
          if(NewLeft > ElementToMoveAndResize.initialTo-2) NewLeft = (ElementToMoveAndResize.initialTo-2);
          var NewWidth = (ElementToMoveAndResize.initialTo - NewLeft -1);
          //console.log("* X = "+X+" | totalWidth = "+totalWidth+" | Move = "+NewSteps+" | Step = "+ElementToMoveAndResize.Step+" | From = "+NewLeft+" | To = "+(NewWidth+NewLeft));
          ElementToMoveAndResize.style.width  = (NewWidth*ElementToMoveAndResize.Step) + '%';
          ElementToMoveAndResize.style.left = (NewLeft*ElementToMoveAndResize.Step) + '%';
          MassEval.functions.updateFromToSelectorValues({from:(NewLeft+1),to:(NewLeft+NewWidth)});
        };
        document.body.onmouseup = function(e) {
          document.body.onmousemove = null;
          document.body.onmouseup = null;
          $(document.body).removeClass("MouseFunctionRunning");
          $(document.body).removeClass("ResizeFunctionRunning");
        }; 
      };
      anchorNode.style.cursor = "w-resize";
    },
    setToSelectorAnchor : function(){
      var anchorNode = document.getElementById("ToSelector");
      var ElementToResize = document.getElementById("FromToSelector");
      if(!anchorNode || !ElementToResize) return;
      anchorNode.onmousedown = function(e){
        if(!e) { e = window.event; }
        var totalWidth = parseInt(ElementToResize.parentNode.clientWidth);
        var values = MassEval.functions.getFromToSelectorValues();
        var initialX = MassEval.functions.getXmousePosition(e);
        ElementToResize.initialX = initialX;        
        ElementToResize.Step = (100/values.total);
        ElementToResize.initialFrom = (values.from-1);
        ElementToResize.initialTo = (values.to+1);
        ElementToResize.initialTotal = values.total;
        //console.log("# X = "+initialX+" | totalWidth = "+totalWidth+" | Move = 0 | Step = "+ElementToResize.Step+" | From = "+ElementToResize.initialFrom+" | To = "+ElementToResize.initialTo);
        $(document.body).addClass("MouseFunctionRunning");
        $(document.body).addClass("ResizeFunctionRunning");
        document.body.onmousemove = function(e){
          if(!e) { e = window.event; }
          var X = MassEval.functions.getXmousePosition(e);
          var PercentMove = parseFloat((X - ElementToResize.initialX)/(totalWidth*100)*10000);
          var NewSteps = Math.round(PercentMove/ElementToResize.Step);
          var NewWidth = ((ElementToResize.initialTo-ElementToResize.initialFrom) -1 + NewSteps);
          if(NewWidth < 1) NewWidth = 1;
          if((NewWidth+ElementToResize.initialFrom) > ElementToResize.initialTotal){
            NewWidth = (ElementToResize.initialTotal - ElementToResize.initialFrom);
          }
          //console.log("* X = "+X+" | totalWidth = "+totalWidth+" | Move = "+NewSteps+" | Width = "+NewWidth);
          ElementToResize.style.width  = (NewWidth*ElementToResize.Step) + '%';
          MassEval.functions.updateFromToSelectorValues({from:(ElementToResize.initialFrom+1),to:(ElementToResize.initialFrom+NewWidth)});
        };
        document.body.onmouseup = function(e) {
          document.body.onmousemove = null;
          document.body.onmouseup = null;
          $(document.body).removeClass("MouseFunctionRunning");
          $(document.body).removeClass("ResizeFunctionRunning");
        }; 
      };
      anchorNode.style.cursor = "w-resize";
    },
    setMoveSelectorAnchor : function(){
      var anchorNode = document.getElementById("FromSelectorMove");
      var ElementToMove = document.getElementById("FromToSelector");
      if(!anchorNode || !ElementToMove) return;
      anchorNode.onmousedown = function(e){
        if(!e) { e = window.event; }
        var totalWidth = parseInt(ElementToMove.parentNode.clientWidth);
        var values = MassEval.functions.getFromToSelectorValues();
        var initialX = MassEval.functions.getXmousePosition(e);
        ElementToMove.initialX = initialX;        
        ElementToMove.Step = (100/values.total);
        ElementToMove.initialFrom = (values.from-1);
        ElementToMove.initialTo = values.to;
        ElementToMove.initialTotal = values.total;
        //console.log("# X = "+initialX+" | totalWidth = "+totalWidth+" | Move = 0 | Step = "+ElementToMove.Step+" | From = "+ElementToMove.initialFrom+" | To = "+ElementToMove.initialTo);
        $(document.body).addClass("MouseFunctionRunning");
        $(document.body).addClass("MoveFunctionRunning");
        document.body.onmousemove = function(e){
          if(!e) { e = window.event; }
          var X = MassEval.functions.getXmousePosition(e);
          var PercentMove = parseFloat((X - ElementToMove.initialX)/(totalWidth*100)*10000);
          var NewSteps = Math.round(PercentMove/ElementToMove.Step);
          var NewLeft = (ElementToMove.initialFrom + NewSteps);
          if(NewLeft < 0) NewLeft = 0;
          var NewWidth = ((ElementToMove.initialTo-ElementToMove.initialFrom));
          if((NewWidth+NewLeft) > ElementToMove.initialTotal) NewLeft =  ElementToMove.initialTotal-NewWidth;
          //console.log("* X = "+X+" | totalWidth = "+totalWidth+" | Move = "+NewSteps+" | Step = "+ElementToMove.Step+" | From = "+NewLeft+" | To = "+(NewWidth+NewLeft));
          ElementToMove.style.width  = (NewWidth*ElementToMove.Step) + '%';
          ElementToMove.style.left = (NewLeft*ElementToMove.Step) + '%';
          MassEval.functions.updateFromToSelectorValues({from:(NewLeft+1),to:(NewLeft+NewWidth)});
        };
        document.body.onmouseup = function(e) {
          document.body.onmousemove = null;
          document.body.onmouseup = null;
          $(document.body).removeClass("MouseFunctionRunning");
          $(document.body).removeClass("MoveFunctionRunning");
        }; 
      };
      anchorNode.style.cursor = "move";
    },
    checkFilterOptions : function(data){
      var MassEvalBoardList = document.getElementById("MassEvalBoardList");
      var STUBSelector = document.getElementById("FilterForm_STUB");
      var ANDORselect1 = document.getElementById("ANDORselect1");
      var AVTSelector = document.getElementById("FilterForm_AVT");
      var ANDORselect2 = document.getElementById("ANDORselect2");
      var IMPSelector = document.getElementById("FilterForm_IMP");
      var PageFilteredCount = document.getElementById("PageFilteredCount");
      if(!MassEvalBoardList || !STUBSelector || !ANDORselect1 || !AVTSelector || !ANDORselect2 || !IMPSelector || !PageFilteredCount) return;
      if(!MassEval.functions.getFilterConditions()) return;
      PageFilteredCount.style.visibility = "hidden";
      var TRs = MassEvalBoardList.getElementsByTagName('tr');
      if(TRs.length<2) return;      
      var stubs = [];
      var STUBInputs = STUBSelector.getElementsByTagName("input");
      for(var a=0,l=STUBInputs.length;a<l;a++){
        if(STUBInputs[a].checked) stubs.push(parseInt(STUBInputs[a].value));
      }
      var avts = [];
      var AVTInputs = AVTSelector.getElementsByTagName("input");
      for(var a=0,l=AVTInputs.length;a<l;a++){
        if(AVTInputs[a].checked) avts.push(parseInt(AVTInputs[a].value));
      }
      var imps = [];
      var IMPInputs = IMPSelector.getElementsByTagName("input");
      for(var a=0,l=IMPInputs.length;a<l;a++){
         if(IMPInputs[a].checked) imps.push(parseInt(IMPInputs[a].value));
      }
      var andor1 = ANDORselect1.value;
      var andor2 = ANDORselect2.value;
      var shownpages = 0;
      var totalpages = 0;
      for(var a=1,l=TRs.length;a<l;a++){
        var Classes = TRs[a].className.split(" ");
        var thisstub = ( (Classes.indexOf("stub")!==-1) ? 1 : 0);
        var thisavt = -1;
        for(var c=0,clen=Classes.length;c<clen;c++){ if(Classes[c].indexOf("AVT_")!==-1) thisavt = parseInt(Classes[c].split("AVT_").join("")); }
        var thisimp = -1;
        for(var c=0,clen=Classes.length;c<clen;c++){ if(Classes[c].indexOf("IMP_")!==-1) thisimp = parseInt(Classes[c].split("IMP_").join("")); }
        var foundSTUB = (stubs.indexOf(thisstub) !== -1);
        var foundAVT  = ( avts.indexOf(thisavt)  !== -1);
        var foundIMP  = ( imps.indexOf(thisimp)  !== -1);
        if(MassEval.functions.getFilterResults([foundSTUB, andor1, foundAVT, andor2, foundIMP])){
          $(TRs[a]).removeClass('FilteredLine');
          shownpages++
        }else{
          $(TRs[a]).addClass('FilteredLine');
        }
        totalpages++
      }
      var template = MassEval.texts.FilteredCount;
      var count = template.split("$shown").join(shownpages).split("$total").join(totalpages);
      PageFilteredCount.innerHTML = count;
      if(shownpages !== totalpages) $(PageFilteredCount).addClass("NotAllPages");
      else $(PageFilteredCount).removeClass("NotAllPages");
      PageFilteredCount.style.visibility = "visible";
      if(!data) data = {};
      data.afteroptioncheck = true;
      MassEval.functions.setChangeCancelInputDisabled(data);
    },
    razFilterOptions(){
      var STUBSelector = document.getElementById("FilterForm_STUB");
      var AVTSelector = document.getElementById("FilterForm_AVT");
      var IMPSelector = document.getElementById("FilterForm_IMP");
      if(!STUBSelector || !AVTSelector || !IMPSelector) return;
      var Els = [STUBSelector,AVTSelector,IMPSelector];
      for(var a=0,l=Els.length;a<l;a++){
        var inputs = Els[a].getElementsByTagName('input');
        for(var i=0,ilen=inputs.length;i<ilen;i++){
          inputs[i].checked = "checked";
        }
      }
      MassEval.functions.checkFilterOptions();
    },
    getFilterConditions : function(){
      var STUBSelector = document.getElementById("FilterForm_STUB");
      var AVTSelector = document.getElementById("FilterForm_AVT");
      var IMPSelector = document.getElementById("FilterForm_IMP");
      if(!STUBSelector || !AVTSelector || !IMPSelector) return true;
      var stubs = [];
      var STUBInputs = STUBSelector.getElementsByTagName("input");
      for(var a=0,l=STUBInputs.length;a<l;a++){
        if(STUBInputs[a].checked) stubs.push(parseInt(STUBInputs[a].value));
      }
      var avts = [];
      var AVTInputs = AVTSelector.getElementsByTagName("input");
      for(var a=0,l=AVTInputs.length;a<l;a++){
        if(AVTInputs[a].checked) avts.push(parseInt(AVTInputs[a].value));
      }
      var imps = [];
      var IMPInputs = IMPSelector.getElementsByTagName("input");
      for(var a=0,l=IMPInputs.length;a<l;a++){
         if(IMPInputs[a].checked) imps.push(parseInt(IMPInputs[a].value));
      }
      if(stubs.length == 0 || avts.length == 0 || imps.length == 0){
        if(stubs.length == 0){
          STUBSelector.style.backgroundColor = "red";
          MassEval.functions.alertControl("filtercheckSTUB", MassEval.texts.AlertMsgFilterSTUB, "Warning");
        }else{
          STUBSelector.style.backgroundColor = "transparent";
          MassEval.functions.alertControl("filtercheckSTUB");
        }
        if(avts.length == 0){
          AVTSelector.style.backgroundColor = "red";
          MassEval.functions.alertControl("filtercheckAVT", MassEval.texts.AlertMsgFilterAVT, "Warning");
        }else{
          AVTSelector.style.backgroundColor = "transparent";
          MassEval.functions.alertControl("filtercheckAVT");
        }
        if(imps.length == 0){
          IMPSelector.style.backgroundColor = "red";
          MassEval.functions.alertControl("filtercheckIMP", MassEval.texts.AlertMsgFilterIMP, "Warning");
        }else{
          IMPSelector.style.backgroundColor = "transparent";
          MassEval.functions.alertControl("filtercheckIMP");
        }
        return false;
      }else{
        STUBSelector.style.backgroundColor = "transparent";
        MassEval.functions.alertControl("filtercheckSTUB");
        AVTSelector.style.backgroundColor = "transparent";
        MassEval.functions.alertControl("filtercheckAVT");
        IMPSelector.style.backgroundColor = "transparent";
        MassEval.functions.alertControl("filtercheckIMP");
        return true;
      }
    },
    getFilterResults : function(VARS){
      var table = [
        [true	,"AND"	,false	,"AND"	,false	,false	],
        [true	,"AND"	,false	,"AND"	,true	,false	],
        [true	,"AND"	,true	,"AND"	,false	,false	],
        [true	,"AND"	,true	,"AND"	,true	,true	],
        [false	,"AND"	,false	,"AND"	,false	,false	],
        [false	,"AND"	,false	,"AND"	,true	,false	],
        [false	,"AND"	,true	,"AND"	,false	,false	],
        [false	,"AND"	,true	,"AND"	,true	,false	],
        [true	,"AND"	,false	,"OR"	,false	,false	],
        [true	,"AND"	,false	,"OR"	,true	,true	],
        [true	,"AND"	,true	,"OR"	,false	,true	],
        [true	,"AND"	,true	,"OR"	,true	,true	],
        [false	,"AND"	,false	,"OR"	,false	,false	],
        [false	,"AND"	,false	,"OR"	,true	,true	],
        [false	,"AND"	,true	,"OR"	,false	,false	],
        [false	,"AND"	,true	,"OR"	,true	,true	],
        [true	,"OR"	,false	,"AND"	,false	,true	],
        [true	,"OR"	,false	,"AND"	,true	,true	],
        [true	,"OR"	,true	,"AND"	,false	,true	],
        [true	,"OR"	,true	,"AND"	,true	,true	],
        [false	,"OR"	,false	,"AND"	,false	,false	],
        [false	,"OR"	,false	,"AND"	,true	,false	],
        [false	,"OR"	,true	,"AND"	,false	,false	],
        [false	,"OR"	,true	,"AND"	,true	,true	],
        [true	,"OR"	,false	,"OR"	,false	,true	],
        [true	,"OR"	,false	,"OR"	,true	,true	],
        [true	,"OR"	,true	,"OR"	,false	,true	],
        [true	,"OR"	,true	,"OR"	,true	,true	],
        [false	,"OR"	,false	,"OR"	,false	,false	],
        [false	,"OR"	,false	,"OR"	,true	,true	],
        [false	,"OR"	,true	,"OR"	,false	,true	],
        [false	,"OR"	,true	,"OR"	,true	,true	]
      ];
      for(var a=0,l=table.length;a<l;a++){
        var R = table[a];
        var result = true;
        for(var r=0,rlen=VARS.length;r<rlen;r++){
          if(VARS[r]!==R[r]) result = false;
        }
        if(result) return R[5];
      }
    },
  // ------------------------------- Formulaire "Actions" -------------------------------
   checkEmergencyStop : function(){
     var EmergencyStop = document.getElementById("EmergencyStop");
     if(!EmergencyStop) return true;
     if(EmergencyStop.style.display == "none"){
       MassEval.functions.alertControl("emergencystop");
       return true;
     }
     var CanContinue = (!$(EmergencyStop).hasClass("Pushed"));
     if(!CanContinue) MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopNeeded, "Stop"); 
     return CanContinue;
   },
    createActionFieldset : function(){
      var Texts = MassEval.texts;
      var LaunchCond = MassEval.params.LaunchCondition;
      var ActionsLI = document.createElement('fieldset');
      ActionsLI.id = "fieldsetActions";
      var ActionsLabel = ActionsLI.appendChild(document.createElement('legend'));
      ActionsLabel.innerHTML = Texts.Actions;
      var ActionsContainer = ActionsLI.appendChild(document.createElement('div'));
      $(ActionsContainer).addClass("FieldsetContent");
      var LeftButtons = ActionsContainer.appendChild(document.createElement('div'));
      LeftButtons.id = "LeftButtons";
      var PortalListInput = LeftButtons.appendChild(MassEval.functions.createInput({type:"button",value:Texts.GoListText,title:Texts.GoVerifCat,id:"GlobalVerifInput"}));
      PortalListInput.style.fontWeight = "bold";
      PortalListInput.onclick = function(){
        var Mode = MassEval.params.CurrentMode;
        var func = MassEval.functions[MassEval.params.ModesMap[Mode].listfunc];
        if(typeof(func)==="function") func({});
      };
      var LinksActions = LeftButtons.appendChild(document.createElement('div'));
      LinksActions.id = "LinksActions";
      var EmergencyStop = LinksActions.appendChild(MassEval.functions.createLink(null,{text:"",href: "javascript:;",title:Texts.EmergencyStop }));
      EmergencyStop.id = "EmergencyStop";
      EmergencyStop.onclick = function(){
        if($(this).hasClass("Pushed")){
          $(this).removeClass("Pushed");
          MassEval.functions.alertControl("emergencystop");
          MassEval.functions.getRelevantModeFieldset(MassEval.params.CurrentMode);
        }else{
          $(this).addClass("Pushed"); 
          MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopNeeded, "Stop");        
        }
        return false;
      }; 
      var AddEvalInput = LinksActions.appendChild(MassEval.functions.createInput({type:"button",value:Texts.GoAddEvalText,title:Texts.GoAddLinks,id:"GlobalAddEvalInput"}));
      if(LaunchCond ===2) AddEvalInput.title = Texts.GoAddCat;
      AddEvalInput.style.fontWeight = "bold";
      AddEvalInput.onclick = function(){
        var AVTSelect = document.getElementById("GlobalAddEvalAVTSelect");
        var IMPSelect = document.getElementById("GlobalAddEvalIMPSelect");
        var Cancel = document.getElementById("GlobalAddEvalCancel");
        if(!AVTSelect || !IMPSelect || !Cancel) return;
        if(AVTSelect.style.display == "none"){
          $(AVTSelect).show("slow");
          $(IMPSelect).show("slow");
          $(Cancel).show("slow");
        }else{
          $(AVTSelect).hide("slow");
          $(IMPSelect).hide("slow");
          $(Cancel).hide("slow");
          var evaltheme = document.getElementById("EvalThemeInput").value;
          var Mode = MassEval.params.CurrentMode;
          var func = MassEval.functions[MassEval.params.ModesMap[Mode].listfunc];
          if(typeof(func)==="function") func({onlymissingeval:true});
        }
      }
      var AddEvalAVTSelect = LinksActions.appendChild(MassEval.functions.createAVTSelect(7, 0, false, true));
      AddEvalAVTSelect.id = "GlobalAddEvalAVTSelect";
      AddEvalAVTSelect.onchange = function(){ MassEval.functions.updateSelectBGcolor(this); }
      AddEvalAVTSelect.title = Texts.AVT;
      var AddEvalIMPSelect = LinksActions.appendChild(MassEval.functions.createIMPSelect(4, "", 0, 0, true));
      AddEvalIMPSelect.id = "GlobalAddEvalIMPSelect";
      AddEvalIMPSelect.onchange = function(){ MassEval.functions.updateSelectBGcolor(this); }
      AddEvalIMPSelect.title = Texts.IMP;
      var AddEvalCancel = LinksActions.appendChild(MassEval.functions.createInput({type:"button",value:Texts.GoAddCancelText,title:Texts.GoAddCancelTip,id:"GlobalAddEvalCancel"}));
      AddEvalCancel.onclick = function(){
        var AVTSelect = document.getElementById("GlobalAddEvalAVTSelect");
        var IMPSelect = document.getElementById("GlobalAddEvalIMPSelect");
        var Cancel = document.getElementById("GlobalAddEvalCancel");
        if(!AVTSelect || !IMPSelect || !Cancel) return;
        $(AVTSelect).hide("slow");
        $(IMPSelect).hide("slow");
        $(Cancel).hide("slow");
      }
      MassEval.functions.displayNodes([AddEvalAVTSelect,AddEvalIMPSelect,AddEvalCancel], false);
      var GlobalChangeInput = LeftButtons.appendChild(MassEval.functions.createInput({type:"button",value:Texts.GoChangeText,title:Texts.GoChangeTitle.split("$1").join(""),id:"GlobalChangeInput"}));
      GlobalChangeInput.onclick = function(){
        MassEval.functions.processTheseLinesChanges();
      }
      if(!MassEval.params.AllowEdition) GlobalChangeInput.style.fontStyle = "italic";
      var GlobalCancelInput = LeftButtons.appendChild(MassEval.functions.createInput({type:"button",value:Texts.GoCancelText,title:Texts.GoCancelTitle.split("$1").join(""),id:"GlobalCancelInput"}));
      GlobalCancelInput.onclick = function(){
        MassEval.functions.cancelAllChanges();
      }
      var ParamsInput = LeftButtons.appendChild(MassEval.functions.createInput({type:"button",value:Texts.GoOptionsText,title:Texts.GoOptionsTitle,id:"GlobalOptionsInput"}));
      MassEval.functions.disableThings([ ParamsInput ], !MassEval.params.OptionsSubPageOK);
      ParamsInput.onclick = function(){
        MassEval.functions.openOptionsForm();
      }
      MassEval.functions.disableThings([ PortalListInput, GlobalChangeInput, GlobalCancelInput ], true);
      var docInput = ActionsContainer.appendChild(MassEval.functions.createInput({type:'button',value:Texts.GoDocText,title:Texts.GoDocTitle,id:"DocInput"}));
      docInput.onclick = function(){
        window.open(MassEval.params.DocURL);
      }
      return ActionsLI;
    },
    createBoardListDiv : function(){
      var T = MassEval.texts;
      var boardListDiv = document.createElement("div");
      boardListDiv.id = "MassEvalBoardListDiv";
      boardListDiv.className = "empty";
      boardListDiv.style.display = "none";
      var boardList = boardListDiv.appendChild(document.createElement("table"));
      boardList.id = "MassEvalBoardList";
      boardList.className = "evaltable centre";
      boardList.width = "100%";
      var TR1 = boardList.appendChild(document.createElement("tr"));
      for(var a=0,l=6;a<l;a++){
        var TH = TR1.appendChild(document.createElement("th"));
        TH.id = "MassEval_TH"+(a+1);
        $(TH).addClass("TH"+(a+1));
        TH.appendChild(document.createTextNode(T[("TH"+a+"text")]));
        var SortLinks = MassEval.functions.createSortLinks(a);
        if(SortLinks) TH.appendChild(SortLinks);        
      }
      if(!MassEval.params.SearchForPortalTag) $(document.body).addClass("hideportals");
      if(MassEval.params.LaunchCondition ===2){
        var bottomlinks = boardListDiv.appendChild(document.createElement("div"));
        bottomlinks.id = "bottomlinks";
        var t = T.bottomlinkstemplate;
        bottomlinks.appendChild(MassEval.functions.createLink(null,{text:t.split("$1").join(T.EvalTheme),    title:" ",href:"#fieldsetEval"}));
        bottomlinks.appendChild(MassEval.functions.createLink(null,{text:t.split("$1").join(T.Modes),        title:" ",href:"#fieldsetModes"}));
        bottomlinks.appendChild(MassEval.functions.createLink(null,{text:t.split("$1").join(T.Search),       title:" ",href:"#fieldsetSearch"}));
        bottomlinks.appendChild(MassEval.functions.createLink(null,{text:t.split("$1").join(T.Actions),      title:" ",href:"#fieldsetActions"}));
        bottomlinks.appendChild(MassEval.functions.createLink(null,{text:t.split("$1").join(T.PageListTable),title:" ",href:"#MassEvalBoardListDiv"}));
      }
      return boardListDiv;
    },
    clearBoardList : function(){      
      var boardList = document.getElementById("MassEvalBoardList");
      var boardListDiv = document.getElementById("MassEvalBoardListDiv");
      if(boardList && boardListDiv){
        while(boardList.getElementsByTagName("tr").length > 1){
          boardList.getElementsByTagName("tr")[1].parentNode.removeChild(boardList.getElementsByTagName("tr")[1]);
          if(boardList.getElementsByTagName("tr").length < 2) break;
        }
        boardListDiv.style.display = "none";
      }
    },
  // ------------------------------- Formulaire "Options de tri" -------------------------------

    createSortLinks : function(thindex){
      var SortOption = MassEval.params.SortOptions[thindex];
      if(typeof(SortOption)==="undefined") return false;
      var Container = document.createElement('div');
      Container.className = "SortLinks";
      var SortTypes = ["UP","DOWN"];
      for(var t=0,tlen=SortTypes.length;t<tlen;t++){
        var SortType = SortTypes[t];
        var Text = MassEval.texts[("Sort"+SortType+"Arrow")];
        var Title = MassEval.texts[(SortOption+SortType)];
        var ThisLink = Container.appendChild(MassEval.functions.createLink(null,{text:Text,title:Title,href:"javascript:;"}));
        ThisLink.className = (SortOption+"_"+SortType);
        ThisLink.onclick = function(){
          MassEval.functions.sortPages(this);
        }
      }
      return Container;
    },
    sortPages : function(Link) {
      var evaltheme = document.getElementById("EvalThemeInput").value;
      if(!evaltheme) return;
      var portaltheme = MassEval.functions.getPortalSelectValue();
      var sortvalue = Link.className;
      var getsortFunc = {
        SortTitle  : function(a,b){ var A = [b[1],a[1]].sort(); return ( A[0] == a[1] ? 1 : -1 ); },
        SortPortal : function(a,b){ return (b[1] - a[1]); },
        SortStub   : function(a,b){ return (b[1] - a[1]); },
        SortAVT    : function(a,b){ return (b[1] - a[1]); },
        SortIMP    : function(a,b){ return (b[1] - a[1]); }
      };
      var getsortParam = {
        SortTitle  : function(p){ return MassEval.functions.deleteAccents(p.title); },
        SortPortal : function(p, a, evaltheme, portaltheme) {
          var count = 0;
          if(p.portals && p.portals.length > 0 ){
            for(var i=0,l=p.portals.length;i<l;i++){
              var portal = p.portals[i];
              count += (portal === portaltheme ? 100 : 1);
            }
          }
          return count;
        },
        SortStub   : function(p){ return (p.stub && p.stub.length > 0 ? p.stub.length : 0); },
        SortAVT    : function(p){ return (typeof(p.evalAVT)=="number" ? (10-p.evalAVT) : -1 ); },
        SortIMP    : function(p, a, evaltheme) {
          var count = 0;
          if(p.allIMP && Object.keys(p.allIMP).length > 0 ){
            for(var theme in p.allIMP){
              count += ( (6-(p.allIMP[theme])) * (6-(p.allIMP[theme])) * (theme === evaltheme ? 100 : 1) );
            }
          }
          return count;
        }
      };
      var down = sortvalue.indexOf("_DOWN")!==-1;
      var type = sortvalue.replace(/_.*/g, "");
      var sortFunc = getsortFunc[type];
      var sortParam = getsortParam[type];
      if(typeof(sortFunc)!=="function" || typeof(sortParam)!=="function") return;
      MassEval.functions.alertControl("sort", MassEval.texts.AlertMsgSort, "Running");
      var NewPageList = [];
      var PageList = MassEval.params.PageList;
      for(var a=0, l=PageList.length;a<l;a++){
        NewPageList.push([ a, sortParam(PageList[a], a, evaltheme, portaltheme) ]);
      }
      NewPageList = NewPageList.sort(sortFunc);
      for(var a=0, l=NewPageList.length;a<l;a++){
        var index = NewPageList[a][0];
        var TR = document.getElementById("IDtr_"+index);
        if(!TR) continue;
      //  TR.title = NewPageList[a][1];
        var target = TR.parentNode;
        target.removeChild(TR);
        if(down) target.appendChild(TR); 
        else target.insertBefore(TR, target.firstChild.nextSibling); 
      }
      MassEval.functions.updateSortLink(Link);
      MassEval.functions.alertControl("sort");
    },
    updateSortLink  : function(Link) {
      var oldLink = document.getElementById("selectedSort");
      if(oldLink) oldLink.removeAttribute("id");
      if(Link) Link.id = "selectedSort";
    },
    createControlElement : function(){
      var ControlElement = document.getElementById("MassEvalControlUL");
        if(!ControlElement){
        ControlElement = document.createElement('ul');
        ControlElement.id = "MassEvalControlUL";
        document.body.appendChild(ControlElement);
        var ControlItem = ControlElement.insertBefore(document.createElement('li'), ControlElement.firstChild);
        ControlItem.className = "MassEvalControlLI";
        ControlItem.id = "MassEvalControlLI_AllOK";
        ControlItem.innerHTML = '<img class="AlertIcon" src="'+MassEval.params.ImageURL + MassEval.params.OKIcon+'" title="'+MassEval.texts.AlertMsgNone+'" />';
      }
      return ControlElement;
    },
    createControlItem : function(id){
      var ControlElement = MassEval.functions.createControlElement();
      var ControlItem = ControlElement.insertBefore(document.createElement('li'), ControlElement.firstChild);
      ControlItem.className = "MassEvalControlLI";
      if(typeof(id)==="string") ControlItem.id = id;
      var ControlItemText = ControlItem.appendChild(document.createElement('span'));
      ControlItemText.className = "MassEvalBoardControlText";
      var ControlItemIcon = ControlItem.appendChild(document.createElement('span'));
      ControlItemIcon.className = "MassEvalBoardControlIcon";
      return {item:ControlItem,text:ControlItemText,icon:ControlItemIcon,OK:document.getElementById("MassEvalControlLI_AllOK")}
    },
    removeControlItem : function(id){
      if(typeof(id)!=="string") return;
      var ControlItem = document.getElementById(id);
      if(ControlItem) ControlItem.parentNode.removeChild(ControlItem);
      var ControlElement = MassEval.functions.createControlElement();
      var RemainingLis = ControlElement.getElementsByTagName("li");
      if(RemainingLis.length === 1) ControlElement.firstChild.style.display = "";
    },
    alertControl : function(id, text, icon){
      MassEval.functions.removeControlItem(id);
      if(typeof(text)=="string"){
        var ControlItem = MassEval.functions.createControlItem(id);
        if(!ControlItem) return;
        var controlText = ControlItem.text;
        var controlIcon = ControlItem.icon;
        var controlOK = ControlItem.OK;
        if(!controlText || !controlIcon || !controlOK) return;
        controlOK.style.display = "none";
        if(icon && MassEval.params[(icon+"Icon")]){
          var link = '<a href="javascript:MassEval.functions.removeControlItem(\''+id+'\');" '+(text ? ('title="'+text+'"') : "")+' >';
          var Icon = '<img class="AlertIcon" src="'+MassEval.params.ImageURL + MassEval.params[(icon+"Icon")]+'" />';
          controlIcon.innerHTML = link + Icon + '</a>';
        }
        controlText.innerHTML = text;
        controlText.style.display = '';
      }
    },
  // ------------------------------- Fonctions pour la création des lignes de tableau -------------------------------
    fillBoardLine : function(index, evaltheme, onlymissingeval){
      var BoardListDiv = document.getElementById("MassEvalBoardListDiv");
      var BoardList = document.getElementById("MassEvalBoardList");
      if(!BoardList || !BoardListDiv) return false;
      if(BoardListDiv.style.display == "none") $(BoardListDiv).slideDown("slow");
      $(BoardListDiv).removeClass("empty");
      var Target = BoardList.getElementsByTagName("tr")[0].parentNode;
      var TR = document.createElement('tr');  
      TR.id = "IDtr_"+index;
      var OldTR = document.getElementById("IDtr_"+index);
      if(OldTR){
        OldTR.parentNode.insertBefore(TR, OldTR);
        OldTR.parentNode.removeChild(OldTR);
      }else{
        Target.appendChild(TR);
      }
      var pagedatas = MassEval.params.PageList[index];
      var title = pagedatas.title;
      var talktitle = pagedatas.talktitle;
      var pagemissing = pagedatas.pagemissing;
      var talkmissing = pagedatas.talkmissing;
      var redirectfrom = pagedatas.redirectfrom;
      var disambig = pagedatas.disambig;
      var portals = pagedatas.portals;
      var stub = pagedatas.stub;
      var evalWT = pagedatas.evalWT;
      var evalAVT = pagedatas.evalAVT;
      var evalIMP = pagedatas.evalIMP;
      var allIMP = pagedatas.allIMP;
      var classes = [];
      if(stub && stub.length > 0) classes.push("stub");
      if(typeof(evalAVT)==="number") classes.push("AVT_"+evalAVT);
      if(typeof(evalIMP)==="number") classes.push("IMP_"+evalIMP);
      if(onlymissingeval) classes.push("Modified");
      TR.className = classes.join(" ");
      var TD1 = document.createElement("td"); // "Page"
      TD1.className = "TD1";
      var TD1Content = TD1.appendChild(document.createElement('div'));
      TD1Content.className = "TD1Content";
      var PageLink = MassEval.functions.createLink((redirectfrom ? redirectfrom : title), {preview:index, class:(redirectfrom ? "mw-redirect" : (pagemissing ? "new" : ""))});
      var TalkPageLink = MassEval.functions.createLink(talktitle, {text:MassEval.texts.TalkText, preview:index, class:(talkmissing ? "new" : "")});
      TD1Content.appendChild(PageLink);
      TD1Content.appendChild(document.createTextNode(" ("));
      TD1Content.appendChild(TalkPageLink);
      TD1Content.appendChild(document.createTextNode(")"));
      if(redirectfrom || disambig) TD1Content.appendChild(document.createTextNode(" — "));
      if(redirectfrom){
        var Rspan = document.createElement('abbr');
        $(Rspan).addClass("pagepropicon");
        var Ricon = '<img class="RedirectIcon" src="'+MassEval.params.ImageURL + MassEval.params.RedirectIcon+'" />';
        Rspan.innerHTML = Ricon;
        Rspan.title = MassEval.texts.RedirectText.split("$page").join(title);
        TD1Content.appendChild(Rspan);
      }
      if(disambig){
        var Dspan = document.createElement('abbr');
        $(Dspan).addClass("pagepropicon");
        Dspan.innerHTML = '<img class="DisambigIcon" src="'+MassEval.params.ImageURL + MassEval.params.DisambigIcon+'" />';
        Dspan.title = MassEval.texts.DisambigTitle;        
        TD1Content.appendChild(Dspan);
      }
      var TD2 = document.createElement("td"); // "Portails"
      TD2.className = "TD2";
      var TD2Content = TD2.appendChild(document.createElement('div'));
      TD2Content.className = "TD2Content";
      if(MassEval.params.SearchForPortalTag && portals && portals.length > 0){
        var PortalUL = TD2Content.appendChild(document.createElement('ul'));
        var SelectedPortal = MassEval.functions.getPortalSelectValue();
        for(var a=0,l=portals.length;a<l;a++){
          var thisportal = portals[a];
          var PortalLabel = document.createElement('li');
          PortalLabel.innerHTML = thisportal;
          if(thisportal === SelectedPortal){
            PortalLabel.style.fontWeight = "bold";
            PortalUL.insertBefore(PortalLabel, PortalUL.firstChild);
          }else{
            PortalUL.appendChild(PortalLabel);
          }
        }
      }else if(!MassEval.params.SearchForPortalTag){
        TD2.style.backgroundColor = "red";
      }
      var TD3 = document.createElement("td"); // "Bandeau d'ébauche"
      TD3.className = "TD3";
      var TD3Content = TD3.appendChild(document.createElement('div'));
      TD3Content.className = "TD3Content";
      if(stub){
        for(var a=0,l=stub.length;a<l;a++){
          TD3Content.appendChild(MassEval.functions.createStubThemeSelect(index, a));
        }
      }
      var AddStubForm = document.createElement('form'); 
      if(stub && stub.length > 5) AddStubForm.style.display = "none";    
      AddStubForm.id = "STUBadd_"+index; 
      var AddStubInput = MassEval.functions.createInput({type:"button",value:MassEval.texts.AddSTUBText,title:MassEval.texts.AddSTUBTitle});
      AddStubInput.onclick = function(){
        MassEval.functions.addOneStubForm(index);
      }
      AddStubForm.appendChild(AddStubInput);
      TD3Content.appendChild(AddStubForm);
      var TD4 = document.createElement("td"); // "Avancement"
      TD4.className = "TD4";
      var TD4Content = TD4.appendChild(document.createElement('div'));
      TD4Content.className = "TD4Content";
      if(typeof(evalAVT)=="number"){
        var AVTselect = TD4Content.appendChild(MassEval.functions.createAVTSelect(evalAVT, index));
        if( ( (stub && stub.length>0) && evalAVT != 5) || ( (!stub || stub.length==0) && evalAVT == 5) ){
          TD3.style.border = "2px solid red";
          TD4.style.border = "2px solid red";
        } 
        if( (disambig && evalAVT != 6) || (!disambig && evalAVT == 6) ){
          TD1.style.border = "2px solid red";
          TD4.style.border = "2px solid red";
        }
      }else{
        var AVTselect = TD4Content.appendChild(MassEval.functions.createAVTSelect(-1, index, true));
      }
      if(onlymissingeval) $(AVTselect).addClass("Modified");
      var TD5 = document.createElement("td"); // "Importances"
      TD5.className = "TD5";
      var TD5Content = TD5.appendChild(document.createElement('div'));
      TD5Content.className = "TD5Content";
      if(typeof(evalIMP)=="number"){
        var IMPselect = TD5Content.appendChild(MassEval.functions.createIMPSelect(evalIMP, evaltheme, index, 0));
        if(onlymissingeval) $(IMPselect).addClass("Modified");
      }
      if(allIMP){
        var count = 1;
        for(var theme in allIMP){
          if(MassEval.functions.ucFirst(theme) == MassEval.functions.ucFirst(evaltheme)) continue;
          var thisimp = allIMP[theme];
          TD5Content.appendChild(MassEval.functions.createIMPSelect(thisimp, theme, index, count));
          count++
        }
      }
      var AddIMPForm = document.createElement('form');   
      AddIMPForm.id = "IMPadd_"+index; 
      var AddIMPInput = MassEval.functions.createInput({type:"button",value:MassEval.texts.AddIMPText,title:MassEval.texts.AddIMPTitle});
      AddIMPInput.onclick = function(){
        MassEval.functions.addOneIMPForm(index);
      }
      AddIMPForm.appendChild(AddIMPInput);
      TD5Content.appendChild(AddIMPForm);
      var TD6 = document.createElement("td"); // "Actions"
      TD6.className = "TD6";
      var TD6Content = TD6.appendChild(document.createElement('div'));
      TD6Content.className = "TD6Content";
      var ChangeInput = MassEval.functions.createInput({type:"button",value:MassEval.texts.GoChangeOneText,title:MassEval.texts.GoChangeOneTitle,id:"change_"+index});
      $(ChangeInput).addClass("changeinput");
      if(!MassEval.params.AllowEdition) ChangeInput.style.fontStyle = "italic";
      ChangeInput.onclick = function(){
        MassEval.functions.processThatLineChanges(index);
      }
      TD6Content.appendChild(ChangeInput);
      var CancelInput = MassEval.functions.createInput({type:"button",value:MassEval.texts.GoCancelOneText,title:MassEval.texts.GoCancelOneTitle,id:"cancel_"+index});
      $(CancelInput).addClass("cancelinput");
      CancelInput.onclick = function(){
          MassEval.functions.updateThatLine(index, pagedatas, true, true);
      }
      TD6Content.appendChild(CancelInput); 
      MassEval.functions.disableThings([ ChangeInput, CancelInput ], (!onlymissingeval));
      var ShowHideInput = MassEval.functions.createInput({type:"button",value:MassEval.texts.GoHideOneText,title:MassEval.texts.GoHideOneTitle,id:"showhide_"+index});
      TD6Content.appendChild(ShowHideInput);
      ShowHideInput.onclick = function(){
        MassEval.functions.showhideThisLineContent(this, index);
      }
      var LinksCheckbox = document.getElementById("LinksCheckbox");
      if([4, 5].indexOf(MassEval.params.LaunchCondition) !== -1 && (!LinksCheckbox || !LinksCheckbox.checked)){
        TD6.style.display = "none";
        MassEval.functions.displayNodes(["MassEval_TH6"], false);
      }else{
        MassEval.functions.displayNodes(["MassEval_TH6"], true);
      }
      TR.appendChild(TD1);
      TR.appendChild(TD2);
      TR.appendChild(TD3);
      TR.appendChild(TD4);
      TR.appendChild(TD5);
      TR.appendChild(TD6);
      if(MassEval.params.AutoLaunchPreview) MassEval.functions.previewPage(title, index);
      return TR;
    },
    showhideThisLineContent(button, index){
      var TR = document.getElementById("IDtr_"+index);
      if(!TR) return;
      var previewbuttons = document.getElementById("previewbuttons_"+index);
      var previewDiv = document.getElementById("previewDiv_"+index);
      var changeBTN = document.getElementById("change_"+index);
      var cancelBTN = document.getElementById("cancel_"+index);
      if(button.value == MassEval.texts.GoHideOneText){
        button.value = MassEval.texts.GoShowOneText;
        button.title = MassEval.texts.GoShowOneTitle;
        if(previewbuttons) $(previewbuttons).slideUp("slow");
        if(previewDiv) $(previewDiv).slideUp("slow");
        if(changeBTN) $(changeBTN).slideUp("slow");
        if(cancelBTN) $(cancelBTN).slideUp("slow");
        $("#"+TR.id+" .TD2Content").slideUp("slow");
        $("#"+TR.id+" .TD3Content").slideUp("slow");
        $("#"+TR.id+" .TD4Content").slideUp("slow");
        $("#"+TR.id+" .TD5Content").slideUp("slow");
        $(TR).addClass("HiddenTR");
      }else{
        button.value = MassEval.texts.GoHideOneText;
        button.title = MassEval.texts.GoHideOneTitle;
        if(previewbuttons) $(previewbuttons).slideDown("slow");
        if(previewDiv) $(previewDiv).slideDown("slow");
        if(changeBTN) $(changeBTN).slideDown("slow");
        if(cancelBTN) $(cancelBTN).slideDown("slow");
        $("#"+TR.id+" .TD2Content").slideDown("slow");
        $("#"+TR.id+" .TD3Content").slideDown("slow");
        $("#"+TR.id+" .TD4Content").slideDown("slow");
        $("#"+TR.id+" .TD5Content").slideDown("slow");
        $(TR).removeClass("HiddenTR");
      }
      MassEval.functions.setChangeCancelInputDisabled();
    },
    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 = MassEval.functions.createInput({type:"hidden",id:"adjHidden_"+count+"_"+index});
        form.appendChild(Hidden);
        var HiddenType = MassEval.functions.createInput({type:"hidden",value:type,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 StubAdj";
        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");
          MassEval.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 = MassEval.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 = MassEval.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 = MassEval.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 = MassEval.params.StubThemes[MassEval.functions.lcFirst(strippedtheme)];
            var realtheme2 = MassEval.params.StubThemes[MassEval.functions.ucFirst(strippedtheme)];
            if(typeof(realtheme1) != "undefined"){
              adjDatas.type = thistype;
              adjDatas.adj = thisadj;
              adjDatas.strippedtheme = MassEval.functions.lcFirst(strippedtheme);
              if(!realtheme1.categ) MassEval.params.StubThemes[MassEval.functions.lcFirst(strippedtheme)].categ = catpattern;
            }else if(typeof(realtheme2) != "undefined"){
              adjDatas.type = thistype;
              adjDatas.adj = thisadj;
              adjDatas.strippedtheme = MassEval.functions.ucFirst(strippedtheme);
              if(!realtheme2.categ) MassEval.params.StubThemes[MassEval.functions.ucFirst(strippedtheme)].categ = catpattern;
            }
          }
        }
      }
      return adjDatas;
    },
    createStubThemeSelect : function(index, count){
      var thisstub = MassEval.params.PageList[index].stub[count];
      var STUBthemeDatas = MassEval.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 = MassEval.functions.createInput({type:"hidden",id:"Ébauche_"+count+"_"+index});
      form.appendChild(Hidden); 
      var Select = document.createElement("select");
      Select.name = "Ébauche_"+count+"_"+index;
      Select.className = "StubTheme";
      Select.onchange = function(){
        MassEval.functions.checkStubFormChanged(this, count, index);
      }
      form.appendChild(Select);
      var allthemes = MassEval.functions.sortTextList(Object.keys(MassEval.params.StubThemes));
      for(var a=0,l=allthemes.length;a<l;a++){
        var thistheme = allthemes[a];
        var themedatas = MassEval.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 || MassEval.functions.getStubAdjType(STUBthemeDatas.strippedtheme));
      form.appendChild(MassEval.functions.updateAdjSelect(type, index, count, STUBthemeDatas.adj));
      var suplink = MassEval.functions.createInput({type:"button",value:MassEval.texts.DeleteSTUBText,title:MassEval.texts.DeleteSTUBTitle});
      suplink.onclick = function(){
        var F = this.parentNode;
        thisSelect = F.getElementsByTagName("select")[0];
        F.style.display = "none";
        $(F).addClass("Removed");
        MassEval.functions.checkStubFormNumbers(index);
        MassEval.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 = MassEval.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 = MassEval.functions.createInput({type:"hidden",value:".",id:"Ébauche NEW_"+count+"_"+index});
      form.appendChild(Hidden);
      var Select = document.createElement("select");
      Select.name = "Ébauche NEW_"+count+"_"+index;
      Select.className = "StubTheme";
      $(Select).addClass("Modified");
      var allthemes = MassEval.functions.sortTextList(Object.keys(MassEval.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(){
        MassEval.functions.checkStubFormChanged(this, count, index);
      }
      form.appendChild(Select);
      form.appendChild(MassEval.functions.updateAdjSelect(null, index, count, ""));
      var suplink = MassEval.functions.createInput({type:"button",value:MassEval.texts.DeleteSTUBText,title:MassEval.texts.DeleteSTUBTitle});
      suplink.onclick = function(){
        var F = this.parentNode;
        F.parentNode.removeChild(F);
        MassEval.functions.checkStubFormNumbers(index);
        MassEval.functions.setChangeCancelOneInputDisabled(index);
      }
      form.appendChild(document.createTextNode(" "));
      form.appendChild(suplink);
      AddStubForm.parentNode.insertBefore(form, AddStubForm);
      MassEval.functions.checkStubFormNumbers(index);
      MassEval.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 = MassEval.functions.getStubAdjType(val);
        if(NewType!=null){
          var paramAdj = MassEval.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");
        MassEval.functions.updateAdjSelect(NewType, index, count, def);
        MassEval.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");
      }
      MassEval.functions.setChangeCancelOneInputDisabled(index);
    },
    createIMPSelect : function(evalIMP, evaltheme, index, count, onlyselect){
      var form = document.createElement("form");
      form.onsubmit = function(){ return false; };
      form.id = "IMPform_"+count+"_"+index;
      form.style.whiteSpace = "nowrap";
      form.className = "Eval";
      var Hidden = MassEval.functions.createInput({type:"hidden",id:"IMP_"+count+"_"+index});
      form.appendChild(Hidden); 
      var Label = document.createElement('label');
      Label.setAttribute("for", "Importance "+evaltheme);
      Label.innerHTML = MassEval.functions.ucFirst(evaltheme);
      if(count==0){
        Label.style.fontWeight = "bold";
        Label.className = "evaltheme";
      }
      form.appendChild(Label);
      form.appendChild(document.createTextNode(" : "));
      var Select = document.createElement("select");
      Select.name = "Importance "+evaltheme;
      Select.className = "Importance";
      for(var a=0,l=MassEval.params.Importance.length;a<l;a++){
        var thisimp = MassEval.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;
        else opt.style.color = "black";
        if(a == evalIMP){
          opt.selected = "selected";
          Hidden.value = opt.value;
        }
        Select.appendChild(opt);
      }
      MassEval.functions.updateSelectBGcolor(Select);
      if(onlyselect) return Select;
      Select.onchange = function(){
        MassEval.functions.updateSelectBGcolor(this);
        MassEval.functions.setChangeCancelOneIMPInputDisabled(this, count, index);
      }
      form.appendChild(Select);
      var suplink = MassEval.functions.createInput({type:"button",value:MassEval.texts.DeleteIMPText,title:MassEval.texts.DeleteIMPTitle});
      suplink.onclick = function(){
        var F = this.parentNode;
        thisSelect = F.getElementsByTagName("select")[0];
        MassEval.functions.disableThings([ thisSelect ], true);
        F.style.display = "none";
        $(F).addClass("Removed");
        MassEval.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");
      MassEval.functions.setChangeCancelOneInputDisabled(index);
    },
    setChangeCancelOneInputDisabled : function(index, data) {
      var TR = document.getElementById("IDtr_"+index);
      if(TR){
        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");
      }
      MassEval.functions.disableThings([ ("change_"+index), ("cancel_"+index) ], dis);
      MassEval.functions.setChangeCancelInputDisabled(data);
    },
    createAVTSelect : function(evalAVT, index, empty, onlyselect){
      var form = document.createElement("form");
      form.onsubmit = function(){ return false; };
      form.style.whiteSpace = "nowrap";
      var Hidden = MassEval.functions.createInput({type:"hidden",id:"AVT_"+index});
      form.appendChild(Hidden); 
      var Select = document.createElement("select");
      Select.name = "Avancement";
      Select.className = "Avancement";
      if(empty){
        var emptyopt = document.createElement('option');
        emptyopt.innerHTML = "";
        emptyopt.value = "?";
        Select.appendChild(emptyopt);
        Hidden.value = "?";
      }
      for(var a=0,l=MassEval.params.Avancement.length;a<l;a++){
        var thisavt = MassEval.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;
        else opt.style.color = "black";
        if(a == evalAVT){
          opt.selected = "selected";
          Hidden.value = a;
        }
        Select.appendChild(opt);
      }
      MassEval.functions.updateSelectBGcolor(Select);
      if(onlyselect) return Select;
      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");
        MassEval.functions.updateSelectBGcolor(this);
        MassEval.functions.setChangeCancelOneInputDisabled(index);
      }
      form.appendChild(Select);      
      return form;
    },
    updateSelectBGcolor : function(Select){
      var val = Select.value;
      var opt = Select.getElementsByTagName('option');
      for(var a=0,l=opt.length;a<l;a++){
        var thisopt = opt[a];
        if(thisopt.value !== val) continue;
        Select.style.backgroundColor = thisopt.style.backgroundColor;
        Select.style.color = thisopt.style.color;
      }
    },
    setChangeCancelInputDisabled : function(data) {
      var BoardList = document.getElementById("MassEvalBoardList");
      var ChangeInput = document.getElementById("GlobalChangeInput");
      var CancelInput = document.getElementById("GlobalCancelInput");
      var ListInput = document.getElementById("GlobalVerifInput");
      var AddInput = document.getElementById("GlobalAddEvalInput");
      if(!BoardList || !ChangeInput || !CancelInput || !ListInput || !AddInput) return;
      var ChangeNumber = 0;
      var TRs = BoardList.getElementsByTagName('tr');
      for(var a=0,l=TRs.length;a<l;a++){
        if($(TRs[a]).hasClass("Modified") && !$(TRs[a]).hasClass("FilteredLine") && !$(TRs[a]).hasClass("HiddenTR")) ChangeNumber++
      }
      if(ChangeNumber > 0){
        ChangeInput.title = MassEval.texts.GoChangeTitle.split("$1").join(ChangeNumber+" ");
        CancelInput.title = MassEval.texts.GoCancelTitle.split("$1").join(ChangeNumber+" ");
        MassEval.functions.disableThings([ ChangeInput, CancelInput ], false);
        if(!data || !(data.afteroptioncheck || data.afteredit) ) MassEval.functions.disableThings([ ListInput, AddInput ], true);
      }else{
        ChangeInput.title = MassEval.texts.GoChangeTitle.split("$1").join("");
        CancelInput.title = MassEval.texts.GoCancelTitle.split("$1").join("");
        MassEval.functions.disableThings([ ChangeInput, CancelInput ], true);
        if(!data || !(data.afteroptioncheck || data.afteredit) ) MassEval.functions.disableThings([ ListInput, AddInput ], false);
      }
      if(data && data.afteredit) MassEval.functions.alertControl("edit");
    },
    cancelAllChanges : function(){
      var BoardList = document.getElementById("MassEvalBoardList");
      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;
        MassEval.functions.updateThatLine(index, MassEval.params.PageList[index], true, true);
      }
    },
    addOneIMPForm : function(index){
      var defaultV = false;
      var defaultP = document.getElementById("EvalThemeInput").value;
      var allIMP = MassEval.params.PageList[index].allIMP;
      var found = false;
      if(typeof(allIMP)=="object"){
        for(var port in allIMP){
          if(port == defaultP) found = true;
        }
      }
      if(!found) defaultV = defaultP;
      var AddIMPForm = document.getElementById("IMPadd_"+index);
      var TD = AddIMPForm.parentNode;
      var count = MassEval.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 = MassEval.functions.createInput({type:"hidden",value:".",id:"IMP_"+count+"_"+index});
      form.appendChild(Hidden); 
      var ThemeSelect = MassEval.functions.createEvalThemeSelect(null,defaultV);
      ThemeSelect.name = "evaltheme";
      ThemeSelect.className = "IMPtheme";
      form.appendChild(ThemeSelect);
      form.appendChild(document.createTextNode(" : "));
      var Select = document.createElement("select");
      Select.name = "Importance NEW";
      Select.className = "Importance";
      for(var a=0,l=MassEval.params.Importance.length;a<l;a++){
        var thisimp = MassEval.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;
        else opt.style.color = "black";
        if(a == (MassEval.params.Importance.length-1)) opt.selected = "selected";
        Select.appendChild(opt);
      }
      MassEval.functions.updateSelectBGcolor(Select);
      Select.onchange = function(){
        MassEval.functions.updateSelectBGcolor(this);
        MassEval.functions.setChangeCancelOneIMPInputDisabled(this, count, index);
      }
      form.appendChild(Select);
      var suplink = MassEval.functions.createInput({type:"button",value:MassEval.texts.DeleteIMPText,title:MassEval.texts.DeleteIMPTitle});
      suplink.onclick = function(){
        var F = this.parentNode;
        F.parentNode.removeChild(F);
        MassEval.functions.setChangeCancelOneInputDisabled(index);
      }
      form.appendChild(document.createTextNode(" "));
      form.appendChild(suplink);
      AddIMPForm.parentNode.insertBefore(form, AddIMPForm);
      MassEval.functions.setChangeCancelOneIMPInputDisabled(Select, count, index);
      ThemeSelect.focus();
    },
  // ------------------------------- Fonctions pour la validation des changements -------------------------------
    processTheseLinesChanges : function(){
      var CancelInput = document.getElementById("GlobalCancelInput");
      var boardList = document.getElementById("MassEvalBoardList");
      MassEval.params.ChangesToMake = [];
      var TRs = boardList.getElementsByTagName("tr");
      for(var a=1,l=TRs.length;a<l;a++){
        var TR = TRs[a];
        if($(TRs[a]).hasClass('FilteredLine') || $(TRs[a]).hasClass('HiddenTR') || !$(TRs[a]).hasClass('Modified')) continue;
        var index = parseInt(TR.id.split("IDtr_").join(""));
        MassEval.params.ChangesToMake.push({id:index,done:false});
      }
      MassEval.functions.processNextLineChanges();
    },
    processNextLineChanges : function(lastindex){
      var ChangesToMake = MassEval.params.ChangesToMake;
      if(typeof(lastindex)==="number"){
        MassEval.functions.checkFilterOptions({afteredit:true});
        MassEval.functions.setChangeCancelOneInputDisabled(lastindex, {afteredit:true});
      }
      var CanContinue = MassEval.functions.checkEmergencyStop();
      if(!CanContinue){
        MassEval.params.ChangesToMake = [];
        MassEval.functions.setChangeCancelInputDisabled();
        MassEval.functions.updateEvalTable(document.getElementById("EvalThemeInput").value);
        return MassEval.functions.alertControl("emergencystop", MassEval.texts.AlertMsgStopDone, "Stop");
      }
      if(MassEval.params.AllowEdition){
        MassEval.functions.disableThings([ "GlobalVerifInput", "GlobalAddEvalInput", "GlobalChangeInput", "GlobalCancelInput"], true);
      }
      var thisChange;
      for(var a=0,l=ChangesToMake.length;a<l;a++){
        thisChange = ChangesToMake[a];
        if(typeof(lastindex)==="number" && thisChange.id === lastindex){
          thisChange.done = true;
          continue;
        }
        if(!thisChange.done){
          if(mw.config.get("wgUserGroups").indexOf("bot")!==-1){
            MassEval.functions.processThatLineChanges(thisChange.id);
          }else{
            setTimeout(function(){ MassEval.functions.processThatLineChanges(thisChange.id); }, MassEval.params.ChangesToMakeDelay);
          }
          return;
        }
      }
      MassEval.params.ChangesToMake = [];
      MassEval.functions.setChangeCancelInputDisabled();
      MassEval.functions.updateEvalTable(document.getElementById("EvalThemeInput").value);
    },
    processThatLineChanges : function(index){
      MassEval.functions.closePreview(index);
      var TR = document.getElementById("IDtr_"+index);
      if(!($(TR).hasClass("Modified"))) return MassEval.functions.processNextLineChanges(index);
      var OldParams = MassEval.params.PageList[index];
      var NewParams = OldParams;
      NewParams.evalAVT = false;
      NewParams.evalIMP = false;
      NewParams.allIMP = {};
      NewParams.evalWT = false;
      NewParams.stub = [];
      NewParams.stubWT = false;
      var ChangeInput = document.getElementById("change_"+index);
      var CancelInput = document.getElementById("cancel_"+index);
      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(MassEval.params.AllowEdition && ["button","text"].indexOf(ThisInput)!=-1) MassEval.functions.disableThings([ ThisInput ], true);
        }
        var Selects = thisForm.getElementsByTagName("select");
        if(MassEval.params.AllowEdition) MassEval.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 = (SelectValue !== "?" ? parseInt(SelectValue) : "?");
          }else if(SelectName == "Importance NEW"){
            var ThemeSelect = Selects[(s-1)];
            var thisevaltheme = ThemeSelect.value;
            if(thisevaltheme != ""){
              talkpageedit = true;
              NewParams.allIMP[thisevaltheme] = parseInt(SelectValue);
              var EvalThemeSelect = document.getElementById("EvalThemeInput");
              if(EvalThemeSelect && EvalThemeSelect.value == thisevaltheme) NewParams.evalIMP = parseInt(SelectValue);
            }
          }else if(SelectName.indexOf("Importance")==0){              
            if($(thisForm).hasClass("Modified")) talkpageedit = true;            
            if($(Label).hasClass("evaltheme")) 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 = MassEval.params.StubThemes[StubTheme];
              var catPattern = StubThemeParams.categ;
              if(catPattern){
                catPattern = MassEval.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 = MassEval.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(MassEval.params.AllowEdition && (talkpageedit || pageedit)){
        var Link = TR.getElementsByTagName('a')[0];
        var IMG = document.createElement('img');
        IMG.width = 14;
        IMG.height = 14;
        IMG.src = MassEval.params.ImageURL + MassEval.params.RunningIcon;
        Link.parentNode.insertBefore(IMG, Link);
        Link.parentNode.insertBefore(document.createTextNode(" "), Link);
      }
      if(talkpageedit){
        NewParams.talkmissing = 0;
        var NewEvalWikitext = "{{"+MassEval.params.EvalTemplate+"\n";
        for(var imp in NewParams.allIMP){
          NewEvalWikitext += "|"+imp+"|"+MassEval.params.Importance[NewParams.allIMP[imp]].wiki+"\n"
        }
        if(NewParams.evalAVT !== "?") NewEvalWikitext += "|avancement="+MassEval.params.Avancement[NewParams.evalAVT].wiki+"\n";
        else NewEvalWikitext += "|avancement=\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";     
          }   
        }
        if(MassEval.params.LaunchCondition === 5 && !OldParams.haseval) NewEvalWikitext += MassEval.params.EvalTemplatNoCat;
        NewEvalWikitext += "}}";
        NewParams.evalWT = NewEvalWikitext;
        if(MassEval.params.AllowEdition){
          MassEval.functions.updatePage(index, OldParams, NewParams, false);
        }else{
          var OldEvalWikitext = ( OldParams.evalWT ? OldParams.evalWT : "");
          alert(MassEval.texts.NoEdition.split("$1").join(OldEvalWikitext).split("$2").join(NewEvalWikitext));
        }
      }
      if(pageedit){
        NewParams.pagemissing = 0;
        var NewStubWikitext = "";
        if(NewParams.stub && NewParams.stub.length > 0 ){
          NewStubWikitext = "{{"+MassEval.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(MassEval.params.AllowEdition){
          MassEval.functions.updatePage(index, OldParams, NewParams, true);
        }else{
          var OldStubWikitext = ( OldParams.stubWT ? OldParams.stubWT : "");
          alert(MassEval.texts.NoEdition.split("$1").join(OldStubWikitext).split("$2").join(NewStubWikitext));
        }
      }
    },
    updatePage : function(index, OldParams, NewParams, main){
      if(main) MassEval.params.StubEditsRunning[index] = true;
      else MassEval.params.EvalEditsRunning[index] = true;  
      var page = (main ? NewParams.title : NewParams.talktitle);
      MassEval.functions.alertControl("edit", MassEval.texts.AlertMsgEdit.split("$page").join(page), "Running");
      $.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 = "now";
          try{ timestamp =  data.query.pages[Object.keys(data.query.pages)[0]].revisions[0].timestamp }catch(e){ }
          var func = (main ? "updateMainPage" : "updateTalkpage");
          var NewWikitext = MassEval.functions[func](OldParams, NewParams, data);
          var summary = MassEval.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) {
            var EditDatas = {
              action: 'edit',
              title: page,
              text: NewWikitext,
              summary: summary.split("$docpage").join(MassEval.params.DocPage).split("$template").join(template),
              basetimestamp: timestamp,
              section: 0,
              watchlist: 'nochange',
              format: 'json',
              token: data.query.tokens.csrftoken
            };
            if(MassEval.params.EditTag && MassEval.params.UserCanTag) EditDatas.tags = MassEval.params.EditTag;
            $.ajax({
              url: mw.util.wikiScript('api'),
              method: 'POST',
              data: EditDatas,
              dataType: 'json',
              success: function(data){
                if(main) MassEval.params.StubEditsRunning[index] = false;
                else MassEval.params.EvalEditsRunning[index] = false;
                if(!MassEval.params.StubEditsRunning[index] && !MassEval.params.EvalEditsRunning[index]){
                  MassEval.functions.updateThatLine(index, NewParams, false, false);
                }
                var ID = false;
                var wgPageName = mw.config.get('wgPageName').split("_").join(" ");
                if(MassEval.params.LaunchCondition === 5 && NewParams.title === wgPageName) ID = (main ? 'ca-nstab-user' : 'ca-talk');
                if(MassEval.params.LaunchCondition === 5 && NewParams.talktitle === wgPageName) ID = (main ? 'ca-nstab-user' : 'ca-talk');
                if(MassEval.params.LaunchCondition === 4 && NewParams.title === mw.config.get('wgTitle')) ID = (main ? 'ca-nstab-main' : 'ca-talk');
                if(ID){
                  var li = document.getElementById(ID);
                  if(li) $(li).removeClass('new');
                }
              }
            });
          });
        }
      });
    },
    updateMainPage : function(OldParams, NewParams, data){
      var OldWikitext = data.query.pages[Object.keys(data.query.pages)[0]].revisions[0]["*"];
      var NewWikitext = "";
      var Reg = new RegExp("\\{\\{ *"+MassEval.params.StubTemplate+"[^\\{]*\\}\\}", "ig");
      var matches = OldWikitext.match(Reg);
      if(matches == null){
        var BeforeStubTemplates = MassEval.params.BeforeStubTemplates;
        var before = "";
        for(var a=0,l=BeforeStubTemplates.length;a<l;a++){
          var DT = BeforeStubTemplates[a];
          var DTReg = new RegExp("\\{\\{ *("+MassEval.functions.ucFirst(DT)+"|"+MassEval.functions.lcFirst(DT)+")[^\\{]*\\}\\}", "g");
          var DTMatches = OldWikitext.match(DTReg);
          if(DTMatches != null){
            for(var m=0,mlen=DTMatches.length;m<mlen;m++){
              var thismatch = DTMatches[m];
              before += thismatch+"\n";
              OldWikitext = OldWikitext.replace(thismatch, "");
            }
          }
        }
        NewWikitext = before + (before ? "\n\n" : "") + 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, "");
      NewWikitext = NewWikitext.split("\n\n\n").join("\n\n");
      return NewWikitext;
    },
    updateTalkpage : function(OldParams, NewParams, data){
      var NewWikitext = "";
      if(OldParams.talkmissing){
        NewWikitext = NewParams.evalWT;
      }else{
        var OldWikitext = "";
        try{ OldWikitext = data.query.pages[Object.keys(data.query.pages)[0]].revisions[0]["*"]; }catch(e){ }
        var Reg = new RegExp("\\{\\{ *"+MassEval.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, CancelAction){
      MassEval.params.PageList[index] = NewParams;
      if(!KeepPreview){
        delete MassEval.params.PreviewSaved[NewParams.title];
        delete MassEval.params.PreviewSaved[NewParams.talktitle];
      }
      var evaltheme = document.getElementById("EvalThemeInput").value;
      MassEval.functions.fillBoardLine(index, evaltheme);
      if(!CancelAction) MassEval.functions.processNextLineChanges(index);
      else MassEval.functions.setChangeCancelInputDisabled();
    },
  // ------------------------------- Fonctions pour la prévisualisation -------------------------------
    preloadPage : function(title, index, callback){
      var previewDiv = document.createElement('div');
      previewDiv.id = "previewDiv_"+index;
      $(previewDiv).addClass("previewDiv");
      var URL = mw.util.getUrl(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 = MassEval.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);
        MassEval.functions.neutralizeLinks(previewDiv);
        MassEval.functions.enhancePreview(previewDiv);
        MassEval.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).addClass("previewDiv");
        previewDiv.style.display = "none";    
        TD1.appendChild(previewDiv);
        $(previewDiv).slideDown("slow");    
        var closespan = document.createElement('span');
        closespan.id = "previewbuttons_"+index;
        $(closespan).addClass("previewButtons");
        TD1.insertBefore(closespan, TD1.firstChild);
        var closelink = document.createElement('a');
        closelink.title = MassEval.texts.PreviewClose;
        closelink.innerHTML = '<img class="previewCloseButtonImage PrevCloseIcon" src="'+MassEval.params.ImageURL + MassEval.params.CloseIcon+'" />';
        closelink.href = "javascript:;";
        closelink.onclick = function(){ MassEval.functions.closePreview(index); return false; }
        closespan.appendChild(closelink);
      }
      $(previewDiv).addClass("previewDiv");
      if(MassEval.params.PreviewSaved[title]){
        var SavedpreviewDiv = MassEval.params.PreviewSaved[title];
        previewDiv.parentNode.insertBefore(SavedpreviewDiv, previewDiv);
        previewDiv.parentNode.removeChild(previewDiv);
        $(SavedpreviewDiv).slideDown("slow");   
      }else{
        var RunningIcon = '<img class="RunningIcon" src="'+MassEval.params.ImageURL + MassEval.params.RunningIcon+'" />';
        previewDiv.innerHTML = MassEval.texts.AlertMsgPreview.split("$running").join(RunningIcon);
        MassEval.functions.preloadPage(title, index, MassEval.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;
      console.warn(oldval + " -> " + newval);
      previewDiv.style.maxHeight = newval + "px";
    },
    closePreview : function(index, link){
      var previewDiv = document.getElementById("previewDiv_"+index);
      if(previewDiv){
        $(previewDiv).slideUp("slow", function(){
          this.parentNode.removeChild(this);
          var link = document.getElementById("previewbuttons_"+index);
          if(link) link.parentNode.removeChild(link);
        });  
      }   
    },
  // ------------------------------- Fonctions spéciales utiles seulement au développeur -------------------------------
    addDeveloperLinks : function(){
      var newli = document.getElementById("ca-eval");
      if(!newli){
        var portlet = document.getElementById(MassEval.params.LinkPortletID);
        if(!portlet) return;
        var tabs = portlet.getElementsByTagName('li')[0];
        newli = tabs.parentNode.appendChild(document.createElement('li'));
      }
      //newli.appendChild(MassEval.functions.createLink(null,{text:"[UUT]",href: "javascript:MassEval.functions.getUnusedTexts();",title:"Textes inutilisés"}));
    },
  // ------------------------------- Fonctions pour les liens en haut de page -------------------------------
    addPageLink : function() {
      var portlet = document.getElementById(MassEval.params.LinkPortletID);
      if(!portlet) return;
      var tabs = portlet.getElementsByTagName('li')[0];
      var newli = document.createElement('li');
      newli.id = 'ca-eval';
      tabs.parentNode.appendChild(newli);
      if(MassEval.params.UseTopFormInNS0){
        var link = newli.appendChild(MassEval.functions.createLink(null, {
          text  : MassEval.texts.LinkText,
          title : MassEval.texts.LinkPageTitle,
          href  : "javascript:MassEval.functions.createPageBoard();" 
        }));
      }else{
        var page = "Special:"+MassEval.params.SpecialpageName+"/mode=page/" + mw.config.get( (MassEval.params.LaunchCondition != 5 ? 'wgTitle' : "wgPageName") ).split("_").join(" ");
        var link = newli.appendChild(MassEval.functions.createLink(page, {
          text  : MassEval.texts.LinkText,
          title : MassEval.texts.LinkPageTitle,
        }));
      }
      if(MassEval.params.AddDeveloperLinks) MassEval.functions.addDeveloperLinks();
    },
    addCategoryLink : function() {
      var portlet = document.getElementById(MassEval.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 Slink = newli.appendChild(MassEval.functions.createLink("Special:"+MassEval.params.SpecialpageName+"/mode=cat/"+mw.config.get('wgTitle'), {
        text  : MassEval.texts.LinkText,
        title : MassEval.texts.LinkCatTitle,
      }));
      if(MassEval.params.AddDeveloperLinks) MassEval.functions.addDeveloperLinks();
    },
    addTemplateLink : function() {
      var portlet = document.getElementById(MassEval.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 Slink = newli.appendChild(MassEval.functions.createLink("Special:"+MassEval.params.SpecialpageName+"/mode=template/"+mw.config.get('wgTitle'), {
        text  : MassEval.texts.LinkText,
        title : MassEval.texts.LinkTemplateTitle,
      }));
      if(MassEval.params.AddDeveloperLinks) MassEval.functions.addDeveloperLinks();
    },
    addUserLink : function() {
      var portlet = document.getElementById(MassEval.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 User = mw.config.get('wgTitle').split("/")[0];
      var Slink = newli.appendChild(MassEval.functions.createLink("Special:"+MassEval.params.SpecialpageName+"/mode=creations/"+User, {
        text  : MassEval.texts.LinkText,
        title : MassEval.texts.LinkCreationsTitle,
      }));
      if(MassEval.params.AddDeveloperLinks) MassEval.functions.addDeveloperLinks();
    },
    addNewpagesLink : function(){
      var LI = document.getElementById("ca-nstab-special");
      if(!LI) return;
      var evalli = LI.parentNode.appendChild(document.createElement('li'));
      evalli.id = "ca-nstab-special-eval";
      var evalspan = evalli.appendChild(document.createElement('span'));
      var evallink = evalspan.appendChild(MassEval.functions.createLink("Special:"+MassEval.params.SpecialpageName+"/mode=newpages/"+mw.config.get('wgTitle'), {
        text  : MassEval.texts.LinkText,
        title : MassEval.texts.LinkNewpagesTitle,
      }));
    },
    addCreationsLink : function(){
      var LI = document.getElementById("ca-nstab-special");
      if(!LI) return;
      var evalli = LI.parentNode.appendChild(document.createElement('li'));
      evalli.id = "ca-nstab-special-eval";
      var evalspan = evalli.appendChild(document.createElement('span'));
      var target = mw.util.getParamValue("target");
      if(target === null) target = mw.config.get('wgTitle').split("Contributions/")[1];
      if(!target) target = mw.config.get('wgUserName');
      var evallink = evalspan.appendChild(MassEval.functions.createLink("Special:"+MassEval.params.SpecialpageName+"/mode=creations/"+target, {
        text  : MassEval.texts.LinkText,
        title : MassEval.texts.LinkCreationsTitle,
      }));
    },
    addLinkshereLink : function(){
      var portlet = document.getElementById(MassEval.params.LinkPortletID);
      if(!portlet) return;
      var tabs = portlet.getElementsByTagName('li')[0];
      var evalli = tabs.parentNode.appendChild(document.createElement('li'));
      evalli.id = "ca-eval";
      var evalspan = evalli.appendChild(document.createElement('span'));
      var target = mw.util.getParamValue("target");
      var evallink = evalspan.appendChild(MassEval.functions.createLink("Special:"+MassEval.params.SpecialpageName+"/mode=linkshere/"+target, {
        text  : MassEval.texts.LinkText,
        title : MassEval.texts.LinkLinkshereTitle,
      }));
    },
    addPrefixindexLink : function(){
      var portlet = document.getElementById(MassEval.params.LinkPortletID);
      if(!portlet) return;
      var tabs = portlet.getElementsByTagName('li')[0];
      var evalli = tabs.parentNode.appendChild(document.createElement('li'));
      evalli.id = "ca-eval";
      var evalspan = evalli.appendChild(document.createElement('span'));
      var prefix = mw.util.getParamValue("prefix");
      var evallink = evalspan.appendChild(MassEval.functions.createLink("Special:"+MassEval.params.SpecialpageName+"/mode=prefixes/"+prefix, {
        text  : MassEval.texts.LinkText,
        title : MassEval.texts.LinkPrefixindexTitle,
      }));
    },
    addlinktoSpecialpage : function(){
      var Content = document.getElementById('mw-content-text');
      var Divs = Content.getElementsByTagName('div');
      var count = 0;
      var H2s = Content.getElementsByTagName('h2');
      for(var a=0,l=H2s.length;a<l;a++){
        var id = H2s[a].id;
        if(id == "mw-specialpagesgroup-pagetools") count = a;
      }
      var divcount = -1;
      for(var a=0,l=Divs.length;a<l;a++){
        var Div = Divs[a];
        if(!$(Div).hasClass("mw-specialpages-list")) continue;
        divcount++
        if(divcount != count) continue;
        var UL = Div.getElementsByTagName('ul')[0];
        if(!UL) continue;
        var LI = document.createElement('li');
        UL.appendChild(LI);
        LI.appendChild(MassEval.functions.createLink(mw.config.get('wgFormattedNamespaces')[-1]+":"+MassEval.params.SpecialpageName,{text:MassEval.texts.SpecialpageName}));
      }
    },
    toggleTabsInSpecialpage : function(link){
      var LI = link.parentNode.parentNode;
      if($(LI).hasClass("selected")) return;
      var Parent = LI.parentNode;
      var AllLIs = Parent.getElementsByTagName('li');
      for(var a=0,l=AllLIs.length;a<l;a++){
        var thisLI = AllLIs[a];
        if(thisLI !== LI) $(thisLI).removeClass("selected");
        else $(thisLI).addClass("selected");
      }
      if(LI.id == "ca-nstab-special-options"){
        if( !MassEval.params.EvalThemesOK || !MassEval.params.OptionsSubPageOK ) return;
        MassEval.functions.openOptionsForm();
        MassEval.functions.displayNodes(["MassEvalBoardHead","MassEvalBoardListDiv"], false);
        MassEval.functions.closeDatasForm();
      }else if(LI.id == "ca-nstab-special-datas"){
        if(!MassEval.params.StubThemesOK || !MassEval.params.EvalThemesOK || !MassEval.params.BeforeStubTemplatesOK) return;
        MassEval.functions.openDatasForm();
        MassEval.functions.closeOptionsForm();
        MassEval.functions.displayNodes(["MassEvalBoardHead","MassEvalBoardListDiv"], false);
      }else{
        MassEval.functions.displayNodes(["MassEvalBoardHead","MassEvalBoardListDiv"], true);
        var MassEvalBoardListDiv = document.getElementById("MassEvalBoardListDiv");
        if(MassEvalBoardListDiv && $(MassEvalBoardListDiv).hasClass("empty")) MassEvalBoardListDiv.style.display = "none";
        MassEval.functions.closeOptionsForm();
        MassEval.functions.closeDatasForm(); 
      }
    },
    addOptionLinkInSpecialpage : function(){
      var SpecialLI = document.getElementById("ca-nstab-special");
      if(SpecialLI){
        var SpecialLink = SpecialLI.getElementsByTagName('a')[0];
        if(SpecialLink){
          if(SpecialLink.parentNode.tagName.toLowerCase() != "span"){
            var specialspan = SpecialLink.parentNode.appendChild(document.createElement('span'));
            specialspan.appendChild(SpecialLink);
          }
          var optionsli = SpecialLI.parentNode.appendChild(document.createElement('li'));
          optionsli.id = "ca-nstab-special-options";
          var optionsspan = optionsli.appendChild(document.createElement('span'));
          var optionslink = optionsspan.appendChild(document.createElement('a'));
          optionslink.innerHTML = MassEval.texts.GoOptionsText;
          optionslink.title = MassEval.texts.GoOptionsTitle;
          optionslink.href = "javascript:;";
          optionslink.id = "optionlinkintab";
          var datasli = SpecialLI.parentNode.appendChild(document.createElement('li'));
          datasli.id = "ca-nstab-special-datas";
          var datasspan = datasli.appendChild(document.createElement('span'));
          var dataslink = datasspan.appendChild(document.createElement('a'));
          dataslink.innerHTML = MassEval.texts.GoDatasText;
          dataslink.title = MassEval.texts.GoDatasTitle;
          dataslink.href = "javascript:;";
          dataslink.id = "datalinkintab";
          dataslink.onclick = function(){ MassEval.functions.toggleTabsInSpecialpage(this); return false; }
          if(!MassEval.params.StubThemesOK || !MassEval.params.EvalThemesOK || !MassEval.params.BeforeStubTemplatesOK)
            $(dataslink).addClass("disableddatlink");
          optionslink.onclick = function(){ MassEval.functions.toggleTabsInSpecialpage(this); return false; }
          SpecialLink.onclick = function(){ MassEval.functions.toggleTabsInSpecialpage(this); return false; }
          if( !MassEval.params.EvalThemesOK || !MassEval.params.OptionsSubPageOK )
            $(optionslink).addClass("disabledoptionlink");
          MassEval.params.SpecialOptionLinkOK = true;
        }    
      }
    },
  // ------------------------------- Fonctions pour le lancement -------------------------------
    launch : function() {
      var LaunchCond = MassEval.params.LaunchCondition;
      var Scripts = [];
      var sustomPage = mw.config.get('wgFormattedNamespaces')[2]+':'+mw.config.get('wgUserName')+MassEval.params.OptionsSubPage;
      var customURL = mw.util.getUrl(sustomPage, {'action':'raw','ctype':'text/javascript'});
      Scripts.push(customURL);
      var ColorPickerJS  = 'https://meta.wikimedia.org/w/index.php?title=User:OldBee/ColorPicker.js&action=raw&ctype=text/javascript';
      var ColorPickerCSS = 'https://meta.wikimedia.org/w/index.php?title=User:OldBee/ColorPicker.css&action=raw&ctype=text/css';
      var ClockPickerJS = 'https://meta.wikimedia.org/w/index.php?title=User:OldBee/ClockPicker.js&action=raw&ctype=text/javascript';
      var ClockPickerCSS = 'https://meta.wikimedia.org/w/index.php?title=User:OldBee/ClockPicker.css&action=raw&ctype=text/css';
      var DatePickerJS = 'https://meta.wikimedia.org/w/index.php?title=User:OldBee/DatePicker.js&action=raw&ctype=text/javascript';
      var DatePickerCSS = 'https://meta.wikimedia.org/w/index.php?title=User:OldBee/DatePicker.css&action=raw&ctype=text/css';
      if(LaunchCond === 2){
        mw.loader.load(ColorPickerCSS, 'text/css');
        Scripts.push(ColorPickerJS);
        mw.loader.load(ClockPickerCSS, 'text/css');
        Scripts.push(ClockPickerJS);
        mw.loader.load(DatePickerCSS, 'text/css');
        Scripts.push(DatePickerJS);
      } 
      $.when.apply( null, $.map(Scripts, function ( url ) {
        return $.ajax({ url: url, dataType: 'script', cache: true });
      })).done(function(){
        MassEval.functions.setDefaultParams();
        MassEval.functions.getCustomParams();
        var LaunchThis = MassEval.params.LaunchCondition;
        if([2,4,5].indexOf(LaunchThis)!==-1) MassEval.functions.setCSSstyles();
        if(LaunchThis === 1) MassEval.functions.addCategoryLink();
        if(LaunchThis === 2) MassEval.functions.prepareSpecialpage();
        if(LaunchThis === 3) MassEval.functions.addlinktoSpecialpage();
        if(LaunchThis === 4) MassEval.functions.addPageLink();
        if(LaunchThis === 5) MassEval.functions.addPageLink();
        if(LaunchThis === 6) MassEval.functions.addUserLink();
        if(LaunchThis === 7) MassEval.functions.addTemplateLink();
        if(LaunchThis === 10) MassEval.functions.addNewpagesLink();
        if(LaunchThis === 11) MassEval.functions.addCreationsLink();
        if(LaunchThis === 12) MassEval.functions.addLinkshereLink();
        if(LaunchThis === 13) MassEval.functions.addPrefixindexLink();
      }); 
    },
    getLaunchCondition : function() { 
      if(mw.config.get('wgServer') !== '//fr.wikipedia.org') return false;
      var wgTitle = mw.config.get('wgTitle');
      var wgAction = mw.config.get('wgAction');
      var wgNamespaceNumber = mw.config.get('wgNamespaceNumber');
      var wgCanonicalSpecialPageName = mw.config.get('wgCanonicalSpecialPageName');
      var wgUserName = mw.config.get('wgUserName');
      var LaunchCondition = false;
      if(wgNamespaceNumber == 14 && ["edit","submit"].indexOf(wgAction) == -1) LaunchCondition = 1;
      if(wgNamespaceNumber == -1 && (wgTitle == MassEval.params.SpecialpageName || wgTitle.indexOf(MassEval.params.SpecialpageName+"/") != -1)) LaunchCondition = 2;
      if(wgCanonicalSpecialPageName == "Specialpages") LaunchCondition = 3;
      if([0,1].indexOf(wgNamespaceNumber) != -1 && ["edit","submit"].indexOf(wgAction) == -1) LaunchCondition = 4;
      if([0,1].indexOf(wgNamespaceNumber) != -1 && wgAction == "edit" && document.URL.indexOf("redlink=1") != -1) LaunchCondition = 4;
      if([2,3].indexOf(wgNamespaceNumber) != -1 && wgTitle === wgUserName+MassEval.params.TestPage && ["edit","submit"].indexOf(wgAction) === -1) LaunchCondition = 5;
      if([2,3].indexOf(wgNamespaceNumber) != -1 && wgTitle !== wgUserName+MassEval.params.TestPage && ["edit","submit"].indexOf(wgAction) === -1) LaunchCondition = 6;
      if(wgNamespaceNumber == 10 && ["edit","submit"].indexOf(wgAction) === -1) LaunchCondition = 7;
      if(["Newpages","Recentchanges"].indexOf(wgCanonicalSpecialPageName) !== -1 ) LaunchCondition = 10;
      if(["Contributions"].indexOf(wgCanonicalSpecialPageName) !== -1 ) LaunchCondition = 11;
      if(["Whatlinkshere"].indexOf(wgCanonicalSpecialPageName) !== -1 ) LaunchCondition = 12;
      if(["Prefixindex"].indexOf(wgCanonicalSpecialPageName) !== -1 ) LaunchCondition = 13;

      MassEval.params.LaunchCondition = LaunchCondition;
      console.info("MassEval launch condition = "+LaunchCondition);
      return LaunchCondition;    
    },
  // ------------------------------- Styles CSS -------------------------------
    getCSSstyle : function(stylename) { 
      if(typeof(MassEval.params.DEFAULTstyles[stylename])==="undefined") return "";
      if(typeof(MassEval.styles[stylename])==="undefined") return "";
      return MassEval.styles[stylename];
    },
    setCSSstyles : function() { 
      var getS = MassEval.functions.getCSSstyle;
      if(MassEval.params.ActualStyleTag){
        MassEval.params.ActualStyleTag.parentNode.removeChild(MassEval.params.ActualStyleTag);
      }
      var NewStyles = ""

// Général --------------------------------------------------------


 // Partout 

      + "#MassEvalBoard  input[type=text], #MassEvalBoard  input[type=time]   { background-color:"+getS('ImpTexbgc')+";border:1px solid "+getS('Mainbdc')+";border-radius:"+getS('ImpTexbdr')+";border-bottom-width:2px;border-right-width:2px; }"
      + "#MassEvalBoard  select { background-color:"+getS('ImpTexbgc')+";border:1px solid "+getS('Mainbdc')+";border-radius:"+getS('Selectbdr')+";border-bottom-width:2px;border-right-width:2px; }"
      + "#MassEvalBoard  input[type=button] { background-color:"+getS('ImpButbgc')+";border-radius:"+getS('ImpButbdr')+";border: 1px "+getS('Mainbds')+" "+getS('Mainbdc')+";border-bottom-width:2px;border-right-width:2px; }"
      + "#MassEvalBoard  textarea { background-color:"+getS('ImpTexbgc')+";border-radius:"+getS('ImpTexbdr')+";border: 1px "+getS('Mainbds')+" "+getS('Mainbdc')+";border-bottom-width:2px;border-right-width:2px; }"
      + "#MassEvalBoard  input[type=button][disabled]  { background-color:"+getS('ImpButDisbgc')+"; }"
      + "#MassEvalBoard  input[type=text][disabled],#MassEvalBoard  input[type=time][disabled]  { background-color:"+getS('ImpTexDisbgc')+"; }"
      + "#MassEvalBoard  select[disabled], #MassEvalBoard  textarea[disabled]  { background-color:"+getS('ImpTexDisbgc')+";cursor:not-allowed !important; }"
      + "#MassEvalBoard select, #MassEvalBoard input[type=button], #MassEvalBoard input[type=checkbox], #MassEvalBoard input[type=radio] { cursor:pointer !important; }"
      + "#MassEvalBoard input[type=button]:disabled { cursor:not-allowed !important; }"
      + "a.disabledoptionlink, a.disableddatlink { color:DimGray !important;cursor:not-allowed !important; }"
      + ".showhideConfigForm { margin-left:0.5em; }"
      + "table.centre { margin: 1em auto; }"
      + "#MassEvalBoardHead a, #MassEvalBoardHead a *, #fieldsetOptions a, #fieldsetOptions a *, .TD1Content a, .TD1Content a * { color:"+getS('Linkscol')+"; }"
      + "#MassEvalBoardHead a.new, #MassEvalBoardHead a.new *, #fieldsetOptions a.new, #fieldsetOptions a.new *, .TD1Content a.new, .TD1Content a.new * { color:red; }"
      + "#MassEvalBoardHead a.mw-redirect, .TD1Content a.mw-redirect { green !important }"
      + "#MassEvalBoardHead abbr, #fieldsetOptions abbr, .TD1Content abbr { text-decoration:none !important; }"
      + "#MassEvalBoardHead, #fieldsetOptions, .TD1Content, .TD2, .TD3, .TD4, .TD5, .TD6, #MassEvalBoard input, #MassEvalBoard select { font-size:"+getS('Mainfs')+"; }"
      + "#MassEvalBoardHead, #fieldsetOptions, .TD1Content, .TD2, .TD3, .TD4, .TD5, .TD6, #MassEvalBoard input, #MassEvalBoard select { font-family:"+getS('Mainff')+"; }"

 // Page spéciale

      + ".ns--1 #MassEvalBoard legend, #fieldsetOptionsContainer legend, #fieldsetSearchContainer legend { padding:0.25em;margin-left:1.5em; }"
      + ".ns--1 #MassEvalBoard fieldset { border-radius:"+getS('BigFSbdr')+"; }"
      + ".ns--1 #MassEvalBoard fieldset { border:1px "+getS('Mainbds')+" "+getS('Mainbdc')+";background-color:"+getS('BigFSbgc')+";border-bottom-width:2px;border-right-width:2px; }"
      + ".ns--1 #MassEvalBoardHead { padding:0 1em;padding-bottom:1em;margin:0;margin-bottom:1em; }"
      + ".ns--1 #MassEvalBoardHead fieldset { margin: 0 0 0.5em 0;padding:0 0.5em;padding-top:0; }"
      + ".TDSelector, .TDInfos { border-right:1px "+getS('Innerbds')+" "+getS('Linesbdc')+"; }"

 // Hors page spéciale

      + ".ns-0 #MassEvalBoard, .ns-1 #MassEvalBoard, .ns-2 #MassEvalBoard, .ns-3 #MassEvalBoard { background-color:"+getS('Mainbgc')+";border:1px "+getS('Wrapperbds')+" "+getS('Wrapperbdc')+";margin-bottom:1em;padding:0.5em;border-radius:"+getS('Wrapperbdr')+";border-bottom-width:2px;border-right-width:2px; }"
      + "#MassEvalMainOptionsFS { padding: 0;margin:0;display:-webkit-flex;display: flex;justify-content:center;align-items:center;flex-wrap: wrap;width:100%;text-align:center; }"
      + "#MassEvalMainOptionsFS legend {  padding:0 0.125em;margin:0 0 0 1em; }"
      + "#MassEvalMainOptionsFS fieldset { display:inline;margin:0 1em 0.5em 1em;padding:0.2em;background-color:"+getS('SmallFSbgc')+";border:1px "+getS('Mainbds')+" "+getS('Mainbdc')+";border-radius:"+getS('SmallFSbdr')+";border-bottom-width:2px;border-right-width:2px; }"
      + "#MassEvalBoardHead *, #fieldsetOptions *, .TH1, .TH2, .TH3, .TH4, .TH5, .TH6, .TD1Content *, .TD2 *, .TD3 *, .TD4 *, .TD5 *, .TD6 * { color:"+getS('Maincol')+"; }"
      + "#CloseButton {float:right;margin-bottom:-50px; }"
      + "#CloseButtonImage { border-radius: 0.5em;box-shadow: 2px 2px 5px DimGray; }"

// Images

      + ".EvalTableIcon    { width:"+getS('EvalTableIcowidth')+"; }"
      + ".RunningIcon      { width:"+getS('RunIcowidth'      )+"; }"
      + ".PrevCloseIcon    { width:"+getS('PrevCloseIcowidth')+"; }"
      + ".RedirectIcon     { width:"+getS('RedirectIcowidth' )+"; }"
      + ".DisambigIcon     { width:"+getS('DisambigIcowidth' )+"; }"
      + ".HiddenCatIcon    { width:"+getS('HiddenCatIcowidth')+"; }"
      + ".AlertIcon        { width:"+getS('AlertIcowidth'    )+"; }"
      + ".MainCloseIcon    { width:"+getS('MainCloseIcowidth')+"; }"

// Formulaire Thème d'évaluation --------------------------------------------------------

      + "#EvalThemeInput, #PortalInput { width:"+getS('MainEvalTwidth')+"; }"
      + "#EvalThemeTD { text-align:left; }"
      + ".ns--1 #EvalThemeInput { width:"+getS('SpeImpCatwdth')+"; }"
      + ".ns--1 #PortalInput { width:"+getS('SpeImpCatwdth')+"; }"
      + ".ns--1 #MassEvalBoard .NoBorderFieldset {border:none;background-color:transparent;margin:0;padding:0; }"
      + ".ns--1 #MassEvalBoard .NoBorderFieldset legend { display: block;width:150px;margin: auto;text-align: center; }"

      + "#ThemeCatsTD { text-align:center; }"
      + "#ThemeCats { margin-bottom:0.5em; }"
      + "#ThemeCats td { text-align:center;font-weight: bold;white-space:nowrap;background-color:"+getS('Linesbgc')+"; }"
      + "#EvalTable_AVT td:first-of-type, #EvalTable_IMP td:first-of-type { border:none; }"

      + "#EvalTable {  }"
      + "#EvalTableUpdateTD {  }"
      + "#EvalTable_IMP, #EvalTable_AVT, #ThemeCats { border:1px "+getS('Mainbds')+" "+getS('Mainbdc')+";border-bottom-width:2px;border-right-width:2px;border-radius:"+getS('EvalTbdr')+"; }"

      + ".EvalTableFirstTH { border-top-left-radius:"+getS('EvalTbdr')+"; }"
      + ".EvalTableLastTH { border-top-right-radius:"+getS('EvalTbdr')+"; }"

      + "#EvalTable table, .evaltable { border-spacing:0; }"
      + "#EvalTable caption { font-weight:bold; }"
      + "#EvalTable_IMP th, #EvalTable_AVT th { background-color:"+getS('THListbgc')+";border-left:1px "+getS('Mainbds')+" "+getS('THListbdc')+"; }"
      + "#EvalTable_IMP td, #EvalTable_AVT td { background-color:"+getS('Linesbgc')+";border-left:1px "+getS('Mainbds')+" "+getS('Linesbdc')+";border-top:1px "+getS('Mainbds')+" "+getS('Linesbdc')+"; }"
      + "#EvalTable_AVT th:first-of-type, #EvalTable_IMP th:first-of-type { background-color:"+getS('THListbgc')+";border:none; }"
      + "#EvalTable_AVT td:first-of-type, #EvalTable_IMP td:first-of-type { background-color:"+getS('Linesbgc')+";border:none;border-top:1px "+getS('Mainbds')+" "+getS('THListbdc')+"; }"
      + ".hideportals #PortalInput, .hideportals #PortalInputfieldset, .ns--1.hideportals #EvalThemeInputfieldset legend { display:none; }"

// Formulaire Modes --------------------------------------------------------

      + "#fieldsetModes { padding-bottom:0 !important; }"
      + "#fieldsetModes fieldset { padding:0.25em !important; }"
      + "#fieldsetModes fieldset legend { display:none; }"
      + "#fieldsetModes form:first-of-type { text-align:center;margin:0 0 1em 0;}"
      + "#fieldsetModes form:first-of-type input[type='button'] { padding: 0.5em 1em;text-align: center;width:"+getS('ModSelwidth')+";white-space: nowrap;border: 1px "+getS('Mainbds')+" "+getS('Mainbdc')+";border-radius:0;border-left:none;background-color:"+getS('ModSelbgc')+";border-bottom-width:2px;border-right-width:2px; }"
      + "#fieldsetModes form:first-of-type input[type='button']:first-of-type { border-left: 1px "+getS('Mainbds')+" "+getS('Mainbdc')+";border-top-left-radius:"+getS('ModSelbdr')+";border-bottom-left-radius:"+getS('ModSelbdr')+"; }"
      + "#fieldsetModes form:first-of-type input[type='button']:last-of-type { border-top-right-radius:"+getS('ModSelbdr')+";border-bottom-right-radius:"+getS('ModSelbdr')+"; }"
      + "#fieldsetModes form:first-of-type input[type='button']:hover { background-color:"+getS('HoverModSelbgc')+"; }"
      + "#fieldsetModes form:first-of-type input.modeselected { background-color:"+getS('ModSelCurrbgc')+"; }"
      + "#fieldsetModes form:first-of-type input.modeselected:hover { background-color:"+getS('HoverModSelCurrbgc')+"; }"

      + "p.InfosP { margin:0 0.5em 0 0.5em;text-align:center;border-bottom: 1px "+getS('Innerbds')+" "+getS('Mainbdc')+";font-weight: bold; }"

      + "#CatParentsDiv, #CatDaughtersDiv, .PageInfosDiv { height:"+getS('CatListhght')+";overflow-y:scroll; }"
      + ".TDInfos { border-top:1px "+getS('Innerbds')+" "+getS('Mainbdc')+";padding-left: 0.5em; }"
      + ".pagenoexists b { color:red !important; }"
      + ".pagenoexists b * { color:red !important; }"
      + ".pagenoexists li { visibility:hidden; }"
      + ".TDInfos ul { list-style: circle;margin-left:2em; }"
      + ".TimeSelector {text-align: center; }"
      + ".timeinput { width:"+getS('Timewidth')+";text-align:center; }"
      + ".dateinput { width:"+getS('Datewidth')+";text-align:center; }"
      + ".PageInfos { -webkit-columns:"+getS('PIcolwdth')+"; -moz-columns:"+getS('PIcolwdth')+"; columns:"+getS('PIcolwdth')+";margin-left: 0.25em; }"
      + ".PageInfos li { list-style:none;-webkit-column-span:none;column-span:none;padding-left:0.1em;border-radius:"+getS('PILIbdr')+";background-color:"+getS('PILIbgc')+";border:1px "+getS('Mainbds')+" "+getS('PILIbdc')+"; }"
      + ".PageInfos li:hover, #fieldsetDatas li:hover  { background-color:"+getS('HoverPILIbgc')+";border:1px "+getS('Mainbds')+" "+getS('HoverPILIbdc')+"; }"

// Formulaire Pages --------------------------------------------------------


// Formulaire Catégorie --------------------------------------------------------

      + ".SuggestForm { display:-webkit-flex;display:flex;flex-direction:column; }"
      + "#CatInputForm {  }"
      + ".ns--1 #CatInput, ns--1 #EvalThemeInput { width:"+getS('SpeImpCatwdth')+"; }"
      + ".ns--1 #fieldsetCat input[type=text] { margin-bottom:0.5em; }"
      + "#subcatdepthForm { padding-left:2em; }"
      + "#subcatdepthForm input {margin-right:0.25em; }"
      + "#CatInfosDiv { padding:1em 0; }"
      + "#Pinfos { margin: 0; }"
      + "#TDDaughters { border-left:1px "+getS('Innerbds')+" "+getS('Mainbdc')+"; }"
      + "#CatParentsDiv ul, #CatDaughtersDiv ul {list-style: none;margin-left: 0.25em; }"
      + "#CatParentsDiv ul ul, #CatDaughtersDiv ul ul {list-style: none;margin-left:1em; }"
      + ".hiddencaticon { margin-left:0.5em; }"


// Formulaire Liens --------------------------------------------------------

      + "#LinksTable {  }"

// Formulaire Pages liées --------------------------------------------------------


// Formulaire Inclusions --------------------------------------------------------

      + "#TemplateDoc { font-size:"+getS('TempDocfs')+";margin-left:0.5em; }"
      + "#TDtemplatedoc { border-left:1px "+getS('Innerbds')+" "+getS('Mainbdc')+";width:"+getS('TempDocwidth')+"; }"

// Formulaire Nouvelles pages  --------------------------------------------------------

      + "#NewpagesTimeSelector { margin-bottom:1em !important; }"


// Formulaire Filtrage --------------------------------------------------------

      + "#fieldsetSearch { padding:0.5em !important; }"
      + "#ANDORselect1, #ANDORselect2 { margin-left:2em;margin-right:2em; }"
      + "#SearchResultDisplaySelector { float:right; }"
      + "#FilterForm_STUB, #FilterForm_AVT, #FilterForm_IMP { white-space:nowrap; }"
      + "#FilterForm_STUB span, #FilterForm_AVT span, #FilterForm_IMP span { padding:2px;padding-top:5px;border:1px "+getS('Mainbds')+" "+getS('Mainbdc')+"; }"
      + "#PageFilteredCount { float:right; }"
      + "#RangeSelectorAbbr { float:left; }"
      + "#RangeSelectorAbbr, #PageFilteredCount { border:1px "+getS('FiltAbbrbds')+" "+getS('Mainbdc')+";border-radius:"+getS('FiltAbbrbdr')+";padding:0.05em 0.3em 0em 0.3em;background-color:"+getS('FiltAbbrbgc')+";font-weight:bold;border-bottom-width:2px;border-right-width:2px; }"
      + ".startFilterOption { border-radius: "+getS('FilSelbdr')+" 0 0 "+getS('FilSelbdr')+"; }"
      + ".endFilterOption   { border-radius: 0 "+getS('FilSelbdr')+" "+getS('FilSelbdr')+" 0;     }"
      + ".MouseFunctionRunning * { -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; }"
      + ".MouseFunctionRunning input[type=text]:focus, .MouseFunctionRunning input[type=time]:focus { -webkit-touch-callout: text; -webkit-user-select: text; -khtml-user-select: text; -moz-user-select: text; -ms-user-select: text; user-select: text; }"
      + ".ResizeFunctionRunning * { cursor:w-resize; }"
      + ".MoveFunctionRunning * { cursor:move; }"
      + "#FromToSelectorContainer { margin-bottom:1em;border:1px "+getS('Mainbds')+" "+getS('Mainbdc')+";border-collapse:collapse;border-radius:1em;border-top-width:2px;border-left-width:2px;overflow:hidden; }"
      + "#FromToSelectorDiv { background-color:"+getS('FiltNSbgc')+"; }"
      + "#FromToSelector { background-color:"+getS('FiltSbgc')+";border-radius:1em;overflow:hidden; }"
      + "#FromSelector { float:left; }"
      + "#ToSelector { float:right; }"
      + "#FromSelector, #ToSelector { width:1em;background-color:" + getS('FiltSbgc') + "; }"
      + "#FromToSelectorContainer, #FromToSelectorDiv, #FromToSelector, #FromSelector, #ToSelector, #FromSelectorMove { height:1em; }"
      + "#FromSelectorMove {margin-left:1em;margin-right:1em; }"
      + "#RangeSelectorAbbrLink *, #PageFilteredCount { color:"+getS('Maincol')+" !important;text-decoration:none !important; }"
      + ".RangeSelectorDisabled #FromToSelector { visibility:hidden; }"
      + ".RangeSelectorDisabled { background-color:"+getS('FiltDISbgc')+" !important; }"
      + ".NotAllPages { border:1px "+getS('FiltAbbrbds')+" "+getS('FiltAbbrMbdc')+" !important;background-color:"+getS('FiltAbbrMbgc')+" !important;border-bottom-width:2px !important;border-right-width:2px !important; }"
      + "#fieldsetSearchContainer { margin-left:0.5em;margin-right:0.5em; }"
      + "#fieldsetSearchContainer #fieldsetSearch { margin:0em 0.5em 0.5em 0.5em;padding:0.2em;background-color:"+getS('SmallFSbgc')+";border:1px "+getS('Mainbds')+" "+getS('Mainbdc')+";border-radius:"+getS('SmallFSbdr')+";border-bottom-width:2px;border-right-width:2px; }"
      + "#fieldsetSearchContainer #FromToSelectorContainer { margin:0 0.25em 0.25em 0.25em; }"
      + "#fieldsetSearch select { -moz-appearance: none;-webkit-appearance: none;-o-appearance: none;appearance: none; }"

// Formulaire Actions --------------------------------------------------------

      + ".ns--1 #fieldsetActions { padding-bottom:0.75em !important; }"
      + "#GlobalChangeInput, #GlobalOptionsInput, #SPInput, #DocInput { margin-left:1.5em; }"
      + "#GlobalCancelInput { margin-left: 0.125em; }"
      + ".ns--1 #fieldsetActions .FieldsetContent { display:-webkit-flex;display: flex;justify-content: space-between; }"   
      + "#fieldsetActions #LeftButtons { display:inline; }"
      + ".ns--1 #fieldsetActions #LeftButtons { display:-webkit-flex;display:flex; }"
      + "#LinksActions { display:-webkit-flex;display:flex;white-space:nowrap; }"
      + "#EmergencyStop { margin:0 0.75em;width:"+getS('EmStopwidth')+";height:"+getS('EmStopwidth')+";border-radius:50%;border: 3px solid DimGray;box-shadow: 2px 2px 5px DimGray;background: radial-gradient(circle, red , DarkRed) !important; }"
      + "#EmergencyStop.Pushed { border-color:FireBrick;box-shadow:none; }"
      + "#GlobalAddEvalAVTSelect, #GlobalAddEvalIMPSelect { -moz-appearance: none;-webkit-appearance: none;-o-appearance: none;appearance: none; } "
      + "#GlobalAddEvalCancel {padding-left:0;padding-right:0; }"

// Tableau des pages --------------------------------------------------------

      + "#MassEvalBoardListDiv { padding:"+getS('LinesTbdr')+";background-color:"+getS('BigFSbgc')+";border: 1px "+getS('Mainbds')+" "+getS('Mainbdc')+";border-radius:"+getS('LinesTbdr')+";overflow:hidden; }"
      + "#MassEvalBoardList { margin:0px;border-collapse:collapse; }"
      + ".TH1, .TH2, .TH3, .TH4, .TH5, .TH6 { background-color:"+getS('THListbgc')+";border:1px "+getS('Mainbds')+" "+getS('THListbdc')+";padding-bottom: 0;padding-top: 0; }"
      + ".TD1, .TD2, .TD3, .TD4, .TD5, .TD6 { background-color:"+getS('Linesbgc')+";border:1px "+getS('Mainbds')+" "+getS('Linesbdc')+"; }"
      + ".TH2 { width:"+getS('TH2width')+"; }"
      + ".TH3 { width:"+getS('TH3width')+"; }"
      + ".TH4 { width:"+getS('TH4width')+"; }"
      + ".TH5 { width:"+getS('TH5width')+"; }"
      + ".TH6 { width:"+getS('TH6width')+"; }"
      + ".SinglePageAnalysis .TD1:hover, .SinglePageAnalysis .TD2:hover, .SinglePageAnalysis .TD3:hover, .SinglePageAnalysis .TD4:hover, .SinglePageAnalysis .TD5:hover, "
      + ".MultiplePagesAnalysis tr:hover .TD1, .MultiplePagesAnalysis tr:hover .TD2, .MultiplePagesAnalysis tr:hover .TD3, .MultiplePagesAnalysis tr:hover .TD4, .MultiplePagesAnalysis tr:hover .TD5, .MultiplePagesAnalysis tr:hover .TD6 { background-color:"+getS('HoverLinesbgc')+"; }"
      + ".FilteredLine { display:none !important; }"
      + ".previewDiv { background-color:"+getS('Prvwbgc')+";font-size:"+getS('Prvwfs')+";height:"+getS('Prvwhght')+";width:100%;overflow-y:scroll;border-top:1px "+getS('Prvwbds')+" "+getS('Linesbdc')+";resize:vertical; }"
      + ".previewButtons { float:right; }"
      + ".previewCloseButtonImage { border-radius: 0.25em; }"
      + ".pagepropicon { margin-right:0.5em; }"
      + ".StubTheme { width:"+getS('StubTwidth')+"; }"
      + ".StubAdj { width:"+getS('StubAwidth')+"; }"
      + ".Avancement { width:"+getS('Avtwidth')+"; }"
      + ".IMPtheme { width:"+getS('ImpTwidth')+"; }"
      + ".Importance { width:"+getS('Impwidth')+"; }"
      + ".TD2Content { text-align:left;padding:0 0.25em; }"
      + ".TD3Content { text-align:right;padding:0 0.25em; }"
      + ".TD4Content { text-align:center;padding:0 0.25em; }"
      + ".TD5Content { text-align:right;padding:0 0.25em; }"
      + ".TD6Content { display:-webkit-flex;display:flex;flex-direction: column;align-content:center;padding:0 0.25em; }"
      + ".SortLinks { float:right;margin-bottom:-2em;display:-webkit-flex;display:flex;flex-direction:column;line-height:90%;font-size:70%;border:1px "+getS('Mainbds')+" "+getS('Sortbdc')+";background-color:"+getS('Sortbgc')+";border-radius:"+getS('Sortbdr')+";border-bottom-width:2px;border-right-width:2px; }"
      + ".SortLinks a { color:"+getS('Sortcol')+" !important; }"
      + ".SinglePageAnalysis .SortLinks { visibility:hidden; }"
      + "#selectedSort { visibility:hidden; }"
      + ".hideportals .TH2, .hideportals .TD2 { display:none; }"
      + ".TD2Content ul { list-style:none;margin:0;font-size:"+getS('PortListfs')+";line-height:100%; }"
      + ".TD2Content li { border:1px "+getS('Mainbds')+" "+getS('Linesbdc')+";border-radius:0.5em;padding:1px 0.5em;background-color:"+getS('Linesbgc')+" !important;cursor:pointer; }"
      + ".TD2Content li:hover { background-color:"+getS('THListbgc')+" !important; }"
      + ".TD3Content form:hover, .TD5Content form:hover { background-color:"+getS('THListbgc')+" !important; }"

   // Liens du bas
      + "#MassEvalBoard #bottomlinks { display:-webkit-flex;display:flex;align-content:center; }"
      + "#MassEvalBoard #bottomlinks a { width: 20%;background-color:"+getS('Linesbgc')+";border-top: 3px "+getS('Mainbds')+" "+getS('Linesbdc')+";border-bottom: 1px "+getS('Mainbds')+" "+getS('Linesbdc')+";border-left: 1px "+getS('Mainbds')+" "+getS('Linesbdc')+";text-align: center;padding: 1em 0 1em 0;font-size: 120%; }"
      + "#MassEvalBoard #bottomlinks a:last-of-type { border-right: 1px "+getS('Mainbds')+" "+getS('Linesbdc')+"; }"
      + "#MassEvalBoard #bottomlinks a:hover { background-color:"+getS('HoverLinesbgc')+"; }"


// Menu d'options --------------------------------------------------------

      + "#MassEvalBoardHead #fieldsetOptions { margin-top:0;margin-left:1em;margin-right:1em;padding:0.2em;background-color:"+getS('SmallFSbgc')+";border:1px "+getS('Mainbds')+" "+getS('Mainbdc')+";border-radius:"+getS('SmallFSbdr')+";border-bottom-width:2px;border-right-width:2px; }"
      + "#fieldsetOptions li { list-style:none;-webkit-column-span:none;column-span:none;padding-left:0.1em;border-radius:"+getS('OptLIbdr')+";background-color:"+getS('OptLIbgc')+";border:1px "+getS('Mainbds')+" "+getS('OptLIbdc')+"; }"
      + "#fieldsetOptions li:hover, #fieldsetDatas li:hover  { background-color:"+getS('HoverOptLIbgc')+";border:1px "+getS('Mainbds')+" "+getS('HoverOptLIbdc')+"; }"
      + "#fieldsetOptions textarea { resize:none; }"
      + ".OptInputNbr { width:"+getS('OptNbrwdth')+"; }"
      + ".OptInputStr { width:"+getS('OptStrwdth')+"; }"
      + ".OptInputCSS { width:"+getS('OptStywdth')+"; }"
      + "#fieldsetOptions p { padding-bottom: 0.5em;border-bottom: 1px "+getS('Innerbds')+" "+getS('Mainbdc')+";margin-bottom:0.5em;margin-left:2em;margin-right:2em; }"
      + ".ns--1 #fieldsetOptions p { padding-bottom: 1em;border-bottom: 1px "+getS('Innerbds')+" "+getS('Mainbdc')+";margin-bottom:1em;margin-left:2em;margin-right:2em; }"
      + "#OPTIONULparams, #OPTIONULstyles, #OPTIONULtexts { -webkit-columns:"+getS('Optcolwdth')+"; -moz-columns:"+getS('Optcolwdth')+"; columns:"+getS('Optcolwdth')+"; }"
      + "#OPTIONULparams li, #OPTIONULstyles li { display:-webkit-flex;display:flex;align-items:center; }"
      + ".optionsUL { margin-right:1em;margin-left:1em; }"
      + "#OPTIONULtexts li input[type=button] { padding-top:0.5em;padding-bottom:0.8em;margin-bottom:-1em; }"
      + "#OPTIONULtexts li textarea { display:inline;margin:0;position:relative;top:1em;margin-top:-1em; }"
      + "#OPTIONULtexts li label { display:block;margin-left:1em; }"
      + "#OPTIONULtexts li { padding-bottom:1em; }"
      + "#OPTIONULtexts li form { display:-webkit-flex;display:flex;align-content:center; }"
      + ".colorpickerDiv { float: left;position: relative;left:-198px;margin-right:-197px;top:-210px;margin-bottom: -200px !important; }"
      + ".colorpicker { border:1px solid "+getS('Mainbdc')+";background-color:white;border-radius:98px;overflow:hidden;box-shadow: 2px 2px 5px DimGray; }"
      + "#OPTIONULstyles form { display:-webkit-flex;display:flex;align-items:center; }"
      + "#GlobalRAZoptionInput { margin-left:1em; }"
      + "#FontTester { display:inline-block; width:350px;height:210px;position: relative;left:0.25em;margin-right: -366px;margin-bottom: -205px;overflow:hidden;border-radius:"+getS('OptLIbdr')+";background-color:"+getS('OptLIbgc')+";border:1px "+getS('Mainbds')+" "+getS('OptLIbdc')+";border-bottom-width:2px;border-right-width:2px;text-align:justify;font-family:"+getS('Mainff')+";padding:0.5em;box-shadow: 2px 2px 5px DimGray; }"
      + ".ImagePreviewSpan { float: left;width: 0;height: 0; }"
      + ".ImagePreview { float:left;position:relative;top:10px;height:"+getS('OptImgPrevhght')+";margin-top:-"+getS('OptImgPrevhght')+";background: url('//upload.wikimedia.org/wikipedia/commons/5/5d/Checker-16x16.png') repeat;border:1px "+getS('Mainbds')+" "+getS('OptLIbdc')+";border-bottom-width:2px;border-right-width:2px;box-shadow: 2px 2px 5px DimGray; }"

      + ".modifiedoption { background-color:"+getS('OptLIMbgc')+" !important; }"
      + ".modifiedoption:hover { background-color:"+getS('HoverOptLIMbgc')+" !important; }"
      + ".modifiedoption label { cursor:help; }"
      + "#MoreParamsTestResult { margin-left:1em; }"
      + "#MoreParamsTestResult span { color:red !important; }"

// Menu des données --------------------------------------------------------

      + ".DataInfo {padding:0.1em;border:1px solid grey; }"
      + "#fieldsetDatas li { list-style:none;-webkit-column-span:none;column-span:none;padding-left:0.1em;border-radius:"+getS('OptLIbdr')+";background-color:"+getS('OptLIbgc')+";border:1px "+getS('Mainbds')+" "+getS('OptLIbdc')+"; }"
      + "input[name='RAZdataUL'] { margin-left:2em !important; }"

// Bandeau de message --------------------------------------------------------

      + "#MassEvalControlUL { position:fixed;bottom:0;right:0;margin-3px;list-style:none; }"
      + ".MassEvalControlLI { background-color:"+getS('Alertbgc')+";border:1px "+getS('Alertbds')+" "+getS('Alertbdc')+";border-bottom-width:2px;border-right-width:2px;border-radius:"+getS('Alertbdr')+";margin:1px;padding:5px;text-align:right;display:-webkit-flex;display:flex;align-content: center; }"
      + ".MassEvalBoardControlText { color:"+getS('Alertcol')+";margin-right:1.5em;margin-left:1em;font-size:"+getS('Alertfs')+";font-weight:bold; }"
      + "#MassEvalControlLI_AllOK { cursor:help; }"

// Harmonisation clockpicker / datepicker --------------------------------------------------------

      + ".clockpicker-popover .popover-title { display:none; }"
      + ".clockpicker-plate div.active { color: "+getS('DTpickCSelbdc')+";font-weight:bold; }"
      + ".clockpicker-canvas-bg { fill:none;stroke:none; }"
      + ".clockpicker-canvas-bearing { fill:"+getS('DTpickCSelbdc')+"; }"
      + ".clockpicker-canvas line { stroke:"+getS('DTpickCSelbdc')+"; }"
      + ".clockpicker-canvas-fg { fill:"+getS('DTpickCSelbdc')+"; }"
      + ".datepicker-panel > ul > li.picked { color: "+getS('DTpickCSelbdc')+";font-weight:bold; }"
      + ".datepicker-panel > ul > li.picked, .datepicker-panel > ul > li.picked:hover { border:1px solid "+getS('DTpickCSelbdc')+";height:28px;width:28px;line-height:28px; }"
      + ".datepicker-panel > ul > li.picked { background-color:"+getS('DTpickCSelbgc')+" !important; }"
      + ".clockpicker-plate div.active { background-color:"+getS('DTpickCSelbgc')+" !important;border:1px solid "+getS('DTpickCSelbdc')+"; }"
      + ".datepicker-panel > ul > li { background-color:transparent; }"
      + ".datepicker-panel > ul > li { border-radius:50%; }"
      + ".datepicker-panel > ul > li.highlighted { background-color:transparent;  }"
      + ".datepicker-panel > ul > li:hover { background-color: "+getS('HoverDTpickCbgc')+" !important; }"
      + ".datepicker-panel > ul > li.picked:hover { background-color: "+getS('HoverDTpickCbgc')+"; }"
      + ".clockpicker-plate div.active:hover { background-color:"+getS('HoverDTpickCbgc')+" !important; }"
      + ".clockpicker-tick:hover { background-color: "+getS('HoverDTpickCbgc')+" !important; }"
      + ".datepicker-panel > ul > li.muted, .datepicker-panel > ul > li.muted:hover { color: "+getS('DTpickUnSelcol')+"; }"
      + ".datepicker-panel > ul > li.disabled, .datepicker-panel > ul > li.disabled:hover { background-color:transparent !important;color: "+getS('DTpickDiscol')+"; }"
      + ".popover, .datepicker-dropdown, .datepicker-container { background-color:"+getS('DTpickbgc')+";font-size: 12px; border: 1px solid "+getS('Mainbdc')+";box-shadow: 0 5px 10px rgba(0, 0, 0, .2);border-radius:"+getS('DTpickbdr')+";border-bottom-width:2px;border-right-width:2px; }"
      + ".datepicker-top-left, .datepicker-top-right { border-top-color:"+getS('Mainbdc')+"; }"
      + ".popover { background-color: "+getS('DTpickbgc')+"; }"
      + ".clockpicker-popover .popover-content { background-color:transparent; }"
      + ".clockpicker-plate {background-color: "+getS('DTpickCbgc')+";border: 1px solid "+getS('Mainbdc')+"; }"
      + ".datepicker-container { padding:10px; }" 
      + ".datepicker-panel > ul  > li[data-view='month prev'] { background-color: "+getS('DTpickCbgc')+";border: 1px solid "+getS('Mainbdc')+";height:28px;line-height:26px; }"
      + ".datepicker-panel > ul > li[data-view='month prev'] { border-right:none;border-top-right-radius:0;border-bottom-right-radius:0; }"
      + ".datepicker-panel > ul > li[data-view='month current'] { background-color: "+getS('DTpickCbgc')+";border-top: 1px solid "+getS('Mainbdc')+";border-bottom: 1px solid "+getS('Mainbdc')+";height:28px;border-radius:0; }"
      + ".datepicker-panel > ul  > li[data-view='month next'] { background-color: "+getS('DTpickCbgc')+";border: 1px solid "+getS('Mainbdc')+";border-left:none;height:28px;line-height:26px;border-top-left-radius:0;border-bottom-left-radius:0; }"
      + ".datepicker-panel > ul[data-view='week']  { background-color: "+getS('DTpickCbgc')+";border:1px solid "+getS('Mainbdc')+";border-bottom-style:"+getS('Innerbds')+";border-top-left-radius:15px;border-top-right-radius:15px;height:28px;margin-top:10px;width:210px; }"
      + ".datepicker-panel > ul[data-view='week'] > li, .datepicker-panel > ul[data-view='week'] > li:hover { background-color: transparent !important; }"
      + ".datepicker-panel > ul[data-view='days'] { background-color: "+getS('DTpickCbgc')+";border:1px solid "+getS('Mainbdc')+";border-top:none;border-radius:0 0 15px 15px;width:210px; }"
      + ".datepicker-panel > ul[data-view='days']  > li { margin:2px;width:26px;height:26px;line-height:26px; }"
      + ".datepicker-panel > ul[data-view='days']  > li.picked { width:24px;height:24px;line-height:24px; }"
      + ".datepicker-panel > ul  > li[data-view='year prev'] { background-color: "+getS('DTpickCbgc')+";border: 1px solid "+getS('Mainbdc')+";height:28px;line-height:26px; }"
      + ".datepicker-panel > ul > li[data-view='year prev'] { border-right:none;border-top-right-radius:0;border-bottom-right-radius:0; }"
      + ".datepicker-panel > ul  > li[data-view='year current'] { background-color: "+getS('DTpickCbgc')+";border-top: 1px solid "+getS('Mainbdc')+";border-bottom: 1px solid "+getS('Mainbdc')+";height:28px;border-radius:0; }"
      + ".datepicker-panel > ul  > li[data-view='year next'] { background-color: "+getS('DTpickCbgc')+";border: 1px solid "+getS('Mainbdc')+";border-left:none;height:28px;line-height:26px;border-top-left-radius:0;border-bottom-left-radius:0; }"
      + ".datepicker-panel > div[data-view='months picker'] ul:first-of-type { background-color: "+getS('DTpickCbgc')+";border:1px solid "+getS('Mainbdc')+";border-radius:15px;height:28px;line-height:28px;width:210px; }"
      + ".datepicker-panel > ul[data-view='months'] { background-color: "+getS('DTpickCbgc')+";border:1px solid "+getS('Mainbdc')+";border-radius:15px;width:210px;margin-top:10px; }"
      + ".datepicker-panel > ul[data-view='months']  > li { margin:4px 10px;width:32px;height:32px;line-height:32px; }"
      + ".datepicker-panel > ul[data-view='months']  > li.picked { width:30px;height:30px;line-height:30px; }"
      + ".datepicker-panel > ul  > li[data-view='years prev'] { background-color: "+getS('DTpickCbgc')+";border: 1px solid "+getS('Mainbdc')+";height:28px;line-height:26px; }"
      + ".datepicker-panel > ul > li[data-view='years prev'] { border-right:none;border-top-right-radius:0;border-bottom-right-radius:0; }"
      + ".datepicker-panel > ul  > li[data-view='years current'] { background-color: "+getS('DTpickCbgc')+";border-top: 1px solid "+getS('Mainbdc')+";border-bottom: 1px solid "+getS('Mainbdc')+";height:28px;border-radius:0; }"
      + ".datepicker-panel > ul  > li[data-view='years next'] { background-color: "+getS('DTpickCbgc')+";border: 1px solid "+getS('Mainbdc')+";border-left:none;height:28px;line-height:26px;border-top-left-radius:0;border-bottom-left-radius:0; }"
      + ".datepicker-panel > div[data-view='years picker'] ul:first-of-type { background-color: "+getS('DTpickCbgc')+";border:1px solid "+getS('Mainbdc')+";border-radius:15px;height:28px;line-height:28px;width:210px; }"
      + ".datepicker-panel > ul[data-view='years'] { background-color: "+getS('DTpickCbgc')+";border:1px solid "+getS('Mainbdc')+";border-radius:15px;width:210px;margin-top:10px; }"
      + ".datepicker-panel > ul[data-view='years']  > li { margin:4px 7px;width:38px;height:38px;line-height:38px; }"
      + ".datepicker-panel > ul[data-view='years']  > li.picked { width:36px;height:36px;line-height:36px; }"
      + ".popover.bottom > .arrow, .popover > .arrow::after { border-bottom-color: "+getS('Mainbdc')+" !important;}"
      + ".datepicker-top-left::before, .datepicker-top-left::after, .datepicker-top-right::before, .datepicker-top-right::after { left:18px;top:-22px; }"
      + ".datepicker-container::before, .datepicker-container::after { border:11px solid transparent; }"
      + ".datepicker-top-left::before, .datepicker-top-right::before { border-bottom-color: "+getS('Mainbdc')+"; }"
      + ".datepicker-panel > ul > li, .datepicker-panel > ul > li.disabled, .datepicker-panel > ul > li.disabled:hover, .datepicker-panel > ul > li.muted, .datepicker-panel > ul > li.muted:hover { background-color: transparent; }"

/*
      + ".popover { display: block !important; }" // <-----------------------------------------  garder le conteneur visible pour les tests
      + ".datepicker-container { display: block !important; }" // <----------------------------  garder le conteneur visible pour les tests
*/


// Fancy inputs --------------------------------------------------------
      if(MassEval.params.UseFancyInputs){
        NewStyles += ""

        + "#MassEvalBoard select, #MassEvalBoard input[type='checkbox'], #MassEvalBoard input[type='radio'] { -moz-appearance: none;-webkit-appearance: none;-o-appearance: none;appearance: none; }"

        + "#MassEvalBoard input[type='checkbox'] {width:2.5em;height:1.5em;margin:0;margin-right:0px;margin-left:0px;margin-right:0px;margin-left:0px;margin-right:0.25em;margin-left:0.25em;cursor:pointer;"
        + "border-radius:1.5em;background-color: red;border: 1px solid DimGray;border-bottom-width:3px;border-right-width:3px; }"
        + "#MassEvalBoard input[type='checkbox']::after { content:\"◄\";position: relative;top: -0.10em;color: DarkRed;left:0em;transition:left 0.5s; }"
        + "#MassEvalBoard input[type='checkbox']:disabled::after { color:DimGray; }"
        + "#MassEvalBoard input[type='checkbox']:checked { background-color:Lime; }"
        + "#MassEvalBoard input[type='checkbox']:checked::after { content:\"►\";position: relative;top: -0.10em;color: green;left: 1.375em; }"
        + "#MassEvalBoard input[type='checkbox']:checked:disabled::after { color:DimGray; }"
        + "#MassEvalBoard input[type='checkbox']:disabled { background-color:Gray; }"

        + "#MassEvalBoard input[type='radio'] {width:1em;height: 1em;margin: 0;margin-right: 0px;margin-left: 0px;margin-right: 0px;margin-left: 0px;margin-right: 0.25em;margin-left: 0.25em;cursor:pointer;"
        + "border-radius: 0.75em;background-color: red;border: 1px solid DimGray;border-bottom-width:3px;border-right-width:3px; }"
        + "#MassEvalBoard input[type='radio']:checked { background-color:Lime; }"
        + "#MassEvalBoard input[type='radio']:disabled { background-color:Gray; }"
        + "#MassEvalBoard input[type='radio']:checked:disabled { background-color:LightGrey; }"

        + "#MassEvalBoard select::after { content:\"▼\";position:relative;width:1.5em;height:1.5em;border:1px solid Gray;background-color:silver;color:black; }"


      }
      MassEval.params.ActualStyleTag = mw.loader.addStyleTag(NewStyles);
    }
  }
}
  // ------------------------------- Lancement -------------------------------
if( MassEval.functions.getLaunchCondition()){
    mw.loader.using(['mediawiki.util', 'mediawiki.api'], function(){ 
      $(MassEval.functions.launch); 
    });
}

//</source></noinclude>