/** Scrollbars for sidebar (second style). This approach can be used on fixed or normal sidebar. It uses "overflow:hidden" so you can't use .hover submenus and it will be disabled when sidebar is minimized. It may also be slightly faster especially when resizing browser window. Native browser scrollbars are used in touch devices. */ (function($ , undefined) { //if( !$.fn.ace_scroll ) return; var hasTouch = ace.vars['touch']; var nativeScroll = /**ace.vars['old_ie'] ||*/ hasTouch; var old_safari = ace.vars['safari'] && navigator.userAgent.match(/version\/[1-5]/i) //NOTE //Safari on windows has not been updated for a long time. //And it has a problem when sidebar is fixed&scrollable and there is a CSS3 animation inside page content. //Very probably windows users of safari have migrated to another browser by now! var is_element_pos = 'getComputedStyle' in window ? //el.offsetHeight is used to force redraw and recalculate 'el.style.position' esp. for webkit! function(el, pos) { el.offsetHeight; return window.getComputedStyle(el).position == pos } : function(el, pos) { el.offsetHeight; return $(el).css('position') == pos } function Sidebar_Scroll(sidebar , settings) { var self = this; var $window = $(window); var $sidebar = $(sidebar), $nav = $sidebar.find('.nav-list'), $toggle = $sidebar.find('.sidebar-toggle').eq(0), $shortcuts = $sidebar.find('.sidebar-shortcuts').eq(0), nav = $nav.get(0); if(!nav) return; var attrib_values = ace.helper.getAttrSettings(sidebar, $.fn.ace_sidebar_scroll.defaults); this.settings = $.extend({}, $.fn.ace_sidebar_scroll.defaults, settings, attrib_values); var scroll_to_active = self.settings.scroll_to_active; this.only_if_fixed = self.settings.only_if_fixed; var ace_sidebar = $sidebar.ace_sidebar('ref'); $sidebar.attr('data-sidebar-scroll', 'true'); var submenu_hover = function() { return $sidebar.first('li.hover > .submenu').css('position') == 'absolute' } var scroll_div = null, scroll_content = null, scroll_content_div = null, bar = null, ace_scroll = null; this.is_scrolling = false; var _initiated = false; this.sidebar_fixed = is_element_pos(sidebar, 'fixed'); var $avail_height, $content_height; var available_height = function() { //available window space var offset = $nav.parent().offset();//because `$nav.offset()` considers the "scrolled top" amount as well if(self.sidebar_fixed) offset.top -= ace.helper.scrollTop(); return $window.innerHeight() - offset.top - ( self.settings.include_toggle ? 0 : $toggle.outerHeight() ) + 1; } var content_height = function() { return nav.scrollHeight; } var initiate = function(on_page_load) { if( _initiated ) return; if( (self.only_if_fixed && !self.sidebar_fixed) || submenu_hover() ) return;//eligible?? //return if we want scrollbars only on "fixed" sidebar and sidebar is not "fixed" yet! //initiate once $nav.wrap('