'use strict';

/*@
Ox.ListItem <f> ListItem Object
    ([options[, self]]) -> <o:Ox.Element> ListItem Object
        cancel <!> triggered if cancel button is pressed
        save <!> triggered if save button is pressed
    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
@*/

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() {
                constructItem(true);
            }
        });

    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.$element.hasClass('OxSelected') && $element.addClass('OxSelected');
        }
        that.setElement($element);
    }

    return that;

};
