Merge branch 'master' of git.uio.no:usit-rt
[usit-rt.git] / share / html / NoAuth / js / jquery.supposition.js
1 /* This file was modified to look for superfish in $.fn.superfish instead of $.superfish */
2
3 /*
4  * Supposition v0.2 - an optional enhancer for Superfish jQuery menu widget
5  *
6  * Copyright (c) 2008 Joel Birch - based mostly on work by Jesse Klaasse and credit goes largely to him.
7  * Special thanks to Karl Swedberg for valuable input.
8  *
9  * Dual licensed under the MIT and GPL licenses:
10  *      http://www.opensource.org/licenses/mit-license.php
11  *      http://www.gnu.org/licenses/gpl.html
12  */
13
14 (function($){
15
16         $.fn.supposition = function(){
17                 var $w = $(window), /*do this once instead of every onBeforeShow call*/
18                         _offset = function(dir) {
19                                 return window[dir == 'y' ? 'pageYOffset' : 'pageXOffset']
20                                 || document.documentElement && document.documentElement[dir=='y' ? 'scrollTop' : 'scrollLeft']
21                             || document.body[dir=='y' ? 'scrollTop' : 'scrollLeft'];
22                         },
23                         onInit = function(){
24                                 /* I haven't touched this bit - needs work as there are still z-index issues */
25                                 $topNav = $('li',this);
26                                 var cZ=parseInt($topNav.css('z-index')) + $topNav.length;
27                                 $topNav.each(function() {
28                                         $(this).css({zIndex:--cZ});
29                                 });
30                         },
31                         onHide = function(){
32                                 this.css({marginTop:'',marginLeft:''});
33                         },
34                         onBeforeShow = function(){
35                                 this.each(function(){
36                                         var $u = $(this);
37                                         $u.css('display','block');
38                                         var menuWidth = $u.width(),
39                                                 parentWidth = $u.parents('ul').width(),
40                                                 totalRight = $w.width() + _offset('x'),
41                                                 menuRight = $u.offset().left + menuWidth;
42                                         if (menuRight > totalRight) {
43                                                 $u.css('margin-left', ($u.parents('ul').length == 1 ? totalRight - menuRight : -(menuWidth + parentWidth)) + 'px');
44                                         }
45
46                                         var windowHeight = $w.height(),
47                                                 offsetTop = $u.offset().top,
48                                                 menuHeight = $u.height(),
49                                                 baseline = windowHeight + _offset('y');
50                                         var expandUp = (offsetTop + menuHeight > baseline);
51                                         if (expandUp) {
52                                                 $u.css('margin-top',baseline - (menuHeight + offsetTop));
53                                         }
54                                         $u.css('display','none');
55                                 });
56                         };
57                 
58                 return this.each(function() {
59                         var o = $.fn.superfish.o[this.serial]; /* get this menu's options */
60                         
61                         /* if callbacks already set, store them */
62                         var _onInit = o.onInit,
63                                 _onBeforeShow = o.onBeforeShow,
64                                 _onHide = o.onHide;
65                                 
66                         $.extend($.fn.superfish.o[this.serial],{
67                                 onInit          : function() {
68                                         onInit.call(this); /* fire our Supposition callback */
69                                         _onInit.call(this); /* fire stored callbacks */
70                                 },
71                                 onBeforeShow: function() {
72                                         onBeforeShow.call(this); /* fire our Supposition callback */
73                                         _onBeforeShow.call(this); /* fire stored callbacks */
74                                 },
75                                 onHide          : function() {
76                                         onHide.call(this); /* fire our Supposition callback */
77                                         _onHide.call(this); /* fire stored callbacks */
78                                 }
79                         });
80                 });
81         };
82
83 })(jQuery);