Creación de Plugins jQuery (Slider by Cristian Torres)

(function ($) {

    $.tSlider = function (container, options) {
        this.options = {};

        this.context = container.parent();
        container.css('position', 'relative');
        this.child = container.children();
        this.page = null;
        this.pages = [];
        this.current = 0;
        this.interval = null;
        var plugin = this;

        container.data('slider', plugin);

        this.next = function () {
            plugin.current++;
            if (plugin.current >= $('.pointer', plugin.context).size()) plugin.current = 0;
            plugin.moveTo(plugin.current);
        }

        this.prev = function () {
            plugin.current--;
            if (plugin.current < 0) plugin.current = $('.pointer', plugin.context).size() - 1;
            plugin.moveTo(plugin.current);
        }

        this.moveTo = function (index) {
            clearInterval(plugin.interval);
            $('.page.current', plugin.context)
                .fadeOut()
                .toggleClass('current');
            $('.page', plugin.context).eq(index)
                .toggleClass('current')
                .fadeIn();
            $('.pointer.current', plugin.context)
                .toggleClass('current');
            $('.pointer', plugin.context).eq(index)
                .toggleClass('current');
            plugin.interval = setInterval(plugin.next, options.autoPlay.interval);
        }

        this.init = function (element, options) {
            this.options = $.extend({}, $.tSlider.optionsDefault, options);
            var pagination = $('
    ').addClass(options.pagination.className); if ((this.child.length / options.pageSize) > 1) { this.child.each(function (i, v) { if (i % options.pageSize == 0) { var pageNumber = (i / options.pageSize + 1); var pointer = $('
  • ') .append(options.pagination.pointer ? '' : pageNumber) .addClass('pointer'); plugin.page = $('
    ') .addClass('page') .css({ position: 'absolute', top: 0, left: 0, width: '100%' }); if (pageNumber == options.startPage) { plugin.page.addClass('current').css({display: 'block'}); pointer.addClass('current'); } else { plugin.page.css({display: 'none'}); } plugin.page.append($(v).css('display', 'block')); plugin.pages.push(plugin.page); pointer.bind('click', function () { plugin.current = pageNumber - 1; plugin.moveTo(plugin.current); }); pagination.append(pointer); } else { plugin.page.append(v); } }); container.html('').append(plugin.pages).after(pagination.append($('
    '))); if (options.arrows != false) { var nextBtn = $('
    ' + options.arrows.right + '
    ') .addClass('next') .bind('click', this.next); var prevBtn = $('
    ' + options.arrows.left + '
    ') .addClass('prev') .bind('click', this.prev); container .after(nextBtn) .after(prevBtn); } } if (options.autoPlay != false) { this.interval = setInterval(this.next, options.autoPlay.interval); } } this.init(container, options); } $.fn.tSlider = function (options) { return $(this).each(function () { (new $.tSlider($(this), options)); }); } $.tSlider.optionsDefault = { pageSize: 4, startPage: 1, arrows: { left: '<', right: '>' }, autoPlay: { interval: 2000 }, pagination: { className: 'pagination', pointer: false } } })(jQuery);