var $, ScrollHandler; $ = jQuery; ScrollHandler = (function() { function ScrollHandler(tree_widget) { this.tree_widget = tree_widget; this.previous_top = -1; this.is_initialized = false; } ScrollHandler.prototype._initScrollParent = function() { var $scroll_parent, getParentWithOverflow, setDocumentAsScrollParent; getParentWithOverflow = (function(_this) { return function() { var css_values, el, hasOverFlow, i, len, ref; css_values = ['overflow', 'overflow-y']; hasOverFlow = function(el) { var css_value, i, len, ref; for (i = 0, len = css_values.length; i < len; i++) { css_value = css_values[i]; if ((ref = $.css(el, css_value)) === 'auto' || ref === 'scroll') { return true; } } return false; }; if (hasOverFlow(_this.tree_widget.$el[0])) { return _this.tree_widget.$el; } ref = _this.tree_widget.$el.parents(); for (i = 0, len = ref.length; i < len; i++) { el = ref[i]; if (hasOverFlow(el)) { return $(el); } } return null; }; })(this); setDocumentAsScrollParent = (function(_this) { return function() { _this.scroll_parent_top = 0; return _this.$scroll_parent = null; }; })(this); if (this.tree_widget.$el.css('position') === 'fixed') { setDocumentAsScrollParent(); } $scroll_parent = getParentWithOverflow(); if ($scroll_parent && $scroll_parent.length && $scroll_parent[0].tagName !== 'HTML') { this.$scroll_parent = $scroll_parent; this.scroll_parent_top = this.$scroll_parent.offset().top; } else { setDocumentAsScrollParent(); } return this.is_initialized = true; }; ScrollHandler.prototype._ensureInit = function() { if (!this.is_initialized) { return this._initScrollParent(); } }; ScrollHandler.prototype.checkScrolling = function() { var hovered_area; this._ensureInit(); hovered_area = this.tree_widget.dnd_handler.hovered_area; if (hovered_area && hovered_area.top !== this.previous_top) { this.previous_top = hovered_area.top; if (this.$scroll_parent) { return this._handleScrollingWithScrollParent(hovered_area); } else { return this._handleScrollingWithDocument(hovered_area); } } }; ScrollHandler.prototype._handleScrollingWithScrollParent = function(area) { var distance_bottom; distance_bottom = this.scroll_parent_top + this.$scroll_parent[0].offsetHeight - area.bottom; if (distance_bottom < 20) { this.$scroll_parent[0].scrollTop += 20; this.tree_widget.refreshHitAreas(); return this.previous_top = -1; } else if ((area.top - this.scroll_parent_top) < 20) { this.$scroll_parent[0].scrollTop -= 20; this.tree_widget.refreshHitAreas(); return this.previous_top = -1; } }; ScrollHandler.prototype._handleScrollingWithDocument = function(area) { var distance_top; distance_top = area.top - $(document).scrollTop(); if (distance_top < 20) { return $(document).scrollTop($(document).scrollTop() - 20); } else if ($(window).height() - (area.bottom - $(document).scrollTop()) < 20) { return $(document).scrollTop($(document).scrollTop() + 20); } }; ScrollHandler.prototype.scrollTo = function(top) { var tree_top; this._ensureInit(); if (this.$scroll_parent) { return this.$scroll_parent[0].scrollTop = top; } else { tree_top = this.tree_widget.$el.offset().top; return $(document).scrollTop(top + tree_top); } }; ScrollHandler.prototype.isScrolledIntoView = function(element) { var $element, element_bottom, element_top, view_bottom, view_top; this._ensureInit(); $element = $(element); if (this.$scroll_parent) { view_top = 0; view_bottom = this.$scroll_parent.height(); element_top = $element.offset().top - this.scroll_parent_top; element_bottom = element_top + $element.height(); } else { view_top = $(window).scrollTop(); view_bottom = view_top + $(window).height(); element_top = $element.offset().top; element_bottom = element_top + $element.height(); } return (element_bottom <= view_bottom) && (element_top >= view_top); }; return ScrollHandler; })(); module.exports = ScrollHandler;