jquery-qtip2-rails 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +16 -13
- data/jquery-qtip2-rails.gemspec +7 -4
- data/lib/jquery-qtip2-rails/version.rb +1 -1
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +16 -0
- data/test/dummy/app/assets/javascripts/home.js +48 -0
- data/test/dummy/app/assets/stylesheets/application.css +14 -0
- data/test/dummy/app/assets/stylesheets/home.css +4 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/controllers/home_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/helpers/home_helper.rb +2 -0
- data/test/dummy/app/mailers/.gitkeep +0 -0
- data/test/dummy/app/models/.gitkeep +0 -0
- data/test/dummy/app/views/home/index.html.erb +14 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +68 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +31 -0
- data/test/dummy/config/environments/production.rb +64 -0
- data/test/dummy/config/environments/test.rb +35 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +10 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +3 -0
- data/test/dummy/lib/assets/.gitkeep +0 -0
- data/test/dummy/log/.gitkeep +0 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/vendor/assets/jquery-qtip/jquery-qtip/src/ajax/ajax.js +3 -2
- data/vendor/assets/jquery-qtip/jquery-qtip/src/{styles.css → basic.css} +0 -0
- data/vendor/assets/jquery-qtip/jquery-qtip/src/core.css +27 -22
- data/vendor/assets/jquery-qtip/jquery-qtip/src/core.js +162 -315
- data/vendor/assets/jquery-qtip/jquery-qtip/src/{extra.css → css3.css} +70 -30
- data/vendor/assets/jquery-qtip/jquery-qtip/src/imagemap/imagemap.js +59 -45
- data/vendor/assets/jquery-qtip/jquery-qtip/src/intro.js +31 -29
- data/vendor/assets/jquery-qtip/jquery-qtip/src/modal/modal.js +7 -5
- data/vendor/assets/jquery-qtip/jquery-qtip/src/outro.js +2 -2
- data/vendor/assets/jquery-qtip/jquery-qtip/src/svg/svg.js +8 -8
- data/vendor/assets/jquery-qtip/jquery-qtip/src/tips/tips.css +7 -3
- data/vendor/assets/jquery-qtip/jquery-qtip/src/tips/tips.js +159 -147
- data/vendor/assets/jquery-qtip/jquery-qtip/src/viewport/viewport.js +112 -0
- data/vendor/assets/jquery-qtip/jquery.qtip.basic.css +5 -0
- data/vendor/assets/jquery-qtip/jquery.qtip.basic.js +0 -1
- data/vendor/assets/jquery-qtip/jquery.qtip.css +3 -4
- data/vendor/assets/jquery-qtip/jquery.qtip.js +5 -5
- metadata +103 -8
- data/vendor/assets/jquery-qtip/jquery-qtip/src/header.txt +0 -14
File without changes
|
@@ -0,0 +1,6 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
3
|
+
|
4
|
+
APP_PATH = File.expand_path('../../config/application', __FILE__)
|
5
|
+
require File.expand_path('../../config/boot', __FILE__)
|
6
|
+
require 'rails/commands'
|
@@ -40,7 +40,7 @@ function Ajax(api)
|
|
40
40
|
load: function(event) {
|
41
41
|
if(stop) {stop = FALSE; return; }
|
42
42
|
|
43
|
-
var hasSelector = opts.url.
|
43
|
+
var hasSelector = opts.url.lastIndexOf(' '),
|
44
44
|
url = opts.url,
|
45
45
|
selector,
|
46
46
|
hideFirst = !opts.loading && first;
|
@@ -86,7 +86,8 @@ function Ajax(api)
|
|
86
86
|
// Don't proceed if tooltip is destroyed
|
87
87
|
if(api.destroyed) { return; }
|
88
88
|
|
89
|
-
|
89
|
+
// If URL contains a selector
|
90
|
+
if(selector && 'string' === typeof content) {
|
90
91
|
// Create a dummy div to hold the results and grab the selector element
|
91
92
|
content = $('<div/>')
|
92
93
|
// inject the contents of the document in, removing the scripts
|
File without changes
|
@@ -1,3 +1,20 @@
|
|
1
|
+
/* Fluid class for determining actual width in IE */
|
2
|
+
#qtip-rcontainer{
|
3
|
+
position: absolute;
|
4
|
+
left: -28000px;
|
5
|
+
top: -28000px;
|
6
|
+
display: block;
|
7
|
+
visibility: hidden;
|
8
|
+
}
|
9
|
+
|
10
|
+
/* Fluid class for determining actual width in IE */
|
11
|
+
#qtip-rcontainer .ui-tooltip{
|
12
|
+
display: block !important;
|
13
|
+
visibility: hidden !important;
|
14
|
+
position: static !important;
|
15
|
+
float: left !important;
|
16
|
+
}
|
17
|
+
|
1
18
|
/* Core qTip styles */
|
2
19
|
.ui-tooltip, .qtip{
|
3
20
|
position: absolute;
|
@@ -10,19 +27,8 @@
|
|
10
27
|
|
11
28
|
font-size: 10.5px;
|
12
29
|
line-height: 12px;
|
13
|
-
|
14
|
-
border-width: 1px;
|
15
|
-
border-style: solid;
|
16
30
|
}
|
17
31
|
|
18
|
-
/* Fluid class for determining actual width in IE */
|
19
|
-
.ui-tooltip-fluid{
|
20
|
-
display: block;
|
21
|
-
visibility: hidden;
|
22
|
-
position: static !important;
|
23
|
-
float: left !important;
|
24
|
-
}
|
25
|
-
|
26
32
|
.ui-tooltip-content{
|
27
33
|
position: relative;
|
28
34
|
padding: 5px 9px;
|
@@ -30,7 +36,6 @@
|
|
30
36
|
|
31
37
|
text-align: left;
|
32
38
|
word-wrap: break-word;
|
33
|
-
overflow: hidden;
|
34
39
|
}
|
35
40
|
|
36
41
|
.ui-tooltip-titlebar{
|
@@ -43,9 +48,9 @@
|
|
43
48
|
font-weight: bold;
|
44
49
|
}
|
45
50
|
|
46
|
-
.ui-tooltip-titlebar + .ui-tooltip-content{ border-top-width:
|
51
|
+
.ui-tooltip-titlebar + .ui-tooltip-content{ border-top-width: 0 !important; }
|
47
52
|
|
48
|
-
|
53
|
+
/* Default close button class */
|
49
54
|
.ui-tooltip-titlebar .ui-state-default{
|
50
55
|
position: absolute;
|
51
56
|
right: 4px;
|
@@ -65,12 +70,14 @@
|
|
65
70
|
.ui-tooltip-icon .ui-icon{
|
66
71
|
display: block;
|
67
72
|
text-indent: -1000em;
|
73
|
+
direction: ltr;
|
68
74
|
}
|
69
75
|
|
70
76
|
.ui-tooltip-icon, .ui-tooltip-icon .ui-icon{
|
71
77
|
-moz-border-radius: 3px;
|
72
78
|
-webkit-border-radius: 3px;
|
73
79
|
border-radius: 3px;
|
80
|
+
text-decoration: none;
|
74
81
|
}
|
75
82
|
|
76
83
|
.ui-tooltip-icon .ui-icon{
|
@@ -87,19 +94,17 @@
|
|
87
94
|
|
88
95
|
|
89
96
|
/* Applied to 'focused' tooltips e.g. most recently displayed/interacted with */
|
90
|
-
.ui-tooltip-focus{
|
91
|
-
|
92
|
-
}
|
97
|
+
.ui-tooltip-focus{}
|
93
98
|
|
94
99
|
/* Applied on hover of tooltips i.e. added/removed on mouseenter/mouseleave respectively */
|
95
|
-
.ui-tooltip-hover{
|
96
|
-
|
97
|
-
}
|
98
|
-
|
100
|
+
.ui-tooltip-hover{}
|
99
101
|
|
100
|
-
|
102
|
+
/* Default tooltip style */
|
101
103
|
.ui-tooltip-default{
|
104
|
+
border-width: 1px;
|
105
|
+
border-style: solid;
|
102
106
|
border-color: #F1D031;
|
107
|
+
|
103
108
|
background-color: #FFFFA3;
|
104
109
|
color: #555;
|
105
110
|
}
|
@@ -1,79 +1,49 @@
|
|
1
1
|
// Option object sanitizer
|
2
2
|
function sanitizeOptions(opts)
|
3
3
|
{
|
4
|
-
var
|
4
|
+
var invalid = function(a) { return a === NULL || 'object' !== typeof a; },
|
5
|
+
invalidContent = function(c) { return !$.isFunction(c) && ((!c && !c.attr) || c.length < 1 || ('object' === typeof c && !c.jquery)); };
|
5
6
|
|
6
7
|
if(!opts || 'object' !== typeof opts) { return FALSE; }
|
7
8
|
|
8
|
-
if(opts.metadata
|
9
|
-
opts.metadata = {
|
10
|
-
type: opts.metadata
|
11
|
-
};
|
9
|
+
if(invalid(opts.metadata)) {
|
10
|
+
opts.metadata = { type: opts.metadata };
|
12
11
|
}
|
13
12
|
|
14
13
|
if('content' in opts) {
|
15
|
-
if(opts.content
|
16
|
-
opts.content = {
|
17
|
-
text: opts.content
|
18
|
-
};
|
14
|
+
if(invalid(opts.content) || opts.content.jquery) {
|
15
|
+
opts.content = { text: opts.content };
|
19
16
|
}
|
20
17
|
|
21
|
-
|
22
|
-
if(!$.isFunction(content) && ((!content && !content.attr) || content.length < 1 || ('object' === typeof content && !content.jquery))) {
|
18
|
+
if(invalidContent(opts.content.text || FALSE)) {
|
23
19
|
opts.content.text = FALSE;
|
24
20
|
}
|
25
21
|
|
26
22
|
if('title' in opts.content) {
|
27
|
-
if(opts.content.title
|
28
|
-
opts.content.title = {
|
29
|
-
text: opts.content.title
|
30
|
-
};
|
23
|
+
if(invalid(opts.content.title)) {
|
24
|
+
opts.content.title = { text: opts.content.title };
|
31
25
|
}
|
32
26
|
|
33
|
-
|
34
|
-
if(!$.isFunction(content) && ((!content && !content.attr) || content.length < 1 || ('object' === typeof content && !content.jquery))) {
|
27
|
+
if(invalidContent(opts.content.title.text || FALSE)) {
|
35
28
|
opts.content.title.text = FALSE;
|
36
29
|
}
|
37
30
|
}
|
38
31
|
}
|
39
32
|
|
40
|
-
if('position' in opts) {
|
41
|
-
|
42
|
-
opts.position = {
|
43
|
-
my: opts.position,
|
44
|
-
at: opts.position
|
45
|
-
};
|
46
|
-
}
|
33
|
+
if('position' in opts && invalid(opts.position)) {
|
34
|
+
opts.position = { my: opts.position, at: opts.position };
|
47
35
|
}
|
48
36
|
|
49
|
-
if('show' in opts) {
|
50
|
-
|
51
|
-
if(opts.show.jquery) {
|
52
|
-
opts.show = { target: opts.show };
|
53
|
-
}
|
54
|
-
else {
|
55
|
-
opts.show = { event: opts.show };
|
56
|
-
}
|
57
|
-
}
|
37
|
+
if('show' in opts && invalid(opts.show)) {
|
38
|
+
opts.show = opts.show.jquery ? { target: opts.show } : { event: opts.show };
|
58
39
|
}
|
59
40
|
|
60
|
-
if('hide' in opts) {
|
61
|
-
|
62
|
-
if(opts.hide.jquery) {
|
63
|
-
opts.hide = { target: opts.hide };
|
64
|
-
}
|
65
|
-
else {
|
66
|
-
opts.hide = { event: opts.hide };
|
67
|
-
}
|
68
|
-
}
|
41
|
+
if('hide' in opts && invalid(opts.hide)) {
|
42
|
+
opts.hide = opts.hide.jquery ? { target: opts.hide } : { event: opts.hide };
|
69
43
|
}
|
70
44
|
|
71
|
-
if('style' in opts) {
|
72
|
-
|
73
|
-
opts.style = {
|
74
|
-
classes: opts.style
|
75
|
-
};
|
76
|
-
}
|
45
|
+
if('style' in opts && invalid(opts.style)) {
|
46
|
+
opts.style = { classes: opts.style };
|
77
47
|
}
|
78
48
|
|
79
49
|
// Sanitize plugin options
|
@@ -113,7 +83,8 @@ function QTip(target, options, id, attr)
|
|
113
83
|
target: $(),
|
114
84
|
disabled: FALSE,
|
115
85
|
attr: attr,
|
116
|
-
onTarget: FALSE
|
86
|
+
onTarget: FALSE,
|
87
|
+
lastClass: ''
|
117
88
|
};
|
118
89
|
|
119
90
|
/*
|
@@ -134,16 +105,28 @@ function QTip(target, options, id, attr)
|
|
134
105
|
return [obj || options, levels.pop()];
|
135
106
|
}
|
136
107
|
|
137
|
-
function
|
108
|
+
function triggerEvent(type, args, event) {
|
109
|
+
var callback = $.Event('tooltip'+type);
|
110
|
+
callback.originalEvent = (event ? $.extend({}, event) : NULL) || cache.event || NULL;
|
111
|
+
tooltip.trigger(callback, [self].concat(args || []));
|
112
|
+
|
113
|
+
return !callback.isDefaultPrevented();
|
114
|
+
}
|
115
|
+
|
116
|
+
function setWidget()
|
117
|
+
{
|
138
118
|
var on = options.style.widget;
|
139
119
|
|
140
|
-
tooltip.toggleClass(widget, on).toggleClass(defaultClass, options.style.def && !on);
|
141
|
-
elements.content.toggleClass(widget+'-content', on);
|
120
|
+
tooltip.toggleClass('ui-helper-reset '+widget, on).toggleClass(defaultClass, options.style.def && !on);
|
142
121
|
|
143
|
-
if(elements.
|
122
|
+
if(elements.content) {
|
123
|
+
elements.content.toggleClass(widget+'-content', on);
|
124
|
+
}
|
125
|
+
|
126
|
+
if(elements.titlebar) {
|
144
127
|
elements.titlebar.toggleClass(widget+'-header', on);
|
145
128
|
}
|
146
|
-
if(elements.button){
|
129
|
+
if(elements.button) {
|
147
130
|
elements.button.toggleClass(uitooltip+'-icon', !on);
|
148
131
|
}
|
149
132
|
}
|
@@ -355,10 +338,10 @@ function QTip(target, options, id, attr)
|
|
355
338
|
}
|
356
339
|
|
357
340
|
/*
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
341
|
+
* If we're still rendering... insert into 'fx' queue our image dimension
|
342
|
+
* checker which will halt the showing of the tooltip until image dimensions
|
343
|
+
* can be detected properly.
|
344
|
+
*/
|
362
345
|
if(self.rendered < 0) { tooltip.queue('fx', detectImages); }
|
363
346
|
|
364
347
|
// We're fully rendered, so reset isDrawing flag and proceed without queue delay
|
@@ -452,6 +435,16 @@ function QTip(target, options, id, attr)
|
|
452
435
|
tooltip.toggleClass(hoverClass, state);
|
453
436
|
});
|
454
437
|
|
438
|
+
// If using mouseout/mouseleave as a hide event...
|
439
|
+
if(/mouse(out|leave)/i.test(options.hide.event)) {
|
440
|
+
// Hide tooltips when leaving current window/frame (but not select/option elements)
|
441
|
+
if(options.hide.leave === 'window') {
|
442
|
+
targets.window.bind('mouseout'+namespace+' blur'+namespace, function(event) {
|
443
|
+
if(!/select|option/.test(event.target.nodeName) && !event.relatedTarget) { self.hide(event); }
|
444
|
+
});
|
445
|
+
}
|
446
|
+
}
|
447
|
+
|
455
448
|
// Enable hide.fixed
|
456
449
|
if(options.hide.fixed) {
|
457
450
|
// Add tooltip as a hide target
|
@@ -463,20 +456,10 @@ function QTip(target, options, id, attr)
|
|
463
456
|
});
|
464
457
|
}
|
465
458
|
|
466
|
-
// If using mouseout/mouseleave as a hide event...
|
467
|
-
if(/mouse(out|leave)/i.test(options.hide.event)) {
|
468
|
-
// Hide tooltips when leaving current window/frame (but not select/option elements)
|
469
|
-
if(options.hide.leave === 'window') {
|
470
|
-
targets.window.bind('mouseout'+namespace+' blur'+namespace, function(event) {
|
471
|
-
if(/select|option/.test(event.target) && !event.relatedTarget) { self.hide(event); }
|
472
|
-
});
|
473
|
-
}
|
474
|
-
}
|
475
|
-
|
476
459
|
/*
|
477
|
-
|
478
|
-
|
479
|
-
|
460
|
+
* Make sure hoverIntent functions properly by using mouseleave to clear show timer if
|
461
|
+
* mouseenter/mouseout is used for show.event, even if it isn't in the users options.
|
462
|
+
*/
|
480
463
|
else if(/mouse(over|enter)/i.test(options.show.event)) {
|
481
464
|
targets.hide.bind('mouseleave'+namespace, function(event) {
|
482
465
|
clearTimeout(self.timers.show);
|
@@ -601,6 +584,7 @@ function QTip(target, options, id, attr)
|
|
601
584
|
self.rendered && elements.tooltip[0],
|
602
585
|
options.position.container[0],
|
603
586
|
options.position.viewport[0],
|
587
|
+
options.position.container.closest('html')[0], // unfocus
|
604
588
|
window,
|
605
589
|
document
|
606
590
|
];
|
@@ -659,7 +643,7 @@ function QTip(target, options, id, attr)
|
|
659
643
|
|
660
644
|
// Style checks
|
661
645
|
'^style.classes$': function(obj, o, v) {
|
662
|
-
tooltip.attr('class', uitooltip + ' qtip
|
646
|
+
tooltip.attr('class', uitooltip + ' qtip ' + v);
|
663
647
|
},
|
664
648
|
'^style.widget|content.title': setWidget,
|
665
649
|
|
@@ -690,8 +674,7 @@ function QTip(target, options, id, attr)
|
|
690
674
|
|
691
675
|
var text = options.content.text,
|
692
676
|
title = options.content.title.text,
|
693
|
-
posOptions = options.position
|
694
|
-
callback = $.Event('tooltiprender');
|
677
|
+
posOptions = options.position;
|
695
678
|
|
696
679
|
// Add ARIA attributes to target
|
697
680
|
$.attr(target[0], 'aria-describedby', tooltipID);
|
@@ -699,7 +682,7 @@ function QTip(target, options, id, attr)
|
|
699
682
|
// Create tooltip element
|
700
683
|
tooltip = elements.tooltip = $('<div/>', {
|
701
684
|
'id': tooltipID,
|
702
|
-
'class': uitooltip + ' qtip
|
685
|
+
'class': uitooltip + ' qtip ' + defaultClass + ' ' + options.style.classes + ' '+ uitooltip + '-pos-' + options.position.my.abbrev(),
|
703
686
|
'width': options.style.width || '',
|
704
687
|
'height': options.style.height || '',
|
705
688
|
'tracking': posOptions.target === 'mouse' && posOptions.adjust.mouse,
|
@@ -758,14 +741,13 @@ function QTip(target, options, id, attr)
|
|
758
741
|
assignEvents();
|
759
742
|
|
760
743
|
/* Queue this part of the render process in our fx queue so we can
|
761
|
-
|
762
|
-
|
763
|
-
|
744
|
+
* load images before the tooltip renders fully.
|
745
|
+
*
|
746
|
+
* See: updateContent method
|
764
747
|
*/
|
765
748
|
tooltip.queue('fx', function(next) {
|
766
|
-
//
|
767
|
-
|
768
|
-
tooltip.trigger(callback, [self]);
|
749
|
+
// tooltiprender event
|
750
|
+
triggerEvent('render');
|
769
751
|
|
770
752
|
// Reset flags
|
771
753
|
isDrawing = 0; isPositioning = 0;
|
@@ -858,10 +840,10 @@ function QTip(target, options, id, attr)
|
|
858
840
|
sanitizeOptions(options);
|
859
841
|
|
860
842
|
/*
|
861
|
-
|
862
|
-
|
863
|
-
|
864
|
-
|
843
|
+
* Execute any valid callbacks for the set options
|
844
|
+
* Also set isPositioning/isDrawing so we don't get loads of redundant repositioning
|
845
|
+
* and redraw calls.
|
846
|
+
*/
|
865
847
|
isPositioning = isDrawing = 1; $.each(option, callback); isPositioning = isDrawing = 0;
|
866
848
|
|
867
849
|
// Update position / redraw if needed
|
@@ -888,7 +870,7 @@ function QTip(target, options, id, attr)
|
|
888
870
|
visible = tooltip[0].offsetWidth > 0,
|
889
871
|
animate = state || opts.target.length === 1,
|
890
872
|
sameTarget = !event || opts.target.length < 2 || cache.target[0] === event.target,
|
891
|
-
|
873
|
+
showEvent, delay;
|
892
874
|
|
893
875
|
// Detect state if valid one isn't provided
|
894
876
|
if((typeof state).search('boolean|number')) { state = !visible; }
|
@@ -908,11 +890,8 @@ function QTip(target, options, id, attr)
|
|
908
890
|
cache.event = $.extend({}, event);
|
909
891
|
}
|
910
892
|
|
911
|
-
//
|
912
|
-
|
913
|
-
callback.originalEvent = event ? cache.event : NULL;
|
914
|
-
tooltip.trigger(callback, [self, 90]);
|
915
|
-
if(callback.isDefaultPrevented()){ return self; }
|
893
|
+
// tooltipshow/tooltiphide events
|
894
|
+
if(!triggerEvent(type, [90])) { return self; }
|
916
895
|
|
917
896
|
// Set ARIA hidden status attribute
|
918
897
|
$.attr(tooltip[0], 'aria-hidden', !!!state);
|
@@ -940,8 +919,10 @@ function QTip(target, options, id, attr)
|
|
940
919
|
// Update the tooltip position
|
941
920
|
self.reposition(event, arguments[2]);
|
942
921
|
|
943
|
-
// Hide other tooltips if tooltip is solo
|
944
|
-
if(
|
922
|
+
// Hide other tooltips if tooltip is solo
|
923
|
+
if(!!opts.solo) {
|
924
|
+
$(selector, opts.solo).not(tooltip).qtip('hide', $.Event('tooltipsolo'));
|
925
|
+
}
|
945
926
|
}
|
946
927
|
else {
|
947
928
|
// Clear show timer if we're hiding
|
@@ -988,10 +969,8 @@ function QTip(target, options, id, attr)
|
|
988
969
|
});
|
989
970
|
}
|
990
971
|
|
991
|
-
//
|
992
|
-
|
993
|
-
callback.originalEvent = event ? cache.event : NULL;
|
994
|
-
tooltip.trigger(callback, [self]);
|
972
|
+
// tooltipvisible/tooltiphidden events
|
973
|
+
triggerEvent(state ? 'visible' : 'hidden');
|
995
974
|
}
|
996
975
|
|
997
976
|
// If no effect type is supplied, use a simple toggle
|
@@ -1028,18 +1007,13 @@ function QTip(target, options, id, attr)
|
|
1028
1007
|
curIndex = parseInt(tooltip[0].style.zIndex, 10),
|
1029
1008
|
newIndex = QTIP.zindex + qtips.length,
|
1030
1009
|
cachedEvent = $.extend({}, event),
|
1031
|
-
focusedElem
|
1010
|
+
focusedElem;
|
1032
1011
|
|
1033
1012
|
// Only update the z-index if it has changed and tooltip is not already focused
|
1034
1013
|
if(!tooltip.hasClass(focusClass))
|
1035
1014
|
{
|
1036
|
-
//
|
1037
|
-
|
1038
|
-
callback.originalEvent = cachedEvent;
|
1039
|
-
tooltip.trigger(callback, [self, newIndex]);
|
1040
|
-
|
1041
|
-
// If default action wasn't prevented...
|
1042
|
-
if(!callback.isDefaultPrevented()) {
|
1015
|
+
// tooltipfocus event
|
1016
|
+
if(triggerEvent('focus', [newIndex], cachedEvent)) {
|
1043
1017
|
// Only update z-index's if they've changed
|
1044
1018
|
if(curIndex !== newIndex) {
|
1045
1019
|
// Reduce our z-index's and keep them properly ordered
|
@@ -1062,16 +1036,11 @@ function QTip(target, options, id, attr)
|
|
1062
1036
|
},
|
1063
1037
|
|
1064
1038
|
blur: function(event) {
|
1065
|
-
var cachedEvent = $.extend({}, event),
|
1066
|
-
callback;
|
1067
|
-
|
1068
1039
|
// Set focused status to FALSE
|
1069
1040
|
tooltip.removeClass(focusClass);
|
1070
1041
|
|
1071
|
-
//
|
1072
|
-
|
1073
|
-
callback.originalEvent = cachedEvent;
|
1074
|
-
tooltip.trigger(callback, [self]);
|
1042
|
+
// tooltipblur event
|
1043
|
+
triggerEvent('blur', [tooltip.css('zIndex')], event);
|
1075
1044
|
|
1076
1045
|
return self;
|
1077
1046
|
},
|
@@ -1093,125 +1062,24 @@ function QTip(target, options, id, attr)
|
|
1093
1062
|
elemHeight = tooltip.outerHeight(),
|
1094
1063
|
targetWidth = 0,
|
1095
1064
|
targetHeight = 0,
|
1096
|
-
callback = $.Event('tooltipmove'),
|
1097
1065
|
fixed = tooltip.css('position') === 'fixed',
|
1098
1066
|
viewport = posOptions.viewport,
|
1099
1067
|
position = { left: 0, top: 0 },
|
1100
1068
|
container = posOptions.container,
|
1101
|
-
flipoffset = FALSE,
|
1102
|
-
tip = self.plugins.tip,
|
1103
1069
|
visible = tooltip[0].offsetWidth > 0,
|
1104
|
-
|
1105
|
-
// Axis detection and readjustment indicator
|
1106
|
-
horizontal: method[0],
|
1107
|
-
vertical: (method[1] = method[1] || method[0]),
|
1108
|
-
enabled: viewport.jquery && target[0] !== window && target[0] !== docBody && adjust.method !== 'none',
|
1109
|
-
|
1110
|
-
// Reposition methods
|
1111
|
-
left: function(posLeft) {
|
1112
|
-
var isShift = readjust.horizontal === 'shift',
|
1113
|
-
adjustx = adjust.x * (readjust.horizontal.substr(-6) === 'invert' ? 2 : 0),
|
1114
|
-
viewportScroll = -container.offset.left + viewport.offset.left + viewport.scrollLeft,
|
1115
|
-
myWidth = my.x === 'left' ? elemWidth : my.x === 'right' ? -elemWidth : -elemWidth / 2,
|
1116
|
-
atWidth = at.x === 'left' ? targetWidth : at.x === 'right' ? -targetWidth : -targetWidth / 2,
|
1117
|
-
tipWidth = tip && tip.size ? tip.size.width || 0 : 0,
|
1118
|
-
tipAdjust = tip && tip.corner && tip.corner.precedance === 'x' && !isShift ? tipWidth : 0,
|
1119
|
-
overflowLeft = viewportScroll - posLeft + tipAdjust,
|
1120
|
-
overflowRight = posLeft + elemWidth - viewport.width - viewportScroll + tipAdjust,
|
1121
|
-
offset = myWidth - (my.precedance === 'x' || my.x === my.y ? atWidth : 0) - (at.x === 'center' ? targetWidth / 2 : 0),
|
1122
|
-
isCenter = my.x === 'center';
|
1123
|
-
|
1124
|
-
// Optional 'shift' style repositioning
|
1125
|
-
if(isShift) {
|
1126
|
-
tipAdjust = tip && tip.corner && tip.corner.precedance === 'y' ? tipWidth : 0;
|
1127
|
-
offset = (my.x === 'left' ? 1 : -1) * myWidth - tipAdjust;
|
1128
|
-
|
1129
|
-
// Adjust position but keep it within viewport dimensions
|
1130
|
-
position.left += overflowLeft > 0 ? overflowLeft : overflowRight > 0 ? -overflowRight : 0;
|
1131
|
-
position.left = Math.max(
|
1132
|
-
-container.offset.left + viewport.offset.left + (tipAdjust && tip.corner.x === 'center' ? tip.offset : 0),
|
1133
|
-
posLeft - offset,
|
1134
|
-
Math.min(
|
1135
|
-
Math.max(-container.offset.left + viewport.offset.left + viewport.width, posLeft + offset),
|
1136
|
-
position.left
|
1137
|
-
)
|
1138
|
-
);
|
1139
|
-
}
|
1140
|
-
|
1141
|
-
// Default 'flip' repositioning
|
1142
|
-
else {
|
1143
|
-
if(overflowLeft > 0 && (my.x !== 'left' || overflowRight > 0)) {
|
1144
|
-
position.left -= offset + adjustx;
|
1145
|
-
}
|
1146
|
-
else if(overflowRight > 0 && (my.x !== 'right' || overflowLeft > 0) ) {
|
1147
|
-
position.left -= (isCenter ? -offset : offset) + adjustx;
|
1148
|
-
}
|
1149
|
-
|
1150
|
-
// Make sure we haven't made things worse with the adjustment and return the adjusted difference
|
1151
|
-
if(position.left < viewportScroll && -position.left > overflowRight) { position.left = posLeft; }
|
1152
|
-
}
|
1153
|
-
|
1154
|
-
return position.left - posLeft;
|
1155
|
-
},
|
1156
|
-
top: function(posTop) {
|
1157
|
-
var isShift = readjust.vertical === 'shift',
|
1158
|
-
adjusty = adjust.y * (readjust.vertical.substr(-6) === 'invert' ? 2 : 0),
|
1159
|
-
viewportScroll = -container.offset.top + viewport.offset.top + viewport.scrollTop,
|
1160
|
-
myHeight = my.y === 'top' ? elemHeight : my.y === 'bottom' ? -elemHeight : -elemHeight / 2,
|
1161
|
-
atHeight = at.y === 'top' ? targetHeight : at.y === 'bottom' ? -targetHeight : -targetHeight / 2,
|
1162
|
-
tipHeight = tip && tip.size ? tip.size.height || 0 : 0,
|
1163
|
-
tipAdjust = tip && tip.corner && tip.corner.precedance === 'y' && !isShift ? tipHeight : 0,
|
1164
|
-
overflowTop = viewportScroll - posTop + tipAdjust,
|
1165
|
-
overflowBottom = posTop + elemHeight - viewport.height - viewportScroll + tipAdjust,
|
1166
|
-
offset = myHeight - (my.precedance === 'y' || my.x === my.y ? atHeight : 0) - (at.y === 'center' ? targetHeight / 2 : 0),
|
1167
|
-
isCenter = my.y === 'center';
|
1168
|
-
|
1169
|
-
// Optional 'shift' style repositioning
|
1170
|
-
if(isShift) {
|
1171
|
-
tipAdjust = tip && tip.corner && tip.corner.precedance === 'x' ? tipHeight : 0;
|
1172
|
-
offset = (my.y === 'top' ? 1 : -1) * myHeight - tipAdjust;
|
1173
|
-
|
1174
|
-
// Adjust position but keep it within viewport dimensions
|
1175
|
-
position.top += overflowTop > 0 ? overflowTop : overflowBottom > 0 ? -overflowBottom : 0;
|
1176
|
-
position.top = Math.max(
|
1177
|
-
-container.offset.top + viewport.offset.top + (tipAdjust && tip.corner.x === 'center' ? tip.offset : 0),
|
1178
|
-
posTop - offset,
|
1179
|
-
Math.min(
|
1180
|
-
Math.max(-container.offset.top + viewport.offset.top + viewport.height, posTop + offset),
|
1181
|
-
position.top
|
1182
|
-
)
|
1183
|
-
);
|
1184
|
-
}
|
1185
|
-
|
1186
|
-
// Default 'flip' repositioning
|
1187
|
-
else {
|
1188
|
-
if(overflowTop > 0 && (my.y !== 'top' || overflowBottom > 0)) {
|
1189
|
-
position.top -= offset + adjusty;
|
1190
|
-
}
|
1191
|
-
else if(overflowBottom > 0 && (my.y !== 'bottom' || overflowTop > 0) ) {
|
1192
|
-
position.top -= (isCenter ? -offset : offset) + adjusty;
|
1193
|
-
}
|
1194
|
-
|
1195
|
-
// Make sure we haven't made things worse with the adjustment and return the adjusted difference
|
1196
|
-
if(position.top < 0 && -position.top > overflowBottom) { position.top = posTop; }
|
1197
|
-
}
|
1198
|
-
|
1199
|
-
return position.top - posTop;
|
1200
|
-
}
|
1201
|
-
},
|
1202
|
-
win;
|
1070
|
+
adjusted, offset, win;
|
1203
1071
|
|
1204
1072
|
// Check if absolute position was passed
|
1205
1073
|
if($.isArray(target) && target.length === 2) {
|
1206
1074
|
// Force left top and set position
|
1207
|
-
at = { x:
|
1075
|
+
at = { x: LEFT, y: TOP };
|
1208
1076
|
position = { left: target[0], top: target[1] };
|
1209
1077
|
}
|
1210
1078
|
|
1211
1079
|
// Check if mouse was the target
|
1212
1080
|
else if(target === 'mouse' && ((event && event.pageX) || cache.event.pageX)) {
|
1213
1081
|
// Force left top to allow flipping
|
1214
|
-
at = { x:
|
1082
|
+
at = { x: LEFT, y: TOP };
|
1215
1083
|
|
1216
1084
|
// Use cached event if one isn't available for positioning
|
1217
1085
|
event = (event && (event.type === 'resize' || event.type === 'scroll') ? cache.event :
|
@@ -1227,17 +1095,13 @@ function QTip(target, options, id, attr)
|
|
1227
1095
|
// Target wasn't mouse or absolute...
|
1228
1096
|
else {
|
1229
1097
|
// Check if event targetting is being used
|
1230
|
-
if(target === 'event') {
|
1231
|
-
|
1232
|
-
target = cache.target = $(event.target);
|
1233
|
-
}
|
1234
|
-
else {
|
1235
|
-
target = cache.target;
|
1236
|
-
}
|
1098
|
+
if(target === 'event' && event && event.target && event.type !== 'scroll' && event.type !== 'resize') {
|
1099
|
+
cache.target = $(event.target);
|
1237
1100
|
}
|
1238
|
-
else {
|
1239
|
-
|
1101
|
+
else if(target !== 'event'){
|
1102
|
+
cache.target = $(target.jquery ? target : elements.target);
|
1240
1103
|
}
|
1104
|
+
target = cache.target;
|
1241
1105
|
|
1242
1106
|
// Parse the target into a jQuery object and make sure there's an element present
|
1243
1107
|
target = $(target).eq(0);
|
@@ -1257,11 +1121,11 @@ function QTip(target, options, id, attr)
|
|
1257
1121
|
}
|
1258
1122
|
|
1259
1123
|
// Use Imagemap/SVG plugins if needed
|
1260
|
-
else if(target.is('area')
|
1261
|
-
|
1124
|
+
else if(PLUGINS.imagemap && target.is('area')) {
|
1125
|
+
adjusted = PLUGINS.imagemap(self, target, at, PLUGINS.viewport ? method : FALSE);
|
1262
1126
|
}
|
1263
|
-
else if(target[0].
|
1264
|
-
|
1127
|
+
else if(PLUGINS.svg && typeof target[0].xmlbase === 'string') {
|
1128
|
+
adjusted = PLUGINS.svg(self, target, at, PLUGINS.viewport ? method : FALSE);
|
1265
1129
|
}
|
1266
1130
|
|
1267
1131
|
else {
|
@@ -1272,11 +1136,11 @@ function QTip(target, options, id, attr)
|
|
1272
1136
|
}
|
1273
1137
|
|
1274
1138
|
// Parse returned plugin values into proper variables
|
1275
|
-
if(
|
1276
|
-
targetWidth =
|
1277
|
-
targetHeight =
|
1278
|
-
|
1279
|
-
position = position
|
1139
|
+
if(adjusted) {
|
1140
|
+
targetWidth = adjusted.width;
|
1141
|
+
targetHeight = adjusted.height;
|
1142
|
+
offset = adjusted.offset;
|
1143
|
+
position = adjusted.position;
|
1280
1144
|
}
|
1281
1145
|
|
1282
1146
|
// Adjust for position.fixed tooltips (and also iOS scroll bug in v3.2-4.0 & v4.3-4.3.2)
|
@@ -1290,55 +1154,30 @@ function QTip(target, options, id, attr)
|
|
1290
1154
|
}
|
1291
1155
|
|
1292
1156
|
// Adjust position relative to target
|
1293
|
-
position.left += at.x ===
|
1294
|
-
position.top += at.y ===
|
1157
|
+
position.left += at.x === RIGHT ? targetWidth : at.x === CENTER ? targetWidth / 2 : 0;
|
1158
|
+
position.top += at.y === BOTTOM ? targetHeight : at.y === CENTER ? targetHeight / 2 : 0;
|
1295
1159
|
}
|
1296
1160
|
|
1297
1161
|
// Adjust position relative to tooltip
|
1298
|
-
position.left += adjust.x + (my.x ===
|
1299
|
-
position.top += adjust.y + (my.y ===
|
1300
|
-
|
1301
|
-
//
|
1302
|
-
if(
|
1303
|
-
|
1304
|
-
|
1305
|
-
|
1306
|
-
height: viewport[ (viewport[0] === window ? 'h' : 'outerH') + 'eight' ](),
|
1307
|
-
width: viewport[ (viewport[0] === window ? 'w' : 'outerW') + 'idth' ](),
|
1308
|
-
scrollLeft: fixed ? 0 : viewport.scrollLeft(),
|
1309
|
-
scrollTop: fixed ? 0 : viewport.scrollTop(),
|
1310
|
-
offset: viewport.offset() || { left: 0, top: 0 }
|
1311
|
-
};
|
1312
|
-
container = {
|
1313
|
-
elem: container,
|
1314
|
-
scrollLeft: container.scrollLeft(),
|
1315
|
-
scrollTop: container.scrollTop(),
|
1316
|
-
offset: container.offset() || { left: 0, top: 0 }
|
1317
|
-
};
|
1318
|
-
|
1319
|
-
// Adjust position based onviewport and adjustment options
|
1320
|
-
position.adjusted = {
|
1321
|
-
left: readjust.horizontal !== 'none' ? readjust.left(position.left) : 0,
|
1322
|
-
top: readjust.vertical !== 'none' ? readjust.top(position.top) : 0
|
1323
|
-
};
|
1324
|
-
|
1325
|
-
// Set tooltip position class
|
1326
|
-
if(position.adjusted.left + position.adjusted.top) {
|
1327
|
-
tooltip.attr('class', tooltip[0].className.replace(/ui-tooltip-pos-\w+/i, uitooltip + '-pos-' + my.abbrev()));
|
1328
|
-
}
|
1162
|
+
position.left += adjust.x + (my.x === RIGHT ? -elemWidth : my.x === CENTER ? -elemWidth / 2 : 0);
|
1163
|
+
position.top += adjust.y + (my.y === BOTTOM ? -elemHeight : my.y === CENTER ? -elemHeight / 2 : 0);
|
1164
|
+
|
1165
|
+
// Use viewport adjustment plugin if enabled
|
1166
|
+
if(PLUGINS.viewport) {
|
1167
|
+
position.adjusted = PLUGINS.viewport(
|
1168
|
+
self, position, posOptions, targetWidth, targetHeight, elemWidth, elemHeight
|
1169
|
+
);
|
1329
1170
|
|
1330
|
-
// Apply
|
1331
|
-
if(
|
1332
|
-
if(
|
1171
|
+
// Apply offsets supplied by positioning plugin (if used)
|
1172
|
+
if(offset && position.adjusted.left) { position.left += offset.left; }
|
1173
|
+
if(offset && position.adjusted.top) { position.top += offset.top; }
|
1333
1174
|
}
|
1334
1175
|
|
1335
|
-
//Viewport adjustment is disabled, set values to zero
|
1176
|
+
// Viewport adjustment is disabled, set values to zero
|
1336
1177
|
else { position.adjusted = { left: 0, top: 0 }; }
|
1337
1178
|
|
1338
|
-
//
|
1339
|
-
|
1340
|
-
tooltip.trigger(callback, [self, position, viewport.elem || viewport]);
|
1341
|
-
if(callback.isDefaultPrevented()){ return self; }
|
1179
|
+
// tooltipmove event
|
1180
|
+
if(!triggerEvent('move', [position, viewport.elem || viewport], event)) { return self; }
|
1342
1181
|
delete position.adjusted;
|
1343
1182
|
|
1344
1183
|
// If effect is disabled, target it mouse, no animation is defined or positioning gives NaN out, set CSS directly
|
@@ -1369,25 +1208,28 @@ function QTip(target, options, id, attr)
|
|
1369
1208
|
{
|
1370
1209
|
if(self.rendered < 1 || isDrawing) { return self; }
|
1371
1210
|
|
1372
|
-
var
|
1211
|
+
var style = options.style,
|
1212
|
+
container = options.position.container,
|
1373
1213
|
perc, width, max, min;
|
1374
1214
|
|
1375
1215
|
// Set drawing flag
|
1376
1216
|
isDrawing = 1;
|
1377
1217
|
|
1378
|
-
//
|
1379
|
-
|
1218
|
+
// tooltipredraw event
|
1219
|
+
triggerEvent('redraw');
|
1380
1220
|
|
1381
|
-
// If tooltip has a set width, just set it... like a boss!
|
1382
|
-
if(
|
1221
|
+
// If tooltip has a set height/width, just set it... like a boss!
|
1222
|
+
if(style.height) { tooltip.css(HEIGHT, style.height); }
|
1223
|
+
if(style.width) { tooltip.css(WIDTH, style.width); }
|
1383
1224
|
|
1384
|
-
//
|
1225
|
+
// Simulate max/min width if not set width present...
|
1385
1226
|
else {
|
1386
1227
|
// Reset width and add fluid class
|
1387
|
-
tooltip.css(
|
1228
|
+
tooltip.css(WIDTH, '').appendTo(redrawContainer);
|
1388
1229
|
|
1389
|
-
// Grab our tooltip width (add 1 so we don't get wrapping problems.. huzzah!)
|
1390
|
-
width = tooltip.width()
|
1230
|
+
// Grab our tooltip width (add 1 if odd so we don't get wrapping problems.. huzzah!)
|
1231
|
+
width = tooltip.width();
|
1232
|
+
if(width % 2 < 1) { width += 1; }
|
1391
1233
|
|
1392
1234
|
// Grab our max/min properties
|
1393
1235
|
max = tooltip.css('max-width') || '';
|
@@ -1402,9 +1244,12 @@ function QTip(target, options, id, attr)
|
|
1402
1244
|
width = max + min ? Math.min(Math.max(width, min), max) : width;
|
1403
1245
|
|
1404
1246
|
// Set the newly calculated width and remvoe fluid class
|
1405
|
-
tooltip.css(
|
1247
|
+
tooltip.css(WIDTH, Math.round(width)).appendTo(container);
|
1406
1248
|
}
|
1407
1249
|
|
1250
|
+
// tooltipredrawn event
|
1251
|
+
triggerEvent('redrawn');
|
1252
|
+
|
1408
1253
|
// Set drawing flag
|
1409
1254
|
isDrawing = 0;
|
1410
1255
|
|
@@ -1501,8 +1346,7 @@ function init(id, opts)
|
|
1501
1346
|
html5 = elem.data(opts.metadata.name || 'qtipopts');
|
1502
1347
|
|
1503
1348
|
// If we don't get an object returned attempt to parse it manualyl without parseJSON
|
1504
|
-
try { html5 = typeof html5 === 'string' ? (
|
1505
|
-
catch(e) { log('Unable to parse HTML5 attribute data: ' + html5); }
|
1349
|
+
try { html5 = typeof html5 === 'string' ? $.parseJSON(html5) : html5; } catch(e) {}
|
1506
1350
|
|
1507
1351
|
// Merge in and sanitize metadata
|
1508
1352
|
config = $.extend(TRUE, {}, QTIP.defaults, opts,
|
@@ -1521,10 +1365,7 @@ function init(id, opts)
|
|
1521
1365
|
if(config.content.attr !== FALSE && attr) { config.content.text = attr; }
|
1522
1366
|
|
1523
1367
|
// No valid content was found, abort render
|
1524
|
-
else {
|
1525
|
-
log('Unable to locate content for tooltip! Aborting render of tooltip on element: ', elem);
|
1526
|
-
return FALSE;
|
1527
|
-
}
|
1368
|
+
else { return FALSE; }
|
1528
1369
|
}
|
1529
1370
|
|
1530
1371
|
// Setup target options
|
@@ -1654,19 +1495,19 @@ QTIP.bind = function(opts, event)
|
|
1654
1495
|
};
|
1655
1496
|
|
1656
1497
|
/*
|
1657
|
-
|
1658
|
-
|
1659
|
-
|
1498
|
+
* Make sure hoverIntent functions properly by using mouseleave as a hide event if
|
1499
|
+
* mouseenter/mouseout is used for show.event, even if it isn't in the users options.
|
1500
|
+
*/
|
1660
1501
|
if(/mouse(over|enter)/i.test(events.show) && !/mouse(out|leave)/i.test(events.hide)) {
|
1661
1502
|
events.hide += ' mouseleave' + namespace;
|
1662
1503
|
}
|
1663
1504
|
|
1664
1505
|
/*
|
1665
|
-
|
1666
|
-
|
1667
|
-
|
1668
|
-
|
1669
|
-
|
1506
|
+
* Also make sure initial mouse targetting works correctly by caching mousemove coords
|
1507
|
+
* on show targets before the tooltip has rendered.
|
1508
|
+
*
|
1509
|
+
* Also set onTarget when triggered to keep mouse tracking working
|
1510
|
+
*/
|
1670
1511
|
targets.show.bind('mousemove'+namespace, function(event) {
|
1671
1512
|
MOUSE = { pageX: event.pageX, pageY: event.pageY, type: 'mousemove' };
|
1672
1513
|
api.cache.onTarget = TRUE;
|
@@ -1712,20 +1553,27 @@ QTIP.bind = function(opts, event)
|
|
1712
1553
|
PLUGINS = QTIP.plugins = {
|
1713
1554
|
// Corner object parser
|
1714
1555
|
Corner: function(corner) {
|
1715
|
-
corner = ('' + corner).replace(/([A-Z])/, ' $1').replace(/middle/gi,
|
1556
|
+
corner = ('' + corner).replace(/([A-Z])/, ' $1').replace(/middle/gi, CENTER).toLowerCase();
|
1716
1557
|
this.x = (corner.match(/left|right/i) || corner.match(/center/) || ['inherit'])[0].toLowerCase();
|
1717
1558
|
this.y = (corner.match(/top|bottom|center/i) || ['inherit'])[0].toLowerCase();
|
1718
1559
|
|
1719
|
-
var f = corner.charAt(0); this.precedance = (f === 't' || f === 'b' ?
|
1560
|
+
var f = corner.charAt(0); this.precedance = (f === 't' || f === 'b' ? Y : X);
|
1720
1561
|
|
1721
|
-
this.string = function() { return this.precedance ===
|
1562
|
+
this.string = function() { return this.precedance === Y ? this.y+this.x : this.x+this.y; };
|
1722
1563
|
this.abbrev = function() {
|
1723
1564
|
var x = this.x.substr(0,1), y = this.y.substr(0,1);
|
1724
|
-
return x === y ? x :
|
1565
|
+
return x === y ? x : this.precedance === Y ? y + x : x + y;
|
1725
1566
|
};
|
1726
1567
|
|
1568
|
+
this.invertx = function(center) { this.x = this.x === LEFT ? RIGHT : this.x === RIGHT ? LEFT : center || this.x; };
|
1569
|
+
this.inverty = function(center) { this.y = this.y === TOP ? BOTTOM : this.y === BOTTOM ? TOP : center || this.y; };
|
1570
|
+
|
1727
1571
|
this.clone = function() {
|
1728
|
-
return {
|
1572
|
+
return {
|
1573
|
+
x: this.x, y: this.y, precedance: this.precedance,
|
1574
|
+
string: this.string, abbrev: this.abbrev, clone: this.clone,
|
1575
|
+
invertx: this.invertx, inverty: this.inverty
|
1576
|
+
};
|
1729
1577
|
};
|
1730
1578
|
},
|
1731
1579
|
|
@@ -1765,16 +1613,16 @@ PLUGINS = QTIP.plugins = {
|
|
1765
1613
|
},
|
1766
1614
|
|
1767
1615
|
/*
|
1768
|
-
|
1769
|
-
|
1616
|
+
* iOS version detection
|
1617
|
+
*/
|
1770
1618
|
iOS: parseFloat(
|
1771
1619
|
('' + (/CPU.*OS ([0-9_]{1,5})|(CPU like).*AppleWebKit.*Mobile/i.exec(navigator.userAgent) || [0,''])[1])
|
1772
1620
|
.replace('undefined', '3_2').replace('_', '.').replace('_', '')
|
1773
1621
|
) || FALSE,
|
1774
1622
|
|
1775
1623
|
/*
|
1776
|
-
|
1777
|
-
|
1624
|
+
* jQuery-specific $.fn overrides
|
1625
|
+
*/
|
1778
1626
|
fn: {
|
1779
1627
|
/* Allow other plugins to successfully retrieve the title of an element with a qTip applied */
|
1780
1628
|
attr: function(attr, val) {
|
@@ -1787,15 +1635,14 @@ PLUGINS = QTIP.plugins = {
|
|
1787
1635
|
if(arguments.length < 2) {
|
1788
1636
|
return $.attr(self, oldtitle);
|
1789
1637
|
}
|
1790
|
-
else {
|
1791
|
-
// If qTip is rendered and title was originally used as content, update it
|
1792
|
-
if(api && api.options.content.attr === title && api.cache.attr) {
|
1793
|
-
api.set('content.text', val);
|
1794
|
-
}
|
1795
1638
|
|
1796
|
-
|
1797
|
-
|
1639
|
+
// If qTip is rendered and title was originally used as content, update it
|
1640
|
+
if(api && api.options.content.attr === title && api.cache.attr) {
|
1641
|
+
api.set('content.text', val);
|
1798
1642
|
}
|
1643
|
+
|
1644
|
+
// Use the regular attr method to set, then cache the result
|
1645
|
+
return this.attr(oldtitle, val);
|
1799
1646
|
}
|
1800
1647
|
}
|
1801
1648
|
|