5 var PopoverExt = function ( element, options ) {
6 this.init('popoverext', element, options)
9 /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
10 ========================================== */
12 PopoverExt.prototype = $.extend({}, $.fn.popover.Constructor.prototype, {
14 constructor: PopoverExt
15 , init: function ( type, element, options ) {
20 this.$element = $(element)
21 this.options = this.getOptions(options)
24 if (this.options.trigger != 'manual') {
25 eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
26 eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
27 this.$element.on(eventIn, this.options.selector, $.proxy(this.enter, this))
28 this.$element.on(eventOut, this.options.selector, $.proxy(this.leave, this))
31 //console.log(this.tip())
32 var $tip = this.tip();
35 this.options.selector ?
36 (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
40 , setContent: function () {
42 , title = this.getTitle()
43 , content = this.getContent()
44 , footer = this.getFooter();
46 $tip.find('.popover-title')[ $.type(title) == 'object' ? 'append' : 'html' ](title);
47 $tip.find('.popover-content > *')[ $.type(content) == 'object' ? 'append' : 'html' ](content);
48 $tip.find('.popover-footer')[ $.type(footer) == 'object' ? 'append' : 'html' ](footer);
50 $tip.removeClass('fade top bottom left right in');
53 , hasContent: function () {
54 return this.getTitle() || this.getContent()
62 $tip.attr("id",this.$element.attr("id") + "Popover");
75 if (this.hasContent() && this.enabled) {
80 if (this.options.animation) {
84 placement = typeof this.options.placement == 'function' ?
85 this.options.placement.call(this, $tip[0], this.$element[0]) :
86 this.options.placement;
88 inside = /in/.test(placement)
92 .css({ top: 0, left: 0, display: 'block' })
93 .appendTo(inside ? this.$element : document.body);
95 if(this.options.hideOnBlur) {
97 .attr("tabindex","-1")
98 .on("blur", $.proxy(this.hide, this))
102 pos = this.getPosition(inside)
103 actualWidth = $tip[0].offsetWidth
104 actualHeight = $tip[0].offsetHeight
106 switch (inside ? placement.split(' ')[1] : placement) {
108 tp = {top: pos.top + pos.height + this.options.topOffset, left: pos.left + pos.width / 2 - actualWidth / 2}
111 tp = {top: pos.top + pos.height + this.options.topOffset, left: pos.left + this.options.leftOffset}
114 tp = {top: pos.top + pos.height + this.options.topOffset , left: (pos.left + pos.width) - actualWidth - this.options.leftOffset }
117 tp = {top: pos.top - actualHeight + this.options.topOffset, left: pos.left + (pos.width / 2 - actualWidth / 2) + this.options.leftOffset}
120 tp = {top: pos.top - actualHeight + this.options.topOffset, left: (pos.left + pos.width) - actualWidth - this.options.leftOffset}
123 tp = {top: pos.top - actualHeight + this.options.topOffset, left: pos.left + this.options.leftOffset}
126 tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
129 tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
138 if(this.options.fixed == true) {
139 $tip.css("position","fixed");
142 this.options.onShow();
144 , getFooter: function () {
149 footer = $e.attr('data-footer')
150 || (typeof o.content == 'function' ? o.footer.call($e[0]) : o.footer);
152 footer = footer.toString().replace(/(^\s*|\s*$)/, "");
160 /* POPOVER PLUGIN DEFINITION
161 * ======================= */
163 $.fn.popoverext = function ( option ) {
164 return this.each(function () {
166 , data = $this.data('popoverext')
167 , options = typeof option == 'object' && option
168 if (!data) $this.data('popoverext', (data = new PopoverExt(this, options)))
169 if (typeof option == 'string') data[option]()
173 $.fn.popoverext.Constructor = PopoverExt
175 $.fn.popoverext.defaults = $.extend({} , $.fn.popover.defaults, {
177 template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div><div class="popover-footer"></div></div></div>',