'use strict';

Ox.History = function(options) {

    options = Ox.extend({
        text: function(item) {
            return item.text;
        }
    }, options || {});

    var history = [],
        position = 0,
        $element;

    return {
        _print: function() {
            Ox.print(JSON.stringify({history: history, position: position}));
        },
        add: function(items) {
            items = Ox.makeArray(items);
            history = history.slice(0, position).concat(items);
            position += items.length;
            $element && $element.triggerEvent('add');
            return history.length;
        },
        bindEvent: function() {
            if (!$element) {
                $element = Ox.Element();
            }
            $element.bindEvent.apply($element, arguments);
        },
        clear: function() {
            history = [];
            position = 0;
            $element && $element.triggerEvent('clear');
            return history.length;
        },
        items: function() {
            return history.length;
        },
        redo: function() {
            if (position < history.length) {
                position++;
                $element && $element.triggerEvent('redo');
                return history[position - 1];
            }
        },
        redoText: function() {
            if (position < history.length) {
                return options.text(history[position]);
            }
        },
        remove: function(test) {
            
        },
        unbindEvent: function() {
            $element && $element.unbindEvent.apply($element, arguments);
        },
        undo: function() {
            if (position > 0) {
                position--;
                $element && $element.triggerEvent('undo');
                return history[position];
            }
        },
        undoText: function() {
            if (position > 0) {
                return options.text(history[position - 1]);
            }
        }
    };

};