RT 4.2.11, ticket#13852
[freeside.git] / rt / share / static / js / jquery.supposition.js
diff --git a/rt/share/static/js/jquery.supposition.js b/rt/share/static/js/jquery.supposition.js
new file mode 100644 (file)
index 0000000..0ce5730
--- /dev/null
@@ -0,0 +1,83 @@
+/* This file was modified to look for superfish in $.fn.superfish instead of $.superfish */
+
+/*
+ * Supposition v0.2 - an optional enhancer for Superfish jQuery menu widget
+ *
+ * Copyright (c) 2008 Joel Birch - based mostly on work by Jesse Klaasse and credit goes largely to him.
+ * Special thanks to Karl Swedberg for valuable input.
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ *     http://www.opensource.org/licenses/mit-license.php
+ *     http://www.gnu.org/licenses/gpl.html
+ */
+
+(function($){
+
+       $.fn.supposition = function(){
+               var $w = $(window), /*do this once instead of every onBeforeShow call*/
+                       _offset = function(dir) {
+                               return window[dir == 'y' ? 'pageYOffset' : 'pageXOffset']
+                               || document.documentElement && document.documentElement[dir=='y' ? 'scrollTop' : 'scrollLeft']
+                           || document.body[dir=='y' ? 'scrollTop' : 'scrollLeft'];
+                       },
+                       onInit = function(){
+                               /* I haven't touched this bit - needs work as there are still z-index issues */
+                               $topNav = $('li',this);
+                               var cZ=parseInt($topNav.css('z-index')) + $topNav.length;
+                               $topNav.each(function() {
+                                       $(this).css({zIndex:--cZ});
+                               });
+                       },
+                       onHide = function(){
+                               this.css({marginTop:'',marginLeft:''});
+                       },
+                       onBeforeShow = function(){
+                               this.each(function(){
+                                       var $u = $(this);
+                                       $u.css('display','block');
+                                       var menuWidth = $u.width(),
+                                               parentWidth = $u.parents('ul').width(),
+                                               totalRight = $w.width() + _offset('x'),
+                                               menuRight = $u.offset().left + menuWidth;
+                                       if (menuRight > totalRight) {
+                                               $u.css('margin-left', ($u.parents('ul').length == 1 ? totalRight - menuRight : -(menuWidth + parentWidth)) + 'px');
+                                       }
+
+                                       var windowHeight = $w.height(),
+                                               offsetTop = $u.offset().top,
+                                               menuHeight = $u.height(),
+                                               baseline = windowHeight + _offset('y');
+                                       var expandUp = (offsetTop + menuHeight > baseline);
+                                       if (expandUp) {
+                                               $u.css('margin-top',baseline - (menuHeight + offsetTop));
+                                       }
+                                       $u.css('display','none');
+                               });
+                       };
+               
+               return this.each(function() {
+                       var o = $.fn.superfish.o[this.serial]; /* get this menu's options */
+                       
+                       /* if callbacks already set, store them */
+                       var _onInit = o.onInit,
+                               _onBeforeShow = o.onBeforeShow,
+                               _onHide = o.onHide;
+                               
+                       $.extend($.fn.superfish.o[this.serial],{
+                               onInit          : function() {
+                                       onInit.call(this); /* fire our Supposition callback */
+                                       _onInit.call(this); /* fire stored callbacks */
+                               },
+                               onBeforeShow: function() {
+                                       onBeforeShow.call(this); /* fire our Supposition callback */
+                                       _onBeforeShow.call(this); /* fire stored callbacks */
+                               },
+                               onHide          : function() {
+                                       onHide.call(this); /* fire our Supposition callback */
+                                       _onHide.call(this); /* fire stored callbacks */
+                               }
+                       });
+               });
+       };
+
+})(jQuery);