diff options
Diffstat (limited to 'website/static/js/foundation3/jquery.foundation.tooltips.js')
-rw-r--r-- | website/static/js/foundation3/jquery.foundation.tooltips.js | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/website/static/js/foundation3/jquery.foundation.tooltips.js b/website/static/js/foundation3/jquery.foundation.tooltips.js new file mode 100644 index 0000000..f2862de --- /dev/null +++ b/website/static/js/foundation3/jquery.foundation.tooltips.js @@ -0,0 +1,211 @@ +/* + * jQuery Foundation Tooltips 2.0.2 + * http://foundation.zurb.com + * Copyright 2012, ZURB + * Free to use under the MIT license. + * http://www.opensource.org/licenses/mit-license.php +*/ + +/*jslint unparam: true, browser: true, indent: 2 */ + +;(function ($, window, undefined) { + 'use strict'; + + var settings = { + bodyHeight : 0, + selector : '.has-tip', + additionalInheritableClasses : [], + tooltipClass : '.tooltip', + tipTemplate : function (selector, content) { + return '<span data-selector="' + selector + '" class="' + settings.tooltipClass.substring(1) + '">' + content + '<span class="nub"></span></span>'; + } + }, + methods = { + init : function (options) { + settings = $.extend(settings, options); + + // alias the old targetClass option + settings.selector = settings.targetClass ? settings.targetClass : settings.selector; + + return this.each(function () { + var $body = $('body'); + + if (Modernizr.touch) { + $body.on('click.tooltip touchstart.tooltip touchend.tooltip', settings.selector, function (e) { + e.preventDefault(); + $(settings.tooltipClass).hide(); + methods.showOrCreateTip($(this)); + }); + $body.on('click.tooltip touchstart.tooltip touchend.tooltip', settings.tooltipClass, function (e) { + e.preventDefault(); + $(this).fadeOut(150); + }); + } else { + $body.on('mouseenter.tooltip mouseleave.tooltip', settings.selector, function (e) { + var $this = $(this); + + if (e.type === 'mouseenter') { + methods.showOrCreateTip($this); + } else if (e.type === 'mouseleave') { + methods.hide($this); + } + }); + } + + $(this).data('tooltips', true); + + }); + }, + showOrCreateTip : function ($target, content) { + var $tip = methods.getTip($target); + + if ($tip && $tip.length > 0) { + methods.show($target); + } else { + methods.create($target, content); + } + }, + getTip : function ($target) { + var selector = methods.selector($target), + tip = null; + + if (selector) { + tip = $('span[data-selector=' + selector + ']' + settings.tooltipClass); + } + return (tip.length > 0) ? tip : false; + }, + selector : function ($target) { + var id = $target.attr('id'), + dataSelector = $target.data('selector'); + + if (id === undefined && dataSelector === undefined) { + dataSelector = 'tooltip' + Math.random().toString(36).substring(7); + $target.attr('data-selector', dataSelector); + } + return (id) ? id : dataSelector; + }, + create : function ($target, content) { + var $tip = $(settings.tipTemplate(methods.selector($target), + $('<div>').html(content ? content : $target.attr('title')).html())), + classes = methods.inheritable_classes($target); + + $tip.addClass(classes).appendTo('body'); + if (Modernizr.touch) { + $tip.append('<span class="tap-to-close">tap to close </span>'); + } + $target.removeAttr('title'); + methods.show($target); + }, + reposition : function (target, tip, classes) { + var width, nub, nubHeight, nubWidth, column, objPos; + + tip.css('visibility', 'hidden').show(); + + width = target.data('width'); + nub = tip.children('.nub'); + nubHeight = nub.outerHeight(); + nubWidth = nub.outerWidth(); + + objPos = function (obj, top, right, bottom, left, width) { + return obj.css({ + 'top' : top, + 'bottom' : bottom, + 'left' : left, + 'right' : right, + 'max-width' : (width) ? width : 'auto' + }).end(); + }; + + objPos(tip, (target.offset().top + target.outerHeight() + 10), 'auto', 'auto', target.offset().left, width); + objPos(nub, -nubHeight, 'auto', 'auto', 10); + + if ($(window).width() < 767) { + if (target.data('mobile-width')) { + tip.width(target.data('mobile-width')).css('left', 15).addClass('tip-override'); + } else { + column = target.closest('.columns'); + if (column.length < 0) { + // if not using Foundation + column = $('body'); + } + if (column.outerWidth()) { + tip.width(column.outerWidth() - 25).css('left', 15).addClass('tip-override'); + } else { + var tmp_width = Math.ceil($(window).width() * 0.9); + tip.width(tmp_width).css('left', 15).addClass('tip-override'); + } + } + objPos(nub, -nubHeight, 'auto', 'auto', target.offset().left); + } else { + if (classes && classes.indexOf('tip-top') > -1) { + objPos(tip, (target.offset().top - tip.outerHeight() - nubHeight), 'auto', 'auto', target.offset().left, width) + .removeClass('tip-override'); + objPos(nub, 'auto', 'auto', -nubHeight, 'auto'); + } else if (classes && classes.indexOf('tip-left') > -1) { + objPos(tip, (target.offset().top + (target.outerHeight() / 2) - nubHeight), 'auto', 'auto', (target.offset().left - tip.outerWidth() - 10), width) + .removeClass('tip-override'); + objPos(nub, (tip.outerHeight() / 2) - (nubHeight / 2), -nubHeight, 'auto', 'auto'); + } else if (classes && classes.indexOf('tip-right') > -1) { + objPos(tip, (target.offset().top + (target.outerHeight() / 2) - nubHeight), 'auto', 'auto', (target.offset().left + target.outerWidth() + 10), width) + .removeClass('tip-override'); + objPos(nub, (tip.outerHeight() / 2) - (nubHeight / 2), 'auto', 'auto', -nubHeight); + } else if (classes && classes.indexOf('tip-centered-top') > -1) { + objPos(tip, (target.offset().top - tip.outerHeight() - nubHeight), 'auto', 'auto', (target.offset().left + ((target.outerWidth() - tip.outerWidth()) / 2) ), width) + .removeClass('tip-override'); + objPos(nub, 'auto', ((tip.outerWidth() / 2) -(nubHeight / 2)), -nubHeight, 'auto'); + } else if (classes && classes.indexOf('tip-centered-bottom') > -1) { + objPos(tip, (target.offset().top + target.outerHeight() + 10), 'auto', 'auto', (target.offset().left + ((target.outerWidth() - tip.outerWidth()) / 2) ), width) + .removeClass('tip-override'); + objPos(nub, -nubHeight, ((tip.outerWidth() / 2) -(nubHeight / 2)), 'auto', 'auto'); + } + } + tip.css('visibility', 'visible').hide(); + }, + inheritable_classes : function (target) { + var inheritables = ['tip-top', 'tip-left', 'tip-bottom', 'tip-right', 'tip-centered-top', 'tip-centered-bottom', 'noradius'].concat(settings.additionalInheritableClasses), + classes = target.attr('class'), + filtered = classes ? $.map(classes.split(' '), function (el, i) { + if ($.inArray(el, inheritables) !== -1) { + return el; + } + }).join(' ') : ''; + + return $.trim(filtered); + }, + show : function ($target) { + var $tip = methods.getTip($target); + + methods.reposition($target, $tip, $target.attr('class')); + $tip.fadeIn(150); + }, + hide : function ($target) { + var $tip = methods.getTip($target); + + $tip.fadeOut(150); + }, + reload : function () { + var $self = $(this); + + return ($self.data('tooltips')) ? $self.foundationTooltips('destroy').foundationTooltips('init') : $self.foundationTooltips('init'); + }, + destroy : function () { + return this.each(function () { + $(window).off('.tooltip'); + $(settings.selector).off('.tooltip'); + $(settings.tooltipClass).each(function (i) { + $($(settings.selector).get(i)).attr('title', $(this).text()); + }).remove(); + }); + } + }; + + $.fn.foundationTooltips = function (method) { + if (methods[method]) { + return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); + } else if (typeof method === 'object' || !method) { + return methods.init.apply(this, arguments); + } else { + $.error('Method ' + method + ' does not exist on jQuery.foundationTooltips'); + } + }; +}(jQuery, this)); |