<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wikiislamica.net/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AFloatingToc%2Fcode.js</id>
	<title>MediaWiki:FloatingToc/code.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wikiislamica.net/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AFloatingToc%2Fcode.js"/>
	<link rel="alternate" type="text/html" href="https://wikiislamica.net/index.php?title=MediaWiki:FloatingToc/code.js&amp;action=history"/>
	<updated>2026-05-04T09:03:32Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>https://wikiislamica.net/index.php?title=MediaWiki:FloatingToc/code.js&amp;diff=133609&amp;oldid=prev</id>
		<title>Exmoose: Floating Table of Contents</title>
		<link rel="alternate" type="text/html" href="https://wikiislamica.net/index.php?title=MediaWiki:FloatingToc/code.js&amp;diff=133609&amp;oldid=prev"/>
		<updated>2021-10-24T19:51:45Z</updated>

		<summary type="html">&lt;p&gt;Floating Table of Contents&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/**&lt;br /&gt;
 * @name        FloatingToc&lt;br /&gt;
 * @author      Pecoes, KhangND&lt;br /&gt;
 * @desc        Makes the Table of Contents floatable&lt;br /&gt;
 * @doc         https://dev.fandom.com/wiki/FloatingToc&lt;br /&gt;
 * @files used:&lt;br /&gt;
 *   [[File:Ui-icons_ffffff_256x240.png]]&lt;br /&gt;
 *   [[File:Ui-icons_222222_256x240.png]]&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
(function (mw, $, window) {&lt;br /&gt;
  if (mw.config.get(&amp;#039;skin&amp;#039;) === &amp;#039;fandomdesktop&amp;#039;) return;&lt;br /&gt;
  var root = $(&amp;quot;#toc&amp;quot;);&lt;br /&gt;
  if (window.FloatingTocLoaded || !root.length) return;&lt;br /&gt;
  window.FloatingTocLoaded = true;&lt;br /&gt;
&lt;br /&gt;
  function importArticle(page) {&lt;br /&gt;
    const isScript = page.split(&amp;quot;.&amp;quot;).pop() === &amp;quot;js&amp;quot;;&lt;br /&gt;
    return $.ajax({&lt;br /&gt;
      url: mw.config.get(&amp;quot;wgLoadScript&amp;quot;),&lt;br /&gt;
      data: {&lt;br /&gt;
        mode: &amp;quot;articles&amp;quot;,&lt;br /&gt;
        only: isScript ? &amp;quot;scripts&amp;quot; : &amp;quot;styles&amp;quot;,&lt;br /&gt;
        articles: &amp;quot;u:dev:MediaWiki:&amp;quot; + page,&lt;br /&gt;
      },&lt;br /&gt;
    }).then(function (content) {&lt;br /&gt;
      $(&amp;quot;head&amp;quot;).append($(isScript ? &amp;quot;&amp;lt;script&amp;gt;&amp;quot; : &amp;quot;&amp;lt;style&amp;gt;&amp;quot;).html(content));&lt;br /&gt;
    });&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  var css = importArticle(&amp;quot;FloatingToc.css&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  var colors = (window.dev || {}).colors&lt;br /&gt;
    ? $.Deferred().resolve()&lt;br /&gt;
    : importArticle(&amp;quot;Colors/code.js&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  var i18n = ((window.dev || {}).i18n || {}).loadMessages&lt;br /&gt;
    ? $.Deferred().resolve()&lt;br /&gt;
    : importArticle(&amp;quot;I18n-js/code.js&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  var jQueryUI = mw.loader.using([&lt;br /&gt;
    &amp;quot;jquery.ui.dialog&amp;quot;,&lt;br /&gt;
    &amp;quot;jquery.ui.draggable&amp;quot;,&lt;br /&gt;
    &amp;quot;jquery.ui.resizable&amp;quot;,&lt;br /&gt;
    &amp;quot;jquery.effects.slide&amp;quot;,&lt;br /&gt;
  ]);&lt;br /&gt;
&lt;br /&gt;
  $.when(i18n, css, colors, jQueryUI)&lt;br /&gt;
    .then(function () {&lt;br /&gt;
      return window.dev.i18n.loadMessages(&amp;quot;FloatingToc&amp;quot;);&lt;br /&gt;
    })&lt;br /&gt;
    .then(function (_i18n) {&lt;br /&gt;
      var colors = window.dev.colors;&lt;br /&gt;
      var pageBright = colors.parse(colors.wikia.page).isBright();&lt;br /&gt;
      var menuBright = colors.parse(colors.wikia.menu).isBright();&lt;br /&gt;
      var iconLight = &amp;#039;url(&amp;quot;https://images.wikia.nocookie.net/dev/images/c/c2/Ui-icons_ffffff_256x240.png&amp;quot;)&amp;#039;;&lt;br /&gt;
      var iconDark = &amp;#039;url(&amp;quot;https://images.wikia.nocookie.net/dev/images/a/aa/Ui-icons_222222_256x240.png&amp;quot;)&amp;#039;;&lt;br /&gt;
      var styles =&lt;br /&gt;
        &amp;quot;.toc-dialog{\&lt;br /&gt;
            border: 2px solid $border;\&lt;br /&gt;
        }\&lt;br /&gt;
        .toc-dialog .ui-dialog-titlebar {\&lt;br /&gt;
            background: $menu;\&lt;br /&gt;
            border: 1px solid $menu;\&lt;br /&gt;
            color: $contrast;\&lt;br /&gt;
        }\&lt;br /&gt;
        .toc-dialog.ui-widget-content .ui-icon {\&lt;br /&gt;
            background-image: $menu-icons;\&lt;br /&gt;
        }\&lt;br /&gt;
        .toc-dialog.ui-widget-content a {\&lt;br /&gt;
          color: $link;\&lt;br /&gt;
        }\&lt;br /&gt;
        .toc-dialog,\&lt;br /&gt;
        .toc-dialog .toc {\&lt;br /&gt;
            background-color: $page;\&lt;br /&gt;
            color: $text;\&lt;br /&gt;
        }\&lt;br /&gt;
        #toc-open {\&lt;br /&gt;
            border: 1px solid $page-border-gray;\&lt;br /&gt;
            background-image: $page-icons;\&lt;br /&gt;
        }\&lt;br /&gt;
        .toc-btn, .toc-btn:hover {\&lt;br /&gt;
            background-image: $menu-icons;\&lt;br /&gt;
        }\&lt;br /&gt;
        .toc-btn:hover {\&lt;br /&gt;
            background-color: $gradient;\&lt;br /&gt;
        }&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      mw.util.addCSS(&lt;br /&gt;
        colors.replace(styles, {&lt;br /&gt;
          &amp;quot;page-border-gray&amp;quot;: colors.wikia.border,&lt;br /&gt;
          &amp;quot;menu-icons&amp;quot;: menuBright ? iconDark : iconLight,&lt;br /&gt;
          &amp;quot;page-icons&amp;quot;: pageBright ? iconDark : iconLight,&lt;br /&gt;
        })&lt;br /&gt;
      );&lt;br /&gt;
&lt;br /&gt;
      var win = $(window),&lt;br /&gt;
        page = $(&amp;quot;#WikiaPage&amp;quot;),&lt;br /&gt;
        rail = $(&amp;quot;#WikiaRail&amp;quot;),&lt;br /&gt;
        navHeight = $(&amp;quot;#globalNavigation&amp;quot;).height(),&lt;br /&gt;
        barHeight = $(&amp;quot;#WikiaBarWrapper&amp;quot;).height(),&lt;br /&gt;
        speed = 250,&lt;br /&gt;
        i18n = _i18n.msg,&lt;br /&gt;
        options = $.extend(&lt;br /&gt;
          {&lt;br /&gt;
            auto: false,&lt;br /&gt;
            enableKey: true,&lt;br /&gt;
          },&lt;br /&gt;
          window.FloatingToc&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
      // root ToC components&lt;br /&gt;
      var rootToc = {&lt;br /&gt;
        top: root.offset().top,&lt;br /&gt;
        width: root.outerWidth(),&lt;br /&gt;
        height: root.outerHeight(),&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
      // creates a clone of the root ToC&lt;br /&gt;
      // and transforms it to jQuery UI Dialog&lt;br /&gt;
      var toc = {&lt;br /&gt;
        resizing: false,&lt;br /&gt;
        padWrap: 0,&lt;br /&gt;
        wrapper: $(),&lt;br /&gt;
        clone: $(&amp;quot;&amp;lt;nav&amp;gt;&amp;quot;, {&lt;br /&gt;
          class: &amp;quot;toc show&amp;quot;,&lt;br /&gt;
          id: &amp;quot;tocDialog&amp;quot;,&lt;br /&gt;
          title: i18n(&amp;quot;contents&amp;quot;).plain(),&lt;br /&gt;
          css: { display: &amp;quot;none&amp;quot; },&lt;br /&gt;
          appendTo: page,&lt;br /&gt;
        }),&lt;br /&gt;
&lt;br /&gt;
        state: function () {&lt;br /&gt;
          var w = rootToc.width;&lt;br /&gt;
          var h = Math.min(&lt;br /&gt;
            rootToc.height,&lt;br /&gt;
            win.height() - navHeight - barHeight&lt;br /&gt;
          );&lt;br /&gt;
          return {&lt;br /&gt;
            position: [(win.width() - w) / 2, navHeight],&lt;br /&gt;
            width: w,&lt;br /&gt;
            height: h,&lt;br /&gt;
            maxWidth: win.height() * (w / h),&lt;br /&gt;
            maxHeight: win.height() - navHeight - barHeight,&lt;br /&gt;
          };&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        toggle: function (action) {&lt;br /&gt;
          var links = $(&amp;quot;.toc-link&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
          if (links.css(&amp;quot;display&amp;quot;) === &amp;quot;none&amp;quot;) links.show(speed);&lt;br /&gt;
          else links.hide(speed);&lt;br /&gt;
&lt;br /&gt;
          if (root.css(&amp;quot;display&amp;quot;) === &amp;quot;none&amp;quot;)&lt;br /&gt;
            root.slideDown(speed, toc.keepPos(action));&lt;br /&gt;
          else root.slideUp(speed, toc.keepPos(action));&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        keepPos: function (action) {&lt;br /&gt;
          var winPos = win.scrollTop();&lt;br /&gt;
          if (action === &amp;quot;open&amp;quot; &amp;amp;&amp;amp; winPos &amp;gt; rootToc.top + rootToc.height) {&lt;br /&gt;
            win.scrollTop(winPos - rootToc.height);&lt;br /&gt;
          }&lt;br /&gt;
          if (action === &amp;quot;close&amp;quot;) {&lt;br /&gt;
            if (!options.enableKey) {&lt;br /&gt;
              win.scrollTop(rootToc.top - navHeight);&lt;br /&gt;
              return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (winPos &amp;gt; rootToc.top) win.scrollTop(winPos + rootToc.height);&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        fixPos: function () {&lt;br /&gt;
          if (toc.wrapper.css(&amp;quot;position&amp;quot;) === &amp;quot;fixed&amp;quot;) return;&lt;br /&gt;
          toc.wrapper.css({&lt;br /&gt;
            top: toc.wrapper.offset().top - win.scrollTop(),&lt;br /&gt;
            left: toc.wrapper.offset().left - win.scrollLeft(),&lt;br /&gt;
            position: &amp;quot;fixed&amp;quot;,&lt;br /&gt;
          });&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        reset: function () {&lt;br /&gt;
          toc.clone.dialog(&amp;quot;option&amp;quot;, toc.state());&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        dock: function () {&lt;br /&gt;
          toc.clone.dialog(&amp;quot;option&amp;quot;, {&lt;br /&gt;
            width:&lt;br /&gt;
              rail.width() + parseInt(page.css(&amp;quot;padding-right&amp;quot;)) - toc.padWrap,&lt;br /&gt;
            position: [rail.offset().left, navHeight],&lt;br /&gt;
          });&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        back: function () {&lt;br /&gt;
          win.scrollTop(0);&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        open: function () {&lt;br /&gt;
          toc.clone.dialog(&amp;quot;open&amp;quot;);&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        close: function () {&lt;br /&gt;
          toc.clone.dialog(&amp;quot;close&amp;quot;);&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        button: function (action) {&lt;br /&gt;
          return $(&amp;quot;&amp;lt;button&amp;gt;&amp;quot;, {&lt;br /&gt;
            class: &amp;quot;toc-btn&amp;quot;,&lt;br /&gt;
            id: &amp;quot;toc-&amp;quot; + action,&lt;br /&gt;
            title: i18n(action).plain(),&lt;br /&gt;
            click: toc[action],&lt;br /&gt;
          });&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        onOpen: function () {&lt;br /&gt;
          toc.reset();&lt;br /&gt;
          toc.fixPos();&lt;br /&gt;
          toc.toggle(&amp;quot;open&amp;quot;);&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        onClose: function () {&lt;br /&gt;
          toc.toggle(&amp;quot;close&amp;quot;);&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        onCreate: function () {&lt;br /&gt;
          // sets properties&lt;br /&gt;
          toc.wrapper = $(this).parent();&lt;br /&gt;
          toc.padWrap =&lt;br /&gt;
            (parseInt(toc.wrapper.css(&amp;quot;border-width&amp;quot;)) +&lt;br /&gt;
              parseInt(toc.wrapper.css(&amp;quot;padding&amp;quot;))) *&lt;br /&gt;
            2;&lt;br /&gt;
&lt;br /&gt;
          // modifies components&lt;br /&gt;
          toc.toggle();&lt;br /&gt;
          toc.wrapper.find(&amp;quot;.ui-dialog-titlebar-close&amp;quot;).remove();&lt;br /&gt;
          $(&amp;quot;&amp;lt;div&amp;gt;&amp;quot;, {&lt;br /&gt;
            id: &amp;quot;toc-btns&amp;quot;,&lt;br /&gt;
            appendTo: toc.wrapper.find(&amp;quot;.ui-dialog-titlebar&amp;quot;),&lt;br /&gt;
            append: [&lt;br /&gt;
              toc.button(&amp;quot;back&amp;quot;),&lt;br /&gt;
              toc.button(&amp;quot;dock&amp;quot;),&lt;br /&gt;
              toc.button(&amp;quot;reset&amp;quot;),&lt;br /&gt;
              toc.button(&amp;quot;close&amp;quot;),&lt;br /&gt;
            ],&lt;br /&gt;
          });&lt;br /&gt;
          toc.wrapper.draggable({&lt;br /&gt;
            scroll: false,&lt;br /&gt;
            containment: &amp;quot;window&amp;quot;,&lt;br /&gt;
          });&lt;br /&gt;
        },&lt;br /&gt;
&lt;br /&gt;
        init: function () {&lt;br /&gt;
          var selector = root.find(&amp;quot;ol&amp;quot;)[0] ? &amp;quot;ol&amp;quot; : &amp;quot;ul&amp;quot;;&lt;br /&gt;
          toc.clone.append(root.find(selector + &amp;quot;:first&amp;quot;)[0].outerHTML);&lt;br /&gt;
          toc.clone.dialog(&lt;br /&gt;
            $.extend(&lt;br /&gt;
              {&lt;br /&gt;
                dialogClass: &amp;quot;toc-dialog&amp;quot;,&lt;br /&gt;
                show: { effect: &amp;quot;slideDown&amp;quot;, duration: speed },&lt;br /&gt;
                hide: { effect: &amp;quot;slideUp&amp;quot;, duration: speed },&lt;br /&gt;
                create: toc.onCreate,&lt;br /&gt;
                open: toc.onOpen,&lt;br /&gt;
                close: toc.onClose,&lt;br /&gt;
                resizeStart: function () {&lt;br /&gt;
                  toc.resizing = true;&lt;br /&gt;
                },&lt;br /&gt;
                resizeStop: function () {&lt;br /&gt;
                  toc.resizing = false;&lt;br /&gt;
                  toc.fixPos();&lt;br /&gt;
                },&lt;br /&gt;
              },&lt;br /&gt;
              toc.state()&lt;br /&gt;
            )&lt;br /&gt;
          );&lt;br /&gt;
&lt;br /&gt;
          win.on(&amp;quot;resize&amp;quot;, function () {&lt;br /&gt;
            if (!toc.resizing &amp;amp;&amp;amp; toc.clone.dialog(&amp;quot;isOpen&amp;quot;)) toc.reset();&lt;br /&gt;
          });&lt;br /&gt;
&lt;br /&gt;
          // overrides click&lt;br /&gt;
          $(this).on(&amp;quot;click&amp;quot;, function () {&lt;br /&gt;
            if (toc.clone.dialog(&amp;quot;isOpen&amp;quot;)) toc.close();&lt;br /&gt;
            else toc.open();&lt;br /&gt;
          });&lt;br /&gt;
        },&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
      // adds ToC links to h2, h3&lt;br /&gt;
      $(&amp;quot;#mw-content-text&amp;quot;)&lt;br /&gt;
        .find(&amp;quot;h2,h3&amp;quot;)&lt;br /&gt;
        .find(&amp;quot;.mw-headline&amp;quot;)&lt;br /&gt;
        .after(&lt;br /&gt;
          $(&amp;quot;&amp;lt;a&amp;gt;&amp;quot;, {&lt;br /&gt;
            class: &amp;quot;toc-link&amp;quot;,&lt;br /&gt;
            href: &amp;quot;&amp;quot;,&lt;br /&gt;
            title: i18n(&amp;quot;toc&amp;quot;).plain(),&lt;br /&gt;
            click: function () {&lt;br /&gt;
              win.scrollTop(rootToc.top - navHeight);&lt;br /&gt;
              return false;&lt;br /&gt;
            },&lt;br /&gt;
          })&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
      var tocButton = $(&amp;quot;&amp;lt;button&amp;gt;&amp;quot;, {&lt;br /&gt;
        id: &amp;quot;toc-open&amp;quot;,&lt;br /&gt;
        title: i18n(&amp;quot;open&amp;quot;).plain(),&lt;br /&gt;
        appendTo: root.find(&amp;quot;div:first&amp;quot;),&lt;br /&gt;
      }).one(&amp;quot;click&amp;quot;, toc.init);&lt;br /&gt;
&lt;br /&gt;
      if (options.auto) tocButton.trigger(&amp;quot;click&amp;quot;);&lt;br /&gt;
      if (options.enableKey) {&lt;br /&gt;
        $(document).on(&amp;quot;keyup&amp;quot;, function (e) {&lt;br /&gt;
          var elem = document.activeElement;&lt;br /&gt;
          if (&lt;br /&gt;
            $(&amp;quot;body&amp;quot;).hasClass(&amp;quot;ve&amp;quot;) ||&lt;br /&gt;
            $(&amp;quot;html&amp;quot;).hasClass(&amp;quot;ve-active&amp;quot;) ||&lt;br /&gt;
            elem.tagName === &amp;quot;INPUT&amp;quot; ||&lt;br /&gt;
            elem.tagName === &amp;quot;TEXTAREA&amp;quot; ||&lt;br /&gt;
            elem.hasAttribute(&amp;quot;contenteditable&amp;quot;)&lt;br /&gt;
          )&lt;br /&gt;
            return;&lt;br /&gt;
&lt;br /&gt;
          if (e.key === &amp;quot;t&amp;quot;) tocButton.trigger(&amp;quot;click&amp;quot;);&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
})(mw, $, window);&lt;/div&gt;</summary>
		<author><name>Exmoose</name></author>
	</entry>
</feed>