/**
 * Produces a standalone `<label />` element which can be inserted into a form and be associated
 * with a field in that form using the {@link #forId} property.
 * 
 * **NOTE:** in most cases it will be more appropriate to use the
 * {@link Ext.form.Labelable#fieldLabel fieldLabel} and associated config properties
 * ({@link Ext.form.Labelable#labelAlign}{@link Ext.form.Labelable#labelWidth}, etc.)
 * in field components themselves, as that allows labels to be uniformly sized throughout the form.
 * Ext.form.Label should only be used when your layout can not be achieved with the standard
 * {@link Ext.form.Labelable field layout}.
 * 
 * You will likely be associating the label with a field component that extends
 * {@link Ext.form.field.Base}, so you should make sure the {@link #forId} is set to the same value
 * as the {@link Ext.form.field.Base#inputId inputId} of that field.
 * 
 * The label's text can be set using either the {@link #text} or {@link #html} configuration
 * properties; the difference between the two is that the former will automatically escape HTML
 * characters when rendering, while the latter will not.
 *
 * # Example
 * 
 * This example creates a Label after its associated Text field, an arrangement that cannot
 * currently be achieved using the standard Field layout's labelAlign.
 * 
 *     @example
 *     Ext.create('Ext.form.Panel', {
 *         title: 'Field with Label',
 *         width: 400,
 *         bodyPadding: 10,
 *         renderTo: Ext.getBody(),
 *         layout: {
 *             type: 'hbox',
 *             align: 'middle'
 *         },
 *         items: [{
 *             xtype: 'textfield',
 *             hideLabel: true,
 *             flex: 1
 *         }, {
 *             xtype: 'label',
 *             forId: 'myFieldId',
 *             text: 'My Awesome Field',
 *             margin: '0 0 0 10'
 *         }]
 *     });
 */
Ext.define('Ext.form.Label', {
    extend: 'Ext.Component',
    alias: 'widget.label',
    
    requires: ['Ext.util.Format'],
 
    autoEl: 'label',
 
    /**
     * @cfg {String} [text='']
     * The plain text to display within the label. If you need to include HTML
     * tags within the label's innerHTML, use the {@link #html} config instead.
     */
    
    /**
     * @cfg {String} forId
     * The id of the input element to which this label will be bound via the standard HTML 'for'
     * attribute. If not specified, the attribute will not be added to the label. In most cases
     * you will be associating the label with a {@link Ext.form.field.Base} component,
     * so you should make sure this matches the {@link Ext.form.field.Base#inputId inputId}
     * of that field.
     */
    
    /**
     * @cfg {String} [html='']
     * An HTML fragment that will be used as the label's innerHTML.
     * Note that if {@link #text} is specified it will take precedence and this value
     * will be ignored.
     */
    
    maskOnDisable: false,
 
    getElConfig: function() {
        var me = this;
 
        me.html = me.text ? Ext.util.Format.htmlEncode(me.text) : (me.html || '');
        
        return Ext.apply(me.callParent(), {
            htmlFor: me.forId || ''
        });
    },
 
    /**
     * Updates the label's innerHTML with the specified string.
     * @param {String} text The new label text
     * @param {Boolean} [encode=true] False to skip HTML-encoding the text when rendering it
     * to the label. This might be useful if you want to include tags in the label's innerHTML
     * rather than rendering them as string literals per the default logic.
     * @return {Ext.form.Label} this
     */
    setText: function(text, encode) {
        var me = this;
        
        encode = encode !== false;
        
        if (encode) {
            me.text = text;
            delete me.html;
        }
        else {
            me.html = text;
            delete me.text;
        }
        
        if (me.rendered) {
            me.el.dom.innerHTML = encode !== false ? Ext.util.Format.htmlEncode(text) : text;
            me.updateLayout();
        }
        
        return me;
    }
});