(function ($, window, document) {
'use strict';
// Main function $.fn.scrollUp = function (options) {
// Ensure that only one scrollUp exists if (!$.data(document.body, 'scrollUp')) { $.data(document.body, 'scrollUp', true); $.fn.scrollUp.init(options); } };
// Init $.fn.scrollUp.init = function (options) {
// Define vars var o = $.fn.scrollUp.settings = $.extend({}, $.fn.scrollUp.defaults, options), triggerVisible = false, animIn, animOut, animSpeed, scrollDis, scrollEvent, scrollTarget, $self;
// Create element if (o.scrollTrigger) { $self = $(o.scrollTrigger); } else { $self = $('<a/>', { id: o.scrollName, href: '#top' }); }
// Set scrollTitle if there is one if (o.scrollTitle) { $self.attr('title', o.scrollTitle); }
$self.appendTo('body');
// If not using an image display text if (!(o.scrollImg || o.scrollTrigger)) { $self.html(o.scrollText); }
// Minimum CSS to make the magic happen $self.css({ display: 'none', position: 'fixed', zIndex: o.zIndex });
// Active point overlay if (o.activeOverlay) { $('<div/>', { id: o.scrollName + '-active' }).css({ position: 'absolute', 'top': o.scrollDistance + 'px', width: '100%', borderTop: '1px dotted' + o.activeOverlay, zIndex: o.zIndex }).appendTo('body'); }
// Switch animation type switch (o.animation) { case 'fade': animIn = 'fadeIn'; animOut = 'fadeOut'; animSpeed = o.animationSpeed; break;
case 'slide': animIn = 'slideDown'; animOut = 'slideUp'; animSpeed = o.animationSpeed; break;
default: animIn = 'show'; animOut = 'hide'; animSpeed = 0; }
// If from top or bottom if (o.scrollFrom === 'top') { scrollDis = o.scrollDistance; } else { scrollDis = $(document).height() - $(window).height() - o.scrollDistance; }
// Scroll function scrollEvent = $(window).scroll(function () { if ($(window).scrollTop() > scrollDis) { if (!triggerVisible) { $self[animIn](animSpeed); triggerVisible = true; } } else { if (triggerVisible) { $self[animOut](animSpeed); triggerVisible = false; } } });
if (o.scrollTarget) { if (typeof o.scrollTarget === 'number') { scrollTarget = o.scrollTarget; } else if (typeof o.scrollTarget === 'string') { scrollTarget = Math.floor($(o.scrollTarget).offset().top); } } else { scrollTarget = 0; }
// To the top $self.click(function (e) { e.preventDefault();
$('html, body').animate({ scrollTop: scrollTarget }, o.scrollSpeed, o.easingType); }); };
// Defaults $.fn.scrollUp.defaults = { scrollName: 'scrollUp', // Element ID scrollDistance: 300, // Distance from top/bottom before showing element (px) scrollFrom: 'top', // 'top' or 'bottom' scrollSpeed: 300, // Speed back to top (ms) easingType: 'linear', // Scroll to top easing (see http://easings.net/) animation: 'fade', // Fade, slide, none animationSpeed: 200, // Animation in speed (ms) scrollTrigger: false, // Set a custom triggering element. Can be an HTML string or jQuery object scrollTarget: false, // Set a custom target element for scrolling to. Can be element or number scrollText: 'Scroll to top', // Text for element, can contain HTML scrollTitle: false, // Set a custom <a> title if required. Defaults to scrollText scrollImg: false, // Set true to use image activeOverlay: false, // Set CSS color to display scrollUp active point, e.g '#00FFFF' zIndex: 2147483647 // Z-Index for the overlay };
// Destroy scrollUp plugin and clean all modifications to the DOM $.fn.scrollUp.destroy = function (scrollEvent) { $.removeData(document.body, 'scrollUp'); $('#' + $.fn.scrollUp.settings.scrollName).remove(); $('#' + $.fn.scrollUp.settings.scrollName + '-active').remove();
// If 1.7 or above use the new .off() if ($.fn.jquery.split('.')[1] >= 7) { $(window).off('scroll', scrollEvent);
// Else use the old .unbind() } else { $(window).unbind('scroll', scrollEvent); } };
$.scrollUp = $.fn.scrollUp;
})(jQuery, window, document);