var Scroll;
if (!Scroll) Scroll = {};
Scroll.Carousel = function (domElement,width) {
    this._domElement = domElement;
    $(this._domElement).css('height', $(this._domElement).height() + 'px')
    this._items = $('.item', this._domElement);
    this._itemDetails = new Object();
    this._totalItems = $('.item', domElement).size() - 1;
    this._itemDetailsWidth = width; //width of one control element
    this._itemDetails.rightMargin = parseInt($('.item', domElement).css('margin-right'));
    this._animating = false;
    this._itemDetails.totalWidth = this._itemDetailsWidth + this._itemDetails.rightMargin + 1; // 1px right border
    this._currentCenter = $('.center', this._domElement);
    this._controlWidth = $(this._domElement).width();
    this._fullControlWidth = this._itemDetails.totalWidth * ($('.item', domElement).size()); // one set of controls
    $('.controls', this._domElement).width(this._fullControlWidth * 3); // three widths
    $('.controls', this._domElement).css('left', -(this._fullControlWidth-3));// - 1 )); // remove 1 set of border width
    this.cloneEnds();
    this._initListeners();
}
Scroll.Carousel.prototype = {
    _items: null,
    _domElement: null,
    _items: null,
    _itemDetails: null,
    _centerDetails: null,
    _currentCenter: null,
    _animating: null,
    _totalItems: null,
    _timerId: null,
    _initListeners: function () {
        var xThis = this;
        $('.item', this._domElement).click(function () {
            xThis.killTimer();
            if ((xThis._animating == false) && ($(this).hasClass('center') == false)) {
                var nextItems = $(this).nextAll();
                var itemDistCount = 0;
                if ($(this).nextAll('.center').size() > 0) {
                    var direction = 1;
                    $(nextItems).each(function () {
                        itemDistCount++;
                        if ($(this).hasClass('center')) { return false; }
                    });
                } else {
                    var prevItems = $(this).prevAll();
                    var direction = -1;
                    $(prevItems).each(function () {
                        itemDistCount++;
                        if ($(this).hasClass('center')) { return false; }
                    });
                }
                $(xThis._currentCenter).removeClass('center');
                $(this).addClass('center')
                xThis._currentCenter = this;
                xThis.doScroll(this, direction, true, itemDistCount);
            }
        });
        //xThis.startTimer();
    },
    doScroll: function (element, direction, animate, distance) {
        var xThis = this;
        if (distance == null) { distance = 1; }
        if (animate == true) {
            var animationDuration = 500;
        }
        else {
            var animationDuration = 0;
        }
        xThis._animating = true;
        if (($(element).nextAll('.clone-end').size() == 0) && (direction == -1)) {
            var leftShift = parseInt($(element).parent().css('left')) +
                                ((direction * -1) * parseInt(xThis._itemDetailsWidth +
                                xThis._itemDetails.rightMargin)) * (xThis._totalItems + 1);
            $(xThis._currentCenter).removeClass('center')
            xThis._currentCenter = $(element).prevAll()[xThis._totalItems];
            $(xThis._currentCenter).addClass('center');
            $(element).parent().css('left', (leftShift+2) + 'px')
        } else if (($(element).prevAll('.clone-beginning').size() == 0) && (direction == 1)) {
            var leftShift = parseInt($(element).parent().css('left')) +
                                    ((direction * -1) * parseInt(xThis._itemDetailsWidth +
                                    xThis._itemDetails.rightMargin)) * (xThis._totalItems + 1);
            $(xThis._currentCenter).removeClass('center')
            xThis._currentCenter = $(element).nextAll()[xThis._totalItems];
            $(xThis._currentCenter).addClass('center');
            $(element).parent().css('left', (leftShift+2) + 'px')
        }
        var newLeft = parseInt($(element).parent().css('left')) +
                            (direction * parseInt(xThis._itemDetailsWidth +
                                                xThis._itemDetails.rightMargin)) * distance;
        $(element).parent().animate({ left: parseInt(newLeft) }, animationDuration, function () {
            xThis._animating = false;
        });
    },
    cloneEnds: function () {
        var scroller = $('.controls', this._domElement)
        var items = $('.item', this._domElement);
        //clone left side
        $(scroller).prepend($($(items)[$(items).size() - 1]).clone().addClass('clone-beginning').removeClass('center'));
        for (var i = -1; i > (-1 * this._totalItems - 1); i--) {
            $(scroller).prepend($($(this._items)[this._totalItems + i]).clone().removeClass('center'));
        }
        //clone right side
        $(scroller).append($($(items)[0]).clone().addClass('clone-end').removeClass('center'));
        for (var i = 1; i < (this._totalItems + 1); i++) {
            $(scroller).append($($(this._items)[i]).clone().removeClass('center'));
        }
        if(items.size()==3) scroller.css('left','-996px');
    },
    startTimer: function () {
        var xThis = this;
        clearInterval(this._timerId);
        this._timerId = setInterval(function () {
            xThis.doScroll($(xThis._currentCenter).next(), -1, true);
        }, 4000);
    },
    killTimer: function () {
        clearInterval(this._timerId);
    }
}
