text: /**
   * @private
   */
  Ext.define('Ext.field.FileButton', {
      extend: 'Ext.Button',
      xtype: 'filebutton',
  
      /**
       * @event change
       * Fires when the value has changed.
       * @param {Ext.field.FileButton} this This FileButton
       * @param {String} newValue The new value
       * @param {String} oldValue The original value
       */
  
      config: {
          /**
           * @cfg {String}
           * The value of the file button's input
           */
          value: null,
  
          /**
           * @cfg {Boolean}
           * Allow selection of multiple files
           */
          multiple: false,
  
          /**
           * @cfg {String}
           * File input accept attribute documented here (http://www.w3schools.com/tags/att_input_accept.asp)
           * Also can be simple strings -- e.g. audio, video, image
           */
          accept: null,
  
          /**
           * @cfg {String}
           * File input capture attribute. Accepts values such as "camera", "camcorder", "microphone"
           */
          capture: null
      },
  
      buttonType: 'file',
      ui: 'action',
      text: 'Browse...',
      preventDefaultAction: false,
      keyHandlersAdded: true,
  
      getButtonTemplate: function() {
          var template = this.callParent();
  
          template.tag = 'input';
          template.listeners = template.listeners || {};
          template.listeners.change = {
              fn: 'onChange',
              delegated: false
          };
  
          return template;
      },
  
      applyAccept: function (value) {
          switch (value) {
              case "video":
              case "audio":
              case "image":
                  value = value + "/*";
                  break;
          }
  
          this.setInputAttribute('accept', value);
      },
  
      applyCapture: function (value) {
          this.setInputAttribute('capture', value);
          return value;
      },
  
      applyMultiple: function (value) {
          this.setInputAttribute('multiple', value ? '' : null);
          return value;
      },
  
      onChange: function(e) {
          this.setValue(this.buttonElement.dom.value);
      },
  
      updateValue: function(value, oldValue) {
          this.fireEvent('change', this, value, oldValue);
      },
  
      /**
       * Returns the field files.
       * @return {FileList} List of the files selected.
       */
      getFiles: function () {
          return this.buttonElement.dom.files;
      },
  
      privates: {
          setInputAttribute: function (attribute, newValue) {
              var buttonElement = this.buttonElement.dom;
  
              if (!Ext.isEmpty(newValue, true)) {
                  buttonElement.setAttribute(attribute, newValue);
              }
              else {
                  buttonElement.removeAttribute(attribute);
              }
          }
      }
  });
  