var struct = window.struct || {};

struct.SegmentedList = Class.create({
    
    initialize: function(segmentSize, list) {
        this.segmentSize = segmentSize;
        this.list = list;
        
        this.setCurrentSegmentByIndex(0);
    },
    
    current: function() {
        return this._currentSegment;
    },
    
    next: function() {
        var start = this._currentSegment.indexes.first() + 1;
        this.setCurrentSegmentByIndex(start);
        return this._currentSegment;
    },
    
    prev: function() {
        var start = this._currentSegment.indexes.first() - 1;
        if(start < 0) {
            start = this.list.size() - 1;
        }
        this.setCurrentSegmentByIndex(start);
        return this._currentSegment;
    },
    
    getSegmentByIndex: function(start, size) {
        var items = [], indexes = [];
        var segmentSize = size || this.segmentSize;
        var end = start + segmentSize - 1;
        var dataEnd = this.list.size() - 1;
        var remainder;
        if(end > dataEnd) {
            remainder = end - dataEnd; 
            end = dataEnd;
        }
        items = this.list.slice(start, end+1);
        indexes = indexes.concat($A($R(start, end)));
        if(remainder) {
            items = items.concat(this.list.slice(0, remainder));
            indexes = indexes.concat($A($R(0, remainder - 1)));
        }
        return {
            items: items,
            indexes: indexes
        };
    },
    
    setCurrentSegmentByIndex: function(sIndex) {
        this._currentSegment = this.getSegmentByIndex(sIndex);
        return this._currentSegment;
    },
    
    setCurrentSegmentByItem: function(item) {
        this.setCurrentSegmentByIndex(this.list.indexOf(item));
    },
    
    setList: function(list) {
        this.list = list;
        this.setCurrentSegmentByIndex(0);
    },
    
    getList: function() {
        return this.list;
    },
    
    setSegmentSize: function(segmentSize) {
        this.segmentSize = segmentSize;
        this._currentSegment = this.getSegmentByIndex(this._currentSegment.indexes.first());
    }
    
});

// test
var f = new struct.SegmentedList(3, ["Acai", "Aceola", "Apple", "Apricots", "Avocado", "Banana", "Blackberry", "Blueberries", "Camu Camu berry", "Cherries", "Coconut", "Cranberry", "Cucumber", "Currents", "Dates", "Durian", "Fig", "Goji berries", "Gooseberry", "Grapefruit", "Grapes", "Jackfruit", "Kiwi", "Kumquat", "Lemon", "Lime", "Lucuma", "Lychee", "Mango", "Mangosteen", "Melon", "Mulberry", "Nectarine", "Orange", "Papaya", "Passion Fruit", "Peach", "Pear", "Pineapple", "Plum", "Pomegranate", "Pomelo", "Prickly Pear", "Prunes", "Raspberries", "Strawberries", "Tangerine/Clementine", "Watermelon"]);

