root / snf-cyclades-app / synnefo / ui / new_ui / ui / javascripts / jquery.jscrollpane.js @ 0105abee
History | View | Annotate | Download (45.7 kB)
1 | 0d264436 | Olga Brani | /*!
|
---|---|---|---|
2 | 0d264436 | Olga Brani | * jScrollPane - v2.0.17 - 2013-08-17
|
3 | 0d264436 | Olga Brani | * http://jscrollpane.kelvinluck.com/
|
4 | 0d264436 | Olga Brani | *
|
5 | 0d264436 | Olga Brani | * Copyright (c) 2013 Kelvin Luck
|
6 | 0d264436 | Olga Brani | * Dual licensed under the MIT or GPL licenses.
|
7 | 0d264436 | Olga Brani | */
|
8 | 0d264436 | Olga Brani | |
9 | 0d264436 | Olga Brani | // Script: jScrollPane - cross browser customisable scrollbars
|
10 | 0d264436 | Olga Brani | //
|
11 | 0d264436 | Olga Brani | // *Version: 2.0.17, Last updated: 2013-08-17*
|
12 | 0d264436 | Olga Brani | //
|
13 | 0d264436 | Olga Brani | // Project Home - http://jscrollpane.kelvinluck.com/
|
14 | 0d264436 | Olga Brani | // GitHub - http://github.com/vitch/jScrollPane
|
15 | 0d264436 | Olga Brani | // Source - http://github.com/vitch/jScrollPane/raw/master/script/jquery.jscrollpane.js
|
16 | 0d264436 | Olga Brani | // (Minified) - http://github.com/vitch/jScrollPane/raw/master/script/jquery.jscrollpane.min.js
|
17 | 0d264436 | Olga Brani | //
|
18 | 0d264436 | Olga Brani | // About: License
|
19 | 0d264436 | Olga Brani | //
|
20 | 0d264436 | Olga Brani | // Copyright (c) 2013 Kelvin Luck
|
21 | 0d264436 | Olga Brani | // Dual licensed under the MIT or GPL Version 2 licenses.
|
22 | 0d264436 | Olga Brani | // http://jscrollpane.kelvinluck.com/MIT-LICENSE.txt
|
23 | 0d264436 | Olga Brani | // http://jscrollpane.kelvinluck.com/GPL-LICENSE.txt
|
24 | 0d264436 | Olga Brani | //
|
25 | 0d264436 | Olga Brani | // About: Examples
|
26 | 0d264436 | Olga Brani | //
|
27 | 0d264436 | Olga Brani | // All examples and demos are available through the jScrollPane example site at:
|
28 | 0d264436 | Olga Brani | // http://jscrollpane.kelvinluck.com/
|
29 | 0d264436 | Olga Brani | //
|
30 | 0d264436 | Olga Brani | // About: Support and Testing
|
31 | 0d264436 | Olga Brani | //
|
32 | 0d264436 | Olga Brani | // This plugin is tested on the browsers below and has been found to work reliably on them. If you run
|
33 | 0d264436 | Olga Brani | // into a problem on one of the supported browsers then please visit the support section on the jScrollPane
|
34 | 0d264436 | Olga Brani | // website (http://jscrollpane.kelvinluck.com/) for more information on getting support. You are also
|
35 | 0d264436 | Olga Brani | // welcome to fork the project on GitHub if you can contribute a fix for a given issue.
|
36 | 0d264436 | Olga Brani | //
|
37 | 0d264436 | Olga Brani | // jQuery Versions - tested in 1.4.2+ - reported to work in 1.3.x
|
38 | 0d264436 | Olga Brani | // Browsers Tested - Firefox 3.6.8, Safari 5, Opera 10.6, Chrome 5.0, IE 6, 7, 8
|
39 | 0d264436 | Olga Brani | //
|
40 | 0d264436 | Olga Brani | // About: Release History
|
41 | 0d264436 | Olga Brani | //
|
42 | 0d264436 | Olga Brani | // 2.0.17 - (2013-08-17) Working correctly when box-sizing is set to border-box (thanks @pieht)
|
43 | 0d264436 | Olga Brani | // 2.0.16 - (2013-07-30) Resetting left position when scroll is removed. Fixes #189
|
44 | 0d264436 | Olga Brani | // 2.0.15 - (2013-07-29) Fixed issue with scrollToElement where the destX and destY are undefined.
|
45 | 0d264436 | Olga Brani | // 2.0.14 - (2013-05-01) Updated to most recent mouse wheel plugin (see #106) and related changes for sensible scroll speed
|
46 | 0d264436 | Olga Brani | // 2.0.13 - (2013-05-01) Switched to semver compatible version name
|
47 | 0d264436 | Olga Brani | // 2.0.0beta12 - (2012-09-27) fix for jQuery 1.8+
|
48 | 0d264436 | Olga Brani | // 2.0.0beta11 - (2012-05-14)
|
49 | 0d264436 | Olga Brani | // 2.0.0beta10 - (2011-04-17) cleaner required size calculation, improved keyboard support, stickToBottom/Left, other small fixes
|
50 | 0d264436 | Olga Brani | // 2.0.0beta9 - (2011-01-31) new API methods, bug fixes and correct keyboard support for FF/OSX
|
51 | 0d264436 | Olga Brani | // 2.0.0beta8 - (2011-01-29) touchscreen support, improved keyboard support
|
52 | 0d264436 | Olga Brani | // 2.0.0beta7 - (2011-01-23) scroll speed consistent (thanks Aivo Paas)
|
53 | 0d264436 | Olga Brani | // 2.0.0beta6 - (2010-12-07) scrollToElement horizontal support
|
54 | 0d264436 | Olga Brani | // 2.0.0beta5 - (2010-10-18) jQuery 1.4.3 support, various bug fixes
|
55 | 0d264436 | Olga Brani | // 2.0.0beta4 - (2010-09-17) clickOnTrack support, bug fixes
|
56 | 0d264436 | Olga Brani | // 2.0.0beta3 - (2010-08-27) Horizontal mousewheel, mwheelIntent, keyboard support, bug fixes
|
57 | 0d264436 | Olga Brani | // 2.0.0beta2 - (2010-08-21) Bug fixes
|
58 | 0d264436 | Olga Brani | // 2.0.0beta1 - (2010-08-17) Rewrite to follow modern best practices and enable horizontal scrolling, initially hidden
|
59 | 0d264436 | Olga Brani | // elements and dynamically sized elements.
|
60 | 0d264436 | Olga Brani | // 1.x - (2006-12-31 - 2010-07-31) Initial version, hosted at googlecode, deprecated
|
61 | 0d264436 | Olga Brani | |
62 | 0d264436 | Olga Brani | (function($,window,undefined){ |
63 | 0d264436 | Olga Brani | |
64 | 0d264436 | Olga Brani | $.fn.jScrollPane = function(settings) |
65 | 0d264436 | Olga Brani | { |
66 | 0d264436 | Olga Brani | // JScrollPane "class" - public methods are available through $('selector').data('jsp')
|
67 | 0d264436 | Olga Brani | function JScrollPane(elem, s) |
68 | 0d264436 | Olga Brani | { |
69 | 0d264436 | Olga Brani | var settings, jsp = this, pane, paneWidth, paneHeight, container, contentWidth, contentHeight, |
70 | 0d264436 | Olga Brani | percentInViewH, percentInViewV, isScrollableV, isScrollableH, verticalDrag, dragMaxY, |
71 | 0d264436 | Olga Brani | verticalDragPosition, horizontalDrag, dragMaxX, horizontalDragPosition, |
72 | 0d264436 | Olga Brani | verticalBar, verticalTrack, scrollbarWidth, verticalTrackHeight, verticalDragHeight, arrowUp, arrowDown, |
73 | 0d264436 | Olga Brani | horizontalBar, horizontalTrack, horizontalTrackWidth, horizontalDragWidth, arrowLeft, arrowRight, |
74 | 0d264436 | Olga Brani | reinitialiseInterval, originalPadding, originalPaddingTotalWidth, previousContentWidth, |
75 | 0d264436 | Olga Brani | wasAtTop = true, wasAtLeft = true, wasAtBottom = false, wasAtRight = false, |
76 | 0d264436 | Olga Brani | originalElement = elem.clone(false, false).empty(), |
77 | 0d264436 | Olga Brani | mwEvent = $.fn.mwheelIntent ? 'mwheelIntent.jsp' : 'mousewheel.jsp'; |
78 | 0d264436 | Olga Brani | |
79 | 0d264436 | Olga Brani | if (elem.css('box-sizing') === 'border-box') { |
80 | 0d264436 | Olga Brani | originalPadding = 0;
|
81 | 0d264436 | Olga Brani | originalPaddingTotalWidth = 0;
|
82 | 0d264436 | Olga Brani | } else {
|
83 | 0d264436 | Olga Brani | originalPadding = elem.css('paddingTop') + ' ' + |
84 | 0d264436 | Olga Brani | elem.css('paddingRight') + ' ' + |
85 | 0d264436 | Olga Brani | elem.css('paddingBottom') + ' ' + |
86 | 0d264436 | Olga Brani | elem.css('paddingLeft');
|
87 | 0d264436 | Olga Brani | originalPaddingTotalWidth = (parseInt(elem.css('paddingLeft'), 10) || 0) + |
88 | 0d264436 | Olga Brani | (parseInt(elem.css('paddingRight'), 10) || 0); |
89 | 0d264436 | Olga Brani | } |
90 | 0d264436 | Olga Brani | |
91 | 0d264436 | Olga Brani | function initialise(s) |
92 | 0d264436 | Olga Brani | { |
93 | 0d264436 | Olga Brani | |
94 | 0d264436 | Olga Brani | var /*firstChild, lastChild, */isMaintainingPositon, lastContentX, lastContentY, |
95 | 0d264436 | Olga Brani | hasContainingSpaceChanged, originalScrollTop, originalScrollLeft, |
96 | 0d264436 | Olga Brani | maintainAtBottom = false, maintainAtRight = false; |
97 | 0d264436 | Olga Brani | |
98 | 0d264436 | Olga Brani | settings = s; |
99 | 0d264436 | Olga Brani | |
100 | 0d264436 | Olga Brani | if (pane === undefined) { |
101 | 0d264436 | Olga Brani | originalScrollTop = elem.scrollTop(); |
102 | 0d264436 | Olga Brani | originalScrollLeft = elem.scrollLeft(); |
103 | 0d264436 | Olga Brani | |
104 | 0d264436 | Olga Brani | elem.css( |
105 | 0d264436 | Olga Brani | { |
106 | 0d264436 | Olga Brani | overflow: 'hidden', |
107 | 0d264436 | Olga Brani | padding: 0 |
108 | 0d264436 | Olga Brani | } |
109 | 0d264436 | Olga Brani | ); |
110 | 0d264436 | Olga Brani | // TODO: Deal with where width/ height is 0 as it probably means the element is hidden and we should
|
111 | 0d264436 | Olga Brani | // come back to it later and check once it is unhidden...
|
112 | 0d264436 | Olga Brani | paneWidth = elem.innerWidth() + originalPaddingTotalWidth; |
113 | 0d264436 | Olga Brani | paneHeight = elem.innerHeight(); |
114 | 0d264436 | Olga Brani | |
115 | 0d264436 | Olga Brani | elem.width(paneWidth); |
116 | 0d264436 | Olga Brani | |
117 | 0d264436 | Olga Brani | pane = $('<div class="jspPane" />').css('padding', originalPadding).append(elem.children()); |
118 | 0d264436 | Olga Brani | container = $('<div class="jspContainer" />') |
119 | 0d264436 | Olga Brani | .css({ |
120 | 0d264436 | Olga Brani | 'width': paneWidth + 'px', |
121 | 0d264436 | Olga Brani | 'height': paneHeight + 'px' |
122 | 0d264436 | Olga Brani | } |
123 | 0d264436 | Olga Brani | ).append(pane).appendTo(elem); |
124 | 0d264436 | Olga Brani | |
125 | 0d264436 | Olga Brani | /*
|
126 | 0d264436 | Olga Brani | // Move any margins from the first and last children up to the container so they can still
|
127 | 0d264436 | Olga Brani | // collapse with neighbouring elements as they would before jScrollPane
|
128 | 0d264436 | Olga Brani | firstChild = pane.find(':first-child');
|
129 | 0d264436 | Olga Brani | lastChild = pane.find(':last-child');
|
130 | 0d264436 | Olga Brani | elem.css(
|
131 | 0d264436 | Olga Brani | {
|
132 | 0d264436 | Olga Brani | 'margin-top': firstChild.css('margin-top'),
|
133 | 0d264436 | Olga Brani | 'margin-bottom': lastChild.css('margin-bottom')
|
134 | 0d264436 | Olga Brani | }
|
135 | 0d264436 | Olga Brani | );
|
136 | 0d264436 | Olga Brani | firstChild.css('margin-top', 0);
|
137 | 0d264436 | Olga Brani | lastChild.css('margin-bottom', 0);
|
138 | 0d264436 | Olga Brani | */
|
139 | 0d264436 | Olga Brani | } else {
|
140 | 0d264436 | Olga Brani | elem.css('width', ''); |
141 | 0d264436 | Olga Brani | |
142 | 0d264436 | Olga Brani | maintainAtBottom = settings.stickToBottom && isCloseToBottom(); |
143 | 0d264436 | Olga Brani | maintainAtRight = settings.stickToRight && isCloseToRight(); |
144 | 0d264436 | Olga Brani | |
145 | 0d264436 | Olga Brani | hasContainingSpaceChanged = elem.innerWidth() + originalPaddingTotalWidth != paneWidth || elem.outerHeight() != paneHeight; |
146 | 0d264436 | Olga Brani | |
147 | 0d264436 | Olga Brani | if (hasContainingSpaceChanged) {
|
148 | 0d264436 | Olga Brani | paneWidth = elem.innerWidth() + originalPaddingTotalWidth; |
149 | 0d264436 | Olga Brani | paneHeight = elem.innerHeight(); |
150 | 0d264436 | Olga Brani | container.css({ |
151 | 0d264436 | Olga Brani | width: paneWidth + 'px', |
152 | 0d264436 | Olga Brani | height: paneHeight + 'px' |
153 | 0d264436 | Olga Brani | }); |
154 | 0d264436 | Olga Brani | } |
155 | 0d264436 | Olga Brani | |
156 | 0d264436 | Olga Brani | // If nothing changed since last check...
|
157 | 0d264436 | Olga Brani | if (!hasContainingSpaceChanged && previousContentWidth == contentWidth && pane.outerHeight() == contentHeight) {
|
158 | 0d264436 | Olga Brani | elem.width(paneWidth); |
159 | 0d264436 | Olga Brani | return;
|
160 | 0d264436 | Olga Brani | } |
161 | 0d264436 | Olga Brani | previousContentWidth = contentWidth; |
162 | 0d264436 | Olga Brani | |
163 | 0d264436 | Olga Brani | pane.css('width', ''); |
164 | 0d264436 | Olga Brani | elem.width(paneWidth); |
165 | 0d264436 | Olga Brani | |
166 | 0d264436 | Olga Brani | container.find('>.jspVerticalBar,>.jspHorizontalBar').remove().end();
|
167 | 0d264436 | Olga Brani | } |
168 | 0d264436 | Olga Brani | |
169 | 0d264436 | Olga Brani | pane.css('overflow', 'auto'); |
170 | 0d264436 | Olga Brani | if (s.contentWidth) {
|
171 | 0d264436 | Olga Brani | contentWidth = s.contentWidth; |
172 | 0d264436 | Olga Brani | } else {
|
173 | 0d264436 | Olga Brani | contentWidth = pane[0].scrollWidth;
|
174 | 0d264436 | Olga Brani | } |
175 | 0d264436 | Olga Brani | contentHeight = pane[0].scrollHeight;
|
176 | 0d264436 | Olga Brani | pane.css('overflow', ''); |
177 | 0d264436 | Olga Brani | |
178 | 0d264436 | Olga Brani | percentInViewH = contentWidth / paneWidth; |
179 | 0d264436 | Olga Brani | percentInViewV = contentHeight / paneHeight; |
180 | 0d264436 | Olga Brani | isScrollableV = percentInViewV > 1;
|
181 | 0d264436 | Olga Brani | |
182 | 0d264436 | Olga Brani | isScrollableH = percentInViewH > 1;
|
183 | 0d264436 | Olga Brani | |
184 | 0d264436 | Olga Brani | //console.log(paneWidth, paneHeight, contentWidth, contentHeight, percentInViewH, percentInViewV, isScrollableH, isScrollableV);
|
185 | 0d264436 | Olga Brani | |
186 | 0d264436 | Olga Brani | if (!(isScrollableH || isScrollableV)) {
|
187 | 0d264436 | Olga Brani | elem.removeClass('jspScrollable');
|
188 | 0d264436 | Olga Brani | pane.css({ |
189 | 0d264436 | Olga Brani | top: 0, |
190 | 0d264436 | Olga Brani | left: 0, |
191 | 0d264436 | Olga Brani | width: container.width() - originalPaddingTotalWidth
|
192 | 0d264436 | Olga Brani | }); |
193 | 0d264436 | Olga Brani | removeMousewheel(); |
194 | 0d264436 | Olga Brani | removeFocusHandler(); |
195 | 0d264436 | Olga Brani | removeKeyboardNav(); |
196 | 0d264436 | Olga Brani | removeClickOnTrack(); |
197 | 0d264436 | Olga Brani | } else {
|
198 | 0d264436 | Olga Brani | elem.addClass('jspScrollable');
|
199 | 0d264436 | Olga Brani | |
200 | 0d264436 | Olga Brani | isMaintainingPositon = settings.maintainPosition && (verticalDragPosition || horizontalDragPosition); |
201 | 0d264436 | Olga Brani | if (isMaintainingPositon) {
|
202 | 0d264436 | Olga Brani | lastContentX = contentPositionX(); |
203 | 0d264436 | Olga Brani | lastContentY = contentPositionY(); |
204 | 0d264436 | Olga Brani | } |
205 | 0d264436 | Olga Brani | |
206 | 0d264436 | Olga Brani | initialiseVerticalScroll(); |
207 | 0d264436 | Olga Brani | initialiseHorizontalScroll(); |
208 | 0d264436 | Olga Brani | resizeScrollbars(); |
209 | 0d264436 | Olga Brani | |
210 | 0d264436 | Olga Brani | if (isMaintainingPositon) {
|
211 | 0d264436 | Olga Brani | scrollToX(maintainAtRight ? (contentWidth - paneWidth ) : lastContentX, false);
|
212 | 0d264436 | Olga Brani | scrollToY(maintainAtBottom ? (contentHeight - paneHeight) : lastContentY, false);
|
213 | 0d264436 | Olga Brani | } |
214 | 0d264436 | Olga Brani | |
215 | 0d264436 | Olga Brani | initFocusHandler(); |
216 | 0d264436 | Olga Brani | initMousewheel(); |
217 | 0d264436 | Olga Brani | initTouch(); |
218 | 0d264436 | Olga Brani | |
219 | 0d264436 | Olga Brani | if (settings.enableKeyboardNavigation) {
|
220 | 0d264436 | Olga Brani | initKeyboardNav(); |
221 | 0d264436 | Olga Brani | } |
222 | 0d264436 | Olga Brani | if (settings.clickOnTrack) {
|
223 | 0d264436 | Olga Brani | initClickOnTrack(); |
224 | 0d264436 | Olga Brani | } |
225 | 0d264436 | Olga Brani | |
226 | 0d264436 | Olga Brani | observeHash(); |
227 | 0d264436 | Olga Brani | if (settings.hijackInternalLinks) {
|
228 | 0d264436 | Olga Brani | hijackInternalLinks(); |
229 | 0d264436 | Olga Brani | } |
230 | 0d264436 | Olga Brani | } |
231 | 0d264436 | Olga Brani | |
232 | 0d264436 | Olga Brani | if (settings.autoReinitialise && !reinitialiseInterval) {
|
233 | 0d264436 | Olga Brani | reinitialiseInterval = setInterval( |
234 | 0d264436 | Olga Brani | function()
|
235 | 0d264436 | Olga Brani | { |
236 | 0d264436 | Olga Brani | initialise(settings); |
237 | 0d264436 | Olga Brani | }, |
238 | 0d264436 | Olga Brani | settings.autoReinitialiseDelay |
239 | 0d264436 | Olga Brani | ); |
240 | 0d264436 | Olga Brani | } else if (!settings.autoReinitialise && reinitialiseInterval) { |
241 | 0d264436 | Olga Brani | clearInterval(reinitialiseInterval); |
242 | 0d264436 | Olga Brani | } |
243 | 0d264436 | Olga Brani | |
244 | 0d264436 | Olga Brani | originalScrollTop && elem.scrollTop(0) && scrollToY(originalScrollTop, false); |
245 | 0d264436 | Olga Brani | originalScrollLeft && elem.scrollLeft(0) && scrollToX(originalScrollLeft, false); |
246 | 0d264436 | Olga Brani | |
247 | 0d264436 | Olga Brani | elem.trigger('jsp-initialised', [isScrollableH || isScrollableV]);
|
248 | 0d264436 | Olga Brani | } |
249 | 0d264436 | Olga Brani | |
250 | 0d264436 | Olga Brani | function initialiseVerticalScroll() |
251 | 0d264436 | Olga Brani | { |
252 | 0d264436 | Olga Brani | if (isScrollableV) {
|
253 | 0d264436 | Olga Brani | |
254 | 0d264436 | Olga Brani | container.append( |
255 | 0d264436 | Olga Brani | $('<div class="jspVerticalBar" />').append( |
256 | 0d264436 | Olga Brani | $('<div class="jspCap jspCapTop" />'), |
257 | 0d264436 | Olga Brani | $('<div class="jspTrack" />').append( |
258 | 0d264436 | Olga Brani | $('<div class="jspDrag" />').append( |
259 | 0d264436 | Olga Brani | $('<div class="jspDragTop" />'), |
260 | 0d264436 | Olga Brani | $('<div class="jspDragBottom" />') |
261 | 0d264436 | Olga Brani | ) |
262 | 0d264436 | Olga Brani | ), |
263 | 0d264436 | Olga Brani | $('<div class="jspCap jspCapBottom" />') |
264 | 0d264436 | Olga Brani | ) |
265 | 0d264436 | Olga Brani | ); |
266 | 0d264436 | Olga Brani | |
267 | 0d264436 | Olga Brani | verticalBar = container.find('>.jspVerticalBar');
|
268 | 0d264436 | Olga Brani | verticalTrack = verticalBar.find('>.jspTrack');
|
269 | 0d264436 | Olga Brani | verticalDrag = verticalTrack.find('>.jspDrag');
|
270 | 0d264436 | Olga Brani | |
271 | 0d264436 | Olga Brani | if (settings.showArrows) {
|
272 | 0d264436 | Olga Brani | arrowUp = $('<a class="jspArrow jspArrowUp" />').bind( |
273 | 0d264436 | Olga Brani | 'mousedown.jsp', getArrowScroll(0, -1) |
274 | 0d264436 | Olga Brani | ).bind('click.jsp', nil);
|
275 | 0d264436 | Olga Brani | arrowDown = $('<a class="jspArrow jspArrowDown" />').bind( |
276 | 0d264436 | Olga Brani | 'mousedown.jsp', getArrowScroll(0, 1) |
277 | 0d264436 | Olga Brani | ).bind('click.jsp', nil);
|
278 | 0d264436 | Olga Brani | if (settings.arrowScrollOnHover) {
|
279 | 0d264436 | Olga Brani | arrowUp.bind('mouseover.jsp', getArrowScroll(0, -1, arrowUp)); |
280 | 0d264436 | Olga Brani | arrowDown.bind('mouseover.jsp', getArrowScroll(0, 1, arrowDown)); |
281 | 0d264436 | Olga Brani | } |
282 | 0d264436 | Olga Brani | |
283 | 0d264436 | Olga Brani | appendArrows(verticalTrack, settings.verticalArrowPositions, arrowUp, arrowDown); |
284 | 0d264436 | Olga Brani | } |
285 | 0d264436 | Olga Brani | |
286 | 0d264436 | Olga Brani | verticalTrackHeight = paneHeight; |
287 | 0d264436 | Olga Brani | container.find('>.jspVerticalBar>.jspCap:visible,>.jspVerticalBar>.jspArrow').each(
|
288 | 0d264436 | Olga Brani | function()
|
289 | 0d264436 | Olga Brani | { |
290 | 0d264436 | Olga Brani | verticalTrackHeight -= $(this).outerHeight(); |
291 | 0d264436 | Olga Brani | } |
292 | 0d264436 | Olga Brani | ); |
293 | 0d264436 | Olga Brani | |
294 | 0d264436 | Olga Brani | |
295 | 0d264436 | Olga Brani | verticalDrag.hover( |
296 | 0d264436 | Olga Brani | function()
|
297 | 0d264436 | Olga Brani | { |
298 | 0d264436 | Olga Brani | verticalDrag.addClass('jspHover');
|
299 | 0d264436 | Olga Brani | }, |
300 | 0d264436 | Olga Brani | function()
|
301 | 0d264436 | Olga Brani | { |
302 | 0d264436 | Olga Brani | verticalDrag.removeClass('jspHover');
|
303 | 0d264436 | Olga Brani | } |
304 | 0d264436 | Olga Brani | ).bind( |
305 | 0d264436 | Olga Brani | 'mousedown.jsp',
|
306 | 0d264436 | Olga Brani | function(e)
|
307 | 0d264436 | Olga Brani | { |
308 | 0d264436 | Olga Brani | // Stop IE from allowing text selection
|
309 | 0d264436 | Olga Brani | $('html').bind('dragstart.jsp selectstart.jsp', nil); |
310 | 0d264436 | Olga Brani | |
311 | 0d264436 | Olga Brani | verticalDrag.addClass('jspActive');
|
312 | 0d264436 | Olga Brani | |
313 | 0d264436 | Olga Brani | var startY = e.pageY - verticalDrag.position().top;
|
314 | 0d264436 | Olga Brani | |
315 | 0d264436 | Olga Brani | $('html').bind( |
316 | 0d264436 | Olga Brani | 'mousemove.jsp',
|
317 | 0d264436 | Olga Brani | function(e)
|
318 | 0d264436 | Olga Brani | { |
319 | 0d264436 | Olga Brani | positionDragY(e.pageY - startY, false);
|
320 | 0d264436 | Olga Brani | } |
321 | 0d264436 | Olga Brani | ).bind('mouseup.jsp mouseleave.jsp', cancelDrag);
|
322 | 0d264436 | Olga Brani | return false; |
323 | 0d264436 | Olga Brani | } |
324 | 0d264436 | Olga Brani | ); |
325 | 0d264436 | Olga Brani | sizeVerticalScrollbar(); |
326 | 0d264436 | Olga Brani | } |
327 | 0d264436 | Olga Brani | } |
328 | 0d264436 | Olga Brani | |
329 | 0d264436 | Olga Brani | function sizeVerticalScrollbar() |
330 | 0d264436 | Olga Brani | { |
331 | 0d264436 | Olga Brani | verticalTrack.height(verticalTrackHeight + 'px');
|
332 | 0d264436 | Olga Brani | verticalDragPosition = 0;
|
333 | 0d264436 | Olga Brani | scrollbarWidth = settings.verticalGutter + verticalTrack.outerWidth(); |
334 | 0d264436 | Olga Brani | |
335 | 0d264436 | Olga Brani | // Make the pane thinner to allow for the vertical scrollbar
|
336 | 0d264436 | Olga Brani | pane.width(paneWidth - scrollbarWidth - originalPaddingTotalWidth); |
337 | 0d264436 | Olga Brani | |
338 | 0d264436 | Olga Brani | // Add margin to the left of the pane if scrollbars are on that side (to position
|
339 | 0d264436 | Olga Brani | // the scrollbar on the left or right set it's left or right property in CSS)
|
340 | 0d264436 | Olga Brani | try {
|
341 | 0d264436 | Olga Brani | if (verticalBar.position().left === 0) { |
342 | 0d264436 | Olga Brani | pane.css('margin-left', scrollbarWidth + 'px'); |
343 | 0d264436 | Olga Brani | } |
344 | 0d264436 | Olga Brani | } catch (err) {
|
345 | 0d264436 | Olga Brani | } |
346 | 0d264436 | Olga Brani | } |
347 | 0d264436 | Olga Brani | |
348 | 0d264436 | Olga Brani | function initialiseHorizontalScroll() |
349 | 0d264436 | Olga Brani | { |
350 | 0d264436 | Olga Brani | if (isScrollableH) {
|
351 | 0d264436 | Olga Brani | |
352 | 0d264436 | Olga Brani | container.append( |
353 | 0d264436 | Olga Brani | $('<div class="jspHorizontalBar" />').append( |
354 | 0d264436 | Olga Brani | $('<div class="jspCap jspCapLeft" />'), |
355 | 0d264436 | Olga Brani | $('<div class="jspTrack" />').append( |
356 | 0d264436 | Olga Brani | $('<div class="jspDrag" />').append( |
357 | 0d264436 | Olga Brani | $('<div class="jspDragLeft" />'), |
358 | 0d264436 | Olga Brani | $('<div class="jspDragRight" />') |
359 | 0d264436 | Olga Brani | ) |
360 | 0d264436 | Olga Brani | ), |
361 | 0d264436 | Olga Brani | $('<div class="jspCap jspCapRight" />') |
362 | 0d264436 | Olga Brani | ) |
363 | 0d264436 | Olga Brani | ); |
364 | 0d264436 | Olga Brani | |
365 | 0d264436 | Olga Brani | horizontalBar = container.find('>.jspHorizontalBar');
|
366 | 0d264436 | Olga Brani | horizontalTrack = horizontalBar.find('>.jspTrack');
|
367 | 0d264436 | Olga Brani | horizontalDrag = horizontalTrack.find('>.jspDrag');
|
368 | 0d264436 | Olga Brani | |
369 | 0d264436 | Olga Brani | if (settings.showArrows) {
|
370 | 0d264436 | Olga Brani | arrowLeft = $('<a class="jspArrow jspArrowLeft" />').bind( |
371 | 0d264436 | Olga Brani | 'mousedown.jsp', getArrowScroll(-1, 0) |
372 | 0d264436 | Olga Brani | ).bind('click.jsp', nil);
|
373 | 0d264436 | Olga Brani | arrowRight = $('<a class="jspArrow jspArrowRight" />').bind( |
374 | 0d264436 | Olga Brani | 'mousedown.jsp', getArrowScroll(1, 0) |
375 | 0d264436 | Olga Brani | ).bind('click.jsp', nil);
|
376 | 0d264436 | Olga Brani | if (settings.arrowScrollOnHover) {
|
377 | 0d264436 | Olga Brani | arrowLeft.bind('mouseover.jsp', getArrowScroll(-1, 0, arrowLeft)); |
378 | 0d264436 | Olga Brani | arrowRight.bind('mouseover.jsp', getArrowScroll(1, 0, arrowRight)); |
379 | 0d264436 | Olga Brani | } |
380 | 0d264436 | Olga Brani | appendArrows(horizontalTrack, settings.horizontalArrowPositions, arrowLeft, arrowRight); |
381 | 0d264436 | Olga Brani | } |
382 | 0d264436 | Olga Brani | |
383 | 0d264436 | Olga Brani | horizontalDrag.hover( |
384 | 0d264436 | Olga Brani | function()
|
385 | 0d264436 | Olga Brani | { |
386 | 0d264436 | Olga Brani | horizontalDrag.addClass('jspHover');
|
387 | 0d264436 | Olga Brani | }, |
388 | 0d264436 | Olga Brani | function()
|
389 | 0d264436 | Olga Brani | { |
390 | 0d264436 | Olga Brani | horizontalDrag.removeClass('jspHover');
|
391 | 0d264436 | Olga Brani | } |
392 | 0d264436 | Olga Brani | ).bind( |
393 | 0d264436 | Olga Brani | 'mousedown.jsp',
|
394 | 0d264436 | Olga Brani | function(e)
|
395 | 0d264436 | Olga Brani | { |
396 | 0d264436 | Olga Brani | // Stop IE from allowing text selection
|
397 | 0d264436 | Olga Brani | $('html').bind('dragstart.jsp selectstart.jsp', nil); |
398 | 0d264436 | Olga Brani | |
399 | 0d264436 | Olga Brani | horizontalDrag.addClass('jspActive');
|
400 | 0d264436 | Olga Brani | |
401 | 0d264436 | Olga Brani | var startX = e.pageX - horizontalDrag.position().left;
|
402 | 0d264436 | Olga Brani | |
403 | 0d264436 | Olga Brani | $('html').bind( |
404 | 0d264436 | Olga Brani | 'mousemove.jsp',
|
405 | 0d264436 | Olga Brani | function(e)
|
406 | 0d264436 | Olga Brani | { |
407 | 0d264436 | Olga Brani | positionDragX(e.pageX - startX, false);
|
408 | 0d264436 | Olga Brani | } |
409 | 0d264436 | Olga Brani | ).bind('mouseup.jsp mouseleave.jsp', cancelDrag);
|
410 | 0d264436 | Olga Brani | return false; |
411 | 0d264436 | Olga Brani | } |
412 | 0d264436 | Olga Brani | ); |
413 | 0d264436 | Olga Brani | horizontalTrackWidth = container.innerWidth(); |
414 | 0d264436 | Olga Brani | sizeHorizontalScrollbar(); |
415 | 0d264436 | Olga Brani | } |
416 | 0d264436 | Olga Brani | } |
417 | 0d264436 | Olga Brani | |
418 | 0d264436 | Olga Brani | function sizeHorizontalScrollbar() |
419 | 0d264436 | Olga Brani | { |
420 | 0d264436 | Olga Brani | container.find('>.jspHorizontalBar>.jspCap:visible,>.jspHorizontalBar>.jspArrow').each(
|
421 | 0d264436 | Olga Brani | function()
|
422 | 0d264436 | Olga Brani | { |
423 | 0d264436 | Olga Brani | horizontalTrackWidth -= $(this).outerWidth(); |
424 | 0d264436 | Olga Brani | } |
425 | 0d264436 | Olga Brani | ); |
426 | 0d264436 | Olga Brani | |
427 | 0d264436 | Olga Brani | horizontalTrack.width(horizontalTrackWidth + 'px');
|
428 | 0d264436 | Olga Brani | horizontalDragPosition = 0;
|
429 | 0d264436 | Olga Brani | } |
430 | 0d264436 | Olga Brani | |
431 | 0d264436 | Olga Brani | function resizeScrollbars() |
432 | 0d264436 | Olga Brani | { |
433 | 0d264436 | Olga Brani | if (isScrollableH && isScrollableV) {
|
434 | 0d264436 | Olga Brani | var horizontalTrackHeight = horizontalTrack.outerHeight(),
|
435 | 0d264436 | Olga Brani | verticalTrackWidth = verticalTrack.outerWidth(); |
436 | 0d264436 | Olga Brani | verticalTrackHeight -= horizontalTrackHeight; |
437 | 0d264436 | Olga Brani | $(horizontalBar).find('>.jspCap:visible,>.jspArrow').each( |
438 | 0d264436 | Olga Brani | function()
|
439 | 0d264436 | Olga Brani | { |
440 | 0d264436 | Olga Brani | horizontalTrackWidth += $(this).outerWidth(); |
441 | 0d264436 | Olga Brani | } |
442 | 0d264436 | Olga Brani | ); |
443 | 0d264436 | Olga Brani | horizontalTrackWidth -= verticalTrackWidth; |
444 | 0d264436 | Olga Brani | paneHeight -= verticalTrackWidth; |
445 | 0d264436 | Olga Brani | paneWidth -= horizontalTrackHeight; |
446 | 0d264436 | Olga Brani | horizontalTrack.parent().append( |
447 | 0d264436 | Olga Brani | $('<div class="jspCorner" />').css('width', horizontalTrackHeight + 'px') |
448 | 0d264436 | Olga Brani | ); |
449 | 0d264436 | Olga Brani | sizeVerticalScrollbar(); |
450 | 0d264436 | Olga Brani | sizeHorizontalScrollbar(); |
451 | 0d264436 | Olga Brani | } |
452 | 0d264436 | Olga Brani | // reflow content
|
453 | 0d264436 | Olga Brani | if (isScrollableH) {
|
454 | 0d264436 | Olga Brani | pane.width((container.outerWidth() - originalPaddingTotalWidth) + 'px');
|
455 | 0d264436 | Olga Brani | } |
456 | 0d264436 | Olga Brani | contentHeight = pane.outerHeight(); |
457 | 0d264436 | Olga Brani | percentInViewV = contentHeight / paneHeight; |
458 | 0d264436 | Olga Brani | |
459 | 0d264436 | Olga Brani | if (isScrollableH) {
|
460 | 0d264436 | Olga Brani | horizontalDragWidth = Math.ceil(1 / percentInViewH * horizontalTrackWidth);
|
461 | 0d264436 | Olga Brani | if (horizontalDragWidth > settings.horizontalDragMaxWidth) {
|
462 | 0d264436 | Olga Brani | horizontalDragWidth = settings.horizontalDragMaxWidth; |
463 | 0d264436 | Olga Brani | } else if (horizontalDragWidth < settings.horizontalDragMinWidth) { |
464 | 0d264436 | Olga Brani | horizontalDragWidth = settings.horizontalDragMinWidth; |
465 | 0d264436 | Olga Brani | } |
466 | 0d264436 | Olga Brani | horizontalDrag.width(horizontalDragWidth + 'px');
|
467 | 0d264436 | Olga Brani | dragMaxX = horizontalTrackWidth - horizontalDragWidth; |
468 | 0d264436 | Olga Brani | _positionDragX(horizontalDragPosition); // To update the state for the arrow buttons
|
469 | 0d264436 | Olga Brani | } |
470 | 0d264436 | Olga Brani | if (isScrollableV) {
|
471 | 0d264436 | Olga Brani | verticalDragHeight = Math.ceil(1 / percentInViewV * verticalTrackHeight);
|
472 | 0d264436 | Olga Brani | if (verticalDragHeight > settings.verticalDragMaxHeight) {
|
473 | 0d264436 | Olga Brani | verticalDragHeight = settings.verticalDragMaxHeight; |
474 | 0d264436 | Olga Brani | } else if (verticalDragHeight < settings.verticalDragMinHeight) { |
475 | 0d264436 | Olga Brani | verticalDragHeight = settings.verticalDragMinHeight; |
476 | 0d264436 | Olga Brani | } |
477 | 0d264436 | Olga Brani | verticalDrag.height(verticalDragHeight + 'px');
|
478 | 0d264436 | Olga Brani | dragMaxY = verticalTrackHeight - verticalDragHeight; |
479 | 0d264436 | Olga Brani | _positionDragY(verticalDragPosition); // To update the state for the arrow buttons
|
480 | 0d264436 | Olga Brani | } |
481 | 0d264436 | Olga Brani | } |
482 | 0d264436 | Olga Brani | |
483 | 0d264436 | Olga Brani | function appendArrows(ele, p, a1, a2) |
484 | 0d264436 | Olga Brani | { |
485 | 0d264436 | Olga Brani | var p1 = "before", p2 = "after", aTemp; |
486 | 0d264436 | Olga Brani | |
487 | 0d264436 | Olga Brani | // Sniff for mac... Is there a better way to determine whether the arrows would naturally appear
|
488 | 0d264436 | Olga Brani | // at the top or the bottom of the bar?
|
489 | 0d264436 | Olga Brani | if (p == "os") { |
490 | 0d264436 | Olga Brani | p = /Mac/.test(navigator.platform) ? "after" : "split"; |
491 | 0d264436 | Olga Brani | } |
492 | 0d264436 | Olga Brani | if (p == p1) {
|
493 | 0d264436 | Olga Brani | p2 = p; |
494 | 0d264436 | Olga Brani | } else if (p == p2) { |
495 | 0d264436 | Olga Brani | p1 = p; |
496 | 0d264436 | Olga Brani | aTemp = a1; |
497 | 0d264436 | Olga Brani | a1 = a2; |
498 | 0d264436 | Olga Brani | a2 = aTemp; |
499 | 0d264436 | Olga Brani | } |
500 | 0d264436 | Olga Brani | |
501 | 0d264436 | Olga Brani | ele[p1](a1)[p2](a2); |
502 | 0d264436 | Olga Brani | } |
503 | 0d264436 | Olga Brani | |
504 | 0d264436 | Olga Brani | function getArrowScroll(dirX, dirY, ele) |
505 | 0d264436 | Olga Brani | { |
506 | 0d264436 | Olga Brani | return function() |
507 | 0d264436 | Olga Brani | { |
508 | 0d264436 | Olga Brani | arrowScroll(dirX, dirY, this, ele);
|
509 | 0d264436 | Olga Brani | this.blur();
|
510 | 0d264436 | Olga Brani | return false; |
511 | 0d264436 | Olga Brani | }; |
512 | 0d264436 | Olga Brani | } |
513 | 0d264436 | Olga Brani | |
514 | 0d264436 | Olga Brani | function arrowScroll(dirX, dirY, arrow, ele) |
515 | 0d264436 | Olga Brani | { |
516 | 0d264436 | Olga Brani | arrow = $(arrow).addClass('jspActive'); |
517 | 0d264436 | Olga Brani | |
518 | 0d264436 | Olga Brani | var eve,
|
519 | 0d264436 | Olga Brani | scrollTimeout, |
520 | 0d264436 | Olga Brani | isFirst = true,
|
521 | 0d264436 | Olga Brani | doScroll = function() |
522 | 0d264436 | Olga Brani | { |
523 | 0d264436 | Olga Brani | if (dirX !== 0) { |
524 | 0d264436 | Olga Brani | jsp.scrollByX(dirX * settings.arrowButtonSpeed); |
525 | 0d264436 | Olga Brani | } |
526 | 0d264436 | Olga Brani | if (dirY !== 0) { |
527 | 0d264436 | Olga Brani | jsp.scrollByY(dirY * settings.arrowButtonSpeed); |
528 | 0d264436 | Olga Brani | } |
529 | 0d264436 | Olga Brani | scrollTimeout = setTimeout(doScroll, isFirst ? settings.initialDelay : settings.arrowRepeatFreq); |
530 | 0d264436 | Olga Brani | isFirst = false;
|
531 | 0d264436 | Olga Brani | }; |
532 | 0d264436 | Olga Brani | |
533 | 0d264436 | Olga Brani | doScroll(); |
534 | 0d264436 | Olga Brani | |
535 | 0d264436 | Olga Brani | eve = ele ? 'mouseout.jsp' : 'mouseup.jsp'; |
536 | 0d264436 | Olga Brani | ele = ele || $('html'); |
537 | 0d264436 | Olga Brani | ele.bind( |
538 | 0d264436 | Olga Brani | eve, |
539 | 0d264436 | Olga Brani | function()
|
540 | 0d264436 | Olga Brani | { |
541 | 0d264436 | Olga Brani | arrow.removeClass('jspActive');
|
542 | 0d264436 | Olga Brani | scrollTimeout && clearTimeout(scrollTimeout); |
543 | 0d264436 | Olga Brani | scrollTimeout = null;
|
544 | 0d264436 | Olga Brani | ele.unbind(eve); |
545 | 0d264436 | Olga Brani | } |
546 | 0d264436 | Olga Brani | ); |
547 | 0d264436 | Olga Brani | } |
548 | 0d264436 | Olga Brani | |
549 | 0d264436 | Olga Brani | function initClickOnTrack() |
550 | 0d264436 | Olga Brani | { |
551 | 0d264436 | Olga Brani | removeClickOnTrack(); |
552 | 0d264436 | Olga Brani | if (isScrollableV) {
|
553 | 0d264436 | Olga Brani | verticalTrack.bind( |
554 | 0d264436 | Olga Brani | 'mousedown.jsp',
|
555 | 0d264436 | Olga Brani | function(e)
|
556 | 0d264436 | Olga Brani | { |
557 | 0d264436 | Olga Brani | if (e.originalTarget === undefined || e.originalTarget == e.currentTarget) { |
558 | 0d264436 | Olga Brani | var clickedTrack = $(this), |
559 | 0d264436 | Olga Brani | offset = clickedTrack.offset(), |
560 | 0d264436 | Olga Brani | direction = e.pageY - offset.top - verticalDragPosition, |
561 | 0d264436 | Olga Brani | scrollTimeout, |
562 | 0d264436 | Olga Brani | isFirst = true,
|
563 | 0d264436 | Olga Brani | doScroll = function() |
564 | 0d264436 | Olga Brani | { |
565 | 0d264436 | Olga Brani | var offset = clickedTrack.offset(),
|
566 | 0d264436 | Olga Brani | pos = e.pageY - offset.top - verticalDragHeight / 2,
|
567 | 0d264436 | Olga Brani | contentDragY = paneHeight * settings.scrollPagePercent, |
568 | 0d264436 | Olga Brani | dragY = dragMaxY * contentDragY / (contentHeight - paneHeight); |
569 | 0d264436 | Olga Brani | if (direction < 0) { |
570 | 0d264436 | Olga Brani | if (verticalDragPosition - dragY > pos) {
|
571 | 0d264436 | Olga Brani | jsp.scrollByY(-contentDragY); |
572 | 0d264436 | Olga Brani | } else {
|
573 | 0d264436 | Olga Brani | positionDragY(pos); |
574 | 0d264436 | Olga Brani | } |
575 | 0d264436 | Olga Brani | } else if (direction > 0) { |
576 | 0d264436 | Olga Brani | if (verticalDragPosition + dragY < pos) {
|
577 | 0d264436 | Olga Brani | jsp.scrollByY(contentDragY); |
578 | 0d264436 | Olga Brani | } else {
|
579 | 0d264436 | Olga Brani | positionDragY(pos); |
580 | 0d264436 | Olga Brani | } |
581 | 0d264436 | Olga Brani | } else {
|
582 | 0d264436 | Olga Brani | cancelClick(); |
583 | 0d264436 | Olga Brani | return;
|
584 | 0d264436 | Olga Brani | } |
585 | 0d264436 | Olga Brani | scrollTimeout = setTimeout(doScroll, isFirst ? settings.initialDelay : settings.trackClickRepeatFreq); |
586 | 0d264436 | Olga Brani | isFirst = false;
|
587 | 0d264436 | Olga Brani | }, |
588 | 0d264436 | Olga Brani | cancelClick = function() |
589 | 0d264436 | Olga Brani | { |
590 | 0d264436 | Olga Brani | scrollTimeout && clearTimeout(scrollTimeout); |
591 | 0d264436 | Olga Brani | scrollTimeout = null;
|
592 | 0d264436 | Olga Brani | $(document).unbind('mouseup.jsp', cancelClick); |
593 | 0d264436 | Olga Brani | }; |
594 | 0d264436 | Olga Brani | doScroll(); |
595 | 0d264436 | Olga Brani | $(document).bind('mouseup.jsp', cancelClick); |
596 | 0d264436 | Olga Brani | return false; |
597 | 0d264436 | Olga Brani | } |
598 | 0d264436 | Olga Brani | } |
599 | 0d264436 | Olga Brani | ); |
600 | 0d264436 | Olga Brani | } |
601 | 0d264436 | Olga Brani | |
602 | 0d264436 | Olga Brani | if (isScrollableH) {
|
603 | 0d264436 | Olga Brani | horizontalTrack.bind( |
604 | 0d264436 | Olga Brani | 'mousedown.jsp',
|
605 | 0d264436 | Olga Brani | function(e)
|
606 | 0d264436 | Olga Brani | { |
607 | 0d264436 | Olga Brani | if (e.originalTarget === undefined || e.originalTarget == e.currentTarget) { |
608 | 0d264436 | Olga Brani | var clickedTrack = $(this), |
609 | 0d264436 | Olga Brani | offset = clickedTrack.offset(), |
610 | 0d264436 | Olga Brani | direction = e.pageX - offset.left - horizontalDragPosition, |
611 | 0d264436 | Olga Brani | scrollTimeout, |
612 | 0d264436 | Olga Brani | isFirst = true,
|
613 | 0d264436 | Olga Brani | doScroll = function() |
614 | 0d264436 | Olga Brani | { |
615 | 0d264436 | Olga Brani | var offset = clickedTrack.offset(),
|
616 | 0d264436 | Olga Brani | pos = e.pageX - offset.left - horizontalDragWidth / 2,
|
617 | 0d264436 | Olga Brani | contentDragX = paneWidth * settings.scrollPagePercent, |
618 | 0d264436 | Olga Brani | dragX = dragMaxX * contentDragX / (contentWidth - paneWidth); |
619 | 0d264436 | Olga Brani | if (direction < 0) { |
620 | 0d264436 | Olga Brani | if (horizontalDragPosition - dragX > pos) {
|
621 | 0d264436 | Olga Brani | jsp.scrollByX(-contentDragX); |
622 | 0d264436 | Olga Brani | } else {
|
623 | 0d264436 | Olga Brani | positionDragX(pos); |
624 | 0d264436 | Olga Brani | } |
625 | 0d264436 | Olga Brani | } else if (direction > 0) { |
626 | 0d264436 | Olga Brani | if (horizontalDragPosition + dragX < pos) {
|
627 | 0d264436 | Olga Brani | jsp.scrollByX(contentDragX); |
628 | 0d264436 | Olga Brani | } else {
|
629 | 0d264436 | Olga Brani | positionDragX(pos); |
630 | 0d264436 | Olga Brani | } |
631 | 0d264436 | Olga Brani | } else {
|
632 | 0d264436 | Olga Brani | cancelClick(); |
633 | 0d264436 | Olga Brani | return;
|
634 | 0d264436 | Olga Brani | } |
635 | 0d264436 | Olga Brani | scrollTimeout = setTimeout(doScroll, isFirst ? settings.initialDelay : settings.trackClickRepeatFreq); |
636 | 0d264436 | Olga Brani | isFirst = false;
|
637 | 0d264436 | Olga Brani | }, |
638 | 0d264436 | Olga Brani | cancelClick = function() |
639 | 0d264436 | Olga Brani | { |
640 | 0d264436 | Olga Brani | scrollTimeout && clearTimeout(scrollTimeout); |
641 | 0d264436 | Olga Brani | scrollTimeout = null;
|
642 | 0d264436 | Olga Brani | $(document).unbind('mouseup.jsp', cancelClick); |
643 | 0d264436 | Olga Brani | }; |
644 | 0d264436 | Olga Brani | doScroll(); |
645 | 0d264436 | Olga Brani | $(document).bind('mouseup.jsp', cancelClick); |
646 | 0d264436 | Olga Brani | return false; |
647 | 0d264436 | Olga Brani | } |
648 | 0d264436 | Olga Brani | } |
649 | 0d264436 | Olga Brani | ); |
650 | 0d264436 | Olga Brani | } |
651 | 0d264436 | Olga Brani | } |
652 | 0d264436 | Olga Brani | |
653 | 0d264436 | Olga Brani | function removeClickOnTrack() |
654 | 0d264436 | Olga Brani | { |
655 | 0d264436 | Olga Brani | if (horizontalTrack) {
|
656 | 0d264436 | Olga Brani | horizontalTrack.unbind('mousedown.jsp');
|
657 | 0d264436 | Olga Brani | } |
658 | 0d264436 | Olga Brani | if (verticalTrack) {
|
659 | 0d264436 | Olga Brani | verticalTrack.unbind('mousedown.jsp');
|
660 | 0d264436 | Olga Brani | } |
661 | 0d264436 | Olga Brani | } |
662 | 0d264436 | Olga Brani | |
663 | 0d264436 | Olga Brani | function cancelDrag() |
664 | 0d264436 | Olga Brani | { |
665 | 0d264436 | Olga Brani | $('html').unbind('dragstart.jsp selectstart.jsp mousemove.jsp mouseup.jsp mouseleave.jsp'); |
666 | 0d264436 | Olga Brani | |
667 | 0d264436 | Olga Brani | if (verticalDrag) {
|
668 | 0d264436 | Olga Brani | verticalDrag.removeClass('jspActive');
|
669 | 0d264436 | Olga Brani | } |
670 | 0d264436 | Olga Brani | if (horizontalDrag) {
|
671 | 0d264436 | Olga Brani | horizontalDrag.removeClass('jspActive');
|
672 | 0d264436 | Olga Brani | } |
673 | 0d264436 | Olga Brani | } |
674 | 0d264436 | Olga Brani | |
675 | 0d264436 | Olga Brani | function positionDragY(destY, animate) |
676 | 0d264436 | Olga Brani | { |
677 | 0d264436 | Olga Brani | if (!isScrollableV) {
|
678 | 0d264436 | Olga Brani | return;
|
679 | 0d264436 | Olga Brani | } |
680 | 0d264436 | Olga Brani | if (destY < 0) { |
681 | 0d264436 | Olga Brani | destY = 0;
|
682 | 0d264436 | Olga Brani | } else if (destY > dragMaxY) { |
683 | 0d264436 | Olga Brani | destY = dragMaxY; |
684 | 0d264436 | Olga Brani | } |
685 | 0d264436 | Olga Brani | |
686 | 0d264436 | Olga Brani | // can't just check if(animate) because false is a valid value that could be passed in...
|
687 | 0d264436 | Olga Brani | if (animate === undefined) { |
688 | 0d264436 | Olga Brani | animate = settings.animateScroll; |
689 | 0d264436 | Olga Brani | } |
690 | 0d264436 | Olga Brani | if (animate) {
|
691 | 0d264436 | Olga Brani | jsp.animate(verticalDrag, 'top', destY, _positionDragY);
|
692 | 0d264436 | Olga Brani | } else {
|
693 | 0d264436 | Olga Brani | verticalDrag.css('top', destY);
|
694 | 0d264436 | Olga Brani | _positionDragY(destY); |
695 | 0d264436 | Olga Brani | } |
696 | 0d264436 | Olga Brani | |
697 | 0d264436 | Olga Brani | } |
698 | 0d264436 | Olga Brani | |
699 | 0d264436 | Olga Brani | function _positionDragY(destY) |
700 | 0d264436 | Olga Brani | { |
701 | 0d264436 | Olga Brani | if (destY === undefined) { |
702 | 0d264436 | Olga Brani | destY = verticalDrag.position().top; |
703 | 0d264436 | Olga Brani | } |
704 | 0d264436 | Olga Brani | |
705 | 0d264436 | Olga Brani | container.scrollTop(0);
|
706 | 0d264436 | Olga Brani | verticalDragPosition = destY; |
707 | 0d264436 | Olga Brani | |
708 | 0d264436 | Olga Brani | var isAtTop = verticalDragPosition === 0, |
709 | 0d264436 | Olga Brani | isAtBottom = verticalDragPosition == dragMaxY, |
710 | 0d264436 | Olga Brani | percentScrolled = destY/ dragMaxY, |
711 | 0d264436 | Olga Brani | destTop = -percentScrolled * (contentHeight - paneHeight); |
712 | 0d264436 | Olga Brani | |
713 | 0d264436 | Olga Brani | if (wasAtTop != isAtTop || wasAtBottom != isAtBottom) {
|
714 | 0d264436 | Olga Brani | wasAtTop = isAtTop; |
715 | 0d264436 | Olga Brani | wasAtBottom = isAtBottom; |
716 | 0d264436 | Olga Brani | elem.trigger('jsp-arrow-change', [wasAtTop, wasAtBottom, wasAtLeft, wasAtRight]);
|
717 | 0d264436 | Olga Brani | } |
718 | 0d264436 | Olga Brani | |
719 | 0d264436 | Olga Brani | updateVerticalArrows(isAtTop, isAtBottom); |
720 | 0d264436 | Olga Brani | pane.css('top', destTop);
|
721 | 0d264436 | Olga Brani | elem.trigger('jsp-scroll-y', [-destTop, isAtTop, isAtBottom]).trigger('scroll'); |
722 | 0d264436 | Olga Brani | } |
723 | 0d264436 | Olga Brani | |
724 | 0d264436 | Olga Brani | function positionDragX(destX, animate) |
725 | 0d264436 | Olga Brani | { |
726 | 0d264436 | Olga Brani | if (!isScrollableH) {
|
727 | 0d264436 | Olga Brani | return;
|
728 | 0d264436 | Olga Brani | } |
729 | 0d264436 | Olga Brani | if (destX < 0) { |
730 | 0d264436 | Olga Brani | destX = 0;
|
731 | 0d264436 | Olga Brani | } else if (destX > dragMaxX) { |
732 | 0d264436 | Olga Brani | destX = dragMaxX; |
733 | 0d264436 | Olga Brani | } |
734 | 0d264436 | Olga Brani | |
735 | 0d264436 | Olga Brani | if (animate === undefined) { |
736 | 0d264436 | Olga Brani | animate = settings.animateScroll; |
737 | 0d264436 | Olga Brani | } |
738 | 0d264436 | Olga Brani | if (animate) {
|
739 | 0d264436 | Olga Brani | jsp.animate(horizontalDrag, 'left', destX, _positionDragX);
|
740 | 0d264436 | Olga Brani | } else {
|
741 | 0d264436 | Olga Brani | horizontalDrag.css('left', destX);
|
742 | 0d264436 | Olga Brani | _positionDragX(destX); |
743 | 0d264436 | Olga Brani | } |
744 | 0d264436 | Olga Brani | } |
745 | 0d264436 | Olga Brani | |
746 | 0d264436 | Olga Brani | function _positionDragX(destX) |
747 | 0d264436 | Olga Brani | { |
748 | 0d264436 | Olga Brani | if (destX === undefined) { |
749 | 0d264436 | Olga Brani | destX = horizontalDrag.position().left; |
750 | 0d264436 | Olga Brani | } |
751 | 0d264436 | Olga Brani | |
752 | 0d264436 | Olga Brani | container.scrollTop(0);
|
753 | 0d264436 | Olga Brani | horizontalDragPosition = destX; |
754 | 0d264436 | Olga Brani | |
755 | 0d264436 | Olga Brani | var isAtLeft = horizontalDragPosition === 0, |
756 | 0d264436 | Olga Brani | isAtRight = horizontalDragPosition == dragMaxX, |
757 | 0d264436 | Olga Brani | percentScrolled = destX / dragMaxX, |
758 | 0d264436 | Olga Brani | destLeft = -percentScrolled * (contentWidth - paneWidth); |
759 | 0d264436 | Olga Brani | |
760 | 0d264436 | Olga Brani | if (wasAtLeft != isAtLeft || wasAtRight != isAtRight) {
|
761 | 0d264436 | Olga Brani | wasAtLeft = isAtLeft; |
762 | 0d264436 | Olga Brani | wasAtRight = isAtRight; |
763 | 0d264436 | Olga Brani | elem.trigger('jsp-arrow-change', [wasAtTop, wasAtBottom, wasAtLeft, wasAtRight]);
|
764 | 0d264436 | Olga Brani | } |
765 | 0d264436 | Olga Brani | |
766 | 0d264436 | Olga Brani | updateHorizontalArrows(isAtLeft, isAtRight); |
767 | 0d264436 | Olga Brani | pane.css('left', destLeft);
|
768 | 0d264436 | Olga Brani | elem.trigger('jsp-scroll-x', [-destLeft, isAtLeft, isAtRight]).trigger('scroll'); |
769 | 0d264436 | Olga Brani | } |
770 | 0d264436 | Olga Brani | |
771 | 0d264436 | Olga Brani | function updateVerticalArrows(isAtTop, isAtBottom) |
772 | 0d264436 | Olga Brani | { |
773 | 0d264436 | Olga Brani | if (settings.showArrows) {
|
774 | 0d264436 | Olga Brani | arrowUp[isAtTop ? 'addClass' : 'removeClass']('jspDisabled'); |
775 | 0d264436 | Olga Brani | arrowDown[isAtBottom ? 'addClass' : 'removeClass']('jspDisabled'); |
776 | 0d264436 | Olga Brani | } |
777 | 0d264436 | Olga Brani | } |
778 | 0d264436 | Olga Brani | |
779 | 0d264436 | Olga Brani | function updateHorizontalArrows(isAtLeft, isAtRight) |
780 | 0d264436 | Olga Brani | { |
781 | 0d264436 | Olga Brani | if (settings.showArrows) {
|
782 | 0d264436 | Olga Brani | arrowLeft[isAtLeft ? 'addClass' : 'removeClass']('jspDisabled'); |
783 | 0d264436 | Olga Brani | arrowRight[isAtRight ? 'addClass' : 'removeClass']('jspDisabled'); |
784 | 0d264436 | Olga Brani | } |
785 | 0d264436 | Olga Brani | } |
786 | 0d264436 | Olga Brani | |
787 | 0d264436 | Olga Brani | function scrollToY(destY, animate) |
788 | 0d264436 | Olga Brani | { |
789 | 0d264436 | Olga Brani | var percentScrolled = destY / (contentHeight - paneHeight);
|
790 | 0d264436 | Olga Brani | positionDragY(percentScrolled * dragMaxY, animate); |
791 | 0d264436 | Olga Brani | } |
792 | 0d264436 | Olga Brani | |
793 | 0d264436 | Olga Brani | function scrollToX(destX, animate) |
794 | 0d264436 | Olga Brani | { |
795 | 0d264436 | Olga Brani | var percentScrolled = destX / (contentWidth - paneWidth);
|
796 | 0d264436 | Olga Brani | positionDragX(percentScrolled * dragMaxX, animate); |
797 | 0d264436 | Olga Brani | } |
798 | 0d264436 | Olga Brani | |
799 | 0d264436 | Olga Brani | function scrollToElement(ele, stickToTop, animate) |
800 | 0d264436 | Olga Brani | { |
801 | 0d264436 | Olga Brani | var e, eleHeight, eleWidth, eleTop = 0, eleLeft = 0, viewportTop, viewportLeft, maxVisibleEleTop, maxVisibleEleLeft, destY, destX; |
802 | 0d264436 | Olga Brani | |
803 | 0d264436 | Olga Brani | // Legal hash values aren't necessarily legal jQuery selectors so we need to catch any
|
804 | 0d264436 | Olga Brani | // errors from the lookup...
|
805 | 0d264436 | Olga Brani | try {
|
806 | 0d264436 | Olga Brani | e = $(ele);
|
807 | 0d264436 | Olga Brani | } catch (err) {
|
808 | 0d264436 | Olga Brani | return;
|
809 | 0d264436 | Olga Brani | } |
810 | 0d264436 | Olga Brani | eleHeight = e.outerHeight(); |
811 | 0d264436 | Olga Brani | eleWidth= e.outerWidth(); |
812 | 0d264436 | Olga Brani | |
813 | 0d264436 | Olga Brani | container.scrollTop(0);
|
814 | 0d264436 | Olga Brani | container.scrollLeft(0);
|
815 | 0d264436 | Olga Brani | |
816 | 0d264436 | Olga Brani | // loop through parents adding the offset top of any elements that are relatively positioned between
|
817 | 0d264436 | Olga Brani | // the focused element and the jspPane so we can get the true distance from the top
|
818 | 0d264436 | Olga Brani | // of the focused element to the top of the scrollpane...
|
819 | 0d264436 | Olga Brani | while (!e.is('.jspPane')) { |
820 | 0d264436 | Olga Brani | eleTop += e.position().top; |
821 | 0d264436 | Olga Brani | eleLeft += e.position().left; |
822 | 0d264436 | Olga Brani | e = e.offsetParent(); |
823 | 0d264436 | Olga Brani | if (/^body|html$/i.test(e[0].nodeName)) { |
824 | 0d264436 | Olga Brani | // we ended up too high in the document structure. Quit!
|
825 | 0d264436 | Olga Brani | return;
|
826 | 0d264436 | Olga Brani | } |
827 | 0d264436 | Olga Brani | } |
828 | 0d264436 | Olga Brani | |
829 | 0d264436 | Olga Brani | viewportTop = contentPositionY(); |
830 | 0d264436 | Olga Brani | maxVisibleEleTop = viewportTop + paneHeight; |
831 | 0d264436 | Olga Brani | if (eleTop < viewportTop || stickToTop) { // element is above viewport |
832 | 0d264436 | Olga Brani | destY = eleTop - settings.verticalGutter; |
833 | 0d264436 | Olga Brani | } else if (eleTop + eleHeight > maxVisibleEleTop) { // element is below viewport |
834 | 0d264436 | Olga Brani | destY = eleTop - paneHeight + eleHeight + settings.verticalGutter; |
835 | 0d264436 | Olga Brani | } |
836 | 0d264436 | Olga Brani | if (!isNaN(destY)) {
|
837 | 0d264436 | Olga Brani | scrollToY(destY, animate); |
838 | 0d264436 | Olga Brani | } |
839 | 0d264436 | Olga Brani | |
840 | 0d264436 | Olga Brani | viewportLeft = contentPositionX(); |
841 | 0d264436 | Olga Brani | maxVisibleEleLeft = viewportLeft + paneWidth; |
842 | 0d264436 | Olga Brani | if (eleLeft < viewportLeft || stickToTop) { // element is to the left of viewport |
843 | 0d264436 | Olga Brani | destX = eleLeft - settings.horizontalGutter; |
844 | 0d264436 | Olga Brani | } else if (eleLeft + eleWidth > maxVisibleEleLeft) { // element is to the right viewport |
845 | 0d264436 | Olga Brani | destX = eleLeft - paneWidth + eleWidth + settings.horizontalGutter; |
846 | 0d264436 | Olga Brani | } |
847 | 0d264436 | Olga Brani | if (!isNaN(destX)) {
|
848 | 0d264436 | Olga Brani | scrollToX(destX, animate); |
849 | 0d264436 | Olga Brani | } |
850 | 0d264436 | Olga Brani | |
851 | 0d264436 | Olga Brani | } |
852 | 0d264436 | Olga Brani | |
853 | 0d264436 | Olga Brani | function contentPositionX() |
854 | 0d264436 | Olga Brani | { |
855 | 0d264436 | Olga Brani | return -pane.position().left;
|
856 | 0d264436 | Olga Brani | } |
857 | 0d264436 | Olga Brani | |
858 | 0d264436 | Olga Brani | function contentPositionY() |
859 | 0d264436 | Olga Brani | { |
860 | 0d264436 | Olga Brani | return -pane.position().top;
|
861 | 0d264436 | Olga Brani | } |
862 | 0d264436 | Olga Brani | |
863 | 0d264436 | Olga Brani | function isCloseToBottom() |
864 | 0d264436 | Olga Brani | { |
865 | 0d264436 | Olga Brani | var scrollableHeight = contentHeight - paneHeight;
|
866 | 0d264436 | Olga Brani | return (scrollableHeight > 20) && (scrollableHeight - contentPositionY() < 10); |
867 | 0d264436 | Olga Brani | } |
868 | 0d264436 | Olga Brani | |
869 | 0d264436 | Olga Brani | function isCloseToRight() |
870 | 0d264436 | Olga Brani | { |
871 | 0d264436 | Olga Brani | var scrollableWidth = contentWidth - paneWidth;
|
872 | 0d264436 | Olga Brani | return (scrollableWidth > 20) && (scrollableWidth - contentPositionX() < 10); |
873 | 0d264436 | Olga Brani | } |
874 | 0d264436 | Olga Brani | |
875 | 0d264436 | Olga Brani | function initMousewheel() |
876 | 0d264436 | Olga Brani | { |
877 | 0d264436 | Olga Brani | container.unbind(mwEvent).bind( |
878 | 0d264436 | Olga Brani | mwEvent, |
879 | 0d264436 | Olga Brani | function (event, delta, deltaX, deltaY) {
|
880 | 0d264436 | Olga Brani | var dX = horizontalDragPosition, dY = verticalDragPosition;
|
881 | 0d264436 | Olga Brani | jsp.scrollBy(deltaX * settings.mouseWheelSpeed, -deltaY * settings.mouseWheelSpeed, false);
|
882 | 0d264436 | Olga Brani | // return true if there was no movement so rest of screen can scroll
|
883 | 0d264436 | Olga Brani | return dX == horizontalDragPosition && dY == verticalDragPosition;
|
884 | 0d264436 | Olga Brani | } |
885 | 0d264436 | Olga Brani | ); |
886 | 0d264436 | Olga Brani | } |
887 | 0d264436 | Olga Brani | |
888 | 0d264436 | Olga Brani | function removeMousewheel() |
889 | 0d264436 | Olga Brani | { |
890 | 0d264436 | Olga Brani | container.unbind(mwEvent); |
891 | 0d264436 | Olga Brani | } |
892 | 0d264436 | Olga Brani | |
893 | 0d264436 | Olga Brani | function nil() |
894 | 0d264436 | Olga Brani | { |
895 | 0d264436 | Olga Brani | return false; |
896 | 0d264436 | Olga Brani | } |
897 | 0d264436 | Olga Brani | |
898 | 0d264436 | Olga Brani | function initFocusHandler() |
899 | 0d264436 | Olga Brani | { |
900 | 0d264436 | Olga Brani | pane.find(':input,a').unbind('focus.jsp').bind( |
901 | 0d264436 | Olga Brani | 'focus.jsp',
|
902 | 0d264436 | Olga Brani | function(e)
|
903 | 0d264436 | Olga Brani | { |
904 | 0d264436 | Olga Brani | scrollToElement(e.target, false);
|
905 | 0d264436 | Olga Brani | } |
906 | 0d264436 | Olga Brani | ); |
907 | 0d264436 | Olga Brani | } |
908 | 0d264436 | Olga Brani | |
909 | 0d264436 | Olga Brani | function removeFocusHandler() |
910 | 0d264436 | Olga Brani | { |
911 | 0d264436 | Olga Brani | pane.find(':input,a').unbind('focus.jsp'); |
912 | 0d264436 | Olga Brani | } |
913 | 0d264436 | Olga Brani | |
914 | 0d264436 | Olga Brani | function initKeyboardNav() |
915 | 0d264436 | Olga Brani | { |
916 | 0d264436 | Olga Brani | var keyDown, elementHasScrolled, validParents = [];
|
917 | 0d264436 | Olga Brani | isScrollableH && validParents.push(horizontalBar[0]);
|
918 | 0d264436 | Olga Brani | isScrollableV && validParents.push(verticalBar[0]);
|
919 | 0d264436 | Olga Brani | |
920 | 0d264436 | Olga Brani | // IE also focuses elements that don't have tabindex set.
|
921 | 0d264436 | Olga Brani | pane.focus( |
922 | 0d264436 | Olga Brani | function()
|
923 | 0d264436 | Olga Brani | { |
924 | 0d264436 | Olga Brani | elem.focus(); |
925 | 0d264436 | Olga Brani | } |
926 | 0d264436 | Olga Brani | ); |
927 | 0d264436 | Olga Brani | |
928 | 0d264436 | Olga Brani | elem.attr('tabindex', 0) |
929 | 0d264436 | Olga Brani | .unbind('keydown.jsp keypress.jsp')
|
930 | 0d264436 | Olga Brani | .bind( |
931 | 0d264436 | Olga Brani | 'keydown.jsp',
|
932 | 0d264436 | Olga Brani | function(e)
|
933 | 0d264436 | Olga Brani | { |
934 | 0d264436 | Olga Brani | if (e.target !== this && !(validParents.length && $(e.target).closest(validParents).length)){ |
935 | 0d264436 | Olga Brani | return;
|
936 | 0d264436 | Olga Brani | } |
937 | 0d264436 | Olga Brani | var dX = horizontalDragPosition, dY = verticalDragPosition;
|
938 | 0d264436 | Olga Brani | switch(e.keyCode) {
|
939 | 0d264436 | Olga Brani | case 40: // down |
940 | 0d264436 | Olga Brani | case 38: // up |
941 | 0d264436 | Olga Brani | case 34: // page down |
942 | 0d264436 | Olga Brani | case 32: // space |
943 | 0d264436 | Olga Brani | case 33: // page up |
944 | 0d264436 | Olga Brani | case 39: // right |
945 | 0d264436 | Olga Brani | case 37: // left |
946 | 0d264436 | Olga Brani | keyDown = e.keyCode; |
947 | 0d264436 | Olga Brani | keyDownHandler(); |
948 | 0d264436 | Olga Brani | break;
|
949 | 0d264436 | Olga Brani | case 35: // end |
950 | 0d264436 | Olga Brani | scrollToY(contentHeight - paneHeight); |
951 | 0d264436 | Olga Brani | keyDown = null;
|
952 | 0d264436 | Olga Brani | break;
|
953 | 0d264436 | Olga Brani | case 36: // home |
954 | 0d264436 | Olga Brani | scrollToY(0);
|
955 | 0d264436 | Olga Brani | keyDown = null;
|
956 | 0d264436 | Olga Brani | break;
|
957 | 0d264436 | Olga Brani | } |
958 | 0d264436 | Olga Brani | |
959 | 0d264436 | Olga Brani | elementHasScrolled = e.keyCode == keyDown && dX != horizontalDragPosition || dY != verticalDragPosition; |
960 | 0d264436 | Olga Brani | return !elementHasScrolled;
|
961 | 0d264436 | Olga Brani | } |
962 | 0d264436 | Olga Brani | ).bind( |
963 | 0d264436 | Olga Brani | 'keypress.jsp', // For FF/ OSX so that we can cancel the repeat key presses if the JSP scrolls... |
964 | 0d264436 | Olga Brani | function(e)
|
965 | 0d264436 | Olga Brani | { |
966 | 0d264436 | Olga Brani | if (e.keyCode == keyDown) {
|
967 | 0d264436 | Olga Brani | keyDownHandler(); |
968 | 0d264436 | Olga Brani | } |
969 | 0d264436 | Olga Brani | return !elementHasScrolled;
|
970 | 0d264436 | Olga Brani | } |
971 | 0d264436 | Olga Brani | ); |
972 | 0d264436 | Olga Brani | |
973 | 0d264436 | Olga Brani | if (settings.hideFocus) {
|
974 | 0d264436 | Olga Brani | elem.css('outline', 'none'); |
975 | 0d264436 | Olga Brani | if ('hideFocus' in container[0]){ |
976 | 0d264436 | Olga Brani | elem.attr('hideFocus', true); |
977 | 0d264436 | Olga Brani | } |
978 | 0d264436 | Olga Brani | } else {
|
979 | 0d264436 | Olga Brani | elem.css('outline', ''); |
980 | 0d264436 | Olga Brani | if ('hideFocus' in container[0]){ |
981 | 0d264436 | Olga Brani | elem.attr('hideFocus', false); |
982 | 0d264436 | Olga Brani | } |
983 | 0d264436 | Olga Brani | } |
984 | 0d264436 | Olga Brani | |
985 | 0d264436 | Olga Brani | function keyDownHandler() |
986 | 0d264436 | Olga Brani | { |
987 | 0d264436 | Olga Brani | var dX = horizontalDragPosition, dY = verticalDragPosition;
|
988 | 0d264436 | Olga Brani | switch(keyDown) {
|
989 | 0d264436 | Olga Brani | case 40: // down |
990 | 0d264436 | Olga Brani | jsp.scrollByY(settings.keyboardSpeed, false);
|
991 | 0d264436 | Olga Brani | break;
|
992 | 0d264436 | Olga Brani | case 38: // up |
993 | 0d264436 | Olga Brani | jsp.scrollByY(-settings.keyboardSpeed, false);
|
994 | 0d264436 | Olga Brani | break;
|
995 | 0d264436 | Olga Brani | case 34: // page down |
996 | 0d264436 | Olga Brani | case 32: // space |
997 | 0d264436 | Olga Brani | jsp.scrollByY(paneHeight * settings.scrollPagePercent, false);
|
998 | 0d264436 | Olga Brani | break;
|
999 | 0d264436 | Olga Brani | case 33: // page up |
1000 | 0d264436 | Olga Brani | jsp.scrollByY(-paneHeight * settings.scrollPagePercent, false);
|
1001 | 0d264436 | Olga Brani | break;
|
1002 | 0d264436 | Olga Brani | case 39: // right |
1003 | 0d264436 | Olga Brani | jsp.scrollByX(settings.keyboardSpeed, false);
|
1004 | 0d264436 | Olga Brani | break;
|
1005 | 0d264436 | Olga Brani | case 37: // left |
1006 | 0d264436 | Olga Brani | jsp.scrollByX(-settings.keyboardSpeed, false);
|
1007 | 0d264436 | Olga Brani | break;
|
1008 | 0d264436 | Olga Brani | } |
1009 | 0d264436 | Olga Brani | |
1010 | 0d264436 | Olga Brani | elementHasScrolled = dX != horizontalDragPosition || dY != verticalDragPosition; |
1011 | 0d264436 | Olga Brani | return elementHasScrolled;
|
1012 | 0d264436 | Olga Brani | } |
1013 | 0d264436 | Olga Brani | } |
1014 | 0d264436 | Olga Brani | |
1015 | 0d264436 | Olga Brani | function removeKeyboardNav() |
1016 | 0d264436 | Olga Brani | { |
1017 | 0d264436 | Olga Brani | elem.attr('tabindex', '-1') |
1018 | 0d264436 | Olga Brani | .removeAttr('tabindex')
|
1019 | 0d264436 | Olga Brani | .unbind('keydown.jsp keypress.jsp');
|
1020 | 0d264436 | Olga Brani | } |
1021 | 0d264436 | Olga Brani | |
1022 | 0d264436 | Olga Brani | function observeHash() |
1023 | 0d264436 | Olga Brani | { |
1024 | 0d264436 | Olga Brani | if (location.hash && location.hash.length > 1) { |
1025 | 0d264436 | Olga Brani | var e,
|
1026 | 0d264436 | Olga Brani | retryInt, |
1027 | 0d264436 | Olga Brani | hash = escape(location.hash.substr(1)) // hash must be escaped to prevent XSS |
1028 | 0d264436 | Olga Brani | ; |
1029 | 0d264436 | Olga Brani | try {
|
1030 | 0d264436 | Olga Brani | e = $('#' + hash + ', a[name="' + hash + '"]'); |
1031 | 0d264436 | Olga Brani | } catch (err) {
|
1032 | 0d264436 | Olga Brani | return;
|
1033 | 0d264436 | Olga Brani | } |
1034 | 0d264436 | Olga Brani | |
1035 | 0d264436 | Olga Brani | if (e.length && pane.find(hash)) {
|
1036 | 0d264436 | Olga Brani | // nasty workaround but it appears to take a little while before the hash has done its thing
|
1037 | 0d264436 | Olga Brani | // to the rendered page so we just wait until the container's scrollTop has been messed up.
|
1038 | 0d264436 | Olga Brani | if (container.scrollTop() === 0) { |
1039 | 0d264436 | Olga Brani | retryInt = setInterval( |
1040 | 0d264436 | Olga Brani | function()
|
1041 | 0d264436 | Olga Brani | { |
1042 | 0d264436 | Olga Brani | if (container.scrollTop() > 0) { |
1043 | 0d264436 | Olga Brani | scrollToElement(e, true);
|
1044 | 0d264436 | Olga Brani | $(document).scrollTop(container.position().top);
|
1045 | 0d264436 | Olga Brani | clearInterval(retryInt); |
1046 | 0d264436 | Olga Brani | } |
1047 | 0d264436 | Olga Brani | }, |
1048 | 0d264436 | Olga Brani | 50
|
1049 | 0d264436 | Olga Brani | ); |
1050 | 0d264436 | Olga Brani | } else {
|
1051 | 0d264436 | Olga Brani | scrollToElement(e, true);
|
1052 | 0d264436 | Olga Brani | $(document).scrollTop(container.position().top);
|
1053 | 0d264436 | Olga Brani | } |
1054 | 0d264436 | Olga Brani | } |
1055 | 0d264436 | Olga Brani | } |
1056 | 0d264436 | Olga Brani | } |
1057 | 0d264436 | Olga Brani | |
1058 | 0d264436 | Olga Brani | function hijackInternalLinks() |
1059 | 0d264436 | Olga Brani | { |
1060 | 0d264436 | Olga Brani | // only register the link handler once
|
1061 | 0d264436 | Olga Brani | if ($(document.body).data('jspHijack')) { |
1062 | 0d264436 | Olga Brani | return;
|
1063 | 0d264436 | Olga Brani | } |
1064 | 0d264436 | Olga Brani | |
1065 | 0d264436 | Olga Brani | // remember that the handler was bound
|
1066 | 0d264436 | Olga Brani | $(document.body).data('jspHijack', true); |
1067 | 0d264436 | Olga Brani | |
1068 | 0d264436 | Olga Brani | // use live handler to also capture newly created links
|
1069 | 0d264436 | Olga Brani | $(document.body).delegate('a[href*=#]', 'click', function(event) { |
1070 | 0d264436 | Olga Brani | // does the link point to the same page?
|
1071 | 0d264436 | Olga Brani | // this also takes care of cases with a <base>-Tag or Links not starting with the hash #
|
1072 | 0d264436 | Olga Brani | // e.g. <a href="index.html#test"> when the current url already is index.html
|
1073 | 0d264436 | Olga Brani | var href = this.href.substr(0, this.href.indexOf('#')), |
1074 | 0d264436 | Olga Brani | locationHref = location.href, |
1075 | 0d264436 | Olga Brani | hash, |
1076 | 0d264436 | Olga Brani | element, |
1077 | 0d264436 | Olga Brani | container, |
1078 | 0d264436 | Olga Brani | jsp, |
1079 | 0d264436 | Olga Brani | scrollTop, |
1080 | 0d264436 | Olga Brani | elementTop; |
1081 | 0d264436 | Olga Brani | if (location.href.indexOf('#') !== -1) { |
1082 | 0d264436 | Olga Brani | locationHref = location.href.substr(0, location.href.indexOf('#')); |
1083 | 0d264436 | Olga Brani | } |
1084 | 0d264436 | Olga Brani | if (href !== locationHref) {
|
1085 | 0d264436 | Olga Brani | // the link points to another page
|
1086 | 0d264436 | Olga Brani | return;
|
1087 | 0d264436 | Olga Brani | } |
1088 | 0d264436 | Olga Brani | |
1089 | 0d264436 | Olga Brani | // check if jScrollPane should handle this click event
|
1090 | 0d264436 | Olga Brani | hash = escape(this.href.substr(this.href.indexOf('#') + 1)); |
1091 | 0d264436 | Olga Brani | |
1092 | 0d264436 | Olga Brani | // find the element on the page
|
1093 | 0d264436 | Olga Brani | element; |
1094 | 0d264436 | Olga Brani | try {
|
1095 | 0d264436 | Olga Brani | element = $('#' + hash + ', a[name="' + hash + '"]'); |
1096 | 0d264436 | Olga Brani | } catch (e) {
|
1097 | 0d264436 | Olga Brani | // hash is not a valid jQuery identifier
|
1098 | 0d264436 | Olga Brani | return;
|
1099 | 0d264436 | Olga Brani | } |
1100 | 0d264436 | Olga Brani | |
1101 | 0d264436 | Olga Brani | if (!element.length) {
|
1102 | 0d264436 | Olga Brani | // this link does not point to an element on this page
|
1103 | 0d264436 | Olga Brani | return;
|
1104 | 0d264436 | Olga Brani | } |
1105 | 0d264436 | Olga Brani | |
1106 | 0d264436 | Olga Brani | container = element.closest('.jspScrollable');
|
1107 | 0d264436 | Olga Brani | jsp = container.data('jsp');
|
1108 | 0d264436 | Olga Brani | |
1109 | 0d264436 | Olga Brani | // jsp might be another jsp instance than the one, that bound this event
|
1110 | 0d264436 | Olga Brani | // remember: this event is only bound once for all instances.
|
1111 | 0d264436 | Olga Brani | jsp.scrollToElement(element, true);
|
1112 | 0d264436 | Olga Brani | |
1113 | 0d264436 | Olga Brani | if (container[0].scrollIntoView) { |
1114 | 0d264436 | Olga Brani | // also scroll to the top of the container (if it is not visible)
|
1115 | 0d264436 | Olga Brani | scrollTop = $(window).scrollTop();
|
1116 | 0d264436 | Olga Brani | elementTop = element.offset().top; |
1117 | 0d264436 | Olga Brani | if (elementTop < scrollTop || elementTop > scrollTop + $(window).height()) { |
1118 | 0d264436 | Olga Brani | container[0].scrollIntoView();
|
1119 | 0d264436 | Olga Brani | } |
1120 | 0d264436 | Olga Brani | } |
1121 | 0d264436 | Olga Brani | |
1122 | 0d264436 | Olga Brani | // jsp handled this event, prevent the browser default (scrolling :P)
|
1123 | 0d264436 | Olga Brani | event.preventDefault(); |
1124 | 0d264436 | Olga Brani | }); |
1125 | 0d264436 | Olga Brani | } |
1126 | 0d264436 | Olga Brani | |
1127 | 0d264436 | Olga Brani | // Init touch on iPad, iPhone, iPod, Android
|
1128 | 0d264436 | Olga Brani | function initTouch() |
1129 | 0d264436 | Olga Brani | { |
1130 | 0d264436 | Olga Brani | var startX,
|
1131 | 0d264436 | Olga Brani | startY, |
1132 | 0d264436 | Olga Brani | touchStartX, |
1133 | 0d264436 | Olga Brani | touchStartY, |
1134 | 0d264436 | Olga Brani | moved, |
1135 | 0d264436 | Olga Brani | moving = false;
|
1136 | 0d264436 | Olga Brani | |
1137 | 0d264436 | Olga Brani | container.unbind('touchstart.jsp touchmove.jsp touchend.jsp click.jsp-touchclick').bind(
|
1138 | 0d264436 | Olga Brani | 'touchstart.jsp',
|
1139 | 0d264436 | Olga Brani | function(e)
|
1140 | 0d264436 | Olga Brani | { |
1141 | 0d264436 | Olga Brani | var touch = e.originalEvent.touches[0]; |
1142 | 0d264436 | Olga Brani | startX = contentPositionX(); |
1143 | 0d264436 | Olga Brani | startY = contentPositionY(); |
1144 | 0d264436 | Olga Brani | touchStartX = touch.pageX; |
1145 | 0d264436 | Olga Brani | touchStartY = touch.pageY; |
1146 | 0d264436 | Olga Brani | moved = false;
|
1147 | 0d264436 | Olga Brani | moving = true;
|
1148 | 0d264436 | Olga Brani | } |
1149 | 0d264436 | Olga Brani | ).bind( |
1150 | 0d264436 | Olga Brani | 'touchmove.jsp',
|
1151 | 0d264436 | Olga Brani | function(ev)
|
1152 | 0d264436 | Olga Brani | { |
1153 | 0d264436 | Olga Brani | if(!moving) {
|
1154 | 0d264436 | Olga Brani | return;
|
1155 | 0d264436 | Olga Brani | } |
1156 | 0d264436 | Olga Brani | |
1157 | 0d264436 | Olga Brani | var touchPos = ev.originalEvent.touches[0], |
1158 | 0d264436 | Olga Brani | dX = horizontalDragPosition, dY = verticalDragPosition; |
1159 | 0d264436 | Olga Brani | |
1160 | 0d264436 | Olga Brani | jsp.scrollTo(startX + touchStartX - touchPos.pageX, startY + touchStartY - touchPos.pageY); |
1161 | 0d264436 | Olga Brani | |
1162 | 0d264436 | Olga Brani | moved = moved || Math.abs(touchStartX - touchPos.pageX) > 5 || Math.abs(touchStartY - touchPos.pageY) > 5; |
1163 | 0d264436 | Olga Brani | |
1164 | 0d264436 | Olga Brani | // return true if there was no movement so rest of screen can scroll
|
1165 | 0d264436 | Olga Brani | return dX == horizontalDragPosition && dY == verticalDragPosition;
|
1166 | 0d264436 | Olga Brani | } |
1167 | 0d264436 | Olga Brani | ).bind( |
1168 | 0d264436 | Olga Brani | 'touchend.jsp',
|
1169 | 0d264436 | Olga Brani | function(e)
|
1170 | 0d264436 | Olga Brani | { |
1171 | 0d264436 | Olga Brani | moving = false;
|
1172 | 0d264436 | Olga Brani | /*if(moved) {
|
1173 | 0d264436 | Olga Brani | return false;
|
1174 | 0d264436 | Olga Brani | }*/
|
1175 | 0d264436 | Olga Brani | } |
1176 | 0d264436 | Olga Brani | ).bind( |
1177 | 0d264436 | Olga Brani | 'click.jsp-touchclick',
|
1178 | 0d264436 | Olga Brani | function(e)
|
1179 | 0d264436 | Olga Brani | { |
1180 | 0d264436 | Olga Brani | if(moved) {
|
1181 | 0d264436 | Olga Brani | moved = false;
|
1182 | 0d264436 | Olga Brani | return false; |
1183 | 0d264436 | Olga Brani | } |
1184 | 0d264436 | Olga Brani | } |
1185 | 0d264436 | Olga Brani | ); |
1186 | 0d264436 | Olga Brani | } |
1187 | 0d264436 | Olga Brani | |
1188 | 0d264436 | Olga Brani | function destroy(){ |
1189 | 0d264436 | Olga Brani | var currentY = contentPositionY(),
|
1190 | 0d264436 | Olga Brani | currentX = contentPositionX(); |
1191 | 0d264436 | Olga Brani | elem.removeClass('jspScrollable').unbind('.jsp'); |
1192 | 0d264436 | Olga Brani | elem.replaceWith(originalElement.append(pane.children())); |
1193 | 0d264436 | Olga Brani | originalElement.scrollTop(currentY); |
1194 | 0d264436 | Olga Brani | originalElement.scrollLeft(currentX); |
1195 | 0d264436 | Olga Brani | |
1196 | 0d264436 | Olga Brani | // clear reinitialize timer if active
|
1197 | 0d264436 | Olga Brani | if (reinitialiseInterval) {
|
1198 | 0d264436 | Olga Brani | clearInterval(reinitialiseInterval); |
1199 | 0d264436 | Olga Brani | } |
1200 | 0d264436 | Olga Brani | } |
1201 | 0d264436 | Olga Brani | |
1202 | 0d264436 | Olga Brani | // Public API
|
1203 | 0d264436 | Olga Brani | $.extend(
|
1204 | 0d264436 | Olga Brani | jsp, |
1205 | 0d264436 | Olga Brani | { |
1206 | 0d264436 | Olga Brani | // Reinitialises the scroll pane (if it's internal dimensions have changed since the last time it
|
1207 | 0d264436 | Olga Brani | // was initialised). The settings object which is passed in will override any settings from the
|
1208 | 0d264436 | Olga Brani | // previous time it was initialised - if you don't pass any settings then the ones from the previous
|
1209 | 0d264436 | Olga Brani | // initialisation will be used.
|
1210 | 0d264436 | Olga Brani | reinitialise: function(s) |
1211 | 0d264436 | Olga Brani | { |
1212 | 0d264436 | Olga Brani | s = $.extend({}, settings, s);
|
1213 | 0d264436 | Olga Brani | initialise(s); |
1214 | 0d264436 | Olga Brani | }, |
1215 | 0d264436 | Olga Brani | // Scrolls the specified element (a jQuery object, DOM node or jQuery selector string) into view so
|
1216 | 0d264436 | Olga Brani | // that it can be seen within the viewport. If stickToTop is true then the element will appear at
|
1217 | 0d264436 | Olga Brani | // the top of the viewport, if it is false then the viewport will scroll as little as possible to
|
1218 | 0d264436 | Olga Brani | // show the element. You can also specify if you want animation to occur. If you don't provide this
|
1219 | 0d264436 | Olga Brani | // argument then the animateScroll value from the settings object is used instead.
|
1220 | 0d264436 | Olga Brani | scrollToElement: function(ele, stickToTop, animate) |
1221 | 0d264436 | Olga Brani | { |
1222 | 0d264436 | Olga Brani | scrollToElement(ele, stickToTop, animate); |
1223 | 0d264436 | Olga Brani | }, |
1224 | 0d264436 | Olga Brani | // Scrolls the pane so that the specified co-ordinates within the content are at the top left
|
1225 | 0d264436 | Olga Brani | // of the viewport. animate is optional and if not passed then the value of animateScroll from
|
1226 | 0d264436 | Olga Brani | // the settings object this jScrollPane was initialised with is used.
|
1227 | 0d264436 | Olga Brani | scrollTo: function(destX, destY, animate) |
1228 | 0d264436 | Olga Brani | { |
1229 | 0d264436 | Olga Brani | scrollToX(destX, animate); |
1230 | 0d264436 | Olga Brani | scrollToY(destY, animate); |
1231 | 0d264436 | Olga Brani | }, |
1232 | 0d264436 | Olga Brani | // Scrolls the pane so that the specified co-ordinate within the content is at the left of the
|
1233 | 0d264436 | Olga Brani | // viewport. animate is optional and if not passed then the value of animateScroll from the settings
|
1234 | 0d264436 | Olga Brani | // object this jScrollPane was initialised with is used.
|
1235 | 0d264436 | Olga Brani | scrollToX: function(destX, animate) |
1236 | 0d264436 | Olga Brani | { |
1237 | 0d264436 | Olga Brani | scrollToX(destX, animate); |
1238 | 0d264436 | Olga Brani | }, |
1239 | 0d264436 | Olga Brani | // Scrolls the pane so that the specified co-ordinate within the content is at the top of the
|
1240 | 0d264436 | Olga Brani | // viewport. animate is optional and if not passed then the value of animateScroll from the settings
|
1241 | 0d264436 | Olga Brani | // object this jScrollPane was initialised with is used.
|
1242 | 0d264436 | Olga Brani | scrollToY: function(destY, animate) |
1243 | 0d264436 | Olga Brani | { |
1244 | 0d264436 | Olga Brani | scrollToY(destY, animate); |
1245 | 0d264436 | Olga Brani | }, |
1246 | 0d264436 | Olga Brani | // Scrolls the pane to the specified percentage of its maximum horizontal scroll position. animate
|
1247 | 0d264436 | Olga Brani | // is optional and if not passed then the value of animateScroll from the settings object this
|
1248 | 0d264436 | Olga Brani | // jScrollPane was initialised with is used.
|
1249 | 0d264436 | Olga Brani | scrollToPercentX: function(destPercentX, animate) |
1250 | 0d264436 | Olga Brani | { |
1251 | 0d264436 | Olga Brani | scrollToX(destPercentX * (contentWidth - paneWidth), animate); |
1252 | 0d264436 | Olga Brani | }, |
1253 | 0d264436 | Olga Brani | // Scrolls the pane to the specified percentage of its maximum vertical scroll position. animate
|
1254 | 0d264436 | Olga Brani | // is optional and if not passed then the value of animateScroll from the settings object this
|
1255 | 0d264436 | Olga Brani | // jScrollPane was initialised with is used.
|
1256 | 0d264436 | Olga Brani | scrollToPercentY: function(destPercentY, animate) |
1257 | 0d264436 | Olga Brani | { |
1258 | 0d264436 | Olga Brani | scrollToY(destPercentY * (contentHeight - paneHeight), animate); |
1259 | 0d264436 | Olga Brani | }, |
1260 | 0d264436 | Olga Brani | // Scrolls the pane by the specified amount of pixels. animate is optional and if not passed then
|
1261 | 0d264436 | Olga Brani | // the value of animateScroll from the settings object this jScrollPane was initialised with is used.
|
1262 | 0d264436 | Olga Brani | scrollBy: function(deltaX, deltaY, animate) |
1263 | 0d264436 | Olga Brani | { |
1264 | 0d264436 | Olga Brani | jsp.scrollByX(deltaX, animate); |
1265 | 0d264436 | Olga Brani | jsp.scrollByY(deltaY, animate); |
1266 | 0d264436 | Olga Brani | }, |
1267 | 0d264436 | Olga Brani | // Scrolls the pane by the specified amount of pixels. animate is optional and if not passed then
|
1268 | 0d264436 | Olga Brani | // the value of animateScroll from the settings object this jScrollPane was initialised with is used.
|
1269 | 0d264436 | Olga Brani | scrollByX: function(deltaX, animate) |
1270 | 0d264436 | Olga Brani | { |
1271 | 0d264436 | Olga Brani | var destX = contentPositionX() + Math[deltaX<0 ? 'floor' : 'ceil'](deltaX), |
1272 | 0d264436 | Olga Brani | percentScrolled = destX / (contentWidth - paneWidth); |
1273 | 0d264436 | Olga Brani | positionDragX(percentScrolled * dragMaxX, animate); |
1274 | 0d264436 | Olga Brani | }, |
1275 | 0d264436 | Olga Brani | // Scrolls the pane by the specified amount of pixels. animate is optional and if not passed then
|
1276 | 0d264436 | Olga Brani | // the value of animateScroll from the settings object this jScrollPane was initialised with is used.
|
1277 | 0d264436 | Olga Brani | scrollByY: function(deltaY, animate) |
1278 | 0d264436 | Olga Brani | { |
1279 | 0d264436 | Olga Brani | var destY = contentPositionY() + Math[deltaY<0 ? 'floor' : 'ceil'](deltaY), |
1280 | 0d264436 | Olga Brani | percentScrolled = destY / (contentHeight - paneHeight); |
1281 | 0d264436 | Olga Brani | positionDragY(percentScrolled * dragMaxY, animate); |
1282 | 0d264436 | Olga Brani | }, |
1283 | 0d264436 | Olga Brani | // Positions the horizontal drag at the specified x position (and updates the viewport to reflect
|
1284 | 0d264436 | Olga Brani | // this). animate is optional and if not passed then the value of animateScroll from the settings
|
1285 | 0d264436 | Olga Brani | // object this jScrollPane was initialised with is used.
|
1286 | 0d264436 | Olga Brani | positionDragX: function(x, animate) |
1287 | 0d264436 | Olga Brani | { |
1288 | 0d264436 | Olga Brani | positionDragX(x, animate); |
1289 | 0d264436 | Olga Brani | }, |
1290 | 0d264436 | Olga Brani | // Positions the vertical drag at the specified y position (and updates the viewport to reflect
|
1291 | 0d264436 | Olga Brani | // this). animate is optional and if not passed then the value of animateScroll from the settings
|
1292 | 0d264436 | Olga Brani | // object this jScrollPane was initialised with is used.
|
1293 | 0d264436 | Olga Brani | positionDragY: function(y, animate) |
1294 | 0d264436 | Olga Brani | { |
1295 | 0d264436 | Olga Brani | positionDragY(y, animate); |
1296 | 0d264436 | Olga Brani | }, |
1297 | 0d264436 | Olga Brani | // This method is called when jScrollPane is trying to animate to a new position. You can override
|
1298 | 0d264436 | Olga Brani | // it if you want to provide advanced animation functionality. It is passed the following arguments:
|
1299 | 0d264436 | Olga Brani | // * ele - the element whose position is being animated
|
1300 | 0d264436 | Olga Brani | // * prop - the property that is being animated
|
1301 | 0d264436 | Olga Brani | // * value - the value it's being animated to
|
1302 | 0d264436 | Olga Brani | // * stepCallback - a function that you must execute each time you update the value of the property
|
1303 | 0d264436 | Olga Brani | // You can use the default implementation (below) as a starting point for your own implementation.
|
1304 | 0d264436 | Olga Brani | animate: function(ele, prop, value, stepCallback) |
1305 | 0d264436 | Olga Brani | { |
1306 | 0d264436 | Olga Brani | var params = {};
|
1307 | 0d264436 | Olga Brani | params[prop] = value; |
1308 | 0d264436 | Olga Brani | ele.animate( |
1309 | 0d264436 | Olga Brani | params, |
1310 | 0d264436 | Olga Brani | { |
1311 | 0d264436 | Olga Brani | 'duration' : settings.animateDuration,
|
1312 | 0d264436 | Olga Brani | 'easing' : settings.animateEase,
|
1313 | 0d264436 | Olga Brani | 'queue' : false, |
1314 | 0d264436 | Olga Brani | 'step' : stepCallback
|
1315 | 0d264436 | Olga Brani | } |
1316 | 0d264436 | Olga Brani | ); |
1317 | 0d264436 | Olga Brani | }, |
1318 | 0d264436 | Olga Brani | // Returns the current x position of the viewport with regards to the content pane.
|
1319 | 0d264436 | Olga Brani | getContentPositionX: function() |
1320 | 0d264436 | Olga Brani | { |
1321 | 0d264436 | Olga Brani | return contentPositionX();
|
1322 | 0d264436 | Olga Brani | }, |
1323 | 0d264436 | Olga Brani | // Returns the current y position of the viewport with regards to the content pane.
|
1324 | 0d264436 | Olga Brani | getContentPositionY: function() |
1325 | 0d264436 | Olga Brani | { |
1326 | 0d264436 | Olga Brani | return contentPositionY();
|
1327 | 0d264436 | Olga Brani | }, |
1328 | 0d264436 | Olga Brani | // Returns the width of the content within the scroll pane.
|
1329 | 0d264436 | Olga Brani | getContentWidth: function() |
1330 | 0d264436 | Olga Brani | { |
1331 | 0d264436 | Olga Brani | return contentWidth;
|
1332 | 0d264436 | Olga Brani | }, |
1333 | 0d264436 | Olga Brani | // Returns the height of the content within the scroll pane.
|
1334 | 0d264436 | Olga Brani | getContentHeight: function() |
1335 | 0d264436 | Olga Brani | { |
1336 | 0d264436 | Olga Brani | return contentHeight;
|
1337 | 0d264436 | Olga Brani | }, |
1338 | 0d264436 | Olga Brani | // Returns the horizontal position of the viewport within the pane content.
|
1339 | 0d264436 | Olga Brani | getPercentScrolledX: function() |
1340 | 0d264436 | Olga Brani | { |
1341 | 0d264436 | Olga Brani | return contentPositionX() / (contentWidth - paneWidth);
|
1342 | 0d264436 | Olga Brani | }, |
1343 | 0d264436 | Olga Brani | // Returns the vertical position of the viewport within the pane content.
|
1344 | 0d264436 | Olga Brani | getPercentScrolledY: function() |
1345 | 0d264436 | Olga Brani | { |
1346 | 0d264436 | Olga Brani | return contentPositionY() / (contentHeight - paneHeight);
|
1347 | 0d264436 | Olga Brani | }, |
1348 | 0d264436 | Olga Brani | // Returns whether or not this scrollpane has a horizontal scrollbar.
|
1349 | 0d264436 | Olga Brani | getIsScrollableH: function() |
1350 | 0d264436 | Olga Brani | { |
1351 | 0d264436 | Olga Brani | return isScrollableH;
|
1352 | 0d264436 | Olga Brani | }, |
1353 | 0d264436 | Olga Brani | // Returns whether or not this scrollpane has a vertical scrollbar.
|
1354 | 0d264436 | Olga Brani | getIsScrollableV: function() |
1355 | 0d264436 | Olga Brani | { |
1356 | 0d264436 | Olga Brani | return isScrollableV;
|
1357 | 0d264436 | Olga Brani | }, |
1358 | 0d264436 | Olga Brani | // Gets a reference to the content pane. It is important that you use this method if you want to
|
1359 | 0d264436 | Olga Brani | // edit the content of your jScrollPane as if you access the element directly then you may have some
|
1360 | 0d264436 | Olga Brani | // problems (as your original element has had additional elements for the scrollbars etc added into
|
1361 | 0d264436 | Olga Brani | // it).
|
1362 | 0d264436 | Olga Brani | getContentPane: function() |
1363 | 0d264436 | Olga Brani | { |
1364 | 0d264436 | Olga Brani | return pane;
|
1365 | 0d264436 | Olga Brani | }, |
1366 | 0d264436 | Olga Brani | // Scrolls this jScrollPane down as far as it can currently scroll. If animate isn't passed then the
|
1367 | 0d264436 | Olga Brani | // animateScroll value from settings is used instead.
|
1368 | 0d264436 | Olga Brani | scrollToBottom: function(animate) |
1369 | 0d264436 | Olga Brani | { |
1370 | 0d264436 | Olga Brani | positionDragY(dragMaxY, animate); |
1371 | 0d264436 | Olga Brani | }, |
1372 | 0d264436 | Olga Brani | // Hijacks the links on the page which link to content inside the scrollpane. If you have changed
|
1373 | 0d264436 | Olga Brani | // the content of your page (e.g. via AJAX) and want to make sure any new anchor links to the
|
1374 | 0d264436 | Olga Brani | // contents of your scroll pane will work then call this function.
|
1375 | 0d264436 | Olga Brani | hijackInternalLinks: $.noop, |
1376 | 0d264436 | Olga Brani | // Removes the jScrollPane and returns the page to the state it was in before jScrollPane was
|
1377 | 0d264436 | Olga Brani | // initialised.
|
1378 | 0d264436 | Olga Brani | destroy: function() |
1379 | 0d264436 | Olga Brani | { |
1380 | 0d264436 | Olga Brani | destroy(); |
1381 | 0d264436 | Olga Brani | } |
1382 | 0d264436 | Olga Brani | } |
1383 | 0d264436 | Olga Brani | ); |
1384 | 0d264436 | Olga Brani | |
1385 | 0d264436 | Olga Brani | initialise(s); |
1386 | 0d264436 | Olga Brani | } |
1387 | 0d264436 | Olga Brani | |
1388 | 0d264436 | Olga Brani | // Pluginifying code...
|
1389 | 0d264436 | Olga Brani | settings = $.extend({}, $.fn.jScrollPane.defaults, settings); |
1390 | 0d264436 | Olga Brani | |
1391 | 0d264436 | Olga Brani | // Apply default speed
|
1392 | 0d264436 | Olga Brani | $.each(['arrowButtonSpeed', 'trackClickSpeed', 'keyboardSpeed'], function() { |
1393 | 0d264436 | Olga Brani | settings[this] = settings[this] || settings.speed; |
1394 | 0d264436 | Olga Brani | }); |
1395 | 0d264436 | Olga Brani | |
1396 | 0d264436 | Olga Brani | return this.each( |
1397 | 0d264436 | Olga Brani | function()
|
1398 | 0d264436 | Olga Brani | { |
1399 | 0d264436 | Olga Brani | var elem = $(this), jspApi = elem.data('jsp'); |
1400 | 0d264436 | Olga Brani | if (jspApi) {
|
1401 | 0d264436 | Olga Brani | jspApi.reinitialise(settings); |
1402 | 0d264436 | Olga Brani | } else {
|
1403 | 0d264436 | Olga Brani | $("script",elem).filter('[type="text/javascript"],:not([type])').remove(); |
1404 | 0d264436 | Olga Brani | jspApi = new JScrollPane(elem, settings);
|
1405 | 0d264436 | Olga Brani | elem.data('jsp', jspApi);
|
1406 | 0d264436 | Olga Brani | } |
1407 | 0d264436 | Olga Brani | } |
1408 | 0d264436 | Olga Brani | ); |
1409 | 0d264436 | Olga Brani | }; |
1410 | 0d264436 | Olga Brani | |
1411 | 0d264436 | Olga Brani | $.fn.jScrollPane.defaults = {
|
1412 | 0d264436 | Olga Brani | showArrows : false, |
1413 | 0d264436 | Olga Brani | maintainPosition : true, |
1414 | 0d264436 | Olga Brani | stickToBottom : false, |
1415 | 0d264436 | Olga Brani | stickToRight : false, |
1416 | 0d264436 | Olga Brani | clickOnTrack : true, |
1417 | 0d264436 | Olga Brani | autoReinitialise : false, |
1418 | 0d264436 | Olga Brani | autoReinitialiseDelay : 500, |
1419 | 0d264436 | Olga Brani | verticalDragMinHeight : 0, |
1420 | 0d264436 | Olga Brani | verticalDragMaxHeight : 99999, |
1421 | 0d264436 | Olga Brani | horizontalDragMinWidth : 0, |
1422 | 0d264436 | Olga Brani | horizontalDragMaxWidth : 99999, |
1423 | 0d264436 | Olga Brani | contentWidth : undefined, |
1424 | 0d264436 | Olga Brani | animateScroll : false, |
1425 | 0d264436 | Olga Brani | animateDuration : 300, |
1426 | 0d264436 | Olga Brani | animateEase : 'linear', |
1427 | 0d264436 | Olga Brani | hijackInternalLinks : false, |
1428 | 0d264436 | Olga Brani | verticalGutter : 4, |
1429 | 0d264436 | Olga Brani | horizontalGutter : 4, |
1430 | 0d264436 | Olga Brani | mouseWheelSpeed : 3, |
1431 | 0d264436 | Olga Brani | arrowButtonSpeed : 0, |
1432 | 0d264436 | Olga Brani | arrowRepeatFreq : 50, |
1433 | 0d264436 | Olga Brani | arrowScrollOnHover : false, |
1434 | 0d264436 | Olga Brani | trackClickSpeed : 0, |
1435 | 0d264436 | Olga Brani | trackClickRepeatFreq : 70, |
1436 | 0d264436 | Olga Brani | verticalArrowPositions : 'split', |
1437 | 0d264436 | Olga Brani | horizontalArrowPositions : 'split', |
1438 | 0d264436 | Olga Brani | enableKeyboardNavigation : true, |
1439 | 0d264436 | Olga Brani | hideFocus : false, |
1440 | 0d264436 | Olga Brani | keyboardSpeed : 0, |
1441 | 0d264436 | Olga Brani | initialDelay : 300, // Delay before starting repeating |
1442 | 0d264436 | Olga Brani | speed : 30, // Default speed when others falsey |
1443 | 0d264436 | Olga Brani | scrollPagePercent : .8 // Percent of visible area scrolled when pageUp/Down or track area pressed |
1444 | 0d264436 | Olga Brani | }; |
1445 | 0d264436 | Olga Brani | |
1446 | 0d264436 | Olga Brani | })(jQuery,this); |