'use strict';

/*@
Ox.ListItem <f> ListItem Object
    options <o> Options object
        construct <f> construct function
        data <o|{}> item data
        draggable <b|false> can be dragged
        position <n|0> item position
        unique <s|''> unique key
    self <o> Shared private variable
    ([options[, self]]) -> <o:Ox.Element> ListItem Object
        cancel <!> triggered if cancel button is pressed
        save <!> triggered if save button is pressed
@*/

Ox.ListItem = function(options, self) {

    self = self || {};
    var that = Ox.Element({}, self)
        .defaults({
            construct: null,
            data: {},
            draggable: false,
            position: 0,
            unique: ''
        })
        .options(options || {})
        .update({
            data: function() {
                if (!that.find('.OxEdit').length) {
                    constructItem(true);
                }
            },
            position: function() {
                that.data({position: self.options.position});
            }
        });

    constructItem();

    function constructItem(update) {
        var $element = self.options.construct(self.options.data)
            .addClass('OxItem')
            .data({
                id: self.options.data[self.options.unique],
                position: self.options.position
            });
        if (update) {
            that.hasClass('OxSelected') && $element.addClass('OxSelected');
        }
        that.setElement($element);
    }

    return that;

};