Difference between revisions of "MediaWiki:Common.js"

Jump to: navigation, search

Difference between revisions of "MediaWiki:Common.js"

Line 1: Line 1:
; (function ($, window, document, undefined) {
+
;(function(){
    // Add our plugin to fn
+
  /* ========================================================================
    $.fn.extend({
+
  * Bootstrap: scrollspy.js v3.0.2
        // Scrollspy is the name of the plugin
+
  * http://getbootstrap.com/javascript/#scrollspy
        scrollspyv2: function (options) {
+
  * ========================================================================
            var debug=0;
+
  * Copyright 2013 Twitter, Inc.
            if (debug==1) { console.log("A"); }
+
  *
            // Define our defaults
+
  * Licensed under the Apache License, Version 2.0 (the "License");
            var defaults = {
+
  * you may not use this file except in compliance with the License.
                namespace: 'scrollspy',
+
  * You may obtain a copy of the License at
                activeClass: 'active',
+
  *
                animate: false,
+
  * http://www.apache.org/licenses/LICENSE-2.0
                offset: 0,
+
  *
                container: window
+
  * Unless required by applicable law or agreed to in writing, software
            };
+
  * distributed under the License is distributed on an "AS IS" BASIS,
            if (debug==1) { console.log("B"); }
+
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
            // Add any overriden options to a new object
+
  * See the License for the specific language governing permissions and
            options = $.extend({}, defaults, options);
+
  * limitations under the License.
            if (debug==1) { console.log("C"); }
+
  * ======================================================================== */
            // Adds two numbers together
+
 
            var add = function (ex1, ex2) {
+
 
                if (debug==1) { console.log("AD"); }
+
  +function ($) { "use strict";
                return parseInt(ex1, 10) + parseInt(ex2, 10);
+
 
            }
+
    // SCROLLSPY CLASS DEFINITION
            if (debug==1) { console.log("E"); }
+
    // ==========================
            // Find our elements
+
 
            var findElements = function (links) {
+
    function ScrollSpy(element, options) {
                if (debug==1) { console.log("F"); }
+
      var href
                // Declare our array
+
      var process  = $.proxy(this.process, this)
                var elements = [];
+
 
                // Loop through the links
+
      this.$element      = $(element).is('body') ? $(window) : $(element)
                for (var i = 0; i < links.length; i++) {
+
      this.$body          = $('body')
                    if (debug==1) { console.log("G"); }
+
      this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
                    // Get our current link
+
      this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
                    var link = links[i];
+
      this.selector      = (this.options.target
                    if (debug==1) { console.log("H"); }
+
        || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
                    // Get our hash
+
        || '') + ' .nav li > a'
                    var hash = $(link).attr("href");
+
      this.offsets        = $([])
                    if (debug==1) { console.log("I: " + hash); }
+
      this.targets        = $([])
                    // Store our has as an element
+
      this.activeTarget  = null
                    var element = $(document.getElementById(hash.replace("#","")));
+
 
                    if (debug==1) { console.log("J: " + element); }
+
      this.refresh()
                    // If we have an element matching the hash
+
      this.process()
                    if (element.length > 0) {
+
    }
                        if (debug==1) { console.log("K"); }
+
 
                        // Get our offset
+
    ScrollSpy.DEFAULTS = {
                        var top = Math.floor(element.offset().top),
+
      offset: 10
                            bottom = top + Math.floor(element.outerHeight());
+
    }
                        if (debug==1) { console.log("L"); }
+
 
                        // Add to our array
+
    ScrollSpy.prototype.refresh = function () {
                        elements.push({ element: element, hash: hash, top: top, bottom: bottom });
+
      var offsetMethod = this.$element[0] == window ? 'offset' : 'position'
                        if (debug==1) { console.log("M"); }
+
 
                    }                  
+
      this.offsets = $([])
                }
+
      this.targets = $([])
 
+
 
                // Return our elements
+
      var self    = this
                return elements;
+
      var $targets = this.$body
            };
+
        .find(this.selector)
 
+
        .map(function () {
            // Find our link from a hash
+
          var $el  = $(this)
            var findLink = function (links, hash) {
+
          var href  = $el.data('target') || $el.attr('href')
                // For each link
+
          var $href = /^#\w/.test(href) && $(href)
                for (var i = 0; i < links.length; i++) {
+
 
                    // Get our current link
+
          return ($href
                    var link = $(links[i]);
+
            && $href.length
                    // If our hash matches the link href
+
            && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
                    if (link.attr("href") === hash) {
+
        })
                        // Return the link
+
        .sort(function (a, b) { return a[0] - b[0] })
                        return link;
+
        .each(function () {
                    }
+
          self.offsets.push(this[0])
                }
+
          self.targets.push(this[1])
            };
+
        })
 
+
    }
            // Reset classes on our elements
+
 
            var resetClasses = function (links) {
+
    ScrollSpy.prototype.process = function () {
                // For each link
+
      var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
                for (var i = 0; i < links.length; i++) {
+
      var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
                    // Get our current link
+
      var maxScroll    = scrollHeight - this.$scrollElement.height()
                    var link = $(links[i]);
+
      var offsets      = this.offsets
                    // Remove the active class
+
      var targets      = this.targets
                    link.parent().removeClass(options.activeClass);
+
      var activeTarget = this.activeTarget
                    $('.toclevel-2').parent().hide();
+
      var i
                }
+
 
            };
+
      if (scrollTop >= maxScroll) {
 
+
        return activeTarget != (i = targets.last()[0]) && this.activate(i)
            // For each scrollspy instance
+
      }
            return this.each(function () {
+
 
                // Declare our global variables
+
      for (i = offsets.length; i--;) {
                var element = this,
+
        activeTarget != targets[i]
                    container = $(options.container);
+
          && scrollTop >= offsets[i]
                // Get our objects
+
          && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
                var links = $(element).find('.toc a');
+
          && this.activate( targets[i] )
                // Loop through our links
+
      }
                for (var i = 0; i < links.length; i++) {
+
    }
                    // Get our current link
+
 
                    var link = links[i];
+
    ScrollSpy.prototype.activate = function (target) {
                    // Bind the click event
+
      this.activeTarget = target
                    $(link).on("click", function (e) {
+
 
                        // Get our target
+
      $(this.selector)
                        var target = $(this).attr("href"),
+
        .parents('.active')
                            $target = $(target);
+
        .removeClass('active')
 
+
 
                        // If we have the element
+
      var selector = this.selector
                        if ($target.length > 0) {
+
        + '[data-target="' + target + '"],'
                            // Get it's scroll position
+
        + this.selector + '[href="' + target + '"]'
                            var top = add($target.offset().top, options.offset);
+
 
                            // If animation is on
+
      var active = $(selector)
                            if (options.animate) {
+
        .parents('li')
                                // Animate our scroll
+
        .addClass('active')
                                $('html, body').animate({ scrollTop: top }, 1000);
+
 
                            } else {
+
      if (active.parent('.dropdown-menu').length) {
                                // Scroll to our position
+
        active = active
                                window.scrollTo(0, top);
+
          .closest('li.dropdown')
                            }
+
          .addClass('active')
                            // Prevent our link
+
      }
                            e.preventDefault();
+
 
                        }
+
      active.trigger('activate.bs.scrollspy')
                    });
+
    }
                }
+
 
 
+
 
                // Get our elements
+
    // SCROLLSPY PLUGIN DEFINITION
                var elements = findElements(links);
+
    // ===========================
               
+
 
                // Add a listener to the window
+
    var old = $.fn.scrollspy
                container.bind('scroll.' + options.namespace, function () {
+
 
                   
+
    $.fn.scrollspy = function (option) {
                    // Get the position and store in an object
+
      return this.each(function () {
                    var position = {
+
        var $this  = $(this)
                        top: add($(this).scrollTop(), Math.abs(options.offset)),
+
        var data    = $this.data('bs.scrollspy')
                        left: $(this).scrollLeft()
+
        var options = typeof option == 'object' && option
                    };
+
 
                   
+
        if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
                    // Create a variable for our link
+
        if (typeof option == 'string') data[option]()
                    var link;
+
      })
 
+
    }
                    // Loop through our elements
+
 
                    for (var i = 0; i < elements.length; i++) {
+
    $.fn.scrollspy.Constructor = ScrollSpy
 
+
 
                        // Get our current item
+
 
                        var current = elements[i];
+
    // SCROLLSPY NO CONFLICT
 
+
    // =====================
                        // If we are within the boundries of our element
+
 
                        if (position.top >= current.top && position.top < current.bottom) {
+
    $.fn.scrollspy.noConflict = function () {
                           
+
      $.fn.scrollspy = old
                            if (debug==1) { console.log("Top P: " + position.top + '\n' +
+
      return this
                            "Left P: " + position.left + '\n' +
+
    }
                            "Top C: " + current.top + '\n' +
+
 
                            "Left C: " + current.bottom); }
+
 
                            // get our element
+
    // SCROLLSPY DATA-API
                            var hash = current.hash;
+
    // ==================
 
+
 
                            // Get the link
+
    $(window).on('load', function () {
                            link = findLink(links, hash);
+
      $('[data-spy="scroll"]').each(function () {
                           
+
        var $spy = $(this)
                            // If we have a link
+
        $spy.scrollspy($spy.data())
                            if (link) {
+
      })
 
+
    })
                                // If we have an onChange function
+
 
                                if (options.onChange) {
+
  }(jQuery);
 
+
 
                                    // Fire our onChange function
+
})();
                                    options.onChange(current.element, $(element), position);
 
                                }
 
 
 
                                // Reset the classes on all other link
 
                                resetClasses(links);
 
 
 
                                // Add our active link to our parent
 
                                link.parent().addClass(options.activeClass);
 
                                link.parent().parent().show();
 
                                link.siblings("ul").show();
 
                                //link.parent().parent().siblings("ul").show();
 
                                // break our loop
 
                                break;
 
                            }
 
                        }
 
                    }
 
 
 
                    // If we don't have a link and we have a exit function
 
                    if (!link && options.onExit) {
 
                       
 
                        // Fire our onChange function
 
                        options.onExit($(element), position);
 
                    }
 
                });
 
 
 
            });
 
        }
 
    });
 
})(jQuery, window, document, undefined);
 
  
  

Revision as of 07:07, 7 February 2019

;(function(){
  /* ========================================================================
   * Bootstrap: scrollspy.js v3.0.2
   * http://getbootstrap.com/javascript/#scrollspy
   * ========================================================================
   * Copyright 2013 Twitter, Inc.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   * http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   * ======================================================================== */
  
  
  +function ($) { "use strict";
  
    // SCROLLSPY CLASS DEFINITION
    // ==========================
  
    function ScrollSpy(element, options) {
      var href
      var process  = $.proxy(this.process, this)
  
      this.$element       = $(element).is('body') ? $(window) : $(element)
      this.$body          = $('body')
      this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
      this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
      this.selector       = (this.options.target
        || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
        || '') + ' .nav li > a'
      this.offsets        = $([])
      this.targets        = $([])
      this.activeTarget   = null
  
      this.refresh()
      this.process()
    }
  
    ScrollSpy.DEFAULTS = {
      offset: 10
    }
  
    ScrollSpy.prototype.refresh = function () {
      var offsetMethod = this.$element[0] == window ? 'offset' : 'position'
  
      this.offsets = $([])
      this.targets = $([])
  
      var self     = this
      var $targets = this.$body
        .find(this.selector)
        .map(function () {
          var $el   = $(this)
          var href  = $el.data('target') || $el.attr('href')
          var $href = /^#\w/.test(href) && $(href)
  
          return ($href
            && $href.length
            && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
        })
        .sort(function (a, b) { return a[0] - b[0] })
        .each(function () {
          self.offsets.push(this[0])
          self.targets.push(this[1])
        })
    }
  
    ScrollSpy.prototype.process = function () {
      var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
      var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
      var maxScroll    = scrollHeight - this.$scrollElement.height()
      var offsets      = this.offsets
      var targets      = this.targets
      var activeTarget = this.activeTarget
      var i
  
      if (scrollTop >= maxScroll) {
        return activeTarget != (i = targets.last()[0]) && this.activate(i)
      }
  
      for (i = offsets.length; i--;) {
        activeTarget != targets[i]
          && scrollTop >= offsets[i]
          && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
          && this.activate( targets[i] )
      }
    }
  
    ScrollSpy.prototype.activate = function (target) {
      this.activeTarget = target
  
      $(this.selector)
        .parents('.active')
        .removeClass('active')
  
      var selector = this.selector
        + '[data-target="' + target + '"],'
        + this.selector + '[href="' + target + '"]'
  
      var active = $(selector)
        .parents('li')
        .addClass('active')
  
      if (active.parent('.dropdown-menu').length)  {
        active = active
          .closest('li.dropdown')
          .addClass('active')
      }
  
      active.trigger('activate.bs.scrollspy')
    }
  
  
    // SCROLLSPY PLUGIN DEFINITION
    // ===========================
  
    var old = $.fn.scrollspy
  
    $.fn.scrollspy = function (option) {
      return this.each(function () {
        var $this   = $(this)
        var data    = $this.data('bs.scrollspy')
        var options = typeof option == 'object' && option
  
        if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
        if (typeof option == 'string') data[option]()
      })
    }
  
    $.fn.scrollspy.Constructor = ScrollSpy
  
  
    // SCROLLSPY NO CONFLICT
    // =====================
  
    $.fn.scrollspy.noConflict = function () {
      $.fn.scrollspy = old
      return this
    }
  
  
    // SCROLLSPY DATA-API
    // ==================
  
    $(window).on('load', function () {
      $('[data-spy="scroll"]').each(function () {
        var $spy = $(this)
        $spy.scrollspy($spy.data())
      })
    })
  
  }(jQuery);
  
})();



$( document ).ready()

{
    //Activate windows scroller to highlight links
    $('body').scrollspyv2();
    //Hide TOC from mobile
    $('.toc').addClass('hidden-xs');
    $('.toc').addClass('hidden-sm');
    //On scroll
    $(window).scroll(function(){
      scrollingToc();
    });
    scrollingToc();
}

function scrollingToc()
{
    if($(window).scrollTop()>150)
    {
       $('.toc').removeClass('affix-top toc-top');
       $('.toc').addClass('affix toc-scrolling');
    } else {
       $('.toc').removeClass('affix toc-scrolling');
       $('.toc').addClass('affix-top toc-top');
    }
}

//--------------------Variables for the auto highlighter---------------//
var monthNames = ["January", "February", "March", "April", "May", "June",
  "July", "August", "September", "October", "November", "December"
];

var x = new Date();
x.setMonth(x.getMonth() + 12);

var y = ' || ' + x.getFullYear() + '-' + monthNames[x.getMonth()] + '-' + x.getDate() + ' }}';

//--------------------Visible and Invisible options for the defined text (red,green,blue)---------------//
jQuery.fn.visible = function() {
    return this.css('visibility', 'visible');
};

jQuery.fn.invisible = function() {
    return this.css('visibility', 'hidden');
};

jQuery.fn.visibilityToggle = function() {
    return this.css('visibility', function(i, visibility) {
        return (visibility == 'visible') ? 'hidden' : 'visible';
    });
};

//--------------------Editing Toolbar Buttons---------------//
$.ajax({
  url: 'https://meta.wikimedia.org/w/index.php?title=User:Krinkle/Scripts/InsertWikiEditorButton.js&action=raw&ctype=text/javascript',
  dataType: 'script',
  cache: true
}).done(function () {

  krInsertWikiEditorButton({
    id: "mw-customeditbutton-policiesDiv",
    icon: "//rpm.rcabc.org/resources/assets/policiesDiv.png",
    label: 'Guiding Principles Div',
    insertBefore: '<div class="principles">',
    insertAfter: '</div>',
    sampleText: 'Guiding Principles Div'
  });

        krInsertWikiEditorButton({
    id: "mw-customeditbutton-policiesSpan",
    icon: "//rpm.rcabc.org/resources/assets/policiesSpan.png",
    label: 'Guiding Principles Span',
    insertBefore: '<span class="principles">',
    insertAfter: '</span>',
    sampleText: 'Guiding Principles Span'
  });

         krInsertWikiEditorButton({
    id: "mw-customeditbutton-policiesP",
    icon: "//rpm.rcabc.org/resources/assets/policiesP.png",
    label: 'Guiding Principles Paragraph',
    insertBefore: '<p class="principles">',
    insertAfter: '</p>',
    sampleText: 'Guiding Principles Paragraph'
  });

  krInsertWikiEditorButton({
    id: 'mw-customeditbutton-recommendedDiv',
    icon: '//rpm.rcabc.org/resources/assets/recommendationsDiv.png',
    label: 'Recommended',
    insertBefore: '<div class="recommended">',
    insertAfter: '</div>',
    sampleText: 'Recommended'
  });

       krInsertWikiEditorButton({
    id: 'mw-customeditbutton-recommendedSpan',
    icon: '//rpm.rcabc.org/resources/assets/recommendationsSpan.png',
    label: 'Recommended Span',
    insertBefore: '<span class="recommended">',
    insertAfter: '</span>',
    sampleText: 'Recommended Span'
  });

  krInsertWikiEditorButton({
    id: 'mw-customeditbutton-recommendedP',
    icon: '//rpm.rcabc.org/resources/assets/recommendationsP.png',
    label: 'Recommended Paragraph',
    insertBefore: '<p class="recommended">',
    insertAfter: '</p>',
    sampleText: 'Recommended Paragraph'
  });

  

        krInsertWikiEditorButton({
    id: 'mw-customeditbutton-referenceDiv',
    icon: '//rpm.rcabc.org/resources/assets/referenceDiv.png',
    label: 'Reference Div',
    insertBefore: '<div class="reference">',
    insertAfter: '</div>',
    sampleText: 'Reference Div'
  });

        krInsertWikiEditorButton({
    id: 'mw-customeditbutton-referenceSpan',
    icon: '//rpm.rcabc.org/resources/assets/referenceSpan.png',
    label: 'Reference Span',
    insertBefore: '<span class="reference">',
    insertAfter: '</span>',
    sampleText: 'Reference Span'
  });

        krInsertWikiEditorButton({
    id: 'mw-customeditbutton-referenceP',
    icon: '//rpm.rcabc.org/resources/assets/referenceP.png',
    label: 'Reference Paragraph',
    insertBefore: '<p class="reference">',
    insertAfter: '</p>',
    sampleText: 'Reference Paragraph'
  });
        
        krInsertWikiEditorButton({
    id: 'mw-customeditbutton-tabgroup',
    icon: '//rpm.rcabc.org/resources/assets/tabstart.png',
    label: 'Create Tab Group',
    insertBefore: '<tabs>',
    insertAfter: '</tabs>'
  });
        krInsertWikiEditorButton({
    id: 'mw-customeditbutton-tab',
    icon: '//rpm.rcabc.org/resources/assets/tab.png',
    label: 'Create Tab',
    insertBefore: '<tab name="CHANGE ME">',
    insertAfter: '</tab>'
  });
        krInsertWikiEditorButton({
    id: "mw-customeditbutton-hilite",
    icon: "//upload.wikimedia.org/wikipedia/commons/3/3f/Button_attendre.png",
    label: 'Highlight with Date',
    insertBefore: '{{hilite | ',
    insertAfter: y,
    sampleText: 'Highlight this'
  });
        krInsertWikiEditorButton({
    id: "mw-customeditbutton-hilite",
    icon: "//upload.wikimedia.org/wikipedia/commons/0/08/VisualEditor_-_Icon_-_Strikethrough-a.svg",
    label: 'Strike with Date',
    insertBefore: '{{strike| ',
    insertAfter: y,
    sampleText: 'Strike this'
  });
        krInsertWikiEditorButton({
    id: "mw-customeditbutton-tooltip",
    icon: "//upload.wikimedia.org/wikipedia/commons/2/27/Antu_help_hover.svg",
    label: 'Tooltip popout window',
    insertBefore: '<span class="tooltiptext">',
    insertAfter: '</span>',
    sampleText: 'Tooltip Popout'
  });
});