Update JSON API
[src/app-framework-demo.git] / afm-client / bower_components / tether / tether.js
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 }));