'use strict';

/*@
Ox.Clipboard <o> Basic clipboard handler
    add <f> Add items to clipboard
        (items[, type]) -> <n> Number of items
    clear <f> Clear clipboard
        () -> <n> Number of items
    copy <f> Copy items to clipboard
        (items[, type]) -> <n> Number of items
    paste <f> Paste items from clipboard
        () -> <a> Items
    type <f> Get item type
        () -> <s|undefined> Item type
@*/
Ox.Clipboard = function() {
    var clipboard = {items: [], type: void 0},
        $element;
    return {
        _print: function() {
            Ox.print(JSON.stringify(clipboard));
        },
        add: function(items, type) {
            items = Ox.makeArray(items);
            if (items.length) {
                if (type != clipboard.type) {
                    Ox.Clipboard.clear();
                }
                clipboard = {
                    items: Ox.unique(clipboard.items.concat(items)),
                    type: type
                };
                $element && $element.triggerEvent('add');
            }
            return clipboard.items.length;
        },
        bindEvent: function() {
            if (!$element) {
                $element = Ox.Element();
            }
            $element.bindEvent.apply($element, arguments);
        },
        clear: function() {
            clipboard = {items: [], type: void 0};
            $element && $element.triggerEvent('clear');
            return clipboard.items.length;
        },
        copy: function(items, type) {
            items = Ox.makeArray(items);
            if (items.length) {
                clipboard = {items: items, type: type};
                $element && $element.triggerEvent('copy');
            }
            return clipboard.items.length;
        },
        items: function(type) {
            return !type || type == clipboard.type ? clipboard.items.length : 0;
        },
        paste: function(type) {
            $element && $element.triggerEvent('paste');
            return !type || type == clipboard.type ? clipboard.items : [];
        },
        type: function() {
            return clipboard.type;
        },
        unbindEvent: function() {
            $element && $element.unbindEvent.apply($element, arguments);
        }
    };
};