(function ($) { $.fn.annoy = function (params) { var paramsType = typeof(params); if (paramsType != 'undefined' && paramsType != 'object') { throw new Error('Parameters must be object'); } var defaultParams = { limit: 0, indent: 0, wrap: true }; for (var key in params) { switch (key) { case 'limit': var limit = params[key]; if (limit instanceof jQuery) { defaultParams[key] = limit; } else { defaultParams[key] = $(limit); } break; case 'indent': if (!isNaN(params[key])) { defaultParams[key] = params[key]; } break; case 'wrap': if (typeof(params[key]) == 'boolean') { defaultParams[key] = params[key]; } break; } } this.each(function () { var $this = $(this); if (defaultParams.wrap === true) { $this.wrap('
'); } var documentElement = $(document); var elementParent = $this.parent(); $(window).bind('scroll', function () { var windowSize = $(window).width(); var documentScrolled = documentElement.scrollTop(); var startScrolling = elementParent.offset().top; var elementHeight = $this.outerHeight(true); var endScrolling = defaultParams.limit instanceof jQuery ? defaultParams.limit.offset().top - elementHeight - defaultParams.indent : 0; var elementOffset = documentScrolled - (documentScrolled - endScrolling) - startScrolling; if (documentScrolled > startScrolling) { if (endScrolling !== 0 && documentScrolled > endScrolling) { $this.css({ position: 'absolute', top: elementOffset }); } else { if (windowSize >= 1111) { $this.css({ position: 'fixed', top: '50px' }); } else { $this.css({ top: '50px' }); } } } else { $this.css({ position: 'absolute', top: 0 }); } }).trigger('scroll'); }); }; })(jQuery);