<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.seculargames.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ABuffLines.js</id>
	<title>MediaWiki:BuffLines.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.seculargames.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3ABuffLines.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.seculargames.org/index.php?title=MediaWiki:BuffLines.js&amp;action=history"/>
	<updated>2026-07-29T05:22:20Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.seculargames.org/index.php?title=MediaWiki:BuffLines.js&amp;diff=45793&amp;oldid=prev</id>
		<title>imported&gt;Loramin at 17:19, 19 January 2019</title>
		<link rel="alternate" type="text/html" href="https://wiki.seculargames.org/index.php?title=MediaWiki:BuffLines.js&amp;diff=45793&amp;oldid=prev"/>
		<updated>2019-01-19T17:19:58Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;// List of classes that cast buffs&lt;br /&gt;
var eqClasses = [&amp;#039;Bard&amp;#039;, &amp;#039;Cleric&amp;#039;, &amp;#039;Druid&amp;#039;, &amp;#039;Enchanter&amp;#039;, &amp;#039;Magician&amp;#039;, &amp;#039;Necromancer&amp;#039;, &amp;#039;Paladin&amp;#039;, &amp;#039;Ranger&amp;#039;, &amp;#039;Shadow Knight&amp;#039;, &amp;#039;Shaman&amp;#039;, &amp;#039;Wizard&amp;#039;]&lt;br /&gt;
var sources = [&amp;#039;Consumable&amp;#039;, &amp;#039;Clickable&amp;#039;, &amp;#039;Proc&amp;#039;, &amp;#039;Spell&amp;#039;, &amp;#039;Worn&amp;#039;];&lt;br /&gt;
var itemSources = [&amp;#039;Consumable&amp;#039;, &amp;#039;Clickable&amp;#039;, &amp;#039;Proc&amp;#039;, &amp;#039;Worn&amp;#039;];&lt;br /&gt;
var targets = [&amp;#039;Group&amp;#039;, &amp;#039;Self-only&amp;#039;, &amp;#039;Single&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Converts a class/source/target into an ID, eg. Group =&amp;gt; groupFilter&lt;br /&gt;
 */&lt;br /&gt;
var makeId = function(thing) {&lt;br /&gt;
  if (thing === &amp;#039;Self-only&amp;#039;) return &amp;#039;selfOnlyFilter&amp;#039;;&lt;br /&gt;
  if (thing === &amp;#039;Shadow Knight&amp;#039;) return &amp;#039;shadowKnightFilter&amp;#039;;&lt;br /&gt;
  return thing.toLowerCase() + &amp;#039;Filter&amp;#039;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
  * @returns the HTML for a label/checkbox combination for one filter type&lt;br /&gt;
  */&lt;br /&gt;
var buildCheckboxLine = function(type, label) {&lt;br /&gt;
  label = isNaN(label) ? label : type;&lt;br /&gt;
  return &amp;#039;  &amp;lt;label&amp;gt;&amp;lt;input id=&amp;quot;&amp;#039; + makeId(type) + &amp;#039;&amp;quot;checked class=&amp;quot;filter&amp;quot; type=&amp;quot;checkbox&amp;quot;/&amp;gt; &amp;#039; + label + &amp;#039;&amp;lt;/label&amp;gt;&amp;#039;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var isChecked = function(thingToCheck) {&lt;br /&gt;
  return $(&amp;#039;#&amp;#039; + makeId(thingToCheck)).is(&amp;#039;:checked&amp;#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var isItemSource = function(line) {&lt;br /&gt;
  return (&lt;br /&gt;
    doesLineMatchThisAndType(&amp;#039;Consumable&amp;#039;, line) ||&lt;br /&gt;
    doesLineMatchThisAndType(&amp;#039;Clickable&amp;#039;, line) ||&lt;br /&gt;
    doesLineMatchThisAndType(&amp;#039;Proc&amp;#039;, line) ||&lt;br /&gt;
    doesLineMatchThisAndType(&amp;#039;Worn&amp;#039;, line)&lt;br /&gt;
  );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
var isSingle = function(line) {&lt;br /&gt;
  var isGroup = line.toLowerCase().indexOf(&amp;#039;group&amp;#039;) !== -1;&lt;br /&gt;
  var isSelfOnly = line.toLowerCase().indexOf(&amp;#039;self-only&amp;#039;) !== -1;&lt;br /&gt;
  return !isGroup &amp;amp;&amp;amp; !isSelfOnly;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Checks whether the provided line matches the provided type&lt;br /&gt;
 * eg. doesLineMatchThisAndType(&amp;#039;target&amp;#039;, &amp;#039;single&amp;#039;, line) would only&lt;br /&gt;
 *     return true if the line was for a single-target buff (ie. it had no &lt;br /&gt;
 *     &amp;quot;self-only&amp;quot; or &amp;quot;group&amp;quot;)&lt;br /&gt;
 */&lt;br /&gt;
var doesLineMatchThisAndType = function(type, line) {&lt;br /&gt;
  line = line.toLowerCase();&lt;br /&gt;
  type = type.toLowerCase();&lt;br /&gt;
  // &amp;quot;Spell&amp;quot; matches if none of the item sources match&lt;br /&gt;
  if (type === &amp;#039;spell&amp;#039;) return !isItemSource(line);&lt;br /&gt;
  // Single matches if neither a group nor self-only match&lt;br /&gt;
  if (type === &amp;#039;single&amp;#039;) return isSingle(line);&lt;br /&gt;
  return line.indexOf(type) !== -1;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Higher Order function which returns a function that returns true only if&lt;br /&gt;
 * the line both matches the provided type and if that type&lt;br /&gt;
 * should be shown (ie. is checked)&lt;br /&gt;
 */&lt;br /&gt;
var hasTypeInLineAndTypeIsShown = function(line) { &lt;br /&gt;
  return function(type) {&lt;br /&gt;
    // If this type (eg. Shaman spells) isn&amp;#039;t checked, don&amp;#039;t show it&lt;br /&gt;
    if (!isChecked(type)) return false;&lt;br /&gt;
&lt;br /&gt;
    // Otherwise, show it if this line matches (eg. it is a Shaman spell)&lt;br /&gt;
    return doesLineMatchThisAndType(type,  line);&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @returns true if the provided line matches an item source that is checked&lt;br /&gt;
 */&lt;br /&gt;
var hasMatchingItemSource = function(line) {&lt;br /&gt;
  return itemSources.some(hasTypeInLineAndTypeIsShown(line));&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @returns true if the provided line matches a class that is checked, and the&lt;br /&gt;
 *          &amp;quot;Spell&amp;quot; source is currently checked&lt;br /&gt;
 */&lt;br /&gt;
var hasMatchingSpellSource = function(line) {&lt;br /&gt;
  return isChecked(&amp;#039;Spell&amp;#039;) &amp;amp;&amp;amp; &lt;br /&gt;
         eqClasses.some(hasTypeInLineAndTypeIsShown(line));&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @returns true if the provided line matches a target that has been checked&lt;br /&gt;
 */&lt;br /&gt;
var hasMatchingTarget = function(line) {&lt;br /&gt;
  return targets.some(hasTypeInLineAndTypeIsShown(line));&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var shouldShow = function(line) {&lt;br /&gt;
  var isBuff = line.startsWith(&amp;#039;+&amp;#039;);&lt;br /&gt;
  var itemSourceIsShown = hasMatchingItemSource(line);&lt;br /&gt;
  var spellSourceIsShown = hasMatchingSpellSource(line);&lt;br /&gt;
  var targetIsShown = hasMatchingTarget(line);&lt;br /&gt;
  var isShown = !isBuff || ( // non-buff lines are always shown&lt;br /&gt;
    // line must match a class or item source&lt;br /&gt;
    (itemSourceIsShown || spellSourceIsShown) &amp;amp;&amp;amp;&lt;br /&gt;
    // line must also match a target&lt;br /&gt;
    targetIsShown&lt;br /&gt;
  );&lt;br /&gt;
  //if (!isShown) console.log(line, &amp;#039;isBuff, itemSourceIsShown, spellSourceIsShown, targetIsShown&amp;#039;, isBuff, itemSourceIsShown, spellSourceIsShown, targetIsShown);&lt;br /&gt;
  return isShown;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var areAllClassCheckboxesChecked = function() {&lt;br /&gt;
  return eqClasses.every(function(eqClass) {&lt;br /&gt;
    return $(&amp;#039;#&amp;#039; + makeId(eqClass)).is(&amp;#039;:checked&amp;#039;)&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
var areAllClassCheckboxesUnchecked = function() {&lt;br /&gt;
  return eqClasses.every(function(eqClass) {&lt;br /&gt;
    return !$(&amp;#039;#&amp;#039; + makeId(eqClass)).is(&amp;#039;:checked&amp;#039;)&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var checkAllClassBoxes = function() {&lt;br /&gt;
  eqClasses.forEach(function(eqClass) {&lt;br /&gt;
    $(&amp;#039;#&amp;#039; + makeId(eqClass)).trigger(&amp;#039;click&amp;#039;).prop(&amp;#039;checked&amp;#039;, true);&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var uncheckAllClassBoxes = function() {&lt;br /&gt;
  eqClasses.forEach(function(eqClass) {&lt;br /&gt;
    $(&amp;#039;#&amp;#039; + makeId(eqClass)).trigger(&amp;#039;click&amp;#039;).prop(&amp;#039;checked&amp;#039;, false);&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Filter buffs when a buff checkbox is clicked&lt;br /&gt;
var handleFilterCheckboxClick = function(e) {&lt;br /&gt;
  $(&amp;#039;#content li&amp;#039;).each(function(i, el) {&lt;br /&gt;
    var line = $(el).text().trim();&lt;br /&gt;
    var shouldBeShown = shouldShow(line);&lt;br /&gt;
    $(el).toggle(shouldBeShown);&lt;br /&gt;
  });&lt;br /&gt;
  // If all of the checkboxes are checked, ensure the All box is checked&lt;br /&gt;
  // (and vice versa if they&amp;#039;re all unchecked)&lt;br /&gt;
  if (!areAllClassCheckboxesChecked()) {&lt;br /&gt;
    $(&amp;#039;#allClassFilter&amp;#039;).prop(&amp;#039;checked&amp;#039;, false);&lt;br /&gt;
  } else if (!areAllClassCheckboxesUnchecked()) {&lt;br /&gt;
    $(&amp;#039;#allClassFilter&amp;#039;).prop(&amp;#039;checked&amp;#039;, true);&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var handleAllClassCheckboxChange = function(e) {&lt;br /&gt;
  if (e.target.checked &amp;amp;&amp;amp; !areAllClassCheckboxesChecked()) {&lt;br /&gt;
    checkAllClassBoxes();&lt;br /&gt;
  } else if (!e.target.checked &amp;amp;&amp;amp; !areAllClassCheckboxesUnchecked()) {&lt;br /&gt;
    uncheckAllClassBoxes();&lt;br /&gt;
  }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
$(function() {&lt;br /&gt;
  // Replace placeholder with checkboxes (since wiki doesn&amp;#039;t allow checkboxesw)&lt;br /&gt;
  $(&amp;#039;#checkboxesPlaceHolder&amp;#039;).replaceWith(&lt;br /&gt;
    &amp;#039;&amp;lt;div&amp;gt;&amp;#039; +&lt;br /&gt;
    &amp;#039;  &amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Source:&amp;lt;/strong&amp;gt; &amp;#039; + &lt;br /&gt;
       sources.map(buildCheckboxLine).join(&amp;#039; &amp;#039;) + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039; +&lt;br /&gt;
    &amp;#039;  &amp;lt;div&amp;gt;&amp;lt;strong&amp;gt;Target:&amp;lt;/strong&amp;gt; &amp;#039; + &lt;br /&gt;
       targets.map(buildCheckboxLine).join(&amp;#039; &amp;#039;) + &amp;#039;&amp;lt;/div&amp;gt;&amp;#039; +&lt;br /&gt;
    &amp;#039;  &amp;lt;div&amp;gt;&amp;#039; +&lt;br /&gt;
    &amp;#039;    &amp;lt;strong&amp;gt;Class:&amp;lt;/strong&amp;gt; &amp;#039; +&lt;br /&gt;
    &amp;#039;    &amp;lt;label&amp;gt;&amp;lt;input id=&amp;quot;allClassFilter&amp;quot;checked type=&amp;quot;checkbox&amp;quot;/&amp;gt; All&amp;lt;/label&amp;gt;&amp;#039; +&lt;br /&gt;
         eqClasses.map(buildCheckboxLine).join(&amp;#039; &amp;#039;) +&lt;br /&gt;
    &amp;#039;  &amp;lt;/div&amp;gt;&amp;#039; +&lt;br /&gt;
    &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
  );&lt;br /&gt;
  // When they are clicked, filter&lt;br /&gt;
  $(&amp;#039;.filter&amp;#039;).click(handleFilterCheckboxClick);&lt;br /&gt;
  $(&amp;#039;#allClassFilter&amp;#039;).change(handleAllClassCheckboxChange);&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>imported&gt;Loramin</name></author>
	</entry>
</feed>