Template:Peking/Javascript/appear

/*

* jQuery.appear
* https://github.com/bas2k/jquery.appear/
* http://code.google.com/p/jquery-appear/
*
* Copyright (c) 2009 Michael Hixson
* Copyright (c) 2012 Alexander Brovikov
* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
*/

(function($) {

   $.fn.appear = function(fn, options) {
       var settings = $.extend({
           //arbitrary data to pass to fn
           data: undefined,
           //call fn only on the first appear?
           one: true,
           // X & Y accuracy
           accX: 0,
           accY: 0
       }, options);
       return this.each(function() {
           var t = $(this);
           //whether the element is currently visible
           t.appeared = false;
           if (!fn) {
               //trigger the custom event
               t.trigger('appear', settings.data);
               return;
           }
           var w = $(window);
           //fires the appear event when appropriate
           var check = function() {
               //is the element hidden?
               if (!t.is(':visible')) {
                   //it became hidden
                   t.appeared = false;
                   return;
               }
               //is the element inside the visible window?
               var a = w.scrollLeft();
               var b = w.scrollTop();
               var o = t.offset();
               var x = o.left;
               var y = o.top;
               var ax = settings.accX;
               var ay = settings.accY;
               var th = t.height();
               var wh = w.height();
               var tw = t.width();
               var ww = w.width();
               if (y + th + ay >= b &&
                   y <= b + wh + ay &&
                   x + tw + ax >= a &&
                   x <= a + ww + ax) {
                   //trigger the custom event
                   if (!t.appeared) t.trigger('appear', settings.data);
               } else {
                   //it scrolled out of view
                   t.appeared = false;
               }
           };
           //create a modified fn with some additional logic
           var modifiedFn = function() {
               //mark the element as visible
               t.appeared = true;
               //is this supposed to happen only once?
               if (settings.one) {
                   //remove the check
                   w.unbind('scroll', check);
                   var i = $.inArray(check, $.fn.appear.checks);
                   if (i >= 0) $.fn.appear.checks.splice(i, 1);
               }
               //trigger the original fn
               fn.apply(this, arguments);
           };
           //bind the modified fn to the element
           if (settings.one) t.one('appear', settings.data, modifiedFn);
           else t.bind('appear', settings.data, modifiedFn);
           //check whenever the window scrolls
           w.scroll(check);
           //check whenever the dom changes
           $.fn.appear.checks.push(check);
           //check now
           (check)();
       });
   };
   //keep a queue of appearance checks
   $.extend($.fn.appear, {
       checks: [],
       timeout: null,
       //process the queue
       checkAll: function() {
           var length = $.fn.appear.checks.length;
           if (length > 0) while (length--) ($.fn.appear.checks[length])();
       },
       //check the queue asynchronously
       run: function() {
           if ($.fn.appear.timeout) clearTimeout($.fn.appear.timeout);
           $.fn.appear.timeout = setTimeout($.fn.appear.checkAll, 20);
       }
   });
   //run checks when these methods are called
   $.each(['append', 'prepend', 'after', 'before', 'attr',
       'removeAttr', 'addClass', 'removeClass', 'toggleClass',
       'remove', 'css', 'show', 'hide'], function(i, n) {
       var old = $.fn[n];
       if (old) {
           $.fn[n] = function() {
               var r = old.apply(this, arguments);
               $.fn.appear.run();
               return r;
           }
       }
   });

})(jQuery);










(function($) {

   $.fn.countTo = function(options) {
       // merge the default plugin settings with the custom options
       options = $.extend({}, $.fn.countTo.defaults, options || {});
       // how many times to update the value, and how much to increment the value on each update
       var loops = Math.ceil(options.speed / options.refreshInterval),
           increment = (options.to - options.from) / loops;
       return $(this).each(function() {
           var _this = this,
               loopCount = 0,
               value = options.from,
               interval = setInterval(updateTimer, options.refreshInterval);
           function updateTimer() {
               value += increment;
               loopCount++;
               $(_this).html(value.toFixed(options.decimals));
               if (typeof(options.onUpdate) == 'function') {
                   options.onUpdate.call(_this, value);
               }
               if (loopCount >= loops) {
                   clearInterval(interval);
                   value = options.to;
                   if (typeof(options.onComplete) == 'function') {
                       options.onComplete.call(_this, value);
                   }
               }
           }
       });
   };
   $.fn.countTo.defaults = {
       from: 0,  // the number the element should start at
       to: 100,  // the number the element should end at
       speed: 1000,  // how long it should take to count between the target numbers
       refreshInterval: 100,  // how often the element should be updated
       decimals: 0,  // the number of decimal places to show
       onUpdate: null,  // callback method for every time the element is updated,
       onComplete: null,  // callback method for when the element finishes updating
   };

})(jQuery);