Type.registerNamespace('Devy.UI');

Devy.UI.ListView = function() {
    Devy.UI.ListView.initializeBase(this);

    //Miembros
    this._Parent = null;
    this._Container = null;
    this._ListItemsContainer = null;
    this._CSSClass = "";

    this._DataSource = null;

    this._EditObjectCallBack = null;
    this._DeleteObjectCallBack = null;
    this._CreateListViewItemCallBack = null;

    this._events = null;
    this._initialized = false;

    this._Selectable = true;
    this._SelectedItem = null;
    this._MultiSelectable = false;
}

Devy.UI.ListView.prototype = {
    //*********************************************************************
    //Publicos
    set_Parent: function(value) { this._Parent = value; },
    get_Parent: function() { return this._Parent; },

    set_Container: function(value) { this._Container = value; },
    get_Container: function() { return this._Container; },

    set_CSSClass: function(value) { this._CSSClass = value; },
    get_CSSClass: function() { return this._CSSClass; },

    set_CreateListViewItemCallBack: function(value) { this._CreateListViewItemCallBack = value; },
    get_CreateListViewItemCallBack: function() { return this._CreateListViewItemCallBack; },

    set_EditObjectCallBack: function(value) { this._EditObjectCallBack = value; },
    get_EditObjectCallBack: function() { return this._EditObjectCallBack; },

    set_DeleteObjectCallBack: function(value) { this._DeleteObjectCallBack = value; },
    get_DeleteObjectCallBack: function() { return this._DeleteObjectCallBack; },

    set_Selectable: function(value) { this._Selectable = value; },
    get_Selectable: function() { return this._Selectable; },

    get_SelectedItem: function() {
        if (this._SelectedItem)
            return this._SelectedItem.BusinessObject;
        else
            return null;
    },

    set_MultiSelectable: function(value) { this._MultiSelectable = value; },
    get_MultiSelectable: function() { return this._MultiSelectable; },

    get_SelectedItems: function() {
        var filas = $('li.ListViewItem', this._ListItemsContainer);

        var ret = [];

        for (var i = 0; i < filas.length; i++) {
            var checkbox = $('input.MultiSelectCheckBox', filas[i])[0];

            if (checkbox) {
                var checked = Devy.Util.GetFormBooleanFieldValue(checkbox);

                if (checked)
                    ret.push(filas[i].BusinessObject.Id);
            }
        }

        return ret;
    },

    MultiSelect_All: function() {
        var filas = $('li.ListViewItem', this._ListItemsContainer);

        for (var i = 0; i < filas.length; i++) {
            var checkbox = $('input.MultiSelectCheckBox', filas[i])[0];

            if (checkbox)
                Devy.Util.SetFormBooleanFieldValue(checkbox, true);
        }
    },

    MultiSelect_None: function() {
        var filas = $('li.ListViewItem', this._ListItemsContainer);

        for (var i = 0; i < filas.length; i++) {
            var checkbox = $('input.MultiSelectCheckBox', filas[i])[0];

            if (checkbox)
                Devy.Util.SetFormBooleanFieldValue(checkbox, false);
        }
    },

    MultiSelect_Invert: function() {
        var filas = $('li.ListViewItem', this._ListItemsContainer);

        for (var i = 0; i < filas.length; i++) {
            var checkbox = $('input.MultiSelectCheckBox', filas[i])[0];

            if (checkbox)
                Devy.Util.SetFormBooleanFieldValue(checkbox, !Devy.Util.GetFormBooleanFieldValue(checkbox));
        }
    },

    MultiSelect_SelectIds: function(idsArray) {
        if (idsArray) {
            var filas = $('li.ListViewItem', this._ListItemsContainer);

            for (var i = 0; i < filas.length; i++) {
                var checkbox = $('input.MultiSelectCheckBox', filas[i])[0];

                if (checkbox)
                    Devy.Util.SetFormBooleanFieldValue(checkbox, Array.contains(idsArray, filas[i].BusinessObject.Id));
            }
        }
    },

    set_DataSource: function(value) {
        this._DataSource = value;

        if (this._initialized)
            this._updateRows();
    },
    get_DataSource: function() { return this._DataSource; },


    initialize: function() {
        Devy.UI.ListView.callBaseMethod(this, 'initialize');
        this._atachEvents();

        this._setUpInterface();
        this._initialized = true;
    },

    dispose: function() {
        this._detachEvents();
        Devy.UI.ListView.callBaseMethod(this, 'dispose');
    },

    _atachEvents: function() { },

    _detachEvents: function() { },

    //*********************************************************************
    //Mis eventos    
    get_events: function() {
        if (!this._events) {
            this._events = new Sys.EventHandlerList();
        }
        return this._events;
    },

    add_rowClick: function(handler) {
        this.get_events().addHandler('rowClick', handler);
    },
    remove_rowClick: function(handler) {
        this.get_events().removeHandler('rowClick', handler);
    },

    _raiseEvent: function(eventName, eventArgs) {
        var handler = this.get_events().getHandler(eventName);

        var theEventArgs = null;
        if (handler) {
            if (!eventArgs) {
                theEventArgs = Sys.EventArgs.Empty;
            }
            else {
                theEventArgs = eventArgs;
            }

            handler(this, theEventArgs);
        }
    },

    _CommandsContainerNeeded: function() {
        return (this._EditObjectCallBack || this._DeleteObjectCallBack);
    },

    _setUpInterface: function() {
        this._ListItemsContainer = $('<ul class="ListView ' + this._CSSClass + '"></ul>');
        $(this._Container).append(this._ListItemsContainer);
    },

    _updateRows: function() {
        if (this._ListItemsContainer) {
            var $_ListItemsContainer = $(this._ListItemsContainer);

            $_ListItemsContainer.empty();

            if (this._DataSource.length > 0) {
                var evenRow = false;
                for (i = 0; i < this._DataSource.length; i++) {
                    this._printRow(this._DataSource[i], evenRow);
                    evenRow = !evenRow;
                }

                $_ListItemsContainer.show();
            }
            else
                $_ListItemsContainer.hide();
        }
    },

    _onRowDblClick: function(row) {
        if (this._Selectable && !this._MultiSelectable) {
            var eventDataArgs = {};
            eventDataArgs.BusinessObject = row.BusinessObject;
            eventDataArgs.Row = row;

            this._raiseEvent('rowClick', eventDataArgs);
        }
    },
    _onRowMouseOver: function(row) {
        if (this._Selectable && !this._MultiSelectable) {
            if (row) {
                $(row).addClass("CanSelect");
            }
        }
    },
    _onRowMouseOut: function(row) {
        if (this._Selectable && !this._MultiSelectable) {
            if (row) {
                $(row).removeClass("CanSelect");
            }
        }
    },
    _onRowClick: function(row) {
        if (this._Selectable && !this._MultiSelectable) {
            if (row) {
                if (!row.__Selected) {

                    if (this._SelectedItem)
                        $(this._SelectedItem).removeClass("Selected");

                    this._SelectedItem = row;

                    $(this._SelectedItem).addClass("Selected");
                }
            }
        }
    },
    _printRow: function(obj, evenRow) {
        var contexto = this;

        var evenClass = "";
        if (evenRow) evenClass = " even";

        var listItem = $('<li class="ListViewItem' + evenClass + '"></li>');

        if (this._CreateListViewItemCallBack)
            listItem.append(this._CreateListViewItemCallBack(obj));
        else
            listItem.append('_CreateListViewItemCallBack is not set');

        if (this._CommandsContainerNeeded()) {
            var dvCommands = $('<div class="Commands"></div>');

            

            if (this._DeleteObjectCallBack && obj.Authorization.CanDelete) {
                var deleteCmd = $('<a href="#" title = "Eliminar este objeto" class="Command DeleteCmd"><span> Eliminar </span></a>')[0];
                $addHandler(deleteCmd, "click", function(evt) {
                    evt.preventDefault();
                    contexto._DeleteObjectCallBack(obj);
                });
                dvCommands.append(deleteCmd);
            }

            if (this._EditObjectCallBack && obj.Authorization.CanEdit) {
                var editCmd = $('<a href="#"  title = "Editar este objeto" class="Command EditCmd"><span> Editar </span></a>')[0];
                $addHandler(editCmd, "click", function(evt) {
                    evt.preventDefault();
                    contexto._EditObjectCallBack(obj);
                });
                dvCommands.append(editCmd);
            }

            if (this._MultiSelectable) {
                listItem.append('<div class="MultiSelectContainer"><input type="checkbox" class="MultiSelectCheckBox" name="chkSelected" id="chkSelected_' + obj.Id + '" value="' + obj.Id + '" /><label>Seleccionado</label></div>');
            }

            listItem.append(dvCommands);
        }

        listItem = listItem[0];
        listItem.BusinessObject = obj;

        if (!this._MultiSelectable && this._Selectable) {
            $addHandlers(listItem,
            {
                dblclick: function(evt) {
                    evt.preventDefault();
                    contexto._onRowDblClick(listItem);
                },
                click: function(evt) {
                    evt.preventDefault();
                    contexto._onRowClick(listItem);
                },
                mouseover: function(evt) {
                    evt.preventDefault();
                    contexto._onRowMouseOver(listItem);
                },
                mouseout: function(evt) {
                    evt.preventDefault();
                    contexto._onRowMouseOut(listItem);
                }
            });
        }
        $(this._ListItemsContainer).append(listItem);
    }
}

Devy.UI.ListView.registerClass('Devy.UI.ListView', Sys.Component);
