/**
 * Base class for form field triggers
 * @private
 */
Ext.define('Ext.field.trigger.Base', {
    extend: 'Ext.Widget',
    alias: 'trigger.base',
 
    mixins: [
        'Ext.mixin.Factoryable'
    ],
 
    factoryConfig: {
        defaultType: 'trigger',
        aliasPrefix: 'trigger.'
    },
 
    isTrigger: true,
 
    config: {
        /**
         * @cfg {Ext.field.Text} 
         * The text field that created this trigger
         * @private
         */
        field: null,
 
        /**
         * @cfg {String} [group]
         * The name of an optional group trigger that this trigger belongs to.  If no trigger
         * Exists by that name one will automatically be created.  A group trigger is a
         * special trigger that contains other triggers.  Those triggers' elements are
         * appended to the group trigger's element in the DOM.
         *
         * The {@link #weight} of grouped triggers is relative to other triggers in the group.
         */
        group: null,
 
        /**
         * @cfg {'left'/'right'} [side='right']
         * The side of the text field's input to render the trigger on.
         */
        side: null,
 
        /**
         * @cfg {String} 
         * The key used to identify this trigger in the text field's triggers config.
         * @private
         */
        name: null,
 
        /**
         * The triggers contained in this trigger (only applicable for trigger groups)
         * @private
         */
        triggers: null
    },
 
    classCls: Ext.baseCSSPrefix + 'trigger',
    groupedCls: Ext.baseCSSPrefix + 'grouped',
 
    inheritUi: true,
 
    statics: {
        /**
         * Sorts an array of triggers in place by weight
         * @param {Ext.field.Trigger[]} triggers 
         * @return {Ext.field.Trigger[]} 
         * @private
         * @static
         */
        sort: function(triggers) {
            Ext.Array.sort(triggers, Ext.weightSortFn);
 
            return triggers;
        }
    },
 
    doDestroy: function() {
        var triggers = this.getTriggers(),
            i, ln;
 
        if (triggers) {
            for (= 0, ln = triggers.length; i < ln; i++) {
                triggers[i].destroy();
            }
        }
 
        this.setTriggers(null);
 
        this.callParent();
    },
 
    updateField: function(field) {
        // All Components MUST have an upward link through either parent or ownerCmp
        this.field = this.ownerCmp = field;
 
        this.doInheritUi();
    },
 
 
    updateGroup: function(group) {
        if (!this.isConfiguring) {
            this.getField().syncTriggers();
        }
    },
 
    updateSide: function() {
        if (!this.isConfiguring) {
            this.getField().syncTriggers();
        }
    },
 
    updateTriggers: function(triggers) {
        var me = this,
            dom = me.element.dom,
            i, ln;
 
        me.toggleCls(me.groupedCls, !!(triggers && triggers.length));
 
        if (triggers) {
            for (= 0, ln = triggers.length; i < ln; i++) {
                dom.appendChild(triggers[i].element.dom);
            }
        }
    }
});