]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blobdiff - resources/lib/jquery/jquery.appear.js
MediaWiki 1.30.2
[autoinstallsdev/mediawiki.git] / resources / lib / jquery / jquery.appear.js
diff --git a/resources/lib/jquery/jquery.appear.js b/resources/lib/jquery/jquery.appear.js
new file mode 100644 (file)
index 0000000..4f77886
--- /dev/null
@@ -0,0 +1,138 @@
+/*
+ * jQuery.appear
+ * http://code.google.com/p/jquery-appear/
+ *
+ * Copyright (c) 2009 Michael Hixson
+ * 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
+                        
+               }, 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;
+                                
+                               if (y + t.height() >= b && 
+                                               y <= b + w.height() &&
+                                               x + t.width() >= a && 
+                                               x <= a + w.width()) {
+                                       //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);
\ No newline at end of file