Mudanças entre as edições de "MediaWiki:Common.js"

De Wiki Gla
Ir para navegação Ir para pesquisar
m
 
(674 revisões intermediárias por 7 usuários não estão sendo mostradas)
Linha 1: Linha 1:
/** Upload form rewrite
/* Any JavaScript here will be loaded for all users on every page load. */
Authors: [[User:Lupo]], March 2008 - 2015
* Multiple user script devloapers, 2015 -


License: Quadruple licensed GFDL, GPL, LGPL and Creative Commons Attribution 3.0 (CC-BY-3.0)
/* Dark mode: fallback se gla-darkmode-boot.php não estiver no servidor */
(function () {
  try {
    if (localStorage.getItem('gla-darkmode') === '1') {
      var root = document.documentElement;
      root.classList.add('client-darkmode', 'skin-theme-clientpref-night');
      if (document.cookie.indexOf('gla-darkmode=1') === -1) {
        document.cookie = 'gla-darkmode=1;path=/;max-age=31536000;SameSite=Lax';
      }
    }
  } catch (e) { }
})();


Choose whichever license of these you like best :-)
(function () {
*/
  'use strict';
// <nowiki>
/* UFUtils, UFUI, UFHelp, UploadForm are made global */ // UFUI is used by HotCat
/* global jQuery:false, mediaWiki:false, importScript:false */
/* global Buttons, EditTools, LanguageHandler, Tooltip, TextCleaner, UIElements, FormRestorer */
/* global hotcat_set_state, hotcat_close_form, hotcat_get_state */ // by HotCat
/* global wgUploadLicenseObj, wgUploadWarningObj */
/* eslint one-var:0, vars-on-top:0, camelcase:0, no-alert:0, no-console:0, no-bitwise:0, no-new:0, no-eval:0, indent:0, curly:0, */
/* eslint space-in-parens:0, computed-property-spacing:0, array-bracket-spacing:0, */ // extends:wikimedia
/* jslint strict:false, forin:true, bitwise:true */


(function ($, mw) {
  function setupDiscordButton() {
// Guard against multiple inclusions!
    var a = document.querySelector('#n-Discord a');
if (window.UploadForm)
    if (!a || a.querySelector('.gla-discord-text')) {
return;
      return;
    }


importScript('MediaWiki:LanguageHandler.js');
    var icon = document.createElement('span');
importScript('MediaWiki:FormRestorer.js');
    icon.className = 'gla-discord-icon';
importScript('MediaWiki:UIElements.js');
    icon.setAttribute('aria-hidden', 'true');
importScript('MediaWiki:Tooltips.js');


var UFConfig = {
    var textWrap = document.createElement('span');
// Configuration. These can be set by a user in their user js. The typeof checks
    textWrap.className = 'gla-discord-text';
// are not really needed when this script is globally enabled, but until then, we have to be
    textWrap.innerHTML = 'Entre no <strong>Discord</strong>';
// careful not to overwrite a user's settings if he defines these first and then includes this
// script in his monobook.js.


forcebasic: window.UploadForm_forcebasic !== undefined ? window.UploadForm_forcebasic :
    a.textContent = '';
(!window.JSconfig || window.JSconfig.keys.UploadForm_newlayout) ? null : true, // If non-null, use the basic form
    a.appendChild(icon);
ownwork_author: window.UploadForm_ownwork_author !== undefined ? window.UploadForm_ownwork_author :
    a.appendChild(textWrap);
'[[User:' + mw.config.get('wgUserName') + '|]]', // Change to use something else
  }
ownwork_date: window.UploadForm_ownwork_date !== undefined ? window.UploadForm_ownwork_date :
null, // Set to define a pre-fill value for the date field
own_language_first: window.UploadForm_own_language_first !== undefined ? window.UploadForm_own_language_first :
false, // Set to true to have own language description on top
additional_info_height: window.UploadForm_additional_info_height ? window.UploadForm_additional_info_height : 2,
description_height: window.UploadForm_description_height ? window.UploadForm_description_height : 2,
source_field_size: window.UploadForm_source_field_size ? window.UploadForm_source_field_size : 1,
author_field_size: window.UploadForm_author_field_size ? window.UploadForm_author_field_size : 1,
page_preview_in_tooltip: window.UploadForm_page_preview_in_tooltip !== undefined ? window.UploadForm_page_preview_in_tooltip : false,
description_languages: window.UploadForm_description_languages ? window.UploadForm_description_languages : null,
// If false, don't pre-fill description field in basic mode. May be useful
// for people who have their own scripts pre-filling this field.
autofill: window.UploadForm_autofill !== undefined ? window.UploadForm_autofill : true
};


var UFUtils = window.UFUtils = {
  if (document.readyState === 'loading') {
makeLink: function (name, url) {
    document.addEventListener('DOMContentLoaded', setupDiscordButton);
var link = document.createElement('a');
  } else {
link.setAttribute('href', url);
    setupDiscordButton();
link.appendChild(document.createTextNode(name));
  }
return link;
})();
},


convert_td_div: function (td) {
(function () {
// Replace the contents with a div, fixate the width, and give the div the id of the td
  'use strict';
var div = document.createElement('div');
var w = UFUtils.getWidth(td);
if (w) {
td.setAttribute('width', String(w));
td.style.maxWidth = String(w) + 'px';
}
div.setAttribute('width', (w ? String(w) : '100%'));
if (w)
div.style.maxWidth = String(w) + 'px';


// Clear the warningCell and add the div instead
  var LOGO_SRC = 'https://wiki.gla.com.br/images/b/bf/WIKIGLAlogo.png';
while (td.firstChild)
  var LOGO_RETRIES = 0;
td.removeChild(td.firstChild);
  var LOGO_MAX_RETRIES = 40;


td.appendChild(div);
  function resolveLogoSrc() {
var id = td.id;
    if (typeof mw !== 'undefined' && mw.config && mw.config.get) {
td.id = '';
      var skinLogo = mw.config.get('wgLogo');
div.id = id;
      if (skinLogo && skinLogo.indexOf('wiki.png') === -1) {
return div;
        return skinLogo;
},
      }
    }
    return LOGO_SRC;
  }


getHeight: function (rows, minimum, maximum) {
  function setupLogoImg() {
if (!rows || isNaN(rows / 2) || rows < minimum)
    var a = document.querySelector('#p-logo a.mw-wiki-logo');
return minimum;
    if (!a) {
else if (rows > maximum)
      return false;
return maximum;
    }
return rows;
},


getWidth: function (element) {
    if (!a.querySelector('.gla-logo-img')) {
try {
      var img = document.createElement('img');
if (element.clientWidth) { // From IE, but Gecko has this, too.
      img.className = 'gla-logo-img';
return element.clientWidth;
      img.src = resolveLogoSrc();
} else if (window.getComputedStyle) { // Gecko, Opera
      img.alt = '';
return document.defaultView
      img.setAttribute('decoding', 'async');
.getComputedStyle(element, null)
      img.setAttribute('draggable', 'false');
.getPropertyValue('width');
      img.addEventListener('error', function onLogoError() {
}
        if (img.src !== LOGO_SRC) {
} catch (ex) {
          img.src = LOGO_SRC;
return null;
        }
}
      });
},
      a.appendChild(img);
    }


isChildOf: function (child, ancestor) {
    return true;
if (!ancestor)
  }
return false;
while (child && child !== ancestor)
child = child.parentNode;


return (child === ancestor);
  function trySetupLogo() {
}
    if (setupLogoImg()) {
      return;
    }
    LOGO_RETRIES += 1;
    if (LOGO_RETRIES < LOGO_MAX_RETRIES) {
      window.setTimeout(trySetupLogo, 50);
    }
  }


}; // end UFUtils
  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', trySetupLogo);
  } else {
    trySetupLogo();
  }
})();


// Used by HotCat
(function () {
var UFUI = window.UFUI = {
  'use strict';
// Encapsulate all UI stuff, with checks such that it works in degraded mode
// (built-in defaults only) if UIElements doesn't exist.


defaultLanguage: 'en', // Default.
  var STORAGE_KEY = 'gla-darkmode';
userLanguage: 'en', // Sanitized wgUserLanguage.
  var LINK_CLASS = 'darkmode-link';
internalLanguage: 'en', // Same, but with dashes replaced by underscores.
  var LABEL_DARK = 'Modo escuro';
isOwnWork: false, // True if uselang="*ownwork"
  var LABEL_LIGHT = 'Modo padr\u00e3o';
isFromFlickr: false, // True if uselang="*fromflickr"
isExperienced: false, // True if uselang="experienced"


sanitizeUserLanguage: function () {
  function isDark() {
// Try to make sense of wgUserLanguage even if it has been hacked to have special
    return document.documentElement.classList.contains('client-darkmode');
// pages for particular upload sources. Also sets isOwnWork and isFromFlickr.
  }
var globalUserLanguage = mw.config.get('wgUserLanguage');
if (!globalUserLanguage)
return;


UFUI.userLanguage = globalUserLanguage;
  function setDarkModeCookie(on) {
if (globalUserLanguage.length > 3) {
    try {
// Special "hacked" uselang parameters...
      document.cookie = 'gla-darkmode=' + (on ? '1' : '0') + ';path=/;max-age=' + (on ? 31536000 : 0) + ';SameSite=Lax';
var hacks = ['ownwork', 'fromflickr', 'experienced', 'fromwikimedia', 'fromgov'];
    } catch (e) { }
var found = false;
  }
for (var i = 0; i < hacks.length; i++) {
var idx = globalUserLanguage.indexOf(hacks[i]);
if (idx >= 0) {
// ULS is not working correctly with hacked uselang parameters, thus hiding it.
$('#pt-uls, .uls-tipsy').hide();
found = true;
if (idx)
UFUI.userLanguage = globalUserLanguage.substring(0, idx);
else
UFUI.userLanguage = UFUI.defaultLanguage;


if (!i)
  function setDark(on) {
UFUI.isOwnWork = true;
    var root = document.documentElement;
else if (i === 1)
    root.classList.toggle('client-darkmode', on);
UFUI.isFromFlickr = true;
    root.classList.toggle('skin-theme-clientpref-night', on);
else if (i === 2)
    root.classList.toggle('skin-theme-clientpref-day', !on);
UFUI.isExperienced = true;
    try {
      localStorage.setItem(STORAGE_KEY, on ? '1' : '0');
    } catch (e) { }
    setDarkModeCookie(on);
    updateLinks(on);
  }


break;
  function updateLinks(on) {
}
    var links = document.querySelectorAll('.' + LINK_CLASS);
}
    var label = on ? LABEL_LIGHT : LABEL_DARK;
if (!found && typeof LanguageHandler !== 'undefined' && LanguageHandler.getPrefix instanceof Function) {
    for (var i = 0; i < links.length; i++) {
// None of the "standard" hacks. Try an alternate approach.
      links[i].textContent = label;
var lang_code_length = LanguageHandler.getPrefix(globalUserLanguage);
    }
if (lang_code_length && lang_code_length < globalUserLanguage.length)
  }
UFUI.userLanguage = globalUserLanguage.substr(0, lang_code_length);


}
  function findDarkLink(el) {
}
    while (el && el !== document) {
if (UFUI.userLanguage === 'en-gb')
      if (el.classList && el.classList.contains(LINK_CLASS)) {
UFUI.userLanguage = 'en';
        return el;
      }
      el = el.parentNode;
    }
    return null;
  }


UFUI.internalLanguage = UFUI.userLanguage.replace(/-/g, '_');
  function injectToggle() {
},
    if (document.getElementById('pt-darkmode')) {
      return;
    }


defaultLabels: {
    var ul = document.querySelector('#p-personal .vector-menu-content-list') ||
wpSourceUploadLbl: 'Original source:',
      document.querySelector('#p-personal ul');
wpAuthorUploadLbl: 'Author:',
    if (!ul) {
wpDateUploadLbl: 'Date:',
      return;
wpDescUploadLbl: 'Description:',
    }
wpPermissionUploadLbl: 'Permission:',
wpCategoriesUploadLbl: 'Categories:',
wpOtherVersionsUploadLbl: 'Other versions:',
wpAdditionalInfoUploadLbl: 'Additional information:',
wpPreviewLicenseUploadLbl: 'Preview the chosen license',
wpOwnWorkUploadLbl: 'Own work',
wpUnknownLanguageUploadLbl: 'Unknown language',
wpPreviewUploadLbl: 'Preview',
wpOkUploadLbl: 'OK',
wpCancelUploadLbl: 'Cancel'
},


defaultErrorMsgs: {
    var li = document.createElement('li');
wpUploadWarningError: 'You must provide the original source of the image, the author of the work, and a license.',
    li.id = 'pt-darkmode';
wpNoFilenameError: 'The target filename must not be empty.',
wpHttpFilenameError: 'The target file name appears to be a URL.',
wpNoSlashError: 'The target file name must not contain "/".',
wpNondescriptFilenameError: 'Please use a more descriptive target file name.',
wpNoExtensionError: 'The target file name must have a file type extension (like for example ".jpg").',
wpIllegalExtensionError: 'Files of this type cannot be uploaded.',
wpDoubleExtensionError: 'Please correct the double file type in the target file name.',
wpFlickrURLError: 'The source must be a URL pointing to the image at Flickr.',
wpNoDescriptionError: 'Please give a description of the contents of the file you want to upload.',
wpNoHelpTextError: 'Help text not found.',
wpPreviewOverwriteError:
'You will upload over an already existing file. Please choose a different filename,' +
'unless you are uploading a technically improved version of the same file.' +
'Don\'t overwrite a file with a different image of the same topic.' +
'If you overwrite, the information in this form will not appear on the description page.',


wpReuploadNoSummaryError: 'Please describe the file changes in the text box.'
    var a = document.createElement('a');
},
    a.href = '#';
    a.className = LINK_CLASS;
    a.textContent = isDark() ? LABEL_LIGHT : LABEL_DARK;
    li.appendChild(a);


defaultHints: {
    var afterLi = document.getElementById('pt-mytalk') ||
wpUploadFormDestFileHint: 'Name of the file at Commons after the upload.',
      document.getElementById('pt-anontalk') ||
wpUploadFormSourceHint: 'Where does this file come from?',
      document.getElementById('pt-userpage') ||
wpUploadFormAuthorHint: 'Who created this file? If it shows some artwork, who created that?',
      document.getElementById('pt-anonuserpage');
wpUploadFormDateHint: 'Date of creation and/or first publication of the work.',
wpUploadFormPermissionHint: 'Not your own file? Or already published elsewhere? Use {{OTRS pending}} and send permission by e-mail. Also for specialized license tags.',
wpUploadFormAdditionalInfoHint: 'Use for geolocation tags and other specialized information.',
wpUploadFormCategoryHint: 'Click (+) to add categories.'
},


// Do *not* use "-" here (as in "be-tarask")!! Use "_" instead: "be_tarask".
    if (afterLi && afterLi.parentNode === ul) {
translate: {
      afterLi.insertAdjacentElement('afterend', li);
en: 'translate',
    } else {
af: 'vertaal',
      ul.insertBefore(li, ul.firstChild);
ar: 'ترجم',
    }
be: 'перакласці',
  }
be_tarask: 'перакласьці',
br: 'treiñ',
bg: 'превеждам',
ca: 'traduïu',
cs: 'přeložit',
cy: 'cyfieithu',
da: 'oversæt',
de: 'übersetzen',
el: 'μεταφράστε',
eo: 'traduki',
es: 'traducir',
et: 'tõlkima',
fa: 'ترجمه\u200cکردن',
fi: 'suomenna',
fo: 'umseta',
fr: 'traduire',
gl: 'traducir',
he: 'לתרגם',
hr: 'prevesti',
hu: 'fordítás',
hy: 'թարգմանել',
id: 'terjemah',
io: 'tradukar',
is: 'þýða',
it: 'tradurre',
ja: '訳す',
ko: '번역하기',
la: 'traducere',
mk: 'преведи',
ml: 'തര\u0d4dജ\u0d4dജമ',
mn: 'орчуулах',
mt: 'traduci',
nn: 'oversett',
no: 'oversett',
nl: 'vertalen',
pap: 'tradusí',
pl: 'przetłumacz',
pt: 'traduzir',
ro: 'a traduce',
ru: 'перевести',
sk: 'preložit',
sl: 'perovodit',
sq: 'përkthej',
ss: 'kuhúmusha',
sv: 'översätt',
ta: 'மொழிபெயர்',
tr: 'tercüme',
ty: 'ʻauvaha',
uk: 'перекласти',
vi: 'dịch',
zh: '翻譯',
zh_min_nan: 'hoan-e̍k',
nan: 'hoan-e̍k',
minnan: 'hoan-e̍k'
},


labels: null, // Repository for form labels
  function bindToggle() {
help: null, // Repository for help texts (and the help button)
    if (window.glaDarkModeBound) {
error_msgs: null, // Repository for error messages
      return;
uiElements: null, // Repository for graphical UI elements
    }
hints: null, // Repository for brief hints
    window.glaDarkModeBound = true;


setupRepositories: function () {
    document.addEventListener('click', function (e) {
if (!UFUI.labels) {
      var link = findDarkLink(e.target);
if (window.UIElements) {
      if (!link) {
var id;
        return;
UFUI.labels = UIElements.emptyRepository();
      }
UFUI.help = UIElements.emptyRepository();
      e.preventDefault();
UFUI.error_msgs = UIElements.emptyRepository();
      setDark(!isDark());
UFUI.uiElements = UIElements.emptyRepository();
    });
UFUI.hints = UIElements.emptyRepository();
  }


for (id in UFUI.defaultLabels) {
  function boot() {
if (id === 'wpDescUploadLbl') {
    injectToggle();
UIElements.setEntry(
    bindToggle();
id,
    updateLinks(isDark());
UFUI.labels,
  }
UFUtils.makeLink(
UFUI.defaultLabels[id],
'/wiki/Commons:First_steps/Quality_and_description'));
} else {
UIElements.setEntry(id, UFUI.labels, document.createTextNode(UFUI.defaultLabels[id]));
}
}
for (id in UFUI.defaultErrorMsgs) {
UIElements.setEntry(id, UFUI.error_msgs,
document.createTextNode(UFUI.defaultErrorMsgs[id]));
}
for (id in UFUI.defaultHints) {
UIElements.setEntry(id, UFUI.hints,
document.createTextNode(UFUI.defaultHints[id]));
}


// Now try to read the localized stuff from the uploadfooter.
  window.glaDarkModeBoot = boot;
UIElements.load('wpUploadFormLabels', null, 'span', UFUI.labels);
  window.addEventListener('load', boot);
UIElements.load('wpUploadFormErrorMessages', null, 'span', UFUI.error_msgs);
UIElements.load('wpUploadFormHints', null, 'span', UFUI.hints);
UIElements.load('wpUploadFormUIElements', null, 'div', UFUI.uiElements);
UIElements.load('wpUploadFormHelp', null, 'div', UFUI.help);
UFUI.basic = false;
} else {
UFUI.labels = UFUI.defaultLabels;
UFUI.error_msgs = UFUI.defaultErrorMsgs;
UFUI.hints = UFUI.defaultHints;
UFUI.basic = true;
}
}
},


getUI: function (id, repository, basic) {
  if (document.readyState === 'loading') {
if (!UFUI.labels) {
    document.addEventListener('DOMContentLoaded', boot);
UFUI.sanitizeUserLanguage();
  } else {
UFUI.setupRepositories();
    boot();
}
  }
if (!UFUI[repository])
return null;


var result = null;
  function markThemeReady() {
var add_plea = false;
    document.documentElement.classList.add('gla-theme-ready');
if (UFUI.basic) {
  }
result = document.createTextNode(UFUI[repository][id]);
add_plea = (UFUI.internalLanguage !== UFUI.defaultLanguage);
} else {
result = UIElements.getEntry(id, UFUI[repository], UFUI.internalLanguage, null);
add_plea = !result;
if (!result)
result = UIElements.getEntry(id, UFUI[repository]);


if (!result)
  if (document.readyState === 'complete') {
return null;
    requestAnimationFrame(markThemeReady);
// Hmmm... what happened here? We normally have defaults...
  } else {
result = result.cloneNode(true);
    window.addEventListener('load', function () {
}
      requestAnimationFrame(markThemeReady);
if (add_plea && !basic) {
    });
// Wrap it all into a span -- we can return only one element
  }
var span = document.createElement('span');
span.appendChild(result);
span.appendChild(UFUI.plea(repository, id));
result = span;
}
return result;
},


plea: function (what, msg_id) {
  var tries = 0;
var span = document.createElement('sub');
  var retryTimer = setInterval(function () {
span.appendChild(document.createTextNode(' ('));
    if (document.getElementById('pt-darkmode') || tries++ > 40) {
span.appendChild(
      clearInterval(retryTimer);
UFUtils.makeLink(
      return;
UFUI.translate[UFUI.internalLanguage] || UFUI.translate.en,
    }
'/wiki/MediaWiki_talk:UploadFormLabels/UploadFormTranslations?action=edit&section=new' +
    boot();
'&withJS=MediaWiki:UploadFormTranslator.js&language=' +
  }, 150);
encodeURIComponent(UFUI.userLanguage) +
})();
'&uploadformurl=' + encodeURIComponent(document.URL) +
(what ? '&uploadformitems=' + encodeURIComponent(what) : '') +
(msg_id ? '&uploadformmsg=' + encodeURIComponent(msg_id) : '')));
span.appendChild(document.createTextNode(')'));
return span;
},


getLabel: function (id, basic) {
return UFUI.getUI(id, 'labels', basic);
},


getErrorMsg: function (id, basic) {
return UFUI.getUI(id, 'error_msgs', basic);
},


getHint: function (id, basic) {
$(document).ready(function () {
return UFUI.getUI(id, 'hints', basic);
  //------- GLOBAL EVENTS TIMER ---------
},
  (function () {
    var globalEventsTimer = $('#global-event-time'); // Atualizado: ID do Timer dos Global Events
    var globalEventsImage = $('.global-event-image'); // Atualizado: Classe da Imagem dos Global Events
    var globalEventsInterval;


getEntry: function (id, repository, lang, sel) {
    // Informações dos eventos
if (!UFUI.labels) {
    /*
UFUI.sanitizeUserLanguage();
      0 - Domingo
UFUI.setupRepositories();
      1 - Segunda-feira
}
      2 - Terça-feira
if (!UFUI.basic)
      3 - Quarta-feira
return UIElements.getEntry(id, UFUI[repository], lang, sel);
      4 - Quinta-feira
      5 - Sexta-feira
      6 - Sábado
    */
    var globalEventsInfo = {
      0: [
        { name: 'Foxy Memory', time: '02:00:00', src: '/images/3/37/Foxy_memory_event.png' },
        { name: 'Foxy race (ship)', time: '09:00:00', src: '/images/2/29/Foxy_race_ship_event.png' },
        { name: 'Deathmatch', time: '12:00:00', src: '/images/4/46/Deathmatch_event.png' },
        { name: 'Foxy race', time: '15:00:00', src: '/images/e/e8/Foxy_race_event.png' },
        { name: 'Foxy quiz', time: '19:00:00', src: '/images/b/b3/Foxy_quiz_event.png' },
        { name: 'Foxy count', time: '22:00:00', src: '/images/f/f3/Foxy_count_event.png' },
      ],
      1: [
        { name: 'Foxy Memory', time: '02:00:00', src: '/images/3/37/Foxy_memory_event.png' },
        { name: 'Foxy race (ship)', time: '09:00:00', src: '/images/2/29/Foxy_race_ship_event.png' },
        { name: 'Deathmatch', time: '12:00:00', src: '/images/4/46/Deathmatch_event.png' },
        { name: 'Foxy race', time: '15:00:00', src: '/images/e/e8/Foxy_race_event.png' },
        { name: 'Foxy quiz', time: '19:00:00', src: '/images/b/b3/Foxy_quiz_event.png' },
        { name: 'Foxy count', time: '22:00:00', src: '/images/f/f3/Foxy_count_event.png' },
      ],
      2: [
        { name: 'Foxy race (ship)', time: '02:00:00', src: '/images/2/29/Foxy_race_ship_event.png' },
        { name: 'Deathmatch', time: '09:00:00', src: '/images/4/46/Deathmatch_event.png' },
        { name: 'Foxy race', time: '12:00:00', src: '/images/e/e8/Foxy_race_event.png' },
        { name: 'Foxy quiz', time: '15:00:00', src: '/images/b/b3/Foxy_quiz_event.png' },
        { name: 'Foxy count', time: '19:00:00', src: '/images/f/f3/Foxy_count_event.png' },
        { name: 'Foxy Memory', time: '22:00:00', src: '/images/3/37/Foxy_memory_event.png' },
      ],
      3: [
        { name: 'Deathmatch', time: '02:00:00', src: '/images/4/46/Deathmatch_event.png' },
        { name: 'Foxy race', time: '09:00:00', src: '/images/e/e8/Foxy_race_event.png' },
        { name: 'Foxy quiz', time: '12:00:00', src: '/images/b/b3/Foxy_quiz_event.png' },
        { name: 'Foxy count', time: '15:00:00', src: '/images/f/f3/Foxy_count_event.png' },
        { name: 'Foxy Memory', time: '19:00:00', src: '/images/3/37/Foxy_memory_event.png' },
        { name: 'Foxy race (ship)', time: '22:00:00', src: '/images/2/29/Foxy_race_ship_event.png' },
      ],
      4: [
        { name: 'Foxy race', time: '02:00:00', src: '/images/e/e8/Foxy_race_event.png' },
        { name: 'Foxy quiz', time: '09:00:00', src: '/images/b/b3/Foxy_quiz_event.png' },
        { name: 'Foxy count', time: '12:00:00', src: '/images/f/f3/Foxy_count_event.png' },
        { name: 'Foxy Memory', time: '15:00:00', src: '/images/3/37/Foxy_memory_event.png' },
        { name: 'Foxy race (ship)', time: '19:00:00', src: '/images/2/29/Foxy_race_ship_event.png' },
        { name: 'Deathmatch', time: '22:00:00', src: '/images/4/46/Deathmatch_event.png' },
      ],
      5: [
        { name: 'Foxy quiz', time: '02:00:00', src: '/images/b/b3/Foxy_quiz_event.png' },
        { name: 'Foxy count', time: '09:00:00', src: '/images/f/f3/Foxy_count_event.png' },
        { name: 'Foxy Memory', time: '12:00:00', src: '/images/3/37/Foxy_memory_event.png' },
        { name: 'Foxy race (ship)', time: '15:00:00', src: '/images/2/29/Foxy_race_ship_event.png' },
        { name: 'Deathmatch', time: '19:00:00', src: '/images/4/46/Deathmatch_event.png' },
        { name: 'Foxy race', time: '22:00:00', src: '/images/e/e8/Foxy_race_event.png' },
      ],
      6: [
        { name: 'Foxy count', time: '02:00:00', src: '/images/f/f3/Foxy_count_event.png' },
        { name: 'Foxy Memory', time: '09:00:00', src: '/images/3/37/Foxy_memory_event.png' },
        { name: 'Foxy race (ship)', time: '12:00:00', src: '/images/2/29/Foxy_race_ship_event.png' },
        { name: 'Deathmatch', time: '15:00:00', src: '/images/4/46/Deathmatch_event.png' },
        { name: 'Foxy race', time: '21:55:00', src: '/images/e/e8/Foxy_race_event.png' },
        { name: 'Foxy quiz', time: '22:00:00', src: '/images/b/b3/Foxy_quiz_event.png' },
      ]
    };


if (!UFUI[repository] || lang !== UFUI.defaultLanguage || !!sel && sel !== 'default')
    function pad(value) {
return null;
      return value < 10 ? '0' + value : value;
    }


return UFUI[repository][id];
    function getBrazilTime() {
}
      var now = new Date();
      var utc = now.getTime() + (now.getTimezoneOffset() * 60000); // Converte para UTC
      return new Date(utc - (3 * 3600000)); // Ajusta para UTC-3
    }


}; // end UFUI
    function startGlobalEventCountdown(eventStartTime, eventEndTime) {
      if (globalEventsInterval) clearInterval(globalEventsInterval);


var UFHelp = window.UFHelp = { // Collects all help-related stuff
      globalEventsInterval = setInterval(function () {
help_close_imgs: null,
        var now = getBrazilTime().getTime();


precreate_tooltip_closer: function () {
        if (now < eventEndTime) {
if (window.Tooltip && window.Buttons) {
          var timeRemaining = Math.ceil((eventEndTime - now) / 1000); // Segundos restantes
var closeImgs = UFUI.getEntry('wpUploadFormHelpCloseButton', 'uiElements', UFUI.internalLanguage);
          var minutes = Math.floor(timeRemaining / 60);
if (!closeImgs)
          var seconds = timeRemaining % 60;
closeImgs = UFUI.getEntry('wpUploadFormHelpCloseButton', 'uiElements');
          globalEventsTimer.html('Iniciando: ' + pad(minutes) + ":" + pad(seconds));
        } else {
          clearInterval(globalEventsInterval);
          setGlobalEvent();
        }
      }, 1000);
    }


if (closeImgs)
    function setGlobalEvent() {
closeImgs = closeImgs.getElementsByTagName('img');
      var now = getBrazilTime(); // Usa o horário do Brasil
      var dayEvents = globalEventsInfo[now.getDay()];


if (!closeImgs || !closeImgs.length)
      if (!dayEvents || dayEvents.length === 0) {
closeImgs = null;
        globalEventsImage.attr('src', '/images/0/0a/Anyevent.png'); // Imagem padrão
else
        globalEventsTimer.html('Acabaram os eventos por hoje');
closeImgs = Buttons.createClass(closeImgs, 'wpUploadFormHelpCloseClass');
        return;
      }


UFHelp.help_close_imgs = closeImgs;
      for (var i = 0; i < dayEvents.length; i++) {
}
        var event = dayEvents[i];
},
        var timeParts = event.time.split(':');
        var eventStartTime = new Date(
          now.getFullYear(),
          now.getMonth(),
          now.getDate(),
          parseInt(timeParts[0], 10),
          parseInt(timeParts[1], 10),
          parseInt(timeParts[2], 10)
        ).getTime();
        var eventEndTime = eventStartTime + 5 * 60 * 1000; // Evento dura 5 minutos para entrada


tooltip_styles: { // The style for all our tooltips
        if (now >= eventStartTime && now < eventEndTime) {
border: '1px solid #88A',
          // Durante o período de entrada do evento
backgroundColor: '#f7f8ff',
          globalEventsImage.attr('src', event.src);
padding: '0.3em',
          startGlobalEventCountdown(eventStartTime, eventEndTime);
fontSize: ((mw.config.get('skin') === 'monobook' || mw.config.get('skin') === 'modern') ? '127%' : '100%')
          return;
// Scale up to default text size
        }
},


getHelp: function (help_id, with_ext) {
        if (now < eventStartTime) {
// This is a Tooltip callback! Sets the help texts dynamically, depending of the file
          // Antes do evento, exibe o horário fixo
// type the user has chosen in wpDestFile.
          globalEventsImage.attr('src', event.src);
var fn = null;
          globalEventsTimer.html(
if (with_ext) {
            new Date(eventStartTime).toLocaleTimeString('pt-BR', {
fn = document.getElementById('wpDestFile');
              hour: '2-digit',
if (fn)
              minute: '2-digit',
fn = fn.value;
            })
          );


if (fn) {
          // Só inicia a contagem regressiva quando estiver próximo (faltando 5 minutos ou menos)
fn = fn.split('.');
          if (eventStartTime - now <= 5 * 60 * 1000) {
if (fn.length >= 2)
            startGlobalEventCountdown(eventStartTime, eventEndTime);
fn = fn[fn.length - 1];
          }
else
          return;
fn = null;
        }
      }


}
      // Após o último evento do dia
}
      globalEventsImage.attr('src', '/images/0/0a/Anyevent.png'); // Imagem padrão
      globalEventsTimer.html('Acabaram os eventos por hoje');
    }


var add_plea = false;
    $(document).ready(function () {
var extensions = [fn, 'default'];
      setGlobalEvent();
var helpMain = null;
    });
for (var i = 0; i < extensions.length && !helpMain; i++) {
  })();
if (extensions[i] && extensions[i].length) {
  //------- GLOBAL EVENTS TIMER ---------
helpMain = UFUI.getEntry(help_id, 'help', UFUI.internalLanguage, extensions[i]);
  //------- TOOLTIP IMAGE---------
if (!helpMain) {
  /*
helpMain = UFUI.getEntry(help_id, 'help', null, extensions[i]);
      Tooltip image consiste em uma funcionalidade que insere uma tag IMG
add_plea = !!helpMain;
      quando o usuario passa o mouse por cima de uma imagem com a classe "tooltip-image"
}
      ao fazer é inserido no body uma tag IMG com a mesma "src" 1.3 vezes maior do que a imagem
}
      que o usuario está com o mouse em coma, esta tag IMG terá o mesmo X e Y do mouse + um offset
}
      para manter um distanciamento.
var help_base = UFUI.getEntry(help_id, 'help', UFUI.internalLanguage);
  */
if (!help_base) {
help_base = UFUI.getEntry(help_id, 'help');
add_plea = add_plea || !!help_base;
}
var help = document.createElement('div');
if (help_base)
help.appendChild(help_base);


if (helpMain)
  //Distanciamento / margem do mouse
help.appendChild(helpMain);
  const offset = { x: 20, y: 10 };


if (!helpMain && !help_base)
  $('.tooltip-image').on('mouseenter',
help.appendChild(UFUI.getErrorMsg('wpNoHelpTextError'));
    function (e) {
else if (add_plea)
      var src = $(this).attr('src');
help.appendChild(UFUI.plea('help', help_id));
      var size = $(this).width() * 1.3;


return help;
      $('<img src="' + src + '" id="bigImage" />').css('left', e.pageX + offset.x).css('top', e.pageY + offset.y).css('width', size + "px").appendTo('body').hide().fadeIn(500);
},
    }).on('mouseleave',
      function () {
        $('#bigImage').remove();
      });


showHelp: function (e, id) { // Onclick handler for setup without tooltips
  $('.tooltip-image').mousemove(function (e) {
e = e || window.event;
    $('#bigImage').css('left', e.pageX + offset.x).css('top', e.pageY + offset.y);
var node = e.target || e.srcElement,
  });
error;
  //------- TOOLTIP IMAGE---------
if (!node) {
error = UFUI.getErrorMsg('wpNoHelpTextError', true);
// We need the text contents...
while (error && error.nodeType !== Node.TEXT_NODE)
error = error.firstChild;


if (error)
  //------- FUNCIONALIDADES PACIENTES KUREHA ---------
alert(error.data);
  const pacients = {
    "bafo": { image: "/images/c/ce/Bafo_static.png", gif: "/images/e/e0/Bafo.gif" },
    "espirrando": { image: "/images/thumb/5/5b/Espirro_static.png/180px-Espirro_static.png", gif: "/images/thumb/9/90/Espirro.gif/180px-Espirro.gif", audio: "/images/2/2b/Espirrando.ogg" },
    "enjoado": { image: "/images/thumb/5/52/Enjoado_static.png/180px-Enjoado_static.png", gif: "/images/thumb/7/76/Enjoado.gif/180px-Enjoado.gif", audio: "/images/5/5b/Vomito.ogg" },
    "tremendo": { image: "/images/thumb/3/35/Tremendo_static.png/180px-Tremendo_static.png", gif: "/images/thumb/f/f4/Tremendo.gif/180px-Tremendo.gif" },
    "tossindo": { image: "/images/thumb/e/ef/Tosse_static.png/180px-Tosse_static.png", gif: "/images/thumb/a/a4/Tosse.gif/180px-Tosse.gif", audio: "/images/f/f9/Tossindo.ogg" },
    "solucando": { image: "/images/thumb/c/c0/Soluco_static.png/180px-Soluco_static.png", gif: "/images/thumb/6/67/Soluco.gif/180px-Soluco.gif", audio: "/images/e/e2/Solucando.ogg" },
    "funk": { image: "/images/thumb/e/e8/Funkeiro_static.png/180px-Funkeiro_static.png ", gif: "/images/thumb/7/79/Funkeiro.gif/180px-Funkeiro.gif", audio: "/images/d/d2/Funk.ogg" },
    "fedendo": { image: "/images/thumb/1/1e/Fedido_static.png/180px-Fedido_static.png", gif: "/images/thumb/c/c9/Fedido.gif/180px-Fedido.gif" },
    "febre": { image: "/images/thumb/1/14/Febre_static.png/180px-Febre_static.png", gif: "/images/thumb/7/75/Febre.gif/180px-Febre.gif" },
    "endemoniado": { audio: "/images/3/32/Risada_maligna.ogg" },
    "fome": { audio: "/images/3/37/Estomago_roncando.ogg" },
    "cardiaco": { audio: "/images/2/27/Coracao_batendo.ogg" }
  };


// Otherwise what??
  const audioPlayer = document.querySelector("#audio");
} else if (!document.getElementById(id + '_Div')) {
var help = UFHelp.getHelp(id, false);
help.style.fontSize = 'small';
help.style.color = '#666';
// Now add a new table row after the current one
var tr = node.parentNode;
while (tr && tr.nodeName.toLowerCase() !== 'tr')
tr = tr.parentNode;


if (!tr) {
  $(".pacient-audio").on("click", function (e) {
error = UFUI.getErrorMsg('wpNoHelpTextError', true);
    id = $(this).attr('id');
while (error && error.nodeType !== 3)
error = error.firstChild;


if (error)
    if (pacients[id]) {
alert(error.data);
      audioPlayer.src = pacients[id].audio;
      audioPlayer.play();
    }


} else {
  });
var new_tr = document.createElement('tr');
var cell = document.createElement('td');
new_tr.appendChild(cell);
cell = document.createElement('td');
cell.id = id + '_Div';
new_tr.appendChild(cell);
tr.parentNode.insertBefore(new_tr, tr.nextSibling);
cell = UFUtils.convert_td_div(cell);
cell.appendChild(help);
}
}
if (e.stopPropagation) {
e.stopPropagation();
e.preventDefault();
} else { e.cancelBubble = true; }
return false;
},


setupHelp: function (is_reupload) {
  $('.interactive-pacient').on('mouseenter', function (e) {
var fields = ['wpUploadFile', 'wpUploadFileURL', 'wpDestFile', 'wpSource', 'wpAuthor', 'wpDate', 'wpDesc', 'wpPermission',
    id = $(this).attr('id');
'wpOtherVersions', 'wpAdditionalInfo', 'wpPatent', 'wpLicense', 'wpCategories', 'wpWatchthis', 'wpIgnoreWarning'];


if (!UFUI.help)
    if (pacients[id])
return;
      $(this).attr('src', pacients[id].gif);
// Help not loaded
  }).on('mouseleave', function (e) {
    id = $(this).attr('id');


function setHelp(id, imgs, lk, maximum_width, is_reupload) {
    if (pacients[id])
// Figure out where to place the help "button"
      $(this).attr('src', pacients[id].image);
var field = document.getElementById(id);
  });
var insert_in = null,
before = null;
var help_id = id + 'Help';
if (!UFUI.help[help_id])
return;
// Don't add if we have no help at all.
var offset = -5; // Pixels.
switch (id) {
case 'wpWatchthis':
case 'wpIgnoreWarning':
// Right of the element
if (!field)
return;


insert_in = field.parentNode;
  //------- FUNCIONALIDADES PACIENTES KUREHA ---------
// Find the label.
  //------- FUNCIONALIDADES BUZINAS ---------
{
  const horns = {
var lbls = insert_in.getElementsByTagName('label');
    "Buzinadelacucha": { audio: "/images/5/55/Buzinadelacucha-audio.ogg" },
if (!lbls) {
    "Buzinadefumaca": { audio: "/images/3/3a/Buzinadefumaca-audio.ogg" },
before = field.nextSibling;
    "Buzinadecaminhao": { audio: "/images/e/e4/Buzinadecaminhao-audio.ogg" },
} else {
    "Buzinadetrem": { audio: "/images/3/34/Buzinadetrem-audio.ogg" },
for (var i = 0; i < lbls.length; i++) {
    "Buzinadeesporte": { audio: "/images/2/2b/Buzinadeesporte-audio.ogg" },
if (lbls[i].htmlFor && lbls[i].htmlFor === id) {
    "Buzinadear": { audio: "/images/9/95/Buzinadear-audio.ogg" },
before = lbls[i].nextSibling;
    "Buzinadepalhaco": { audio: "/images/a/a4/Buzinadepalhaco-audio.ogg" },
break;
    "Buzinadeinvestida": { audio: "/images/f/ff/Buzinadeinvestida-audio.ogg" },
}
    "Buzinadebicicleta": { audio: "/images/1/15/Buzinadebicicleta-audio.ogg" },
}
    "Buzinadeneblina": { audio: "/images/6/64/Buzinadeneblina-audio.ogg" }
}
  };
}
offset = Math.abs(offset);
break;
case 'wpCategories':
field = document.getElementById('hotcatLabelTranslated');
if (!field)
return;


insert_in = field;
  const hornAudioPlayer = document.querySelector("#audio");
before = null;
if (field.firstChild) {
field = field.firstChild;
offset = Math.abs(offset);
}
break;
case 'wpAuthor':
case 'wpSource':
if (!field)
return;


field = field.parentNode; // Because the field itself may vanish.
  $(".horn-audio").on("click", function (e) {
insert_in = field.parentNode.cells[0];
    const id = $(this).attr('id');
before = null;
    if (horns[id]) {
break;
      hornAudioPlayer.src = horns[id].audio;
case 'wpDestFile':
      hornAudioPlayer.play();
if (!field)
    }
return;
  });


insert_in = field.parentNode.parentNode.cells[0];
  //------- FUNCIONALIDADES BUZINAS ---------
before = null;
});
if (is_reupload) {
help_id = 'wpReuploadDestHelp';
field = null; // Field is hidden: attach the help text to the button instead
}
break;
case 'wpDesc':
if (!field) {
field = document.getElementById('wpUploadDescription');
if (field) { // Basic form
help_id = (is_reupload ? 'wpReuploadSummaryHelp' : 'wpUploadDescriptionHelp');
} else {
insert_in = document.getElementById('wpDescLabel');
if (!insert_in)
return;


field = insert_in;
offset = Math.abs(offset);
before = insert_in.nextSibling;
insert_in = insert_in.parentNode;
break;
}
}
/* falls through */
// eslint-disable-next-line no-fallthrough
case 'wpPatent':
field = document.getElementsByName(id)[0];
if (!field)
return;


insert_in = field.parentNode.parentNode.parentNode.cells[0];
/**
before = null;
* Script JavaScript para o componente de abas MediaWiki
break;
* Adicione este script na sua MediaWiki (Common.js ou página de scripts)
default:
*/
if (!field)
return;


// In the table cell to the left
(function () {
insert_in = field.parentNode.parentNode.cells[0];
  'use strict';
before = null;
}
// Create and insert the help "button"
var button_construct = null,
button = null;
if (imgs && window.Buttons) {
button = Buttons.makeButton(imgs, id + '_HelpButton', '#');
button.style.position = 'relative';
button.style.top = '-0.4em';
button_construct = button;
} else {
button_construct = lk.cloneNode(true);
button = button_construct.getElementsByTagName('a')[0];
}
insert_in.insertBefore(button_construct, before);
if (window.Tooltip) {
// Create the tooltip
new Tooltip(
button,
function () {
return UFHelp.getHelp(help_id, true);
}, {
activate: Tooltip.CLICK,
deactivate: (UFHelp.help_close_imgs ?
Tooltip.CLICK_ELEM :
Tooltip.CLICK_TIP | Tooltip.CLICK_ELEM | Tooltip.LOSE_FOCUS),
close_button: UFHelp.help_close_imgs,
mode: Tooltip.FIXED,
fixed_offset: {
x: 10,
y: offset
},
max_pixels: maximum_width,
target: field,
open_delay: 0,
hide_delay: 0
},
UFHelp.tooltip_styles);
} else {
// Alternative setup without Tooltips: insert help text statically in a table field
// below the button.
button.onclick = function (evt) {
return UFHelp.showHelp(evt, help_id);
};
}
}


var button_imgs = null,
  // Inicializa todos os componentes de abas na página
button_lk = null;
  function initTabbers() {
if (window.Buttons) {
    const tabbers = document.querySelectorAll('[data-tabber]');
button_imgs = UFUI.getEntry('wpUploadFormHelpOpenButton', 'uiElements', UFUI.internalLanguage);
if (!button_imgs)
button_imgs = UFUI.getEntry('wpUploadFormHelpOpenButton', 'uiElements');


button_lk = null;
    tabbers.forEach(function (tabber) {
if (button_imgs)
      const tabs = tabber.querySelectorAll('.mw-tabber-tab');
button_imgs = button_imgs.getElementsByTagName('img');
      const panels = tabber.querySelectorAll('.mw-tabber-panel');


}
      tabs.forEach(function (tab) {
if (!button_imgs || !button_imgs.length) {
        tab.addEventListener('click', function () {
// Alternative text-based "button"
          const targetTab = this.getAttribute('data-tab');
button_lk = document.createElement('sup');
button_lk.appendChild(document.createElement('b'));
button_lk.firstChild.appendChild(document.createTextNode(' ['));
button_lk.firstChild.appendChild(UFUtils.makeLink('?', '#'));
button_lk.firstChild.appendChild(document.createTextNode(']'));
button_imgs = null;
} else {
button_imgs = Buttons.createClass(button_imgs, 'wpUploadFormHelpOpenClass');
}


var widest_field = document.getElementById('wpAdditionalInfo');
          // Remove classe active de todas as abas
var max_width = 0;
          tabs.forEach(function (t) {
if (!widest_field)
            t.classList.remove('active');
widest_field = document.getElementById('wpUploadDescription');
          });


if (widest_field) {
          // Remove classe active de todos os painéis
var w = UFUtils.getWidth(widest_field);
          panels.forEach(function (p) {
try {
            p.classList.remove('active');
max_width = Math.round(w * 0.9);
          });
} catch (ex) {
max_width = 0;
}
}
fields.forEach(function (f) {
setHelp(f, button_imgs, button_lk, max_width, is_reupload);
});
}
}; // end UFHelp


var UFFixes = {
          // Adiciona classe active na aba clicada
fixAutocompletion: function () {
          this.classList.add('active');
// Do the overwrite check also for selections from the browser's "previous entry list"
var destFile = document.getElementById('wpDestFile');
if (destFile && destFile.onkeyup) {
// For some reason, onchange doesn't fire upon autocompletion in FF and IE6. Don't use
// onblur (recommended as a workaround on some Internet sites), it cancels button clicks
// that cause the focus change. Unfortunately, FF also doesn't fire the DOMAttrModified
// event upon autocompletion. Thus we're stuck for FF. At least the FF people are about
// to correct this bug (https://bugzilla.mozilla.org/show_bug.cgi?id=388558). On IE,
// there is a workaround.
if (window.ActiveXObject) { // We're on IE...
// See http://msdn2.microsoft.com/en-us/library/ms533032.aspx and
// http://msdn2.microsoft.com/en-us/library/ms536956.aspx
if (!destFile.onpropertychange) {
var previous_onkeyup_handler = destFile.onkeyup;
var previous_onchange_handler = destFile.onchange;
var handler = function (e) {
e = e || window.event;
if (e && e.propertyName && e.propertyName === 'value') {
if (typeof previous_onkeyup_handler === 'string')
eval(previous_onkeyup_handler);
else if (previous_onkeyup_handler instanceof Function)
previous_onkeyup_handler(e);


if (typeof previous_onchange_handler === 'string')
          // Adiciona classe active no painel correspondente
eval(previous_onchange_handler);
          const targetPanel = tabber.querySelector('[data-panel="' + targetTab + '"]');
else if (previous_onchange_handler instanceof Function)
          if (targetPanel) {
previous_onchange_handler(e);
            targetPanel.classList.add('active');
          }
        });
      });
    });
  }


}
  // Inicializa quando o DOM estiver pronto
};
  if (document.readyState === 'loading') {
if (destFile.addEventListener)
    document.addEventListener('DOMContentLoaded', initTabbers);
destFile.addEventListener('propertychange', handler);
  } else {
else if (destFile.attachEvent)
    initTabbers();
destFile.attachEvent('onpropertychange', handler);
  }
else
return;


destFile.onkeyup = null; // Otherwise, both may fire...
  // Suporte para MediaWiki (quando o conteúdo é carregado dinamicamente)
destFile.onchange = null;
  if (typeof mw !== 'undefined' && mw.hook) {
}
    mw.hook('wikipage.content').add(function () {
} else {
      initTabbers();
$(destFile).change(destFile.onkeyup);
    });
// addEvent (destFile, 'change', destFile.onkeyup);
  }
}
})();
}
}


}; // end UFFixes


var UF = window.UploadForm = {
/* =============================================================================
isInstalled: false, // Set to true when the onload hook runs
  GLA pages legacy (provisório) — personagens, wanted, skills, calc XP, abas
  Extraído de antigo_common.js
  ============================================================================= */


debug: false, // Can be set to true by adding "&debug=true" to the URL
$(document).ready(function () {
  //------- PERSONAGENS ---------


oldOnSubmit: null, // Possibly already existing onsubmit handler
  const characters = [
errorColor: 'lightpink', // The light red from Template:Copyvio
    { name: "Silvers Rayleigh", types: ["slasher", "dps", "diamond", "break_wall"], link: "/Silvers_Rayleigh", img: "/images/f/f1/Rayleigh_Card.png" },
formModified: false,
    { name: "Monkey D Garp", types: ["fighter", "dps", "marine", "diamond", "break_wall"], link: "/Monkey_D_Garp", img: "/images/a/a1/GarpCard.png" },
    { name: "Aokiji Dio", types: ["slasher", "especialist", "tank", "marine", "diamond", "break_wall", "bridge"], link: "/Aokiji", img: "/images/6/67/Aokiji_card.png" },
    { name: "Bartolomew Kuma", types: ["especialist", "tank", "diamond", "break_wall"], link: "/Kuma", img: "/images/b/b5/Card-kuma.png" },
    { name: "Boa Hancock", types: ["fighter", "dps", "diamond"], link: "/Boa_Hancock", img: "/images/4/47/Card-hancock.png" },
    { name: "Borsalino Kizaru", types: ["especialist", "shooter", "dps", "diamond", "break_wall"], link: "/Kizaru", img: "/images/3/32/Card-kizaru.png" },
    { name: "Brook (TS)", types: ["slasher", "support", "diamond", "bridge"], link: "/Brook_(Timeskip)", img: "/images/1/1d/Card-brookts.png" },
    { name: "Tony Tony Chopper (TS) Gurren", types: ["fighter", "support", "diamond", "break_wall"], link: "/Chopper_(Timeskip)", img: "/images/5/53/Card-chopperts.png" },
    { name: "Doflamingo", types: ["shooter", "especialist", "dps", "diamond", "break_wall", "bridge"], link: "/Doflamingo", img: "/images/8/8d/Card-doflamingo.png" },
    { name: "Dracule Mihawk", types: ["slasher", "dps", "diamond", "break_wall"], link: "/Mihawk", img: "/images/9/91/Card-mihawk.png" },
    { name: "Emporio Ivankov", types: ["fighter", "support", "diamond", "break_wall"], link: "/Ivankov", img: "/images/c/ca/Card-ivankov.png" },
    { name: "Enel", types: ["shooter", "especialist", "diamond", "dps"], link: "/Enel", img: "/images/8/85/Enel_card.png" },
    { name: "Franky (TS) Sanitaria", types: ["shooter", "tank", "diamond", "break_wall"], link: "/Franky_(Timeskip)", img: "/images/d/d0/Card-frankyts.png" },
    { name: "Jinbe", types: ["fighter", "tank", "diamond", "break_wall"], link: "/Jinbe", img: "/images/2/2e/Card-jinbe.png" },
    { name: "Marshall D. Teach Barba Negra", types: ["especialist", "bruiser", "diamond"], link: "/Marshall_D._Teach", img: "/images/f/ff/Card-kurohige.png" },
    { name: "Marco Abacaxi", types: ["especialist", "fighter", "support", "diamond"], link: "/Marco", img: "/images/2/2b/Marco_card.png" },
    { name: "Monkey D. Luffy (TS) Visno", types: ["fighter", "dps", "diamond", "break_wall"], link: "/Luffy_(Timeskip)", img: "/images/e/ed/Card-luffyts.png" },
    { name: "Nami (TS)", types: ["especialist", "dps", "diamond"], link: "/Nami_(timeskip)", img: "/images/3/35/Card-namits.png" },
    { name: "Portgas D. Ace Duduh", types: ["especialist", "shooter", "dps", "diamond"], link: "/Ace", img: "/images/4/40/Card-ace.png" },
    { name: "Robin (TS)", types: ["especialist", "dps", "diamond", "break_wall", "bridge"], link: "/Robin_(Timeskip)", img: "/images/b/b0/Card-robints.png" },
    { name: "Roronoa Zoro (TS)", types: ["slasher", "dps", "diamond", "break_wall"], link: "/Zoro_(Timeskip)", img: "/images/7/74/Card-zorots.png" },
    { name: "Sabo", types: ["fighter", "especialist", "dps", "diamond", "break_wall"], link: "/Sabo", img: "/images/0/04/Card-sabo.png" },
    { name: "Sakazuki Akainu", types: ["especialist", "fighter", "dps", "diamond", "break_wall"], link: "/Akainu", img: "/images/b/b0/Card_akainu.png" },
    { name: "Shanks", types: ["slasher", "bruiser", "diamond", "break_wall"], link: "/Shanks", img: "/images/a/aa/Card-shanks.png" },
    { name: "Usopp (TS)", types: ["shooter", "dps", "diamond", "break_wall"], link: "/Usopp_(Timeskip)", img: "/images/c/cc/Card-usoppts.png" },
    { name: "Uta", types: ["especialist", "dps", "diamond", "break_wall"], link: "/Uta", img: "/images/2/22/Card_uta.png" },
    { name: "Vinsmoke Sanji (TS)", types: ["fighter", "dps", "diamond", "break_wall"], link: "/Sanji_(Timeskip)", img: "/images/7/7a/Card-sanjits.png" },


isReupload: false,
    { name: "Kalifa", types: ["support", "gold", "especialist", "break_wall"], link: "/Kalifa", img: "/images/3/39/Kalifa_card.png" },
    { name: "Jabra", types: ["slasher", "dps", "gold", "break_wall"], link: "/Jabra", img: "/images/9/98/Jabra_card.png" },
    { name: "Kaku", types: ["slasher", "shooter", "dps", "gold", "break_wall"], link: "/Kaku", img: "/images/9/98/Kaku_card.png" },
    { name: "Rob Lucci", types: ["fighter", "dps", "gold", "break_wall"], link: "/Rob Lucci", img: "/images/b/b1/Rob_Lucci_card.png" },
    { name: "Blueno", types: ["fighter", "dps", "gold", "break_wall"], link: "/Blueno", img: "/images/5/55/Blueno_card.png" },
    { name: "Marguerite", types: ["shooter", "dps", "gold", "break_wall"], link: "/Marguerite", img: "/images/1/1c/Marguerite_Card.png" },
    { name: "Baby 5", types: ["slasher", "shooter", "gold", "dps"], link: "/Baby_5", img: "/images/5/5e/Baby5_card.png" },
    { name: "Bartolomeo", types: ["especialist", "dps", "gold", "break_wall", "bridge"], link: "/Bartolomeo", img: "/images/a/a9/Card-barto.png" },
    { name: "Basil Hawkins Lost", types: ["especialist", "bruiser", "gold", "bridge"], link: "/Basil_Hawkins", img: "/images/8/89/Card-hawkins.png" },
    { name: "Bastille", types: ["slasher", "tank", "gold", "break_wall"], link: "/Bastille", img: "/images/1/13/Card-bastille.png" },
    { name: "Bellamy", types: ["fighter", "dps", "gold", "break_wall"], link: "/Bellamy", img: "/images/7/7e/Card-bellamy.png" },
    { name: "Bonney Poseidon", types: ["fighter", "support", "gold"], link: "/Bonney", img: "/images/9/91/Card-bonney.png" },
    { name: "Brook", types: ["slasher", "support", "gold"], link: "/brook", img: "/images/7/76/Card-brook.png" },
    { name: "Capone gang bege", types: ["shooter", "dps", "gold", "break_wall"], link: "/Capone_Bege", img: "/images/c/c0/Card-capone.png" },
    { name: "Carrot", types: ["slasher", "especialist", "dps", "gold"], link: "/Carrot", img: "/images/8/8d/Card-carrot.png" },
    { name: "Tony Tony Chopper Gurren", types: ["fighter", "support", "gold", "break_wall"], link: "/Chopper", img: "/images/1/19/Card-chopper.png" },
    { name: "Crocodile", types: ["especialist", "tank", "gold", "break_wall", "bridge"], link: "/Crocodile", img: "/images/5/5d/Card-crocodile.png" },
    { name: "Dalmatian", types: ["slasher", "bruiser", "gold", "break_wall"], link: "/Dalmatian", img: "/images/9/99/Card-dalmatian.png" },
    { name: "Franky Sanitaria", types: ["shooter", "bruiser", "gold", "break_wall"], link: "/Franky", img: "/images/6/61/Card-franky.png" },
    { name: "Gecko Moria Coxinha", types: ["slasher", "support", "gold"], link: "/Gecko_Moria", img: "/images/f/fc/Moria_card.png" },
    { name: "Hina", types: ["fighter", "bruiser", "gold", "break_wall", "bridge"], link: "/Hina", img: "/images/5/57/Card-hina.png" },
    { name: "Jesus Burgess", types: ["fighter", "tank", "gold", "break_wall"], link: "/Jesus_Burgess", img: "/images/2/28/Card-burgess.png" },
    { name: "Eustass Kid Rag", types: ["shooter", "tank", "gold", "break_wall", "bridge"], link: "/Kid", img: "/images/9/9a/Card-kid.png" },
    { name: "Killer", types: ["slasher", "dps", "gold"], link: "/Killer", img: "/images/b/b2/Card-killer.png" },
    { name: "Koala", types: ["fighter", "dps", "gold"], link: "/Koala", img: "/images/f/f3/Card-koala.png" },
    { name: "Leo & Mansherry", types: ["especialist", "support", "gold", "bridge"], link: "/Leo", img: "/images/d/d9/Card-leo.png" },
    { name: "Monkey D. Luffy Visno", types: ["fighter", "bruiser", "gold", "break_wall"], link: "/Luffy", img: "/images/a/af/Card-luffy.png" },
    { name: "Nami", types: ["especialist", "dps", "gold", "break_wall"], link: "/nami", img: "/images/0/08/Card-nami.png" },
    { name: "Perona", types: ["especialist", "support", "gold", "break_wall"], link: "/Perona", img: "/images/6/6d/Card-perona.png" },
    { name: "Rebecca Ghoul Den Berry", types: ["slasher", "tank", "gold"], link: "/Rebecca", img: "/images/9/91/Card-rebecca.png" },
    { name: "Nico Robin", types: ["especialist", "dps", "gold", "break_wall", "bridge"], link: "/Robin", img: "/images/3/3f/Card-robin.png" },
    { name: "Roronoa zoro", types: ["slasher", "bruiser", "gold", "break_wall"], link: "/Roronoa_Zoro", img: "/images/6/6f/Card-zoro.png" },
    { name: "Ryuma", types: ["slasher", "dps", "gold"], link: "/Ryuma", img: "/images/a/ac/Card-ryuma.png" },
    { name: "Scratchmen Apoo", types: ["shooter", "support", "gold"], link: "/Apoo", img: "/images/9/90/Card-apoo.png" },
    { name: "Smoker Piseiro", types: ["fighter", "tank", "gold"], link: "/Smoker", img: "/images/f/fb/Card-smoker.png" },
    { name: "Trafalgar Law", types: ["slasher", "especialist", "dps", "gold", "break_wall"], link: "/Trafalgar_Law", img: "/images/b/b9/Card-law.png" },
    { name: "Urouge", types: ["fighter", "tank", "gold", "break_wall"], link: "/Urouge", img: "/images/9/98/Card-urouge.png" },
    { name: "Usopp", types: ["shooter", "dps", "gold", "break_wall"], link: "/Usopp", img: "/images/a/ac/Card-usopp.png" },
    { name: "Van Augur", types: ["shooter", "dps", "gold", "break_wall"], link: "/Van Augur", img: "/images/c/c7/Card-vanaugur.png" },
    { name: "Vinsmoke Ichiji", types: ["fighter", "bruiser", "gold", "break_wall"], link: "/Ichiji", img: "/images/8/8c/Card-ichiji.png" },
    { name: "Vinsmoke Niji", types: ["shooter", "dps", "gold"], link: "/Niji", img: "/images/6/66/Card-niji.png" },
    { name: "Vinsmoke Reiju Athena", types: ["especialist", "support", "gold"], link: "/Reiju", img: "/images/2/23/Card-reiju.png" },
    { name: "Vinsmoke Sanji", types: ["fighter", "dps", "gold", "break_wall"], link: "/Sanji", img: "/images/0/04/Card-sanji.png" },
    { name: "Vinsmoke Yonji", types: ["fighter", "tank", "gold", "break_wall"], link: "/Yonji", img: "/images/7/73/Card-yonji.png" },
    { name: "X-drake", types: ["fighter", "bruiser", "gold", "break_wall"], link: "/X_Drake", img: "/images/6/69/Card-drake.png" },
    { name: "Satori", types: ["support", "shooter", "especialist", "silver"], link: "/Satori", img: "/images/f/f3/Satori_card.png" },
    { name: "Gedatsu", types: ["fighter", "dps", "silver"], link: "/Gedatsu", img: "/images/f/f6/Gedatsu_card.png" },
    { name: "Ohm", types: ["tank", "slasher", "silver"], link: "/Ohm", img: "/images/1/1e/Ohm_card.png" },
    { name: "Shura", types: ["slasher", "dps", "silver"], link: "/Shura", img: "/images/2/2e/Shura_card.png" },
    { name: "Arlong", types: ["fighter", "bruiser", "silver", "break_wall"], link: "/Arlong", img: "/images/1/1e/Card-arlong.png" },
    { name: "Bepo", types: ["fighter", "dps", "silver"], link: "/Bepo", img: "/images/1/1d/Card-bepo.png" },
    { name: "Mr.2", types: ["fighter", "dps", "silver"], link: "/mr.2", img: "/images/2/27/Card-bonchan.png" },
    { name: "Buggy", types: ["shooter", "dps", "silver", "break_wall"], link: "/buggy", img: "/images/c/ca/Card-buggy.png" },
    { name: "Daddy Masterson", types: ["shooter", "dps", "silver"], link: "/Daddy_Masterson", img: "/images/2/20/Card-daddy.png" },
    { name: "mr.1 Daz Bonez Kolivier", types: ["slasher", "tank", "silver"], link: "/mr.1", img: "/images/6/61/Card-dazbonez.png" },
    { name: "Miss Doublefinger Zala", types: ["slasher", "bruiser", "silver"], link: "/Miss_Doublefinger", img: "/images/5/5f/Card-doublefinger.png" },
    { name: "Don Krieg", types: ["shooter", "dps", "silver"], link: "/don_Krieg", img: "/images/8/8f/Card-krieg.png" },
    { name: "Kuro", types: ["slasher", "dps", "silver"], link: "/kuro", img: "/images/3/3d/Card-kuro.png" },
    { name: "mr.3 Galdino", types: ["especialist", "support", "silver", "bridge"], link: "/mr.3", img: "/images/7/75/Card-mr3.png" },
    { name: "Tashigi", types: ["slasher", "dps", "silver"], link: "/tashigi", img: "/images/b/b8/Card-tashigi.png" },
    { name: "Nefertari Vivi", types: ["slasher", "support", "silver"], link: "/Vivi", img: "/images/9/9c/Card-vivi.png" },
    { name: "Wapol", types: ["shooter", "tank", "silver", "break_wall"], link: "/wapol", img: "/images/b/ba/Card-wapol.png" },
    { name: "Alvida", types: ["fighter", "support", "bronze"], link: "/Alvida", img: "/images/8/83/Card-alvida.png" },
    { name: "Buchi & Sham", types: ["slasher", "bruiser", "bronze"], link: "/Buchi", img: "/images/0/0b/Card-buchi.png" },
    { name: "Cabaji", types: ["slasher", "dps", "bronze"], link: "/Cabaji", img: "/images/9/9d/Card-cabaji.png" },
    { name: "Chew", types: ["shooter", "dps", "bronze", "break_wall"], link: "/Chew", img: "/images/0/0f/Card-chew.png" },
    { name: "Eric", types: ["shooter", "slasher", "dps", "bronze"], link: "/Eric", img: "/images/3/31/Card-eric.png" },
    { name: "Gin", types: ["fighter", "shooter", "dps", "bronze"], link: "/Gin", img: "/images/1/18/Card-gin.png" },
    { name: "Miss Goldenweek", types: ["support", "especialist", "bronze"], link: "/Goldenweek", img: "/images/0/0e/Card-goldenweek.png" },
    { name: "Hatchan", types: ["slasher", "support", "bronze"], link: "/Hatchan", img: "/images/3/31/Card-hatchan.png" },
    { name: "Jango", types: ["shooter", "support", "bronze"], link: "/Jango", img: "/images/4/48/Card-jango.png" },
    { name: "Kuroobi", types: ["fighter", "tank", "bronze", "break_wall"], link: "/Kuroobi", img: "/images/6/6a/Card-kuroobi.png" },
    { name: "Mohji", types: ["especialist", "bruiser", "bronze"], link: "/Mohji", img: "/images/5/58/Card-mohji.png" },
    { name: "Morgan", types: ["slasher", "bruiser", "bronze"], link: "/Morgan", img: "/images/4/43/Card-morgan.png" },
    { name: "Mr.4", types: ["shooter", "bruiser", "bronze"], link: "/Mr.4", img: "/images/9/90/Card-mr4.png" },
    { name: "Mr.5", types: ["shooter", "dps", "bronze"], link: "/Mr.5", img: "/images/4/49/Card-mr5.png" },
    { name: "Pearl", types: ["fighter", "especialist", "tank", "bronze"], link: "/Pearl", img: "/images/d/de/Card-pearl.png" },
  ];


setup_hotcat_label: function () {
  $(".filter--icon").on("click", function () {
// If HotCat is present, translate its label if we can find it
    const id = $(this).attr("id");
var hotcatLabelCell = document.getElementById('hotcatLabel');
if (hotcatLabelCell) {
// Change its ID, just to be sure
hotcatLabelCell.setAttribute('id', 'hotcatLabelTranslated');
// Assumes that the cell has only one child (which is normally the case)
hotcatLabelCell.replaceChild(
UFUI.getLabel('wpCategoriesUploadLbl'),
hotcatLabelCell.firstChild);
}
},


setup_error_display: function () {
    if ($(this).hasClass("all")) {
var warningCell = document.getElementById('wpDestFile-warning');
      $('.filter--icon.active').removeClass('active');
if (!warningCell)
      $(".characters").addClass('show');
return;
      $(".filter--icon.all").addClass('active');
      return false;
    } else {
      $(".filter--icon.all").removeClass('active');
    }


var row = warningCell.parentNode;
    if ($(this).hasClass("active")) {
var new_cell = document.createElement('td');
      $(this).removeClass('active');
new_cell.style.padding = '0';
      actives = $('.filter--icon.active');
// Remove the colspan, if any, and insert a new cell to the left
      query = "";
warningCell.colspan = '';
warningCell.padding = '0';
row.insertBefore(new_cell, warningCell);
UFUtils.convert_td_div(warningCell);
},


set_fields_enabled: function (enabled, except) {
      $.each(actives, function (key, item) {
// Enables or disables all named fields in the form, except those whose ids are
        query += "[data-type-" + item.id + "]";
// listed in except
      });
var skip = except.join(' ');
var elems = UF.the_form.elements;
var changed = false;
for (var i = 0; i < elems.length; i++) {
if (elems[i].type === 'hidden')
continue;
// Don't fool around with hidden elements
var id = elems[i].id;
if (!id || !id.length)
id = elems[i].name;


if (id && id.length) {
      $(".characters" + query).addClass('show');
if (skip.indexOf(id) < 0) {
    } else {
if (elems[i].disabled === enabled) {
      if ($(this).hasClass("tier")) {
changed = true;
        $('.filter--icon.tier.active').removeClass('active');
if (elems[i].type === 'text' || elems[i].type === 'textarea') {
      }
// Set the background. Actually, I'd like to just reset it to whatever the
// default was, but setting it to null doesn't do anything in IE6... We
// force a light gray for disabled fields since IE6 doesn't have a real
// visual "disabled" indicator for input fields.
try {
elems[i].style.backgroundColor = (enabled ? '#FFF' : '#EEE');
} catch (some_error) {
// Swallow
}
}
elems[i].disabled = !enabled;
}
}
}
}
if (changed) {
// Clear warning messages. If we disabled fields, they're obsolete; if we enabled fields,
// new warnings will be generated upon submit if necessary.
var myWarning = document.getElementById('wpUploadVerifyWarning');
if (myWarning)
myWarning.style.display = 'none';


}
      $(this).addClass('active');
},
      $(".characters").removeClass('show');
      query = "";
      actives = $('.filter--icon.active');


previous_hotcat_state: null,
      $.each(actives, function (key, item) {
        query += "[data-type-" + item.id + "]";
      });


getPrevValue: function (storedForm, element_id) {
      $(".characters" + query).addClass('show');
// Return a field's previous value, if known
    }
if (!storedForm || storedForm.length <= 1 || !element_id || !element_id.length)
  });
return null;


for (var i = 1; i < storedForm.length; i++) {
  $.each(characters, function (key, item) {
if (storedForm[i] && element_id === storedForm[i].id)
    data = '';
return storedForm[i].val;
    id = item.name.replace(/\s/g, '_').toLowerCase();


}
    $.each(item.types, function (key, value) {
return null;
      data += "data-type-" + value + " ";
},
    });


license_button: null,
    $("#characters-container").append(
license_button_shown: false,
      "<div id=" + id + " class='characters show' " + data + " >" +
current_license_preview: '&nbsp;',
      "<a href='https://wiki.gla.com.br/index.php" + item.link + "'>" +
      "<img src='" + item.img + "' alt='imagem de " + item.name + "' />" +
      "</a>" +
      "</div>"
    );
  });


get_license_preview: function () { // Tooltip callback
  $(".filter--searchButton").on("click", function () {
var div = document.createElement('div');
    $(".filter--icon.active").removeClass('active');
div.style.display = 'none';
    $(".characters.show").removeClass('show');
document.body.appendChild(div);
    if ($("#f-input").val().toLowerCase() != '') {
div.innerHTML = UF.current_license_preview;
      $(".characters[id*=" + $("#f-input").val().toLowerCase() + "]").addClass('show');
document.body.removeChild(div);
    } else {
div.style.fontSize = 'smaller';
      $(".characters").addClass('show');
div.style.display = '';
    }
var wrapper = document.createElement('div');
  });
wrapper.appendChild(div);
return wrapper;
},


create_license_button: function () {
  $('#f-input').keypress(function (e) {
// Will be called only from our rewritten wgUploadLicenseObj.showPreview, i.e.
    const key = e.which;
// we *know* that we *do* have Tooltips and Buttons here.
    if (key == 13)  // the enter key code
var previewButton = UF.customFormButton(
    {
'wpUploadFormPreviewLicenseButton', // Customization ID
      $('.filter--searchButton').click();
'wpUploadPreviewLicense', // ID of button
      return false;
null, // Default text
    }
null, // Event handler, will be set below
  });
'wpPreviewLicenseUploadLbl' // default label ID
);
new Tooltip(
previewButton,
UF.get_license_preview, {
activate: Tooltip.CLICK,
deactivate: (UFHelp.help_close_imgs ?
Tooltip.CLICK_ELEM :
Tooltip.CLICK_TIP | Tooltip.CLICK_ELEM | Tooltip.LOSE_FOCUS),
close_button: UFHelp.help_close_imgs,
mode: Tooltip.FIXED,
anchor: Tooltip.TOP_LEFT,
fixed_offset: {
x: 10,
y: 5,
dy: -1
},
open_delay: 0,
hide_delay: 0
},
UFHelp.tooltip_styles);
UF.license_button = previewButton;
},


setup_license_preview: function () {
  //------- PERSONAGENS ---------
var preview_panel = document.getElementById('mw-license-preview');
if (preview_panel)
UFUtils.convert_td_div(preview_panel);


// Change the license previewer to not overwrite our warning message, if any.
  //------- WANTED ---------
if (window.wgUploadLicenseObj && wgUploadLicenseObj.showPreview && window.Tooltip) {
  const wanted_slashers = [
wgUploadLicenseObj.showPreview = function (preview) {
    { name: "Baby 5", wanteds: ["nami", "usopp", "mr. 3", "jango"], img: "/images/5/5e/Baby5_card.png" },
var preview_panel = document.getElementById('mw-license-preview');
    { name: "Ohm", wanteds: ["robin", "nami", "brook", "zoro", "luffy", "sanji", "urouge", "ryuma", "van augur", "law", "niji", "crocodile", "cabaji"], img: "/images/1/1e/Ohm_card.png" },
if (!preview_panel)
    { name: "Roronoa Zoro", wanteds: ["robin", "nami", "brook", "chopper", "franky", "luffy", "sanji", "perona", "usopp", "capone", "kid", "van augur", "law", "yonji", "ichiji", "mr. 1", "mr. 2", "mr. 3", "mr. 4", "mr. 5", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "koala", "buggy", "gin", "mohji", "drake", "alvida", "wapol", "crocodile", "cabaji"], img: "/images/6/6f/Card-zoro.png" },
return;
    { name: "Shanks", wanteds: ["robin", "nami", "brook", "franky", "zoro", "luffy", "sanji", "bonney", "leo", "apoo", "rebecca", "usopp", "ryuma", "killer", "burgess", "capone", "kid", "van augur", "law", "yonji", "niji", "ichiji", "baby 5", "mr. 1", "mr. 2", "mr. 3", "doublefinger", "goldenweek", "mr. 4", "bepo", "pearl", "arlong", "hatchan", "chew", "jango", "kuroobi", "koala", "buggy", "kuro", "gin", "krieg", "mohji", "morgan", "drake", "hawkins", "alvida", "wapol", "crocodile", "bellamy"], img: "/images/a/aa/Card-shanks.png" },
    { name: "Dracule Mihawk", wanteds: ["robin", "nami", "chopper", "luffy", "sanji", "bonney", "leo", "apoo", "urouge", "perona", "usopp", "ryuma", "capone", "van augur", "law", "reiju", "yonji", "niji", "ichiji", "baby 5", "mr. 2", "mr. 3", "doublefinger", "goldenweek", "mr. 4", "pearl", "arlong", "hatchan", "chew", "jango", "kuroobi", "buggy", "kuro", "krieg", "mohji", "morgan", "hawkins", "alvida", "crocodile"], img: "/images/9/91/Card-mihawk.png" },
    { name: "Killer", wanteds: ["rebecca", "van augur", "pearl", "jango", "buggy", "alvida"], img: "/images/b/b2/Card-killer.png" },
    { name: "Tashigi", wanteds: ["chopper", "zoro", "luffy", "sanji", "bonney", "urouge", "perona", "ryuma", "killer", "burgess", "kid", "reiju", "yonji", "baby 5", "mr. 1", "mr. 2", "mr. 4", "pearl", "arlong", "hatchan", "buchi", "jango", "kuroobi", "koala", "kuro", "gin", "mohji", "morgan", "alvida", "wapol", "crocodile", "cabaji"], img: "/images/b/b8/Card-tashigi.png" },
    { name: "Roronoa Zoro (TS)", wanteds: ["chopper", "leo", "perona", "usopp", "capone", "mr. 3", "goldenweek", "pearl", "hatchan", "buchi", "jango", "buggy", "alvida"], img: "/images/7/74/Card-zorots.png" },
    { name: "Rebbeca", wanteds: ["franky", "luffy", "sanji", "urouge", "usopp", "ryuma", "killer", "capone", "van augur", "law", "yonji", "niji", "mr. 2", "doublefinger", "mr. 4", "pearl", "arlong", "buchi", "chew", "jango", "kuroobi", "buggy", "kuro", "gin", "krieg", "morgan", "drake", "alvida"], img: "/images/9/91/Card-rebecca.png" },
    { name: "Carrot", wanteds: ["nami", "chopper", "luffy", "sanji", "leo", "leo", "usopp", "capone", "kid", "van augur", "law", "niji", "ichiji", "mr. 3", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "krieg", "mohji", "drake", "alvida"], img: "/images/8/8d/Card-carrot.png" },
    { name: "Shimotsuki Ryuma", wanteds: ["nami", "brook", "chopper", "franky", "sanji", "leo", "urouge", "perona", "capone", "law", "reiju", "yonji", "niji", "baby 5", "doublefinger", "goldenweek", "mr. 4", "bepo", "pearl", "hatchan", "buchi", "chew", "jango", "kuroobi", "koala", "buggy", "gin", "mohji", "morgan", "drake", "alvida", "crocodile"], img: "/images/a/ac/Card-ryuma.png" },
    { name: "Trafalgar Law", wanteds: ["luffy", "sanji", "leo", "apoo", "usopp", "kid", "reiju", "yonji", "niji", "ichiji", "baby 5", "doublefinger", "mr. 4", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "buggy", "krieg", "drake", "alvida"], img: "/images/b/b9/Card-law.png" },
    { name: "Mr. 1", wanteds: ["chopper", "perona", "killer", "capone", "law", "niji", "baby 5", "mr. 2", "doublefinger", "mr. 4", "bepo", "pearl", "arlong", "buchi", "chew", "jango", "kuroobi", "kuro", "krieg", "mohji", "morgan", "alvida", "wapol", "crocodile"], img: "/images/6/61/Card-dazbonez.png" },
    { name: "Bastille", wanteds: ["chopper", "zoro", "law", "doublefinger", "mr. 4", "arlong", "buchi", "kuro", "gin", "alvida", "bellamy"], img: "/images/1/13/Card-bastille.png" },
    { name: "Dalmatian", wanteds: ["capone", "mr. 2", "pearl", "arlong", "buchi", "chew", "jango", "kuroobi", "mohji", "morgan", "alvida", "crocodile"], img: "/images/9/99/Card-dalmatian.png" },
    { name: "Morgan", wanteds: ["robin", "nami", "leo", "van augur", "baby 5", "goldenweek", "buchi", "chew", "jango", "alvida"], img: "/images/4/43/Card-morgan.png" },
    { name: "Cabaji", wanteds: ["nami", "chopper", "chew", "jango", "alvida"], img: "/images/9/9d/Card-cabaji.png" },
    { name: "Kuro", wanteds: ["nami", "pearl", "hatchan", "buchi", "jango", "koala", "krieg", "mohji", "alvida", "bellamy"], img: "/images/3/3d/Card-kuro.png" },
    { name: "Eric", wanteds: ["nami", "brook", "apoo", "usopp", "reiju", "mr. 3", "goldenweek", "mr. 5", "jango", "buggy", "alvida"], img: "/images/3/31/Card-eric.png" },
    { name: "Miss Doublefinger", wanteds: ["chopper", "luffy", "sanji", "urouge", "rebecca", "perona", "usopp", "burgess", "capone", "kid", "reiju", "yonji", "pearl", "hatchan", "buchi", "jango", "kuroobi", "mohji", "alvida", "wapol"], img: "/images/5/5f/Card-doublefinger.png" },
  ];


if (preview === UF.current_license_preview)
  const wanted_shooters = [
return;
    { name: "Baby 5", wanteds: ["nami", "usopp", "mr. 3", "jango"], img: "/images/5/5e/Baby5_card.png" },
    { name: "Daddy Masterson", wanteds: ["robin", "nami", "apoo", "apoo", "usopp", "niji", "mr. 3", "goldenweek", "mr. 5", "chew", "jango", "buggy", "krieg"], img: "/images/2/20/Card-daddy.png" },
    { name: "Enel", wanteds: ["robin", "usopp", "jango", "cabaji"], img: "/images/8/85/Enel_card.png" },
    { name: "Capone Gang Bege", wanteds: ["robin", "nami", "brook", "chopper", "franky", "luffy", "sanji", "leo", "apoo", "rebecca", "usopp", "killer", "burgess", "van augur", "law", "reiju", "yonji", "niji", "ichiji", "baby 5", "mr. 2", "mr. 3", "goldenweek", "mr. 4", "mr. 5", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "koala", "buggy", "kuro", "krieg", "mohji", "morgan", "alvida", "alvida", "wapol", "crocodile", "cabaji"], img: "/images/c/c0/Card-capone.png" },
    { name: "Franky", wanteds: ["robin", "nami", "brook", "chopper", "franky", "zoro", "luffy", "sanji", "leo", "urouge", "usopp", "ryuma", "burgess", "capone", "kid", "van augur", "law", "yonji", "niji", "ichiji", "baby 5", "mr. 1", "mr. 2", "doublefinger", "mr. 4", "mr. 5", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "koala", "buggy", "kuro", "gin", "mohji", "morgan", "hawkins", "alvida", "crocodile", "cabaji"], img: "/images/6/61/Card-franky.png" },
    { name: "Eustass kid", wanteds: ["chopper", "luffy", "usopp", "kid", "baby 5", "mr. 1", "mr. 2", "doublefinger", "mr. 4", "pearl", "buchi", "gin", "hawkins", "alvida", "crocodile"], img: "/images/9/9a/Card-kid.png" },
    { name: "Van Augur", wanteds: ["robin", "nami", "brook", "chopper", "franky", "luffy", "bonney", "leo", "apoo", "urouge", "usopp", "killer", "capone", "van augur", "law", "reiju", "yonji", "niji", "ichiji", "baby 5", "mr. 2", "mr. 3", "goldenweek", "mr. 5", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "koala", "buggy", "krieg", "mohji", "morgan", "drake", "alvida", "wapol", "cabaji"], img: "/images/c/c7/Card-vanaugur.png" },
    { name: "Portgas D. Ace", wanteds: ["nami", "brook", "chopper", "bonney", "leo", "apoo", "perona", "usopp", "kid", "van augur", "niji", "mr. 3", "mr. 5", "bepo", "arlong", "buchi", "chew", "jango", "kuroobi", "buggy", "krieg", "mohji"], img: "/images/4/40/Card-ace.png" },
    { name: "Usopp (TS)", wanteds: ["brook", "chopper", "leo", "apoo", "perona", "usopp", "van augur", "niji", "mr. 3", "goldenweek", "mr. 5", "hatchan", "chew", "jango", "buggy", "krieg", "alvida"], img: "/images/c/cc/Card-usoppts.png" },
    { name: "Donquixote Doflamingo", wanteds: ["robin", "nami", "brook", "chopper", "franky", "zoro", "luffy", "sanji", "bonney", "leo", "apoo", "urouge", "perona", "usopp", "ryuma", "killer", "burgess", "capone", "kid", "van augur", "law", "reiju", "yonji", "niji", "ichiji", "mr. 2", "mr. 3", "doublefinger", "goldenweek", "mr. 4", "bepo", "pearl", "arlong", "hatchan", "buchi", "jango", "kuroobi", "koala", "buggy", "gin", "krieg", "mohji", "morgan", "drake", "alvida"], img: "/images/8/8d/Card-doflamingo.png" },
    { name: "Buggy", wanteds: ["nami", "chopper", "bonney", "apoo", "perona", "usopp", "van augur", "baby 5", "mr. 4", "mr. 5", "pearl", "arlong", "buchi", "chew", "jango", "kuroobi", "krieg", "mohji", "alvida", "cabaji"], img: "/images/c/ca/Card-buggy.png" },
    { name: "Vinsmoke Niji", wanteds: ["nami", "apoo", "van augur", "reiju", "mr. 3", "mr. 5", "buchi", "jango", "buggy", "krieg", "alvida"], img: "/images/6/66/Card-niji.png" },
    { name: "Wapol", wanteds: ["robin", "nami", "brook", "chopper", "zoro", "luffy", "sanji", "urouge", "rebecca", "perona", "ryuma", "killer", "burgess", "kid", "law", "reiju", "yonji", "ichiji", "baby 5", "mr. 1", "doublefinger", "mr. 4", "pearl", "arlong", "buchi", "jango", "kuroobi", "kuro", "mohji", "morgan", "hawkins", "wapol", "crocodile"], img: "/images/b/ba/Card-wapol.png" },
    { name: "Franky (TS)", wanteds: ["chopper", "zoro", "usopp", "capone", "kid", "yonji", "mr. 1", "doublefinger", "mr. 4", "pearl", "arlong", "buchi", "kuro", "alvida"], img: "/images/d/d0/Card-frankyts.png" },
    { name: "Borsalino Kizaru", wanteds: ["capone", "jango", "drake", "alvida"], img: "/images/3/32/Card-kizaru.png" },
    { name: "Don Krieg", wanteds: ["brook", "chopper", "apoo", "capone", "reiju", "goldenweek", "mr. 5", "hatchan", "buchi", "chew", "jango", "buggy", "drake", "alvida"], img: "/images/8/8f/Card-krieg.png" },
    { name: "Eric", wanteds: ["nami", "brook", "apoo", "usopp", "reiju", "mr. 3", "goldenweek", "mr. 5", "jango", "buggy", "alvida"], img: "/images/3/31/Card-eric.png" },
    { name: "Mr. 4", wanteds: ["chopper", "zoro", "bonney", "goldenweek", "buchi", "jango", "morgan"], img: "/images/9/90/Card-mr4.png" },
    { name: "Mr. 5", wanteds: ["brook", "sanji", "bonney", "goldenweek", "jango", "kuroobi"], img: "/images/4/49/Card-mr5.png" },
    { name: "Gin", wanteds: ["chopper", "capone", "van augur", "baby 5", "mr. 3", "goldenweek", "bepo", "buchi", "gin", "krieg", "mohji", "drake", "alvida", "cabaji"], img: "/images/1/18/Card-gin.png" },
    { name: "Chew", wanteds: ["mr. 5"], img: "/images/0/0f/Card-chew.png" },
    { name: "Usopp", wanteds: ["nami", "brook", "chopper", "leo", "apoo", "reiju", "niji", "mr. 3", "mr. 5", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "buggy", "krieg", "alvida", "wapol"], img: "/images/a/ac/Card-usopp.png" },
  ];


UF.current_license_preview = preview;
  const wanted_fighters = [
var contents = null;
    { name: "Sabo", wanteds: ["nami", "niji", "mr. 2", "mr. 3", "goldenweek", "mr. 4", "mr. 5", "bepo", "pearl", "arlong", "buchi", "chew", "jango", "kuroobi", "koala", "buggy", "kuro", "gin", "krieg", "mohji", "cabaji"], img: "/images/0/04/Card-sabo.png" },
var new_state = false;
    { name: "X-Drake", wanteds: ["robin", "brook", "chopper", "franky", "zoro", "sanji", "bonney", "leo", "apoo", "urouge", "rebecca", "usopp", "ryuma", "killer", "burgess", "capone", "kid", "van augur", "law", "reiju", "yonji", "ichiji", "baby 5", "mr. 1", "mr. 3", "doublefinger", "mr. 5", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "koala", "buggy", "kuro", "gin", "krieg", "mohji", "morgan", "drake", "hawkins", "alvida", "wapol", "crocodile", "cabaji", "bellamy"], img: "/images/6/69/Card-drake.png" },
if (!preview || !preview.length || preview === '&nbsp;') {
    { name: "Hina", wanteds: ["robin", "brook", "chopper", "franky", "zoro", "luffy", "sanji", "leo", "urouge", "rebecca", "perona", "usopp", "ryuma", "killer", "burgess", "capone", "kid", "van augur", "reiju", "yonji", "ichiji", "baby 5", "mr. 1", "mr. 3", "doublefinger", "mr. 5", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "koala", "buggy", "kuro", "gin", "krieg", "mohji", "morgan", "drake", "hawkins", "alvida", "wapol", "crocodile", "cabaji"], img: "/images/5/57/Card-hina.png" },
contents = document.createTextNode('\xa0'); // a single &nbsp;
    { name: "Smoker", wanteds: ["robin", "nami", "zoro", "luffy", "urouge", "capone", "van augur", "law", "baby 5", "mr. 1", "mr. 2", "mr. 3", "mr. 5", "krieg", "alvida"], img: "/images/f/fb/Card-smoker.png" },
new_state = false;
    { name: "Bellamy", wanteds: ["nami", "brook", "chopper", "zoro", "luffy", "sanji", "apoo", "urouge", "rebecca", "ryuma", "burgess", "van augur", "law", "yonji", "ichiji", "baby 5", "mr. 1", "mr. 2", "doublefinger", "goldenweek", "mr. 4", "bepo", "pearl", "arlong", "buchi", "jango", "kuroobi", "koala", "gin", "krieg", "mohji", "morgan", "drake", "hawkins", "alvida", "wapol", "crocodile", "cabaji"], img: "/images/7/7e/Card-bellamy.png" },
} else {
    { name: "Urouge", wanteds: ["nami", "sanji", "apoo", "usopp", "capone", "chew"], img: "/images/9/98/Card-urouge.png" },
if (!UF.license_button)
    { name: "Boa Hancock", wanteds: ["robin", "nami", "brook", "chopper", "franky", "zoro", "luffy", "sanji", "leo", "urouge", "perona", "usopp", "ryuma", "burgess", "capone", "van augur", "law", "reiju", "yonji", "ichiji", "baby 5", "mr. 1", "mr. 3", "mr. 5", "bepo", "arlong", "hatchan", "chew", "jango", "kuroobi", "buggy", "kuro", "gin", "krieg", "mohji", "morgan", "drake", "hawkins", "alvida", "wapol", "crocodile", "cabaji", "bellamy"], img: "/images/4/47/Card-hancock.png" },
UF.create_license_button();
    { name: "VinsmokeYonji", wanteds: ["mr. 4", "kuro"], img: "/images/7/73/Card-yonji.png" },
    { name: "Vinsmoke Ichiji", wanteds: ["robin", "nami", "brook", "sanji", "apoo", "urouge", "rebecca", "usopp", "capone", "ichiji", "baby 5", "mr. 3", "mr. 5", "bepo", "pearl", "arlong", "buchi", "chew", "jango", "kuroobi", "koala", "buggy", "kuro", "gin", "hawkins", "alvida", "wapol", "crocodile", "cabaji"], img: "/images/8/8c/Card-ichiji.png" },
    { name: "Mr. 2", wanteds: ["bonney", "usopp", "hatchan", "krieg", "alvida"], img: "/images/2/27/Card-bonchan.png" },
    { name: "Vinsmoke Sanji (TS)", wanteds: ["nami", "chopper", "usopp", "law", "mr. 2", "doublefinger", "mr. 4", "mr. 5", "bepo", "pearl", "buchi", "chew", "jango", "koala", "buggy", "krieg", "mohji", "morgan", "alvida", "wapol", "cabaji"], img: "/images/7/7a/Card-sanjits.png" },
    { name: "Monkey D. Luffy (TS)", wanteds: ["robin", "nami", "brook", "chopper", "franky", "zoro", "luffy", "sanji", "leo", "apoo", "urouge", "rebecca", "perona", "usopp", "ryuma", "killer", "burgess", "kid", "law", "yonji", "niji", "ichiji", "mr. 1", "mr. 2", "doublefinger", "goldenweek", "mr. 4", "mr. 5", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "buggy", "kuro", "gin", "mohji", "morgan", "drake", "hawkins", "alvida", "wapol", "crocodile", "cabaji"], img: "/images/e/ed/Card-luffyts.png" },
    { name: "Koala", wanteds: ["robin", "nami", "brook", "franky", "zoro", "luffy", "sanji", "leo", "apoo", "urouge", "usopp", "killer", "burgess", "capone", "van augur", "law", "reiju", "yonji", "mr. 1", "mr. 2", "doublefinger", "mr. 4", "bepo", "pearl", "arlong", "chew", "jango", "kuroobi", "koala", "buggy", "kuro", "gin", "krieg", "mohji", "morgan", "drake", "hawkins", "alvida", "crocodile", "cabaji", "bellamy"], img: "/images/f/f3/Card-koala.png" },
    { name: "Burgess", wanteds: ["robin", "nami", "brook", "franky", "zoro", "luffy", "sanji", "rebecca", "usopp", "ryuma", "killer", "burgess", "capone", "kid", "van augur", "law", "yonji", "niji", "ichiji", "mr. 1", "mr. 2", "doublefinger", "mr. 4", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "kuroobi", "koala", "buggy", "kuro", "gin", "hawkins", "alvida", "wapol", "crocodile", "cabaji"], img: "/images/2/28/Card-burgess.png" },
    { name: "Monkey D. Luffy", wanteds: ["brook", "chopper", "franky", "sanji", "leo", "usopp", "burgess", "kid", "law", "mr. 1", "mr. 2", "mr. 4", "mr. 5", "pearl", "arlong", "hatchan", "chew", "jango", "kuroobi", "koala", "buggy", "morgan", "alvida", "wapol", "cabaji"], img: "/images/a/af/Card-luffy.png" },
    { name: "Bepo", wanteds: ["zoro", "luffy", "sanji", "pearl", "arlong", "buchi", "kuro", "mohji", "morgan", "drake", "alvida"], img: "/images/1/1d/Card-bepo.png" },
    { name: "Vinsmoke Sanji", wanteds: ["brook", "chopper", "usopp", "kid", "mr. 4", "mr. 5", "pearl", "hatchan", "buchi", "chew", "jango", "kuroobi", "buggy", "gin", "morgan", "hawkins", "alvida", "wapol", "crocodile", "cabaji"], img: "/images/0/04/Card-sanji.png" },
    { name: "Arlong", wanteds: ["mr. 2", "chew", "alvida"], img: "/images/1/1e/Card-arlong.png" },
    { name: "Gin", wanteds: ["chopper", "capone", "van augur", "baby 5", "mr. 3", "goldenweek", "bepo", "buchi", "gin", "krieg", "mohji", "drake", "alvida", "cabaji"], img: "/images/1/18/Card-gin.png" },
  ];


if (!UF.license_button_shown)
  const wanted_especialists = [
contents = UF.license_button;
    { name: "Sakazuki Akainu", wanteds: ["capone", "bellamy"], img: "/images/b/b0/Card_akainu.png" },
    { name: "Uta", wanteds: ["nami", "usopp", "jango", "buggy"], img: "/images/2/22/Card_uta.png" },
    { name: "Sabo", wanteds: ["nami", "niji", "mr. 2", "mr. 3", "goldenweek", "mr. 4", "mr. 5", "bepo", "pearl", "arlong", "buchi", "chew", "jango", "kuroobi", "koala", "buggy", "kuro", "gin", "krieg", "mohji", "cabaji"], img: "/images/0/04/Card-sabo.png" },
    { name: "Enel", wanteds: ["robin", "usopp", "jango", "cabaji"], img: "/images/8/85/Enel_card.png" },
    { name: "Vinsmoke Reiju", wanteds: ["brook", "bonney", "urouge", "rebecca", "killer", "burgess", "kid", "reiju", "yonji", "baby 5", "mr. 2", "doublefinger", "mr. 4", "bepo", "pearl", "arlong", "hatchan", "koala", "kuro", "gin", "mohji", "morgan", "hawkins", "alvida", "crocodile", "cabaji"], img: "/images/2/23/Card-reiju.png" },
    { name: "Portgas D. Ace", wanteds: ["nami", "brook", "chopper", "bonney", "leo", "apoo", "perona", "usopp", "kid", "van augur", "niji", "mr. 3", "mr. 5", "bepo", "arlong", "buchi", "chew", "jango", "kuroobi", "buggy", "krieg", "mohji"], img: "/images/4/40/Card-ace.png" },
    { name: "Donquixte Doflamingo", wanteds: ["robin", "nami", "brook", "chopper", "franky", "zoro", "luffy", "sanji", "bonney", "leo", "apoo", "urouge", "perona", "usopp", "ryuma", "killer", "burgess", "capone", "kid", "van augur", "law", "reiju", "yonji", "niji", "ichiji", "mr. 2", "mr. 3", "doublefinger", "goldenweek", "mr. 4", "bepo", "pearl", "arlong", "hatchan", "buchi", "jango", "kuroobi", "koala", "buggy", "gin", "krieg", "mohji", "morgan", "drake", "alvida"], img: "/images/8/8d/Card-doflamingo.png" },
    { name: "Borsalino Kizaru", wanteds: ["capone", "jango", "drake", "alvida"], img: "/images/3/32/Card-kizaru.png" },
    { name: "Trafalgar Law", wanteds: ["luffy", "sanji", "leo", "apoo", "usopp", "kid", "reiju", "yonji", "niji", "ichiji", "baby 5", "doublefinger", "mr. 4", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "buggy", "krieg", "drake", "alvida"], img: "/images/b/b9/Card-law.png" },
    { name: "Carrot", wanteds: ["nami", "chopper", "luffy", "sanji", "leo", "leo", "usopp", "capone", "kid", "van augur", "law", "niji", "ichiji", "mr. 3", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "krieg", "mohji", "drake", "alvida"], img: "/images/8/8d/Card-carrot.png" },
    { name: "Nami (TS)", wanteds: ["robin", "nami", "brook", "chopper", "franky", "zoro", "luffy", "sanji", "bonney", "leo", "apoo", "urouge", "rebecca", "usopp", "ryuma", "killer", "kid", "law", "reiju", "yonji", "niji", "ichiji", "baby 5", "mr. 1", "mr. 2", "mr. 3", "doublefinger", "goldenweek", "mr. 4", "mr. 5", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "koala", "buggy", "kuro", "gin", "krieg", "mohji", "morgan", "drake", "hawkins", "alvida", "wapol", "crocodile", "cabaji"], img: "/images/3/35/Card-namits.png" },
    { name: "Nami", wanteds: ["chopper", "bonney", "leo", "apoo", "burgess", "law", "niji", "mr. 3", "doublefinger", "goldenweek", "mr. 5", "pearl", "hatchan", "buchi", "chew", "jango", "buggy", "krieg", "mohji", "alvida"], img: "/images/0/08/Card-nami.png" },
    { name: "Nico Robin", wanteds: ["nami", "chopper", "leo", "apoo", "usopp", "mr. 3", "arlong", "buchi", "chew", "jango", "buggy", "mohji", "alvida"], img: "/images/3/3f/Card-robin.png" },
    { name: "Nico Robin (TS)", wanteds: ["bonney", "leo", "apoo", "perona", "mr. 3", "buchi", "chew", "jango", "alvida"], img: "/images/b/b0/Card-robints.png" },
    { name: "Bartolomeo", wanteds: ["urouge", "reiju", "pearl", "arlong", "jango", "kuroobi", "koala", "morgan", "drake", "alvida"], img: "/images/a/a9/Card-barto.png" },
    { name: "Marshall D. Teach", wanteds: ["bonney", "perona", "killer", "capone", "mr. 2", "goldenweek", "mr. 5", "pearl", "buchi", "chew", "jango", "buggy", "alvida"], img: "/images/f/ff/Card-kurohige.png" },
    { name: "Crocodile", wanteds: ["nami", "yonji", "mr. 1", "alvida"], img: "/images/5/5d/Card-crocodile.png" },
    { name: "Bartolomew Kuma", wanteds: ["robin", "nami", "brook", "chopper", "franky", "zoro", "luffy", "sanji", "urouge", "rebecca", "usopp", "ryuma", "killer", "burgess", "capone", "kid", "van augur", "yonji", "niji", "ichiji", "baby 5", "mr. 1", "mr. 2", "mr. 3", "doublefinger", "mr. 4", "mr. 5", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "koala", "buggy", "kuro", "gin", "krieg", "mohji", "morgan", "drake", "hawkins", "alvida", "wapol", "crocodile", "cabaji", "bellamy"], img: "/images/b/b5/Card-kuma.png" },
    { name: "Basil Hawkins", wanteds: ["luffy", "urouge", "yonji", "pearl", "kuroobi", "alvida"], img: "/images/8/89/Card-hawkins.png" },
    { name: "Mohji", wanteds: ["alvida", "bonney", "buggy", "pearl", "van augur"], img: "/images/5/58/Card-mohji.png" },
    { name: "Leo & Mansherry", wanteds: ["alvida", "bonney", "mohji"], img: "/images/d/d9/Card-leo.png" },
  ];


new_state = true;
  function filterAndAppend(array, value, id) {
}
    whoDo = array.filter(
if (contents && new_state !== UF.license_button_shown) {
      function (v) {
if (preview_panel.firstChild)
        return v.wanteds.includes(value);
preview_panel.replaceChild(contents, preview_panel.firstChild);
      }
else
    );
preview_panel.appendChild(contents);


}
    $.each(whoDo, function (key, item) {
UF.license_button_shown = new_state;
      $(".wantedPortraits#" + id).append(
}; // end function
        "<div class='wantedPortrait' >" +
}
        "<img src='" + item.img + "' alt='imagem de " + item.name + "' />" +
},
        "</div>"
      );
    })
  }


preview_tooltip: null, // Tooltip, if preview so configured
  $("#selectbox-wanted").on("input", function () {
do_preview: null, // Function to call to actually generate the preview
    const value = $(this).val();


addPreviewButton: function (handler) {
    if ($(".wantedPortrait"))
// If we don't have Ajax, our preview won't work anyway.
      $(".wantedPortrait").remove();
if (!window.XMLHttpRequest && !window.ActiveXObject)
return;


var uploadButton = document.getElementsByName('wpUpload')[0]; // Has no ID...
    filterAndAppend(wanted_shooters, value, "wanted-shooter");
// If we can't find the upload button, we don't know where to insert the preview button.
    filterAndAppend(wanted_slashers, value, "wanted-slasher");
if (!uploadButton)
    filterAndAppend(wanted_fighters, value, "wanted-fighter");
return;
    filterAndAppend(wanted_especialists, value, "wanted-especialist");
  });
  //------- WANTED ---------


try {
  //------- SKILL TAB ---------
var previewButton = UF.customFormButton(
  $('.tab-skill').on('click', function () {
'wpUploadFormPreviewButton', // Customization ID
    $('.tab-skill.active').removeClass('active');
'wpUploadPreview', // ID of button
    $(this).addClass('active');
null, // Default text
    const skillId = $(this).data('skill-id');
UF.generatePreview, // Event handler
    if ($(".skillInfo[data-skill-id=" + skillId + "]")) {
'wpPreviewUploadLbl' // default label ID
      $(".skillInfo.active").removeClass('active');
);
      $(".skillInfo[data-skill-id=" + skillId + "]").addClass('active');
if (UFConfig.page_preview_in_tooltip && window.Tooltip) {
    }
UF.preview_tooltip = new Tooltip(
  });
previewButton,
  //------- SKILL TAB ---------
UF.getPreview, {
activate: Tooltip.NONE, // We'll show it manually in generatePreview.
deactivate: Tooltip.CLICK_TIP,
close_button: UFHelp.help_close_imgs,
mode: Tooltip.FIXED,
target: uploadButton,
anchor: Tooltip.TOP_LEFT,
fixed_offset: {
x: 0,
y: 5,
dy: -1
},
open_delay: 0,
hide_delay: 0
},
UFHelp.tooltip_styles);
}
UF.do_preview = handler;
previewButton.setAttribute('style', 'margin-left:0.5em;');
var hotKey = 'p';
previewButton.setAttribute('accesskey', hotKey);
if (!(/\[\w+\]$/.test(previewButton.title)))
previewButton.title += ' [' + hotKey + ']';


if ($.fn.updateTooltipAccessKeys) {
  //------- CALCULATOR XP ---------
$('#t-print').remove(); // Not needed here and collides with same accesskey
  const maximum_level = 110;
$(previewButton).updateTooltipAccessKeys();
  const tier_values = {
}
    "diamond": 1,
uploadButton.parentNode.insertBefore(previewButton, uploadButton.nextSibling);
    "gold": 1,
} catch (ex) {}
    "silver": 2,
},
    "bronze": 3
  };


getOwnWorkAuthor: function () {
  $(".calcXp--tierIcon").on("click", function () {
if (typeof UFConfig.ownwork_author === 'string' &&
    $(".calcXp--tierIcon.active").removeClass('active');
UFConfig.ownwork_author.search(/\S/) >= 0) {
    $(this).addClass('active');
// It's a non-empty string
  });
return UFConfig.ownwork_author;
} else {
return '[[User:' + mw.config.get('wgUserName') + '|]]';
}
},


getOwnWorkSource: function () {
  $("#calculate-btn").on('click', function () {
var text = UFUI.getLabel('wpOwnWorkUploadLbl', true);
    getNeededPotions();
var result = null;
  });
try {
// Must have a text node.
while (text && text.nodeType !== Node.TEXT_NODE)
text = text.firstChild;


if (text)
  function calcMissingXpInPotions() {
result = text.data.replace(/^\s+/, '').replace(/\s+$/, '');
    const currentPercentOfXp = $("#char-currentPercentOfXp").val() != "" ? $("#char-currentPercentOfXp").val() : 100;
    const currentLevel = $("#char-level").val() != "" ? $("#char-level").val() : 1;
    const levelToUp = $("#char-levelToUp").val() != "" ? $("#char-levelToUp").val() : 110;
    const charTier = $(".calcXp--tierIcon.active").length != 0 ? tier_values[$(".calcXp--tierIcon.active").attr('id')] : tier_values["gold"];


} catch (ex) {
    const percentToUp = 100 - currentPercentOfXp;
result = null;
    const currentXp = ((50 * (Math.pow((currentLevel - 1), 3)) - 150 * (Math.pow((currentLevel - 1), 2)) + 400 * (currentLevel - 1)) / 3) + ((50 * Math.pow(currentLevel, 2) - 150 * currentLevel + 200) * percentToUp / 100);
}
    const desiredXp = (50 * (Math.pow((levelToUp - 1), 3)) - 150 * (Math.pow((levelToUp - 1), 2)) + 400 * (levelToUp - 1)) / 3;
if (!result)
    const missingXp = Math.round((desiredXp - currentXp));
result = '{{own}} ' + UF.getOwnWorkAuthor();


return result;
    const missingPotions = {
},
      "small": Math.ceil((missingXp / (1000 * charTier))),
      "medium": (missingXp / (10000 * charTier)).toFixed(1),
      "big": (missingXp / (100000 * charTier)).toFixed(2)
    };


customFormButton: function (ui_id, id, defaultText, handler, defaultId) {
    return missingPotions;
function getButtonSpan(container, idx) {
  }
if (!container)
return null;


var spans = container.getElementsByTagName('span');
  function calcPotions() {
var span = null;
    const missingPotions = calcMissingXpInPotions();
if (!spans || spans.length <= idx) {
// No spans... if idx is zero, try simply to take the first text node within container.
if (!idx)
span = container;


} else {
    var complementaryPotS;
span = spans[idx];
    var complementaryPotM;
}
    potS = missingPotions['small'];
// Ok, let's see if we have some text...
    potM = missingPotions['medium'];
while (span && span.nodeType !== Node.TEXT_NODE)
    potB = missingPotions['big'];
span = span.firstChild;


if (span)
    if (String(potS).slice(-1) == "0") {
return span.data.replace(/^\s+/, '').replace(/\s+$/, '');
      potM = Math.ceil(parseFloat(potM));
    } else {
      potM = Math.floor(potM);
      complementaryPotS = potS - potM * 10;
    }


return null;
    if (String(potM).slice(-1) == "0") {
}
      potM = Math.ceil((parseFloat(potM)));
      potB = Math.floor(potB);
    }
    else {
      potB = Math.floor(potB)
      complementaryPotM = potM - potB * 10
    }


function getDefault(defaultText, defaultId) {
    const potions = {
if (!defaultText) {
      "small": complementaryPotS,
if (defaultId) {
      "medium": complementaryPotM,
defaultText = UFUI.getLabel(defaultId, true);
      "big": potB
// Must have a text node
    }
while (defaultText && defaultText.nodeType !== Node.TEXT_NODE)
defaultText = defaultText.firstChild;


if (defaultText)
    return potions;
defaultText = defaultText.data.replace(/^\s+/, '').replace(/\s+$/, '');
  }


} else {
  function getNeededPotions() {
defaultText = 'X';
    const potions = calcPotions();
} // Hmmm... a serious misconfiguration
    const resultsArea = $("#calc-result");
}
return defaultText;
}


var button = null,
    resultsArea.html('');
imgs = null;
button = UFUI.getEntry(ui_id, 'uiElements', UFUI.internalLanguage);
if (!button)
button = UFUI.getEntry(ui_id, 'uiElements');


if (button)
    if (potions["big"]) {
imgs = button.getElementsByTagName('img');
      resultsArea.append(
        "<div class='badge'>" +
        "<img src='/images/a/a5/Bigexppot.png' class='calcXp--xpIcon' />" +
        "<span class='calcXp--numberOfPots'>" + potions['big'] + "</span>" +
        "</div>"
      );
    }


if (!imgs || !imgs.length || window.Buttons === undefined) {
var buttonText = getButtonSpan(button, 0);
if (!buttonText)
buttonText = getDefault(defaultText, defaultId);


var alternateText = getButtonSpan(button, 1);
    if (potions["medium"]) {
button = document.createElement('input');
      resultsArea.append(
button.setAttribute('id', id);
        "<div class='badge'>" +
button.setAttribute('name', id);
        "<img src='/images/d/df/Medexppot.png' class='calcXp--xpIcon' />" +
button.type = 'button';
        "<span class='calcXp--numberOfPots'>" + potions['medium'] + "</span>" +
button.value = buttonText;
        "</div>"
if (alternateText)
      );
button.title = alternateText;
    }


button.onclick = handler;
} else {
button = Buttons.makeButton(imgs, id, handler);
}
return button;
},


the_form: null,
    if (potions["small"]) {
      resultsArea.append(
        "<div class='badge'>" +
        "<img src='/images/5/5a/Smallexppot.png' class='calcXp--xpIcon' />" +
        "<span class='calcXp--numberOfPots'>" + potions['small'] + "</span>" +
        "</div>"
      );
    }
  }
  //------- CALCULATOR XP ---------


// If a needed script that is included hasn't loaded yet, we try at most install_max_attempts
  //------- VIDEO SELECTOR ---------
// times install_delay. If it then still has not loaded, we install all the same, and the
  $(".video-selector").on("click", function () {
// setup routine will have to deal with it. (Note that script loading is asynchronous!)
    $(".video-selector.active").removeClass("active");
install_delay: 400, // Milliseconds
    $(this).addClass("active");
installAttempts: 0,
install_max_attempts: 6, // maximum delay 2.4s


reallyInstall: function (force_basic) {
    const value = $(this).data("value");
if (this.installAttempts < this.install_max_attempts &&
    const obj = eval('(' + value + ')');
(!window.LanguageHandler || !window.UIElements || !window.Tooltip)) {
    $("video[data-type-" + obj.select + "].active").removeClass('active');
// Add needed scripts in the condition above.
    const index = obj.showId - 1;
window.setTimeout(function () {
    $("video[data-type-" + obj.select + "]").eq(index).addClass('active');
UF.reallyInstall(force_basic);
  });
}, this.install_delay);
  //------- VIDEO SELECTOR ---------
} else {
  //-------- gurren
UFUI.sanitizeUserLanguage();
  $(document).ready(function () {
var useBasic = force_basic || !!UFConfig.forcebasic || UFUI.isExperienced;
    // Alternar entre mostrar e ocultar abas ao clicar
if (useBasic && !force_basic) {
    $('.mostrar-aba').click(function () {
// Only for autoconfirmed users!
      var aba_id = $(this).attr('data-aba');
var is_auto = false;
      var aba_selecionada = $("#aba-" + aba_id);
var userGroups = mw.config.get('wgUserGroups');
if (userGroups) {
for (var i = 0; i < userGroups.length && !is_auto; i++)
is_auto = userGroups[i] === 'autoconfirmed';
}
if (!is_auto)
useBasic = false;
}
try {
UFHelp.precreate_tooltip_closer();
this.setFileExtensions();
if (useBasic ||
document.URL.indexOf('uploadformstyle=basic') > 0 ||
document.URL.search(/uselang=(\w|-)*fromwikimedia/) > 0) {
// The fromwikimedia forms are special enough to warrant a special setup.
UploadFormBasic.setup(!force_basic);
} else {
UploadFormFull.setup();
}
this.setup_error_display();
UFHelp.setupHelp(this.isReupload);
if (!this.isReupload)
UFFixes.fixAutocompletion();


this.setupOverwriteMsg();
      if (aba_selecionada.hasClass('atual')) {
// Handle the "Upload new version" links, these have &wpDestFile=... in the URL, which
        aba_selecionada.removeClass('atual'); // Oculta a aba se já estiver ativa
// defeats overwrite detection. Because someone might construct such a URL manually
        $(this).removeClass('ativa'); // Remove a classe ativa do botão
// *not* actually overwriting an existing file, we still do the check:
      } else {
if (!this.isReupload)
        $('.aba').removeClass('atual'); // Oculta todas as abas
this.check_initial_dest_file();
        aba_selecionada.addClass('atual'); // Exibe a aba correspondente
        $('.mostrar-aba').removeClass('ativa'); // Remove a classe ativa de outros botões
        $(this).addClass('ativa'); // Adiciona a classe ativa ao botão clicado
      }
    });


} catch (ex) {
    // Exibir aba correspondente ao hash da URL
if (console && console.warn)
    var url = location.href;
console.warn(ex);
    var hash = url.split('#')[1];
else
    if (hash != null && hash.length > 0) {
mw.log.warn(ex);
      $("#aba-" + hash).addClass('atual'); // Exibe a aba do hash
      $('*[data-aba="' + hash + '"]').addClass('ativa'); // Ativa o botão correspondente
    }
  });
});


// Not good at all. Something went badly wrong. If we have already modified the form,
// the best thing is probably to reload and make sure we don't try again:
if (this.formModified) {
var reloadURL = document.URL;
reloadURL += (reloadURL.indexOf('?') > 0) ? '&' : '?';
window.location.href = reloadURL + 'uploadformstyle=plain';
}
}
// not needed at beginning
importScript('MediaWiki:TextCleaner.js');
$.when(mw.loader.using('ext.gadget.HotCat'), $.ready)
.then(this.setup_hotcat_label);
this.removeSpinner();
}
this.installAttempts++;
},


removeSpinner: function () {
//------- 2222222222222222222222222222222222222222222222222222222222222222222222 ---------
// Installed on ImprovedUploadForm.js
/*
if ($.removeSpinner) $.removeSpinner('UploadLoadingSpinner');
(function () {
},
    'use strict';


install: function () {
    var STORAGE_KEY = 'gla-wiki-theme';
if (UF.isInstalled || // Do this only once per page!
    var DARK_CLASS = 'gla-dark-mode';
document.URL.indexOf('uploadformstyle=plain') > 0 || // We're disabled
    var BUTTON_ID = 'gla-darkmode-toggle';
// Also don't do anything if we're not on an upload form.
mw.config.get('wgCanonicalNamespace') !== 'Special' ||
mw.config.get('wgCanonicalSpecialPageName') !== 'Upload')
return UF.removeSpinner();


var form = document.getElementById('upload') || document.getElementById('mw-upload-form');
    function getSavedTheme() {
var originalDesc = document.getElementById('wpUploadDescription');
        try {
if (!form || !originalDesc)
            return localStorage.getItem(STORAGE_KEY);
return; // Oops. Not good: bail out; don't do anything. (then there should be also no spinner)
        } catch (e) {
            return null;
        }
    }


var reupload = document.getElementById('wpForReUpload');
    function saveTheme(theme) {
var destFile = document.getElementById('wpDestFile');
        try {
            localStorage.setItem(STORAGE_KEY, theme);
        } catch (e) {
            // Ignora caso o navegador bloqueie localStorage
        }
    }


if (reupload) {
    function isDarkMode() {
UF.isReupload = !!reupload.value;
        return document.documentElement.classList.contains(DARK_CLASS);
} else {
    }
UF.isReupload = destFile && (destFile.disabled || destFile.readOnly);
$(form).append($('<input type="hidden" name="wpChangeTags" value="OUploadForm">'));
}
if (destFile && !!destFile.disabled) {
destFile.readOnly = true;
destFile.disabled = false;
}
if (destFile && UF.isReupload) {
destFile.onkeyup = function (/* e */) {};
destFile.onchange = function (/* e */) {};
}
// Use the basic form if the description was set *initially*, or if it's a re-upload, or if it's a special
// form
var useBasic = (originalDesc.defaultValue && originalDesc.defaultValue.length) ||
UF.isReupload ||
document.URL.indexOf('uselang=nlwikilovesmonuments') > 0;


UF.the_form = form;
    function applyTheme(theme) {
if (document.URL.indexOf('debug=true') > 0)
        var dark = theme === 'dark';
UF.debug = true;


UF.reallyInstall(useBasic);
        document.documentElement.classList.toggle(DARK_CLASS, dark);
},


check_initial_dest_file: function () {
        if (document.body) {
var destFile = document.getElementById('wpDestFile');
            document.body.classList.toggle(DARK_CLASS, dark);
if (destFile && destFile.value && destFile.value.length &&
        }
wgUploadWarningObj && wgUploadWarningObj.keypress instanceof Function)
wgUploadWarningObj.keypress();


},
        updateButton();
    }


errorMsgs: null,
    function updateButton() {
warning_pushed: false,
        var button = document.getElementById(BUTTON_ID);


display_errors: function () {
        if (!button) {
// Give user feedback about what is not ok.
            return;
var myWarning = document.getElementById('wpUploadVerifyWarning');
        }
if (!myWarning) {
// Find the upload button
var uploadButton = document.getElementsByName('wpUpload');
var warningBox = null;
if (uploadButton)
uploadButton = uploadButton[0];


if (!uploadButton) {
        var dark = isDarkMode();
warningBox = document.getElementById('wpDestFile-warning');
if (!warningBox)
return;
// We just have the field colors to indicate errors...
}
myWarning = document.createElement('div');
myWarning.style.border = '1px #F00 solid';
myWarning.style.backgroundColor = UF.errorColor;
myWarning.style.padding = '0.5em';
myWarning.style.marginTop = '0.5em';
myWarning.style.marginBottom = '0.5em';
myWarning.setAttribute('id', 'wpUploadVerifyWarning');
myWarning.setAttribute('width', '100%');
myWarning.style.display = 'none';
if (uploadButton)
uploadButton.parentNode.insertBefore(myWarning, uploadButton);
else
warningBox.parentNode.insertBefore(myWarning, warningBox.nextSibling);


}
        button.setAttribute('aria-pressed', dark ? 'true' : 'false');
// Now collect all the error messages into one div.
        button.setAttribute('title', dark ? 'Alternar para modo claro' : 'Alternar para modo escuro');
var msgs = document.createElement('ul');
msgs.style.paddingLeft = '1.0em';
msgs.style.marginLeft = '0';
for (var i = 0; i < UF.errorMsgs.length; i++) {
var msg = UFUI.getErrorMsg(UF.errorMsgs[i]);
if (msg) {
var li = document.createElement('li');
li.appendChild(msg);
msgs.appendChild(li);
}
}
UF.errorMsgs = null;
// And then display the messages
if (myWarning.firstChild)
myWarning.replaceChild(msgs, myWarning.firstChild);
else
myWarning.appendChild(msgs);


myWarning.style.display = 'block';
        button.innerHTML = dark
},
            ? '<span class="gla-darkmode-icon">☀</span><span class="gla-darkmode-text">Modo claro</span>'
            : '<span class="gla-darkmode-icon">☾</span><span class="gla-darkmode-text">Modo escuro</span>';
    }


call_onsubmit: function (evt) {
    function createButton() {
var doSubmit = true;
        if (document.getElementById(BUTTON_ID)) {
if (UF.oldOnSubmit) {
            return;
if (typeof UF.oldOnSubmit === 'string')
        }
doSubmit = eval(UF.oldOnSubmit);
else if (UF.oldOnSubmit instanceof Function)
doSubmit = UF.oldOnSubmit(evt);
}
return doSubmit;
},


templates: [{
        var button = document.createElement('button');
name: 'information',
fields: ['description', 'date', 'source', 'author', 'permission', 'other versions'],
extract: [3, 1, 0],
desc_mandatory: true,
regexp: null
}, {
name: 'painting',
fields: ['Artist', 'Title', 'Year', 'Technique', 'Dimensions', 'Gallery',
'Location', 'Notes', 'Source', 'Permission',
'other_versions', 'Other versions'],
extract: [0, 8, 7],
desc_mandatory: false,
regexp: null
}, {
name: 'flickr',
fields: ['description', 'flickr_url', 'title', 'taken', 'photographer_url',
'photographer', 'photographer_location', 'reviewer', 'permission'],
extract: [[5, 4], 1, 0],
desc_mandatory: true,
regexp: null
}
],


empty_template: function (name) {
        button.id = BUTTON_ID;
if (!name)
        button.type = 'button';
return null;
        button.className = 'gla-darkmode-button';
        button.setAttribute('aria-label', 'Alternar modo escuro');
        button.setAttribute('aria-pressed', isDarkMode() ? 'true' : 'false');


var test_name = name.toLowerCase();
        button.addEventListener('click', function () {
for (var i = 0; i < UF.templates.length; i++) {
            var nextTheme = isDarkMode() ? 'light' : 'dark';
if (UF.templates[i].name === test_name) {
var result = '{{' + name;
for (var j = 0; j < UF.templates[i].fields.length; j++) {
result += '\n|' + UF.templates[i].fields[j] + '=';
if (UFUI.isOwnWork && !i) {
// Pre-fill some fields if we're on an own-work form and it's an
// information-template
switch (j) {
case 1: // Date
if (typeof UFConfig.ownwork_date === 'string' &&
UFConfig.ownwork_date.search(/\S/) >= 0)
result += UF.clean(UFConfig.ownwork_date);
break;
case 2: // Source-field
result += UF.clean(UF.getOwnWorkSource());
break;


case 3: // Author
            saveTheme(nextTheme);
result += UF.clean(UF.getOwnWorkAuthor());
            applyTheme(nextTheme);
break;
        });
// default: break;
} // end switch
} // end if information for ownWork
}
return result + '\n}}';
}
}
return null;
},


extract_fields: function (desc, template_idx, list) {
        document.body.appendChild(button);
function get(desc, field, regexp) {
        updateButton();
var match_start = new RegExp('\\n\\s*\\| *' + field + ' *\\=', 'i');
    }
var start = desc.match(match_start);
if (!start)
return null;


var rest = desc.substring(start.index + start[0].length);
    function ready(fn) {
var end = rest.search(regexp);
        if (document.readyState === 'loading') {
if (end < 0)
            document.addEventListener('DOMContentLoaded', fn);
return rest;
        } else {
            fn();
        }
    }


return rest.substring(0, end);
    var savedTheme = getSavedTheme();
}


var result = list;
    if (savedTheme === 'dark') {
var names = UF.templates[template_idx].fields;
        document.documentElement.classList.add(DARK_CLASS);
var extract = UF.templates[template_idx].extract;
    }
if (!UF.templates[template_idx].regexp) {
// Build the regexp
var regexp_str = '\\n\\s*(\\| *(' + names.join('|') + ') *\\=|\\}\\})';
UF.templates[template_idx].regexp = new RegExp(regexp_str);
}
for (var i = 0; i < extract.length; i++) {
var txt = null;
if (extract[i] instanceof Array) {
// It's an array giving alternatives...
var alternatives = extract[i];
for (var j = 0; j < alternatives.length; j++) {
txt = get(desc, names[alternatives[j]], UF.templates[template_idx].regexp);
if (txt && txt.search(/\S/) >= 0)
break;
// Non-empty: don't look further
txt = null;
}
} else {
txt = get(desc, names[extract[i]], UF.templates[template_idx].regexp);
}
if (txt)
result[result.length] = txt;
// Push one.
// Don't use "if (txt)", it's false if the string is, but empty!
}
return result;
},


split_description: function (desc) {
    ready(function () {
if (!desc || !desc.length) return null;
        if (savedTheme === 'dark') {
            document.body.classList.add(DARK_CLASS);
        }


// Returns an array containing (in that order):
        createButton();
// index of template, author, source, description
        updateButton();
for (var i = 0; i < UF.templates.length; i++) {
    });
var regexp = new RegExp('\\{\\{' + UF.templates[i].name + '\\s*(\\||\\n)');
})();
var start = desc.toLowerCase().search(regexp);
*/
if (start >= 0) {
/**
var result = [i];
* Script JavaScript para o componente de abas MediaWiki
// Now try to extract the fields:
* Adicione este script na sua MediaWiki (Common.js ou página de scripts)
return UF.extract_fields(desc.substring(start), i, result);
*/
}
}
return null;
},
 
generatePreview: function (evt) {
if (UF.preview_tooltip &&
UF.preview_tooltip.popup.style.display !== 'none' &&
UF.preview_tooltip.popup.style.display)
UF.preview_tooltip.hide_now(null);
else
UF.do_preview(evt || window.event);
 
},
 
outerHTML: function (node) {
if (!node)
return '';
 
if (node.nodeType === 3)
return node.nodeValue;
// Text node
if (node.outerHTML)
return node.outerHTML;
 
var div = document.createElement('div');
div.style.display = 'none';
div.style.position = 'absolute';
div.appendChild(node);
document.body.appendChild(div);
var txt = div.innerHTML;
document.body.removeChild(div);
return txt;
},
 
makePreview: function (description, is_overwrite) {
if (is_overwrite) {
UF.showPreview(
'<div style="border:1px solid red; padding:0.5em;"><div class="previewnote">' +
UF.outerHTML(UFUI.getErrorMsg('wpPreviewOverwriteError')) +
'</div></div>');
} else {
var text = '<div style="border:1px solid red;padding:0.5em;"><div class="previewnote">\n' +
'{{MediaWiki:Previewnote/' + UFUI.userLanguage + '}}\n' +
'</div>\n';
var license = document.getElementById('wpLicense');
var licenseText = null;
if (license && license.selectedIndex > 0 &&
license.options[license.selectedIndex].value.length)
licenseText = '{{' + license.options[license.selectedIndex].value + '}}';
 
if (licenseText) {
text += '<h2>{{int:filedesc}}</h2>\n' +
description + '\n' +
'<h2>{{int:license-header}}</h2>\n' +
licenseText;
} else {
text += description + '\n';
}
// Add categories
if (hotcat_get_state instanceof Function) {
if ($('#catlinks').find('.hotcatlink').is(':hidden'))
hotcat_close_form();
 
var hotcat_categories = hotcat_get_state();
if (hotcat_categories && hotcat_categories.length) {
hotcat_categories = hotcat_categories.split('\n');
for (var i = 0; i < hotcat_categories.length; i++) {
if (hotcat_categories[i] && hotcat_categories[i].length)
text += '[[Category:' + hotcat_categories[i] + ']]';
 
}
}
}
text += '</div>';
 
// Make the Ajax call
var req;
if (window.XMLHttpRequest)
req = new window.XMLHttpRequest();
 
if (!req && window.ActiveXObject) {
try {
req = new window.ActiveXObject('Microsoft.XMLHTTP');
} catch (any) {}
}
if (!req)
return;
 
var button = document.getElementById('wpUploadPreview');
var page = document.getElementById('wpDestFile');
if (page)
page = page.value;
 
if ($.fn.injectSpinner)
$(button).injectSpinner('wpUploadPreviewSpinner');
 
var uri = mw.config.get('wgServer') + (mw.util ? mw.util.wikiScript('api') : mw.config.get('wgScriptPath') + '/api.php');
var args = 'action=parse&pst&text=' + encodeURIComponent(text) +
(page ? '&title=File:' + encodeURIComponent(page.replace(/ /g, '_')) : '') +
'&prop=text|categories&format=json';
// "&pst" is "Pre-save transform": tilde replacement, pipe magic for links like [[foo|]].
// Don't use a callback directly, add the function call ourselves *after* the call, since
// the API somehow resolves tildes to an IP number instead of the username if a callback
// is used. C.f. https://bugzilla.wikimedia.org/show_bug.cgi?id=16616
// Apparently, that's a feature, not a bug...
var request_length = uri.length + args.length + 1;
if (request_length > 2000) {
// Long URLs are problematic for GET requests
req.open('POST', uri, true);
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
} else {
uri += '?' + args;
args = null;
req.open('GET', uri, true);
}
req.setRequestHeader('Pragma', 'cache=no');
req.setRequestHeader('Cache-Control', 'no-transform');
req.onreadystatechange = function () {
if ($.removeSpinner)
$.removeSpinner('wpUploadPreviewSpinner');
 
if (req.readyState !== 4 || req.status !== 200)
return;
 
// Add the "callback"...
if (req.responseText)
UF.jsonPreview(JSON.parse(req.responseText));
};
req.send(args);
}
},
 
jsonPreview: function (result) {
if (result && result.parse && result.parse.text && result.parse.text['*']) {
var txt = result.parse.text['*'];
var categories = result.parse.categories;
if (categories && categories.length) {
// Add a mock-up of a category bar. We don't care about non-existing categories, and we
// can't identify hidden categories.
var catbar = '<div class="catlinks"><div id="mw-normal-catlinks">' +
UF.outerHTML(UFUI.getLabel('wpCategoriesUploadLbl'));
categories.sort(
function (a, b) {
var key_a = a['*'].toLowerCase(),
key_b = b['*'].toLowerCase();
if (key_a < key_b)
return -1;
 
if (key_a > key_b)
return 1;
 
return 0;
});
for (var i = 0; i < categories.length; i++) {
var catname = categories[i]['*'];
if (catname && catname.length) {
if (i > 0)
catbar += ' |';
 
catbar += ' <a href="/wiki/Category:' + encodeURI(catname) + '">' +
catname.replace(/_/g, ' ') + '</a>';
}
}
catbar += '</div></div>';
// Now insert it into text.
var end = txt.lastIndexOf('</div>');
txt = txt.substring(0, end) + catbar + '</div>';
}
UF.showPreview(txt);
}
},
 
showPreview: function (result) {
if (UF.preview_tooltip) {
UF.preview_content = result;
UF.preview_tooltip.show_tip(null, false);
} else {
var preview = document.getElementById('wpUploadPreviewDisplay');
if (!preview) {
var before = document.getElementById('mw-upload-permitted');
if (!before || UFUtils.isChildOf(before, UF.the_form))
before = UF.the_form;
 
if (!before)
return;
// Don't know where to insert preview display. Error message here?
preview = document.createElement('div');
preview.setAttribute('id', 'wpUploadPreviewDisplay');
before.parentNode.insertBefore(preview, before);
}
try {
preview.innerHTML = result;
} catch (ex) {
preview.innerHTML = ''; // Error message here instead?
}
preview.style.display = ''; // Show it
}
},
 
hidePreview: function () {
if (UF.preview_tooltip) {
UF.preview_tooltip.hide_now(null);
} else {
var preview = document.getElementById('wpUploadPreviewDisplay');
if (preview)
preview.style.display = 'none';
 
}
},
 
getPreview: function () { // Callback for the tooltip
var div = document.createElement('div');
div.style.display = 'none';
document.body.appendChild(div);
div.innerHTML = UF.preview_content;
document.body.removeChild(div);
div.style.fontSize = 'smaller';
div.style.display = '';
var wrapper = document.createElement('div');
wrapper.appendChild(div);
return wrapper;
},
 
licenses_regexp: /\{\{(self|pd|gfdl|cc|l?gpl|fal|cecill|attribution|copyrighted free use|SOlicence|geograph|UN map|BArch-License|Apache)/i,
user_license_regexp: new RegExp('\\{\\{[Ss]ubst:[Uu]ser:' +
(mw.config.get('wgUserName') || 'null').replace(/([\\^$.?*+()[\]|{}])/g, '\\$1') +
'/'),
 
has_license: function (fields) {
if (!fields || !fields.length)
return false;
 
for (var i = 0; i < fields.length; i++) {
if (fields[i]) {
if (typeof (fields[i]) === 'string') {
if (fields[i].search(UF.licenses_regexp) >= 0)
return true;
 
} else {
if (fields[i].value.search(UF.licenses_regexp) >= 0)
return true;
 
}
}
}
for (var j = 0; j < fields.length; j++) {
if (fields[j]) {
if (typeof (fields[j]) === 'string') {
if (fields[j].search(UF.user_license_regexp) >= 0)
return true;
 
} else {
if (fields[j].value.search(UF.user_license_regexp) >= 0)
return true;
 
}
}
}
return false;
},
 
addAfterField: function (elem_id, element) {
if (!element)
return;
 
var elem = document.getElementById(elem_id);
if (!elem)
return;
 
// Find enclosing table cell.
while (elem && elem.nodeName.toLowerCase() !== 'td')
elem = elem.parentNode;
 
if (!elem)
return;
 
var container = document.createElement('div');
container.style.fontSize = 'smaller';
container.appendChild(element);
elem.appendChild(container);
},
 
old_overwrite_warning: null,
 
setupOverwriteMsg: function () {
if (!window.wgUploadWarningObj || !wgUploadWarningObj.setWarning)
return;
 
var msg = document.createElement('div');
msg.id = 'wpUploadFormScriptOverwriteWarning';
msg.style.display = 'none';
msg.style.color = 'red';
msg.appendChild(UFUI.getErrorMsg('wpPreviewOverwriteError'));
UF.addAfterField('wpDestFile', msg);
UF.old_overwrite_warning = wgUploadWarningObj.setWarning;
wgUploadWarningObj.setWarning = UF.overwriteMsg;
},
 
overwriteMsg: function (warning) {
if (!UF.old_overwrite_warning || UF.isReupload)
return;
 
// Make sure that 'this' is set to 'wgUploadWarningObj' in the call below!
UF.old_overwrite_warning.apply(wgUploadWarningObj, [warning]);
var is_overwrite = UF.isOverwrite();
var my_overwrite_warning = document.getElementById('wpUploadFormScriptOverwriteWarning');
if (my_overwrite_warning)
my_overwrite_warning.style.display = (is_overwrite ? '' : 'none');
 
UF.set_fields_enabled(
!is_overwrite,
['wpUploadFile', 'wpUploadFileURL', 'wpDestFile', 'wpUploadDescription', 'wpAdditionalInfo',
'wpLicense', 'wpWatchthis', 'wpIgnoreWarning', 'wpUpload']);
},
 
isOverwrite: function () {
if (document.getElementById('wpUploadWarningFileexists'))
return true;
 
var destfileWarning = document.getElementById('wpDestFile-warning');
if (!destfileWarning)
return false;
 
var destFile = document.getElementById('wpDestFile');
if (!destFile || !destFile.value)
return false;
 
var lks = destfileWarning.getElementsByTagName('a');
if (!lks || !lks.length)
return false;
 
// Trimmed, blanks replaced by underscores, first character capitalized
var fn1 = destFile.value.replace(/^\s\s*/, '').replace(/\s\s*$/, '').replace(/ /g, '_');
fn1 = fn1.substr(0, 1).toUpperCase() + fn1.substring(1);
var fn0 = 'Image:' + fn1;
fn1 = 'File:' + fn1;
 
var script = mw.config.get('wgScript');
var server = mw.config.get('wgServer');
for (var i = 0; i < lks.length; i++) {
var href = lks[i].getAttribute('href');
if (!href || lks[i].className === 'new')
continue;
if (!href.indexOf(script) || !href.indexOf(server + script)) {
var m = /[&?]title=([^&]*)/.exec(href);
if (m && m.length > 1)
href = m[1];
else
href = null;
} else {
var prefix = mw.config.get('wgArticlePath').replace('$1', '');
if (href.indexOf(prefix))
prefix = server + prefix;
// Fully expanded URL?
if (!href.indexOf(prefix))
href = href.substring(prefix.length);
else
href = null;
}
if (!href)
continue;
href = decodeURIComponent(href).replace(/ /g, '_');
if (href === fn1 || href === fn0)
return true;
}
return false;
 
},
 
allowedFileTypes: null,
forbiddenFileTypes: null,
 
badFileNames: /^(test|image|img|bild|example|(dsc|img)?(\s|_|-)*|\d{10}(\s|_|-)[0123456789abcdef]{10}(\s|_|-)[a-z])$/i,
// Filenames that have only components (separated by periods) that fully match this regexp
// are considered illegal. The second-but-last one catches DSC01234, or DSC_01234, or
// DSC_012_34 or also filenames conatining only digits and non-alphanumeric characters.
// The last catches Flickr's raw filenames. How to relax that last expression without catching
// too many legit file names?
// Matching is case-insensitive.
 
extractFileExtensions: function (div) {
var list = null;
// Get a mw-upload-permitted or mw-upload-prohibited div, extracts all extensions listed
var txt = div;
while (txt && txt.nodeType !== 3)
txt = txt.lastChild;
 
if (!txt)
return null;
 
// Try to figure out which comma to use (localizeable through MediaWiki:Comma-separator!)
if (txt.data.indexOf(',') >= 0) { // Standard
txt = txt.data.split(',');
} else if (txt.data.indexOf('،') >= 0) { // Arabic etc.
txt = txt.data.split('،');
} else if (txt.data.indexOf('、') >= 0) { // Chinese
txt = txt.data.split('、');
} else {
return null;
}
if (!txt || !txt.length)
return null;
 
for (var i = 0; i < txt.length; i++) {
var match = /(\w+)\W*$/.exec(txt[i]);
if (match) {
match = match[1].toLowerCase(); // The extension
if (!list)
list = {};
 
list[match] = true;
}
}
return list;
},
 
setFileExtensions: function () {
var fileExts = mw.config.get('wgFileExtensions');
if (fileExts) { // New as of 2009-09-17
UF.allowedFileTypes = {};
for (var i = 0; i < fileExts.length; i++)
UF.allowedFileTypes[fileExts[i]] = true;
 
UF.forbiddenFileTypes = null;
return;
}
 
UF.allowedFileTypes = UF.extractFileExtensions(document.getElementById('mw-upload-permitted'));
UF.forbiddenFileTypes = UF.extractFileExtensions(document.getElementById('mw-upload-prohibited'));
if (UF.allowedFileTypes) {
// Alternate OGG extensions
if (UF.allowedFileTypes.ogg) {
if (!UF.forbiddenFileTypes || !UF.forbiddenFileTypes.ogv)
UF.allowedFileTypes.ogv = true;
 
if (!UF.forbiddenFileTypes || !UF.forbiddenFileTypes.oga)
UF.allowedFileTypes.oga = true;
 
if (!UF.forbiddenFileTypes || !UF.forbiddenFileTypes.ogx)
UF.allowedFileTypes.ogx = true;
 
}
// OpenDoc extensions (are these needed?)
if (!UF.forbiddenFileTypes || !UF.forbiddenFileTypes.sxi)
UF.allowedFileTypes.sxi = true;
 
if (!UF.forbiddenFileTypes || !UF.forbiddenFileTypes.sxc)
UF.allowedFileTypes.sxc = true;
 
if (!UF.forbiddenFileTypes || !UF.forbiddenFileTypes.sxd)
UF.allowedFileTypes.sxd = true;
 
if (!UF.forbiddenFileTypes || !UF.forbiddenFileTypes.sxw)
UF.allowedFileTypes.sxw = true;
 
// PDF (allowed, but may be hidden in the interface)
if (!UF.forbiddenFileTypes || !UF.forbiddenFileTypes.pdf)
UF.allowedFileTypes.pdf = true;
 
}
},
 
checkFileExtension: function (ext, presence_only) {
if (presence_only) {
return (UF.allowedFileTypes && UF.allowedFileTypes[ext] === true) ||
(UF.forbiddenFileTypes && UF.forbiddenFileTypes[ext] === true);
}
return (!UF.allowedFileTypes || UF.allowedFileTypes[ext] === true) &&
(!UF.forbiddenFileTypes || UF.forbiddenFileTypes[ext] !== true);
},
 
verifyFileName: function (filename) {
if (!filename) {
UF.errorMsgs.push('wpNoFilenameError');
return false;
}
if (filename.search(/(https?|file|ftp):\/\//i) >= 0) {
UF.errorMsgs.push('wpHttpFilenameError');
return false;
}
var ok = true;
 
// Don't allow slashes
if (filename.indexOf('/') >= 0) {
UF.errorMsgs.push('wpNoSlashError');
ok = false;
}
// Check for double extensions
var fn = filename.split('.');
if (fn.length < 2 || !fn[fn.length - 1].length) {
UF.errorMsgs.push('wpNoExtensionError');
ok = false;
}
// Check extension
var nof_extensions = 0;
if (fn.length >= 2) {
nof_extensions++;
if (UF.checkFileExtension(fn[fn.length - 1].toLowerCase())) {
// It's ok, check for double extension
if (fn.length > 2) {
if (UF.checkFileExtension(fn[fn.length - 2].toLowerCase(), true)) {
nof_extensions++;
UF.errorMsgs.push('wpDoubleExtensionError');
ok = false;
}
}
} else {
UF.errorMsgs.push('wpIllegalExtensionError');
ok = false;
}
}
// Check for allowed file name
var one_ok = false;
for (var i = 0; i < fn.length - nof_extensions && !one_ok; i++) {
if (fn[i].length && fn[i].search(UF.badFileNames) < 0)
one_ok = true;
 
}
if (!one_ok) {
UF.errorMsgs.push('wpNondescriptFilenameError');
ok = false;
}
return ok;
},
 
cleaner: null,
 
clean: function (input) {
if (!UF.cleaner) {
// Because of asynchronous script loading, we need to check whether the TextCleaner is
// already defined. If not, just return the input.
if (window.TextCleaner && TextCleaner.sanitizeWikiText instanceof Function)
UF.cleaner = TextCleaner.sanitizeWikiText;
}
if (UF.cleaner && input && typeof input === 'string')
return UF.cleaner(input, true);
else
return input;
},
 
resetBg: function (e) {
e = e || window.event; // W3C, IE
return UF.verifyMandatoryField(e.target || e.srcElement);
},
 
verifyMandatoryField: function (node, handler) {
if (!node)
return true;
 
try {
if (!node.value ||
node.value.search(/\S/) < 0 ||
handler && handler instanceof Function && handler.length === 1 &&
!handler(node.value)) {
// No value set, or a handler was given and it is a function taking one parameter, and
// it returned false
var isError = node.id !== 'wpPermission';
if (!isError) {
var licenseField = document.getElementById('wpLicense');
// Careful here. The fromwikimedia forms appear not to have a license selector!
isError = !licenseField || !licenseField.selectedIndex;
}
if (isError) {
node.style.backgroundColor = UF.errorColor;
if (!UF.warning_pushed) {
if (UF.errorMsgs)
UF.errorMsgs.push('wpUploadWarningError');
 
UF.warning_pushed = true;
}
return false;
}
}
} catch (ex) {
// Swallow the exception
}
try {
node.style.backgroundColor = '#FFF';
} catch (some_error) {
// Swallow.
}
return true;
},
 
fixCategoryTransclusion: function (str) {
return str.replace(/(\{\{)\s*(:?\s*[Cc]ategory\s*:[^|}]*(\|[^}]*)?)(\}\})/g, '[[$2]]');
}
 
}; // end UF
 
var UploadFormBasic = {
onErrorForm: false, // True iff we're on a re-sent form (error case).
 
setup: function (auto_fill) {
// Special setup: don't use separate input fields; just verify the filename and that the
// description isn't empty.
var desc = document.getElementById('wpUploadDescription');
var previousForm = null;
UF.previous_hotcat_state = null;
if (!UF.isReupload && FormRestorer) {
var currentDestFile = document.getElementById('wpDestFile');
var originalDestFile = null;
if (currentDestFile) {
currentDestFile = currentDestFile.value;
originalDestFile = currentDestFile.defaultValue;
}
if (originalDestFile && originalDestFile.length) {
// If originalDestFile was set to something, we're not on the original upload form but
// on the re-sent form in error cases.
UploadFormBasic.onErrorForm = true;
} else if (currentDestFile && currentDestFile.length) {
previousForm = FormRestorer.readForm('UploadFormBasic');
if (!previousForm && desc && desc.value && desc.value.length) {
// Hmmm... IE sometimes cannot read the cookie (because it wasn't stored, due to some
// strange security settings on some computers that I've been unable to track down).
// If we're here, we have a target file name *and* a description: assume the description
// comes from the browser's field value cache and make sure we don't overwrite it.
auto_fill = false;
}
}
if (previousForm) {
var additionalData = previousForm[0].val;
if (additionalData) {
additionalData = additionalData.split('\t');
var previousFile = additionalData[0];
if (previousFile === currentDestFile) {
if (additionalData.length >= 2)
UF.previous_hotcat_state = additionalData[1];
 
} else {
previousForm = null;
}
}
}
}
UF.formModified = true;
if (document.getElementById('wpLicense'))
UF.setup_license_preview();
 
UF.oldOnSubmit = UF.the_form.onsubmit;
UF.the_form.onsubmit = UploadFormBasic.submit;
if (!UF.isReupload)
UF.addPreviewButton(UploadFormBasic.preview);
 
if (previousForm) {
// Restore form values.
if (desc) {
var prev = UF.getPrevValue(previousForm, desc.id);
if (prev)
desc.value = prev;
 
}
if (UF.previous_hotcat_state && hotcat_set_state instanceof Function) {
if ($('#catlinks').find('.hotcatlink').is(':hidden'))
hotcat_close_form();
UF.previous_hotcat_state = hotcat_set_state(UF.previous_hotcat_state);
}
} else {
if (!!UFConfig.autofill && auto_fill && !UF.isReupload) {
if (desc)
desc.value = UF.empty_template('Information');
}
}
if (desc && desc.value && desc.value.indexOf('{{Information') >= 0) {
// Only hide the box in the Uploadtext if there is really an inormation-template in the
// summary!
var infobox = document.getElementById('Uploadtext-template-box');
if (infobox)
infobox.style.display = 'none';
}
},
 
submit: function (evt) {
var overwrite = false;
if (!UF.isReupload)
overwrite = UF.isOverwrite();
 
if (!UploadFormBasic.verify(overwrite))
return false;
 
if (!UF.isReupload) {
var targetName = document.getElementById('wpDestFile');
if (targetName && targetName.value) { // Strip whitespace
targetName.value = targetName.value.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}
if (!UploadFormBasic.onErrorForm &&
FormRestorer &&
targetName &&
targetName.value) {
var hotcat_state = null;
if (hotcat_get_state instanceof Function) {
if ($('#catlinks').find('.hotcatlink').is(':hidden'))
hotcat_close_form();
 
hotcat_state = hotcat_get_state();
}
// We already know that targetName.value is set!
FormRestorer.saveForm(
'UploadFormBasic',
UF.the_form.id,
targetName.value + (hotcat_state ? '\t' + hotcat_state : ''),
';path=' + document.location.pathname + ';max-age=1800');
// Expire after half an hour.
}
} // end if (UF.isReupload)
 
var desc = document.getElementById('wpUploadDescription');
var old_desc_value = desc.value;
var doSubmit = UF.call_onsubmit(evt || window.event);
if (!doSubmit) {
desc.value = old_desc_value;
} else {
desc.value = UF.fixCategoryTransclusion(UF.clean(desc.value));
UF.hidePreview();
document.getElementById('wpDestFile').disabled = false;
}
return doSubmit;
},
 
preview: function (/* e */) {
var overwrite = UF.isOverwrite();
if (!UploadFormBasic.verify(overwrite))
return false;
 
var desc = document.getElementById('wpUploadDescription');
UF.makePreview(UF.clean(desc.value), overwrite);
return true;
},
 
verify: function (overwrite) {
var desc = document.getElementById('wpUploadDescription');
var ok = true;
 
if (UF.isReupload) {
// Only check that the description isn't empty
if (UF.errorMsgs)
delete UF.errorMsgs;
 
UF.errorMsgs = [];
UF.warning_pushed = false;
if (!desc.value || desc.value.search(/\S/) < 0) {
desc.style.backgroundColor = UF.errorColor;
desc.onkeyup = UF.resetBg;
UF.errorMsgs.push('wpReuploadNoSummaryError');
ok = false;
}
} else {
if (!overwrite) {
if (UF.errorMsgs)
delete UF.errorMsgs;
 
UF.errorMsgs = [];
UF.warning_pushed = false;
 
if (!UF.verifyMandatoryField(desc)) {
desc.onkeyup = UF.resetBg;
ok = false;
} else {
// We do have a non-empty description. Try to split it up and check that the fields for
// author, source, and description are filled in.
var fields = UF.split_description(desc.value);
if (fields && fields.length === 4) {
if (
!fields[1] ||
fields[1].search(/\S/) < 0 || // Author
!fields[2] ||
fields[2].search(/\S/) < 0 // Source
) {
desc.style.backgroundColor = UF.errorColor;
desc.onkeyup = UF.resetBg;
if (!UF.warning_pushed) {
if (UF.errorMsgs)
UF.errorMsgs.push('wpUploadWarningError');
 
UF.warning_pushed = true;
}
ok = false;
}
if (UF.templates[fields[0]].desc_mandatory &&
(!fields[3] || fields[3].search(/\S/) < 0) // Description
) {
desc.style.backgroundColor = UF.errorColor;
desc.onkeyup = UF.resetBg;
UF.errorMsgs.push('wpNoDescriptionError');
ok = false;
}
}
}
// Try a license check
var license = document.getElementById('wpLicense');
if (!license || !license.selectedIndex) {
// There must be a license somewhere in the description.
if (!UF.has_license([desc])) {
var d = desc.value.replace(/\{\{\s*([Ii]nformation|[Pp]ainting|[Ff]lickr)\s*\n/g, '');
if (d.indexOf('{{') < 0) {
// No transcludion that could provide a license either
desc.style.backgroundColor = UF.errorColor;
desc.onkeyup = UF.resetBg;
if (!UF.warning_pushed) {
if (UF.errorMsgs)
UF.errorMsgs.push('wpUploadWarningError');
 
UF.warning_pushed = true;
}
ok = false;
}
// else assume it's ok.
}
} // end license check
var targetName = document.getElementById('wpDestFile');
if (targetName) {
// Trim leading and trailing whitespace
targetName.value = targetName.value.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
if (!UF.verifyFileName(targetName.value)) {
targetName.style.backgroundColor = UF.errorColor;
targetName.onkeyup = function (evt) {
UF.resetBg(evt);
if (wgUploadWarningObj &&
wgUploadWarningObj.keypress instanceof Function &&
!UF.isReupload)
wgUploadWarningObj.keypress();
 
};
ok = false;
}
}
}
} // end if (reupload or not)
if (!ok) {
UF.hidePreview();
UF.display_errors();
} else {
// It's ok: hide our warning box
var myWarning = document.getElementById('wpUploadVerifyWarning');
if (myWarning)
myWarning.style.display = 'none';
 
}
return ok;
} // end verify
 
}; // end UploadFormBasic
 
var UploadFormFull = {
form_type: 0, // 0 - single desc field; 1 - one desc field per language
field_state: null, // Will be initialized in setup below.
 
multi_inputs: null,
// If we're using several description fields, this is an array of objects
 
pushMultiInput: function (sel, text) {
if (!UploadFormFull.multi_inputs) {
UploadFormFull.multi_inputs = [{
selector: sel,
textfield: text
}
];
} else {
UploadFormFull.multi_inputs[UploadFormFull.multi_inputs.length] = {
selector: sel,
textfield: text
};
}
var idx = UploadFormFull.multi_inputs.length;
sel.id = 'wpLangSel' + idx;
sel.name = sel.id;
text.id = 'wpDescText' + idx;
text.name = text.id;
},
 
addDescField: function (content, lang, idx, storedForm) {
var selector = LanguageHandler.getSelect(null, lang, UFUI.getLabel('wpUnknownLanguageUploadLbl', true));
// These style definitions are needed for IE, which otherwise creates excessively wide
// selectors, pushing the main form to the right.
selector.style.maxWidth = '12em';
selector.style.width = '12em';
selector.style.overflow = 'hidden';
var textfield = document.createElement('textarea');
textfield.setAttribute('rows', UFUtils.getHeight(UFConfig.description_height, 2, 6));
textfield.style.width = '100%';
UploadFormFull.pushMultiInput(selector, textfield);
 
var newRow = content.insertRow(idx === null ? content.rows.length : idx);
var firstCell = document.createElement('td');
firstCell.classList.add('mw-label');
firstCell.setAttribute('vAlign', 'top');
firstCell.appendChild(selector);
var secondCell = document.createElement('td');
secondCell.classList.add('mw-input');
secondCell.setAttribute('vAlign', 'top');
secondCell.appendChild(textfield);
newRow.appendChild(firstCell);
newRow.appendChild(secondCell);
 
if (storedForm) {
var prev_idx = UF.getPrevValue(storedForm, selector.id);
var prev_val = UF.getPrevValue(storedForm, textfield.id);
if (prev_val !== null)
textfield.value = prev_val;
 
if (prev_idx !== null) {
selector.options[selector.selectedIndex].selected = false;
selector.options[prev_idx].selected = true;
}
}
UploadFormFull.enableEdittools(textfield);
},
 
addOneDescField: function (/* e */) { // onclick handler for the button
var button = document.getElementById('wpUploadAddDescription');
var table_row = button.parentNode.parentNode;
var idx = table_row.rowIndex;
UploadFormFull.addDescField(table_row.parentNode, null, idx, null);
},
 
addMultiDesc: function (table, idx, storedForm) {
var i;
 
// Add en and user language, if different
var userLang = LanguageHandler.closestLanguage(UFUI.userLanguage);
 
if (userLang === 'pt-br')
userLang = 'pt';
// Per request from Portuguese and Brazilians
var firstCell = document.createElement('td');
firstCell.classList.add('mw-label');
var secondCell = document.createElement('td');
var new_label = document.createElement('label');
new_label.id = 'wpDescLabel';
new_label.appendChild(UFUI.getLabel('wpDescUploadLbl'));
firstCell.appendChild(new_label);
 
var newRow = table.insertRow(idx);
newRow.appendChild(firstCell);
newRow.appendChild(secondCell);
idx++;
 
var added = false;
if (storedForm) {
// Maybe we had more... find 'wpLangSel1'
var curr = 0;
for (i = 1; i < storedForm.length; i++) {
if (storedForm[i].id === 'wpLangSel1') {
curr = i;
break;
}
}
if (curr > 0) {
while (curr < storedForm.length && !storedForm[curr].id.indexOf('wpLangSel')) {
UploadFormFull.addDescField(table, null, idx++, storedForm);
added = true;
curr++;
if (curr < storedForm.length && !storedForm[curr].id.indexOf('wpDescText'))
curr++;
 
}
}
} // end if
if (!added) {
if (UFConfig.description_languages &&
UFConfig.description_languages instanceof Array &&
UFConfig.description_languages.length) {
for (i = 0; i < UFConfig.description_languages.length; i++) {
var lang = LanguageHandler.closestLanguage(UFConfig.description_languages[i]);
UploadFormFull.addDescField(table, lang, idx++, storedForm);
}
} else {
if (UFConfig.own_language_first) {
if (userLang && userLang !== UFUI.defaultLanguage)
UploadFormFull.addDescField(table, userLang, idx++, storedForm);
 
UploadFormFull.addDescField(table, UFUI.defaultLanguage, idx++, storedForm);
} else {
UploadFormFull.addDescField(table, UFUI.defaultLanguage, idx++, storedForm);
if (userLang && userLang !== UFUI.defaultLanguage)
UploadFormFull.addDescField(table, userLang, idx++, storedForm);
 
}
}
}
// Now add a "+" button
var additional = UF.customFormButton(
'wpUploadFormAddDescButton', // Customization ID
'wpUploadAddDescription', // ID of button
'+', // Default text
UploadFormFull.addOneDescField // Event handler
);
 
newRow = table.insertRow(idx++);
firstCell = document.createElement('td');
secondCell = document.createElement('td');
secondCell.classList.add('mw-input');
secondCell.appendChild(additional);
newRow.appendChild(firstCell);
newRow.appendChild(secondCell);
 
return idx;
},
 
changeField: function (field_id) { // Callback for changeable field button
function get_selection(field) {
// Based on code from Jonas Raoni Soares Silva at http://jsfromhell.com/forms/selection
// License: {{tl|attribution}}
// Warning: simplified because we apply it only to an INPUT field. For TEXTAREAs, see the
// URL given.
if (field.selectionStart !== undefined) {
return {
start: field.selectionStart,
end: field.selectionEnd
};
} else if (field.createTextRange) {
field.focus();
var s = document.selection.createRange();
if (s.parentElement() !== field) {
return {
start: 0,
end: 0
};
}
var r = field.createTextRange();
r.setEndPoint('EndToStart', s);
return {
start: r.text.length,
end: r.text.length + s.text.length
};
}
return {
start: 0,
end: 0
};
}
 
var field = document.getElementById(field_id);
if (field.disabled)
return;
// Don't do anything if the field isn't enabled.
 
var button = document.getElementById(field_id + '_Button');
var cell = field.parentNode;
if (!field || !button || !cell)
return;
// Error message here?
var newField = document.createElement('textarea');
var height = UFUtils.getHeight(UploadFormFull.field_state[field_id].height, 2, 4);
newField.setAttribute('rows', height);
newField.style.width = '100%';
newField.value = field.value;
var sel = get_selection(field);
var tab_idx = field.getAttribute('tabindex');
cell.removeChild(button);
cell.replaceChild(newField, field);
field.id = '';
field.onfocus = null;
newField.id = field_id;
newField.setAttribute('tabindex', tab_idx);
UploadFormFull.enableEdittools(newField);
// Restore the selection
if (newField.setSelectionRange) { // e.g. khtml
newField.setSelectionRange(sel.start, sel.end);
} else if (newField.selectionStart !== undefined) {
newField.selectionStart = sel.start;
newField.selectionEnd = sel.end;
} else if (newField.createTextRange) { // IE
var new_selection = newField.createTextRange();
new_selection.move('character', sel.start);
new_selection.moveEnd('character', sel.end - sel.start);
new_selection.select();
}
newField.focus();
UploadFormFull.field_state[field_id].height = height;
},
 
enableEdittools: function (textfield) {
// To be called on each dynamically added field to ensure the edit toolbar works there
if (window.EditTools && EditTools.registerTextField instanceof Function) {
// We have EditTools
var buttons = document.getElementById('specialchars');
if (buttons && buttons.firstChild && buttons.firstChild.nodeName.toLowerCase() === 'select') {
// EditTools is already set up: we have to add an onfocus handler ourselves
$(textfield).focus(EditTools.registerTextField);
}
// Otherwise, EditTools will be set up later, and will catch this field, so we don't have
// to do anything.
}
},
 
switch_intro_text: function () {
// Set up the display of [[MediaWiki:Uploadtext]]
var long_text = document.getElementById('wpUploadFormLongText');
var short_text = document.getElementById('wpUploadFormShortText');
if (long_text && short_text) {
long_text.style.display = 'none';
if (UFUtils.isChildOf(long_text, short_text)) {
// If long_text is a child of short_text, then short_text is already shown, and
// long_text is just a part that isn't needed for the new upload form. Hence
// we're done.
return;
}
if (UFUtils.isChildOf(short_text, long_text)) {
// If the short_text is within the long_text, we need to take it out; otherwise
// it won't be shown.
short_text.parentNode.removeChild(short_text);
long_text.parentNode.insertBefore(short_text, long_text.nextSibling);
}
short_text.style.display = '';
} else {
// Remove the redundant infobox in the uploadtext explanation. People should *not*
// insert this template into description.
var infobox = document.getElementById('Uploadtext-template-box');
if (infobox)
infobox.style.display = 'none';
 
}
},
 
set_hints: function () {
UF.addAfterField('wpDestFile', UFUI.getHint('wpUploadFormDestFileHint'));
UF.addAfterField('wpSource', UFUI.getHint('wpUploadFormSourceHint'));
UF.addAfterField('wpAuthor', UFUI.getHint('wpUploadFormAuthorHint'));
UF.addAfterField('wpDate', UFUI.getHint('wpUploadFormDateHint'));
UF.addAfterField('wpPermission', UFUI.getHint('wpUploadFormPermissionHint'));
UF.addAfterField('wpAdditionalInfo', UFUI.getHint('wpUploadFormAdditionalInfoHint'));
UF.addAfterField('catlinks', UFUI.getHint('wpUploadFormCategoryHint'));
},
 
setup: function () {
function addField(table, idx, id, label, field, storedForm) {
if (!label)
label = UFUI.getLabel(id + 'UploadLbl');
 
var newRow = table.insertRow(idx);
var firstCell = document.createElement('td');
firstCell.classList.add('mw-label');
var new_label = document.createElement('label');
new_label.htmlFor = id;
new_label.appendChild(label);
firstCell.appendChild(new_label);
var secondCell = document.createElement('td');
secondCell.classList.add('mw-input');
field.setAttribute('name', id);
field.setAttribute('id', id);
secondCell.appendChild(field);
newRow.appendChild(firstCell);
newRow.appendChild(secondCell);
var prev_value = UF.getPrevValue(storedForm, id);
if (prev_value)
field.value = prev_value;
 
UploadFormFull.enableEdittools(field);
}
 
function addInput(table, idx, id, label, width, storedForm) {
var newField = document.createElement('input');
newField.setAttribute('type', 'text');
newField.setAttribute('size', String(width));
addField(table, idx, id, label, newField, storedForm);
UploadFormFull.enableEdittools(newField);
return newField;
}
 
function addChangeableField(height, table, idx, id, label, width, storedForm) {
var newField = null;
var field_id = 'wp' + id;
if (!height)
height = UFUtils.getHeight(UploadFormFull.field_state[field_id].height, 1, 4);
 
if (height > 1) {
newField = document.createElement('textarea');
newField.setAttribute('rows', height);
newField.style.width = '100%';
addField(table, idx, 'wp' + id, null, newField, storedForm);
} else {
newField = addInput(table, idx, field_id, null, 80, storedForm);
var button = UF.customFormButton(
'wpUploadForm' + id + 'Button',
field_id + '_Button',
'...',
function () {
UploadFormFull.changeField(field_id);
});
newField.parentNode.insertBefore(button, newField.nextSibling);
}
UploadFormFull.field_state[field_id].height = height;
UploadFormFull.enableEdittools(newField);
}
 
function setCheckBoxes(previousForm, boxes) {
if (!boxes || !boxes.length || !previousForm)
return;
 
for (var i = 0; i < boxes.length; i++) {
if (boxes[i]) {
var prev_val = UF.getPrevValue(previousForm, boxes[i].id);
if (prev_val)
boxes[i].checked = prev_val;
 
}
}
}
 
// Init the field states. Cannot be done earlier, otherwise definitions in user's
// monobook.js (or modern.js, or ...) won't be taken aboard.
UploadFormFull.field_state = {
wpSource: {
height: UFConfig.source_field_size
},
wpAuthor: {
height: UFConfig.author_field_size
}
};


var previousForm = null;
(function () {
var previous_type = -1; // unknown
  'use strict';
var previous_fields = [0, 0];
UF.previous_hotcat_state = null;
if (FormRestorer) {
// We know that when we arrive here originally, wpDestFile.value is empty, as is
// wpDestFile.defaultValue. If we entered something, submitted, and then come back,
// modern browsers restore form entries, at least for the fields in the static XHTML.
// wpDestFile is such a static field (it isn't added by Javascript), so if we have a
// non-empty value here, we know that the form needs to restored. (But see the caveat
// about IE and onload handling at the bottom of the file!)
var currentDestFile = document.getElementById('wpDestFile');
if (currentDestFile)
currentDestFile = currentDestFile.value;


if (currentDestFile && currentDestFile.length)
  // Inicializa todos os componentes de abas na página
previousForm = FormRestorer.readForm('UploadForm');
  function initTabbers() {
    const tabbers = document.querySelectorAll('[data-tabber]');


if (previousForm) {
    tabbers.forEach(function (tabber) {
var additionalData = previousForm[0].val;
      const tabs = tabber.querySelectorAll('.mw-tabber-tab');
if (additionalData) {
      const panels = tabber.querySelectorAll('.mw-tabber-panel');
additionalData = additionalData.split('\t');
var previousFile = additionalData[1];
if (previousFile === currentDestFile) {
previous_type = parseInt(additionalData[0], 10);
previous_fields[0] = parseInt(additionalData[2], 10);
previous_fields[1] = parseInt(additionalData[3], 10);
if (additionalData.length >= 5)
UF.previous_hotcat_state = additionalData[4];


} else {
      tabs.forEach(function (tab) {
previousForm = null;
        tab.addEventListener('click', function () {
}
          const targetTab = this.getAttribute('data-tab');
}
}
}
var originalDesc = document.getElementById('wpUploadDescription');
var original_row = originalDesc.parentNode.parentNode;
var table = original_row.parentNode;
var original_idx = original_row.rowIndex;
UF.formModified = true;
originalDesc.setAttribute('id', '');
UF.oldOnSubmit = UF.the_form.onsubmit;
UF.the_form.onsubmit = UploadFormFull.submit;
table.deleteRow(original_idx);
var idx = original_idx;
// Insert source field
var newField = null;
addChangeableField(previous_fields[0], table, idx++, 'Source', null, 80, previousForm);
addChangeableField(previous_fields[1], table, idx++, 'Author', null, 80, previousForm);
addInput(table, idx++, 'wpDate', null, 80, previousForm);
// Insert description field
if (window.LanguageHandler === undefined || !previous_type) {
// Basic setup
newField = document.createElement('textarea');
newField.setAttribute('rows', UFUtils.getHeight(UFConfig.description_height, 6, 12));
newField.style.width = '100%';
// Do not name the new field 'wpUploadDescription', otherwise MediaWiki:Upload.js
// might prefill it with an information template!
addField(table, idx++, 'wpDesc', null, newField, previousForm);
UploadFormFull.form_type = 0;
} else {
idx = UploadFormFull.addMultiDesc(table, idx, previousForm);
UploadFormFull.form_type = 1;
}
addInput(table, idx++, 'wpOtherVersions', null, 80, previousForm);
addInput(table, idx++, 'wpPermission', null, 80, previousForm);
newField = document.createElement('textarea');
newField.setAttribute('rows', UFUtils.getHeight(UFConfig.additional_info_height, 2, 10));
newField.style.width = '100%';
// Work-around Firefox's "one additional line" bug
addField(table, idx++, 'wpAdditionalInfo', null, newField, previousForm);
// Add a preview button.
UF.addPreviewButton(UploadFormFull.preview);
// Correct tab indices.
for (var i = 0; i < UF.the_form.length; i++)
UF.the_form.elements[i].setAttribute('tabindex', String(i));


var license = document.getElementById('wpLicense');
          // Remove classe active de todas as abas
// Change the license previewer to not cause a table re-layout
          tabs.forEach(function (t) {
if (license) {
            t.classList.remove('active');
// These style definitions are because long option labels result in excessively wide
          });
// selectors, causing also the description fields to go beyond the right border of the
// page.
license.style.maxWidth = '100%';
license.style.width = '100%';
license.style.overflow = 'hidden';
}
UF.setup_license_preview();
if (license) {
var prev = UF.getPrevValue(previousForm, 'wpLicense');
if (prev) {
try {
license.options[license.selectedIndex].selected = false;
license.options[prev].selected = true;
} catch (ex) {}
}
}
// Pre-fill in some cases
if (UFUI.isOwnWork) {
var src = document.getElementById('wpSource');
var author = document.getElementById('wpAuthor');
if (src && !src.value)
src.value = UF.getOwnWorkSource();


if (author && !author.value)
          // Remove classe active de todos os painéis
author.value = UF.getOwnWorkAuthor();
          panels.forEach(function (p) {
            p.classList.remove('active');
          });


if (typeof UFConfig.ownwork_date === 'string' &&
          // Adiciona classe active na aba clicada
UFConfig.ownwork_date.search(/\S/) >= 0) {
          this.classList.add('active');
var date = document.getElementById('wpDate');
if (date && !date.value)
date.value = UFConfig.ownwork_date;


}
          // Adiciona classe active no painel correspondente
}
          const targetPanel = tabber.querySelector('[data-panel="' + targetTab + '"]');
if (previousForm) {
          if (targetPanel) {
setCheckBoxes(
            targetPanel.classList.add('active');
previousForm,
          }
[
        });
document.getElementById('wpWatchthis'),
      });
document.getElementById('wpIgnoreWarning')
    });
]);
  }
}
UploadFormFull.switch_intro_text();
// If HotCat is present, restore its state, too.
if (UF.previous_hotcat_state && hotcat_set_state instanceof Function) {
if ($('#catlinks').find('.hotcatlink').is(':hidden'))
hotcat_close_form();


UF.previous_hotcat_state = hotcat_set_state(UF.previous_hotcat_state);
  // Inicializa quando o DOM estiver pronto
}
  if (document.readyState === 'loading') {
UploadFormFull.set_hints();
    document.addEventListener('DOMContentLoaded', initTabbers);
}, // end setup
  } else {
    initTabbers();
  }


getDescText: function (basic) {
});
var descText = '';
if (!UploadFormFull.multi_inputs) {
var desc = document.getElementById('wpDesc');
if (desc && !desc.disabled)
descText = UF.clean(desc.value);


} else {
/* =============================================================================
for (var i = 0; i < UploadFormFull.multi_inputs.length; i++) {
  GLA language switch (glaLang) - global toggle + page panes + gla:langChanged
if (!UploadFormFull.multi_inputs[i].textfield.disabled) {
  Contrato: localStorage "glaLang" (pt-br | en), evento window "gla:langChanged"
var text = UploadFormFull.multi_inputs[i].textfield.value;
  ============================================================================= */
var selector = UploadFormFull.multi_inputs[i].selector;
(function () {
var lang = selector.options[selector.selectedIndex].value;
  'use strict';
if (text) {
text = UF.clean(text);
if (descText.length)
descText += '\n';


if (!basic && lang && lang !== 'unknown') {
  var STORAGE_KEY = 'glaLang';
// This is Commons-specific! The tl-template is already used, the template for
  var UI_LANGS = ['pt-br', 'en'];
// Tagalog is tgl!
  var FLAG_IMG = {
if (lang === 'tl')
    'pt-br': 'https://wiki.gla.com.br/images/8/8c/Brazil.png',
lang = 'tgl';
    'en': 'https://wiki.gla.com.br/images/0/0a/Usa.png'
  };


descText += '{{' + lang + '|1=' + text + '}}';
  function normalizeLang(s) {
} else {
    s = (s || '').toLowerCase();
descText += text;
    if (s === 'pt-br' || s === 'pt_br' || s === 'ptbr' || s === 'pt') return 'pt';
}
    return (s.split('-')[0] || 'pt');
}
  }
} // end if !disabled
}
}
var more_info = document.getElementById('wpAdditionalInfo');
if (!basic) {
var date = document.getElementById('wpDate');
var src = document.getElementById('wpSource');
var author = document.getElementById('wpAuthor');
var other = document.getElementById('wpPermission');
var othervers = document.getElementById('wpOtherVersions');


descText = '{{Information\n' +
   function toLangTag(langFull) {
'|description   =' + descText + '\n' +
    var tag = (langFull || 'pt-br').toLowerCase();
'|date          =' + (!date.disabled ? UF.clean(date.value) : '') + '\n' +
    if (tag === 'pt') return 'pt-br';
'|source        =' + (!src.disabled ? UF.clean(src.value) : '') + '\n' +
    return UI_LANGS.indexOf(tag) >= 0 ? tag : 'pt-br';
'|author        =' + (!author.disabled ? UF.clean(author.value) : '') + '\n' +
  }
((other && !other.disabled && other.value) ?
'|permission    =' + UF.clean(other.value) + '\n' :
'') +
((othervers && !othervers.disabled && othervers.value) ?
'|other versions=' + UF.clean(othervers.value) + '\n' :
'') +
'}}\n';
} else {
descText += '\n';
}
// Append the additional info, if any
if (more_info && !more_info.disabled && more_info.value)
descText += UF.clean(more_info.value);


return descText;
  function paneMatches(paneLang, langTag) {
},
    var pane = (paneLang || '').toLowerCase();
    var tag = (langTag || 'pt-br').toLowerCase();
    if (pane === tag) return true;
    if ((pane === 'pt' || pane === 'pt-br') && (tag === 'pt' || tag === 'pt-br')) return true;
    return pane.split('-')[0] === tag.split('-')[0];
  }


submit: function (evt) {
  function getStored() {
var overwrite = UF.isOverwrite();
    try {
if (!UploadFormFull.verify(overwrite))
      var saved = (localStorage.getItem(STORAGE_KEY) || '').toLowerCase();
return false;
      if (saved && UI_LANGS.indexOf(saved) >= 0) return saved;
    } catch (e) { }
    return 'pt-br';
  }


// Now put together an information-template
  function markFlags(langTag) {
var descText = UploadFormFull.getDescText(overwrite);
    document.querySelectorAll('.gla-lang-flag[data-lang]').forEach(function (btn) {
var doSubmit = true;
      btn.classList.toggle('active', paneMatches(btn.getAttribute('data-lang'), langTag));
var targetName = document.getElementById('wpDestFile');
    });
if (targetName && targetName.value) { // Strip whitespace
  }
targetName.value = targetName.value.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}


var dummyDesc = document.getElementById('wpUploadDescription');
  function updatePanes(langTag) {
// Sometimes, we do restore from scratch, and sometimes, the browser manages to keep everything.
    document.querySelectorAll('.gla-i18n').forEach(function (wrap) {
// If so, we may have a wpUploadDescription from an earlier submission. Remove it.
      var mode = (wrap.getAttribute('data-gla-i18n-mode') || 'panes').toLowerCase();
if (dummyDesc)
      if (mode === 'client') return;
dummyDesc.parentNode.removeChild(dummyDesc);
      var panes = wrap.querySelectorAll(':scope > .gla-i18n-pane');
      if (!panes.length) return;
      panes.forEach(function (pane) {
        var show = paneMatches(pane.getAttribute('data-lang'), langTag);
        pane.hidden = !show;
        pane.style.display = show ? '' : 'none';
      });
    });
  }


if (FormRestorer && targetName && targetName.value) {
  function applyLang(langFull, opts) {
var hotcat_state = null;
    opts = opts || {};
if (hotcat_get_state instanceof Function) {
    var langTag = toLangTag(langFull);
if ($('#catlinks').find('.hotcatlink').is(':hidden'))
    var norm = normalizeLang(langTag);
hotcat_close_form();


hotcat_state = hotcat_get_state();
    document.documentElement.lang = langTag;
}
    document.documentElement.setAttribute('data-gla-lang', norm);
// We already know that targetName.value is set!
    try {
FormRestorer.saveForm(
      localStorage.setItem(STORAGE_KEY, langTag);
'UploadForm',
    } catch (e) { }
UF.the_form.id,
String(UploadFormFull.form_type) +
'\t' + targetName.value +
'\t' + UploadFormFull.field_state.wpSource.height +
'\t' + UploadFormFull.field_state.wpAuthor.height +
(hotcat_state ? '\t' + hotcat_state : ''),
';path=' + document.location.pathname + ';max-age=1800');
// Expire after half an hour.
}


dummyDesc = document.createElement('textarea');
    markFlags(langTag);
dummyDesc.setAttribute('rows', '6');
    updatePanes(langTag);
dummyDesc.setAttribute('cols', '80');
dummyDesc.style.display = 'none';
dummyDesc.setAttribute('name', 'wpUploadDescription');
dummyDesc.setAttribute('id', 'wpUploadDescription');
UF.the_form.appendChild(dummyDesc);
dummyDesc.value = UF.fixCategoryTransclusion(descText);


doSubmit = UF.call_onsubmit(evt || window.event);
    if (opts.silent !== true) {
if (!doSubmit) {
      try {
// Oops. We actually don't submit. Remove the hidden field
        window.dispatchEvent(new CustomEvent('gla:langChanged', { detail: { norm: norm, tag: langTag } }));
UF.the_form.removeChild(dummyDesc);
      } catch (e2) { }
} else {
    }
UF.hidePreview();
document.getElementById('wpDestFile').disabled = false;
document.getElementById('wpEditToken').disabled = false;
}
return doSubmit;
},


preview: function (/* e */) {
    return norm;
var overwrite = UF.isOverwrite();
  }
if (!UploadFormFull.verify(overwrite))
return false;


UF.makePreview(UploadFormFull.getDescText(overwrite), overwrite);
  function pageHasI18n() {
return true;
    return !!document.querySelector(
},
      '[data-gla-i18n], .gla-i18n, .item-wrapper, .item-tooltip-enc, ' +
      '.gla-item-chip, .gla-quest-item-chip, [data-gla-item-chip], .character-box'
    );
  }


verify: function (overwrite) {
  function shouldShowToggle() {
var src = document.getElementById('wpSource');
    return pageHasI18n();
var author = document.getElementById('wpAuthor');
  }
// var date = document.getElementById( 'wpDate' );
var other = document.getElementById('wpPermission');
// var othervers = document.getElementById( 'wpOtherVersions' );
var moreInfo = document.getElementById('wpAdditionalInfo');
var desc;
var ok = true;


if (!overwrite) {
  function injectToggle() {
if (UF.errorMsgs)
    if (!shouldShowToggle() || document.getElementById('pt-langtoggle')) {
delete UF.errorMsgs;
      return;
    }


UF.errorMsgs = [];
    var ul = document.querySelector('#p-personal .vector-menu-content-list') ||
UF.warning_pushed = false;
      document.querySelector('#p-personal ul');
    if (!ul) return;


if (!UF.verifyMandatoryField(src, function (src) {
    var li = document.createElement('li');
var flickr_ok = !UFUI.isFromFlickr || src.search(/https?:\/\/([^./]+\.)*flickr\.com/) >= 0;
    li.id = 'pt-langtoggle';
if (!flickr_ok)
    li.className = 'mw-list-item';
UF.errorMsgs.push('wpFlickrURLError');


return flickr_ok;
    var group = document.createElement('span');
})) {
    group.className = 'gla-lang-toggle';
src.onkeyup = UF.resetBg;
    group.setAttribute('role', 'group');
ok = false;
    group.setAttribute('aria-label', 'Language');
}
if (!UF.verifyMandatoryField(author)) {
author.onkeyup = UF.resetBg;
ok = false;
}
// Piece the description(s) together
var all_descs = '';
if (!UploadFormFull.multi_inputs) {
desc = document.getElementById('wpDesc');
if (desc)
all_descs = desc.value;


} else {
    UI_LANGS.forEach(function (code) {
for (var input_idx = 0; input_idx < UploadFormFull.multi_inputs.length; input_idx++)
      var btn = document.createElement('button');
all_descs += UploadFormFull.multi_inputs[input_idx].textfield.value;
      btn.type = 'button';
      btn.className = 'gla-lang-flag';
      btn.setAttribute('data-lang', code);
      btn.title = code === 'pt-br' ? 'Português (Brasil)' : 'English';
      btn.setAttribute('aria-label', btn.title);
      var img = document.createElement('img');
      img.src = FLAG_IMG[code] || '';
      img.alt = '';
      img.width = 24;
      img.height = 16;
      btn.appendChild(img);
      group.appendChild(btn);
    });


}
    li.appendChild(group);
// License check
var licenseField = document.getElementById('wpLicense');
if (!(!licenseField || licenseField.selectedIndex > 0) && !UF.has_license([all_descs, other, moreInfo])) {
if (!UF.warning_pushed) {
UF.errorMsgs.push('wpUploadWarningError');
UF.warning_pushed = true;
}
ok = false;
}
var targetName = document.getElementById('wpDestFile');
if (targetName) {
// Trim leading and trailing whitespace
targetName.value = targetName.value.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
if (!UF.verifyFileName(targetName.value)) {
targetName.style.backgroundColor = UF.errorColor;
targetName.onkeyup = function (evt) {
UF.resetBg(evt);
if (wgUploadWarningObj && wgUploadWarningObj.keypress instanceof Function && !UF.isReupload)
wgUploadWarningObj.keypress();


};
    var anchor = document.getElementById('pt-darkmode');
ok = false;
    if (anchor && anchor.parentNode === ul) {
}
      anchor.insertAdjacentElement('afterend', li);
}
    } else {
if (UF.templates[0].desc_mandatory) {
      ul.insertBefore(li, ul.firstChild);
if (all_descs.search(/\S/) < 0) {
    }
if (!UploadFormFull.multi_inputs) {
  }
desc = document.getElementById('wpDesc');
if (desc) {
desc.style.backgroundColor = UF.errorColor;
desc.onkeyup = UF.resetBg;
}
} else {
UploadFormFull.setMultiBg(UF.errorColor, UploadFormFull.resetMultiBg);
}
UF.errorMsgs.push('wpNoDescriptionError');
ok = false;
}
} // end description check
} // end overwrite
if (!ok) {
UF.hidePreview();
UF.display_errors();
} else {
// It's ok: hide our warning box
var myWarning = document.getElementById('wpUploadVerifyWarning');
if (myWarning)
myWarning.style.display = 'none';


}
  function bindToggle() {
return ok;
    if (window.glaLangToggleBound) return;
},
    window.glaLangToggleBound = true;


setMultiBg: function (color, handler) {
    document.addEventListener('click', function (e) {
if (!UploadFormFull.multi_inputs)
      var btn = e.target.closest('.gla-lang-flag[data-lang]');
return;
      if (!btn) return;
      e.preventDefault();
      applyLang(btn.getAttribute('data-lang') || 'pt-br');
    });
  }


for (var i = 0; i < UploadFormFull.multi_inputs.length; i++) {
  function boot() {
var field = UploadFormFull.multi_inputs[i].textfield;
    if (pageHasI18n()) {
field.style.backgroundColor = color;
      document.body.classList.add('gla-i18n-page');
field.onkeyup = handler;
    }
}
    injectToggle();
},
    bindToggle();
    applyLang(getStored(), { silent: true });
    try {
      window.dispatchEvent(new CustomEvent('gla:langChanged', {
        detail: { norm: normalizeLang(getStored()), tag: getStored() }
      }));
    } catch (e) { }
  }


resetMultiBg: function (evt) {
  window.glaLang = {
if (UF.resetBg(evt)) {
    STORAGE_KEY: STORAGE_KEY,
// Reset the backgrounds of all description fields
    UI_LANGS: UI_LANGS,
UploadFormFull.setMultiBg('#FFF', null);
    normalizeLang: normalizeLang,
}
    toLangTag: toLangTag,
}
    getStored: getStored,
    getNorm: function () {
      return normalizeLang(document.documentElement.lang || getStored());
    },
    getWidgetLang: function () {
      return this.getNorm() === 'en' ? 'en' : 'pt';
    },
    applyLang: applyLang
  };


}; // end UploadFormFull
  window.glaLangBoot = boot;


UF.install();
  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', boot);
  } else {
    boot();
  }
  window.addEventListener('load', boot);


}(jQuery, mediaWiki));
  var tries = 0;
// </nowiki>
  var retryTimer = setInterval(function () {
    if (document.getElementById('pt-langtoggle') || !shouldShowToggle() || tries++ > 40) {
      clearInterval(retryTimer);
      return;
    }
    injectToggle();
  }, 150);
})();

Edição atual tal como às 11h48min de 5 de agosto de 2026

/* Any JavaScript here will be loaded for all users on every page load. */

/* Dark mode: fallback se gla-darkmode-boot.php não estiver no servidor */
(function () {
  try {
    if (localStorage.getItem('gla-darkmode') === '1') {
      var root = document.documentElement;
      root.classList.add('client-darkmode', 'skin-theme-clientpref-night');
      if (document.cookie.indexOf('gla-darkmode=1') === -1) {
        document.cookie = 'gla-darkmode=1;path=/;max-age=31536000;SameSite=Lax';
      }
    }
  } catch (e) { }
})();

(function () {
  'use strict';

  function setupDiscordButton() {
    var a = document.querySelector('#n-Discord a');
    if (!a || a.querySelector('.gla-discord-text')) {
      return;
    }

    var icon = document.createElement('span');
    icon.className = 'gla-discord-icon';
    icon.setAttribute('aria-hidden', 'true');

    var textWrap = document.createElement('span');
    textWrap.className = 'gla-discord-text';
    textWrap.innerHTML = 'Entre no <strong>Discord</strong>';

    a.textContent = '';
    a.appendChild(icon);
    a.appendChild(textWrap);
  }

  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', setupDiscordButton);
  } else {
    setupDiscordButton();
  }
})();

(function () {
  'use strict';

  var LOGO_SRC = 'https://wiki.gla.com.br/images/b/bf/WIKIGLAlogo.png';
  var LOGO_RETRIES = 0;
  var LOGO_MAX_RETRIES = 40;

  function resolveLogoSrc() {
    if (typeof mw !== 'undefined' && mw.config && mw.config.get) {
      var skinLogo = mw.config.get('wgLogo');
      if (skinLogo && skinLogo.indexOf('wiki.png') === -1) {
        return skinLogo;
      }
    }
    return LOGO_SRC;
  }

  function setupLogoImg() {
    var a = document.querySelector('#p-logo a.mw-wiki-logo');
    if (!a) {
      return false;
    }

    if (!a.querySelector('.gla-logo-img')) {
      var img = document.createElement('img');
      img.className = 'gla-logo-img';
      img.src = resolveLogoSrc();
      img.alt = '';
      img.setAttribute('decoding', 'async');
      img.setAttribute('draggable', 'false');
      img.addEventListener('error', function onLogoError() {
        if (img.src !== LOGO_SRC) {
          img.src = LOGO_SRC;
        }
      });
      a.appendChild(img);
    }

    return true;
  }

  function trySetupLogo() {
    if (setupLogoImg()) {
      return;
    }
    LOGO_RETRIES += 1;
    if (LOGO_RETRIES < LOGO_MAX_RETRIES) {
      window.setTimeout(trySetupLogo, 50);
    }
  }

  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', trySetupLogo);
  } else {
    trySetupLogo();
  }
})();

(function () {
  'use strict';

  var STORAGE_KEY = 'gla-darkmode';
  var LINK_CLASS = 'darkmode-link';
  var LABEL_DARK = 'Modo escuro';
  var LABEL_LIGHT = 'Modo padr\u00e3o';

  function isDark() {
    return document.documentElement.classList.contains('client-darkmode');
  }

  function setDarkModeCookie(on) {
    try {
      document.cookie = 'gla-darkmode=' + (on ? '1' : '0') + ';path=/;max-age=' + (on ? 31536000 : 0) + ';SameSite=Lax';
    } catch (e) { }
  }

  function setDark(on) {
    var root = document.documentElement;
    root.classList.toggle('client-darkmode', on);
    root.classList.toggle('skin-theme-clientpref-night', on);
    root.classList.toggle('skin-theme-clientpref-day', !on);
    try {
      localStorage.setItem(STORAGE_KEY, on ? '1' : '0');
    } catch (e) { }
    setDarkModeCookie(on);
    updateLinks(on);
  }

  function updateLinks(on) {
    var links = document.querySelectorAll('.' + LINK_CLASS);
    var label = on ? LABEL_LIGHT : LABEL_DARK;
    for (var i = 0; i < links.length; i++) {
      links[i].textContent = label;
    }
  }

  function findDarkLink(el) {
    while (el && el !== document) {
      if (el.classList && el.classList.contains(LINK_CLASS)) {
        return el;
      }
      el = el.parentNode;
    }
    return null;
  }

  function injectToggle() {
    if (document.getElementById('pt-darkmode')) {
      return;
    }

    var ul = document.querySelector('#p-personal .vector-menu-content-list') ||
      document.querySelector('#p-personal ul');
    if (!ul) {
      return;
    }

    var li = document.createElement('li');
    li.id = 'pt-darkmode';

    var a = document.createElement('a');
    a.href = '#';
    a.className = LINK_CLASS;
    a.textContent = isDark() ? LABEL_LIGHT : LABEL_DARK;
    li.appendChild(a);

    var afterLi = document.getElementById('pt-mytalk') ||
      document.getElementById('pt-anontalk') ||
      document.getElementById('pt-userpage') ||
      document.getElementById('pt-anonuserpage');

    if (afterLi && afterLi.parentNode === ul) {
      afterLi.insertAdjacentElement('afterend', li);
    } else {
      ul.insertBefore(li, ul.firstChild);
    }
  }

  function bindToggle() {
    if (window.glaDarkModeBound) {
      return;
    }
    window.glaDarkModeBound = true;

    document.addEventListener('click', function (e) {
      var link = findDarkLink(e.target);
      if (!link) {
        return;
      }
      e.preventDefault();
      setDark(!isDark());
    });
  }

  function boot() {
    injectToggle();
    bindToggle();
    updateLinks(isDark());
  }

  window.glaDarkModeBoot = boot;
  window.addEventListener('load', boot);

  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', boot);
  } else {
    boot();
  }

  function markThemeReady() {
    document.documentElement.classList.add('gla-theme-ready');
  }

  if (document.readyState === 'complete') {
    requestAnimationFrame(markThemeReady);
  } else {
    window.addEventListener('load', function () {
      requestAnimationFrame(markThemeReady);
    });
  }

  var tries = 0;
  var retryTimer = setInterval(function () {
    if (document.getElementById('pt-darkmode') || tries++ > 40) {
      clearInterval(retryTimer);
      return;
    }
    boot();
  }, 150);
})();



$(document).ready(function () {
  //------- GLOBAL EVENTS TIMER ---------
  (function () {
    var globalEventsTimer = $('#global-event-time'); // Atualizado: ID do Timer dos Global Events
    var globalEventsImage = $('.global-event-image'); // Atualizado: Classe da Imagem dos Global Events
    var globalEventsInterval;

    // Informações dos eventos
    /*
      0 - Domingo
      1 - Segunda-feira
      2 - Terça-feira
      3 - Quarta-feira
      4 - Quinta-feira
      5 - Sexta-feira
      6 - Sábado
    */
    var globalEventsInfo = {
      0: [
        { name: 'Foxy Memory', time: '02:00:00', src: '/images/3/37/Foxy_memory_event.png' },
        { name: 'Foxy race (ship)', time: '09:00:00', src: '/images/2/29/Foxy_race_ship_event.png' },
        { name: 'Deathmatch', time: '12:00:00', src: '/images/4/46/Deathmatch_event.png' },
        { name: 'Foxy race', time: '15:00:00', src: '/images/e/e8/Foxy_race_event.png' },
        { name: 'Foxy quiz', time: '19:00:00', src: '/images/b/b3/Foxy_quiz_event.png' },
        { name: 'Foxy count', time: '22:00:00', src: '/images/f/f3/Foxy_count_event.png' },
      ],
      1: [
        { name: 'Foxy Memory', time: '02:00:00', src: '/images/3/37/Foxy_memory_event.png' },
        { name: 'Foxy race (ship)', time: '09:00:00', src: '/images/2/29/Foxy_race_ship_event.png' },
        { name: 'Deathmatch', time: '12:00:00', src: '/images/4/46/Deathmatch_event.png' },
        { name: 'Foxy race', time: '15:00:00', src: '/images/e/e8/Foxy_race_event.png' },
        { name: 'Foxy quiz', time: '19:00:00', src: '/images/b/b3/Foxy_quiz_event.png' },
        { name: 'Foxy count', time: '22:00:00', src: '/images/f/f3/Foxy_count_event.png' },
      ],
      2: [
        { name: 'Foxy race (ship)', time: '02:00:00', src: '/images/2/29/Foxy_race_ship_event.png' },
        { name: 'Deathmatch', time: '09:00:00', src: '/images/4/46/Deathmatch_event.png' },
        { name: 'Foxy race', time: '12:00:00', src: '/images/e/e8/Foxy_race_event.png' },
        { name: 'Foxy quiz', time: '15:00:00', src: '/images/b/b3/Foxy_quiz_event.png' },
        { name: 'Foxy count', time: '19:00:00', src: '/images/f/f3/Foxy_count_event.png' },
        { name: 'Foxy Memory', time: '22:00:00', src: '/images/3/37/Foxy_memory_event.png' },
      ],
      3: [
        { name: 'Deathmatch', time: '02:00:00', src: '/images/4/46/Deathmatch_event.png' },
        { name: 'Foxy race', time: '09:00:00', src: '/images/e/e8/Foxy_race_event.png' },
        { name: 'Foxy quiz', time: '12:00:00', src: '/images/b/b3/Foxy_quiz_event.png' },
        { name: 'Foxy count', time: '15:00:00', src: '/images/f/f3/Foxy_count_event.png' },
        { name: 'Foxy Memory', time: '19:00:00', src: '/images/3/37/Foxy_memory_event.png' },
        { name: 'Foxy race (ship)', time: '22:00:00', src: '/images/2/29/Foxy_race_ship_event.png' },
      ],
      4: [
        { name: 'Foxy race', time: '02:00:00', src: '/images/e/e8/Foxy_race_event.png' },
        { name: 'Foxy quiz', time: '09:00:00', src: '/images/b/b3/Foxy_quiz_event.png' },
        { name: 'Foxy count', time: '12:00:00', src: '/images/f/f3/Foxy_count_event.png' },
        { name: 'Foxy Memory', time: '15:00:00', src: '/images/3/37/Foxy_memory_event.png' },
        { name: 'Foxy race (ship)', time: '19:00:00', src: '/images/2/29/Foxy_race_ship_event.png' },
        { name: 'Deathmatch', time: '22:00:00', src: '/images/4/46/Deathmatch_event.png' },
      ],
      5: [
        { name: 'Foxy quiz', time: '02:00:00', src: '/images/b/b3/Foxy_quiz_event.png' },
        { name: 'Foxy count', time: '09:00:00', src: '/images/f/f3/Foxy_count_event.png' },
        { name: 'Foxy Memory', time: '12:00:00', src: '/images/3/37/Foxy_memory_event.png' },
        { name: 'Foxy race (ship)', time: '15:00:00', src: '/images/2/29/Foxy_race_ship_event.png' },
        { name: 'Deathmatch', time: '19:00:00', src: '/images/4/46/Deathmatch_event.png' },
        { name: 'Foxy race', time: '22:00:00', src: '/images/e/e8/Foxy_race_event.png' },
      ],
      6: [
        { name: 'Foxy count', time: '02:00:00', src: '/images/f/f3/Foxy_count_event.png' },
        { name: 'Foxy Memory', time: '09:00:00', src: '/images/3/37/Foxy_memory_event.png' },
        { name: 'Foxy race (ship)', time: '12:00:00', src: '/images/2/29/Foxy_race_ship_event.png' },
        { name: 'Deathmatch', time: '15:00:00', src: '/images/4/46/Deathmatch_event.png' },
        { name: 'Foxy race', time: '21:55:00', src: '/images/e/e8/Foxy_race_event.png' },
        { name: 'Foxy quiz', time: '22:00:00', src: '/images/b/b3/Foxy_quiz_event.png' },
      ]
    };

    function pad(value) {
      return value < 10 ? '0' + value : value;
    }

    function getBrazilTime() {
      var now = new Date();
      var utc = now.getTime() + (now.getTimezoneOffset() * 60000); // Converte para UTC
      return new Date(utc - (3 * 3600000)); // Ajusta para UTC-3
    }

    function startGlobalEventCountdown(eventStartTime, eventEndTime) {
      if (globalEventsInterval) clearInterval(globalEventsInterval);

      globalEventsInterval = setInterval(function () {
        var now = getBrazilTime().getTime();

        if (now < eventEndTime) {
          var timeRemaining = Math.ceil((eventEndTime - now) / 1000); // Segundos restantes
          var minutes = Math.floor(timeRemaining / 60);
          var seconds = timeRemaining % 60;
          globalEventsTimer.html('Iniciando: ' + pad(minutes) + ":" + pad(seconds));
        } else {
          clearInterval(globalEventsInterval);
          setGlobalEvent();
        }
      }, 1000);
    }

    function setGlobalEvent() {
      var now = getBrazilTime(); // Usa o horário do Brasil
      var dayEvents = globalEventsInfo[now.getDay()];

      if (!dayEvents || dayEvents.length === 0) {
        globalEventsImage.attr('src', '/images/0/0a/Anyevent.png'); // Imagem padrão
        globalEventsTimer.html('Acabaram os eventos por hoje');
        return;
      }

      for (var i = 0; i < dayEvents.length; i++) {
        var event = dayEvents[i];
        var timeParts = event.time.split(':');
        var eventStartTime = new Date(
          now.getFullYear(),
          now.getMonth(),
          now.getDate(),
          parseInt(timeParts[0], 10),
          parseInt(timeParts[1], 10),
          parseInt(timeParts[2], 10)
        ).getTime();
        var eventEndTime = eventStartTime + 5 * 60 * 1000; // Evento dura 5 minutos para entrada

        if (now >= eventStartTime && now < eventEndTime) {
          // Durante o período de entrada do evento
          globalEventsImage.attr('src', event.src);
          startGlobalEventCountdown(eventStartTime, eventEndTime);
          return;
        }

        if (now < eventStartTime) {
          // Antes do evento, exibe o horário fixo
          globalEventsImage.attr('src', event.src);
          globalEventsTimer.html(
            new Date(eventStartTime).toLocaleTimeString('pt-BR', {
              hour: '2-digit',
              minute: '2-digit',
            })
          );

          // Só inicia a contagem regressiva quando estiver próximo (faltando 5 minutos ou menos)
          if (eventStartTime - now <= 5 * 60 * 1000) {
            startGlobalEventCountdown(eventStartTime, eventEndTime);
          }
          return;
        }
      }

      // Após o último evento do dia
      globalEventsImage.attr('src', '/images/0/0a/Anyevent.png'); // Imagem padrão
      globalEventsTimer.html('Acabaram os eventos por hoje');
    }

    $(document).ready(function () {
      setGlobalEvent();
    });
  })();
  //------- GLOBAL EVENTS TIMER ---------
  //------- TOOLTIP IMAGE---------
  /*
      Tooltip image consiste em uma funcionalidade que insere uma tag IMG 
      quando o usuario passa o mouse por cima de uma imagem com a classe "tooltip-image"
      ao fazer é inserido no body uma tag IMG com a mesma "src" 1.3 vezes maior do que a imagem
      que o usuario está com o mouse em coma, esta tag IMG terá o mesmo X e Y do mouse + um offset 
      para manter um distanciamento.
  */

  //Distanciamento / margem do mouse
  const offset = { x: 20, y: 10 };

  $('.tooltip-image').on('mouseenter',
    function (e) {
      var src = $(this).attr('src');
      var size = $(this).width() * 1.3;

      $('<img src="' + src + '" id="bigImage" />').css('left', e.pageX + offset.x).css('top', e.pageY + offset.y).css('width', size + "px").appendTo('body').hide().fadeIn(500);
    }).on('mouseleave',
      function () {
        $('#bigImage').remove();
      });

  $('.tooltip-image').mousemove(function (e) {
    $('#bigImage').css('left', e.pageX + offset.x).css('top', e.pageY + offset.y);
  });
  //------- TOOLTIP IMAGE---------

  //------- FUNCIONALIDADES PACIENTES KUREHA ---------
  const pacients = {
    "bafo": { image: "/images/c/ce/Bafo_static.png", gif: "/images/e/e0/Bafo.gif" },
    "espirrando": { image: "/images/thumb/5/5b/Espirro_static.png/180px-Espirro_static.png", gif: "/images/thumb/9/90/Espirro.gif/180px-Espirro.gif", audio: "/images/2/2b/Espirrando.ogg" },
    "enjoado": { image: "/images/thumb/5/52/Enjoado_static.png/180px-Enjoado_static.png", gif: "/images/thumb/7/76/Enjoado.gif/180px-Enjoado.gif", audio: "/images/5/5b/Vomito.ogg" },
    "tremendo": { image: "/images/thumb/3/35/Tremendo_static.png/180px-Tremendo_static.png", gif: "/images/thumb/f/f4/Tremendo.gif/180px-Tremendo.gif" },
    "tossindo": { image: "/images/thumb/e/ef/Tosse_static.png/180px-Tosse_static.png", gif: "/images/thumb/a/a4/Tosse.gif/180px-Tosse.gif", audio: "/images/f/f9/Tossindo.ogg" },
    "solucando": { image: "/images/thumb/c/c0/Soluco_static.png/180px-Soluco_static.png", gif: "/images/thumb/6/67/Soluco.gif/180px-Soluco.gif", audio: "/images/e/e2/Solucando.ogg" },
    "funk": { image: "/images/thumb/e/e8/Funkeiro_static.png/180px-Funkeiro_static.png ", gif: "/images/thumb/7/79/Funkeiro.gif/180px-Funkeiro.gif", audio: "/images/d/d2/Funk.ogg" },
    "fedendo": { image: "/images/thumb/1/1e/Fedido_static.png/180px-Fedido_static.png", gif: "/images/thumb/c/c9/Fedido.gif/180px-Fedido.gif" },
    "febre": { image: "/images/thumb/1/14/Febre_static.png/180px-Febre_static.png", gif: "/images/thumb/7/75/Febre.gif/180px-Febre.gif" },
    "endemoniado": { audio: "/images/3/32/Risada_maligna.ogg" },
    "fome": { audio: "/images/3/37/Estomago_roncando.ogg" },
    "cardiaco": { audio: "/images/2/27/Coracao_batendo.ogg" }
  };

  const audioPlayer = document.querySelector("#audio");

  $(".pacient-audio").on("click", function (e) {
    id = $(this).attr('id');

    if (pacients[id]) {
      audioPlayer.src = pacients[id].audio;
      audioPlayer.play();
    }

  });

  $('.interactive-pacient').on('mouseenter', function (e) {
    id = $(this).attr('id');

    if (pacients[id])
      $(this).attr('src', pacients[id].gif);
  }).on('mouseleave', function (e) {
    id = $(this).attr('id');

    if (pacients[id])
      $(this).attr('src', pacients[id].image);
  });

  //------- FUNCIONALIDADES PACIENTES KUREHA ---------
  //------- FUNCIONALIDADES BUZINAS ---------
  const horns = {
    "Buzinadelacucha": { audio: "/images/5/55/Buzinadelacucha-audio.ogg" },
    "Buzinadefumaca": { audio: "/images/3/3a/Buzinadefumaca-audio.ogg" },
    "Buzinadecaminhao": { audio: "/images/e/e4/Buzinadecaminhao-audio.ogg" },
    "Buzinadetrem": { audio: "/images/3/34/Buzinadetrem-audio.ogg" },
    "Buzinadeesporte": { audio: "/images/2/2b/Buzinadeesporte-audio.ogg" },
    "Buzinadear": { audio: "/images/9/95/Buzinadear-audio.ogg" },
    "Buzinadepalhaco": { audio: "/images/a/a4/Buzinadepalhaco-audio.ogg" },
    "Buzinadeinvestida": { audio: "/images/f/ff/Buzinadeinvestida-audio.ogg" },
    "Buzinadebicicleta": { audio: "/images/1/15/Buzinadebicicleta-audio.ogg" },
    "Buzinadeneblina": { audio: "/images/6/64/Buzinadeneblina-audio.ogg" }
  };

  const hornAudioPlayer = document.querySelector("#audio");

  $(".horn-audio").on("click", function (e) {
    const id = $(this).attr('id');
    if (horns[id]) {
      hornAudioPlayer.src = horns[id].audio;
      hornAudioPlayer.play();
    }
  });

  //------- FUNCIONALIDADES BUZINAS ---------
});


/**
* Script JavaScript para o componente de abas MediaWiki
* Adicione este script na sua MediaWiki (Common.js ou página de scripts)
*/

(function () {
  'use strict';

  // Inicializa todos os componentes de abas na página
  function initTabbers() {
    const tabbers = document.querySelectorAll('[data-tabber]');

    tabbers.forEach(function (tabber) {
      const tabs = tabber.querySelectorAll('.mw-tabber-tab');
      const panels = tabber.querySelectorAll('.mw-tabber-panel');

      tabs.forEach(function (tab) {
        tab.addEventListener('click', function () {
          const targetTab = this.getAttribute('data-tab');

          // Remove classe active de todas as abas
          tabs.forEach(function (t) {
            t.classList.remove('active');
          });

          // Remove classe active de todos os painéis
          panels.forEach(function (p) {
            p.classList.remove('active');
          });

          // Adiciona classe active na aba clicada
          this.classList.add('active');

          // Adiciona classe active no painel correspondente
          const targetPanel = tabber.querySelector('[data-panel="' + targetTab + '"]');
          if (targetPanel) {
            targetPanel.classList.add('active');
          }
        });
      });
    });
  }

  // Inicializa quando o DOM estiver pronto
  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', initTabbers);
  } else {
    initTabbers();
  }

  // Suporte para MediaWiki (quando o conteúdo é carregado dinamicamente)
  if (typeof mw !== 'undefined' && mw.hook) {
    mw.hook('wikipage.content').add(function () {
      initTabbers();
    });
  }
})();


/* =============================================================================
   GLA pages legacy (provisório) — personagens, wanted, skills, calc XP, abas
   Extraído de antigo_common.js
   ============================================================================= */

$(document).ready(function () {
  //------- PERSONAGENS ---------

  const characters = [
    { name: "Silvers Rayleigh", types: ["slasher", "dps", "diamond", "break_wall"], link: "/Silvers_Rayleigh", img: "/images/f/f1/Rayleigh_Card.png" },
    { name: "Monkey D Garp", types: ["fighter", "dps", "marine", "diamond", "break_wall"], link: "/Monkey_D_Garp", img: "/images/a/a1/GarpCard.png" },
    { name: "Aokiji Dio", types: ["slasher", "especialist", "tank", "marine", "diamond", "break_wall", "bridge"], link: "/Aokiji", img: "/images/6/67/Aokiji_card.png" },
    { name: "Bartolomew Kuma", types: ["especialist", "tank", "diamond", "break_wall"], link: "/Kuma", img: "/images/b/b5/Card-kuma.png" },
    { name: "Boa Hancock", types: ["fighter", "dps", "diamond"], link: "/Boa_Hancock", img: "/images/4/47/Card-hancock.png" },
    { name: "Borsalino Kizaru", types: ["especialist", "shooter", "dps", "diamond", "break_wall"], link: "/Kizaru", img: "/images/3/32/Card-kizaru.png" },
    { name: "Brook (TS)", types: ["slasher", "support", "diamond", "bridge"], link: "/Brook_(Timeskip)", img: "/images/1/1d/Card-brookts.png" },
    { name: "Tony Tony Chopper (TS) Gurren", types: ["fighter", "support", "diamond", "break_wall"], link: "/Chopper_(Timeskip)", img: "/images/5/53/Card-chopperts.png" },
    { name: "Doflamingo", types: ["shooter", "especialist", "dps", "diamond", "break_wall", "bridge"], link: "/Doflamingo", img: "/images/8/8d/Card-doflamingo.png" },
    { name: "Dracule Mihawk", types: ["slasher", "dps", "diamond", "break_wall"], link: "/Mihawk", img: "/images/9/91/Card-mihawk.png" },
    { name: "Emporio Ivankov", types: ["fighter", "support", "diamond", "break_wall"], link: "/Ivankov", img: "/images/c/ca/Card-ivankov.png" },
    { name: "Enel", types: ["shooter", "especialist", "diamond", "dps"], link: "/Enel", img: "/images/8/85/Enel_card.png" },
    { name: "Franky (TS) Sanitaria", types: ["shooter", "tank", "diamond", "break_wall"], link: "/Franky_(Timeskip)", img: "/images/d/d0/Card-frankyts.png" },
    { name: "Jinbe", types: ["fighter", "tank", "diamond", "break_wall"], link: "/Jinbe", img: "/images/2/2e/Card-jinbe.png" },
    { name: "Marshall D. Teach Barba Negra", types: ["especialist", "bruiser", "diamond"], link: "/Marshall_D._Teach", img: "/images/f/ff/Card-kurohige.png" },
    { name: "Marco Abacaxi", types: ["especialist", "fighter", "support", "diamond"], link: "/Marco", img: "/images/2/2b/Marco_card.png" },
    { name: "Monkey D. Luffy (TS) Visno", types: ["fighter", "dps", "diamond", "break_wall"], link: "/Luffy_(Timeskip)", img: "/images/e/ed/Card-luffyts.png" },
    { name: "Nami (TS)", types: ["especialist", "dps", "diamond"], link: "/Nami_(timeskip)", img: "/images/3/35/Card-namits.png" },
    { name: "Portgas D. Ace Duduh", types: ["especialist", "shooter", "dps", "diamond"], link: "/Ace", img: "/images/4/40/Card-ace.png" },
    { name: "Robin (TS)", types: ["especialist", "dps", "diamond", "break_wall", "bridge"], link: "/Robin_(Timeskip)", img: "/images/b/b0/Card-robints.png" },
    { name: "Roronoa Zoro (TS)", types: ["slasher", "dps", "diamond", "break_wall"], link: "/Zoro_(Timeskip)", img: "/images/7/74/Card-zorots.png" },
    { name: "Sabo", types: ["fighter", "especialist", "dps", "diamond", "break_wall"], link: "/Sabo", img: "/images/0/04/Card-sabo.png" },
    { name: "Sakazuki Akainu", types: ["especialist", "fighter", "dps", "diamond", "break_wall"], link: "/Akainu", img: "/images/b/b0/Card_akainu.png" },
    { name: "Shanks", types: ["slasher", "bruiser", "diamond", "break_wall"], link: "/Shanks", img: "/images/a/aa/Card-shanks.png" },
    { name: "Usopp (TS)", types: ["shooter", "dps", "diamond", "break_wall"], link: "/Usopp_(Timeskip)", img: "/images/c/cc/Card-usoppts.png" },
    { name: "Uta", types: ["especialist", "dps", "diamond", "break_wall"], link: "/Uta", img: "/images/2/22/Card_uta.png" },
    { name: "Vinsmoke Sanji (TS)", types: ["fighter", "dps", "diamond", "break_wall"], link: "/Sanji_(Timeskip)", img: "/images/7/7a/Card-sanjits.png" },

    { name: "Kalifa", types: ["support", "gold", "especialist", "break_wall"], link: "/Kalifa", img: "/images/3/39/Kalifa_card.png" },
    { name: "Jabra", types: ["slasher", "dps", "gold", "break_wall"], link: "/Jabra", img: "/images/9/98/Jabra_card.png" },
    { name: "Kaku", types: ["slasher", "shooter", "dps", "gold", "break_wall"], link: "/Kaku", img: "/images/9/98/Kaku_card.png" },
    { name: "Rob Lucci", types: ["fighter", "dps", "gold", "break_wall"], link: "/Rob Lucci", img: "/images/b/b1/Rob_Lucci_card.png" },
    { name: "Blueno", types: ["fighter", "dps", "gold", "break_wall"], link: "/Blueno", img: "/images/5/55/Blueno_card.png" },
    { name: "Marguerite", types: ["shooter", "dps", "gold", "break_wall"], link: "/Marguerite", img: "/images/1/1c/Marguerite_Card.png" },
    { name: "Baby 5", types: ["slasher", "shooter", "gold", "dps"], link: "/Baby_5", img: "/images/5/5e/Baby5_card.png" },
    { name: "Bartolomeo", types: ["especialist", "dps", "gold", "break_wall", "bridge"], link: "/Bartolomeo", img: "/images/a/a9/Card-barto.png" },
    { name: "Basil Hawkins Lost", types: ["especialist", "bruiser", "gold", "bridge"], link: "/Basil_Hawkins", img: "/images/8/89/Card-hawkins.png" },
    { name: "Bastille", types: ["slasher", "tank", "gold", "break_wall"], link: "/Bastille", img: "/images/1/13/Card-bastille.png" },
    { name: "Bellamy", types: ["fighter", "dps", "gold", "break_wall"], link: "/Bellamy", img: "/images/7/7e/Card-bellamy.png" },
    { name: "Bonney Poseidon", types: ["fighter", "support", "gold"], link: "/Bonney", img: "/images/9/91/Card-bonney.png" },
    { name: "Brook", types: ["slasher", "support", "gold"], link: "/brook", img: "/images/7/76/Card-brook.png" },
    { name: "Capone gang bege", types: ["shooter", "dps", "gold", "break_wall"], link: "/Capone_Bege", img: "/images/c/c0/Card-capone.png" },
    { name: "Carrot", types: ["slasher", "especialist", "dps", "gold"], link: "/Carrot", img: "/images/8/8d/Card-carrot.png" },
    { name: "Tony Tony Chopper Gurren", types: ["fighter", "support", "gold", "break_wall"], link: "/Chopper", img: "/images/1/19/Card-chopper.png" },
    { name: "Crocodile", types: ["especialist", "tank", "gold", "break_wall", "bridge"], link: "/Crocodile", img: "/images/5/5d/Card-crocodile.png" },
    { name: "Dalmatian", types: ["slasher", "bruiser", "gold", "break_wall"], link: "/Dalmatian", img: "/images/9/99/Card-dalmatian.png" },
    { name: "Franky Sanitaria", types: ["shooter", "bruiser", "gold", "break_wall"], link: "/Franky", img: "/images/6/61/Card-franky.png" },
    { name: "Gecko Moria Coxinha", types: ["slasher", "support", "gold"], link: "/Gecko_Moria", img: "/images/f/fc/Moria_card.png" },
    { name: "Hina", types: ["fighter", "bruiser", "gold", "break_wall", "bridge"], link: "/Hina", img: "/images/5/57/Card-hina.png" },
    { name: "Jesus Burgess", types: ["fighter", "tank", "gold", "break_wall"], link: "/Jesus_Burgess", img: "/images/2/28/Card-burgess.png" },
    { name: "Eustass Kid Rag", types: ["shooter", "tank", "gold", "break_wall", "bridge"], link: "/Kid", img: "/images/9/9a/Card-kid.png" },
    { name: "Killer", types: ["slasher", "dps", "gold"], link: "/Killer", img: "/images/b/b2/Card-killer.png" },
    { name: "Koala", types: ["fighter", "dps", "gold"], link: "/Koala", img: "/images/f/f3/Card-koala.png" },
    { name: "Leo & Mansherry", types: ["especialist", "support", "gold", "bridge"], link: "/Leo", img: "/images/d/d9/Card-leo.png" },
    { name: "Monkey D. Luffy Visno", types: ["fighter", "bruiser", "gold", "break_wall"], link: "/Luffy", img: "/images/a/af/Card-luffy.png" },
    { name: "Nami", types: ["especialist", "dps", "gold", "break_wall"], link: "/nami", img: "/images/0/08/Card-nami.png" },
    { name: "Perona", types: ["especialist", "support", "gold", "break_wall"], link: "/Perona", img: "/images/6/6d/Card-perona.png" },
    { name: "Rebecca Ghoul Den Berry", types: ["slasher", "tank", "gold"], link: "/Rebecca", img: "/images/9/91/Card-rebecca.png" },
    { name: "Nico Robin", types: ["especialist", "dps", "gold", "break_wall", "bridge"], link: "/Robin", img: "/images/3/3f/Card-robin.png" },
    { name: "Roronoa zoro", types: ["slasher", "bruiser", "gold", "break_wall"], link: "/Roronoa_Zoro", img: "/images/6/6f/Card-zoro.png" },
    { name: "Ryuma", types: ["slasher", "dps", "gold"], link: "/Ryuma", img: "/images/a/ac/Card-ryuma.png" },
    { name: "Scratchmen Apoo", types: ["shooter", "support", "gold"], link: "/Apoo", img: "/images/9/90/Card-apoo.png" },
    { name: "Smoker Piseiro", types: ["fighter", "tank", "gold"], link: "/Smoker", img: "/images/f/fb/Card-smoker.png" },
    { name: "Trafalgar Law", types: ["slasher", "especialist", "dps", "gold", "break_wall"], link: "/Trafalgar_Law", img: "/images/b/b9/Card-law.png" },
    { name: "Urouge", types: ["fighter", "tank", "gold", "break_wall"], link: "/Urouge", img: "/images/9/98/Card-urouge.png" },
    { name: "Usopp", types: ["shooter", "dps", "gold", "break_wall"], link: "/Usopp", img: "/images/a/ac/Card-usopp.png" },
    { name: "Van Augur", types: ["shooter", "dps", "gold", "break_wall"], link: "/Van Augur", img: "/images/c/c7/Card-vanaugur.png" },
    { name: "Vinsmoke Ichiji", types: ["fighter", "bruiser", "gold", "break_wall"], link: "/Ichiji", img: "/images/8/8c/Card-ichiji.png" },
    { name: "Vinsmoke Niji", types: ["shooter", "dps", "gold"], link: "/Niji", img: "/images/6/66/Card-niji.png" },
    { name: "Vinsmoke Reiju Athena", types: ["especialist", "support", "gold"], link: "/Reiju", img: "/images/2/23/Card-reiju.png" },
    { name: "Vinsmoke Sanji", types: ["fighter", "dps", "gold", "break_wall"], link: "/Sanji", img: "/images/0/04/Card-sanji.png" },
    { name: "Vinsmoke Yonji", types: ["fighter", "tank", "gold", "break_wall"], link: "/Yonji", img: "/images/7/73/Card-yonji.png" },
    { name: "X-drake", types: ["fighter", "bruiser", "gold", "break_wall"], link: "/X_Drake", img: "/images/6/69/Card-drake.png" },
    { name: "Satori", types: ["support", "shooter", "especialist", "silver"], link: "/Satori", img: "/images/f/f3/Satori_card.png" },
    { name: "Gedatsu", types: ["fighter", "dps", "silver"], link: "/Gedatsu", img: "/images/f/f6/Gedatsu_card.png" },
    { name: "Ohm", types: ["tank", "slasher", "silver"], link: "/Ohm", img: "/images/1/1e/Ohm_card.png" },
    { name: "Shura", types: ["slasher", "dps", "silver"], link: "/Shura", img: "/images/2/2e/Shura_card.png" },
    { name: "Arlong", types: ["fighter", "bruiser", "silver", "break_wall"], link: "/Arlong", img: "/images/1/1e/Card-arlong.png" },
    { name: "Bepo", types: ["fighter", "dps", "silver"], link: "/Bepo", img: "/images/1/1d/Card-bepo.png" },
    { name: "Mr.2", types: ["fighter", "dps", "silver"], link: "/mr.2", img: "/images/2/27/Card-bonchan.png" },
    { name: "Buggy", types: ["shooter", "dps", "silver", "break_wall"], link: "/buggy", img: "/images/c/ca/Card-buggy.png" },
    { name: "Daddy Masterson", types: ["shooter", "dps", "silver"], link: "/Daddy_Masterson", img: "/images/2/20/Card-daddy.png" },
    { name: "mr.1 Daz Bonez Kolivier", types: ["slasher", "tank", "silver"], link: "/mr.1", img: "/images/6/61/Card-dazbonez.png" },
    { name: "Miss Doublefinger Zala", types: ["slasher", "bruiser", "silver"], link: "/Miss_Doublefinger", img: "/images/5/5f/Card-doublefinger.png" },
    { name: "Don Krieg", types: ["shooter", "dps", "silver"], link: "/don_Krieg", img: "/images/8/8f/Card-krieg.png" },
    { name: "Kuro", types: ["slasher", "dps", "silver"], link: "/kuro", img: "/images/3/3d/Card-kuro.png" },
    { name: "mr.3 Galdino", types: ["especialist", "support", "silver", "bridge"], link: "/mr.3", img: "/images/7/75/Card-mr3.png" },
    { name: "Tashigi", types: ["slasher", "dps", "silver"], link: "/tashigi", img: "/images/b/b8/Card-tashigi.png" },
    { name: "Nefertari Vivi", types: ["slasher", "support", "silver"], link: "/Vivi", img: "/images/9/9c/Card-vivi.png" },
    { name: "Wapol", types: ["shooter", "tank", "silver", "break_wall"], link: "/wapol", img: "/images/b/ba/Card-wapol.png" },
    { name: "Alvida", types: ["fighter", "support", "bronze"], link: "/Alvida", img: "/images/8/83/Card-alvida.png" },
    { name: "Buchi & Sham", types: ["slasher", "bruiser", "bronze"], link: "/Buchi", img: "/images/0/0b/Card-buchi.png" },
    { name: "Cabaji", types: ["slasher", "dps", "bronze"], link: "/Cabaji", img: "/images/9/9d/Card-cabaji.png" },
    { name: "Chew", types: ["shooter", "dps", "bronze", "break_wall"], link: "/Chew", img: "/images/0/0f/Card-chew.png" },
    { name: "Eric", types: ["shooter", "slasher", "dps", "bronze"], link: "/Eric", img: "/images/3/31/Card-eric.png" },
    { name: "Gin", types: ["fighter", "shooter", "dps", "bronze"], link: "/Gin", img: "/images/1/18/Card-gin.png" },
    { name: "Miss Goldenweek", types: ["support", "especialist", "bronze"], link: "/Goldenweek", img: "/images/0/0e/Card-goldenweek.png" },
    { name: "Hatchan", types: ["slasher", "support", "bronze"], link: "/Hatchan", img: "/images/3/31/Card-hatchan.png" },
    { name: "Jango", types: ["shooter", "support", "bronze"], link: "/Jango", img: "/images/4/48/Card-jango.png" },
    { name: "Kuroobi", types: ["fighter", "tank", "bronze", "break_wall"], link: "/Kuroobi", img: "/images/6/6a/Card-kuroobi.png" },
    { name: "Mohji", types: ["especialist", "bruiser", "bronze"], link: "/Mohji", img: "/images/5/58/Card-mohji.png" },
    { name: "Morgan", types: ["slasher", "bruiser", "bronze"], link: "/Morgan", img: "/images/4/43/Card-morgan.png" },
    { name: "Mr.4", types: ["shooter", "bruiser", "bronze"], link: "/Mr.4", img: "/images/9/90/Card-mr4.png" },
    { name: "Mr.5", types: ["shooter", "dps", "bronze"], link: "/Mr.5", img: "/images/4/49/Card-mr5.png" },
    { name: "Pearl", types: ["fighter", "especialist", "tank", "bronze"], link: "/Pearl", img: "/images/d/de/Card-pearl.png" },
  ];

  $(".filter--icon").on("click", function () {
    const id = $(this).attr("id");

    if ($(this).hasClass("all")) {
      $('.filter--icon.active').removeClass('active');
      $(".characters").addClass('show');
      $(".filter--icon.all").addClass('active');
      return false;
    } else {
      $(".filter--icon.all").removeClass('active');
    }

    if ($(this).hasClass("active")) {
      $(this).removeClass('active');
      actives = $('.filter--icon.active');
      query = "";

      $.each(actives, function (key, item) {
        query += "[data-type-" + item.id + "]";
      });

      $(".characters" + query).addClass('show');
    } else {
      if ($(this).hasClass("tier")) {
        $('.filter--icon.tier.active').removeClass('active');
      }

      $(this).addClass('active');
      $(".characters").removeClass('show');
      query = "";
      actives = $('.filter--icon.active');

      $.each(actives, function (key, item) {
        query += "[data-type-" + item.id + "]";
      });

      $(".characters" + query).addClass('show');
    }
  });

  $.each(characters, function (key, item) {
    data = '';
    id = item.name.replace(/\s/g, '_').toLowerCase();

    $.each(item.types, function (key, value) {
      data += "data-type-" + value + " ";
    });

    $("#characters-container").append(
      "<div id=" + id + " class='characters show' " + data + " >" +
      "<a href='https://wiki.gla.com.br/index.php" + item.link + "'>" +
      "<img src='" + item.img + "' alt='imagem de " + item.name + "' />" +
      "</a>" +
      "</div>"
    );
  });

  $(".filter--searchButton").on("click", function () {
    $(".filter--icon.active").removeClass('active');
    $(".characters.show").removeClass('show');
    if ($("#f-input").val().toLowerCase() != '') {
      $(".characters[id*=" + $("#f-input").val().toLowerCase() + "]").addClass('show');
    } else {
      $(".characters").addClass('show');
    }
  });

  $('#f-input').keypress(function (e) {
    const key = e.which;
    if (key == 13)  // the enter key code
    {
      $('.filter--searchButton').click();
      return false;
    }
  });

  //------- PERSONAGENS ---------

  //------- WANTED ---------
  const wanted_slashers = [
    { name: "Baby 5", wanteds: ["nami", "usopp", "mr. 3", "jango"], img: "/images/5/5e/Baby5_card.png" },
    { name: "Ohm", wanteds: ["robin", "nami", "brook", "zoro", "luffy", "sanji", "urouge", "ryuma", "van augur", "law", "niji", "crocodile", "cabaji"], img: "/images/1/1e/Ohm_card.png" },
    { name: "Roronoa Zoro", wanteds: ["robin", "nami", "brook", "chopper", "franky", "luffy", "sanji", "perona", "usopp", "capone", "kid", "van augur", "law", "yonji", "ichiji", "mr. 1", "mr. 2", "mr. 3", "mr. 4", "mr. 5", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "koala", "buggy", "gin", "mohji", "drake", "alvida", "wapol", "crocodile", "cabaji"], img: "/images/6/6f/Card-zoro.png" },
    { name: "Shanks", wanteds: ["robin", "nami", "brook", "franky", "zoro", "luffy", "sanji", "bonney", "leo", "apoo", "rebecca", "usopp", "ryuma", "killer", "burgess", "capone", "kid", "van augur", "law", "yonji", "niji", "ichiji", "baby 5", "mr. 1", "mr. 2", "mr. 3", "doublefinger", "goldenweek", "mr. 4", "bepo", "pearl", "arlong", "hatchan", "chew", "jango", "kuroobi", "koala", "buggy", "kuro", "gin", "krieg", "mohji", "morgan", "drake", "hawkins", "alvida", "wapol", "crocodile", "bellamy"], img: "/images/a/aa/Card-shanks.png" },
    { name: "Dracule Mihawk", wanteds: ["robin", "nami", "chopper", "luffy", "sanji", "bonney", "leo", "apoo", "urouge", "perona", "usopp", "ryuma", "capone", "van augur", "law", "reiju", "yonji", "niji", "ichiji", "baby 5", "mr. 2", "mr. 3", "doublefinger", "goldenweek", "mr. 4", "pearl", "arlong", "hatchan", "chew", "jango", "kuroobi", "buggy", "kuro", "krieg", "mohji", "morgan", "hawkins", "alvida", "crocodile"], img: "/images/9/91/Card-mihawk.png" },
    { name: "Killer", wanteds: ["rebecca", "van augur", "pearl", "jango", "buggy", "alvida"], img: "/images/b/b2/Card-killer.png" },
    { name: "Tashigi", wanteds: ["chopper", "zoro", "luffy", "sanji", "bonney", "urouge", "perona", "ryuma", "killer", "burgess", "kid", "reiju", "yonji", "baby 5", "mr. 1", "mr. 2", "mr. 4", "pearl", "arlong", "hatchan", "buchi", "jango", "kuroobi", "koala", "kuro", "gin", "mohji", "morgan", "alvida", "wapol", "crocodile", "cabaji"], img: "/images/b/b8/Card-tashigi.png" },
    { name: "Roronoa Zoro (TS)", wanteds: ["chopper", "leo", "perona", "usopp", "capone", "mr. 3", "goldenweek", "pearl", "hatchan", "buchi", "jango", "buggy", "alvida"], img: "/images/7/74/Card-zorots.png" },
    { name: "Rebbeca", wanteds: ["franky", "luffy", "sanji", "urouge", "usopp", "ryuma", "killer", "capone", "van augur", "law", "yonji", "niji", "mr. 2", "doublefinger", "mr. 4", "pearl", "arlong", "buchi", "chew", "jango", "kuroobi", "buggy", "kuro", "gin", "krieg", "morgan", "drake", "alvida"], img: "/images/9/91/Card-rebecca.png" },
    { name: "Carrot", wanteds: ["nami", "chopper", "luffy", "sanji", "leo", "leo", "usopp", "capone", "kid", "van augur", "law", "niji", "ichiji", "mr. 3", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "krieg", "mohji", "drake", "alvida"], img: "/images/8/8d/Card-carrot.png" },
    { name: "Shimotsuki Ryuma", wanteds: ["nami", "brook", "chopper", "franky", "sanji", "leo", "urouge", "perona", "capone", "law", "reiju", "yonji", "niji", "baby 5", "doublefinger", "goldenweek", "mr. 4", "bepo", "pearl", "hatchan", "buchi", "chew", "jango", "kuroobi", "koala", "buggy", "gin", "mohji", "morgan", "drake", "alvida", "crocodile"], img: "/images/a/ac/Card-ryuma.png" },
    { name: "Trafalgar Law", wanteds: ["luffy", "sanji", "leo", "apoo", "usopp", "kid", "reiju", "yonji", "niji", "ichiji", "baby 5", "doublefinger", "mr. 4", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "buggy", "krieg", "drake", "alvida"], img: "/images/b/b9/Card-law.png" },
    { name: "Mr. 1", wanteds: ["chopper", "perona", "killer", "capone", "law", "niji", "baby 5", "mr. 2", "doublefinger", "mr. 4", "bepo", "pearl", "arlong", "buchi", "chew", "jango", "kuroobi", "kuro", "krieg", "mohji", "morgan", "alvida", "wapol", "crocodile"], img: "/images/6/61/Card-dazbonez.png" },
    { name: "Bastille", wanteds: ["chopper", "zoro", "law", "doublefinger", "mr. 4", "arlong", "buchi", "kuro", "gin", "alvida", "bellamy"], img: "/images/1/13/Card-bastille.png" },
    { name: "Dalmatian", wanteds: ["capone", "mr. 2", "pearl", "arlong", "buchi", "chew", "jango", "kuroobi", "mohji", "morgan", "alvida", "crocodile"], img: "/images/9/99/Card-dalmatian.png" },
    { name: "Morgan", wanteds: ["robin", "nami", "leo", "van augur", "baby 5", "goldenweek", "buchi", "chew", "jango", "alvida"], img: "/images/4/43/Card-morgan.png" },
    { name: "Cabaji", wanteds: ["nami", "chopper", "chew", "jango", "alvida"], img: "/images/9/9d/Card-cabaji.png" },
    { name: "Kuro", wanteds: ["nami", "pearl", "hatchan", "buchi", "jango", "koala", "krieg", "mohji", "alvida", "bellamy"], img: "/images/3/3d/Card-kuro.png" },
    { name: "Eric", wanteds: ["nami", "brook", "apoo", "usopp", "reiju", "mr. 3", "goldenweek", "mr. 5", "jango", "buggy", "alvida"], img: "/images/3/31/Card-eric.png" },
    { name: "Miss Doublefinger", wanteds: ["chopper", "luffy", "sanji", "urouge", "rebecca", "perona", "usopp", "burgess", "capone", "kid", "reiju", "yonji", "pearl", "hatchan", "buchi", "jango", "kuroobi", "mohji", "alvida", "wapol"], img: "/images/5/5f/Card-doublefinger.png" },
  ];

  const wanted_shooters = [
    { name: "Baby 5", wanteds: ["nami", "usopp", "mr. 3", "jango"], img: "/images/5/5e/Baby5_card.png" },
    { name: "Daddy Masterson", wanteds: ["robin", "nami", "apoo", "apoo", "usopp", "niji", "mr. 3", "goldenweek", "mr. 5", "chew", "jango", "buggy", "krieg"], img: "/images/2/20/Card-daddy.png" },
    { name: "Enel", wanteds: ["robin", "usopp", "jango", "cabaji"], img: "/images/8/85/Enel_card.png" },
    { name: "Capone Gang Bege", wanteds: ["robin", "nami", "brook", "chopper", "franky", "luffy", "sanji", "leo", "apoo", "rebecca", "usopp", "killer", "burgess", "van augur", "law", "reiju", "yonji", "niji", "ichiji", "baby 5", "mr. 2", "mr. 3", "goldenweek", "mr. 4", "mr. 5", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "koala", "buggy", "kuro", "krieg", "mohji", "morgan", "alvida", "alvida", "wapol", "crocodile", "cabaji"], img: "/images/c/c0/Card-capone.png" },
    { name: "Franky", wanteds: ["robin", "nami", "brook", "chopper", "franky", "zoro", "luffy", "sanji", "leo", "urouge", "usopp", "ryuma", "burgess", "capone", "kid", "van augur", "law", "yonji", "niji", "ichiji", "baby 5", "mr. 1", "mr. 2", "doublefinger", "mr. 4", "mr. 5", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "koala", "buggy", "kuro", "gin", "mohji", "morgan", "hawkins", "alvida", "crocodile", "cabaji"], img: "/images/6/61/Card-franky.png" },
    { name: "Eustass kid", wanteds: ["chopper", "luffy", "usopp", "kid", "baby 5", "mr. 1", "mr. 2", "doublefinger", "mr. 4", "pearl", "buchi", "gin", "hawkins", "alvida", "crocodile"], img: "/images/9/9a/Card-kid.png" },
    { name: "Van Augur", wanteds: ["robin", "nami", "brook", "chopper", "franky", "luffy", "bonney", "leo", "apoo", "urouge", "usopp", "killer", "capone", "van augur", "law", "reiju", "yonji", "niji", "ichiji", "baby 5", "mr. 2", "mr. 3", "goldenweek", "mr. 5", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "koala", "buggy", "krieg", "mohji", "morgan", "drake", "alvida", "wapol", "cabaji"], img: "/images/c/c7/Card-vanaugur.png" },
    { name: "Portgas D. Ace", wanteds: ["nami", "brook", "chopper", "bonney", "leo", "apoo", "perona", "usopp", "kid", "van augur", "niji", "mr. 3", "mr. 5", "bepo", "arlong", "buchi", "chew", "jango", "kuroobi", "buggy", "krieg", "mohji"], img: "/images/4/40/Card-ace.png" },
    { name: "Usopp (TS)", wanteds: ["brook", "chopper", "leo", "apoo", "perona", "usopp", "van augur", "niji", "mr. 3", "goldenweek", "mr. 5", "hatchan", "chew", "jango", "buggy", "krieg", "alvida"], img: "/images/c/cc/Card-usoppts.png" },
    { name: "Donquixote Doflamingo", wanteds: ["robin", "nami", "brook", "chopper", "franky", "zoro", "luffy", "sanji", "bonney", "leo", "apoo", "urouge", "perona", "usopp", "ryuma", "killer", "burgess", "capone", "kid", "van augur", "law", "reiju", "yonji", "niji", "ichiji", "mr. 2", "mr. 3", "doublefinger", "goldenweek", "mr. 4", "bepo", "pearl", "arlong", "hatchan", "buchi", "jango", "kuroobi", "koala", "buggy", "gin", "krieg", "mohji", "morgan", "drake", "alvida"], img: "/images/8/8d/Card-doflamingo.png" },
    { name: "Buggy", wanteds: ["nami", "chopper", "bonney", "apoo", "perona", "usopp", "van augur", "baby 5", "mr. 4", "mr. 5", "pearl", "arlong", "buchi", "chew", "jango", "kuroobi", "krieg", "mohji", "alvida", "cabaji"], img: "/images/c/ca/Card-buggy.png" },
    { name: "Vinsmoke Niji", wanteds: ["nami", "apoo", "van augur", "reiju", "mr. 3", "mr. 5", "buchi", "jango", "buggy", "krieg", "alvida"], img: "/images/6/66/Card-niji.png" },
    { name: "Wapol", wanteds: ["robin", "nami", "brook", "chopper", "zoro", "luffy", "sanji", "urouge", "rebecca", "perona", "ryuma", "killer", "burgess", "kid", "law", "reiju", "yonji", "ichiji", "baby 5", "mr. 1", "doublefinger", "mr. 4", "pearl", "arlong", "buchi", "jango", "kuroobi", "kuro", "mohji", "morgan", "hawkins", "wapol", "crocodile"], img: "/images/b/ba/Card-wapol.png" },
    { name: "Franky (TS)", wanteds: ["chopper", "zoro", "usopp", "capone", "kid", "yonji", "mr. 1", "doublefinger", "mr. 4", "pearl", "arlong", "buchi", "kuro", "alvida"], img: "/images/d/d0/Card-frankyts.png" },
    { name: "Borsalino Kizaru", wanteds: ["capone", "jango", "drake", "alvida"], img: "/images/3/32/Card-kizaru.png" },
    { name: "Don Krieg", wanteds: ["brook", "chopper", "apoo", "capone", "reiju", "goldenweek", "mr. 5", "hatchan", "buchi", "chew", "jango", "buggy", "drake", "alvida"], img: "/images/8/8f/Card-krieg.png" },
    { name: "Eric", wanteds: ["nami", "brook", "apoo", "usopp", "reiju", "mr. 3", "goldenweek", "mr. 5", "jango", "buggy", "alvida"], img: "/images/3/31/Card-eric.png" },
    { name: "Mr. 4", wanteds: ["chopper", "zoro", "bonney", "goldenweek", "buchi", "jango", "morgan"], img: "/images/9/90/Card-mr4.png" },
    { name: "Mr. 5", wanteds: ["brook", "sanji", "bonney", "goldenweek", "jango", "kuroobi"], img: "/images/4/49/Card-mr5.png" },
    { name: "Gin", wanteds: ["chopper", "capone", "van augur", "baby 5", "mr. 3", "goldenweek", "bepo", "buchi", "gin", "krieg", "mohji", "drake", "alvida", "cabaji"], img: "/images/1/18/Card-gin.png" },
    { name: "Chew", wanteds: ["mr. 5"], img: "/images/0/0f/Card-chew.png" },
    { name: "Usopp", wanteds: ["nami", "brook", "chopper", "leo", "apoo", "reiju", "niji", "mr. 3", "mr. 5", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "buggy", "krieg", "alvida", "wapol"], img: "/images/a/ac/Card-usopp.png" },
  ];

  const wanted_fighters = [
    { name: "Sabo", wanteds: ["nami", "niji", "mr. 2", "mr. 3", "goldenweek", "mr. 4", "mr. 5", "bepo", "pearl", "arlong", "buchi", "chew", "jango", "kuroobi", "koala", "buggy", "kuro", "gin", "krieg", "mohji", "cabaji"], img: "/images/0/04/Card-sabo.png" },
    { name: "X-Drake", wanteds: ["robin", "brook", "chopper", "franky", "zoro", "sanji", "bonney", "leo", "apoo", "urouge", "rebecca", "usopp", "ryuma", "killer", "burgess", "capone", "kid", "van augur", "law", "reiju", "yonji", "ichiji", "baby 5", "mr. 1", "mr. 3", "doublefinger", "mr. 5", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "koala", "buggy", "kuro", "gin", "krieg", "mohji", "morgan", "drake", "hawkins", "alvida", "wapol", "crocodile", "cabaji", "bellamy"], img: "/images/6/69/Card-drake.png" },
    { name: "Hina", wanteds: ["robin", "brook", "chopper", "franky", "zoro", "luffy", "sanji", "leo", "urouge", "rebecca", "perona", "usopp", "ryuma", "killer", "burgess", "capone", "kid", "van augur", "reiju", "yonji", "ichiji", "baby 5", "mr. 1", "mr. 3", "doublefinger", "mr. 5", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "koala", "buggy", "kuro", "gin", "krieg", "mohji", "morgan", "drake", "hawkins", "alvida", "wapol", "crocodile", "cabaji"], img: "/images/5/57/Card-hina.png" },
    { name: "Smoker", wanteds: ["robin", "nami", "zoro", "luffy", "urouge", "capone", "van augur", "law", "baby 5", "mr. 1", "mr. 2", "mr. 3", "mr. 5", "krieg", "alvida"], img: "/images/f/fb/Card-smoker.png" },
    { name: "Bellamy", wanteds: ["nami", "brook", "chopper", "zoro", "luffy", "sanji", "apoo", "urouge", "rebecca", "ryuma", "burgess", "van augur", "law", "yonji", "ichiji", "baby 5", "mr. 1", "mr. 2", "doublefinger", "goldenweek", "mr. 4", "bepo", "pearl", "arlong", "buchi", "jango", "kuroobi", "koala", "gin", "krieg", "mohji", "morgan", "drake", "hawkins", "alvida", "wapol", "crocodile", "cabaji"], img: "/images/7/7e/Card-bellamy.png" },
    { name: "Urouge", wanteds: ["nami", "sanji", "apoo", "usopp", "capone", "chew"], img: "/images/9/98/Card-urouge.png" },
    { name: "Boa Hancock", wanteds: ["robin", "nami", "brook", "chopper", "franky", "zoro", "luffy", "sanji", "leo", "urouge", "perona", "usopp", "ryuma", "burgess", "capone", "van augur", "law", "reiju", "yonji", "ichiji", "baby 5", "mr. 1", "mr. 3", "mr. 5", "bepo", "arlong", "hatchan", "chew", "jango", "kuroobi", "buggy", "kuro", "gin", "krieg", "mohji", "morgan", "drake", "hawkins", "alvida", "wapol", "crocodile", "cabaji", "bellamy"], img: "/images/4/47/Card-hancock.png" },
    { name: "VinsmokeYonji", wanteds: ["mr. 4", "kuro"], img: "/images/7/73/Card-yonji.png" },
    { name: "Vinsmoke Ichiji", wanteds: ["robin", "nami", "brook", "sanji", "apoo", "urouge", "rebecca", "usopp", "capone", "ichiji", "baby 5", "mr. 3", "mr. 5", "bepo", "pearl", "arlong", "buchi", "chew", "jango", "kuroobi", "koala", "buggy", "kuro", "gin", "hawkins", "alvida", "wapol", "crocodile", "cabaji"], img: "/images/8/8c/Card-ichiji.png" },
    { name: "Mr. 2", wanteds: ["bonney", "usopp", "hatchan", "krieg", "alvida"], img: "/images/2/27/Card-bonchan.png" },
    { name: "Vinsmoke Sanji (TS)", wanteds: ["nami", "chopper", "usopp", "law", "mr. 2", "doublefinger", "mr. 4", "mr. 5", "bepo", "pearl", "buchi", "chew", "jango", "koala", "buggy", "krieg", "mohji", "morgan", "alvida", "wapol", "cabaji"], img: "/images/7/7a/Card-sanjits.png" },
    { name: "Monkey D. Luffy (TS)", wanteds: ["robin", "nami", "brook", "chopper", "franky", "zoro", "luffy", "sanji", "leo", "apoo", "urouge", "rebecca", "perona", "usopp", "ryuma", "killer", "burgess", "kid", "law", "yonji", "niji", "ichiji", "mr. 1", "mr. 2", "doublefinger", "goldenweek", "mr. 4", "mr. 5", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "buggy", "kuro", "gin", "mohji", "morgan", "drake", "hawkins", "alvida", "wapol", "crocodile", "cabaji"], img: "/images/e/ed/Card-luffyts.png" },
    { name: "Koala", wanteds: ["robin", "nami", "brook", "franky", "zoro", "luffy", "sanji", "leo", "apoo", "urouge", "usopp", "killer", "burgess", "capone", "van augur", "law", "reiju", "yonji", "mr. 1", "mr. 2", "doublefinger", "mr. 4", "bepo", "pearl", "arlong", "chew", "jango", "kuroobi", "koala", "buggy", "kuro", "gin", "krieg", "mohji", "morgan", "drake", "hawkins", "alvida", "crocodile", "cabaji", "bellamy"], img: "/images/f/f3/Card-koala.png" },
    { name: "Burgess", wanteds: ["robin", "nami", "brook", "franky", "zoro", "luffy", "sanji", "rebecca", "usopp", "ryuma", "killer", "burgess", "capone", "kid", "van augur", "law", "yonji", "niji", "ichiji", "mr. 1", "mr. 2", "doublefinger", "mr. 4", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "kuroobi", "koala", "buggy", "kuro", "gin", "hawkins", "alvida", "wapol", "crocodile", "cabaji"], img: "/images/2/28/Card-burgess.png" },
    { name: "Monkey D. Luffy", wanteds: ["brook", "chopper", "franky", "sanji", "leo", "usopp", "burgess", "kid", "law", "mr. 1", "mr. 2", "mr. 4", "mr. 5", "pearl", "arlong", "hatchan", "chew", "jango", "kuroobi", "koala", "buggy", "morgan", "alvida", "wapol", "cabaji"], img: "/images/a/af/Card-luffy.png" },
    { name: "Bepo", wanteds: ["zoro", "luffy", "sanji", "pearl", "arlong", "buchi", "kuro", "mohji", "morgan", "drake", "alvida"], img: "/images/1/1d/Card-bepo.png" },
    { name: "Vinsmoke Sanji", wanteds: ["brook", "chopper", "usopp", "kid", "mr. 4", "mr. 5", "pearl", "hatchan", "buchi", "chew", "jango", "kuroobi", "buggy", "gin", "morgan", "hawkins", "alvida", "wapol", "crocodile", "cabaji"], img: "/images/0/04/Card-sanji.png" },
    { name: "Arlong", wanteds: ["mr. 2", "chew", "alvida"], img: "/images/1/1e/Card-arlong.png" },
    { name: "Gin", wanteds: ["chopper", "capone", "van augur", "baby 5", "mr. 3", "goldenweek", "bepo", "buchi", "gin", "krieg", "mohji", "drake", "alvida", "cabaji"], img: "/images/1/18/Card-gin.png" },
  ];

  const wanted_especialists = [
    { name: "Sakazuki Akainu", wanteds: ["capone", "bellamy"], img: "/images/b/b0/Card_akainu.png" },
    { name: "Uta", wanteds: ["nami", "usopp", "jango", "buggy"], img: "/images/2/22/Card_uta.png" },
    { name: "Sabo", wanteds: ["nami", "niji", "mr. 2", "mr. 3", "goldenweek", "mr. 4", "mr. 5", "bepo", "pearl", "arlong", "buchi", "chew", "jango", "kuroobi", "koala", "buggy", "kuro", "gin", "krieg", "mohji", "cabaji"], img: "/images/0/04/Card-sabo.png" },
    { name: "Enel", wanteds: ["robin", "usopp", "jango", "cabaji"], img: "/images/8/85/Enel_card.png" },
    { name: "Vinsmoke Reiju", wanteds: ["brook", "bonney", "urouge", "rebecca", "killer", "burgess", "kid", "reiju", "yonji", "baby 5", "mr. 2", "doublefinger", "mr. 4", "bepo", "pearl", "arlong", "hatchan", "koala", "kuro", "gin", "mohji", "morgan", "hawkins", "alvida", "crocodile", "cabaji"], img: "/images/2/23/Card-reiju.png" },
    { name: "Portgas D. Ace", wanteds: ["nami", "brook", "chopper", "bonney", "leo", "apoo", "perona", "usopp", "kid", "van augur", "niji", "mr. 3", "mr. 5", "bepo", "arlong", "buchi", "chew", "jango", "kuroobi", "buggy", "krieg", "mohji"], img: "/images/4/40/Card-ace.png" },
    { name: "Donquixte Doflamingo", wanteds: ["robin", "nami", "brook", "chopper", "franky", "zoro", "luffy", "sanji", "bonney", "leo", "apoo", "urouge", "perona", "usopp", "ryuma", "killer", "burgess", "capone", "kid", "van augur", "law", "reiju", "yonji", "niji", "ichiji", "mr. 2", "mr. 3", "doublefinger", "goldenweek", "mr. 4", "bepo", "pearl", "arlong", "hatchan", "buchi", "jango", "kuroobi", "koala", "buggy", "gin", "krieg", "mohji", "morgan", "drake", "alvida"], img: "/images/8/8d/Card-doflamingo.png" },
    { name: "Borsalino Kizaru", wanteds: ["capone", "jango", "drake", "alvida"], img: "/images/3/32/Card-kizaru.png" },
    { name: "Trafalgar Law", wanteds: ["luffy", "sanji", "leo", "apoo", "usopp", "kid", "reiju", "yonji", "niji", "ichiji", "baby 5", "doublefinger", "mr. 4", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "buggy", "krieg", "drake", "alvida"], img: "/images/b/b9/Card-law.png" },
    { name: "Carrot", wanteds: ["nami", "chopper", "luffy", "sanji", "leo", "leo", "usopp", "capone", "kid", "van augur", "law", "niji", "ichiji", "mr. 3", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "krieg", "mohji", "drake", "alvida"], img: "/images/8/8d/Card-carrot.png" },
    { name: "Nami (TS)", wanteds: ["robin", "nami", "brook", "chopper", "franky", "zoro", "luffy", "sanji", "bonney", "leo", "apoo", "urouge", "rebecca", "usopp", "ryuma", "killer", "kid", "law", "reiju", "yonji", "niji", "ichiji", "baby 5", "mr. 1", "mr. 2", "mr. 3", "doublefinger", "goldenweek", "mr. 4", "mr. 5", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "koala", "buggy", "kuro", "gin", "krieg", "mohji", "morgan", "drake", "hawkins", "alvida", "wapol", "crocodile", "cabaji"], img: "/images/3/35/Card-namits.png" },
    { name: "Nami", wanteds: ["chopper", "bonney", "leo", "apoo", "burgess", "law", "niji", "mr. 3", "doublefinger", "goldenweek", "mr. 5", "pearl", "hatchan", "buchi", "chew", "jango", "buggy", "krieg", "mohji", "alvida"], img: "/images/0/08/Card-nami.png" },
    { name: "Nico Robin", wanteds: ["nami", "chopper", "leo", "apoo", "usopp", "mr. 3", "arlong", "buchi", "chew", "jango", "buggy", "mohji", "alvida"], img: "/images/3/3f/Card-robin.png" },
    { name: "Nico Robin (TS)", wanteds: ["bonney", "leo", "apoo", "perona", "mr. 3", "buchi", "chew", "jango", "alvida"], img: "/images/b/b0/Card-robints.png" },
    { name: "Bartolomeo", wanteds: ["urouge", "reiju", "pearl", "arlong", "jango", "kuroobi", "koala", "morgan", "drake", "alvida"], img: "/images/a/a9/Card-barto.png" },
    { name: "Marshall D. Teach", wanteds: ["bonney", "perona", "killer", "capone", "mr. 2", "goldenweek", "mr. 5", "pearl", "buchi", "chew", "jango", "buggy", "alvida"], img: "/images/f/ff/Card-kurohige.png" },
    { name: "Crocodile", wanteds: ["nami", "yonji", "mr. 1", "alvida"], img: "/images/5/5d/Card-crocodile.png" },
    { name: "Bartolomew Kuma", wanteds: ["robin", "nami", "brook", "chopper", "franky", "zoro", "luffy", "sanji", "urouge", "rebecca", "usopp", "ryuma", "killer", "burgess", "capone", "kid", "van augur", "yonji", "niji", "ichiji", "baby 5", "mr. 1", "mr. 2", "mr. 3", "doublefinger", "mr. 4", "mr. 5", "bepo", "pearl", "arlong", "hatchan", "buchi", "chew", "jango", "kuroobi", "koala", "buggy", "kuro", "gin", "krieg", "mohji", "morgan", "drake", "hawkins", "alvida", "wapol", "crocodile", "cabaji", "bellamy"], img: "/images/b/b5/Card-kuma.png" },
    { name: "Basil Hawkins", wanteds: ["luffy", "urouge", "yonji", "pearl", "kuroobi", "alvida"], img: "/images/8/89/Card-hawkins.png" },
    { name: "Mohji", wanteds: ["alvida", "bonney", "buggy", "pearl", "van augur"], img: "/images/5/58/Card-mohji.png" },
    { name: "Leo & Mansherry", wanteds: ["alvida", "bonney", "mohji"], img: "/images/d/d9/Card-leo.png" },
  ];

  function filterAndAppend(array, value, id) {
    whoDo = array.filter(
      function (v) {
        return v.wanteds.includes(value);
      }
    );

    $.each(whoDo, function (key, item) {
      $(".wantedPortraits#" + id).append(
        "<div class='wantedPortrait' >" +
        "<img src='" + item.img + "' alt='imagem de " + item.name + "' />" +
        "</div>"
      );
    })
  }

  $("#selectbox-wanted").on("input", function () {
    const value = $(this).val();

    if ($(".wantedPortrait"))
      $(".wantedPortrait").remove();

    filterAndAppend(wanted_shooters, value, "wanted-shooter");
    filterAndAppend(wanted_slashers, value, "wanted-slasher");
    filterAndAppend(wanted_fighters, value, "wanted-fighter");
    filterAndAppend(wanted_especialists, value, "wanted-especialist");
  });
  //------- WANTED ---------

  //------- SKILL TAB ---------
  $('.tab-skill').on('click', function () {
    $('.tab-skill.active').removeClass('active');
    $(this).addClass('active');
    const skillId = $(this).data('skill-id');
    if ($(".skillInfo[data-skill-id=" + skillId + "]")) {
      $(".skillInfo.active").removeClass('active');
      $(".skillInfo[data-skill-id=" + skillId + "]").addClass('active');
    }
  });
  //------- SKILL TAB ---------

  //------- CALCULATOR XP ---------
  const maximum_level = 110;
  const tier_values = {
    "diamond": 1,
    "gold": 1,
    "silver": 2,
    "bronze": 3
  };

  $(".calcXp--tierIcon").on("click", function () {
    $(".calcXp--tierIcon.active").removeClass('active');
    $(this).addClass('active');
  });

  $("#calculate-btn").on('click', function () {
    getNeededPotions();
  });

  function calcMissingXpInPotions() {
    const currentPercentOfXp = $("#char-currentPercentOfXp").val() != "" ? $("#char-currentPercentOfXp").val() : 100;
    const currentLevel = $("#char-level").val() != "" ? $("#char-level").val() : 1;
    const levelToUp = $("#char-levelToUp").val() != "" ? $("#char-levelToUp").val() : 110;
    const charTier = $(".calcXp--tierIcon.active").length != 0 ? tier_values[$(".calcXp--tierIcon.active").attr('id')] : tier_values["gold"];

    const percentToUp = 100 - currentPercentOfXp;
    const currentXp = ((50 * (Math.pow((currentLevel - 1), 3)) - 150 * (Math.pow((currentLevel - 1), 2)) + 400 * (currentLevel - 1)) / 3) + ((50 * Math.pow(currentLevel, 2) - 150 * currentLevel + 200) * percentToUp / 100);
    const desiredXp = (50 * (Math.pow((levelToUp - 1), 3)) - 150 * (Math.pow((levelToUp - 1), 2)) + 400 * (levelToUp - 1)) / 3;
    const missingXp = Math.round((desiredXp - currentXp));

    const missingPotions = {
      "small": Math.ceil((missingXp / (1000 * charTier))),
      "medium": (missingXp / (10000 * charTier)).toFixed(1),
      "big": (missingXp / (100000 * charTier)).toFixed(2)
    };

    return missingPotions;
  }

  function calcPotions() {
    const missingPotions = calcMissingXpInPotions();

    var complementaryPotS;
    var complementaryPotM;
    potS = missingPotions['small'];
    potM = missingPotions['medium'];
    potB = missingPotions['big'];

    if (String(potS).slice(-1) == "0") {
      potM = Math.ceil(parseFloat(potM));
    } else {
      potM = Math.floor(potM);
      complementaryPotS = potS - potM * 10;
    }

    if (String(potM).slice(-1) == "0") {
      potM = Math.ceil((parseFloat(potM)));
      potB = Math.floor(potB);
    }
    else {
      potB = Math.floor(potB)
      complementaryPotM = potM - potB * 10
    }

    const potions = {
      "small": complementaryPotS,
      "medium": complementaryPotM,
      "big": potB
    }

    return potions;
  }

  function getNeededPotions() {
    const potions = calcPotions();
    const resultsArea = $("#calc-result");

    resultsArea.html('');

    if (potions["big"]) {
      resultsArea.append(
        "<div class='badge'>" +
        "<img src='/images/a/a5/Bigexppot.png' class='calcXp--xpIcon' />" +
        "<span class='calcXp--numberOfPots'>" + potions['big'] + "</span>" +
        "</div>"
      );
    }


    if (potions["medium"]) {
      resultsArea.append(
        "<div class='badge'>" +
        "<img src='/images/d/df/Medexppot.png' class='calcXp--xpIcon' />" +
        "<span class='calcXp--numberOfPots'>" + potions['medium'] + "</span>" +
        "</div>"
      );
    }


    if (potions["small"]) {
      resultsArea.append(
        "<div class='badge'>" +
        "<img src='/images/5/5a/Smallexppot.png' class='calcXp--xpIcon' />" +
        "<span class='calcXp--numberOfPots'>" + potions['small'] + "</span>" +
        "</div>"
      );
    }
  }
  //------- CALCULATOR XP ---------

  //------- VIDEO SELECTOR ---------
  $(".video-selector").on("click", function () {
    $(".video-selector.active").removeClass("active");
    $(this).addClass("active");

    const value = $(this).data("value");
    const obj = eval('(' + value + ')');
    $("video[data-type-" + obj.select + "].active").removeClass('active');
    const index = obj.showId - 1;
    $("video[data-type-" + obj.select + "]").eq(index).addClass('active');
  });
  //------- VIDEO SELECTOR ---------
  //-------- gurren
  $(document).ready(function () {
    // Alternar entre mostrar e ocultar abas ao clicar
    $('.mostrar-aba').click(function () {
      var aba_id = $(this).attr('data-aba');
      var aba_selecionada = $("#aba-" + aba_id);

      if (aba_selecionada.hasClass('atual')) {
        aba_selecionada.removeClass('atual'); // Oculta a aba se já estiver ativa
        $(this).removeClass('ativa'); // Remove a classe ativa do botão
      } else {
        $('.aba').removeClass('atual'); // Oculta todas as abas
        aba_selecionada.addClass('atual'); // Exibe a aba correspondente
        $('.mostrar-aba').removeClass('ativa'); // Remove a classe ativa de outros botões
        $(this).addClass('ativa'); // Adiciona a classe ativa ao botão clicado
      }
    });

    // Exibir aba correspondente ao hash da URL
    var url = location.href;
    var hash = url.split('#')[1];
    if (hash != null && hash.length > 0) {
      $("#aba-" + hash).addClass('atual'); // Exibe a aba do hash
      $('*[data-aba="' + hash + '"]').addClass('ativa'); // Ativa o botão correspondente
    }
  });
});


//------- 2222222222222222222222222222222222222222222222222222222222222222222222 ---------
/*
(function () {
    'use strict';

    var STORAGE_KEY = 'gla-wiki-theme';
    var DARK_CLASS = 'gla-dark-mode';
    var BUTTON_ID = 'gla-darkmode-toggle';

    function getSavedTheme() {
        try {
            return localStorage.getItem(STORAGE_KEY);
        } catch (e) {
            return null;
        }
    }

    function saveTheme(theme) {
        try {
            localStorage.setItem(STORAGE_KEY, theme);
        } catch (e) {
            // Ignora caso o navegador bloqueie localStorage
        }
    }

    function isDarkMode() {
        return document.documentElement.classList.contains(DARK_CLASS);
    }

    function applyTheme(theme) {
        var dark = theme === 'dark';

        document.documentElement.classList.toggle(DARK_CLASS, dark);

        if (document.body) {
            document.body.classList.toggle(DARK_CLASS, dark);
        }

        updateButton();
    }

    function updateButton() {
        var button = document.getElementById(BUTTON_ID);

        if (!button) {
            return;
        }

        var dark = isDarkMode();

        button.setAttribute('aria-pressed', dark ? 'true' : 'false');
        button.setAttribute('title', dark ? 'Alternar para modo claro' : 'Alternar para modo escuro');

        button.innerHTML = dark
            ? '<span class="gla-darkmode-icon">☀</span><span class="gla-darkmode-text">Modo claro</span>'
            : '<span class="gla-darkmode-icon">☾</span><span class="gla-darkmode-text">Modo escuro</span>';
    }

    function createButton() {
        if (document.getElementById(BUTTON_ID)) {
            return;
        }

        var button = document.createElement('button');

        button.id = BUTTON_ID;
        button.type = 'button';
        button.className = 'gla-darkmode-button';
        button.setAttribute('aria-label', 'Alternar modo escuro');
        button.setAttribute('aria-pressed', isDarkMode() ? 'true' : 'false');

        button.addEventListener('click', function () {
            var nextTheme = isDarkMode() ? 'light' : 'dark';

            saveTheme(nextTheme);
            applyTheme(nextTheme);
        });

        document.body.appendChild(button);
        updateButton();
    }

    function ready(fn) {
        if (document.readyState === 'loading') {
            document.addEventListener('DOMContentLoaded', fn);
        } else {
            fn();
        }
    }

    var savedTheme = getSavedTheme();

    if (savedTheme === 'dark') {
        document.documentElement.classList.add(DARK_CLASS);
    }

    ready(function () {
        if (savedTheme === 'dark') {
            document.body.classList.add(DARK_CLASS);
        }

        createButton();
        updateButton();
    });
})();
*/
/**
* Script JavaScript para o componente de abas MediaWiki
* Adicione este script na sua MediaWiki (Common.js ou página de scripts)
*/

(function () {
  'use strict';

  // Inicializa todos os componentes de abas na página
  function initTabbers() {
    const tabbers = document.querySelectorAll('[data-tabber]');

    tabbers.forEach(function (tabber) {
      const tabs = tabber.querySelectorAll('.mw-tabber-tab');
      const panels = tabber.querySelectorAll('.mw-tabber-panel');

      tabs.forEach(function (tab) {
        tab.addEventListener('click', function () {
          const targetTab = this.getAttribute('data-tab');

          // Remove classe active de todas as abas
          tabs.forEach(function (t) {
            t.classList.remove('active');
          });

          // Remove classe active de todos os painéis
          panels.forEach(function (p) {
            p.classList.remove('active');
          });

          // Adiciona classe active na aba clicada
          this.classList.add('active');

          // Adiciona classe active no painel correspondente
          const targetPanel = tabber.querySelector('[data-panel="' + targetTab + '"]');
          if (targetPanel) {
            targetPanel.classList.add('active');
          }
        });
      });
    });
  }

  // Inicializa quando o DOM estiver pronto
  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', initTabbers);
  } else {
    initTabbers();
  }

});

/* =============================================================================
   GLA language switch (glaLang) - global toggle + page panes + gla:langChanged
   Contrato: localStorage "glaLang" (pt-br | en), evento window "gla:langChanged"
   ============================================================================= */
(function () {
  'use strict';

  var STORAGE_KEY = 'glaLang';
  var UI_LANGS = ['pt-br', 'en'];
  var FLAG_IMG = {
    'pt-br': 'https://wiki.gla.com.br/images/8/8c/Brazil.png',
    'en': 'https://wiki.gla.com.br/images/0/0a/Usa.png'
  };

  function normalizeLang(s) {
    s = (s || '').toLowerCase();
    if (s === 'pt-br' || s === 'pt_br' || s === 'ptbr' || s === 'pt') return 'pt';
    return (s.split('-')[0] || 'pt');
  }

  function toLangTag(langFull) {
    var tag = (langFull || 'pt-br').toLowerCase();
    if (tag === 'pt') return 'pt-br';
    return UI_LANGS.indexOf(tag) >= 0 ? tag : 'pt-br';
  }

  function paneMatches(paneLang, langTag) {
    var pane = (paneLang || '').toLowerCase();
    var tag = (langTag || 'pt-br').toLowerCase();
    if (pane === tag) return true;
    if ((pane === 'pt' || pane === 'pt-br') && (tag === 'pt' || tag === 'pt-br')) return true;
    return pane.split('-')[0] === tag.split('-')[0];
  }

  function getStored() {
    try {
      var saved = (localStorage.getItem(STORAGE_KEY) || '').toLowerCase();
      if (saved && UI_LANGS.indexOf(saved) >= 0) return saved;
    } catch (e) { }
    return 'pt-br';
  }

  function markFlags(langTag) {
    document.querySelectorAll('.gla-lang-flag[data-lang]').forEach(function (btn) {
      btn.classList.toggle('active', paneMatches(btn.getAttribute('data-lang'), langTag));
    });
  }

  function updatePanes(langTag) {
    document.querySelectorAll('.gla-i18n').forEach(function (wrap) {
      var mode = (wrap.getAttribute('data-gla-i18n-mode') || 'panes').toLowerCase();
      if (mode === 'client') return;
      var panes = wrap.querySelectorAll(':scope > .gla-i18n-pane');
      if (!panes.length) return;
      panes.forEach(function (pane) {
        var show = paneMatches(pane.getAttribute('data-lang'), langTag);
        pane.hidden = !show;
        pane.style.display = show ? '' : 'none';
      });
    });
  }

  function applyLang(langFull, opts) {
    opts = opts || {};
    var langTag = toLangTag(langFull);
    var norm = normalizeLang(langTag);

    document.documentElement.lang = langTag;
    document.documentElement.setAttribute('data-gla-lang', norm);
    try {
      localStorage.setItem(STORAGE_KEY, langTag);
    } catch (e) { }

    markFlags(langTag);
    updatePanes(langTag);

    if (opts.silent !== true) {
      try {
        window.dispatchEvent(new CustomEvent('gla:langChanged', { detail: { norm: norm, tag: langTag } }));
      } catch (e2) { }
    }

    return norm;
  }

  function pageHasI18n() {
    return !!document.querySelector(
      '[data-gla-i18n], .gla-i18n, .item-wrapper, .item-tooltip-enc, ' +
      '.gla-item-chip, .gla-quest-item-chip, [data-gla-item-chip], .character-box'
    );
  }

  function shouldShowToggle() {
    return pageHasI18n();
  }

  function injectToggle() {
    if (!shouldShowToggle() || document.getElementById('pt-langtoggle')) {
      return;
    }

    var ul = document.querySelector('#p-personal .vector-menu-content-list') ||
      document.querySelector('#p-personal ul');
    if (!ul) return;

    var li = document.createElement('li');
    li.id = 'pt-langtoggle';
    li.className = 'mw-list-item';

    var group = document.createElement('span');
    group.className = 'gla-lang-toggle';
    group.setAttribute('role', 'group');
    group.setAttribute('aria-label', 'Language');

    UI_LANGS.forEach(function (code) {
      var btn = document.createElement('button');
      btn.type = 'button';
      btn.className = 'gla-lang-flag';
      btn.setAttribute('data-lang', code);
      btn.title = code === 'pt-br' ? 'Português (Brasil)' : 'English';
      btn.setAttribute('aria-label', btn.title);
      var img = document.createElement('img');
      img.src = FLAG_IMG[code] || '';
      img.alt = '';
      img.width = 24;
      img.height = 16;
      btn.appendChild(img);
      group.appendChild(btn);
    });

    li.appendChild(group);

    var anchor = document.getElementById('pt-darkmode');
    if (anchor && anchor.parentNode === ul) {
      anchor.insertAdjacentElement('afterend', li);
    } else {
      ul.insertBefore(li, ul.firstChild);
    }
  }

  function bindToggle() {
    if (window.glaLangToggleBound) return;
    window.glaLangToggleBound = true;

    document.addEventListener('click', function (e) {
      var btn = e.target.closest('.gla-lang-flag[data-lang]');
      if (!btn) return;
      e.preventDefault();
      applyLang(btn.getAttribute('data-lang') || 'pt-br');
    });
  }

  function boot() {
    if (pageHasI18n()) {
      document.body.classList.add('gla-i18n-page');
    }
    injectToggle();
    bindToggle();
    applyLang(getStored(), { silent: true });
    try {
      window.dispatchEvent(new CustomEvent('gla:langChanged', {
        detail: { norm: normalizeLang(getStored()), tag: getStored() }
      }));
    } catch (e) { }
  }

  window.glaLang = {
    STORAGE_KEY: STORAGE_KEY,
    UI_LANGS: UI_LANGS,
    normalizeLang: normalizeLang,
    toLangTag: toLangTag,
    getStored: getStored,
    getNorm: function () {
      return normalizeLang(document.documentElement.lang || getStored());
    },
    getWidgetLang: function () {
      return this.getNorm() === 'en' ? 'en' : 'pt';
    },
    applyLang: applyLang
  };

  window.glaLangBoot = boot;

  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', boot);
  } else {
    boot();
  }
  window.addEventListener('load', boot);

  var tries = 0;
  var retryTimer = setInterval(function () {
    if (document.getElementById('pt-langtoggle') || !shouldShowToggle() || tries++ > 40) {
      clearInterval(retryTimer);
      return;
    }
    injectToggle();
  }, 150);
})();