User:Cryptic/spoiler.js

From Wikipedia, the free encyclopedia

Note: After saving, you have to bypass your browser's cache to see the changes. Firefox/Mozilla/Safari: hold down Shift while clicking Reload (or press Ctrl-Shift-R), Internet Explorer: press Ctrl-F5, Opera/Konqueror: press F5.

//<pre><nowiki>
var hide_spoilers_initially = false;
var hide_endspoiler_tag = false;
var spoiler_num = 0;

function spoiler_toggle(num)
{
  var contents = document.getElementById('spoilercontents_' + num);
  var lk = document.getElementById('spoilerlk_' + num);
  if (!contents || !lk)
    return;
  if (contents.style.display == 'none')
    {
      contents.style.display = '';
      lk.replaceChild(document.createTextNode('hide'), lk.firstChild);
    }
  else
    {
      contents.style.display = 'none';
      lk.replaceChild(document.createTextNode('show'), lk.firstChild);
    }
}

function setup_spoilers()
{
  var divs = document.getElementsByTagName('div');
  var hide_initially = hide_spoilers_initially
                       && !/(\?title=|\/wiki\/)(Talk|User|Wikipedia|Image|MediaWiki|Template|Help|Category|Portal)(_talk)?:/.test(window.location.href);

  for (var i = 0; i < divs.length; ++i)
    {
      var node = divs[i];
      if (node.id != 'spoiler')
        continue;

      ++spoiler_num;

      var lk = document.createElement('a');
      lk.setAttribute('href', 'javascript:spoiler_toggle(' + spoiler_num + ')');
      lk.appendChild(document.createTextNode(hide_initially ? 'show' : 'hide'));
      lk.id = 'spoilerlk_' + spoiler_num;
      lk.className = 'spoilertoggle';

      node.appendChild(document.createTextNode(' ['));
      node.appendChild(lk);
      node.appendChild(document.createTextNode(']'));

      var contents = document.createElement('div');
      contents.className = 'spoilercontents';
      contents.id = 'spoilercontents_' + spoiler_num;
      if (hide_initially)
        contents.style.display = 'none';

      var depth = 0;
      while (depth >= 0)
        {
          var n = node.nextSibling;
          if (!n)
            break;

          if (n.id == 'spoiler')
            ++depth;
          else if (n.className && n.className.indexOf('endspoiler') >= 0
                   && --depth < 0 && !hide_endspoiler_tag)
            break;

          n.parentNode.removeChild(n);
          contents.appendChild(n);
        }

      if (node.nextSibling)
        node.parentNode.insertBefore(contents, node.nextSibling);
      else
        node.parentNode.appendChild(contents);
    }
}

addOnloadHook(setup_spoilers);
//</nowiki></pre>