shepherdjs_rails 1.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +50 -0
  4. data/Rakefile +29 -0
  5. data/lib/shepherdjs_rails/engine.rb +4 -0
  6. data/lib/shepherdjs_rails/version.rb +3 -0
  7. data/lib/shepherdjs_rails.rb +4 -0
  8. data/test/dummy/README.rdoc +28 -0
  9. data/test/dummy/Rakefile +6 -0
  10. data/test/dummy/app/assets/javascripts/application.js +13 -0
  11. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  12. data/test/dummy/app/controllers/application_controller.rb +5 -0
  13. data/test/dummy/app/helpers/application_helper.rb +2 -0
  14. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  15. data/test/dummy/bin/bundle +3 -0
  16. data/test/dummy/bin/rails +4 -0
  17. data/test/dummy/bin/rake +4 -0
  18. data/test/dummy/bin/setup +29 -0
  19. data/test/dummy/config/application.rb +26 -0
  20. data/test/dummy/config/boot.rb +5 -0
  21. data/test/dummy/config/database.yml +25 -0
  22. data/test/dummy/config/environment.rb +5 -0
  23. data/test/dummy/config/environments/development.rb +41 -0
  24. data/test/dummy/config/environments/production.rb +79 -0
  25. data/test/dummy/config/environments/test.rb +42 -0
  26. data/test/dummy/config/initializers/assets.rb +11 -0
  27. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  28. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  29. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  30. data/test/dummy/config/initializers/inflections.rb +16 -0
  31. data/test/dummy/config/initializers/mime_types.rb +4 -0
  32. data/test/dummy/config/initializers/session_store.rb +3 -0
  33. data/test/dummy/config/initializers/to_time_preserves_timezone.rb +10 -0
  34. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  35. data/test/dummy/config/locales/en.yml +23 -0
  36. data/test/dummy/config/routes.rb +56 -0
  37. data/test/dummy/config/secrets.yml +22 -0
  38. data/test/dummy/config.ru +4 -0
  39. data/test/dummy/public/404.html +67 -0
  40. data/test/dummy/public/422.html +67 -0
  41. data/test/dummy/public/500.html +66 -0
  42. data/test/dummy/public/favicon.ico +0 -0
  43. data/test/shepherdjs_rails_test.rb +7 -0
  44. data/test/test_helper.rb +20 -0
  45. data/vendor/assets/javascripts/shepherd.js +747 -0
  46. data/vendor/assets/javascripts/tether.js +1443 -0
  47. data/vendor/assets/stylesheets/shepherd-theme-arrows-fix.css +5 -0
  48. data/vendor/assets/stylesheets/shepherd-theme-arrows-plain-buttons.css +215 -0
  49. data/vendor/assets/stylesheets/shepherd-theme-arrows.css +229 -0
  50. data/vendor/assets/stylesheets/shepherd-theme-dark.css +246 -0
  51. data/vendor/assets/stylesheets/shepherd-theme-default.css +246 -0
  52. data/vendor/assets/stylesheets/shepherd-theme-square-dark.css +248 -0
  53. data/vendor/assets/stylesheets/shepherd-theme-square.css +248 -0
  54. data/vendor/assets/stylesheets/shepherd.css +9 -0
  55. metadata +149 -0
@@ -0,0 +1,1443 @@
1
+ /*! tether 0.6.5 */
2
+
3
+
4
+ (function(root, factory) {
5
+ if (typeof define === 'function' && define.amd) {
6
+ define(factory);
7
+ } else if (typeof exports === 'object') {
8
+ module.exports = factory(require,exports,module);
9
+ } else {
10
+ root.Tether = factory();
11
+ }
12
+ }(this, function(require,exports,module) {
13
+
14
+ (function() {
15
+ var Evented, addClass, defer, deferred, extend, flush, getBounds, getOffsetParent, getOrigin, getScrollBarSize, getScrollParent, hasClass, node, removeClass, uniqueId, updateClasses, zeroPosCache,
16
+ __hasProp = {}.hasOwnProperty,
17
+ __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },
18
+ __slice = [].slice;
19
+
20
+ if (this.Tether == null) {
21
+ this.Tether = {
22
+ modules: []
23
+ };
24
+ }
25
+
26
+ getScrollParent = function(el) {
27
+ var parent, position, scrollParent, style, _ref;
28
+ position = getComputedStyle(el).position;
29
+ if (position === 'fixed') {
30
+ return el;
31
+ }
32
+ scrollParent = void 0;
33
+ parent = el;
34
+ while (parent = parent.parentNode) {
35
+ try {
36
+ style = getComputedStyle(parent);
37
+ } catch (_error) {}
38
+ if (style == null) {
39
+ return parent;
40
+ }
41
+ if (/(auto|scroll)/.test(style['overflow'] + style['overflow-y'] + style['overflow-x'])) {
42
+ if (position !== 'absolute' || ((_ref = style['position']) === 'relative' || _ref === 'absolute' || _ref === 'fixed')) {
43
+ return parent;
44
+ }
45
+ }
46
+ }
47
+ return document.body;
48
+ };
49
+
50
+ uniqueId = (function() {
51
+ var id;
52
+ id = 0;
53
+ return function() {
54
+ return id++;
55
+ };
56
+ })();
57
+
58
+ zeroPosCache = {};
59
+
60
+ getOrigin = function(doc) {
61
+ var id, k, node, v, _ref;
62
+ node = doc._tetherZeroElement;
63
+ if (node == null) {
64
+ node = doc.createElement('div');
65
+ node.setAttribute('data-tether-id', uniqueId());
66
+ extend(node.style, {
67
+ top: 0,
68
+ left: 0,
69
+ position: 'absolute'
70
+ });
71
+ doc.body.appendChild(node);
72
+ doc._tetherZeroElement = node;
73
+ }
74
+ id = node.getAttribute('data-tether-id');
75
+ if (zeroPosCache[id] == null) {
76
+ zeroPosCache[id] = {};
77
+ _ref = node.getBoundingClientRect();
78
+ for (k in _ref) {
79
+ v = _ref[k];
80
+ zeroPosCache[id][k] = v;
81
+ }
82
+ defer(function() {
83
+ return zeroPosCache[id] = void 0;
84
+ });
85
+ }
86
+ return zeroPosCache[id];
87
+ };
88
+
89
+ node = null;
90
+
91
+ getBounds = function(el) {
92
+ var box, doc, docEl, k, origin, v, _ref;
93
+ if (el === document) {
94
+ doc = document;
95
+ el = document.documentElement;
96
+ } else {
97
+ doc = el.ownerDocument;
98
+ }
99
+ docEl = doc.documentElement;
100
+ box = {};
101
+ _ref = el.getBoundingClientRect();
102
+ for (k in _ref) {
103
+ v = _ref[k];
104
+ box[k] = v;
105
+ }
106
+ origin = getOrigin(doc);
107
+ box.top -= origin.top;
108
+ box.left -= origin.left;
109
+ if (box.width == null) {
110
+ box.width = document.body.scrollWidth - box.left - box.right;
111
+ }
112
+ if (box.height == null) {
113
+ box.height = document.body.scrollHeight - box.top - box.bottom;
114
+ }
115
+ box.top = box.top - docEl.clientTop;
116
+ box.left = box.left - docEl.clientLeft;
117
+ box.right = doc.body.clientWidth - box.width - box.left;
118
+ box.bottom = doc.body.clientHeight - box.height - box.top;
119
+ return box;
120
+ };
121
+
122
+ getOffsetParent = function(el) {
123
+ return el.offsetParent || document.documentElement;
124
+ };
125
+
126
+ getScrollBarSize = function() {
127
+ var inner, outer, width, widthContained, widthScroll;
128
+ inner = document.createElement('div');
129
+ inner.style.width = '100%';
130
+ inner.style.height = '200px';
131
+ outer = document.createElement('div');
132
+ extend(outer.style, {
133
+ position: 'absolute',
134
+ top: 0,
135
+ left: 0,
136
+ pointerEvents: 'none',
137
+ visibility: 'hidden',
138
+ width: '200px',
139
+ height: '150px',
140
+ overflow: 'hidden'
141
+ });
142
+ outer.appendChild(inner);
143
+ document.body.appendChild(outer);
144
+ widthContained = inner.offsetWidth;
145
+ outer.style.overflow = 'scroll';
146
+ widthScroll = inner.offsetWidth;
147
+ if (widthContained === widthScroll) {
148
+ widthScroll = outer.clientWidth;
149
+ }
150
+ document.body.removeChild(outer);
151
+ width = widthContained - widthScroll;
152
+ return {
153
+ width: width,
154
+ height: width
155
+ };
156
+ };
157
+
158
+ extend = function(out) {
159
+ var args, key, obj, val, _i, _len, _ref;
160
+ if (out == null) {
161
+ out = {};
162
+ }
163
+ args = [];
164
+ Array.prototype.push.apply(args, arguments);
165
+ _ref = args.slice(1);
166
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
167
+ obj = _ref[_i];
168
+ if (obj) {
169
+ for (key in obj) {
170
+ if (!__hasProp.call(obj, key)) continue;
171
+ val = obj[key];
172
+ out[key] = val;
173
+ }
174
+ }
175
+ }
176
+ return out;
177
+ };
178
+
179
+ removeClass = function(el, name) {
180
+ var cls, _i, _len, _ref, _results;
181
+ if (el.classList != null) {
182
+ _ref = name.split(' ');
183
+ _results = [];
184
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
185
+ cls = _ref[_i];
186
+ if (cls.trim()) {
187
+ _results.push(el.classList.remove(cls));
188
+ }
189
+ }
190
+ return _results;
191
+ } else {
192
+ return el.className = el.className.replace(new RegExp("(^| )" + (name.split(' ').join('|')) + "( |$)", 'gi'), ' ');
193
+ }
194
+ };
195
+
196
+ addClass = function(el, name) {
197
+ var cls, _i, _len, _ref, _results;
198
+ if (el.classList != null) {
199
+ _ref = name.split(' ');
200
+ _results = [];
201
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
202
+ cls = _ref[_i];
203
+ if (cls.trim()) {
204
+ _results.push(el.classList.add(cls));
205
+ }
206
+ }
207
+ return _results;
208
+ } else {
209
+ removeClass(el, name);
210
+ return el.className += " " + name;
211
+ }
212
+ };
213
+
214
+ hasClass = function(el, name) {
215
+ if (el.classList != null) {
216
+ return el.classList.contains(name);
217
+ } else {
218
+ return new RegExp("(^| )" + name + "( |$)", 'gi').test(el.className);
219
+ }
220
+ };
221
+
222
+ updateClasses = function(el, add, all) {
223
+ var cls, _i, _j, _len, _len1, _results;
224
+ for (_i = 0, _len = all.length; _i < _len; _i++) {
225
+ cls = all[_i];
226
+ if (__indexOf.call(add, cls) < 0) {
227
+ if (hasClass(el, cls)) {
228
+ removeClass(el, cls);
229
+ }
230
+ }
231
+ }
232
+ _results = [];
233
+ for (_j = 0, _len1 = add.length; _j < _len1; _j++) {
234
+ cls = add[_j];
235
+ if (!hasClass(el, cls)) {
236
+ _results.push(addClass(el, cls));
237
+ } else {
238
+ _results.push(void 0);
239
+ }
240
+ }
241
+ return _results;
242
+ };
243
+
244
+ deferred = [];
245
+
246
+ defer = function(fn) {
247
+ return deferred.push(fn);
248
+ };
249
+
250
+ flush = function() {
251
+ var fn, _results;
252
+ _results = [];
253
+ while (fn = deferred.pop()) {
254
+ _results.push(fn());
255
+ }
256
+ return _results;
257
+ };
258
+
259
+ Evented = (function() {
260
+ function Evented() {}
261
+
262
+ Evented.prototype.on = function(event, handler, ctx, once) {
263
+ var _base;
264
+ if (once == null) {
265
+ once = false;
266
+ }
267
+ if (this.bindings == null) {
268
+ this.bindings = {};
269
+ }
270
+ if ((_base = this.bindings)[event] == null) {
271
+ _base[event] = [];
272
+ }
273
+ return this.bindings[event].push({
274
+ handler: handler,
275
+ ctx: ctx,
276
+ once: once
277
+ });
278
+ };
279
+
280
+ Evented.prototype.once = function(event, handler, ctx) {
281
+ return this.on(event, handler, ctx, true);
282
+ };
283
+
284
+ Evented.prototype.off = function(event, handler) {
285
+ var i, _ref, _results;
286
+ if (((_ref = this.bindings) != null ? _ref[event] : void 0) == null) {
287
+ return;
288
+ }
289
+ if (handler == null) {
290
+ return delete this.bindings[event];
291
+ } else {
292
+ i = 0;
293
+ _results = [];
294
+ while (i < this.bindings[event].length) {
295
+ if (this.bindings[event][i].handler === handler) {
296
+ _results.push(this.bindings[event].splice(i, 1));
297
+ } else {
298
+ _results.push(i++);
299
+ }
300
+ }
301
+ return _results;
302
+ }
303
+ };
304
+
305
+ Evented.prototype.trigger = function() {
306
+ var args, ctx, event, handler, i, once, _ref, _ref1, _results;
307
+ event = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
308
+ if ((_ref = this.bindings) != null ? _ref[event] : void 0) {
309
+ i = 0;
310
+ _results = [];
311
+ while (i < this.bindings[event].length) {
312
+ _ref1 = this.bindings[event][i], handler = _ref1.handler, ctx = _ref1.ctx, once = _ref1.once;
313
+ handler.apply(ctx != null ? ctx : this, args);
314
+ if (once) {
315
+ _results.push(this.bindings[event].splice(i, 1));
316
+ } else {
317
+ _results.push(i++);
318
+ }
319
+ }
320
+ return _results;
321
+ }
322
+ };
323
+
324
+ return Evented;
325
+
326
+ })();
327
+
328
+ this.Tether.Utils = {
329
+ getScrollParent: getScrollParent,
330
+ getBounds: getBounds,
331
+ getOffsetParent: getOffsetParent,
332
+ extend: extend,
333
+ addClass: addClass,
334
+ removeClass: removeClass,
335
+ hasClass: hasClass,
336
+ updateClasses: updateClasses,
337
+ defer: defer,
338
+ flush: flush,
339
+ uniqueId: uniqueId,
340
+ Evented: Evented,
341
+ getScrollBarSize: getScrollBarSize
342
+ };
343
+
344
+ }).call(this);
345
+
346
+ (function() {
347
+ var MIRROR_LR, MIRROR_TB, OFFSET_MAP, Tether, addClass, addOffset, attachmentToOffset, autoToFixedAttachment, defer, extend, flush, getBounds, getOffsetParent, getOuterSize, getScrollBarSize, getScrollParent, getSize, now, offsetToPx, parseAttachment, parseOffset, position, removeClass, tethers, transformKey, updateClasses, within, _Tether, _ref,
348
+ __slice = [].slice,
349
+ __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
350
+
351
+ if (this.Tether == null) {
352
+ throw new Error("You must include the utils.js file before tether.js");
353
+ }
354
+
355
+ Tether = this.Tether;
356
+
357
+ _ref = Tether.Utils, getScrollParent = _ref.getScrollParent, getSize = _ref.getSize, getOuterSize = _ref.getOuterSize, getBounds = _ref.getBounds, getOffsetParent = _ref.getOffsetParent, extend = _ref.extend, addClass = _ref.addClass, removeClass = _ref.removeClass, updateClasses = _ref.updateClasses, defer = _ref.defer, flush = _ref.flush, getScrollBarSize = _ref.getScrollBarSize;
358
+
359
+ within = function(a, b, diff) {
360
+ if (diff == null) {
361
+ diff = 1;
362
+ }
363
+ return (a + diff >= b && b >= a - diff);
364
+ };
365
+
366
+ transformKey = (function() {
367
+ var el, key, _i, _len, _ref1;
368
+ el = document.createElement('div');
369
+ _ref1 = ['transform', 'webkitTransform', 'OTransform', 'MozTransform', 'msTransform'];
370
+ for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
371
+ key = _ref1[_i];
372
+ if (el.style[key] !== void 0) {
373
+ return key;
374
+ }
375
+ }
376
+ })();
377
+
378
+ tethers = [];
379
+
380
+ position = function() {
381
+ var tether, _i, _len;
382
+ for (_i = 0, _len = tethers.length; _i < _len; _i++) {
383
+ tether = tethers[_i];
384
+ tether.position(false);
385
+ }
386
+ return flush();
387
+ };
388
+
389
+ now = function() {
390
+ var _ref1;
391
+ return (_ref1 = typeof performance !== "undefined" && performance !== null ? typeof performance.now === "function" ? performance.now() : void 0 : void 0) != null ? _ref1 : +(new Date);
392
+ };
393
+
394
+ (function() {
395
+ var event, lastCall, lastDuration, pendingTimeout, tick, _i, _len, _ref1, _results;
396
+ lastCall = null;
397
+ lastDuration = null;
398
+ pendingTimeout = null;
399
+ tick = function() {
400
+ if ((lastDuration != null) && lastDuration > 16) {
401
+ lastDuration = Math.min(lastDuration - 16, 250);
402
+ pendingTimeout = setTimeout(tick, 250);
403
+ return;
404
+ }
405
+ if ((lastCall != null) && (now() - lastCall) < 10) {
406
+ return;
407
+ }
408
+ if (pendingTimeout != null) {
409
+ clearTimeout(pendingTimeout);
410
+ pendingTimeout = null;
411
+ }
412
+ lastCall = now();
413
+ position();
414
+ return lastDuration = now() - lastCall;
415
+ };
416
+ _ref1 = ['resize', 'scroll', 'touchmove'];
417
+ _results = [];
418
+ for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
419
+ event = _ref1[_i];
420
+ _results.push(window.addEventListener(event, tick));
421
+ }
422
+ return _results;
423
+ })();
424
+
425
+ MIRROR_LR = {
426
+ center: 'center',
427
+ left: 'right',
428
+ right: 'left'
429
+ };
430
+
431
+ MIRROR_TB = {
432
+ middle: 'middle',
433
+ top: 'bottom',
434
+ bottom: 'top'
435
+ };
436
+
437
+ OFFSET_MAP = {
438
+ top: 0,
439
+ left: 0,
440
+ middle: '50%',
441
+ center: '50%',
442
+ bottom: '100%',
443
+ right: '100%'
444
+ };
445
+
446
+ autoToFixedAttachment = function(attachment, relativeToAttachment) {
447
+ var left, top;
448
+ left = attachment.left, top = attachment.top;
449
+ if (left === 'auto') {
450
+ left = MIRROR_LR[relativeToAttachment.left];
451
+ }
452
+ if (top === 'auto') {
453
+ top = MIRROR_TB[relativeToAttachment.top];
454
+ }
455
+ return {
456
+ left: left,
457
+ top: top
458
+ };
459
+ };
460
+
461
+ attachmentToOffset = function(attachment) {
462
+ var _ref1, _ref2;
463
+ return {
464
+ left: (_ref1 = OFFSET_MAP[attachment.left]) != null ? _ref1 : attachment.left,
465
+ top: (_ref2 = OFFSET_MAP[attachment.top]) != null ? _ref2 : attachment.top
466
+ };
467
+ };
468
+
469
+ addOffset = function() {
470
+ var left, offsets, out, top, _i, _len, _ref1;
471
+ offsets = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
472
+ out = {
473
+ top: 0,
474
+ left: 0
475
+ };
476
+ for (_i = 0, _len = offsets.length; _i < _len; _i++) {
477
+ _ref1 = offsets[_i], top = _ref1.top, left = _ref1.left;
478
+ if (typeof top === 'string') {
479
+ top = parseFloat(top, 10);
480
+ }
481
+ if (typeof left === 'string') {
482
+ left = parseFloat(left, 10);
483
+ }
484
+ out.top += top;
485
+ out.left += left;
486
+ }
487
+ return out;
488
+ };
489
+
490
+ offsetToPx = function(offset, size) {
491
+ if (typeof offset.left === 'string' && offset.left.indexOf('%') !== -1) {
492
+ offset.left = parseFloat(offset.left, 10) / 100 * size.width;
493
+ }
494
+ if (typeof offset.top === 'string' && offset.top.indexOf('%') !== -1) {
495
+ offset.top = parseFloat(offset.top, 10) / 100 * size.height;
496
+ }
497
+ return offset;
498
+ };
499
+
500
+ parseAttachment = parseOffset = function(value) {
501
+ var left, top, _ref1;
502
+ _ref1 = value.split(' '), top = _ref1[0], left = _ref1[1];
503
+ return {
504
+ top: top,
505
+ left: left
506
+ };
507
+ };
508
+
509
+ _Tether = (function() {
510
+ _Tether.modules = [];
511
+
512
+ function _Tether(options) {
513
+ this.position = __bind(this.position, this);
514
+ var module, _i, _len, _ref1, _ref2;
515
+ tethers.push(this);
516
+ this.history = [];
517
+ this.setOptions(options, false);
518
+ _ref1 = Tether.modules;
519
+ for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
520
+ module = _ref1[_i];
521
+ if ((_ref2 = module.initialize) != null) {
522
+ _ref2.call(this);
523
+ }
524
+ }
525
+ this.position();
526
+ }
527
+
528
+ _Tether.prototype.getClass = function(key) {
529
+ var _ref1, _ref2;
530
+ if ((_ref1 = this.options.classes) != null ? _ref1[key] : void 0) {
531
+ return this.options.classes[key];
532
+ } else if (((_ref2 = this.options.classes) != null ? _ref2[key] : void 0) !== false) {
533
+ if (this.options.classPrefix) {
534
+ return "" + this.options.classPrefix + "-" + key;
535
+ } else {
536
+ return key;
537
+ }
538
+ } else {
539
+ return '';
540
+ }
541
+ };
542
+
543
+ _Tether.prototype.setOptions = function(options, position) {
544
+ var defaults, key, _i, _len, _ref1, _ref2;
545
+ this.options = options;
546
+ if (position == null) {
547
+ position = true;
548
+ }
549
+ defaults = {
550
+ offset: '0 0',
551
+ targetOffset: '0 0',
552
+ targetAttachment: 'auto auto',
553
+ classPrefix: 'tether'
554
+ };
555
+ this.options = extend(defaults, this.options);
556
+ _ref1 = this.options, this.element = _ref1.element, this.target = _ref1.target, this.targetModifier = _ref1.targetModifier;
557
+ if (this.target === 'viewport') {
558
+ this.target = document.body;
559
+ this.targetModifier = 'visible';
560
+ } else if (this.target === 'scroll-handle') {
561
+ this.target = document.body;
562
+ this.targetModifier = 'scroll-handle';
563
+ }
564
+ _ref2 = ['element', 'target'];
565
+ for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
566
+ key = _ref2[_i];
567
+ if (this[key] == null) {
568
+ throw new Error("Tether Error: Both element and target must be defined");
569
+ }
570
+ if (this[key].jquery != null) {
571
+ this[key] = this[key][0];
572
+ } else if (typeof this[key] === 'string') {
573
+ this[key] = document.querySelector(this[key]);
574
+ }
575
+ }
576
+ addClass(this.element, this.getClass('element'));
577
+ addClass(this.target, this.getClass('target'));
578
+ if (!this.options.attachment) {
579
+ throw new Error("Tether Error: You must provide an attachment");
580
+ }
581
+ this.targetAttachment = parseAttachment(this.options.targetAttachment);
582
+ this.attachment = parseAttachment(this.options.attachment);
583
+ this.offset = parseOffset(this.options.offset);
584
+ this.targetOffset = parseOffset(this.options.targetOffset);
585
+ if (this.scrollParent != null) {
586
+ this.disable();
587
+ }
588
+ if (this.targetModifier === 'scroll-handle') {
589
+ this.scrollParent = this.target;
590
+ } else {
591
+ this.scrollParent = getScrollParent(this.target);
592
+ }
593
+ if (this.options.enabled !== false) {
594
+ return this.enable(position);
595
+ }
596
+ };
597
+
598
+ _Tether.prototype.getTargetBounds = function() {
599
+ var bounds, fitAdj, hasBottomScroll, height, out, scrollBottom, scrollPercentage, style, target;
600
+ if (this.targetModifier != null) {
601
+ switch (this.targetModifier) {
602
+ case 'visible':
603
+ if (this.target === document.body) {
604
+ return {
605
+ top: pageYOffset,
606
+ left: pageXOffset,
607
+ height: innerHeight,
608
+ width: innerWidth
609
+ };
610
+ } else {
611
+ bounds = getBounds(this.target);
612
+ out = {
613
+ height: bounds.height,
614
+ width: bounds.width,
615
+ top: bounds.top,
616
+ left: bounds.left
617
+ };
618
+ out.height = Math.min(out.height, bounds.height - (pageYOffset - bounds.top));
619
+ out.height = Math.min(out.height, bounds.height - ((bounds.top + bounds.height) - (pageYOffset + innerHeight)));
620
+ out.height = Math.min(innerHeight, out.height);
621
+ out.height -= 2;
622
+ out.width = Math.min(out.width, bounds.width - (pageXOffset - bounds.left));
623
+ out.width = Math.min(out.width, bounds.width - ((bounds.left + bounds.width) - (pageXOffset + innerWidth)));
624
+ out.width = Math.min(innerWidth, out.width);
625
+ out.width -= 2;
626
+ if (out.top < pageYOffset) {
627
+ out.top = pageYOffset;
628
+ }
629
+ if (out.left < pageXOffset) {
630
+ out.left = pageXOffset;
631
+ }
632
+ return out;
633
+ }
634
+ break;
635
+ case 'scroll-handle':
636
+ target = this.target;
637
+ if (target === document.body) {
638
+ target = document.documentElement;
639
+ bounds = {
640
+ left: pageXOffset,
641
+ top: pageYOffset,
642
+ height: innerHeight,
643
+ width: innerWidth
644
+ };
645
+ } else {
646
+ bounds = getBounds(target);
647
+ }
648
+ style = getComputedStyle(target);
649
+ hasBottomScroll = target.scrollWidth > target.clientWidth || 'scroll' === [style.overflow, style.overflowX] || this.target !== document.body;
650
+ scrollBottom = 0;
651
+ if (hasBottomScroll) {
652
+ scrollBottom = 15;
653
+ }
654
+ height = bounds.height - parseFloat(style.borderTopWidth) - parseFloat(style.borderBottomWidth) - scrollBottom;
655
+ out = {
656
+ width: 15,
657
+ height: height * 0.975 * (height / target.scrollHeight),
658
+ left: bounds.left + bounds.width - parseFloat(style.borderLeftWidth) - 15
659
+ };
660
+ fitAdj = 0;
661
+ if (height < 408 && this.target === document.body) {
662
+ fitAdj = -0.00011 * Math.pow(height, 2) - 0.00727 * height + 22.58;
663
+ }
664
+ if (this.target !== document.body) {
665
+ out.height = Math.max(out.height, 24);
666
+ }
667
+ scrollPercentage = this.target.scrollTop / (target.scrollHeight - height);
668
+ out.top = scrollPercentage * (height - out.height - fitAdj) + bounds.top + parseFloat(style.borderTopWidth);
669
+ if (this.target === document.body) {
670
+ out.height = Math.max(out.height, 24);
671
+ }
672
+ return out;
673
+ }
674
+ } else {
675
+ return getBounds(this.target);
676
+ }
677
+ };
678
+
679
+ _Tether.prototype.clearCache = function() {
680
+ return this._cache = {};
681
+ };
682
+
683
+ _Tether.prototype.cache = function(k, getter) {
684
+ if (this._cache == null) {
685
+ this._cache = {};
686
+ }
687
+ if (this._cache[k] == null) {
688
+ this._cache[k] = getter.call(this);
689
+ }
690
+ return this._cache[k];
691
+ };
692
+
693
+ _Tether.prototype.enable = function(position) {
694
+ if (position == null) {
695
+ position = true;
696
+ }
697
+ addClass(this.target, this.getClass('enabled'));
698
+ addClass(this.element, this.getClass('enabled'));
699
+ this.enabled = true;
700
+ if (this.scrollParent !== document) {
701
+ this.scrollParent.addEventListener('scroll', this.position);
702
+ }
703
+ if (position) {
704
+ return this.position();
705
+ }
706
+ };
707
+
708
+ _Tether.prototype.disable = function() {
709
+ removeClass(this.target, this.getClass('enabled'));
710
+ removeClass(this.element, this.getClass('enabled'));
711
+ this.enabled = false;
712
+ if (this.scrollParent != null) {
713
+ return this.scrollParent.removeEventListener('scroll', this.position);
714
+ }
715
+ };
716
+
717
+ _Tether.prototype.destroy = function() {
718
+ var i, tether, _i, _len, _results;
719
+ this.disable();
720
+ _results = [];
721
+ for (i = _i = 0, _len = tethers.length; _i < _len; i = ++_i) {
722
+ tether = tethers[i];
723
+ if (tether === this) {
724
+ tethers.splice(i, 1);
725
+ break;
726
+ } else {
727
+ _results.push(void 0);
728
+ }
729
+ }
730
+ return _results;
731
+ };
732
+
733
+ _Tether.prototype.updateAttachClasses = function(elementAttach, targetAttach) {
734
+ var add, all, side, sides, _i, _j, _len, _len1, _ref1,
735
+ _this = this;
736
+ if (elementAttach == null) {
737
+ elementAttach = this.attachment;
738
+ }
739
+ if (targetAttach == null) {
740
+ targetAttach = this.targetAttachment;
741
+ }
742
+ sides = ['left', 'top', 'bottom', 'right', 'middle', 'center'];
743
+ if ((_ref1 = this._addAttachClasses) != null ? _ref1.length : void 0) {
744
+ this._addAttachClasses.splice(0, this._addAttachClasses.length);
745
+ }
746
+ add = this._addAttachClasses != null ? this._addAttachClasses : this._addAttachClasses = [];
747
+ if (elementAttach.top) {
748
+ add.push("" + (this.getClass('element-attached')) + "-" + elementAttach.top);
749
+ }
750
+ if (elementAttach.left) {
751
+ add.push("" + (this.getClass('element-attached')) + "-" + elementAttach.left);
752
+ }
753
+ if (targetAttach.top) {
754
+ add.push("" + (this.getClass('target-attached')) + "-" + targetAttach.top);
755
+ }
756
+ if (targetAttach.left) {
757
+ add.push("" + (this.getClass('target-attached')) + "-" + targetAttach.left);
758
+ }
759
+ all = [];
760
+ for (_i = 0, _len = sides.length; _i < _len; _i++) {
761
+ side = sides[_i];
762
+ all.push("" + (this.getClass('element-attached')) + "-" + side);
763
+ }
764
+ for (_j = 0, _len1 = sides.length; _j < _len1; _j++) {
765
+ side = sides[_j];
766
+ all.push("" + (this.getClass('target-attached')) + "-" + side);
767
+ }
768
+ return defer(function() {
769
+ if (_this._addAttachClasses == null) {
770
+ return;
771
+ }
772
+ updateClasses(_this.element, _this._addAttachClasses, all);
773
+ updateClasses(_this.target, _this._addAttachClasses, all);
774
+ return _this._addAttachClasses = void 0;
775
+ });
776
+ };
777
+
778
+ _Tether.prototype.position = function(flushChanges) {
779
+ var elementPos, elementStyle, height, left, manualOffset, manualTargetOffset, module, next, offset, offsetBorder, offsetParent, offsetParentSize, offsetParentStyle, offsetPosition, ret, scrollLeft, scrollTop, scrollbarSize, side, targetAttachment, targetOffset, targetPos, targetSize, top, width, _i, _j, _len, _len1, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6,
780
+ _this = this;
781
+ if (flushChanges == null) {
782
+ flushChanges = true;
783
+ }
784
+ if (!this.enabled) {
785
+ return;
786
+ }
787
+ this.clearCache();
788
+ targetAttachment = autoToFixedAttachment(this.targetAttachment, this.attachment);
789
+ this.updateAttachClasses(this.attachment, targetAttachment);
790
+ elementPos = this.cache('element-bounds', function() {
791
+ return getBounds(_this.element);
792
+ });
793
+ width = elementPos.width, height = elementPos.height;
794
+ if (width === 0 && height === 0 && (this.lastSize != null)) {
795
+ _ref1 = this.lastSize, width = _ref1.width, height = _ref1.height;
796
+ } else {
797
+ this.lastSize = {
798
+ width: width,
799
+ height: height
800
+ };
801
+ }
802
+ targetSize = targetPos = this.cache('target-bounds', function() {
803
+ return _this.getTargetBounds();
804
+ });
805
+ offset = offsetToPx(attachmentToOffset(this.attachment), {
806
+ width: width,
807
+ height: height
808
+ });
809
+ targetOffset = offsetToPx(attachmentToOffset(targetAttachment), targetSize);
810
+ manualOffset = offsetToPx(this.offset, {
811
+ width: width,
812
+ height: height
813
+ });
814
+ manualTargetOffset = offsetToPx(this.targetOffset, targetSize);
815
+ offset = addOffset(offset, manualOffset);
816
+ targetOffset = addOffset(targetOffset, manualTargetOffset);
817
+ left = targetPos.left + targetOffset.left - offset.left;
818
+ top = targetPos.top + targetOffset.top - offset.top;
819
+ _ref2 = Tether.modules;
820
+ for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
821
+ module = _ref2[_i];
822
+ ret = module.position.call(this, {
823
+ left: left,
824
+ top: top,
825
+ targetAttachment: targetAttachment,
826
+ targetPos: targetPos,
827
+ attachment: this.attachment,
828
+ elementPos: elementPos,
829
+ offset: offset,
830
+ targetOffset: targetOffset,
831
+ manualOffset: manualOffset,
832
+ manualTargetOffset: manualTargetOffset,
833
+ scrollbarSize: scrollbarSize
834
+ });
835
+ if ((ret == null) || typeof ret !== 'object') {
836
+ continue;
837
+ } else if (ret === false) {
838
+ return false;
839
+ } else {
840
+ top = ret.top, left = ret.left;
841
+ }
842
+ }
843
+ next = {
844
+ page: {
845
+ top: top,
846
+ left: left
847
+ },
848
+ viewport: {
849
+ top: top - pageYOffset,
850
+ bottom: pageYOffset - top - height + innerHeight,
851
+ left: left - pageXOffset,
852
+ right: pageXOffset - left - width + innerWidth
853
+ }
854
+ };
855
+ if (document.body.scrollWidth > window.innerWidth) {
856
+ scrollbarSize = this.cache('scrollbar-size', getScrollBarSize);
857
+ next.viewport.bottom -= scrollbarSize.height;
858
+ }
859
+ if (document.body.scrollHeight > window.innerHeight) {
860
+ scrollbarSize = this.cache('scrollbar-size', getScrollBarSize);
861
+ next.viewport.right -= scrollbarSize.width;
862
+ }
863
+ if (((_ref3 = document.body.style.position) !== '' && _ref3 !== 'static') || ((_ref4 = document.body.parentElement.style.position) !== '' && _ref4 !== 'static')) {
864
+ next.page.bottom = document.body.scrollHeight - top - height;
865
+ next.page.right = document.body.scrollWidth - left - width;
866
+ }
867
+ if (((_ref5 = this.options.optimizations) != null ? _ref5.moveElement : void 0) !== false && (this.targetModifier == null)) {
868
+ offsetParent = this.cache('target-offsetparent', function() {
869
+ return getOffsetParent(_this.target);
870
+ });
871
+ offsetPosition = this.cache('target-offsetparent-bounds', function() {
872
+ return getBounds(offsetParent);
873
+ });
874
+ offsetParentStyle = getComputedStyle(offsetParent);
875
+ elementStyle = getComputedStyle(this.element);
876
+ offsetParentSize = offsetPosition;
877
+ offsetBorder = {};
878
+ _ref6 = ['Top', 'Left', 'Bottom', 'Right'];
879
+ for (_j = 0, _len1 = _ref6.length; _j < _len1; _j++) {
880
+ side = _ref6[_j];
881
+ offsetBorder[side.toLowerCase()] = parseFloat(offsetParentStyle["border" + side + "Width"]);
882
+ }
883
+ offsetPosition.right = document.body.scrollWidth - offsetPosition.left - offsetParentSize.width + offsetBorder.right;
884
+ offsetPosition.bottom = document.body.scrollHeight - offsetPosition.top - offsetParentSize.height + offsetBorder.bottom;
885
+ if (next.page.top >= (offsetPosition.top + offsetBorder.top) && next.page.bottom >= offsetPosition.bottom) {
886
+ if (next.page.left >= (offsetPosition.left + offsetBorder.left) && next.page.right >= offsetPosition.right) {
887
+ scrollTop = offsetParent.scrollTop;
888
+ scrollLeft = offsetParent.scrollLeft;
889
+ next.offset = {
890
+ top: next.page.top - offsetPosition.top + scrollTop - offsetBorder.top,
891
+ left: next.page.left - offsetPosition.left + scrollLeft - offsetBorder.left
892
+ };
893
+ }
894
+ }
895
+ }
896
+ this.move(next);
897
+ this.history.unshift(next);
898
+ if (this.history.length > 3) {
899
+ this.history.pop();
900
+ }
901
+ if (flushChanges) {
902
+ flush();
903
+ }
904
+ return true;
905
+ };
906
+
907
+ _Tether.prototype.move = function(position) {
908
+ var css, elVal, found, key, moved, offsetParent, point, same, transcribe, type, val, write, writeCSS, _i, _len, _ref1, _ref2,
909
+ _this = this;
910
+ if (this.element.parentNode == null) {
911
+ return;
912
+ }
913
+ same = {};
914
+ for (type in position) {
915
+ same[type] = {};
916
+ for (key in position[type]) {
917
+ found = false;
918
+ _ref1 = this.history;
919
+ for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
920
+ point = _ref1[_i];
921
+ if (!within((_ref2 = point[type]) != null ? _ref2[key] : void 0, position[type][key])) {
922
+ found = true;
923
+ break;
924
+ }
925
+ }
926
+ if (!found) {
927
+ same[type][key] = true;
928
+ }
929
+ }
930
+ }
931
+ css = {
932
+ top: '',
933
+ left: '',
934
+ right: '',
935
+ bottom: ''
936
+ };
937
+ transcribe = function(same, pos) {
938
+ var xPos, yPos, _ref3;
939
+ if (((_ref3 = _this.options.optimizations) != null ? _ref3.gpu : void 0) !== false) {
940
+ if (same.top) {
941
+ css.top = 0;
942
+ yPos = pos.top;
943
+ } else {
944
+ css.bottom = 0;
945
+ yPos = -pos.bottom;
946
+ }
947
+ if (same.left) {
948
+ css.left = 0;
949
+ xPos = pos.left;
950
+ } else {
951
+ css.right = 0;
952
+ xPos = -pos.right;
953
+ }
954
+ css[transformKey] = "translateX(" + (Math.round(xPos)) + "px) translateY(" + (Math.round(yPos)) + "px)";
955
+ if (transformKey !== 'msTransform') {
956
+ return css[transformKey] += " translateZ(0)";
957
+ }
958
+ } else {
959
+ if (same.top) {
960
+ css.top = "" + pos.top + "px";
961
+ } else {
962
+ css.bottom = "" + pos.bottom + "px";
963
+ }
964
+ if (same.left) {
965
+ return css.left = "" + pos.left + "px";
966
+ } else {
967
+ return css.right = "" + pos.right + "px";
968
+ }
969
+ }
970
+ };
971
+ moved = false;
972
+ if ((same.page.top || same.page.bottom) && (same.page.left || same.page.right)) {
973
+ css.position = 'absolute';
974
+ transcribe(same.page, position.page);
975
+ } else if ((same.viewport.top || same.viewport.bottom) && (same.viewport.left || same.viewport.right)) {
976
+ css.position = 'fixed';
977
+ transcribe(same.viewport, position.viewport);
978
+ } else if ((same.offset != null) && same.offset.top && same.offset.left) {
979
+ css.position = 'absolute';
980
+ offsetParent = this.cache('target-offsetparent', function() {
981
+ return getOffsetParent(_this.target);
982
+ });
983
+ if (getOffsetParent(this.element) !== offsetParent) {
984
+ defer(function() {
985
+ _this.element.parentNode.removeChild(_this.element);
986
+ return offsetParent.appendChild(_this.element);
987
+ });
988
+ }
989
+ transcribe(same.offset, position.offset);
990
+ moved = true;
991
+ } else {
992
+ css.position = 'absolute';
993
+ transcribe({
994
+ top: true,
995
+ left: true
996
+ }, position.page);
997
+ }
998
+ if (!moved && this.element.parentNode.tagName !== 'BODY') {
999
+ this.element.parentNode.removeChild(this.element);
1000
+ document.body.appendChild(this.element);
1001
+ }
1002
+ writeCSS = {};
1003
+ write = false;
1004
+ for (key in css) {
1005
+ val = css[key];
1006
+ elVal = this.element.style[key];
1007
+ if (elVal !== '' && val !== '' && (key === 'top' || key === 'left' || key === 'bottom' || key === 'right')) {
1008
+ elVal = parseFloat(elVal);
1009
+ val = parseFloat(val);
1010
+ }
1011
+ if (elVal !== val) {
1012
+ write = true;
1013
+ writeCSS[key] = css[key];
1014
+ }
1015
+ }
1016
+ if (write) {
1017
+ return defer(function() {
1018
+ return extend(_this.element.style, writeCSS);
1019
+ });
1020
+ }
1021
+ };
1022
+
1023
+ return _Tether;
1024
+
1025
+ })();
1026
+
1027
+ Tether.position = position;
1028
+
1029
+ this.Tether = extend(_Tether, Tether);
1030
+
1031
+ }).call(this);
1032
+
1033
+ (function() {
1034
+ var BOUNDS_FORMAT, MIRROR_ATTACH, defer, extend, getBoundingRect, getBounds, getOuterSize, getSize, updateClasses, _ref,
1035
+ __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
1036
+
1037
+ _ref = this.Tether.Utils, getOuterSize = _ref.getOuterSize, getBounds = _ref.getBounds, getSize = _ref.getSize, extend = _ref.extend, updateClasses = _ref.updateClasses, defer = _ref.defer;
1038
+
1039
+ MIRROR_ATTACH = {
1040
+ left: 'right',
1041
+ right: 'left',
1042
+ top: 'bottom',
1043
+ bottom: 'top',
1044
+ middle: 'middle'
1045
+ };
1046
+
1047
+ BOUNDS_FORMAT = ['left', 'top', 'right', 'bottom'];
1048
+
1049
+ getBoundingRect = function(tether, to) {
1050
+ var i, pos, side, size, style, _i, _len;
1051
+ if (to === 'scrollParent') {
1052
+ to = tether.scrollParent;
1053
+ } else if (to === 'window') {
1054
+ to = [pageXOffset, pageYOffset, innerWidth + pageXOffset, innerHeight + pageYOffset];
1055
+ }
1056
+ if (to === document) {
1057
+ to = to.documentElement;
1058
+ }
1059
+ if (to.nodeType != null) {
1060
+ pos = size = getBounds(to);
1061
+ style = getComputedStyle(to);
1062
+ to = [pos.left, pos.top, size.width + pos.left, size.height + pos.top];
1063
+ for (i = _i = 0, _len = BOUNDS_FORMAT.length; _i < _len; i = ++_i) {
1064
+ side = BOUNDS_FORMAT[i];
1065
+ side = side[0].toUpperCase() + side.substr(1);
1066
+ if (side === 'Top' || side === 'Left') {
1067
+ to[i] += parseFloat(style["border" + side + "Width"]);
1068
+ } else {
1069
+ to[i] -= parseFloat(style["border" + side + "Width"]);
1070
+ }
1071
+ }
1072
+ }
1073
+ return to;
1074
+ };
1075
+
1076
+ this.Tether.modules.push({
1077
+ position: function(_arg) {
1078
+ var addClasses, allClasses, attachment, bounds, changeAttachX, changeAttachY, cls, constraint, eAttachment, height, left, oob, oobClass, p, pin, pinned, pinnedClass, removeClass, side, tAttachment, targetAttachment, targetHeight, targetSize, targetWidth, to, top, width, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _len5, _m, _n, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8,
1079
+ _this = this;
1080
+ top = _arg.top, left = _arg.left, targetAttachment = _arg.targetAttachment;
1081
+ if (!this.options.constraints) {
1082
+ return true;
1083
+ }
1084
+ removeClass = function(prefix) {
1085
+ var side, _i, _len, _results;
1086
+ _this.removeClass(prefix);
1087
+ _results = [];
1088
+ for (_i = 0, _len = BOUNDS_FORMAT.length; _i < _len; _i++) {
1089
+ side = BOUNDS_FORMAT[_i];
1090
+ _results.push(_this.removeClass("" + prefix + "-" + side));
1091
+ }
1092
+ return _results;
1093
+ };
1094
+ _ref1 = this.cache('element-bounds', function() {
1095
+ return getBounds(_this.element);
1096
+ }), height = _ref1.height, width = _ref1.width;
1097
+ if (width === 0 && height === 0 && (this.lastSize != null)) {
1098
+ _ref2 = this.lastSize, width = _ref2.width, height = _ref2.height;
1099
+ }
1100
+ targetSize = this.cache('target-bounds', function() {
1101
+ return _this.getTargetBounds();
1102
+ });
1103
+ targetHeight = targetSize.height;
1104
+ targetWidth = targetSize.width;
1105
+ tAttachment = {};
1106
+ eAttachment = {};
1107
+ allClasses = [this.getClass('pinned'), this.getClass('out-of-bounds')];
1108
+ _ref3 = this.options.constraints;
1109
+ for (_i = 0, _len = _ref3.length; _i < _len; _i++) {
1110
+ constraint = _ref3[_i];
1111
+ if (constraint.outOfBoundsClass) {
1112
+ allClasses.push(constraint.outOfBoundsClass);
1113
+ }
1114
+ if (constraint.pinnedClass) {
1115
+ allClasses.push(constraint.pinnedClass);
1116
+ }
1117
+ }
1118
+ for (_j = 0, _len1 = allClasses.length; _j < _len1; _j++) {
1119
+ cls = allClasses[_j];
1120
+ _ref4 = ['left', 'top', 'right', 'bottom'];
1121
+ for (_k = 0, _len2 = _ref4.length; _k < _len2; _k++) {
1122
+ side = _ref4[_k];
1123
+ allClasses.push("" + cls + "-" + side);
1124
+ }
1125
+ }
1126
+ addClasses = [];
1127
+ tAttachment = extend({}, targetAttachment);
1128
+ eAttachment = extend({}, this.attachment);
1129
+ _ref5 = this.options.constraints;
1130
+ for (_l = 0, _len3 = _ref5.length; _l < _len3; _l++) {
1131
+ constraint = _ref5[_l];
1132
+ to = constraint.to, attachment = constraint.attachment, pin = constraint.pin;
1133
+ if (attachment == null) {
1134
+ attachment = '';
1135
+ }
1136
+ if (__indexOf.call(attachment, ' ') >= 0) {
1137
+ _ref6 = attachment.split(' '), changeAttachY = _ref6[0], changeAttachX = _ref6[1];
1138
+ } else {
1139
+ changeAttachX = changeAttachY = attachment;
1140
+ }
1141
+ bounds = getBoundingRect(this, to);
1142
+ if (changeAttachY === 'target' || changeAttachY === 'both') {
1143
+ if (top < bounds[1] && tAttachment.top === 'top') {
1144
+ top += targetHeight;
1145
+ tAttachment.top = 'bottom';
1146
+ }
1147
+ if (top + height > bounds[3] && tAttachment.top === 'bottom') {
1148
+ top -= targetHeight;
1149
+ tAttachment.top = 'top';
1150
+ }
1151
+ }
1152
+ if (changeAttachY === 'together') {
1153
+ if (top < bounds[1] && tAttachment.top === 'top') {
1154
+ if (eAttachment.top === 'bottom') {
1155
+ top += targetHeight;
1156
+ tAttachment.top = 'bottom';
1157
+ top += height;
1158
+ eAttachment.top = 'top';
1159
+ } else if (eAttachment.top === 'top') {
1160
+ top += targetHeight;
1161
+ tAttachment.top = 'bottom';
1162
+ top -= height;
1163
+ eAttachment.top = 'bottom';
1164
+ }
1165
+ }
1166
+ if (top + height > bounds[3] && tAttachment.top === 'bottom') {
1167
+ if (eAttachment.top === 'top') {
1168
+ top -= targetHeight;
1169
+ tAttachment.top = 'top';
1170
+ top -= height;
1171
+ eAttachment.top = 'bottom';
1172
+ } else if (eAttachment.top === 'bottom') {
1173
+ top -= targetHeight;
1174
+ tAttachment.top = 'top';
1175
+ top += height;
1176
+ eAttachment.top = 'top';
1177
+ }
1178
+ }
1179
+ if (tAttachment.top === 'middle') {
1180
+ if (top + height > bounds[3] && eAttachment.top === 'top') {
1181
+ top -= height;
1182
+ eAttachment.top = 'bottom';
1183
+ } else if (top < bounds[1] && eAttachment.top === 'bottom') {
1184
+ top += height;
1185
+ eAttachment.top = 'top';
1186
+ }
1187
+ }
1188
+ }
1189
+ if (changeAttachX === 'target' || changeAttachX === 'both') {
1190
+ if (left < bounds[0] && tAttachment.left === 'left') {
1191
+ left += targetWidth;
1192
+ tAttachment.left = 'right';
1193
+ }
1194
+ if (left + width > bounds[2] && tAttachment.left === 'right') {
1195
+ left -= targetWidth;
1196
+ tAttachment.left = 'left';
1197
+ }
1198
+ }
1199
+ if (changeAttachX === 'together') {
1200
+ if (left < bounds[0] && tAttachment.left === 'left') {
1201
+ if (eAttachment.left === 'right') {
1202
+ left += targetWidth;
1203
+ tAttachment.left = 'right';
1204
+ left += width;
1205
+ eAttachment.left = 'left';
1206
+ } else if (eAttachment.left === 'left') {
1207
+ left += targetWidth;
1208
+ tAttachment.left = 'right';
1209
+ left -= width;
1210
+ eAttachment.left = 'right';
1211
+ }
1212
+ } else if (left + width > bounds[2] && tAttachment.left === 'right') {
1213
+ if (eAttachment.left === 'left') {
1214
+ left -= targetWidth;
1215
+ tAttachment.left = 'left';
1216
+ left -= width;
1217
+ eAttachment.left = 'right';
1218
+ } else if (eAttachment.left === 'right') {
1219
+ left -= targetWidth;
1220
+ tAttachment.left = 'left';
1221
+ left += width;
1222
+ eAttachment.left = 'left';
1223
+ }
1224
+ } else if (tAttachment.left === 'center') {
1225
+ if (left + width > bounds[2] && eAttachment.left === 'left') {
1226
+ left -= width;
1227
+ eAttachment.left = 'right';
1228
+ } else if (left < bounds[0] && eAttachment.left === 'right') {
1229
+ left += width;
1230
+ eAttachment.left = 'left';
1231
+ }
1232
+ }
1233
+ }
1234
+ if (changeAttachY === 'element' || changeAttachY === 'both') {
1235
+ if (top < bounds[1] && eAttachment.top === 'bottom') {
1236
+ top += height;
1237
+ eAttachment.top = 'top';
1238
+ }
1239
+ if (top + height > bounds[3] && eAttachment.top === 'top') {
1240
+ top -= height;
1241
+ eAttachment.top = 'bottom';
1242
+ }
1243
+ }
1244
+ if (changeAttachX === 'element' || changeAttachX === 'both') {
1245
+ if (left < bounds[0] && eAttachment.left === 'right') {
1246
+ left += width;
1247
+ eAttachment.left = 'left';
1248
+ }
1249
+ if (left + width > bounds[2] && eAttachment.left === 'left') {
1250
+ left -= width;
1251
+ eAttachment.left = 'right';
1252
+ }
1253
+ }
1254
+ if (typeof pin === 'string') {
1255
+ pin = (function() {
1256
+ var _len4, _m, _ref7, _results;
1257
+ _ref7 = pin.split(',');
1258
+ _results = [];
1259
+ for (_m = 0, _len4 = _ref7.length; _m < _len4; _m++) {
1260
+ p = _ref7[_m];
1261
+ _results.push(p.trim());
1262
+ }
1263
+ return _results;
1264
+ })();
1265
+ } else if (pin === true) {
1266
+ pin = ['top', 'left', 'right', 'bottom'];
1267
+ }
1268
+ pin || (pin = []);
1269
+ pinned = [];
1270
+ oob = [];
1271
+ if (top < bounds[1]) {
1272
+ if (__indexOf.call(pin, 'top') >= 0) {
1273
+ top = bounds[1];
1274
+ pinned.push('top');
1275
+ } else {
1276
+ oob.push('top');
1277
+ }
1278
+ }
1279
+ if (top + height > bounds[3]) {
1280
+ if (__indexOf.call(pin, 'bottom') >= 0) {
1281
+ top = bounds[3] - height;
1282
+ pinned.push('bottom');
1283
+ } else {
1284
+ oob.push('bottom');
1285
+ }
1286
+ }
1287
+ if (left < bounds[0]) {
1288
+ if (__indexOf.call(pin, 'left') >= 0) {
1289
+ left = bounds[0];
1290
+ pinned.push('left');
1291
+ } else {
1292
+ oob.push('left');
1293
+ }
1294
+ }
1295
+ if (left + width > bounds[2]) {
1296
+ if (__indexOf.call(pin, 'right') >= 0) {
1297
+ left = bounds[2] - width;
1298
+ pinned.push('right');
1299
+ } else {
1300
+ oob.push('right');
1301
+ }
1302
+ }
1303
+ if (pinned.length) {
1304
+ pinnedClass = (_ref7 = this.options.pinnedClass) != null ? _ref7 : this.getClass('pinned');
1305
+ addClasses.push(pinnedClass);
1306
+ for (_m = 0, _len4 = pinned.length; _m < _len4; _m++) {
1307
+ side = pinned[_m];
1308
+ addClasses.push("" + pinnedClass + "-" + side);
1309
+ }
1310
+ }
1311
+ if (oob.length) {
1312
+ oobClass = (_ref8 = this.options.outOfBoundsClass) != null ? _ref8 : this.getClass('out-of-bounds');
1313
+ addClasses.push(oobClass);
1314
+ for (_n = 0, _len5 = oob.length; _n < _len5; _n++) {
1315
+ side = oob[_n];
1316
+ addClasses.push("" + oobClass + "-" + side);
1317
+ }
1318
+ }
1319
+ if (__indexOf.call(pinned, 'left') >= 0 || __indexOf.call(pinned, 'right') >= 0) {
1320
+ eAttachment.left = tAttachment.left = false;
1321
+ }
1322
+ if (__indexOf.call(pinned, 'top') >= 0 || __indexOf.call(pinned, 'bottom') >= 0) {
1323
+ eAttachment.top = tAttachment.top = false;
1324
+ }
1325
+ if (tAttachment.top !== targetAttachment.top || tAttachment.left !== targetAttachment.left || eAttachment.top !== this.attachment.top || eAttachment.left !== this.attachment.left) {
1326
+ this.updateAttachClasses(eAttachment, tAttachment);
1327
+ }
1328
+ }
1329
+ defer(function() {
1330
+ updateClasses(_this.target, addClasses, allClasses);
1331
+ return updateClasses(_this.element, addClasses, allClasses);
1332
+ });
1333
+ return {
1334
+ top: top,
1335
+ left: left
1336
+ };
1337
+ }
1338
+ });
1339
+
1340
+ }).call(this);
1341
+
1342
+ (function() {
1343
+ var defer, getBounds, updateClasses, _ref;
1344
+
1345
+ _ref = this.Tether.Utils, getBounds = _ref.getBounds, updateClasses = _ref.updateClasses, defer = _ref.defer;
1346
+
1347
+ this.Tether.modules.push({
1348
+ position: function(_arg) {
1349
+ var abutted, addClasses, allClasses, bottom, height, left, right, side, sides, targetPos, top, width, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref1, _ref2, _ref3, _ref4, _ref5,
1350
+ _this = this;
1351
+ top = _arg.top, left = _arg.left;
1352
+ _ref1 = this.cache('element-bounds', function() {
1353
+ return getBounds(_this.element);
1354
+ }), height = _ref1.height, width = _ref1.width;
1355
+ targetPos = this.getTargetBounds();
1356
+ bottom = top + height;
1357
+ right = left + width;
1358
+ abutted = [];
1359
+ if (top <= targetPos.bottom && bottom >= targetPos.top) {
1360
+ _ref2 = ['left', 'right'];
1361
+ for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
1362
+ side = _ref2[_i];
1363
+ if ((_ref3 = targetPos[side]) === left || _ref3 === right) {
1364
+ abutted.push(side);
1365
+ }
1366
+ }
1367
+ }
1368
+ if (left <= targetPos.right && right >= targetPos.left) {
1369
+ _ref4 = ['top', 'bottom'];
1370
+ for (_j = 0, _len1 = _ref4.length; _j < _len1; _j++) {
1371
+ side = _ref4[_j];
1372
+ if ((_ref5 = targetPos[side]) === top || _ref5 === bottom) {
1373
+ abutted.push(side);
1374
+ }
1375
+ }
1376
+ }
1377
+ allClasses = [];
1378
+ addClasses = [];
1379
+ sides = ['left', 'top', 'right', 'bottom'];
1380
+ allClasses.push(this.getClass('abutted'));
1381
+ for (_k = 0, _len2 = sides.length; _k < _len2; _k++) {
1382
+ side = sides[_k];
1383
+ allClasses.push("" + (this.getClass('abutted')) + "-" + side);
1384
+ }
1385
+ if (abutted.length) {
1386
+ addClasses.push(this.getClass('abutted'));
1387
+ }
1388
+ for (_l = 0, _len3 = abutted.length; _l < _len3; _l++) {
1389
+ side = abutted[_l];
1390
+ addClasses.push("" + (this.getClass('abutted')) + "-" + side);
1391
+ }
1392
+ defer(function() {
1393
+ updateClasses(_this.target, addClasses, allClasses);
1394
+ return updateClasses(_this.element, addClasses, allClasses);
1395
+ });
1396
+ return true;
1397
+ }
1398
+ });
1399
+
1400
+ }).call(this);
1401
+
1402
+ (function() {
1403
+ this.Tether.modules.push({
1404
+ position: function(_arg) {
1405
+ var left, result, shift, shiftLeft, shiftTop, top, _ref;
1406
+ top = _arg.top, left = _arg.left;
1407
+ if (!this.options.shift) {
1408
+ return;
1409
+ }
1410
+ result = function(val) {
1411
+ if (typeof val === 'function') {
1412
+ return val.call(this, {
1413
+ top: top,
1414
+ left: left
1415
+ });
1416
+ } else {
1417
+ return val;
1418
+ }
1419
+ };
1420
+ shift = result(this.options.shift);
1421
+ if (typeof shift === 'string') {
1422
+ shift = shift.split(' ');
1423
+ shift[1] || (shift[1] = shift[0]);
1424
+ shiftTop = shift[0], shiftLeft = shift[1];
1425
+ shiftTop = parseFloat(shiftTop, 10);
1426
+ shiftLeft = parseFloat(shiftLeft, 10);
1427
+ } else {
1428
+ _ref = [shift.top, shift.left], shiftTop = _ref[0], shiftLeft = _ref[1];
1429
+ }
1430
+ top += shiftTop;
1431
+ left += shiftLeft;
1432
+ return {
1433
+ top: top,
1434
+ left: left
1435
+ };
1436
+ }
1437
+ });
1438
+
1439
+ }).call(this);
1440
+
1441
+ return this.Tether;
1442
+
1443
+ }));