(function() { var BOUNDS_FORMAT, MIRROR_ATTACH, defer, extend, getBoundingRect, getBounds, getOuterSize, getSize, updateClasses, _ref, __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; }; _ref = this.Tether.Utils, getOuterSize = _ref.getOuterSize, getBounds = _ref.getBounds, getSize = _ref.getSize, extend = _ref.extend, updateClasses = _ref.updateClasses, defer = _ref.defer; MIRROR_ATTACH = { left: 'right', right: 'left', top: 'bottom', bottom: 'top', middle: 'middle' }; BOUNDS_FORMAT = ['left', 'top', 'right', 'bottom']; getBoundingRect = function(tether, to) { var i, pos, side, size, style, _i, _len; if (to === 'scrollParent') { to = tether.scrollParent; } else if (to === 'window') { to = [pageXOffset, pageYOffset, innerWidth + pageXOffset, innerHeight + pageYOffset]; } if (to === document) { to = to.documentElement; } if (to.nodeType != null) { pos = size = getBounds(to); style = getComputedStyle(to); to = [pos.left, pos.top, size.width + pos.left, size.height + pos.top]; for (i = _i = 0, _len = BOUNDS_FORMAT.length; _i < _len; i = ++_i) { side = BOUNDS_FORMAT[i]; side = side[0].toUpperCase() + side.substr(1); if (side === 'Top' || side === 'Left') { to[i] += parseFloat(style["border" + side + "Width"]); } else { to[i] -= parseFloat(style["border" + side + "Width"]); } } } return to; }; this.Tether.modules.push({ position: function(_arg) { 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, _this = this; top = _arg.top, left = _arg.left, targetAttachment = _arg.targetAttachment; if (!this.options.constraints) { return true; } removeClass = function(prefix) { var side, _i, _len, _results; _this.removeClass(prefix); _results = []; for (_i = 0, _len = BOUNDS_FORMAT.length; _i < _len; _i++) { side = BOUNDS_FORMAT[_i]; _results.push(_this.removeClass("" + prefix + "-" + side)); } return _results; }; _ref1 = this.cache('element-bounds', function() { return getBounds(_this.element); }), height = _ref1.height, width = _ref1.width; if (width === 0 && height === 0 && (this.lastSize != null)) { _ref2 = this.lastSize, width = _ref2.width, height = _ref2.height; } targetSize = this.cache('target-bounds', function() { return _this.getTargetBounds(); }); targetHeight = targetSize.height; targetWidth = targetSize.width; tAttachment = {}; eAttachment = {}; allClasses = [this.getClass('pinned'), this.getClass('out-of-bounds')]; _ref3 = this.options.constraints; for (_i = 0, _len = _ref3.length; _i < _len; _i++) { constraint = _ref3[_i]; if (constraint.outOfBoundsClass) { allClasses.push(constraint.outOfBoundsClass); } if (constraint.pinnedClass) { allClasses.push(constraint.pinnedClass); } } for (_j = 0, _len1 = allClasses.length; _j < _len1; _j++) { cls = allClasses[_j]; _ref4 = ['left', 'top', 'right', 'bottom']; for (_k = 0, _len2 = _ref4.length; _k < _len2; _k++) { side = _ref4[_k]; allClasses.push("" + cls + "-" + side); } } addClasses = []; tAttachment = extend({}, targetAttachment); eAttachment = extend({}, this.attachment); _ref5 = this.options.constraints; for (_l = 0, _len3 = _ref5.length; _l < _len3; _l++) { constraint = _ref5[_l]; to = constraint.to, attachment = constraint.attachment, pin = constraint.pin; if (attachment == null) { attachment = ''; } if (__indexOf.call(attachment, ' ') >= 0) { _ref6 = attachment.split(' '), changeAttachY = _ref6[0], changeAttachX = _ref6[1]; } else { changeAttachX = changeAttachY = attachment; } bounds = getBoundingRect(this, to); if (changeAttachY === 'target' || changeAttachY === 'both') { if (top < bounds[1] && tAttachment.top === 'top') { top += targetHeight; tAttachment.top = 'bottom'; } if (top + height > bounds[3] && tAttachment.top === 'bottom') { top -= targetHeight; tAttachment.top = 'top'; } } if (changeAttachY === 'together') { if (top < bounds[1] && tAttachment.top === 'top') { if (eAttachment.top === 'bottom') { top += targetHeight; tAttachment.top = 'bottom'; top += height; eAttachment.top = 'top'; } else if (eAttachment.top === 'top') { top += targetHeight; tAttachment.top = 'bottom'; top -= height; eAttachment.top = 'bottom'; } } if (top + height > bounds[3] && tAttachment.top === 'bottom') { if (eAttachment.top === 'top') { top -= targetHeight; tAttachment.top = 'top'; top -= height; eAttachment.top = 'bottom'; } else if (eAttachment.top === 'bottom') { top -= targetHeight; tAttachment.top = 'top'; top += height; eAttachment.top = 'top'; } } if (tAttachment.top === 'middle') { if (top + height > bounds[3] && eAttachment.top === 'top') { top -= height; eAttachment.top = 'bottom'; } else if (top < bounds[1] && eAttachment.top === 'bottom') { top += height; eAttachment.top = 'top'; } } } if (changeAttachX === 'target' || changeAttachX === 'both') { if (left < bounds[0] && tAttachment.left === 'left') { left += targetWidth; tAttachment.left = 'right'; } if (left + width > bounds[2] && tAttachment.left === 'right') { left -= targetWidth; tAttachment.left = 'left'; } } if (changeAttachX === 'together') { if (left < bounds[0] && tAttachment.left === 'left') { if (eAttachment.left === 'right') { left += targetWidth; tAttachment.left = 'right'; left += width; eAttachment.left = 'left'; } else if (eAttachment.left === 'left') { left += targetWidth; tAttachment.left = 'right'; left -= width; eAttachment.left = 'right'; } } else if (left + width > bounds[2] && tAttachment.left === 'right') { if (eAttachment.left === 'left') { left -= targetWidth; tAttachment.left = 'left'; left -= width; eAttachment.left = 'right'; } else if (eAttachment.left === 'right') { left -= targetWidth; tAttachment.left = 'left'; left += width; eAttachment.left = 'left'; } } else if (tAttachment.left === 'center') { if (left + width > bounds[2] && eAttachment.left === 'left') { left -= width; eAttachment.left = 'right'; } else if (left < bounds[0] && eAttachment.left === 'right') { left += width; eAttachment.left = 'left'; } } } if (changeAttachY === 'element' || changeAttachY === 'both') { if (top < bounds[1] && eAttachment.top === 'bottom') { top += height; eAttachment.top = 'top'; } if (top + height > bounds[3] && eAttachment.top === 'top') { top -= height; eAttachment.top = 'bottom'; } } if (changeAttachX === 'element' || changeAttachX === 'both') { if (left < bounds[0] && eAttachment.left === 'right') { left += width; eAttachment.left = 'left'; } if (left + width > bounds[2] && eAttachment.left === 'left') { left -= width; eAttachment.left = 'right'; } } if (typeof pin === 'string') { pin = (function() { var _len4, _m, _ref7, _results; _ref7 = pin.split(','); _results = []; for (_m = 0, _len4 = _ref7.length; _m < _len4; _m++) { p = _ref7[_m]; _results.push(p.trim()); } return _results; })(); } else if (pin === true) { pin = ['top', 'left', 'right', 'bottom']; } pin || (pin = []); pinned = []; oob = []; if (top < bounds[1]) { if (__indexOf.call(pin, 'top') >= 0) { top = bounds[1]; pinned.push('top'); } else { oob.push('top'); } } if (top + height > bounds[3]) { if (__indexOf.call(pin, 'bottom') >= 0) { top = bounds[3] - height; pinned.push('bottom'); } else { oob.push('bottom'); } } if (left < bounds[0]) { if (__indexOf.call(pin, 'left') >= 0) { left = bounds[0]; pinned.push('left'); } else { oob.push('left'); } } if (left + width > bounds[2]) { if (__indexOf.call(pin, 'right') >= 0) { left = bounds[2] - width; pinned.push('right'); } else { oob.push('right'); } } if (pinned.length) { pinnedClass = (_ref7 = this.options.pinnedClass) != null ? _ref7 : this.getClass('pinned'); addClasses.push(pinnedClass); for (_m = 0, _len4 = pinned.length; _m < _len4; _m++) { side = pinned[_m]; addClasses.push("" + pinnedClass + "-" + side); } } if (oob.length) { oobClass = (_ref8 = this.options.outOfBoundsClass) != null ? _ref8 : this.getClass('out-of-bounds'); addClasses.push(oobClass); for (_n = 0, _len5 = oob.length; _n < _len5; _n++) { side = oob[_n]; addClasses.push("" + oobClass + "-" + side); } } if (__indexOf.call(pinned, 'left') >= 0 || __indexOf.call(pinned, 'right') >= 0) { eAttachment.left = tAttachment.left = false; } if (__indexOf.call(pinned, 'top') >= 0 || __indexOf.call(pinned, 'bottom') >= 0) { eAttachment.top = tAttachment.top = false; } if (tAttachment.top !== targetAttachment.top || tAttachment.left !== targetAttachment.left || eAttachment.top !== this.attachment.top || eAttachment.left !== this.attachment.left) { this.updateAttachClasses(eAttachment, tAttachment); } } defer(function() { updateClasses(_this.target, addClasses, allClasses); return updateClasses(_this.element, addClasses, allClasses); }); return { top: top, left: left }; } }); }).call(this);