This is a wiki for a reason. Anyone can contribute. If you see something that is inaccurate or can be improved, don't ask that it be fixed--just improve it.
[ Disclaimer, Create new user --- Wiki markup help, Install P99 ]

Difference between revisions of "MediaWiki:HuntingGuide.js"

From Project 1999 Wiki
Jump to: navigation, search
Line 1: Line 1:
const $rows = $('.wikitable tbody tr');
+
// Basic DOM manipulation onReady (since the wiki won't let us add <input> tags in the wiki text
const spots = $rows.map(function (i, el) {
+
    var groupLevel = $(el).children('td:eq(1)').text();
+
    groupLevel = groupLevel.trim() === '-' ? null : groupLevel;
+
    const $tr = $(el);
+
    return {
+
      soloLevel: $tr.children('td:eq(0)').text(),
+
      groupLevel,
+
      zone: $tr.children('td:eq(2)').text(),
+
      area: $tr.children('td:eq(3)').text(),
+
      monsters: $tr.children('td:eq(4)').text(),
+
      xpMod: $tr.children('td:eq(5)').text(),
+
      notes: $tr.children('td:eq(6)').text(),
+
      $tr
+
    }
+
  }
+
);
+
 
$('#levelFilterPlaceholder').replaceWith('<input id="levelFilter" style="width:30px"/>');
 
$('#levelFilterPlaceholder').replaceWith('<input id="levelFilter" style="width:30px"/>');
  
$('#levelFilter').change(function() {
+
// Get jQuery object of every row in the hunting guide (because all of the filter functions need it)
 +
var $rows = $('.wikitable tbody tr');
 +
 
 +
/**
 +
* Build a in-memory data object with the data parsed from each row (which will tell us which
 +
* levels/classes should be shown for any filter).
 +
* @example a "spot" created by this function for critters in Butcherblock Mountains: {
 +
*  soloLevel: '04-06',
 +
*  groupLevel: '03-05',
 +
*  zone: 'Butcherblock Mountains',
 +
*  area: 'Greater Faydark zoneline',
 +
*  monsters: 'Assorted Critters ',
 +
*  xpMod: '100%',
 +
*  notes: '',
 +
*  $tr: *a jQuery object pointing to the <tr> that all this data originally came from*
 +
* }
 +
*/
 +
var spots = $rows.map(function (i, el) {
 +
  var groupLevel = $(el).children('td:eq(1)').text();
 +
  groupLevel = groupLevel.trim() === '-' ? null : groupLevel;
 +
  var $tr = $(el);
 +
  return {
 +
    soloLevel: $tr.children('td:eq(0)').text(),
 +
    groupLevel,
 +
    zone: $tr.children('td:eq(2)').text(),
 +
    area: $tr.children('td:eq(3)').text(),
 +
    monsters: $tr.children('td:eq(4)').text(),
 +
    xpMod: $tr.children('td:eq(5)').text(),
 +
    notes: $tr.children('td:eq(6)').text(),
 +
    $tr
 +
  }
 +
});
 +
 
 +
/**
 +
* Filter out (hides) rows which aren't for the level the user entered
 +
*/
 +
var filterForLevel = function () {
 
   var level = parseInt($('#levelFilter').val(), 10);
 
   var level = parseInt($('#levelFilter').val(), 10);
   const $rows = $('.wikitable tbody tr');
+
   var $rows = $('.wikitable tbody tr');
 
   $rows.hide();
 
   $rows.hide();
 
   spots.each(function(i, spot) {
 
   spots.each(function(i, spot) {
Line 27: Line 47:
 
     var minLevel = parseInt(splitLevelRanges[0], 10);
 
     var minLevel = parseInt(splitLevelRanges[0], 10);
 
     var maxLevel = parseInt(splitLevelRanges[1] || splitLevelRanges[0], 10);
 
     var maxLevel = parseInt(splitLevelRanges[1] || splitLevelRanges[0], 10);
    console.log(levelRangeText[0], levelRangeText[1], minLevel, level, maxLevel)
 
 
     if (minLevel <= level && maxLevel >= level) {
 
     if (minLevel <= level && maxLevel >= level) {
 
       spot.$tr.show();
 
       spot.$tr.show();
Line 33: Line 52:
 
   });
 
   });
 
   selectFilter($('#levelFilterLabel'));
 
   selectFilter($('#levelFilterLabel'));
});
+
  hideHeaders();
 +
};
  
function filterForClass(eqClass) {
+
/**
   $rows.show();
+
* Filters out (hides) rows which aren't specifically "good for" the clicked class
   if (eqClass.trim().toLowerCase() === "none") return;
+
* @param e
 +
*/
 +
var filterForClass = function(e) {
 +
   var $target = $(e.target);
 +
  selectFilter($target);
 +
  var eqClass = $target.text();
 +
   if (eqClass.trim().toLowerCase() === "none") {
 +
    $rows.show();
 +
    return;
 +
  }
  
 
   $rows.hide();
 
   $rows.hide();
 
 
   spots.each((function(i, spot) {
 
   spots.each((function(i, spot) {
     if (!spot.notes.toLowerCase()
+
     var lowerCaseNotes = spot.notes.toLowerCase();
        .match(new RegExp(`good for .*?${eqClass.toLowerCase()}`))) return;
+
    if (!lowerCaseNotes.match(new RegExp(`good for .*?${eqClass.toLowerCase()}`))) return;
 
     spot.$tr.show();
 
     spot.$tr.show();
 
   }));
 
   }));
 +
  hideHeaders();
 
}
 
}
  
function selectFilter($target) {
+
/**
 +
* Hides the table headers and level range headings for level ranges that have been completely
 +
* filtered out
 +
*/
 +
var hideHeaders = function () {
 +
  // Hide the tables
 +
  $('table').each(function(i, table) {
 +
    var $table = $(table);
 +
    if (!$table.find('tbody').children('tr:visible').length) $table.hide();
 +
  });
 +
  // Hide the headings (<h4> elements)
 +
  $('h4').each(function(i, h4) {
 +
    var $h4 = $(h4);
 +
    $h4.toggle($h4.next('table').is(':visible'))
 +
  });
 +
}
 +
 
 +
/**
 +
* Visually marks the currently-used filter with an underline
 +
*/
 +
var selectFilter = function ($target) {
 
   $('.filterLink, #levelFilterLabel').css({textDecoration: ''});
 
   $('.filterLink, #levelFilterLabel').css({textDecoration: ''});
 
   $target.css({textDecoration: 'underline'});
 
   $target.css({textDecoration: 'underline'});
 
}
 
}
  
$('.filterLink').click(function(e) {
+
// Bind event handlers
  var $target = $(e.target);
+
$('.filterLink').click(filterForClass);
  selectFilter($target);
+
$('#levelFilter').change(filterForLevel);
  filterForClass($target.text());
+
});
+

Revision as of 21:39, 16 November 2017

// Basic DOM manipulation onReady (since the wiki won't let us add <input> tags in the wiki text
$('#levelFilterPlaceholder').replaceWith('<input id="levelFilter" style="width:30px"/>');

// Get jQuery object of every row in the hunting guide (because all of the filter functions need it)
var $rows = $('.wikitable tbody tr');

/**
 * Build a in-memory data object with the data parsed from each row (which will tell us which
 * levels/classes should be shown for any filter).
 * @example a "spot" created by this function for critters in Butcherblock Mountains: {
 *   soloLevel: '04-06',
 *   groupLevel: '03-05',
 *   zone: 'Butcherblock Mountains',
 *   area: 'Greater Faydark zoneline',
 *   monsters: 'Assorted Critters	',
 *   xpMod: '100%',
 *   notes: '',
 *   $tr: *a jQuery object pointing to the <tr> that all this data originally came from*
 * }
 */
var spots = $rows.map(function (i, el) {
  var groupLevel = $(el).children('td:eq(1)').text();
  groupLevel = groupLevel.trim() === '-' ? null : groupLevel;
  var $tr = $(el);
  return {
    soloLevel: $tr.children('td:eq(0)').text(),
    groupLevel,
    zone: $tr.children('td:eq(2)').text(),
    area: $tr.children('td:eq(3)').text(),
    monsters: $tr.children('td:eq(4)').text(),
    xpMod: $tr.children('td:eq(5)').text(),
    notes: $tr.children('td:eq(6)').text(),
    $tr
  }
});

/**
 * Filter out (hides) rows which aren't for the level the user entered
 */
var filterForLevel = function () {
  var level = parseInt($('#levelFilter').val(), 10);
  var $rows = $('.wikitable tbody tr');
  $rows.hide();
  spots.each(function(i, spot) {
    var levelRangeText = spot.$tr.children('td:first').text();
    var splitLevelRanges = levelRangeText.split('-');
    var minLevel = parseInt(splitLevelRanges[0], 10);
    var maxLevel = parseInt(splitLevelRanges[1] || splitLevelRanges[0], 10);
    if (minLevel <= level && maxLevel >= level) {
      spot.$tr.show();
    }
  });
  selectFilter($('#levelFilterLabel'));
  hideHeaders();
};

/**
 * Filters out (hides) rows which aren't specifically "good for" the clicked class
 * @param e
 */
var filterForClass = function(e) {
  var $target = $(e.target);
  selectFilter($target);
  var eqClass = $target.text();
  if (eqClass.trim().toLowerCase() === "none") {
    $rows.show();
    return;
  }

  $rows.hide();
  spots.each((function(i, spot) {
    var lowerCaseNotes = spot.notes.toLowerCase();
    if (!lowerCaseNotes.match(new RegExp(`good for .*?${eqClass.toLowerCase()}`))) return;
    spot.$tr.show();
  }));
  hideHeaders();
}

/**
 * Hides the table headers and level range headings for level ranges that have been completely
 * filtered out
 */
var hideHeaders = function () {
  // Hide the tables
  $('table').each(function(i, table) {
    var $table = $(table);
    if (!$table.find('tbody').children('tr:visible').length) $table.hide();
  });
  // Hide the headings (<h4> elements)
  $('h4').each(function(i, h4) {
    var $h4 = $(h4);
    $h4.toggle($h4.next('table').is(':visible'))
  });
}

/**
 * Visually marks the currently-used filter with an underline
 */
var selectFilter = function ($target) {
  $('.filterLink, #levelFilterLabel').css({textDecoration: ''});
  $target.css({textDecoration: 'underline'});
}

// Bind event handlers
$('.filterLink').click(filterForClass);
$('#levelFilter').change(filterForLevel);