(function($) { var $headerHeight = $('#header-outer').outerHeight() + 34; var $extraHeight = ($('#wpadminbar').length > 0) ? 28 : 0; //admin bar var secondaryHeader = ($('#header-outer').attr('data-using-secondary') == '1') ? 33 : 0 ; $(window).load(function(){ $headerHeight = $('#header-outer').outerHeight() + 34; $extraHeight = ($('#wpadminbar').length > 0) ? 28 : 0; //admin bar }); $.fn.extend({ stickyMojo: function(options) { var settings = $.extend({ 'footerID': '', 'contentID': '', 'orientation': $(this).css('float') }, options); var sticky = { 'el': $(this), 'stickyLeft': $(settings.contentID).outerWidth() + $(settings.contentID).offset.left, 'stickyTop2': $(this).offset().top, 'stickyHeight': $(this).outerHeight(true), 'contentHeight': $(settings.contentID).outerHeight(true), 'win': $(window), 'breakPoint': $(this).outerWidth(true) + $(settings.contentID).outerWidth(true), 'marg': parseInt($(this).css('margin-top'), 10) }; var errors = checkSettings(); cacheElements(); return this.each(function() { buildSticky(); }); function buildSticky() { if (!errors.length) { sticky.el.css('left', sticky.stickyLeft); sticky.win.bind({ 'scroll': stick, 'resize': function() { sticky.el.css('left', sticky.stickyLeft); sticky.contentHeight = $(settings.contentID).outerHeight(true); sticky.stickyHeight = sticky.el.outerHeight(true); stick(); toLiveOrDie(); } }); setTimeout(function(){ toLiveOrDie(); },600); } else { if (console && console.warn) { console.warn(errors); } else { alert(errors); } } } //destroy sticky sidebar if the sidebar is shorter than the content area function toLiveOrDie(){ if(parseInt($('#sidebar').height()) + 50 >= parseInt($('#post-area').height())) { sticky.win.unbind('scroll', stick); sticky.el.removeClass('fixed-sidebar'); sticky.el.css({ 'position':'relative', 'top' : 0, 'margin-left' : 0, 'bottom' : 0 }); } else { sticky.win.unbind('scroll', stick); sticky.win.bind('scroll', stick); sticky.el.addClass('fixed-sidebar'); } if($('#sidebar').length > 0) { if($(window).scrollTop() < 100) { sticky.stickyTop2 = $('#sidebar').offset().top; sticky.marg = parseInt($('#sidebar').css('margin-top'), 10); } } } // Caches the footer and content elements into jquery objects function cacheElements() { settings.footerID = $(settings.footerID); settings.contentID = $(settings.contentID); } // Calcualtes the limits top and bottom limits for the sidebar function calculateLimits() { return { limit: settings.footerID.offset().top - sticky.stickyHeight - $headerHeight - $extraHeight - secondaryHeader, windowTop: sticky.win.scrollTop(), stickyTop: sticky.stickyTop2 - sticky.marg - $headerHeight - $extraHeight - secondaryHeader } } // Sets sidebar to fixed position function setFixedSidebar() { sticky.el.css({ position: 'fixed', right: 'auto', top: $headerHeight + $extraHeight + secondaryHeader, bottom : 'auto' }); } // Determines the sidebar orientation and sets margins accordingly function checkOrientation() { if (settings.orientation === "left") { settings.contentID.css('margin-left', sticky.el.outerWidth(true)); } else { sticky.el.css('margin-left', settings.contentID.outerWidth(true)); } } // sets sidebar to a static positioned element function setStaticSidebar() { sticky.el.css({ 'position': 'static', 'margin-left': '0px', 'bottom' : 'auto' }); settings.contentID.css('margin-left', '0px'); } // initiated to stop the sidebar from intersecting the footer function setLimitedSidebar(diff) { sticky.el.css({ position: 'absolute', top: 'auto', right: '0', bottom : -38 }); } //determines whether sidebar should stick and applies appropriate settings to make it stick function stick() { var tops = calculateLimits(); var hitBreakPoint = tops.stickyTop < tops.windowTop && (sticky.win.width() >= sticky.breakPoint); $headerHeight = $('#header-outer').outerHeight() + 34; if (hitBreakPoint) { setFixedSidebar(); checkOrientation(); } else { setStaticSidebar(); } if (tops.limit < tops.windowTop) { var diff = tops.limit - tops.windowTop; setLimitedSidebar(diff); } } // verifies that all settings are correct function checkSettings() { var errors = []; for (var key in settings) { if (!settings[key]) { errors.push(settings[key]); } } ieVersion() && errors.push("NO IE 7"); return errors; } function ieVersion() { if(document.querySelector) { return false; } else { return true; } } } }); })(jQuery);