﻿(function ($) {

    var collection = [];

    function crContentRotator($rotator) {
        this.defaults = {
            id: 1,
            timeout: 8000,
            classPrefix: 'crContentRotator'
        };

        this.$rotator = $rotator;
        this.$control;
        this.$titleSelect;
        this.$prev;
        this.$next;
        this.$currentElement;

        this.settings;
        this.timer;
    }

    crContentRotator.prototype = {
        init: function (r, options) {
            r.settings = $.extend({}, r.defaults, options);

            r.$rotator.addClass(r.settings.classPrefix);

            r.$elements = r.$rotator.children('div');
            r.$elements.hide();
            r.$elements.addClass(r.settings.classPrefix + '-content');
            r.$elements.each(function (i) { var ci = $(this); var t = ci.data('content-title'); if (t == undefined) { t = ci.find('h1').first().text(); ci.data('content-title', (t == undefined || t == null || t == "" ? "untitled-" + (i + 1) : t)); } });

            r.numOfElements = r.$elements.length;

            r._control();
            r.$rotator.append(r.$control);
            r._titleSelect();

            r._change((new RegExp("r" + r.settings.id + "=(true)").exec(document.cookie)) ? Math.floor(Math.random() * r.numOfElements) : 0);
            document.cookie = 'r' + r.settings.id + '=true; path=/';

            r.timer = setInterval(function () { r._change('next'); }, r.settings.timeout);

            r.$next.click(function () { r._change('next'); });
            r.$prev.click(function () { r._change('prev'); });
            r.$rotator.bind('mouseenter mouseleave', function (e) { r._hover(e); });

            collection.push(r.$rotator);
            return r.$rotator.get(0);
        },
        _control: function () {
            var r = this;
            r.$control = $(
                '<div class="' + r.settings.classPrefix + '-control">' +
					'<div class="' + r.settings.classPrefix + '-select"><select></select></div>' +
					'<div class="' + r.settings.classPrefix + '-nav">' +
						'<span class="' + r.settings.classPrefix + '-prev"></span>' +
						'<span class="' + r.settings.classPrefix + '-next"></span>' +
					'</div>' +
                '</div>'
            );
            r.$titleSelect = r.$control.find('select');
            r.$prev = r.$control.find('.' + r.settings.classPrefix + '-prev');
            r.$next = r.$control.find('.' + r.settings.classPrefix + '-next');
            r.$descriptionToggle = r.$control.find('.' + r.settings.classPrefix + '-descriptiontoggle');
        },
        _titleSelect: function () {
            var r = this, i = 0;
            r.$elements.each(function () {
                r.$titleSelect.append('<option value="' + (i++) + '">' + $(this).data('content-title') + '</option>');
            });
            r.$titleSelect.selectbox().change(function () { var $this = $(this); r._change($this.val()); });
            r.$currentTitle = r.$titleSelect.parent().find('.jquery-selectbox-currentItem');
        },
        _hover: function (e) {
            var r = this;
            if (e.type == 'mouseenter') {
                clearInterval(r.timer);
            }
            else {
                r.timer = setInterval(function () {
                    r._change('next');
                }, r.settings.timeout);
            }
        },
        _change: function (index) {
            var description, $newElement, $oldElement, r = this, oldIndex = r.currentElement || 0;
            if (index == 'next') {
                if ((++r.currentElement + 1) > r.numOfElements) {
                    r.currentElement = 0;
                }
            }
            else if (index == 'prev') {
                if ((--r.currentElement) < 0) {
                    r.currentElement = r.numOfElements - 1;
                }
            }
            else {
                r.currentElement = index;
            }
            $newElement = r.$elements.eq(r.currentElement);
            $oldElement = r.$elements.eq(oldIndex);
            $oldElement.stop(true, true).fadeTo(350, 0, function () { $oldElement.hide(); $newElement.fadeTo(350, 1); });
            r.$currentTitle.text(r.$titleSelect.find('option:eq(' + r.currentElement + ')').text());
        }
    };
    $.fn.crContentRotator = function (method) {
        if (typeof method === 'object' || !method) {
            var r = new crContentRotator($(this));
            return r.init(r, method);
        }
    };

})(jQuery);
