+ function pinMenu( event ) {
+ var windowPos = $window.scrollTop(),
+ resizing = ! event || event.type !== 'scroll';
+
+ if ( isIOS || isIE8 || $adminmenu.data( 'wp-responsive' ) ) {
+ return;
+ }
+
+ if ( height.menu + height.adminbar < height.window ||
+ height.menu + height.adminbar + 20 > height.wpwrap ) {
+ unpinMenu();
+ return;
+ }
+
+ menuIsPinned = true;
+
+ if ( height.menu + height.adminbar > height.window ) {
+ // Check for overscrolling
+ if ( windowPos < 0 ) {
+ if ( ! pinnedMenuTop ) {
+ pinnedMenuTop = true;
+ pinnedMenuBottom = false;
+
+ $adminMenuWrap.css({
+ position: 'fixed',
+ top: '',
+ bottom: ''
+ });
+ }
+
+ return;
+ } else if ( windowPos + height.window > $document.height() - 1 ) {
+ if ( ! pinnedMenuBottom ) {
+ pinnedMenuBottom = true;
+ pinnedMenuTop = false;
+
+ $adminMenuWrap.css({
+ position: 'fixed',
+ top: '',
+ bottom: 0
+ });
+ }
+
+ return;
+ }
+
+ if ( windowPos > lastScrollPosition ) {
+ // Scrolling down
+ if ( pinnedMenuTop ) {
+ // let it scroll
+ pinnedMenuTop = false;
+ menuTop = $adminMenuWrap.offset().top - height.adminbar - ( windowPos - lastScrollPosition );
+
+ if ( menuTop + height.menu + height.adminbar < windowPos + height.window ) {
+ menuTop = windowPos + height.window - height.menu - height.adminbar;
+ }
+
+ $adminMenuWrap.css({
+ position: 'absolute',
+ top: menuTop,
+ bottom: ''
+ });
+ } else if ( ! pinnedMenuBottom && $adminMenuWrap.offset().top + height.menu < windowPos + height.window ) {
+ // pin the bottom
+ pinnedMenuBottom = true;
+
+ $adminMenuWrap.css({
+ position: 'fixed',
+ top: '',
+ bottom: 0
+ });
+ }
+ } else if ( windowPos < lastScrollPosition ) {
+ // Scrolling up
+ if ( pinnedMenuBottom ) {
+ // let it scroll
+ pinnedMenuBottom = false;
+ menuTop = $adminMenuWrap.offset().top - height.adminbar + ( lastScrollPosition - windowPos );
+
+ if ( menuTop + height.menu > windowPos + height.window ) {
+ menuTop = windowPos;
+ }
+
+ $adminMenuWrap.css({
+ position: 'absolute',
+ top: menuTop,
+ bottom: ''
+ });
+ } else if ( ! pinnedMenuTop && $adminMenuWrap.offset().top >= windowPos + height.adminbar ) {
+ // pin the top
+ pinnedMenuTop = true;
+
+ $adminMenuWrap.css({
+ position: 'fixed',
+ top: '',
+ bottom: ''
+ });
+ }
+ } else if ( resizing ) {
+ // Resizing
+ pinnedMenuTop = pinnedMenuBottom = false;
+ menuTop = windowPos + height.window - height.menu - height.adminbar - 1;
+
+ if ( menuTop > 0 ) {
+ $adminMenuWrap.css({
+ position: 'absolute',
+ top: menuTop,
+ bottom: ''
+ });
+ } else {
+ unpinMenu();
+ }
+ }
+ }
+
+ lastScrollPosition = windowPos;
+ }
+
+ function resetHeights() {
+ height = {
+ window: $window.height(),
+ wpwrap: $wpwrap.height(),
+ adminbar: $adminbar.height(),
+ menu: $adminMenuWrap.height()
+ };
+ }
+
+ function unpinMenu() {
+ if ( isIOS || ! menuIsPinned ) {
+ return;
+ }
+
+ pinnedMenuTop = pinnedMenuBottom = menuIsPinned = false;
+ $adminMenuWrap.css({
+ position: '',
+ top: '',
+ bottom: ''
+ });
+ }
+
+ function setPinMenu() {
+ resetHeights();
+
+ if ( $adminmenu.data('wp-responsive') ) {
+ $body.removeClass( 'sticky-menu' );
+ unpinMenu();
+ } else if ( height.menu + height.adminbar > height.window ) {
+ pinMenu();
+ $body.removeClass( 'sticky-menu' );
+ } else {
+ $body.addClass( 'sticky-menu' );
+ unpinMenu();
+ }
+ }