Show:
                            var PropertyBuilderAvailableField,
                            
                                CSS_PROPERTY_BUILDER_FIELD = A.getClassName('property', 'builder', 'field'),
                                CSS_PROPERTY_BUILDER_FIELD_DRAGGABLE = A.getClassName('property', 'builder', 'field', 'draggable'),
                                CSS_PROPERTY_BUILDER_FIELD_ICON = A.getClassName('property', 'builder', 'field', 'icon'),
                                CSS_PROPERTY_BUILDER_FIELD_LABEL = A.getClassName('property', 'builder', 'field', 'label'),
                                CSS_ICON = A.getClassName('icon');
                            
                            /**
                             * A base class for PropertyBuilderAvailableField.
                             *
                             * @class A.PropertyBuilderAvailableField
                             * @extends Base
                             * @param {Object} config Object literal specifying widget configuration
                             *     properties.
                             * @constructor
                             */
                            PropertyBuilderAvailableField = A.Component.create({
                            
                                /**
                                 * Static property provides a string to identify the class.
                                 *
                                 * @property NAME
                                 * @type String
                                 * @static
                                 */
                                NAME: 'availableField',
                            
                                /**
                                 * Static property used to define the default attribute
                                 * configuration for the `A.PropertyBuilderAvailableField`.
                                 *
                                 * @property ATTRS
                                 * @type Object
                                 * @static
                                 */
                                ATTRS: {
                            
                                    /**
                                     * Defines if the field is draggable or not.
                                     *
                                     * @attribute draggable
                                     * @default true
                                     * @type Boolean
                                     */
                                    draggable: {
                                        value: true,
                                        validator: A.Lang.isBoolean
                                    },
                            
                                    /**
                                     * The descriptor of a field.
                                     *
                                     * @attribute label
                                     * @type String
                                     */
                                    label: {
                                        validator: A.Lang.isString
                                    },
                            
                                    /**
                                     * The CSS class name used in the icon.
                                     *
                                     * @attribute iconClass
                                     * @type String
                                     */
                                    iconClass: {
                                        validator: A.Lang.isString
                                    },
                            
                                    /**
                                     * The identifier of a field.
                                     *
                                     * @attribute id
                                     * @type String
                                     */
                                    id: {
                                        value: A.guid(),
                                        setter: '_setId',
                                        validator: A.Lang.isString
                                    },
                            
                                    /**
                                     * The node used in a field.
                                     *
                                     * @attribute node
                                     * @type Node
                                     * @writeOnce
                                     */
                                    node: {
                                        valueFn: function(val) {
                                            var instance = this;
                            
                                            if (!A.Lang.isNode(val)) {
                                                val = A.Node.create(
                                                    A.Lang.sub(
                                                        instance.FIELD_ITEM_TEMPLATE, {
                                                            iconClass: instance.get('iconClass')
                                                        }
                                                    )
                                                );
                            
                                                val.setData('availableField', instance);
                                            }
                            
                                            return val;
                                        },
                                        validator: A.Lang.isNode,
                                        writeOnce: true
                                    },
                            
                                    /**
                                     * The type of a field.
                                     *
                                     * @attribute type
                                     * @default 'node'
                                     * @type String
                                     */
                                    type: {
                                        value: 'node',
                                        validator: A.Lang.isString
                                    }
                                },
                            
                                /**
                                 * Static property used to define which component it extends.
                                 *
                                 * @property EXTENDS
                                 * @type String
                                 * @static
                                 */
                                EXTENDS: A.Base,
                            
                                /**
                                 * Constructs the node id string.
                                 *
                                 * @method buildNodeId
                                 * @param id
                                 * @private
                                 * @return {String}
                                 */
                                buildNodeId: function(id) {
                                    return 'availableFields' + '_' + 'field' + '_' + id;
                                },
                            
                                /**
                                 * Gets the `availableField` instance by its id.
                                 *
                                 * @method getAvailableFieldById
                                 * @param id
                                 * @private
                                 */
                                getAvailableFieldById: function(id) {
                                    return A.PropertyBuilderAvailableField.getAvailableFieldByNode('#' + A.PropertyBuilderAvailableField.buildNodeId(id));
                                },
                            
                                /**
                                 * Gets the `availableField` instance by its node.
                                 *
                                 * @method getAvailableFieldById
                                 * @param node
                                 * @private
                                 */
                                getAvailableFieldByNode: function(node) {
                                    node = A.one(node);
                            
                                    if (A.Lang.isNode(node)) {
                                        return node.getData('availableField');
                                    }
                            
                                    return null;
                                },
                            
                                prototype: {
                                    FIELD_ITEM_TEMPLATE: '<li class="' + CSS_PROPERTY_BUILDER_FIELD + '">' + '<span class="' + [CSS_ICON,
                                        CSS_PROPERTY_BUILDER_FIELD_ICON].join(' ') +
                                        ' {iconClass}"></span>' + '<div class="' + CSS_PROPERTY_BUILDER_FIELD_LABEL + '"></div>' + '</li>',
                            
                                    /**
                                     * Construction logic executed during `A.PropertyBuilderAvailableField` instantiation.
                                     * Lifecycle.
                                     *
                                     * @method initializer
                                     * @protected
                                     */
                                    initializer: function() {
                                        var instance = this;
                                        var node = instance.get('node');
                            
                                        instance.after({
                                            draggableChange: instance._afterDraggableChange,
                                            idChange: instance._afterIdChange,
                                            labelChange: instance._afterLabelChange
                                        });
                            
                                        instance.labelNode = node.one('.' + CSS_PROPERTY_BUILDER_FIELD_LABEL);
                            
                                        instance._uiSetDraggable(
                                            instance.get('draggable')
                                        );
                            
                                        instance._uiSetId(
                                            instance.get('id')
                                        );
                            
                                        instance._uiSetLabel(
                                            instance.get('label')
                                        );
                                    },
                            
                                    /**
                                     * Fires after `draggable` attribute value change.
                                     *
                                     * @method _afterDraggableChange
                                     * @param event
                                     * @protected
                                     */
                                    _afterDraggableChange: function(event) {
                                        var instance = this;
                            
                                        instance._uiSetDraggable(
                                            event.newVal
                                        );
                                    },
                            
                                    /**
                                     * Fires after `id` attribute value change.
                                     *
                                     * @method _afterIdChange
                                     * @param event
                                     * @protected
                                     */
                                    _afterIdChange: function(event) {
                                        var instance = this;
                            
                                        instance._uiSetId(
                                            event.newVal
                                        );
                                    },
                            
                                    /**
                                     * Fires after `label` attribute value change.
                                     *
                                     * @method _afterLabelChange
                                     * @param event
                                     * @protected
                                     */
                                    _afterLabelChange: function(event) {
                                        var instance = this;
                            
                                        instance._uiSetLabel(
                                            event.newVal
                                        );
                                    },
                            
                                    /**
                                     * Sets the `id` attribute.
                                     *
                                     * @method _setId
                                     * @param val
                                     * @protected
                                     */
                                    _setId: function(val) {
                                        return A.PropertyBuilderAvailableField.buildNodeId(val);
                                    },
                            
                                    /**
                                     * Sets the `draggable` attribute in the UI.
                                     *
                                     * @method _uiSetDraggable
                                     * @param val
                                     * @protected
                                     */
                                    _uiSetDraggable: function(val) {
                                        var instance = this;
                            
                                        instance.get('node').toggleClass(CSS_PROPERTY_BUILDER_FIELD_DRAGGABLE, val);
                                    },
                            
                                    /**
                                     * Sets the `id` attribute in the UI.
                                     *
                                     * @method _uiSetId
                                     * @param val
                                     * @protected
                                     */
                                    _uiSetId: function(val) {
                                        var instance = this;
                            
                                        instance.get('node').set('id', val);
                                    },
                            
                                    /**
                                     * Sets the `label` attribute in the UI.
                                     *
                                     * @method _uiSetLabel
                                     * @param val
                                     * @protected
                                     */
                                    _uiSetLabel: function(val) {
                                        var instance = this;
                            
                                        instance.get('node').attr('title', val);
                                        instance.labelNode.setContent(A.Escape.html(val));
                                    }
                                }
                            });
                            
                            A.PropertyBuilderAvailableField = PropertyBuilderAvailableField;