/* * 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 '' + content + ''; } }, 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), $('
').html(content ? content : $target.attr('title')).html())), classes = methods.inheritable_classes($target); $tip.addClass(classes).appendTo('body'); if (Modernizr.touch) { $tip.append('tap to close '); } $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));