powertip-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/MIT-LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 mahm
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,25 @@
1
+ # powertip-rails
2
+
3
+ ## Installation
4
+
5
+ Add this to your `Gemfile`:
6
+
7
+ ```ruby
8
+ group :assets do
9
+ gem 'sass-rails'
10
+ gem 'compass-rails'
11
+ gem 'powertip-rails'
12
+ end
13
+ ```
14
+
15
+ ## Usage
16
+
17
+ - [http://stevenbenner.github.com/jquery-powertip/](http://stevenbenner.github.com/jquery-powertip/)
18
+
19
+ ## Contributing
20
+
21
+ 1. Fork it
22
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
23
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
24
+ 4. Push to the branch (`git push origin my-new-feature`)
25
+ 5. Create new Pull Request
@@ -0,0 +1,6 @@
1
+ require "powertip-rails/version"
2
+
3
+ module PowertipRails
4
+ class Engine < ::Rails::Engine
5
+ end
6
+ end
@@ -0,0 +1,3 @@
1
+ module PowertipRails
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,257 @@
1
+ /**
2
+ * PowerTip Core
3
+ *
4
+ * @fileoverview Core variables, plugin object, and API.
5
+ * @link http://stevenbenner.github.com/jquery-powertip/
6
+ * @author Steven Benner (http://stevenbenner.com/)
7
+ * @requires jQuery 1.7+
8
+ */
9
+
10
+ // useful private variables
11
+ var $document = $(window.document),
12
+ $window = $(window),
13
+ $body = $('body');
14
+
15
+ // constants
16
+ var DATA_DISPLAYCONTROLLER = 'displayController',
17
+ DATA_HASACTIVEHOVER = 'hasActiveHover',
18
+ DATA_FORCEDOPEN = 'forcedOpen',
19
+ DATA_HASMOUSEMOVE = 'hasMouseMove',
20
+ DATA_MOUSEONTOTIP = 'mouseOnToPopup',
21
+ DATA_ORIGINALTITLE = 'originalTitle',
22
+ DATA_POWERTIP = 'powertip',
23
+ DATA_POWERTIPJQ = 'powertipjq',
24
+ DATA_POWERTIPTARGET = 'powertiptarget',
25
+ RAD2DEG = 180 / Math.PI;
26
+
27
+ /**
28
+ * Session data
29
+ * Private properties global to all powerTip instances
30
+ */
31
+ var session = {
32
+ isTipOpen: false,
33
+ isFixedTipOpen: false,
34
+ isClosing: false,
35
+ tipOpenImminent: false,
36
+ activeHover: null,
37
+ currentX: 0,
38
+ currentY: 0,
39
+ previousX: 0,
40
+ previousY: 0,
41
+ desyncTimeout: null,
42
+ mouseTrackingActive: false,
43
+ delayInProgress: false
44
+ };
45
+
46
+ /**
47
+ * Collision enumeration
48
+ * @enum {number}
49
+ */
50
+ var Collision = {
51
+ none: 0,
52
+ top: 1,
53
+ bottom: 2,
54
+ left: 4,
55
+ right: 8
56
+ };
57
+
58
+ /**
59
+ * Display hover tooltips on the matched elements.
60
+ * @param {(Object|string)} opts The options object to use for the plugin, or
61
+ * the name of a method to invoke on the first matched element.
62
+ * @param {*=} [arg] Argument for an invoked method (optional).
63
+ * @return {jQuery} jQuery object for the matched selectors.
64
+ */
65
+ $.fn.powerTip = function(opts, arg) {
66
+ // don't do any work if there were no matched elements
67
+ if (!this.length) {
68
+ return this;
69
+ }
70
+
71
+ // handle api method calls on the plugin, e.g. powerTip('hide')
72
+ if (typeof opts === 'string' && $.powerTip[opts]) {
73
+ return $.powerTip[opts].call(this, this, arg);
74
+ }
75
+
76
+ // extend options
77
+ var options = $.extend({}, $.fn.powerTip.defaults, opts),
78
+ tipController = new TooltipController(options);
79
+
80
+ // hook mouse tracking
81
+ initMouseTracking();
82
+
83
+ // setup the elements
84
+ this.each(function elementSetup() {
85
+ var $this = $(this),
86
+ dataPowertip = $this.data(DATA_POWERTIP),
87
+ dataElem = $this.data(DATA_POWERTIPJQ),
88
+ dataTarget = $this.data(DATA_POWERTIPTARGET),
89
+ title = $this.attr('title');
90
+
91
+ // handle repeated powerTip calls on the same element by destroying the
92
+ // original instance hooked to it and replacing it with this call
93
+ if ($this.data(DATA_DISPLAYCONTROLLER)) {
94
+ $.powerTip.destroy($this);
95
+ title = $this.attr('title');
96
+ }
97
+
98
+ // attempt to use title attribute text if there is no data-powertip,
99
+ // data-powertipjq or data-powertiptarget. If we do use the title
100
+ // attribute, delete the attribute so the browser will not show it
101
+ if (!dataPowertip && !dataTarget && !dataElem && title) {
102
+ $this.data(DATA_POWERTIP, title);
103
+ $this.data(DATA_ORIGINALTITLE, title);
104
+ $this.removeAttr('title');
105
+ }
106
+
107
+ // create hover controllers for each element
108
+ $this.data(
109
+ DATA_DISPLAYCONTROLLER,
110
+ new DisplayController($this, options, tipController)
111
+ );
112
+ });
113
+
114
+ // attach events to matched elements if the manual options is not enabled
115
+ if (!options.manual) {
116
+ this.on({
117
+ // mouse events
118
+ 'mouseenter.powertip': function elementMouseEnter(event) {
119
+ $.powerTip.show(this, event);
120
+ },
121
+ 'mouseleave.powertip': function elementMouseLeave() {
122
+ $.powerTip.hide(this);
123
+ },
124
+ // keyboard events
125
+ 'focus.powertip': function elementFocus() {
126
+ $.powerTip.show(this);
127
+ },
128
+ 'blur.powertip': function elementBlur() {
129
+ $.powerTip.hide(this, true);
130
+ },
131
+ 'keydown.powertip': function elementKeyDown(event) {
132
+ // close tooltip when the escape key is pressed
133
+ if (event.keyCode === 27) {
134
+ $.powerTip.hide(this, true);
135
+ }
136
+ }
137
+ });
138
+ }
139
+
140
+ return this;
141
+ };
142
+
143
+ /**
144
+ * Default options for the powerTip plugin.
145
+ */
146
+ $.fn.powerTip.defaults = {
147
+ fadeInTime: 200,
148
+ fadeOutTime: 100,
149
+ followMouse: false,
150
+ popupId: 'powerTip',
151
+ intentSensitivity: 7,
152
+ intentPollInterval: 100,
153
+ closeDelay: 100,
154
+ placement: 'n',
155
+ smartPlacement: false,
156
+ offset: 10,
157
+ mouseOnToPopup: false,
158
+ manual: false
159
+ };
160
+
161
+ /**
162
+ * Default smart placement priority lists.
163
+ * The first item in the array is the highest priority, the last is the lowest.
164
+ * The last item is also the default, which will be used if all previous options
165
+ * do not fit.
166
+ */
167
+ $.fn.powerTip.smartPlacementLists = {
168
+ n: ['n', 'ne', 'nw', 's'],
169
+ e: ['e', 'ne', 'se', 'w', 'nw', 'sw', 'n', 's', 'e'],
170
+ s: ['s', 'se', 'sw', 'n'],
171
+ w: ['w', 'nw', 'sw', 'e', 'ne', 'se', 'n', 's', 'w'],
172
+ nw: ['nw', 'w', 'sw', 'n', 's', 'se', 'nw'],
173
+ ne: ['ne', 'e', 'se', 'n', 's', 'sw', 'ne'],
174
+ sw: ['sw', 'w', 'nw', 's', 'n', 'ne', 'sw'],
175
+ se: ['se', 'e', 'ne', 's', 'n', 'nw', 'se'],
176
+ 'nw-alt': ['nw-alt', 'n', 'ne-alt', 'sw-alt', 's', 'se-alt', 'w', 'e'],
177
+ 'ne-alt': ['ne-alt', 'n', 'nw-alt', 'se-alt', 's', 'sw-alt', 'e', 'w'],
178
+ 'sw-alt': ['sw-alt', 's', 'se-alt', 'nw-alt', 'n', 'ne-alt', 'w', 'e'],
179
+ 'se-alt': ['se-alt', 's', 'sw-alt', 'ne-alt', 'n', 'nw-alt', 'e', 'w']
180
+ };
181
+
182
+ /**
183
+ * Public API
184
+ */
185
+ $.powerTip = {
186
+ /**
187
+ * Attempts to show the tooltip for the specified element.
188
+ * @param {jQuery|Element} element The element to open the tooltip for.
189
+ * @param {jQuery.Event=} event jQuery event for hover intent and mouse
190
+ * tracking (optional).
191
+ */
192
+ show: function apiShowTip(element, event) {
193
+ if (event) {
194
+ trackMouse(event);
195
+ session.previousX = event.pageX;
196
+ session.previousY = event.pageY;
197
+ $(element).data(DATA_DISPLAYCONTROLLER).show();
198
+ } else {
199
+ $(element).first().data(DATA_DISPLAYCONTROLLER).show(true, true);
200
+ }
201
+ return element;
202
+ },
203
+
204
+ /**
205
+ * Repositions the tooltip on the element.
206
+ * @param {jQuery|Element} element The element the tooltip is shown for.
207
+ */
208
+ reposition: function apiResetPosition(element) {
209
+ $(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();
210
+ return element;
211
+ },
212
+
213
+ /**
214
+ * Attempts to close any open tooltips.
215
+ * @param {(jQuery|Element)=} element The element with the tooltip that
216
+ * should be closed (optional).
217
+ * @param {boolean=} immediate Disable close delay (optional).
218
+ */
219
+ hide: function apiCloseTip(element, immediate) {
220
+ if (element) {
221
+ $(element).first().data(DATA_DISPLAYCONTROLLER).hide(immediate);
222
+ } else {
223
+ if (session.activeHover) {
224
+ session.activeHover.data(DATA_DISPLAYCONTROLLER).hide(true);
225
+ }
226
+ }
227
+ return element;
228
+ },
229
+
230
+ /**
231
+ * Destroy and roll back any powerTip() instance on the specified element.
232
+ * @param {jQuery|Element} element The element with the powerTip instance.
233
+ */
234
+ destroy: function apiDestroy(element) {
235
+ $(element).off('.powertip').each(function destroy() {
236
+ var $this = $(this),
237
+ dataAttributes = [
238
+ DATA_ORIGINALTITLE,
239
+ DATA_DISPLAYCONTROLLER,
240
+ DATA_HASACTIVEHOVER,
241
+ DATA_FORCEDOPEN
242
+ ];
243
+
244
+ if ($this.data(DATA_ORIGINALTITLE)) {
245
+ $this.attr('title', $this.data(DATA_ORIGINALTITLE));
246
+ dataAttributes.push(DATA_POWERTIP);
247
+ }
248
+
249
+ $this.removeData(dataAttributes);
250
+ });
251
+ return element;
252
+ }
253
+ };
254
+
255
+ // API aliasing
256
+ $.powerTip.showTip = $.powerTip.show;
257
+ $.powerTip.closeTip = $.powerTip.hide;
@@ -0,0 +1,34 @@
1
+ /**
2
+ * PowerTip CSSCoordinates
3
+ *
4
+ * @fileoverview CSSCoordinates object for describing CSS positions.
5
+ * @link http://stevenbenner.github.com/jquery-powertip/
6
+ * @author Steven Benner (http://stevenbenner.com/)
7
+ * @requires jQuery 1.7+
8
+ */
9
+
10
+ /**
11
+ * Creates a new CSSCoordinates object.
12
+ * @private
13
+ * @constructor
14
+ */
15
+ function CSSCoordinates() {
16
+ var me = this;
17
+
18
+ // initialize object properties
19
+ me.top = 'auto';
20
+ me.left = 'auto';
21
+ me.right = 'auto';
22
+
23
+ /**
24
+ * Set a property to a value.
25
+ * @private
26
+ * @param {string} property The name of the property.
27
+ * @param {number} value The value of the property.
28
+ */
29
+ me.set = function(property, value) {
30
+ if ($.isNumeric(value)) {
31
+ me[property] = Math.round(value);
32
+ }
33
+ };
34
+ }
@@ -0,0 +1,120 @@
1
+ /**
2
+ * PowerTip DisplayController
3
+ *
4
+ * @fileoverview DisplayController object used to manage tooltips for elements.
5
+ * @link http://stevenbenner.github.com/jquery-powertip/
6
+ * @author Steven Benner (http://stevenbenner.com/)
7
+ * @requires jQuery 1.7+
8
+ */
9
+
10
+ /**
11
+ * Creates a new tooltip display controller.
12
+ * @private
13
+ * @constructor
14
+ * @param {jQuery} element The element that this controller will handle.
15
+ * @param {Object} options Options object containing settings.
16
+ * @param {TooltipController} tipController The TooltipController object for
17
+ * this instance.
18
+ */
19
+ function DisplayController(element, options, tipController) {
20
+ var hoverTimer = null;
21
+
22
+ /**
23
+ * Begins the process of showing a tooltip.
24
+ * @private
25
+ * @param {boolean=} immediate Skip intent testing (optional).
26
+ * @param {boolean=} forceOpen Ignore cursor position and force tooltip to
27
+ * open (optional).
28
+ */
29
+ function openTooltip(immediate, forceOpen) {
30
+ cancelTimer();
31
+ if (!element.data(DATA_HASACTIVEHOVER)) {
32
+ if (!immediate) {
33
+ session.tipOpenImminent = true;
34
+ hoverTimer = window.setTimeout(
35
+ function intentDelay() {
36
+ hoverTimer = null;
37
+ checkForIntent();
38
+ },
39
+ options.intentPollInterval
40
+ );
41
+ } else {
42
+ if (forceOpen) {
43
+ element.data(DATA_FORCEDOPEN, true);
44
+ }
45
+ tipController.showTip(element);
46
+ }
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Begins the process of closing a tooltip.
52
+ * @private
53
+ * @param {boolean=} disableDelay Disable close delay (optional).
54
+ */
55
+ function closeTooltip(disableDelay) {
56
+ cancelTimer();
57
+ session.tipOpenImminent = false;
58
+ if (element.data(DATA_HASACTIVEHOVER)) {
59
+ element.data(DATA_FORCEDOPEN, false);
60
+ if (!disableDelay) {
61
+ session.delayInProgress = true;
62
+ hoverTimer = window.setTimeout(
63
+ function closeDelay() {
64
+ hoverTimer = null;
65
+ tipController.hideTip(element);
66
+ session.delayInProgress = false;
67
+ },
68
+ options.closeDelay
69
+ );
70
+ } else {
71
+ tipController.hideTip(element);
72
+ }
73
+ }
74
+ }
75
+
76
+ /**
77
+ * Checks mouse position to make sure that the user intended to hover on the
78
+ * specified element before showing the tooltip.
79
+ * @private
80
+ */
81
+ function checkForIntent() {
82
+ // calculate mouse position difference
83
+ var xDifference = Math.abs(session.previousX - session.currentX),
84
+ yDifference = Math.abs(session.previousY - session.currentY),
85
+ totalDifference = xDifference + yDifference;
86
+
87
+ // check if difference has passed the sensitivity threshold
88
+ if (totalDifference < options.intentSensitivity) {
89
+ tipController.showTip(element);
90
+ } else {
91
+ // try again
92
+ session.previousX = session.currentX;
93
+ session.previousY = session.currentY;
94
+ openTooltip();
95
+ }
96
+ }
97
+
98
+ /**
99
+ * Cancels active hover timer.
100
+ * @private
101
+ */
102
+ function cancelTimer() {
103
+ hoverTimer = window.clearTimeout(hoverTimer);
104
+ session.delayInProgress = false;
105
+ }
106
+
107
+ /**
108
+ * Repositions the tooltip on this element.
109
+ * @private
110
+ */
111
+ function repositionTooltip() {
112
+ tipController.resetPosition(element);
113
+ }
114
+
115
+ // expose the methods
116
+ this.show = openTooltip;
117
+ this.hide = closeTooltip;
118
+ this.cancel = cancelTimer;
119
+ this.resetPosition = repositionTooltip;
120
+ }