nexus site path corrected
[portal.git] / ecomp-portal-FE / client / bower_components / jqTree / src / scroll_handler.coffee
1 $ = jQuery
2
3
4 class ScrollHandler
5     constructor: (tree_widget) ->
6         @tree_widget = tree_widget
7         @previous_top = -1
8         @is_initialized = false
9
10     _initScrollParent: ->
11         getParentWithOverflow = =>
12             css_values = ['overflow', 'overflow-y']
13
14             hasOverFlow = (el) ->
15                 for css_value in css_values
16                     if $.css(el, css_value) in ['auto', 'scroll']
17                         return true
18
19                 return false
20
21             if hasOverFlow(@tree_widget.$el[0])
22                 return @tree_widget.$el
23
24             for el in @tree_widget.$el.parents()
25                 if hasOverFlow(el)
26                     return $(el)
27
28             return null
29
30         setDocumentAsScrollParent = =>
31             @scroll_parent_top = 0
32             @$scroll_parent = null
33
34         if @tree_widget.$el.css('position') == 'fixed'
35             setDocumentAsScrollParent()
36
37         $scroll_parent = getParentWithOverflow()
38
39         if $scroll_parent and $scroll_parent.length and $scroll_parent[0].tagName != 'HTML'
40             @$scroll_parent = $scroll_parent
41             @scroll_parent_top = @$scroll_parent.offset().top
42         else
43             setDocumentAsScrollParent()
44
45         @is_initialized = true
46
47     _ensureInit: ->
48         if not @is_initialized
49             @_initScrollParent()
50
51     checkScrolling: ->
52         @_ensureInit()
53
54         hovered_area = @tree_widget.dnd_handler.hovered_area
55
56         if hovered_area and hovered_area.top != @previous_top
57             @previous_top = hovered_area.top
58
59             if @$scroll_parent
60                 @_handleScrollingWithScrollParent(hovered_area)
61             else
62                 @_handleScrollingWithDocument(hovered_area)
63
64     _handleScrollingWithScrollParent: (area) ->
65         distance_bottom = @scroll_parent_top + @$scroll_parent[0].offsetHeight - area.bottom
66
67         if distance_bottom < 20
68             @$scroll_parent[0].scrollTop += 20
69             @tree_widget.refreshHitAreas()
70             @previous_top = -1
71         else if (area.top - @scroll_parent_top) < 20
72             @$scroll_parent[0].scrollTop -= 20
73             @tree_widget.refreshHitAreas()
74             @previous_top = -1
75
76     _handleScrollingWithDocument: (area) ->
77         distance_top = area.top - $(document).scrollTop()
78
79         if distance_top < 20
80             $(document).scrollTop($(document).scrollTop() - 20)
81         else if $(window).height() - (area.bottom - $(document).scrollTop()) < 20
82             $(document).scrollTop($(document).scrollTop() + 20)
83
84     scrollTo: (top) ->
85         @_ensureInit()
86
87         if @$scroll_parent
88             @$scroll_parent[0].scrollTop = top
89         else
90             tree_top = @tree_widget.$el.offset().top
91             $(document).scrollTop(top + tree_top)
92
93     isScrolledIntoView: (element) ->
94         @_ensureInit()
95
96         $element = $(element)
97
98         if @$scroll_parent
99             view_top = 0
100             view_bottom = @$scroll_parent.height()
101
102             element_top = $element.offset().top - @scroll_parent_top
103             element_bottom = element_top + $element.height()
104         else
105             view_top = $(window).scrollTop()
106             view_bottom = view_top + $(window).height()
107
108             element_top = $element.offset().top
109             element_bottom = element_top + $element.height()
110
111         return (element_bottom <= view_bottom) and (element_top >= view_top)
112
113
114 module.exports = ScrollHandler