Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
$(function($) {
  var namespaceNumber = mw.config.get('wgNamespaceNumber');
  var isCorrectNamespace = namespaceNumber === 0 || namespaceNumber === 2 || namespaceNumber === 118;
  if (!isCorrectNamespace) {
    return;
  }
  mw.loader.using('mediawiki.util').then(function() {
    if ($('table.infobox.biota').length // Taxonbox
      &&
      $('table.infobox.biota .genus').length // Species
      &&
      ($('table.infobox.biota img[src$=Red_Pencil_Icon\\.png]').length == 0)) { // No red pencil
      var portletlink = mw.util.addPortletLink('p-tb', '#', 'Taxoboxalyzer', 'ca-taxoboxalyzer');
      $(portletlink).click(function(e) {
        e.preventDefault();
        var tx_server = typeof window.taxoboxalyzer_server == 'undefined' ?
          'https://taxoboxalyzer.toolforge.org' :
          window.taxoboxalyzer_server
        window.location.assign(tx_server + '/form/' + encodeURIComponent(mw.config.get('wgPageName')));
        return true;
      });
    }
    if (!(typeof window.taxoboxalyzer_testserver == 'undefined')) {
      var testportletlink = mw.util.addPortletLink('p-tb', '#', 'Taxoboxalyzer-test', 'ca-taxoboxalyzer-test');
      $(testportletlink).click(function(e) {
        e.preventDefault();
        window.location.assign(window.taxoboxalyzer_testserver + '/form/' + encodeURIComponent(mw.config.get('wgPageName')));
        return true;
      });
      var testportletlink2 = mw.util.addPortletLink('p-tb', '#', 'Taxoboxalyzer-test-ajax', 'ca-taxoboxalyzer-test-ajax', 'Test using local server');
      $(testportletlink2).click(function(e) {
        e.preventDefault();
        var dataelem = {}
        if ($('#wpTextbox1').length) {
          dataelem['wpTextbox1'] = $('#wpTextbox1').val()
          $('#wpTextbox1').prop('disabled', true)
        }
        if ($('#wpSummary').length) {
          dataelem['wpSummary'] = $('#wpSummary').val()
          $('#wpSummary').prop('disabled', true)
        }
        $.ajax({
          type: Object.keys(dataelem).length === 0 ? 'GET' : 'POST',
          url: window.taxoboxalyzer_testserver + '/json/' + encodeURIComponent(mw.config.get('wgPageName')),
          dataType: 'json',
          error: ( jqXHR, textStatus, errorThrown ) => {
              alert(textStatus + ':' + errorThrown)
          },
          success: (obj) => {
            if (Object.keys(dataelem).length === 0) {
              $('body').append(
                '<form id="tbxlzr" method="post" action="https://en.wikipedia.org/w/index.php?title=' + encodeURIComponent(mw.config.get('wgPageName')) + '&action=submit">' +
                '<textarea style="display:none;" name="wpTextbox1"></textarea>' +
                '<input type="hidden" name="wpAutoSummary" value="fakehash">' +
                '<input type="hidden" name="wpSummary" value="">' +
                '<input type="hidden" name="wpStarttime" value="startTime">' +
                '<input type="hidden" name="wpEdittime" value="editTime">' +
                '<input type="hidden" name="wpDiff" value="Show changes">' +
                '<input type="hidden" name="wpUltimateParam" value="1">' +
                '<input id="tbxlzrsmit" type="submit" value="View differences in editor" style="display:none;"/>' +
                '</form>')
              $('form#tbxlzr [name=wpTextbox1]').text(obj['newtext'])
              $('form#tbxlzr [name=wpSummary]').val(obj['edit_summary'])
              $('#tbxlzrsmit').click();
            } else {
              $('#wpTextbox1').val(obj['newtext'])
              $('#wpSummary').val(obj['edit_summary'])
              $('#wpTextbox1').prop('disabled', false)
              $('#wpSummary').prop('disabled', false)
            }
          },
          data: dataelem
        });
        return dataelem == {};
      });
    }
  });
});