﻿/*
    example:
    <style>
        .simple { width:200px; position:relative; overflow:hidden }
        .items { width:10000px; position: absolute; left:0px; height:20px; } 
        .item { float:left; }
    </style>
    <div class="simple">
        <div class="items">
        <div class="item">...</div>
        <div class="item">...</div>
        <div class="item">...</div>
        <div class="item">...</div>
    </div>
</div>
	
	
SimpleItemScroller.init({
    strip: ".simple .items",  //selector to the scrolling strip
    duration: 300,  //duration of animation
    item: ".item",  //selector of the single items
    jump: 1,  //how many items to move in a click
    nextButton: ".next",  //selector to the next items
    prevButton: ".prev",  //selector to the previous items
    direction: "right",
    debug: true,  //to use with ddebug.js
    loop: true,  //back to the first element after the last (back to the last before the first)
    circular: true 
});	

*/

var SimpleItemScroller = function() {
    var _debug;
    var _strip;
    var _items;
    var _itemsNo;
    var _itemW;
    var _itemSelector;
    var _origItems;
    var _duration;
    var _jump;
    var _pages;
    var _page;
    var _locked;
    var _mainImage;
    var _prevButton;
    var _nextButton;
    var _currentItem;
    var _currentItemsNo;
    var _loop;
    var _circular;
    var _direction;
    var _click;

    function _print(line) {
        if (_debug)
            debug(line);
    }

    function _lock() {
        if (_locked)
            return false;
        _locked = true;
        return true;
    }

    function _unlock() {
        _locked = false;
    }

    function _afterMove(currentItem, currentPage) {
        _unlock();
        _currentItem = currentItem;
        _page = currentPage;
        if (_click != undefined)
            _click.call(window, _items.eq(_currentItem));
        _print(_itemsNo);
        _print("_afterMove _currentItem " + _currentItem);
        _print("mod " + (_currentItem - 1 % _itemsNo));
        if (_circular && _currentItem - 1 % _itemsNo == 0) {
            _currentItem += _itemsNo;
            _strip.css(_direction, (_currentItem * _itemW * -1) + "px");
            _items.removeClass("selected").eq(_currentItem).addClass("selected");
        }
    }

    function _position(pos) {
        if (!_lock())
            return;

        if (_direction == "right")
            _strip.animate({ right: _itemW * pos * -1 }, _duration, function() {
                _items.removeClass("selected").eq(pos).addClass("selected");
                _afterMove(pos, pos + 1);
            });
        else
            _strip.animate({ left: _itemW * pos * -1 }, _duration, function() {
                _items.removeClass("selected").eq(pos).addClass("selected");
                _afterMove(pos, pos + 1);
            });
    }

    function _move(dir, n) {
        if (!_lock())
            return;

        if (_debug) { debug("_move " + dir + " " + n); }
        if (_debug) { debug("_jump " + _jump); }

        var delta_x = (_itemW * _jump);
        if (_page == _pages - 1 && dir == "-") {
            var d = _items.size() - (_pages * _jump);
            if (_debug) { debug("d : " + d); }
            delta_x += (d * _itemW);
        }
        if (n != undefined)
            delta_x *= n;

        var page = dir == "+" ? _page - 1 : _page + 1;

        if (_direction == "right")
            _strip.animate({ right: (dir + "=") + delta_x }, _duration, function() {
                _afterMove(_currentItem, page);
            });
        else
            _strip.animate({ left: (dir + "=") + delta_x }, _duration, function() {
                _afterMove(_currentItem, page);
            });
    }
    function _next() {
        if (_items.filter(".selected").next().size() == 0) {
            if (_loop) {
                _items.removeClass("selected").eq(0).addClass("selected");
            } else {
                return;
            }
        } else {
            var n = _items.filter(".selected").next();
            _items.removeClass("selected");
            n.addClass("selected");
        }
        _items.filter(".selected").find("a").trigger("click");
        _currentItem = ++_currentItem % _items.size();
        if (_currentItem % _jump == 0)
            SimpleItemScroller.forward();
    }
    function _prev() {
        if (_items.filter(".selected").prev().size() == 0) {
            if (_loop) {
                _items.removeClass("selected").eq(_items.size() - 1).addClass("selected");
            } else {
                return;
            }
        } else {
            var n = _items.filter(".selected").prev();
            _items.removeClass("selected");
            n.addClass("selected");
        }
        _items.filter(".selected").find("a").trigger("click");
        if (--_currentItem < 0)
            _currentItem = 0;
        if (_currentItem % _jump == 0)
            SimpleItemScroller.backward();
    }

    function _bindClick() {
        //        _items.find("a[href=#]").click(function() {
        //            if (_debug) { debug("clicked item"); }
        //            _items.removeClass("selected");
        //            $(this).parent().addClass("selected");
        //            return false;
        //        });
        _nextButton.click(function() { _next(); return false; });
        _prevButton.click(function() { _prev(); return false; });
    }

    return {
        init: function(options) {
            _strip = $(options.strip);
            _itemSelector = options.item == undefined ? ".scrollingItem" : options.item;
            _duration = options.duration != undefined ? options.duration : 1000;
            _jump = options.jump != undefined ? options.jump : 1;
            _debug = options.debug == undefined ? false : options.debug;
            _debug = options.debug == undefined ? false : options.debug;
            _loop = options.loop == undefined ? false : options.loop;
            _circular = options.circular == undefined ? false : options.circular;
            if (_loop && (_loop && _circular))
                _loop = false;
            _direction = options.direction == undefined ? "left" : options.direction;
            _prevButton = $(options.prevButton);
            _nextButton = $(options.nextButton);

            _items = $(_itemSelector, _strip);
            _itemsNo = _items.size();
            _itemW = _items.width();
            _pages = Math.ceil(_items.size() / _jump);
            _page = 1;
            _currentItem = 0;


            if (options.click != undefined)
                _click = options.click;
            _unlock();
            if ($(".selected", _items).size() == 0)
                _items.eq(0).addClass("selected");
            _bindClick();

            _print("items :" + _items.size());
            if (_circular) {
                _origItems = _items;
                _items.addClass("middle");
                _strip.prepend(_items.clone(true).addClass("cloned before").removeClass("selected").removeClass("middle"));
                _strip.append(_items.clone(true).addClass("cloned after").removeClass("selected").removeClass("middle"));
                _items = $(_itemSelector, _strip);
                _currentItem = _itemsNo;
                _strip.css(_direction, (_currentItem * _itemW * -1) + "px");
            }
        },
        backward: function() {
            if (_page == 1)
                return;
            _move("+", 1);
        },
        forward: function() {
            if (_page == _pages)
                return;
            _move("-", 1);
        },
        move: function(dir, n) {
            _move(dir, n);
        },
        position: function(pos) {
            _position(pos);
        }
    }
} ();

