Browse Source

! Combine some of the jquery plugs in to a single file
! Move hoverintent custom config options to superfish, leave hoverintent as standard
+ Add styled tooltip to message preview, need to determine a proper plugin to use if we leave this as a default.

Signed-off-by: Spuds <[email protected]>

Spuds 13 years ago
parent
commit
acdc3fed52

+ 1 - 1
Themes/default/MessageIndex.template.php

@@ -255,7 +255,7 @@ function template_main()
 					</td>
 					<td class="subject ', $alternate_class, '">
 						<div ', (!empty($topic['quick_mod']['modify']) ? 'id="topic_' . $topic['first_post']['id'] . '" onmouseout="mouse_on_div = 0;" onmouseover="mouse_on_div = 1;" ondblclick="modify_topic(\'' . $topic['id'] . '\', \'' . $topic['first_post']['id'] . '\');"' : ''), '>
-							', $topic['is_sticky'] ? '<strong>' : '', '<span title="', $topic[(empty($settings['message_index_preview_first']) ? 'last_post' : 'first_post')]['preview'], '"><span id="msg_' . $topic['first_post']['id'] . '">', $topic['first_post']['link'], ($context['can_approve_posts'] && !$topic['approved'] ? '&nbsp;<em>(' . $txt['awaiting_approval'] . ')</em>' : ''), '</span></span>', $topic['is_sticky'] ? '</strong>' : '';
+							', $topic['is_sticky'] ? '<strong>' : '', '<span class="preview" title="', $topic[(empty($settings['message_index_preview_first']) ? 'last_post' : 'first_post')]['preview'], '"><span id="msg_' . $topic['first_post']['id'] . '">', $topic['first_post']['link'], ($context['can_approve_posts'] && !$topic['approved'] ? '&nbsp;<em>(' . $txt['awaiting_approval'] . ')</em>' : ''), '</span></span>', $topic['is_sticky'] ? '</strong>' : '';
 
 			// Is this topic new? (assuming they are logged in!)
 			if ($topic['new'] && $context['user']['is_logged'])

+ 3 - 3
Themes/default/index.template.php

@@ -119,8 +119,7 @@ function template_html_above()
 	// Note that the Superfish function seems to like being called by the full syntax.
 	// It doesn't appear to like being called by short syntax. Please test if contemplating changes.
 	echo '
-	<script type="text/javascript" src="', $settings['theme_url'], '/scripts/hoverIntent.js"></script>
-	<script type="text/javascript" src="', $settings['theme_url'], '/scripts/superfish.js"></script>';
+	<script type="text/javascript" src="', $settings['theme_url'], '/scripts/smf_jquery_plugins.js"></script>';
 	
 	// Here comes the JavaScript bits!
 	echo '
@@ -149,7 +148,8 @@ function template_html_above()
 	echo '
 	<script type="text/javascript"><!-- // --><![CDATA[
 		$(document).ready(function() { 
-			$("ul.dropmenu").superfish(); 
+			$("ul.dropmenu").superfish();
+			$(".preview").SMFtooltip();
 		});
 	// ]]></script>';
 

+ 0 - 100
Themes/default/scripts/hoverIntent.js

@@ -1,100 +0,0 @@
-;(function($){
-	/* hoverIntent by Brian Cherne */
-
- /*
- * PLEASE READ THE FOLLOWING BEFORE PLAYING AROUND WITH ANYTHING. KTHNX.
- * SMF Dev copy - Antechinus - 20th October 2011.
- * Code has been tweaked to give responsive menus without compromising a11y.
- * If contemplating changes, testing for full functionality is essential or a11y will be degraded.
- * Since a11y is the whole point of this system, degradation is not at all desirable regardless of personal preferences.
- * If you do not understand the a11y advantages of this system, please ask before making changes.
- *
- * Full functionality means:
- * 1/ hoverIntent plugin functions so that drop menus do NOT open or close instantly when cursor touches first level anchor.
- * 2/ The drop menus should only open when the cursor actually stops on the first level anchor, or is moving very slowly.
- * 3/ There should be a delay before the drop menus close on mouseout, for people with less than perfect tracking ability.
- * 4/ Settings for custom tooltips will be done separately in another file.
- */
-
-	$.fn.hoverIntent = function(f,g) {
-		// default configuration options
-		var cfg = {
-			sensitivity: 10,
-			interval: 40,
-			timeout: 1
-		};
-		// override configuration options with user supplied object
-		cfg = $.extend(cfg, g ? { over: f, out: g } : f );
-
-		// instantiate variables
-		// cX, cY = current X and Y position of mouse, updated by mousemove event
-		// pX, pY = previous X and Y position of mouse, set by mouseover and polling interval
-		var cX, cY, pX, pY;
-
-		// A private function for getting mouse position
-		var track = function(ev) {
-			cX = ev.pageX;
-			cY = ev.pageY;
-		};
-
-		// A private function for comparing current and previous mouse position
-		var compare = function(ev,ob) {
-			ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
-			// compare mouse positions to see if they've crossed the threshold
-			if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) {
-				$(ob).unbind("mousemove",track);
-				// set hoverIntent state to true (so mouseOut can be called)
-				ob.hoverIntent_s = 1;
-				return cfg.over.apply(ob,[ev]);
-			} else {
-				// set previous coordinates for next time
-				pX = cX; pY = cY;
-				// use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
-				ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval );
-			}
-		};
-
-		// A private function for delaying the mouseOut function
-		var delay = function(ev,ob) {
-			ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
-			ob.hoverIntent_s = 0;
-			return cfg.out.apply(ob,[ev]);
-		};
-
-		// A private function for handling mouse 'hovering'
-		var handleHover = function(e) {
-			// next three lines copied from jQuery.hover, ignore children onMouseOver/onMouseOut
-			var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
-			while ( p && p != this ) { try { p = p.parentNode; } catch(e) { p = this; } }
-			if ( p == this ) { return false; }
-
-			// copy objects to be passed into t (required for event object to be passed in IE)
-			var ev = jQuery.extend({},e);
-			var ob = this;
-
-			// cancel hoverIntent timer if it exists
-			if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); }
-
-			// else e.type == "onmouseover"
-			if (e.type == "mouseover") {
-				// set "previous" X and Y position based on initial entry point
-				pX = ev.pageX; pY = ev.pageY;
-				// update "current" X and Y position based on mousemove
-				$(ob).bind("mousemove",track);
-				// start polling interval (self-calling timeout) to compare mouse coordinates over time
-				if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );}
-
-			// else e.type == "onmouseout"
-			} else {
-				// unbind expensive mousemove event
-				$(ob).unbind("mousemove",track);
-				// if hoverIntent state is true, then call the mouseOut function after the specified delay
-				if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );}
-			}
-		};
-
-		// bind the function to the two event listeners
-		return this.mouseover(handleHover).mouseout(handleHover);
-	};
-	
-})(jQuery);

+ 427 - 0
Themes/default/scripts/smf_jquery_plugins.js

@@ -0,0 +1,427 @@
+/*
+ * SMFtooltip, Basic JQuery function to provide styled tooltips
+ *
+ * - will use the hoverintent plugin if available
+ * - shows the tooltip in a div with the class defined in tooltipClass
+ * - moves all selector titles to a hidden div and removes the title attribute to 
+ *   prevent any default browser actions
+ * - attempts to keep the tooltip on screen
+ *
+ * Simple Machines Forum (SMF)
+ *
+ * @package SMF
+ * @author Simple Machines http://www.simplemachines.org
+ * @copyright 2011 Simple Machines
+ * @license http://www.simplemachines.org/about/smf/license.php BSD
+ *
+ * @version 2.1 Alpha 1
+ *
+ */
+ 
+(function($) {
+	$.fn.SMFtooltip = function(oInstanceSettings) {
+		$.fn.SMFtooltip.oDefaultsSettings = {
+			followMouse: 1,
+			hoverIntent: {sensitivity: 10, interval: 300, timeout: 50},
+			positionTop: 12,
+			positionLeft: 12,
+			tooltipID: 'smf_tooltip',
+			tooltipClass: 'tooltip',
+			tooltipTextID: 'smf_tooltipText'
+		};
+		
+		// account for any user options
+		var oSettings = $.extend({}, $.fn.SMFtooltip.oDefaultsSettings , oInstanceSettings || {});
+
+		// move passed selector titles to a hidden span, then remove the selector title to prevent any default browser actions
+		$(this).each(function()
+		{
+			var sTitle = $('<span class="' + oSettings.tooltipClass + '">' + this.title + '</span>').hide();
+			$(this).append(sTitle).attr('title', '');
+		});
+		
+		// determine where we are going to place the tooltip, while trying to keep it on screen
+		var positionTooltip = function(event)
+		{
+			var iPosx = 0;
+			var iPosy = 0;
+			
+			if (!event)
+				var event = window.event;
+				
+			if (event.pageX || event.pageY)
+			{
+				iPosx = event.pageX;
+				iPosy = event.pageY;
+			}
+			else if (event.clientX || event.clientY)
+			{
+				iPosx = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
+				iPosy = event.clientY + document.body.scrollTop + document.documentElement.scrollTop;
+			}
+			
+			var oPosition = {
+				x: iPosx + oSettings.positionLeft,
+				y: iPosy + oSettings.positionTop,
+				w: $('#' + oSettings.tooltipID).width(),
+				h: $('#' + oSettings.tooltipID).height()
+			}
+			
+			var oLimits = {
+				x: $(window).scrollLeft(),
+				y: $(window).scrollTop(),
+				w: $(window).width() - 20,
+				h: $(window).height() - 20
+			};
+				
+			// don't go off screen
+			if ((oPosition.y + oPosition.h > oLimits.y + oLimits.h) && (oPosition.x + oPosition.w > oLimits.x + oLimits.w))
+			{
+				oPosition.x = (oPosition.x - oPosition.w) - 45;
+				oPosition.y = (oPosition.y - oPosition.h) - 45;
+			}
+			else if ((oPosition.x + oPosition.w) > (oLimits.x + oLimits.w))
+			{
+				oPosition.x = oPosition.x - (((oPosition.x + oPosition.w) - (oLimits.x + oLimits.w)) + 20);
+			}
+			else if (oPosition.y + oPosition.h > oLimits.y + oLimits.h)
+			{
+				oPosition.y = oPosition.y - (((oPosition.y + oPosition.h) - (oLimits.y + oLimits.h)) + 20);
+			}
+			
+			// finally set the position we determined
+			$('#' + oSettings.tooltipID).css({'left': oPosition.x + 'px', 'top': oPosition.y + 'px'});
+		}
+		
+		// used to show a tooltip
+		var showTooltip = function(){
+			$('#' + oSettings.tooltipID + ' #' + oSettings.tooltipTextID).show();
+		}
+		
+		// used to hide a tooltip
+		var hideTooltip = function(valueOfThis){
+			$('#' + oSettings.tooltipID).fadeOut('fast').trigger("unload").remove();
+		}
+		
+		// for all of the elements that match the selector on the page, lets set up some actions
+		return this.each(function(index)
+		{
+			// if we find hoverIntent use it
+			if ($.fn.hoverIntent)
+			{
+				$(this).hoverIntent({
+					sensitivity: oSettings.hoverIntent.sensitivity,
+					interval: oSettings.hoverIntent.interval,
+					over: smf_tooltip_on,
+					timeout: oSettings.hoverIntent.timeout,
+					out: smf_tooltip_off
+				});
+			}
+			else
+			{
+				// plain old hover it is
+				$(this).hover(smf_tooltip_on, smf_tooltip_off);
+			}
+			
+			// create the on tip action
+			function smf_tooltip_on(event)
+			{
+				// Grab the text from the hidden span element we created on page load
+				if ($(this).children('.' + oSettings.tooltipClass).text())
+				{
+					// create a ID'ed div with our style class that holds the tooltip info, hidden for now
+					$('body').append('<div id="' + oSettings.tooltipID + '" class="' + oSettings.tooltipClass + '"><div id="' + oSettings.tooltipTextID + '" style="display:none;"></div></div>');
+					
+					// load information in to our newly created div
+					var $tt = $('#' + oSettings.tooltipID);
+					var $ttContent = $('#' + oSettings.tooltipID + ' #' + oSettings.tooltipTextID);
+				
+					// set the  in the div and show it off
+					positionTooltip(event);
+					$ttContent.text($(this).children('.' + oSettings.tooltipClass).text());
+					$tt.show();
+					showTooltip();
+				}
+			
+				return false;
+			};
+			
+			// create the Bye bye tip
+			function smf_tooltip_off(event)
+			{
+				hideTooltip(this);
+				return false;
+			};
+			
+			// create the tip move with the cursor
+			if (oSettings.followMouse)
+			{
+				$(this).bind("mousemove", function(event){
+					positionTooltip(event);
+					return false;
+				});
+			}
+		});
+	};
+	
+})(jQuery);
+
+/**
+ * hoverIntent is similar to jQuery's built-in "hover" function except that
+ * instead of firing the onMouseOver event immediately, hoverIntent checks
+ * to see if the user's mouse has slowed down (beneath the sensitivity
+ * threshold) before firing the onMouseOver event.
+ * 
+ * hoverIntent r6 // 2011.02.26 // jQuery 1.5.1+
+ * <http://cherne.net/brian/resources/jquery.hoverIntent.html>
+ * 
+ * hoverIntent is currently available for use in all personal or commercial 
+ * projects under both MIT and GPL licenses. This means that you can choose 
+ * the license that best suits your project, and use it accordingly.
+ * 
+ * // basic usage (just like .hover) receives onMouseOver and onMouseOut functions
+ * $("ul li").hoverIntent( showNav , hideNav );
+ * 
+ * // advanced usage receives configuration object only
+ * $("ul li").hoverIntent({
+ *	sensitivity: 7, // number = sensitivity threshold (must be 1 or higher)
+ *	interval: 100,   // number = milliseconds of polling interval
+ *	over: showNav,  // function = onMouseOver callback (required)
+ *	timeout: 0,   // number = milliseconds delay before onMouseOut function call
+ *	out: hideNav    // function = onMouseOut callback (required)
+ * });
+ * 
+ * @param  f  onMouseOver function || An object with configuration options
+ * @param  g  onMouseOut function  || Nothing (use configuration options object)
+ * @author    Brian Cherne brian(at)cherne(dot)net
+ */
+
+ /*
+  * PLEASE READ THE FOLLOWING BEFORE PLAYING AROUND WITH ANYTHING. KTHNX.
+  * SMF Dev copy - Antechinus - 20th October 2011.
+  * Code has been tweaked to give responsive menus without compromising a11y.
+  * If contemplating changes, testing for full functionality is essential or a11y will be degraded.
+  * Since a11y is the whole point of this system, degradation is not at all desirable regardless of personal preferences.
+  * If you do not understand the a11y advantages of this system, please ask before making changes.
+  *
+  * Full functionality means:
+  * 1/ hoverIntent plugin functions so that drop menus do NOT open or close instantly when cursor touches first level anchor.
+  * 2/ The drop menus should only open when the cursor actually stops on the first level anchor, or is moving very slowly.
+  * 3/ There should be a delay before the drop menus close on mouseout, for people with less than perfect tracking ability.
+  * 4/ Settings for custom tooltips will be done separately in another file.
+  */
+ 
+(function($) {
+	$.fn.hoverIntent = function(f,g) {
+		// default configuration options
+		var cfg = {
+			sensitivity: 7,
+			interval: 100,
+			timeout: 0
+		};
+		// override configuration options with user supplied object
+		cfg = $.extend(cfg, g ? { over: f, out: g } : f );
+
+		// instantiate variables
+		// cX, cY = current X and Y position of mouse, updated by mousemove event
+		// pX, pY = previous X and Y position of mouse, set by mouseover and polling interval
+		var cX, cY, pX, pY;
+
+		// A private function for getting mouse position
+		var track = function(ev) {
+			cX = ev.pageX;
+			cY = ev.pageY;
+		};
+
+		// A private function for comparing current and previous mouse position
+		var compare = function(ev,ob) {
+			ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
+			// compare mouse positions to see if they've crossed the threshold
+			if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) {
+				$(ob).unbind("mousemove",track);
+				// set hoverIntent state to true (so mouseOut can be called)
+				ob.hoverIntent_s = 1;
+				return cfg.over.apply(ob,[ev]);
+			} else {
+				// set previous coordinates for next time
+				pX = cX; pY = cY;
+				// use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
+				ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval );
+			}
+		};
+
+		// A private function for delaying the mouseOut function
+		var delay = function(ev,ob) {
+			ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
+			ob.hoverIntent_s = 0;
+			return cfg.out.apply(ob,[ev]);
+		};
+
+		// A private function for handling mouse 'hovering'
+		var handleHover = function(e) {
+
+			// next three lines copied from jQuery.hover, ignore children onMouseOver/onMouseOut
+			var p = (e.type == "mouseenter" ? e.fromElement : e.toElement) || e.relatedTarget;
+			while ( p && p != this ) { try { p = p.parentNode; } catch(e) { p = this; } }
+			if ( p == this ) { return false; }
+
+			// copy objects to be passed into t (required for event object to be passed in IE)
+			var ev = jQuery.extend({},e);
+			var ob = this;
+
+			// cancel hoverIntent timer if it exists
+			if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); }
+
+			// if e.type == "mouseenter"
+			if (e.type == "mouseenter") {
+				// set "previous" X and Y position based on initial entry point
+				pX = ev.pageX; pY = ev.pageY;
+				// update "current" X and Y position based on mousemove
+				$(ob).bind("mousemove",track);
+				// start polling interval (self-calling timeout) to compare mouse coordinates over time
+				if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );}
+
+			// else e.type == "mouseleave"
+			} else {
+				// unbind expensive mousemove event
+				$(ob).unbind("mousemove",track);
+				// if hoverIntent state is true, then call the mouseOut function after the specified delay
+				if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );}
+			}
+		};
+
+		// bind the function to the two event listeners
+		return this.bind('mouseenter',handleHover).bind('mouseleave',handleHover);
+	};
+})(jQuery);
+
+/*
+ * Superfish v1.4.8 - jQuery menu widget
+ * Copyright (c) 2008 Joel Birch
+ *
+ * Dual licensed under the MIT and GPL licenses:
+ * 	http://www.opensource.org/licenses/mit-license.php
+ * 	http://www.gnu.org/licenses/gpl.html
+ *
+ * CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt
+ */
+ 
+ /*
+  * PLEASE READ THE FOLLOWING BEFORE PLAYING AROUND WITH ANYTHING. KTHNX.
+  * Dev copy. Antechinus - 20th October 2011.
+  * Code has been tweaked to remove stuff we do not need (IE7 fix, etc).
+  * Remaining code appears to be essential for full functionality.
+  * If contemplating changes, testing for full functionality is essential or a11y will be degraded.
+  * Since a11y is the whole point of this system, degradation is not at all desirable regardless of personal preferences.
+  * If you do not understand the a11y advantages of this system, please ask before making changes.
+  *
+  * Full functionality means:
+  * 1/ hoverIntent plugin functions so that drop menus do NOT open or close instantly when cursor touches first level anchor.
+  * 2/ The drop menus should only open when the cursor actually stops on the first level anchor, or is moving very slowly.
+  * 3/ There should be a delay before the drop menus close on mouseout, for people with less than perfect tracking ability.
+  * 4/ The drop menus must remain fully accessible via keyboard navigation (eg: the Tab key).
+  */
+
+;(function($){
+	$.fn.superfish = function(op){
+
+		var sf = $.fn.superfish,
+			c = sf.c,
+			over = function(){
+				var $$ = $(this), menu = getMenu($$);
+				clearTimeout(menu.sfTimer);
+				$$.showSuperfishUl().siblings().hideSuperfishUl();
+			},
+			out = function(){
+				var $$ = $(this), menu = getMenu($$), o = sf.op;
+				clearTimeout(menu.sfTimer);
+				menu.sfTimer=setTimeout(function(){
+					o.retainPath=($.inArray($$[0],o.$path)>-1);
+					$$.hideSuperfishUl();
+					if (o.$path.length && $$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);}
+				},o.delay);	
+			},
+			getMenu = function($menu){
+				var menu = $menu.parents(['ul.',c.menuClass,':first'].join(''))[0];
+				sf.op = sf.o[menu.serial];
+				return menu;
+			},
+			// This next line is essential, despite the other code for arrows being removed.
+			// Changing the next line WILL break hoverIntent functionality. Very bad.
+			addArrow = function($a){$a.addClass(c.anchorClass)};
+
+		return this.each(function() {
+			var s = this.serial = sf.o.length;
+			var o = $.extend({},sf.defaults,op);
+			var h = $.extend({},sf.hoverdefaults,{over: over, out: out},op);
+			
+			o.$path = $('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){
+				$(this).addClass([o.hoverClass,c.bcClass].join(' '))
+					.filter('li:has(ul)').removeClass(o.pathClass);
+			});
+			sf.o[s] = sf.op = o;
+			$('li:has(ul)',this)[($.fn.hoverIntent && !o.disableHI) ? 'hoverIntent' : 'hover'](($.fn.hoverIntent && !o.disableHI) ? (h) : (over,out)).each(function() {})
+			.not('.'+c.bcClass)
+				.hideSuperfishUl();
+
+			var $a = $('a',this);
+			$a.each(function(i){
+				var $li = $a.eq(i).parents('li');
+				$a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);});
+			});
+			o.onInit.call(this);
+			
+		}).each(function() {
+			var menuClasses = [c.menuClass];
+			$(this).addClass(menuClasses.join(' '));
+		});
+	};
+
+	var sf = $.fn.superfish;
+	sf.o = [];
+	sf.op = {};
+	sf.c = {
+		bcClass     : 'sf-breadcrumb',
+		menuClass   : 'sf-js-enabled',
+		anchorClass : 'sf-with-ul',
+	};
+	sf.defaults = {
+		hoverClass	: 'sfhover',
+		pathClass	: 'current',
+		pathLevels	: 1,
+		delay		: 700,
+		animation	: {opacity:'show', height:'show'},
+		speed		: 300,
+		disableHI	: false,		// Leave as false. True disables hoverIntent detection (not good).
+		onInit		: function(){}, // callback functions
+		onBeforeShow: function(){},
+		onShow		: function(){},
+		onHide		: function(){}
+	};
+	sf.hoverdefaults = {
+		sensitivity : 10,
+		interval    : 40,
+		timeout     : 1
+	};
+	$.fn.extend({
+		hideSuperfishUl : function(){
+			var o = sf.op,
+				not = (o.retainPath===true) ? o.$path : '';
+			o.retainPath = false;
+			var $ul = $(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass)
+					.find('>ul').hide().css('opacity','0');
+			o.onHide.call($ul);
+			return this;
+		},
+		showSuperfishUl : function(){
+			var o = sf.op,
+				sh = sf.c,
+				$ul = this.addClass(o.hoverClass)
+					.find('>ul:hidden').css('opacity','1');
+			o.onBeforeShow.call($ul);
+			$ul.animate(o.animation,o.speed,function(){o.onShow.call($ul);});
+			return this;
+		}
+	});
+
+})(jQuery);

+ 0 - 124
Themes/default/scripts/superfish.js

@@ -1,124 +0,0 @@
-
-/*
- * Superfish v1.4.8 - jQuery menu widget
- * Copyright (c) 2008 Joel Birch
- *
- * Dual licensed under the MIT and GPL licenses:
- * 	http://www.opensource.org/licenses/mit-license.php
- * 	http://www.gnu.org/licenses/gpl.html
- *
- * CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt
- */
- 
- /*
- * PLEASE READ THE FOLLOWING BEFORE PLAYING AROUND WITH ANYTHING. KTHNX.
- * Dev copy. Antechinus - 20th October 2011.
- * Code has been tweaked to remove stuff we do not need (IE7 fix, etc).
- * Remaining code appears to be essential for full functionality.
- * If contemplating changes, testing for full functionality is essential or a11y will be degraded.
- * Since a11y is the whole point of this system, degradation is not at all desirable regardless of personal preferences.
- * If you do not understand the a11y advantages of this system, please ask before making changes.
- *
- * Full functionality means:
- * 1/ hoverIntent plugin functions so that drop menus do NOT open or close instantly when cursor touches first level anchor.
- * 2/ The drop menus should only open when the cursor actually stops on the first level anchor, or is moving very slowly.
- * 3/ There should be a delay before the drop menus close on mouseout, for people with less than perfect tracking ability.
- * 4/ The drop menus must remain fully accessible via keyboard navigation (eg: the Tab key).
- */
-
-;(function($){
-	$.fn.superfish = function(op){
-
-		var sf = $.fn.superfish,
-			c = sf.c,
-			over = function(){
-				var $$ = $(this), menu = getMenu($$);
-				clearTimeout(menu.sfTimer);
-				$$.showSuperfishUl().siblings().hideSuperfishUl();
-			},
-			out = function(){
-				var $$ = $(this), menu = getMenu($$), o = sf.op;
-				clearTimeout(menu.sfTimer);
-				menu.sfTimer=setTimeout(function(){
-					o.retainPath=($.inArray($$[0],o.$path)>-1);
-					$$.hideSuperfishUl();
-					if (o.$path.length && $$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);}
-				},o.delay);	
-			},
-			getMenu = function($menu){
-				var menu = $menu.parents(['ul.',c.menuClass,':first'].join(''))[0];
-				sf.op = sf.o[menu.serial];
-				return menu;
-			},
-			// This next line is essential, despite the other code for arrows being removed.
-			// Changing the next line WILL break hoverIntent functionality. Very bad.
-			addArrow = function($a){$a.addClass(c.anchorClass)};
-
-		return this.each(function() {
-			var s = this.serial = sf.o.length;
-			var o = $.extend({},sf.defaults,op);
-			o.$path = $('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){
-				$(this).addClass([o.hoverClass,c.bcClass].join(' '))
-					.filter('li:has(ul)').removeClass(o.pathClass);
-			});
-			sf.o[s] = sf.op = o;
-			$('li:has(ul)',this)[($.fn.hoverIntent && !o.disableHI) ? 'hoverIntent' : 'hover'](over,out).each(function() {})
-			.not('.'+c.bcClass)
-				.hideSuperfishUl();
-
-			var $a = $('a',this);
-			$a.each(function(i){
-				var $li = $a.eq(i).parents('li');
-				$a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);});
-			});
-			o.onInit.call(this);
-			
-		}).each(function() {
-			var menuClasses = [c.menuClass];
-			$(this).addClass(menuClasses.join(' '));
-		});
-	};
-
-	var sf = $.fn.superfish;
-	sf.o = [];
-	sf.op = {};
-	sf.c = {
-		bcClass     : 'sf-breadcrumb',
-		menuClass   : 'sf-js-enabled',
-		anchorClass : 'sf-with-ul',
-	};
-	sf.defaults = {
-		hoverClass	: 'sfhover',
-		pathClass	: 'current',
-		pathLevels	: 1,
-		delay		: 700,
-		animation	: {opacity:'show', height:'show'},
-		speed		: 300,
-		disableHI	: false,		// Leave as false. True disables hoverIntent detection (not good).
-		onInit		: function(){}, // callback functions
-		onBeforeShow: function(){},
-		onShow		: function(){},
-		onHide		: function(){}
-	};
-	$.fn.extend({
-		hideSuperfishUl : function(){
-			var o = sf.op,
-				not = (o.retainPath===true) ? o.$path : '';
-			o.retainPath = false;
-			var $ul = $(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass)
-					.find('>ul').hide().css('opacity','0');
-			o.onHide.call($ul);
-			return this;
-		},
-		showSuperfishUl : function(){
-			var o = sf.op,
-				sh = sf.c,
-				$ul = this.addClass(o.hoverClass)
-					.find('>ul:hidden').css('opacity','1');
-			o.onBeforeShow.call($ul);
-			$ul.animate(o.animation,o.speed,function(){o.onShow.call($ul);});
-			return this;
-		}
-	});
-
-})(jQuery);