// Generated by CoffeeScript 1.4.0 /* * * jQuery Popovers by Gary Hepting - https://github.com/ghepting/jquery-popovers * * Open source under the BSD License. * * Copyright © 2013 Gary Hepting. All rights reserved. * */ (function() { (function($) { return $.fn.popover = function(options) { var closePopover, defaults, delayAdjust, delayHide, getElementPosition, popover, resetPopover, setPosition, showPopover, trigger; defaults = { hover: false, click: true, resize: true, scroll: true, topOffset: 0, delay: 500, speed: 100 }; options = $.extend(defaults, options); popover = $('#popover'); delayHide = ''; delayAdjust = ''; trigger = ''; getElementPosition = function(el) { var bottom, left, offset, right, top, win; offset = el.offset(); win = $(window); return { top: top = offset.top - win.scrollTop(), left: left = offset.left - win.scrollLeft(), bottom: bottom = win.height() - top - el.outerHeight(), right: right = win.width() - left - el.outerWidth() }; }; resetPopover = function(resize) { popover.css({ top: 'auto', right: 'auto', bottom: 'auto', left: 'auto' }); if (resize) { popover.css({ width: 'auto' }); } popover.removeClass('top'); popover.removeClass('right'); popover.removeClass('bottom'); return popover.removeClass('left'); }; setPosition = function(trigger, skipAnimation, resize) { var attrs, coords, height, width; if (trigger) { if (resize) { resetPopover(true); } else { resetPopover(); } coords = getElementPosition(trigger); if (popover.outerWidth() > ($(window).width() - 20)) { popover.css('width', $(window).width() - 20); } popover.css('max-width', Math.min($(window).width() - parseInt($('body').css('padding-left')) - parseInt($('body').css('padding-right')), parseInt(popover.css('max-width')))); width = popover.outerWidth(); height = popover.outerHeight(); attrs = {}; if (coords.left <= coords.right) { popover.addClass('left'); attrs.left = coords.left; } else { popover.addClass('right'); attrs.right = coords.right; } if ((coords.top - options.topOffset) > (height + 20)) { popover.addClass('top'); attrs.top = trigger.offset().top - height - 20; } else { popover.addClass('bottom'); attrs.top = trigger.offset().top + 15; } popover.css(attrs); if (skipAnimation) { return popover.css({ top: '+=10' }); } } }; closePopover = function() { $('.popover-trigger').removeClass('popover-trigger'); return popover.removeClass('sticky').remove(); }; showPopover = function(e) { var tip; trigger = $(e.target); if (!trigger.hasClass('popover-trigger')) { closePopover(); trigger.addClass('popover-trigger'); } tip = $('#' + trigger.attr('data-content')).html(); popover = $("
"); if (!tip || tip === "") { return false; } trigger.removeAttr("title"); popover.css("opacity", 0).html(tip).appendTo("body"); setPosition(trigger); popover.animate({ top: "+=10", opacity: 1 }, options.speed); popover.bind("click", function(e) { if (e.target.tagName !== 'a') { popover.addClass('sticky'); e.stopPropagation(); e.preventDefault(); return false; } }); popover.find('.close').bind("click", function(e) { $('.popover-trigger').removeClass('popover-trigger'); popover.removeClass('sticky').remove(); e.stopPropagation(); e.preventDefault(); return false; }); return popover.bind({ mouseenter: function() { return clearTimeout(delayHide); }, mouseleave: function() { if (!popover.hasClass('sticky')) { return delayHide = setTimeout((function() { $('.popover-trigger').removeClass('popover-trigger'); return popover.removeClass('sticky').remove(); }), 500); } } }); }; return this.each(function() { var $this; $this = $(this); if (options.hover) { $this.bind({ mouseenter: function(e) { trigger = $(e.target); clearTimeout(delayHide); if (!$this.hasClass('popover-trigger') && !popover.hasClass('sticky')) { return showPopover(e); } }, mouseleave: function() { if (!popover.hasClass('sticky')) { return delayHide = setTimeout(function() { return closePopover(); }, options.delay); } } }); } if (options.click) { $this.bind("click", function(e) { trigger = $(e.target); if (!trigger.hasClass('popover-trigger')) { closePopover(); showPopover(e); } popover.addClass('sticky'); e.preventDefault(); e.stopPropagation(); return false; }); } if (options.resize) { $(window).resize(function() { clearTimeout(delayAdjust); return delayAdjust = setTimeout(function() { return setPosition(trigger, true, true); }, 100); }); } if (options.scroll) { $(window).scroll(function() { return setPosition(trigger, true); }); } return $('html, body').bind("click", function(e) { $('.popover-trigger').removeClass('popover-trigger'); return popover.removeClass('sticky').remove(); }); }); }; })(jQuery); }).call(this);