/**
* StickyScroll
* written by Rick Harris - @iamrickharris
*
* Requires jQuery 1.4+
*
* Make elements stick to the top of your page as you scroll
*
* See README for details
*
*/

(function ($) {
    $.fn.stickyScroll = function (options) {

        var methods = {

            init: function (options) {

                var settings;

                if (options.mode !== 'auto' && options.mode !== 'manual') {
                    if (options.container) {
                        options.mode = 'auto';
                    }
                    if (options.bottomBoundary) {
                        options.mode = 'manual';
                    }
                }

                settings = $.extend({
                    mode: 'auto', // 'auto' or 'manual'
                    container: $('body'),
                    topBoundary: null,
                    bottomBoundary: null
                }, options);

                function bottomBoundary() {
                    return $(document).height() - settings.container.offset().top
            - settings.container.attr('offsetHeight');
                }

                function topBoundary() {
                    return settings.container.offset().top
                }

                function elHeight(el) {
                    return $(el).attr('offsetHeight');
                }

                // make sure user input is a jQuery object
                settings.container = $(settings.container);
                if (!settings.container.length) {
                    if (console) {
                        console.log('StickyScroll: the element ' + options.container +
              ' does not exist, we\'re throwing in the towel');
                    }
                    return;
                }

                // calculate automatic bottomBoundary
                if (settings.mode === 'auto') {
                    settings.topBoundary = topBoundary();
                    settings.bottomBoundary = bottomBoundary();
                }

                return this.each(function (index) {

                    var el = $(this),
            win = $(window),
            id = Date.now() + index,
            height = elHeight(el);

                    el.data('sticky-id', id);

                    win.bind('scroll.stickyscroll-' + id, function () {
                        var top = $(document).scrollTop(),
              bottom = $(document).height() - top - height;

                        if (bottom <= settings.bottomBoundary) {
                            el.offset({
                                top: $(document).height() - settings.bottomBoundary - height
                            })
              .removeClass('sticky-active')
              .removeClass('sticky-inactive')
              .addClass('sticky-stopped');
                        }
                        else if (top > settings.topBoundary) {
                            el.offset({
                                top: $(window).scrollTop()
                            })
              .removeClass('sticky-stopped')
              .removeClass('sticky-inactive')
              .addClass('sticky-active');
                        }
                        else if (top < settings.topBoundary) {
                            el.css({
                                position: '',
                                top: '',
                                bottom: ''
                            })
              .removeClass('sticky-stopped')
              .removeClass('sticky-active')
              .addClass('sticky-inactive');
                        }
                    });

                    win.bind('resize.stickyscroll-' + id, function () {
                        if (settings.mode === 'auto') {
                            settings.topBoundary = topBoundary();
                            settings.bottomBoundary = bottomBoundary();
                        }
                        height = elHeight(el);
                        $(this).scroll();
                    })

                    el.addClass('sticky-processed');

                    // start it off
                    win.scroll();

                });

            },

            reset: function () {
                return this.each(function () {
                    var el = $(this),
            id = el.data('sticky-id');

                    el.css({
                        position: '',
                        top: '',
                        bottom: ''
                    })
          .removeClass('sticky-stopped')
          .removeClass('sticky-active')
          .removeClass('sticky-inactive')
          .removeClass('sticky-processed');

                    $(window).unbind('.stickyscroll-' + id);
                });
            }

        };

        // if options is a valid method, execute it
        if (methods[options]) {
            return methods[options].apply(this,
        Array.prototype.slice.call(arguments, 1));
        }
        // or, if options is a config object, or no options are passed, init
        else if (typeof options === 'object' || !options) {
            return methods.init.apply(this, arguments);
        }

        else if (console) {
            console.log('Method' + options +
        ' does not exist on jQuery.stickyScroll');
        }

    };
})(jQuery);