| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- /*
- * Supposition v0.2 - an optional enhancer for Superfish jQuery menu widget - LAST UPDATE: MARCH 23rd, 2011
- *
- * 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.
- *
- * Dec 28th, 2010 - Modified for the Superfish project for Drupal (http://drupal.org/project/superfish)
- *
- * jQuery version: 1.3.x or higher.
- *
- * 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'];
- },
- onHide = function(){
- this.css({Top:'',Right:'',Bottom:'',Left:''});
- },
- onBeforeShow = function(){
- this.each(function(){
- var $u = $(this);
- $u.css('display','block');
- var menuWidth = $u.width(),
- menuParentWidth = $u.closest('li').outerWidth(true),
- menuParentLeft = $u.closest('li').offset().left,
- totalRight = $w.width() + _offset('x'),
- menuRight = $u.offset().left + menuWidth,
- exactMenuWidth = (menuRight > (menuParentWidth + menuParentLeft)) ? menuWidth - (menuRight - (menuParentWidth + menuParentLeft)) : menuWidth;
- if ($u.parents('.sf-js-enabled').hasClass('rtl')) {
- if (menuParentLeft < exactMenuWidth) {
- $u.css('left', menuParentWidth + 'px');
- $u.css('right', 'auto');
- }
- }
- else {
- if (menuRight > totalRight && menuParentLeft > menuWidth) {
- $u.css('right', menuParentWidth + 'px');
- $u.css('left', 'auto');
- }
- }
- var windowHeight = $w.height(),
- offsetTop = $u.offset().top,
- menuParentHeight = $u.parent().outerHeight(true),
- menuHeight = $u.height(),
- baseline = windowHeight + _offset('y');
- var expandUp = ((offsetTop + menuHeight > baseline) && (offsetTop > menuHeight));
- if (expandUp) {
- $u.css('bottom', menuParentHeight + 'px');
- $u.css('top', 'auto');
- }
- $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 _onBeforeShow = o.onBeforeShow,
- _onHide = o.onHide;
- $.extend($.fn.superfish.o[this.serial],{
- 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);
|