Statistics
| Branch: | Tag: | Revision:

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);