/**
 * A ListItem is a container for {@link Ext.dataview.List} with 
 * useSimpleItems: false. 
 * 
 * ListItem configures and updates the {@link Ext.data.Model records} for  
 * the sub-component items in a list. 
 *
 * *Note*: Use of ListItem increases overhead since it generates more markup than
 * using the List class with useSimpleItems: true. This overhead is more
 * noticeable in Internet Explorer. If at all possible, use
 * {@link Ext.dataview.SimpleListItem} instead via the List's
 * {@link Ext.dataview.List#useSimpleItems useSimpleItems} config.
 *
 * The following example shows how to configure and update sub-component items
 * in a list:
 *
 *      Ext.define('App.view.twitter.TweetListItem', {
 *          extend: 'Ext.dataview.ListItem',
 *          xtype : 'tweetlistitem',
 *
 *          requires: [
 *              'Ext.Img'
 *          ],
 *
 *          layout: 'vbox',
 *
 *          items: [{
 *              xtype: 'component',
 *              cls: 'username',
 *              reference: 'userName'
 *          }, {
 *              xtype: 'component',
 *              cls: 'text',
 *              reference: 'textCmp'
 *          }, {
 *              xtype : 'image',
 *              reference: 'avatarImg',
 *              docked: 'left',
 *              cls: 'avatar',
 *              width: 48,
 *              height: 48
 *          }],
 *
 *          dataMap: {
 *              // Set "html" config of component w/reference "userName"
 *              // to the "username" field from the associated record.
 *              //
 *              userName: {
 *                  html: 'username'
 *              },
 *
 *              textCmp: {
 *                  html: 'text'
 *              },
 *
 *              avatarImg: {
 *                  src: 'avatar_url'
 *              }
 *          }
 *      });
 *
 */
Ext.define('Ext.dataview.ListItem', {
    extend: 'Ext.dataview.DataItem',
    alternateClassName: 'Ext.dataview.component.ListItem',
    xtype: 'listitem',
 
    requires: [
        'Ext.dataview.ItemHeader'
    ],
 
    mixins: [
        'Ext.mixin.Toolable',
        'Ext.dataview.Pinnable'
    ],
 
    classCls: [
        // ListItem is classClsRoot so that it can opt out of inheriting styles from 
        // DataItem, but it still needs to inherit container and component styles 
        Ext.baseCSSPrefix + 'listitem',
        Ext.baseCSSPrefix + 'container',
        Ext.baseCSSPrefix + 'component'
    ],
    classClsRoot: true,
 
    inheritUi: true,
 
    items: null,  // base class has one item by default 
 
    toolDefaults: {
        ui: 'listitem'
    },
 
    toolAnchorName: 'innerElement',
 
    tools: {
        disclosure: {
            weight: 100
        }
    },
 
    getDisclosure: function () {
        return this.lookupTool('disclosure');
    },
 
    updateRecord: function(record) {
        var me = this,
            disclosure;
 
        if (!me.destroying && !me.destroyed) {
            me.callParent([record]);
            
            disclosure = me.getDisclosure();
 
            if (disclosure) {
                disclosure.setHidden(me.parent.shouldHideDisclosure(record));
            }
        }
    },
 
    doDestroy: function() {
        this.mixins.toolable.doDestroy.call(this);
        this.callParent();
    },
 
    privates: {
        invokeToolHandler: function (tool, handler, scope, args, ev) {
            if (tool.type === 'disclosure' && !handler) {
                var me = this,
                    parent = me.parent;
 
                if (parent && parent.onItemDisclosureTap) {
                    parent.onItemDisclosureTap(ev);
                    return false;
                }
            }
 
            return tool.invokeToolHandler(tool, handler, scope, args, ev);
        }
    }
});