jquery-qtip2-rails 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +87 -0
- data/Rakefile +2 -0
- data/jquery-qtip2-rails.gemspec +19 -0
- data/lib/jquery-qtip2-rails.rb +10 -0
- data/lib/jquery-qtip2-rails/version.rb +7 -0
- data/vendor/assets/javascripts/jquery-qtip/ajax/ajax.js +167 -0
- data/vendor/assets/javascripts/jquery-qtip/bgiframe/bgiframe.js +76 -0
- data/vendor/assets/javascripts/jquery-qtip/core.js +1923 -0
- data/vendor/assets/javascripts/jquery-qtip/header.txt +14 -0
- data/vendor/assets/javascripts/jquery-qtip/imagemap/imagemap.js +143 -0
- data/vendor/assets/javascripts/jquery-qtip/intro.js +58 -0
- data/vendor/assets/javascripts/jquery-qtip/modal/modal.js +286 -0
- data/vendor/assets/javascripts/jquery-qtip/outro.js +2 -0
- data/vendor/assets/javascripts/jquery-qtip/svg/svg.js +43 -0
- data/vendor/assets/javascripts/jquery-qtip/tips/tips.js +610 -0
- data/vendor/assets/javascripts/jquery.qtip.basic.js +4 -0
- data/vendor/assets/javascripts/jquery.qtip.js +10 -0
- data/vendor/assets/stylesheets/jquery-qtip/core.css +123 -0
- data/vendor/assets/stylesheets/jquery-qtip/extra.css +424 -0
- data/vendor/assets/stylesheets/jquery-qtip/header.txt +14 -0
- data/vendor/assets/stylesheets/jquery-qtip/modal/modal.css +23 -0
- data/vendor/assets/stylesheets/jquery-qtip/styles.css +127 -0
- data/vendor/assets/stylesheets/jquery-qtip/tips/tips.css +22 -0
- data/vendor/assets/stylesheets/jquery.qtip.css +8 -0
- metadata +94 -0
@@ -0,0 +1,14 @@
|
|
1
|
+
/*
|
2
|
+
* qTip2 - Pretty powerful tooltips
|
3
|
+
* http://craigsworks.com/projects/qtip2/
|
4
|
+
*
|
5
|
+
* Version: 2.0.0pre
|
6
|
+
* Copyright 2009-2010 Craig Michael Thompson - http://craigsworks.com
|
7
|
+
*
|
8
|
+
* Dual licensed under MIT or GPLv2 licenses
|
9
|
+
* http://en.wikipedia.org/wiki/MIT_License
|
10
|
+
* http://en.wikipedia.org/wiki/GNU_General_Public_License
|
11
|
+
*
|
12
|
+
* Date: Thu Apr 26 20:40:09 2012 +0100
|
13
|
+
*/
|
14
|
+
|
@@ -0,0 +1,143 @@
|
|
1
|
+
PLUGINS.imagemap = function(area, corner, flip)
|
2
|
+
{
|
3
|
+
if(!area.jquery) { area = $(area); }
|
4
|
+
|
5
|
+
var shape = (area[0].shape || area.attr('shape')).toLowerCase(),
|
6
|
+
baseCoords = (area[0].coords || area.attr('coords')).split(','),
|
7
|
+
coords = [],
|
8
|
+
image = $('img[usemap="#'+area.parent('map').attr('name')+'"]'),
|
9
|
+
imageOffset = image.offset(),
|
10
|
+
result = {
|
11
|
+
width: 0, height: 0,
|
12
|
+
offset: { top: 1e10, right: 0, bottom: 0, left: 1e10 }
|
13
|
+
},
|
14
|
+
i = 0, next = 0, dimensions;
|
15
|
+
|
16
|
+
// POLY area coordinate calculator
|
17
|
+
// Special thanks to Ed Cradock for helping out with this.
|
18
|
+
// Uses a binary search algorithm to find suitable coordinates.
|
19
|
+
function polyCoordinates(result, coords, corner)
|
20
|
+
{
|
21
|
+
var i = 0,
|
22
|
+
compareX = 1, compareY = 1,
|
23
|
+
realX = 0, realY = 0,
|
24
|
+
newWidth = result.width,
|
25
|
+
newHeight = result.height;
|
26
|
+
|
27
|
+
// Use a binary search algorithm to locate most suitable coordinate (hopefully)
|
28
|
+
while(newWidth > 0 && newHeight > 0 && compareX > 0 && compareY > 0)
|
29
|
+
{
|
30
|
+
newWidth = Math.floor(newWidth / 2);
|
31
|
+
newHeight = Math.floor(newHeight / 2);
|
32
|
+
|
33
|
+
if(corner.x === 'left'){ compareX = newWidth; }
|
34
|
+
else if(corner.x === 'right'){ compareX = result.width - newWidth; }
|
35
|
+
else{ compareX += Math.floor(newWidth / 2); }
|
36
|
+
|
37
|
+
if(corner.y === 'top'){ compareY = newHeight; }
|
38
|
+
else if(corner.y === 'bottom'){ compareY = result.height - newHeight; }
|
39
|
+
else{ compareY += Math.floor(newHeight / 2); }
|
40
|
+
|
41
|
+
i = coords.length; while(i--)
|
42
|
+
{
|
43
|
+
if(coords.length < 2){ break; }
|
44
|
+
|
45
|
+
realX = coords[i][0] - result.offset.left;
|
46
|
+
realY = coords[i][1] - result.offset.top;
|
47
|
+
|
48
|
+
if((corner.x === 'left' && realX >= compareX) ||
|
49
|
+
(corner.x === 'right' && realX <= compareX) ||
|
50
|
+
(corner.x === 'center' && (realX < compareX || realX > (result.width - compareX))) ||
|
51
|
+
(corner.y === 'top' && realY >= compareY) ||
|
52
|
+
(corner.y === 'bottom' && realY <= compareY) ||
|
53
|
+
(corner.y === 'center' && (realY < compareY || realY > (result.height - compareY)))) {
|
54
|
+
coords.splice(i, 1);
|
55
|
+
}
|
56
|
+
}
|
57
|
+
}
|
58
|
+
|
59
|
+
return { left: coords[0][0], top: coords[0][1] };
|
60
|
+
}
|
61
|
+
|
62
|
+
// Make sure we account for padding and borders on the image
|
63
|
+
imageOffset.left += Math.ceil((image.outerWidth() - image.width()) / 2);
|
64
|
+
imageOffset.top += Math.ceil((image.outerHeight() - image.height()) / 2);
|
65
|
+
|
66
|
+
// Parse coordinates into proper array
|
67
|
+
if(shape === 'poly') {
|
68
|
+
i = baseCoords.length; while(i--)
|
69
|
+
{
|
70
|
+
next = [ parseInt(baseCoords[--i], 10), parseInt(baseCoords[i+1], 10) ];
|
71
|
+
|
72
|
+
if(next[0] > result.offset.right){ result.offset.right = next[0]; }
|
73
|
+
if(next[0] < result.offset.left){ result.offset.left = next[0]; }
|
74
|
+
if(next[1] > result.offset.bottom){ result.offset.bottom = next[1]; }
|
75
|
+
if(next[1] < result.offset.top){ result.offset.top = next[1]; }
|
76
|
+
|
77
|
+
coords.push(next);
|
78
|
+
}
|
79
|
+
}
|
80
|
+
else {
|
81
|
+
coords = $.map(baseCoords, function(coord){ return parseInt(coord, 10); });
|
82
|
+
}
|
83
|
+
|
84
|
+
// Calculate details
|
85
|
+
switch(shape)
|
86
|
+
{
|
87
|
+
case 'rect':
|
88
|
+
result = {
|
89
|
+
width: Math.abs(coords[2] - coords[0]),
|
90
|
+
height: Math.abs(coords[3] - coords[1]),
|
91
|
+
offset: {
|
92
|
+
left: Math.min(coords[0], coords[2]),
|
93
|
+
top: Math.min(coords[1], coords[3])
|
94
|
+
}
|
95
|
+
};
|
96
|
+
break;
|
97
|
+
|
98
|
+
case 'circle':
|
99
|
+
result = {
|
100
|
+
width: coords[2] + 2,
|
101
|
+
height: coords[2] + 2,
|
102
|
+
offset: { left: coords[0], top: coords[1] }
|
103
|
+
};
|
104
|
+
break;
|
105
|
+
|
106
|
+
case 'poly':
|
107
|
+
$.extend(result, {
|
108
|
+
width: Math.abs(result.offset.right - result.offset.left),
|
109
|
+
height: Math.abs(result.offset.bottom - result.offset.top)
|
110
|
+
});
|
111
|
+
|
112
|
+
if(corner.string() === 'centercenter') {
|
113
|
+
result.offset = {
|
114
|
+
left: result.offset.left + (result.width / 2),
|
115
|
+
top: result.offset.top + (result.height / 2)
|
116
|
+
};
|
117
|
+
}
|
118
|
+
else {
|
119
|
+
result.offset = polyCoordinates(result, coords.slice(), corner);
|
120
|
+
|
121
|
+
// If flip adjustment is enabled, also calculate the closest opposite point
|
122
|
+
if(flip && (flip[0] === 'flip' || flip[1] === 'flip')) {
|
123
|
+
result.flipoffset = polyCoordinates(result, coords.slice(), {
|
124
|
+
x: corner.x === 'left' ? 'right' : corner.x === 'right' ? 'left' : 'center',
|
125
|
+
y: corner.y === 'top' ? 'bottom' : corner.y === 'bottom' ? 'top' : 'center'
|
126
|
+
});
|
127
|
+
|
128
|
+
result.flipoffset.left -= result.offset.left;
|
129
|
+
result.flipoffset.top -= result.offset.top;
|
130
|
+
}
|
131
|
+
}
|
132
|
+
|
133
|
+
result.width = result.height = 0;
|
134
|
+
break;
|
135
|
+
}
|
136
|
+
|
137
|
+
// Add image position to offset coordinates
|
138
|
+
result.offset.left += imageOffset.left;
|
139
|
+
result.offset.top += imageOffset.top;
|
140
|
+
|
141
|
+
return result;
|
142
|
+
};
|
143
|
+
|
@@ -0,0 +1,58 @@
|
|
1
|
+
/*jslint browser: true, onevar: true, undef: true, nomen: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: true */
|
2
|
+
/*global window: false, jQuery: false, console: false, define: false */
|
3
|
+
|
4
|
+
// Uses AMD or browser globals to create a jQuery plugin.
|
5
|
+
(function(factory) {
|
6
|
+
if(typeof define === 'function' && define.amd) {
|
7
|
+
define(['jquery'], factory);
|
8
|
+
}
|
9
|
+
else {
|
10
|
+
factory(jQuery);
|
11
|
+
}
|
12
|
+
}
|
13
|
+
(function($) {
|
14
|
+
|
15
|
+
"use strict"; // Enable ECMAScript "strict" operation for this function. See more: http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/
|
16
|
+
|
17
|
+
// Munge the primitives - Paul Irish tip
|
18
|
+
var TRUE = true,
|
19
|
+
FALSE = false,
|
20
|
+
NULL = null,
|
21
|
+
undefined,
|
22
|
+
|
23
|
+
// Shortcut vars
|
24
|
+
QTIP, PLUGINS, MOUSE,
|
25
|
+
usedIDs = {},
|
26
|
+
uitooltip = 'ui-tooltip',
|
27
|
+
widget = 'ui-widget',
|
28
|
+
disabled = 'ui-state-disabled',
|
29
|
+
selector = 'div.qtip.'+uitooltip,
|
30
|
+
defaultClass = uitooltip + '-default',
|
31
|
+
focusClass = uitooltip + '-focus',
|
32
|
+
hoverClass = uitooltip + '-hover',
|
33
|
+
fluidClass = uitooltip + '-fluid',
|
34
|
+
hideOffset = '-31000px',
|
35
|
+
replaceSuffix = '_replacedByqTip',
|
36
|
+
oldtitle = 'oldtitle',
|
37
|
+
trackingBound;
|
38
|
+
|
39
|
+
/* Thanks to Paul Irish for this one: http://paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/ */
|
40
|
+
function log() {
|
41
|
+
log.history = log.history || [];
|
42
|
+
log.history.push(arguments);
|
43
|
+
|
44
|
+
// Make sure console is present
|
45
|
+
if('object' === typeof console) {
|
46
|
+
|
47
|
+
// Setup console and arguments
|
48
|
+
var c = console[ console.warn ? 'warn' : 'log' ],
|
49
|
+
args = Array.prototype.slice.call(arguments), a;
|
50
|
+
|
51
|
+
// Add qTip2 marker to first argument if it's a string
|
52
|
+
if(typeof arguments[0] === 'string') { args[0] = 'qTip2: ' + args[0]; }
|
53
|
+
|
54
|
+
// Apply console.warn or .log if not supported
|
55
|
+
a = c.apply ? c.apply(console, args) : c(args);
|
56
|
+
}
|
57
|
+
}
|
58
|
+
|
@@ -0,0 +1,286 @@
|
|
1
|
+
function Modal(api)
|
2
|
+
{
|
3
|
+
var self = this,
|
4
|
+
options = api.options.show.modal,
|
5
|
+
elems = api.elements,
|
6
|
+
tooltip = elems.tooltip,
|
7
|
+
overlaySelector = '#qtip-overlay',
|
8
|
+
globalNamespace = '.qtipmodal',
|
9
|
+
namespace = globalNamespace + api.id,
|
10
|
+
attr = 'is-modal-qtip',
|
11
|
+
docBody = $(document.body),
|
12
|
+
overlay;
|
13
|
+
|
14
|
+
// Setup option set checks
|
15
|
+
api.checks.modal = {
|
16
|
+
'^show.modal.(on|blur)$': function() {
|
17
|
+
// Initialise
|
18
|
+
self.init();
|
19
|
+
|
20
|
+
// Show the modal if not visible already and tooltip is visible
|
21
|
+
elems.overlay.toggle( tooltip.is(':visible') );
|
22
|
+
}
|
23
|
+
};
|
24
|
+
|
25
|
+
$.extend(self, {
|
26
|
+
init: function()
|
27
|
+
{
|
28
|
+
// If modal is disabled... return
|
29
|
+
if(!options.on) { return self; }
|
30
|
+
|
31
|
+
// Create the overlay if needed
|
32
|
+
overlay = self.create();
|
33
|
+
|
34
|
+
// Add unique attribute so we can grab modal tooltips easily via a selector
|
35
|
+
tooltip.attr(attr, TRUE)
|
36
|
+
|
37
|
+
// Set z-index
|
38
|
+
.css('z-index', PLUGINS.modal.zindex + $(selector+'['+attr+']').length)
|
39
|
+
|
40
|
+
// Remove previous bound events in globalNamespace
|
41
|
+
.unbind(globalNamespace).unbind(namespace)
|
42
|
+
|
43
|
+
// Apply our show/hide/focus modal events
|
44
|
+
.bind('tooltipshow'+globalNamespace+' tooltiphide'+globalNamespace, function(event, api, duration) {
|
45
|
+
var oEvent = event.originalEvent;
|
46
|
+
|
47
|
+
// Make sure mouseout doesn't trigger a hide when showing the modal and mousing onto backdrop
|
48
|
+
if(event.target === tooltip[0]) {
|
49
|
+
if(oEvent && event.type === 'tooltiphide' && /mouse(leave|enter)/.test(oEvent.type) && $(oEvent.relatedTarget).closest(overlay[0]).length) {
|
50
|
+
try { event.preventDefault(); } catch(e) {}
|
51
|
+
}
|
52
|
+
else if(!oEvent || (oEvent && !oEvent.solo)) {
|
53
|
+
self[ event.type.replace('tooltip', '') ](event, duration);
|
54
|
+
}
|
55
|
+
}
|
56
|
+
})
|
57
|
+
|
58
|
+
// Adjust modal z-index on tooltip focus
|
59
|
+
.bind('tooltipfocus'+globalNamespace, function(event) {
|
60
|
+
// If focus was cancelled before it reearch us, don't do anything
|
61
|
+
if(event.isDefaultPrevented() || event.target !== tooltip[0]) { return; }
|
62
|
+
|
63
|
+
var qtips = $(selector).filter('['+attr+']'),
|
64
|
+
|
65
|
+
// Keep the modal's lower than other, regular qtips
|
66
|
+
newIndex = PLUGINS.modal.zindex + qtips.length,
|
67
|
+
curIndex = parseInt(tooltip[0].style.zIndex, 10);
|
68
|
+
|
69
|
+
// Set overlay z-index
|
70
|
+
overlay[0].style.zIndex = newIndex - 1;
|
71
|
+
|
72
|
+
// Reduce modal z-index's and keep them properly ordered
|
73
|
+
qtips.each(function() {
|
74
|
+
if(this.style.zIndex > curIndex) {
|
75
|
+
this.style.zIndex -= 1;
|
76
|
+
}
|
77
|
+
});
|
78
|
+
|
79
|
+
// Fire blur event for focused tooltip
|
80
|
+
qtips.end().filter('.' + focusClass).qtip('blur', event.originalEvent);
|
81
|
+
|
82
|
+
// Set the new z-index
|
83
|
+
tooltip.addClass(focusClass)[0].style.zIndex = newIndex;
|
84
|
+
|
85
|
+
// Prevent default handling
|
86
|
+
try { event.preventDefault(); } catch(e) {}
|
87
|
+
})
|
88
|
+
|
89
|
+
// Focus any other visible modals when this one hides
|
90
|
+
.bind('tooltiphide'+globalNamespace, function(event) {
|
91
|
+
if(event.target === tooltip[0]) {
|
92
|
+
$('[' + attr + ']').filter(':visible').not(tooltip).last().qtip('focus', event);
|
93
|
+
}
|
94
|
+
});
|
95
|
+
|
96
|
+
// Apply keyboard "Escape key" close handler
|
97
|
+
if(options.escape) {
|
98
|
+
$(window).unbind(namespace).bind('keydown'+namespace, function(event) {
|
99
|
+
if(event.keyCode === 27 && tooltip.hasClass(focusClass)) {
|
100
|
+
api.hide(event);
|
101
|
+
}
|
102
|
+
});
|
103
|
+
}
|
104
|
+
|
105
|
+
// Apply click handler for blur option
|
106
|
+
if(options.blur) {
|
107
|
+
elems.overlay.unbind(namespace).bind('click'+namespace, function(event) {
|
108
|
+
if(tooltip.hasClass(focusClass)) { api.hide(event); }
|
109
|
+
});
|
110
|
+
}
|
111
|
+
|
112
|
+
return self;
|
113
|
+
},
|
114
|
+
|
115
|
+
create: function()
|
116
|
+
{
|
117
|
+
var elem = $(overlaySelector);
|
118
|
+
|
119
|
+
// Return if overlay is already rendered
|
120
|
+
if(elem.length) {
|
121
|
+
// Modal overlay should always be below all tooltips if possible
|
122
|
+
return (elems.overlay = elem.insertAfter( $(selector).last() ));
|
123
|
+
}
|
124
|
+
|
125
|
+
// Create document overlay
|
126
|
+
overlay = elems.overlay = $('<div />', {
|
127
|
+
id: overlaySelector.substr(1),
|
128
|
+
html: '<div></div>',
|
129
|
+
mousedown: function() { return FALSE; }
|
130
|
+
})
|
131
|
+
.insertAfter( $(selector).last() );
|
132
|
+
|
133
|
+
// Update position on window resize or scroll
|
134
|
+
function resize() {
|
135
|
+
overlay.css({
|
136
|
+
height: $(window).height(),
|
137
|
+
width: $(window).width()
|
138
|
+
});
|
139
|
+
}
|
140
|
+
$(window).unbind(globalNamespace).bind('resize'+globalNamespace, resize);
|
141
|
+
resize(); // Fire it initially too
|
142
|
+
|
143
|
+
return overlay;
|
144
|
+
},
|
145
|
+
|
146
|
+
toggle: function(event, state, duration)
|
147
|
+
{
|
148
|
+
// Make sure default event hasn't been prevented
|
149
|
+
if(event && event.isDefaultPrevented()) { return self; }
|
150
|
+
|
151
|
+
var effect = options.effect,
|
152
|
+
type = state ? 'show': 'hide',
|
153
|
+
visible = overlay.is(':visible'),
|
154
|
+
modals = $('[' + attr + ']').filter(':visible').not(tooltip),
|
155
|
+
zindex;
|
156
|
+
|
157
|
+
// Create our overlay if it isn't present already
|
158
|
+
if(!overlay) { overlay = self.create(); }
|
159
|
+
|
160
|
+
// Prevent modal from conflicting with show.solo, and don't hide backdrop is other modals are visible
|
161
|
+
if((overlay.is(':animated') && visible === state) || (!state && modals.length)) { return self; }
|
162
|
+
|
163
|
+
// State specific...
|
164
|
+
if(state) {
|
165
|
+
// Set position
|
166
|
+
overlay.css({ left: 0, top: 0 });
|
167
|
+
|
168
|
+
// Toggle backdrop cursor style on show
|
169
|
+
overlay.toggleClass('blurs', options.blur);
|
170
|
+
|
171
|
+
// Make sure we can't focus anything outside the tooltip
|
172
|
+
docBody.bind('focusin'+namespace, function(event) {
|
173
|
+
var target = $(event.target),
|
174
|
+
container = target.closest('.qtip'),
|
175
|
+
|
176
|
+
// Determine if input container target is above this
|
177
|
+
targetOnTop = container.length < 1 ? FALSE :
|
178
|
+
(parseInt(container[0].style.zIndex, 10) > parseInt(tooltip[0].style.zIndex, 10));
|
179
|
+
|
180
|
+
// If we're showing a modal, but focus has landed on an input below
|
181
|
+
// this modal, divert focus to the first visible input in this modal
|
182
|
+
if(!targetOnTop && ($(event.target).closest(selector)[0] !== tooltip[0])) {
|
183
|
+
tooltip.find('input:visible').filter(':first').focus();
|
184
|
+
}
|
185
|
+
});
|
186
|
+
}
|
187
|
+
else {
|
188
|
+
// Undelegate focus handler
|
189
|
+
docBody.undelegate('*', 'focusin'+namespace);
|
190
|
+
}
|
191
|
+
|
192
|
+
// Stop all animations
|
193
|
+
overlay.stop(TRUE, FALSE);
|
194
|
+
|
195
|
+
// Use custom function if provided
|
196
|
+
if($.isFunction(effect)) {
|
197
|
+
effect.call(overlay, state);
|
198
|
+
}
|
199
|
+
|
200
|
+
// If no effect type is supplied, use a simple toggle
|
201
|
+
else if(effect === FALSE) {
|
202
|
+
overlay[ type ]();
|
203
|
+
}
|
204
|
+
|
205
|
+
// Use basic fade function
|
206
|
+
else {
|
207
|
+
overlay.fadeTo( parseInt(duration, 10) || 90, state ? 1 : 0, function() {
|
208
|
+
if(!state) { $(this).hide(); }
|
209
|
+
});
|
210
|
+
}
|
211
|
+
|
212
|
+
// Reset position on hide
|
213
|
+
if(!state) {
|
214
|
+
overlay.queue(function(next) {
|
215
|
+
overlay.css({ left: '', top: '' });
|
216
|
+
next();
|
217
|
+
});
|
218
|
+
}
|
219
|
+
|
220
|
+
return self;
|
221
|
+
},
|
222
|
+
|
223
|
+
show: function(event, duration) { return self.toggle(event, TRUE, duration); },
|
224
|
+
hide: function(event, duration) { return self.toggle(event, FALSE, duration); },
|
225
|
+
|
226
|
+
destroy: function()
|
227
|
+
{
|
228
|
+
var delBlanket = overlay;
|
229
|
+
|
230
|
+
if(delBlanket) {
|
231
|
+
// Check if any other modal tooltips are present
|
232
|
+
delBlanket = $('[' + attr + ']').not(tooltip).length < 1;
|
233
|
+
|
234
|
+
// Remove overlay if needed
|
235
|
+
if(delBlanket) {
|
236
|
+
elems.overlay.remove();
|
237
|
+
$(window).unbind(globalNamespace);
|
238
|
+
}
|
239
|
+
else {
|
240
|
+
elems.overlay.unbind(globalNamespace+api.id);
|
241
|
+
}
|
242
|
+
|
243
|
+
// Undelegate focus handler
|
244
|
+
docBody.undelegate('*', 'focusin'+namespace);
|
245
|
+
}
|
246
|
+
|
247
|
+
// Remove bound events
|
248
|
+
return tooltip.removeAttr(attr).unbind(globalNamespace);
|
249
|
+
}
|
250
|
+
});
|
251
|
+
|
252
|
+
self.init();
|
253
|
+
}
|
254
|
+
|
255
|
+
PLUGINS.modal = function(api) {
|
256
|
+
var self = api.plugins.modal;
|
257
|
+
|
258
|
+
return 'object' === typeof self ? self : (api.plugins.modal = new Modal(api));
|
259
|
+
};
|
260
|
+
|
261
|
+
// Plugin needs to be initialized on render
|
262
|
+
PLUGINS.modal.initialize = 'render';
|
263
|
+
|
264
|
+
// Setup sanitiztion rules
|
265
|
+
PLUGINS.modal.sanitize = function(opts) {
|
266
|
+
if(opts.show) {
|
267
|
+
if(typeof opts.show.modal !== 'object') { opts.show.modal = { on: !!opts.show.modal }; }
|
268
|
+
else if(typeof opts.show.modal.on === 'undefined') { opts.show.modal.on = TRUE; }
|
269
|
+
}
|
270
|
+
};
|
271
|
+
|
272
|
+
// Base z-index for all modal tooltips (use qTip core z-index as a base)
|
273
|
+
PLUGINS.modal.zindex = QTIP.zindex + 1000;
|
274
|
+
|
275
|
+
// Extend original api defaults
|
276
|
+
$.extend(TRUE, QTIP.defaults, {
|
277
|
+
show: {
|
278
|
+
modal: {
|
279
|
+
on: FALSE,
|
280
|
+
effect: TRUE,
|
281
|
+
blur: TRUE,
|
282
|
+
escape: TRUE
|
283
|
+
}
|
284
|
+
}
|
285
|
+
});
|
286
|
+
|