Mimimum syndical pour en faire un produit zope / cmf.
[ckeditor.git] / skins / ckeditor / _source / plugins / dialogui / plugin.js
diff --git a/skins/ckeditor/_source/plugins/dialogui/plugin.js b/skins/ckeditor/_source/plugins/dialogui/plugin.js
new file mode 100644 (file)
index 0000000..c68c35b
--- /dev/null
@@ -0,0 +1,1541 @@
+/*\r
+Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.\r
+For licensing, see LICENSE.html or http://ckeditor.com/license\r
+*/\r
+\r
+/** @fileoverview The "dialogui" plugin. */\r
+\r
+CKEDITOR.plugins.add( 'dialogui' );\r
+\r
+(function()\r
+{\r
+       var initPrivateObject = function( elementDefinition )\r
+       {\r
+               this._ || ( this._ = {} );\r
+               this._['default'] = this._.initValue = elementDefinition['default'] || '';\r
+               this._.required = elementDefinition[ 'required' ] || false;\r
+               var args = [ this._ ];\r
+               for ( var i = 1 ; i < arguments.length ; i++ )\r
+                       args.push( arguments[i] );\r
+               args.push( true );\r
+               CKEDITOR.tools.extend.apply( CKEDITOR.tools, args );\r
+               return this._;\r
+       },\r
+       textBuilder =\r
+       {\r
+               build : function( dialog, elementDefinition, output )\r
+               {\r
+                       return new CKEDITOR.ui.dialog.textInput( dialog, elementDefinition, output );\r
+               }\r
+       },\r
+       commonBuilder =\r
+       {\r
+               build : function( dialog, elementDefinition, output )\r
+               {\r
+                       return new CKEDITOR.ui.dialog[elementDefinition.type]( dialog, elementDefinition, output );\r
+               }\r
+       },\r
+       containerBuilder =\r
+       {\r
+               build : function( dialog, elementDefinition, output )\r
+               {\r
+                       var children = elementDefinition.children,\r
+                               child,\r
+                               childHtmlList = [],\r
+                               childObjList = [];\r
+                       for ( var i = 0 ; ( i < children.length && ( child = children[i] ) ) ; i++ )\r
+                       {\r
+                               var childHtml = [];\r
+                               childHtmlList.push( childHtml );\r
+                               childObjList.push( CKEDITOR.dialog._.uiElementBuilders[ child.type ].build( dialog, child, childHtml ) );\r
+                       }\r
+                       return new CKEDITOR.ui.dialog[ elementDefinition.type ]( dialog, childObjList, childHtmlList, output, elementDefinition );\r
+               }\r
+       },\r
+       commonPrototype =\r
+       {\r
+               isChanged : function()\r
+               {\r
+                       return this.getValue() != this.getInitValue();\r
+               },\r
+\r
+               reset : function( noChangeEvent )\r
+               {\r
+                       this.setValue( this.getInitValue(), noChangeEvent );\r
+               },\r
+\r
+               setInitValue : function()\r
+               {\r
+                       this._.initValue = this.getValue();\r
+               },\r
+\r
+               resetInitValue : function()\r
+               {\r
+                       this._.initValue = this._['default'];\r
+               },\r
+\r
+               getInitValue : function()\r
+               {\r
+                       return this._.initValue;\r
+               }\r
+       },\r
+       commonEventProcessors = CKEDITOR.tools.extend( {}, CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,\r
+               {\r
+                       onChange : function( dialog, func )\r
+                       {\r
+                               if ( !this._.domOnChangeRegistered )\r
+                               {\r
+                                       dialog.on( 'load', function()\r
+                                               {\r
+                                                       this.getInputElement().on( 'change', function()\r
+                                                       {\r
+                                                               // Make sure 'onchange' doesn't get fired after dialog closed. (#5719)\r
+                                                               if ( !dialog.parts.dialog.isVisible() )\r
+                                                                       return;\r
+\r
+                                                               this.fire( 'change', { value : this.getValue() } );\r
+                                                       }, this );\r
+                                               }, this );\r
+                                       this._.domOnChangeRegistered = true;\r
+                               }\r
+\r
+                               this.on( 'change', func );\r
+                       }\r
+               }, true ),\r
+       eventRegex = /^on([A-Z]\w+)/,\r
+       cleanInnerDefinition = function( def )\r
+       {\r
+               // An inner UI element should not have the parent's type, title or events.\r
+               for ( var i in def )\r
+               {\r
+                       if ( eventRegex.test( i ) || i == 'title' || i == 'type' )\r
+                               delete def[i];\r
+               }\r
+               return def;\r
+       };\r
+\r
+       CKEDITOR.tools.extend( CKEDITOR.ui.dialog,\r
+               /** @lends CKEDITOR.ui.dialog */\r
+               {\r
+                       /**\r
+                        * Base class for all dialog elements with a textual label on the left.\r
+                        * @constructor\r
+                        * @example\r
+                        * @extends CKEDITOR.ui.dialog.uiElement\r
+                        * @param {CKEDITOR.dialog} dialog\r
+                        * Parent dialog object.\r
+                        * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition\r
+                        * The element definition. Accepted fields:\r
+                        * <ul>\r
+                        *      <li><strong>label</strong> (Required) The label string.</li>\r
+                        *      <li><strong>labelLayout</strong> (Optional) Put 'horizontal' here if the\r
+                        *      label element is to be layed out horizontally. Otherwise a vertical\r
+                        *      layout will be used.</li>\r
+                        *      <li><strong>widths</strong> (Optional) This applies only for horizontal\r
+                        *      layouts - an 2-element array of lengths to specify the widths of the\r
+                        *      label and the content element.</li>\r
+                        * </ul>\r
+                        * @param {Array} htmlList\r
+                        * List of HTML code to output to.\r
+                        * @param {Function} contentHtml\r
+                        * A function returning the HTML code string to be added inside the content\r
+                        * cell.\r
+                        */\r
+                       labeledElement : function( dialog, elementDefinition, htmlList, contentHtml )\r
+                       {\r
+                               if ( arguments.length < 4 )\r
+                                       return;\r
+\r
+                               var _ = initPrivateObject.call( this, elementDefinition );\r
+                               _.labelId = CKEDITOR.tools.getNextId() + '_label';\r
+                               var children = this._.children = [];\r
+                               /** @ignore */\r
+                               var innerHTML = function()\r
+                               {\r
+                                       var html = [],\r
+                                               requiredClass = elementDefinition.required ? ' cke_required' : '' ;\r
+                                       if ( elementDefinition.labelLayout != 'horizontal' )\r
+                                               html.push( '<label class="cke_dialog_ui_labeled_label' + requiredClass + '" ',\r
+                                                               ' id="'+  _.labelId + '"',\r
+                                                               ' for="' + _.inputId + '"',\r
+                                                               ( elementDefinition.labelStyle ? ' style="' + elementDefinition.labelStyle + '"' : '' ) +'>',\r
+                                                               elementDefinition.label,\r
+                                                               '</label>',\r
+                                                               '<div class="cke_dialog_ui_labeled_content"' + ( elementDefinition.controlStyle ? ' style="' + elementDefinition.controlStyle + '"' : '' ) + ' role="presentation">',\r
+                                                               contentHtml.call( this, dialog, elementDefinition ),\r
+                                                               '</div>' );\r
+                                       else\r
+                                       {\r
+                                               var hboxDefinition = {\r
+                                                       type : 'hbox',\r
+                                                       widths : elementDefinition.widths,\r
+                                                       padding : 0,\r
+                                                       children :\r
+                                                       [\r
+                                                               {\r
+                                                                       type : 'html',\r
+                                                                       html : '<label class="cke_dialog_ui_labeled_label' + requiredClass + '"' +\r
+                                                                               ' id="' + _.labelId + '"' +\r
+                                                                               ' for="' + _.inputId + '"' +\r
+                                                                               ( elementDefinition.labelStyle ? ' style="' + elementDefinition.labelStyle + '"' : '' ) +'>' +\r
+                                                                                  CKEDITOR.tools.htmlEncode( elementDefinition.label ) +\r
+                                                                               '</span>'\r
+                                                               },\r
+                                                               {\r
+                                                                       type : 'html',\r
+                                                                       html : '<span class="cke_dialog_ui_labeled_content"' + ( elementDefinition.controlStyle ? ' style="' + elementDefinition.controlStyle + '"' : '' ) + '>' +\r
+                                                                               contentHtml.call( this, dialog, elementDefinition ) +\r
+                                                                               '</span>'\r
+                                                               }\r
+                                                       ]\r
+                                               };\r
+                                               CKEDITOR.dialog._.uiElementBuilders.hbox.build( dialog, hboxDefinition, html );\r
+                                       }\r
+                                       return html.join( '' );\r
+                               };\r
+                               CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, htmlList, 'div', null, { role : 'presentation' }, innerHTML );\r
+                       },\r
+\r
+                       /**\r
+                        * A text input with a label. This UI element class represents both the\r
+                        * single-line text inputs and password inputs in dialog boxes.\r
+                        * @constructor\r
+                        * @example\r
+                        * @extends CKEDITOR.ui.dialog.labeledElement\r
+                        * @param {CKEDITOR.dialog} dialog\r
+                        * Parent dialog object.\r
+                        * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition\r
+                        * The element definition. Accepted fields:\r
+                        * <ul>\r
+                        *      <li><strong>default</strong> (Optional) The default value.</li>\r
+                        *      <li><strong>validate</strong> (Optional) The validation function. </li>\r
+                        *      <li><strong>maxLength</strong> (Optional) The maximum length of text box\r
+                        *      contents.</li>\r
+                        *      <li><strong>size</strong> (Optional) The size of the text box. This is\r
+                        *      usually overridden by the size defined by the skin, however.</li>\r
+                        * </ul>\r
+                        * @param {Array} htmlList\r
+                        * List of HTML code to output to.\r
+                        */\r
+                       textInput : function( dialog, elementDefinition, htmlList )\r
+                       {\r
+                               if ( arguments.length < 3 )\r
+                                       return;\r
+\r
+                               initPrivateObject.call( this, elementDefinition );\r
+                               var domId = this._.inputId = CKEDITOR.tools.getNextId() + '_textInput',\r
+                                       attributes = { 'class' : 'cke_dialog_ui_input_' + elementDefinition.type, id : domId, type : 'text' },\r
+                                       i;\r
+\r
+                               // Set the validator, if any.\r
+                               if ( elementDefinition.validate )\r
+                                       this.validate = elementDefinition.validate;\r
+\r
+                               // Set the max length and size.\r
+                               if ( elementDefinition.maxLength )\r
+                                       attributes.maxlength = elementDefinition.maxLength;\r
+                               if ( elementDefinition.size )\r
+                                       attributes.size = elementDefinition.size;\r
+\r
+                               if ( elementDefinition.inputStyle )\r
+                                       attributes.style = elementDefinition.inputStyle;\r
+\r
+                               // If user presses Enter in a text box, it implies clicking OK for the dialog.\r
+                               var me = this, keyPressedOnMe = false;\r
+                               dialog.on( 'load', function()\r
+                                       {\r
+                                               me.getInputElement().on( 'keydown', function( evt )\r
+                                                       {\r
+                                                               if ( evt.data.getKeystroke() == 13 )\r
+                                                                       keyPressedOnMe = true;\r
+                                                       } );\r
+\r
+                                               // Lower the priority this 'keyup' since 'ok' will close the dialog.(#3749)\r
+                                               me.getInputElement().on( 'keyup', function( evt )\r
+                                                       {\r
+                                                               if ( evt.data.getKeystroke() == 13 && keyPressedOnMe )\r
+                                                               {\r
+                                                                       dialog.getButton( 'ok' ) && setTimeout( function ()\r
+                                                                       {\r
+                                                                               dialog.getButton( 'ok' ).click();\r
+                                                                       }, 0 );\r
+                                                                       keyPressedOnMe = false;\r
+                                                               }\r
+                                                       }, null, null, 1000 );\r
+                                       } );\r
+\r
+                               /** @ignore */\r
+                               var innerHTML = function()\r
+                               {\r
+                                       // IE BUG: Text input fields in IE at 100% would exceed a <td> or inline\r
+                                       // container's width, so need to wrap it inside a <div>.\r
+                                       var html = [ '<div class="cke_dialog_ui_input_', elementDefinition.type, '" role="presentation"' ];\r
+\r
+                                       if ( elementDefinition.width )\r
+                                               html.push( 'style="width:'+ elementDefinition.width +'" ' );\r
+\r
+                                       html.push( '><input ' );\r
+\r
+                                       attributes[ 'aria-labelledby' ] = this._.labelId;\r
+                                       this._.required && ( attributes[ 'aria-required' ] = this._.required );\r
+                                       for ( var i in attributes )\r
+                                               html.push( i + '="' + attributes[i] + '" ' );\r
+                                       html.push( ' /></div>' );\r
+                                       return html.join( '' );\r
+                               };\r
+                               CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML );\r
+                       },\r
+\r
+                       /**\r
+                        * A text area with a label on the top or left.\r
+                        * @constructor\r
+                        * @extends CKEDITOR.ui.dialog.labeledElement\r
+                        * @example\r
+                        * @param {CKEDITOR.dialog} dialog\r
+                        * Parent dialog object.\r
+                        * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition\r
+                        * The element definition. Accepted fields:\r
+                        * <ul>\r
+                        *      <li><strong>rows</strong> (Optional) The number of rows displayed.\r
+                        *      Defaults to 5 if not defined.</li>\r
+                        *      <li><strong>cols</strong> (Optional) The number of cols displayed.\r
+                        *      Defaults to 20 if not defined. Usually overridden by skins.</li>\r
+                        *      <li><strong>default</strong> (Optional) The default value.</li>\r
+                        *      <li><strong>validate</strong> (Optional) The validation function. </li>\r
+                        * </ul>\r
+                        * @param {Array} htmlList\r
+                        * List of HTML code to output to.\r
+                        */\r
+                       textarea : function( dialog, elementDefinition, htmlList )\r
+                       {\r
+                               if ( arguments.length < 3 )\r
+                                       return;\r
+\r
+                               initPrivateObject.call( this, elementDefinition );\r
+                               var me = this,\r
+                                       domId = this._.inputId = CKEDITOR.tools.getNextId() + '_textarea',\r
+                                       attributes = {};\r
+\r
+                               if ( elementDefinition.validate )\r
+                                       this.validate = elementDefinition.validate;\r
+\r
+                               // Generates the essential attributes for the textarea tag.\r
+                               attributes.rows = elementDefinition.rows || 5;\r
+                               attributes.cols = elementDefinition.cols || 20;\r
+\r
+                               if ( typeof elementDefinition.inputStyle != 'undefined' )\r
+                                       attributes.style = elementDefinition.inputStyle;\r
+\r
+\r
+                               /** @ignore */\r
+                               var innerHTML = function()\r
+                               {\r
+                                       attributes[ 'aria-labelledby' ] = this._.labelId;\r
+                                       this._.required && ( attributes[ 'aria-required' ] = this._.required );\r
+                                       var html = [ '<div class="cke_dialog_ui_input_textarea" role="presentation"><textarea class="cke_dialog_ui_input_textarea" id="', domId, '" ' ];\r
+                                       for ( var i in attributes )\r
+                                               html.push( i + '="' + CKEDITOR.tools.htmlEncode( attributes[i] ) + '" ' );\r
+                                       html.push( '>', CKEDITOR.tools.htmlEncode( me._['default'] ), '</textarea></div>' );\r
+                                       return html.join( '' );\r
+                               };\r
+                               CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML );\r
+                       },\r
+\r
+                       /**\r
+                        * A single checkbox with a label on the right.\r
+                        * @constructor\r
+                        * @extends CKEDITOR.ui.dialog.uiElement\r
+                        * @example\r
+                        * @param {CKEDITOR.dialog} dialog\r
+                        * Parent dialog object.\r
+                        * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition\r
+                        * The element definition. Accepted fields:\r
+                        * <ul>\r
+                        *      <li><strong>checked</strong> (Optional) Whether the checkbox is checked\r
+                        *      on instantiation. Defaults to false.</li>\r
+                        *      <li><strong>validate</strong> (Optional) The validation function.</li>\r
+                        *      <li><strong>label</strong> (Optional) The checkbox label.</li>\r
+                        * </ul>\r
+                        * @param {Array} htmlList\r
+                        * List of HTML code to output to.\r
+                        */\r
+                       checkbox : function( dialog, elementDefinition, htmlList )\r
+                       {\r
+                               if ( arguments.length < 3 )\r
+                                       return;\r
+\r
+                               var _ = initPrivateObject.call( this, elementDefinition, { 'default' : !!elementDefinition[ 'default' ] } );\r
+\r
+                               if ( elementDefinition.validate )\r
+                                       this.validate = elementDefinition.validate;\r
+\r
+                               /** @ignore */\r
+                               var innerHTML = function()\r
+                               {\r
+                                       var myDefinition = CKEDITOR.tools.extend( {}, elementDefinition,\r
+                                                       {\r
+                                                               id : elementDefinition.id ? elementDefinition.id + '_checkbox' : CKEDITOR.tools.getNextId() + '_checkbox'\r
+                                                       }, true ),\r
+                                               html = [];\r
+\r
+                                       var labelId = CKEDITOR.tools.getNextId() + '_label';\r
+                                       var attributes = { 'class' : 'cke_dialog_ui_checkbox_input', type : 'checkbox', 'aria-labelledby' : labelId };\r
+                                       cleanInnerDefinition( myDefinition );\r
+                                       if ( elementDefinition[ 'default' ] )\r
+                                               attributes.checked = 'checked';\r
+\r
+                                       if ( typeof myDefinition.inputStyle != 'undefined' )\r
+                                               myDefinition.style = myDefinition.inputStyle;\r
+\r
+                                       _.checkbox = new CKEDITOR.ui.dialog.uiElement( dialog, myDefinition, html, 'input', null, attributes );\r
+                                       html.push( ' <label id="', labelId, '" for="', attributes.id, '"' + ( elementDefinition.labelStyle ? ' style="' + elementDefinition.labelStyle + '"' : '' ) + '>',\r
+                                                       CKEDITOR.tools.htmlEncode( elementDefinition.label ),\r
+                                                       '</label>' );\r
+                                       return html.join( '' );\r
+                               };\r
+\r
+                               CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, htmlList, 'span', null, null, innerHTML );\r
+                       },\r
+\r
+                       /**\r
+                        * A group of radio buttons.\r
+                        * @constructor\r
+                        * @example\r
+                        * @extends CKEDITOR.ui.dialog.labeledElement\r
+                        * @param {CKEDITOR.dialog} dialog\r
+                        * Parent dialog object.\r
+                        * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition\r
+                        * The element definition. Accepted fields:\r
+                        * <ul>\r
+                        *      <li><strong>default</strong> (Required) The default value.</li>\r
+                        *      <li><strong>validate</strong> (Optional) The validation function.</li>\r
+                        *      <li><strong>items</strong> (Required) An array of options. Each option\r
+                        *      is a 1- or 2-item array of format [ 'Description', 'Value' ]. If 'Value'\r
+                        *      is missing, then the value would be assumed to be the same as the\r
+                        *      description.</li>\r
+                        * </ul>\r
+                        * @param {Array} htmlList\r
+                        * List of HTML code to output to.\r
+                        */\r
+                       radio : function( dialog, elementDefinition, htmlList )\r
+                       {\r
+                               if ( arguments.length < 3)\r
+                                       return;\r
+\r
+                               initPrivateObject.call( this, elementDefinition );\r
+                               if ( !this._['default'] )\r
+                                       this._['default'] = this._.initValue = elementDefinition.items[0][1];\r
+                               if ( elementDefinition.validate )\r
+                                       this.validate = elementDefinition.valdiate;\r
+                               var children = [], me = this;\r
+\r
+                               /** @ignore */\r
+                               var innerHTML = function()\r
+                               {\r
+                                       var inputHtmlList = [], html = [],\r
+                                               commonAttributes = { 'class' : 'cke_dialog_ui_radio_item', 'aria-labelledby' : this._.labelId },\r
+                                               commonName = elementDefinition.id ? elementDefinition.id + '_radio' : CKEDITOR.tools.getNextId() + '_radio';\r
+                                       for ( var i = 0 ; i < elementDefinition.items.length ; i++ )\r
+                                       {\r
+                                               var item = elementDefinition.items[i],\r
+                                                       title = item[2] !== undefined ? item[2] : item[0],\r
+                                                       value = item[1] !== undefined ? item[1] : item[0],\r
+                                                       inputId = CKEDITOR.tools.getNextId() + '_radio_input',\r
+                                                       labelId = inputId + '_label',\r
+                                                       inputDefinition = CKEDITOR.tools.extend( {}, elementDefinition,\r
+                                                                       {\r
+                                                                               id : inputId,\r
+                                                                               title : null,\r
+                                                                               type : null\r
+                                                                       }, true ),\r
+                                                       labelDefinition = CKEDITOR.tools.extend( {}, inputDefinition,\r
+                                                                       {\r
+                                                                               title : title\r
+                                                                       }, true ),\r
+                                                       inputAttributes =\r
+                                                       {\r
+                                                               type : 'radio',\r
+                                                               'class' : 'cke_dialog_ui_radio_input',\r
+                                                               name : commonName,\r
+                                                               value : value,\r
+                                                               'aria-labelledby' : labelId\r
+                                                       },\r
+                                                       inputHtml = [];\r
+                                               if ( me._['default'] == value )\r
+                                                       inputAttributes.checked = 'checked';\r
+                                               cleanInnerDefinition( inputDefinition );\r
+                                               cleanInnerDefinition( labelDefinition );\r
+\r
+                                               if ( typeof inputDefinition.inputStyle != 'undefined' )\r
+                                                       inputDefinition.style = inputDefinition.inputStyle;\r
+\r
+                                               children.push( new CKEDITOR.ui.dialog.uiElement( dialog, inputDefinition, inputHtml, 'input', null, inputAttributes ) );\r
+                                               inputHtml.push( ' ' );\r
+                                               new CKEDITOR.ui.dialog.uiElement( dialog, labelDefinition, inputHtml, 'label', null, { id : labelId, 'for' : inputAttributes.id },\r
+                                                          item[0] );\r
+                                               inputHtmlList.push( inputHtml.join( '' ) );\r
+                                       }\r
+                                       new CKEDITOR.ui.dialog.hbox( dialog, [], inputHtmlList, html );\r
+                                       return html.join( '' );\r
+                               };\r
+\r
+                               CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML );\r
+                               this._.children = children;\r
+                       },\r
+\r
+                       /**\r
+                        * A button with a label inside.\r
+                        * @constructor\r
+                        * @example\r
+                        * @extends CKEDITOR.ui.dialog.uiElement\r
+                        * @param {CKEDITOR.dialog} dialog\r
+                        * Parent dialog object.\r
+                        * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition\r
+                        * The element definition. Accepted fields:\r
+                        * <ul>\r
+                        *      <li><strong>label</strong> (Required) The button label.</li>\r
+                        *      <li><strong>disabled</strong> (Optional) Set to true if you want the\r
+                        *      button to appear in disabled state.</li>\r
+                        * </ul>\r
+                        * @param {Array} htmlList\r
+                        * List of HTML code to output to.\r
+                        */\r
+                       button : function( dialog, elementDefinition, htmlList )\r
+                       {\r
+                               if ( !arguments.length )\r
+                                       return;\r
+\r
+                               if ( typeof elementDefinition == 'function' )\r
+                                       elementDefinition = elementDefinition( dialog.getParentEditor() );\r
+\r
+                               initPrivateObject.call( this, elementDefinition, { disabled : elementDefinition.disabled || false } );\r
+\r
+                               // Add OnClick event to this input.\r
+                               CKEDITOR.event.implementOn( this );\r
+\r
+                               var me = this;\r
+\r
+                               // Register an event handler for processing button clicks.\r
+                               dialog.on( 'load', function( eventInfo )\r
+                                       {\r
+                                               var element = this.getElement();\r
+\r
+                                               (function()\r
+                                               {\r
+                                                       element.on( 'click', function( evt )\r
+                                                               {\r
+                                                                       me.fire( 'click', { dialog : me.getDialog() } );\r
+                                                                       evt.data.preventDefault();\r
+                                                               } );\r
+\r
+                                                       element.on( 'keydown', function( evt )\r
+                                                               {\r
+                                                                       if ( evt.data.getKeystroke() in { 32:1 } )\r
+                                                                       {\r
+                                                                               me.click();\r
+                                                                               evt.data.preventDefault();\r
+                                                                       }\r
+                                                               } );\r
+                                               })();\r
+\r
+                                               element.unselectable();\r
+                                       }, this );\r
+\r
+                               var outerDefinition = CKEDITOR.tools.extend( {}, elementDefinition );\r
+                               delete outerDefinition.style;\r
+\r
+                               var labelId = CKEDITOR.tools.getNextId() + '_label';\r
+                               CKEDITOR.ui.dialog.uiElement.call(\r
+                                       this,\r
+                                       dialog,\r
+                                       outerDefinition,\r
+                                       htmlList,\r
+                                       'a',\r
+                                       null,\r
+                                       {\r
+                                               style : elementDefinition.style,\r
+                                               href : 'javascript:void(0)',\r
+                                               title : elementDefinition.label,\r
+                                               hidefocus : 'true',\r
+                                               'class' : elementDefinition['class'],\r
+                                               role : 'button',\r
+                                               'aria-labelledby' : labelId\r
+                                       },\r
+                                       '<span id="' + labelId + '" class="cke_dialog_ui_button">' +\r
+                                               CKEDITOR.tools.htmlEncode( elementDefinition.label ) +\r
+                                       '</span>' );\r
+                       },\r
+\r
+                       /**\r
+                        * A select box.\r
+                        * @extends CKEDITOR.ui.dialog.uiElement\r
+                        * @example\r
+                        * @constructor\r
+                        * @param {CKEDITOR.dialog} dialog\r
+                        * Parent dialog object.\r
+                        * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition\r
+                        * The element definition. Accepted fields:\r
+                        * <ul>\r
+                        *      <li><strong>default</strong> (Required) The default value.</li>\r
+                        *      <li><strong>validate</strong> (Optional) The validation function.</li>\r
+                        *      <li><strong>items</strong> (Required) An array of options. Each option\r
+                        *      is a 1- or 2-item array of format [ 'Description', 'Value' ]. If 'Value'\r
+                        *      is missing, then the value would be assumed to be the same as the\r
+                        *      description.</li>\r
+                        *      <li><strong>multiple</strong> (Optional) Set this to true if you'd like\r
+                        *      to have a multiple-choice select box.</li>\r
+                        *      <li><strong>size</strong> (Optional) The number of items to display in\r
+                        *      the select box.</li>\r
+                        * </ul>\r
+                        * @param {Array} htmlList\r
+                        * List of HTML code to output to.\r
+                        */\r
+                       select : function( dialog, elementDefinition, htmlList )\r
+                       {\r
+                               if ( arguments.length < 3 )\r
+                                       return;\r
+\r
+                               var _ = initPrivateObject.call( this, elementDefinition );\r
+\r
+                               if ( elementDefinition.validate )\r
+                                       this.validate = elementDefinition.validate;\r
+\r
+                               _.inputId = CKEDITOR.tools.getNextId() + '_select';\r
+                               /** @ignore */\r
+                               var innerHTML = function()\r
+                               {\r
+                                       var myDefinition = CKEDITOR.tools.extend( {}, elementDefinition,\r
+                                                       {\r
+                                                               id : elementDefinition.id ? elementDefinition.id + '_select' : CKEDITOR.tools.getNextId() + '_select'\r
+                                                       }, true ),\r
+                                               html = [],\r
+                                               innerHTML = [],\r
+                                               attributes = { 'id' : _.inputId, 'class' : 'cke_dialog_ui_input_select', 'aria-labelledby' : this._.labelId };\r
+\r
+                                       // Add multiple and size attributes from element definition.\r
+                                       if ( elementDefinition.size != undefined )\r
+                                               attributes.size = elementDefinition.size;\r
+                                       if ( elementDefinition.multiple != undefined )\r
+                                               attributes.multiple = elementDefinition.multiple;\r
+\r
+                                       cleanInnerDefinition( myDefinition );\r
+                                       for ( var i = 0, item ; i < elementDefinition.items.length && ( item = elementDefinition.items[i] ) ; i++ )\r
+                                       {\r
+                                               innerHTML.push( '<option value="',\r
+                                                       CKEDITOR.tools.htmlEncode( item[1] !== undefined ? item[1] : item[0] ).replace( /"/g, '&quot;' ), '" /> ',\r
+                                                       CKEDITOR.tools.htmlEncode( item[0] ) );\r
+                                       }\r
+\r
+                                       if ( typeof myDefinition.inputStyle != 'undefined' )\r
+                                               myDefinition.style = myDefinition.inputStyle;\r
+\r
+                                       _.select = new CKEDITOR.ui.dialog.uiElement( dialog, myDefinition, html, 'select', null, attributes, innerHTML.join( '' ) );\r
+                                       return html.join( '' );\r
+                               };\r
+\r
+                               CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML );\r
+                       },\r
+\r
+                       /**\r
+                        * A file upload input.\r
+                        * @extends CKEDITOR.ui.dialog.labeledElement\r
+                        * @example\r
+                        * @constructor\r
+                        * @param {CKEDITOR.dialog} dialog\r
+                        * Parent dialog object.\r
+                        * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition\r
+                        * The element definition. Accepted fields:\r
+                        * <ul>\r
+                        *      <li><strong>validate</strong> (Optional) The validation function.</li>\r
+                        * </ul>\r
+                        * @param {Array} htmlList\r
+                        * List of HTML code to output to.\r
+                        */\r
+                       file : function( dialog, elementDefinition, htmlList )\r
+                       {\r
+                               if ( arguments.length < 3 )\r
+                                       return;\r
+\r
+                               if ( elementDefinition['default'] === undefined )\r
+                                       elementDefinition['default'] = '';\r
+\r
+                               var _ = CKEDITOR.tools.extend( initPrivateObject.call( this, elementDefinition ), { definition : elementDefinition, buttons : [] } );\r
+\r
+                               if ( elementDefinition.validate )\r
+                                       this.validate = elementDefinition.validate;\r
+\r
+                               /** @ignore */\r
+                               var innerHTML = function()\r
+                               {\r
+                                       _.frameId = CKEDITOR.tools.getNextId() + '_fileInput';\r
+\r
+                                       // Support for custom document.domain in IE.\r
+                                       var isCustomDomain = CKEDITOR.env.isCustomDomain();\r
+\r
+                                       var html = [\r
+                                               '<iframe' +\r
+                                                       ' frameborder="0"' +\r
+                                                       ' allowtransparency="0"' +\r
+                                                       ' class="cke_dialog_ui_input_file"' +\r
+                                                       ' id="', _.frameId, '"' +\r
+                                                       ' title="', elementDefinition.label, '"' +\r
+                                                       ' src="javascript:void(' ];\r
+\r
+                                       html.push(\r
+                                                       isCustomDomain ?\r
+                                                               '(function(){' +\r
+                                                                       'document.open();' +\r
+                                                                       'document.domain=\'' + document.domain + '\';' +\r
+                                                                       'document.close();' +\r
+                                                               '})()'\r
+                                                       :\r
+                                                               '0' );\r
+\r
+                                       html.push(\r
+                                                       ')">' +\r
+                                               '</iframe>' );\r
+\r
+                                       return html.join( '' );\r
+                               };\r
+\r
+                               // IE BUG: Parent container does not resize to contain the iframe automatically.\r
+                               dialog.on( 'load', function()\r
+                                       {\r
+                                               var iframe = CKEDITOR.document.getById( _.frameId ),\r
+                                                       contentDiv = iframe.getParent();\r
+                                               contentDiv.addClass( 'cke_dialog_ui_input_file' );\r
+                                       } );\r
+\r
+                               CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML );\r
+                       },\r
+\r
+                       /**\r
+                        * A button for submitting the file in a file upload input.\r
+                        * @extends CKEDITOR.ui.dialog.button\r
+                        * @example\r
+                        * @constructor\r
+                        * @param {CKEDITOR.dialog} dialog\r
+                        * Parent dialog object.\r
+                        * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition\r
+                        * The element definition. Accepted fields:\r
+                        * <ul>\r
+                        *      <li><strong>for</strong> (Required) The file input's page and element Id\r
+                        *      to associate to, in a 2-item array format: [ 'page_id', 'element_id' ].\r
+                        *      </li>\r
+                        *      <li><strong>validate</strong> (Optional) The validation function.</li>\r
+                        * </ul>\r
+                        * @param {Array} htmlList\r
+                        * List of HTML code to output to.\r
+                        */\r
+                       fileButton : function( dialog, elementDefinition, htmlList )\r
+                       {\r
+                               if ( arguments.length < 3 )\r
+                                       return;\r
+\r
+                               var _ = initPrivateObject.call( this, elementDefinition ),\r
+                                       me = this;\r
+\r
+                               if ( elementDefinition.validate )\r
+                                       this.validate = elementDefinition.validate;\r
+\r
+                               var myDefinition = CKEDITOR.tools.extend( {}, elementDefinition );\r
+                               var onClick = myDefinition.onClick;\r
+                               myDefinition.className = ( myDefinition.className ? myDefinition.className + ' ' : '' ) + 'cke_dialog_ui_button';\r
+                               myDefinition.onClick = function( evt )\r
+                               {\r
+                                       var target = elementDefinition[ 'for' ];                // [ pageId, elementId ]\r
+                                       if ( !onClick || onClick.call( this, evt ) !== false )\r
+                                       {\r
+                                               dialog.getContentElement( target[0], target[1] ).submit();\r
+                                               this.disable();\r
+                                       }\r
+                               };\r
+\r
+                               dialog.on( 'load', function()\r
+                                               {\r
+                                                       dialog.getContentElement( elementDefinition[ 'for' ][0], elementDefinition[ 'for' ][1] )._.buttons.push( me );\r
+                                               } );\r
+\r
+                               CKEDITOR.ui.dialog.button.call( this, dialog, myDefinition, htmlList );\r
+                       },\r
+\r
+                       html : (function()\r
+                       {\r
+                               var myHtmlRe = /^\s*<[\w:]+\s+([^>]*)?>/,\r
+                                       theirHtmlRe = /^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,\r
+                                       emptyTagRe = /\/$/;\r
+                               /**\r
+                                * A dialog element made from raw HTML code.\r
+                                * @extends CKEDITOR.ui.dialog.uiElement\r
+                                * @name CKEDITOR.ui.dialog.html\r
+                                * @param {CKEDITOR.dialog} dialog Parent dialog object.\r
+                                * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition Element definition.\r
+                                * Accepted fields:\r
+                                * <ul>\r
+                                *      <li><strong>html</strong> (Required) HTML code of this element.</li>\r
+                                * </ul>\r
+                                * @param {Array} htmlList List of HTML code to be added to the dialog's content area.\r
+                                * @example\r
+                                * @constructor\r
+                                */\r
+                               return function( dialog, elementDefinition, htmlList )\r
+                               {\r
+                                       if ( arguments.length < 3 )\r
+                                               return;\r
+\r
+                                       var myHtmlList = [],\r
+                                               myHtml,\r
+                                               theirHtml = elementDefinition.html,\r
+                                               myMatch, theirMatch;\r
+\r
+                                       // If the HTML input doesn't contain any tags at the beginning, add a <span> tag around it.\r
+                                       if ( theirHtml.charAt( 0 ) != '<' )\r
+                                               theirHtml = '<span>' + theirHtml + '</span>';\r
+\r
+                                       // Look for focus function in definition.\r
+                                       var focus = elementDefinition.focus;\r
+                                       if ( focus )\r
+                                       {\r
+                                               var oldFocus = this.focus;\r
+                                               this.focus = function()\r
+                                               {\r
+                                                       oldFocus.call( this );\r
+                                                       typeof focus == 'function' && focus.call( this );\r
+                                                       this.fire( 'focus' );\r
+                                               };\r
+                                               if ( elementDefinition.isFocusable )\r
+                                               {\r
+                                                       var oldIsFocusable = this.isFocusable;\r
+                                                       this.isFocusable = oldIsFocusable;\r
+                                               }\r
+                                               this.keyboardFocusable = true;\r
+                                       }\r
+\r
+                                       CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, myHtmlList, 'span', null, null, '' );\r
+\r
+                                       // Append the attributes created by the uiElement call to the real HTML.\r
+                                       myHtml = myHtmlList.join( '' );\r
+                                       myMatch = myHtml.match( myHtmlRe );\r
+                                       theirMatch = theirHtml.match( theirHtmlRe ) || [ '', '', '' ];\r
+\r
+                                       if ( emptyTagRe.test( theirMatch[1] ) )\r
+                                       {\r
+                                               theirMatch[1] = theirMatch[1].slice( 0, -1 );\r
+                                               theirMatch[2] = '/' + theirMatch[2];\r
+                                       }\r
+\r
+                                       htmlList.push( [ theirMatch[1], ' ', myMatch[1] || '', theirMatch[2] ].join( '' ) );\r
+                               };\r
+                       })(),\r
+\r
+                       /**\r
+                        * Form fieldset for grouping dialog UI elements.\r
+                        * @constructor\r
+                        * @extends CKEDITOR.ui.dialog.uiElement\r
+                        * @param {CKEDITOR.dialog} dialog Parent dialog object.\r
+                        * @param {Array} childObjList\r
+                        * Array of {@link CKEDITOR.ui.dialog.uiElement} objects inside this\r
+                        * container.\r
+                        * @param {Array} childHtmlList\r
+                        * Array of HTML code that correspond to the HTML output of all the\r
+                        * objects in childObjList.\r
+                        * @param {Array} htmlList\r
+                        * Array of HTML code that this element will output to.\r
+                        * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition\r
+                        * The element definition. Accepted fields:\r
+                        * <ul>\r
+                        *      <li><strong>label</strong> (Optional) The legend of the this fieldset.</li>\r
+                        *      <li><strong>children</strong> (Required) An array of dialog field definitions which will be grouped inside this fieldset. </li>\r
+                        * </ul>\r
+                        */\r
+                       fieldset : function( dialog, childObjList, childHtmlList, htmlList, elementDefinition )\r
+                       {\r
+                               var legendLabel = elementDefinition.label;\r
+                               /** @ignore */\r
+                               var innerHTML = function()\r
+                               {\r
+                                       var html = [];\r
+                                       legendLabel && html.push( '<legend>' + legendLabel + '</legend>' );\r
+                                       for ( var i = 0; i < childHtmlList.length; i++ )\r
+                                               html.push( childHtmlList[ i ] );\r
+                                       return html.join( '' );\r
+                               };\r
+\r
+                               this._ = { children : childObjList };\r
+                               CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, htmlList, 'fieldset', null, null, innerHTML );\r
+                       }\r
+\r
+               }, true );\r
+\r
+       CKEDITOR.ui.dialog.html.prototype = new CKEDITOR.ui.dialog.uiElement;\r
+\r
+       CKEDITOR.ui.dialog.labeledElement.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement,\r
+                       /** @lends CKEDITOR.ui.dialog.labeledElement.prototype */\r
+                       {\r
+                               /**\r
+                                * Sets the label text of the element.\r
+                                * @param {String} label The new label text.\r
+                                * @returns {CKEDITOR.ui.dialog.labeledElement} The current labeled element.\r
+                                * @example\r
+                                */\r
+                               setLabel : function( label )\r
+                               {\r
+                                       var node = CKEDITOR.document.getById( this._.labelId );\r
+                                       if ( node.getChildCount() < 1 )\r
+                                               ( new CKEDITOR.dom.text( label, CKEDITOR.document ) ).appendTo( node );\r
+                                       else\r
+                                               node.getChild( 0 ).$.nodeValue = label;\r
+                                       return this;\r
+                               },\r
+\r
+                               /**\r
+                                * Retrieves the current label text of the elment.\r
+                                * @returns {String} The current label text.\r
+                                * @example\r
+                                */\r
+                               getLabel : function()\r
+                               {\r
+                                       var node = CKEDITOR.document.getById( this._.labelId );\r
+                                       if ( !node || node.getChildCount() < 1 )\r
+                                               return '';\r
+                                       else\r
+                                               return node.getChild( 0 ).getText();\r
+                               },\r
+\r
+                               /**\r
+                                * Defines the onChange event for UI element definitions.\r
+                                * @field\r
+                                * @type Object\r
+                                * @example\r
+                                */\r
+                               eventProcessors : commonEventProcessors\r
+                       }, true );\r
+\r
+       CKEDITOR.ui.dialog.button.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement,\r
+                       /** @lends CKEDITOR.ui.dialog.button.prototype */\r
+                       {\r
+                               /**\r
+                                * Simulates a click to the button.\r
+                                * @example\r
+                                * @returns {Object} Return value of the 'click' event.\r
+                                */\r
+                               click : function()\r
+                               {\r
+                                       if ( !this._.disabled )\r
+                                               return this.fire( 'click', { dialog : this._.dialog } );\r
+                                       this.getElement().$.blur();\r
+                                       return false;\r
+                               },\r
+\r
+                               /**\r
+                                * Enables the button.\r
+                                * @example\r
+                                */\r
+                               enable : function()\r
+                               {\r
+                                       this._.disabled = false;\r
+                                       var element = this.getElement();\r
+                                       element && element.removeClass( 'cke_disabled' );\r
+                               },\r
+\r
+                               /**\r
+                                * Disables the button.\r
+                                * @example\r
+                                */\r
+                               disable : function()\r
+                               {\r
+                                       this._.disabled = true;\r
+                                       this.getElement().addClass( 'cke_disabled' );\r
+                               },\r
+\r
+                               isVisible : function()\r
+                               {\r
+                                       return this.getElement().getFirst().isVisible();\r
+                               },\r
+\r
+                               isEnabled : function()\r
+                               {\r
+                                       return !this._.disabled;\r
+                               },\r
+\r
+                               /**\r
+                                * Defines the onChange event and onClick for button element definitions.\r
+                                * @field\r
+                                * @type Object\r
+                                * @example\r
+                                */\r
+                               eventProcessors : CKEDITOR.tools.extend( {}, CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,\r
+                                       {\r
+                                               /** @ignore */\r
+                                               onClick : function( dialog, func )\r
+                                               {\r
+                                                       this.on( 'click', func );\r
+                                               }\r
+                                       }, true ),\r
+\r
+                               /**\r
+                                * Handler for the element's access key up event. Simulates a click to\r
+                                * the button.\r
+                                * @example\r
+                                */\r
+                               accessKeyUp : function()\r
+                               {\r
+                                       this.click();\r
+                               },\r
+\r
+                               /**\r
+                                * Handler for the element's access key down event. Simulates a mouse\r
+                                * down to the button.\r
+                                * @example\r
+                                */\r
+                               accessKeyDown : function()\r
+                               {\r
+                                       this.focus();\r
+                               },\r
+\r
+                               keyboardFocusable : true\r
+                       }, true );\r
+\r
+       CKEDITOR.ui.dialog.textInput.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.labeledElement,\r
+                       /** @lends CKEDITOR.ui.dialog.textInput.prototype */\r
+                       {\r
+                               /**\r
+                                * Gets the text input DOM element under this UI object.\r
+                                * @example\r
+                                * @returns {CKEDITOR.dom.element} The DOM element of the text input.\r
+                                */\r
+                               getInputElement : function()\r
+                               {\r
+                                       return CKEDITOR.document.getById( this._.inputId );\r
+                               },\r
+\r
+                               /**\r
+                                * Puts focus into the text input.\r
+                                * @example\r
+                                */\r
+                               focus : function()\r
+                               {\r
+                                       var me = this.selectParentTab();\r
+\r
+                                       // GECKO BUG: setTimeout() is needed to workaround invisible selections.\r
+                                       setTimeout( function()\r
+                                               {\r
+                                                       var element = me.getInputElement();\r
+                                                       element && element.$.focus();\r
+                                               }, 0 );\r
+                               },\r
+\r
+                               /**\r
+                                * Selects all the text in the text input.\r
+                                * @example\r
+                                */\r
+                               select : function()\r
+                               {\r
+                                       var me = this.selectParentTab();\r
+\r
+                                       // GECKO BUG: setTimeout() is needed to workaround invisible selections.\r
+                                       setTimeout( function()\r
+                                               {\r
+                                                       var e = me.getInputElement();\r
+                                                       if ( e )\r
+                                                       {\r
+                                                               e.$.focus();\r
+                                                               e.$.select();\r
+                                                       }\r
+                                               }, 0 );\r
+                               },\r
+\r
+                               /**\r
+                                * Handler for the text input's access key up event. Makes a select()\r
+                                * call to the text input.\r
+                                * @example\r
+                                */\r
+                               accessKeyUp : function()\r
+                               {\r
+                                       this.select();\r
+                               },\r
+\r
+                               /**\r
+                                * Sets the value of this text input object.\r
+                                * @param {Object} value The new value.\r
+                                * @returns {CKEDITOR.ui.dialog.textInput} The current UI element.\r
+                                * @example\r
+                                * uiElement.setValue( 'Blamo' );\r
+                                */\r
+                               setValue : function( value )\r
+                               {\r
+                                       !value && ( value = '' );\r
+                                       return CKEDITOR.ui.dialog.uiElement.prototype.setValue.apply( this, arguments );\r
+                               },\r
+\r
+                               keyboardFocusable : true\r
+                       }, commonPrototype, true );\r
+\r
+       CKEDITOR.ui.dialog.textarea.prototype = new CKEDITOR.ui.dialog.textInput();\r
+\r
+       CKEDITOR.ui.dialog.select.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.labeledElement,\r
+                       /** @lends CKEDITOR.ui.dialog.select.prototype */\r
+                       {\r
+                               /**\r
+                                * Gets the DOM element of the select box.\r
+                                * @returns {CKEDITOR.dom.element} The &lt;select&gt; element of this UI\r
+                                * element.\r
+                                * @example\r
+                                */\r
+                               getInputElement : function()\r
+                               {\r
+                                       return this._.select.getElement();\r
+                               },\r
+\r
+                               /**\r
+                                * Adds an option to the select box.\r
+                                * @param {String} label Option label.\r
+                                * @param {String} value (Optional) Option value, if not defined it'll be\r
+                                * assumed to be the same as the label.\r
+                                * @param {Number} index (Optional) Position of the option to be inserted\r
+                                * to. If not defined the new option will be inserted to the end of list.\r
+                                * @example\r
+                                * @returns {CKEDITOR.ui.dialog.select} The current select UI element.\r
+                                */\r
+                               add : function( label, value, index )\r
+                               {\r
+                                       var option = new CKEDITOR.dom.element( 'option', this.getDialog().getParentEditor().document ),\r
+                                               selectElement = this.getInputElement().$;\r
+                                       option.$.text = label;\r
+                                       option.$.value = ( value === undefined || value === null ) ? label : value;\r
+                                       if ( index === undefined || index === null )\r
+                                       {\r
+                                               if ( CKEDITOR.env.ie )\r
+                                                       selectElement.add( option.$ );\r
+                                               else\r
+                                                       selectElement.add( option.$, null );\r
+                                       }\r
+                                       else\r
+                                               selectElement.add( option.$, index );\r
+                                       return this;\r
+                               },\r
+\r
+                               /**\r
+                                * Removes an option from the selection list.\r
+                                * @param {Number} index Index of the option to be removed.\r
+                                * @example\r
+                                * @returns {CKEDITOR.ui.dialog.select} The current select UI element.\r
+                                */\r
+                               remove : function( index )\r
+                               {\r
+                                       var selectElement = this.getInputElement().$;\r
+                                       selectElement.remove( index );\r
+                                       return this;\r
+                               },\r
+\r
+                               /**\r
+                                * Clears all options out of the selection list.\r
+                                * @returns {CKEDITOR.ui.dialog.select} The current select UI element.\r
+                                */\r
+                               clear : function()\r
+                               {\r
+                                       var selectElement = this.getInputElement().$;\r
+                                       while ( selectElement.length > 0 )\r
+                                               selectElement.remove( 0 );\r
+                                       return this;\r
+                               },\r
+\r
+                               keyboardFocusable : true\r
+                       }, commonPrototype, true );\r
+\r
+       CKEDITOR.ui.dialog.checkbox.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement,\r
+                       /** @lends CKEDITOR.ui.dialog.checkbox.prototype */\r
+                       {\r
+                               /**\r
+                                * Gets the checkbox DOM element.\r
+                                * @example\r
+                                * @returns {CKEDITOR.dom.element} The DOM element of the checkbox.\r
+                                */\r
+                               getInputElement : function()\r
+                               {\r
+                                       return this._.checkbox.getElement();\r
+                               },\r
+\r
+                               /**\r
+                                * Sets the state of the checkbox.\r
+                                * @example\r
+                                * @param {Boolean} true to tick the checkbox, false to untick it.\r
+                                * @param {Boolean} noChangeEvent Internal commit, to supress 'change' event on this element.\r
+                                */\r
+                               setValue : function( checked, noChangeEvent )\r
+                               {\r
+                                       this.getInputElement().$.checked = checked;\r
+                                       !noChangeEvent && this.fire( 'change', { value : checked } );\r
+                               },\r
+\r
+                               /**\r
+                                * Gets the state of the checkbox.\r
+                                * @example\r
+                                * @returns {Boolean} true means the checkbox is ticked, false means it's not ticked.\r
+                                */\r
+                               getValue : function()\r
+                               {\r
+                                       return this.getInputElement().$.checked;\r
+                               },\r
+\r
+                               /**\r
+                                * Handler for the access key up event. Toggles the checkbox.\r
+                                * @example\r
+                                */\r
+                               accessKeyUp : function()\r
+                               {\r
+                                       this.setValue( !this.getValue() );\r
+                               },\r
+\r
+                               /**\r
+                                * Defines the onChange event for UI element definitions.\r
+                                * @field\r
+                                * @type Object\r
+                                * @example\r
+                                */\r
+                               eventProcessors :\r
+                               {\r
+                                       onChange : function( dialog, func )\r
+                                       {\r
+                                               if ( !CKEDITOR.env.ie )\r
+                                                       return commonEventProcessors.onChange.apply( this, arguments );\r
+                                               else\r
+                                               {\r
+                                                       dialog.on( 'load', function()\r
+                                                               {\r
+                                                                       var element = this._.checkbox.getElement();\r
+                                                                       element.on( 'propertychange', function( evt )\r
+                                                                               {\r
+                                                                                       evt = evt.data.$;\r
+                                                                                       if ( evt.propertyName == 'checked' )\r
+                                                                                               this.fire( 'change', { value : element.$.checked } );\r
+                                                                               }, this );\r
+                                                               }, this );\r
+                                                       this.on( 'change', func );\r
+                                               }\r
+                                               return null;\r
+                                       }\r
+                               },\r
+\r
+                               keyboardFocusable : true\r
+                       }, commonPrototype, true );\r
+\r
+       CKEDITOR.ui.dialog.radio.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement,\r
+                       /** @lends CKEDITOR.ui.dialog.radio.prototype */\r
+                       {\r
+                               /**\r
+                                * Checks one of the radio buttons in this button group.\r
+                                * @example\r
+                                * @param {String} value The value of the button to be chcked.\r
+                                * @param {Boolean} noChangeEvent Internal commit, to supress 'change' event on this element.\r
+                                */\r
+                               setValue : function( value, noChangeEvent )\r
+                               {\r
+                                       var children = this._.children,\r
+                                               item;\r
+                                       for ( var i = 0 ; ( i < children.length ) && ( item = children[i] ) ; i++ )\r
+                                               item.getElement().$.checked = ( item.getValue() == value );\r
+                                       !noChangeEvent && this.fire( 'change', { value : value } );\r
+                               },\r
+\r
+                               /**\r
+                                * Gets the value of the currently checked radio button.\r
+                                * @example\r
+                                * @returns {String} The currently checked button's value.\r
+                                */\r
+                               getValue : function()\r
+                               {\r
+                                       var children = this._.children;\r
+                                       for ( var i = 0 ; i < children.length ; i++ )\r
+                                       {\r
+                                               if ( children[i].getElement().$.checked )\r
+                                                       return children[i].getValue();\r
+                                       }\r
+                                       return null;\r
+                               },\r
+\r
+                               /**\r
+                                * Handler for the access key up event. Focuses the currently\r
+                                * selected radio button, or the first radio button if none is\r
+                                * selected.\r
+                                * @example\r
+                                */\r
+                               accessKeyUp : function()\r
+                               {\r
+                                       var children = this._.children, i;\r
+                                       for ( i = 0 ; i < children.length ; i++ )\r
+                                       {\r
+                                               if ( children[i].getElement().$.checked )\r
+                                               {\r
+                                                       children[i].getElement().focus();\r
+                                                       return;\r
+                                               }\r
+                                       }\r
+                                       children[0].getElement().focus();\r
+                               },\r
+\r
+                               /**\r
+                                * Defines the onChange event for UI element definitions.\r
+                                * @field\r
+                                * @type Object\r
+                                * @example\r
+                                */\r
+                               eventProcessors :\r
+                               {\r
+                                       onChange : function( dialog, func )\r
+                                       {\r
+                                               if ( !CKEDITOR.env.ie )\r
+                                                       return commonEventProcessors.onChange.apply( this, arguments );\r
+                                               else\r
+                                               {\r
+                                                       dialog.on( 'load', function()\r
+                                                               {\r
+                                                                       var children = this._.children, me = this;\r
+                                                                       for ( var i = 0 ; i < children.length ; i++ )\r
+                                                                       {\r
+                                                                               var element = children[i].getElement();\r
+                                                                               element.on( 'propertychange', function( evt )\r
+                                                                                       {\r
+                                                                                               evt = evt.data.$;\r
+                                                                                               if ( evt.propertyName == 'checked' && this.$.checked )\r
+                                                                                                       me.fire( 'change', { value : this.getAttribute( 'value' ) } );\r
+                                                                                       } );\r
+                                                                       }\r
+                                                               }, this );\r
+                                                       this.on( 'change', func );\r
+                                               }\r
+                                               return null;\r
+                                       }\r
+                               },\r
+\r
+                               keyboardFocusable : true\r
+                       }, commonPrototype, true );\r
+\r
+       CKEDITOR.ui.dialog.file.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.labeledElement,\r
+                       commonPrototype,\r
+                       /** @lends CKEDITOR.ui.dialog.file.prototype */\r
+                       {\r
+                               /**\r
+                                * Gets the &lt;input&gt; element of this file input.\r
+                                * @returns {CKEDITOR.dom.element} The file input element.\r
+                                * @example\r
+                                */\r
+                               getInputElement : function()\r
+                               {\r
+                                       var frameDocument = CKEDITOR.document.getById( this._.frameId ).getFrameDocument();\r
+                                       return frameDocument.$.forms.length > 0 ?\r
+                                               new CKEDITOR.dom.element( frameDocument.$.forms[0].elements[0] ) :\r
+                                               this.getElement();\r
+                               },\r
+\r
+                               /**\r
+                                * Uploads the file in the file input.\r
+                                * @returns {CKEDITOR.ui.dialog.file} This object.\r
+                                * @example\r
+                                */\r
+                               submit : function()\r
+                               {\r
+                                       this.getInputElement().getParent().$.submit();\r
+                                       return this;\r
+                               },\r
+\r
+                               /**\r
+                                * Get the action assigned to the form.\r
+                                * @returns {String} The value of the action.\r
+                                * @example\r
+                                */\r
+                               getAction : function()\r
+                               {\r
+                                       return this.getInputElement().getParent().$.action;\r
+                               },\r
+\r
+                               /**\r
+                                * The events must be applied on the inner input element, and\r
+                                * that must be done when the iframe & form has been loaded\r
+                                */\r
+                               registerEvents : function( definition )\r
+                               {\r
+                                       var regex = /^on([A-Z]\w+)/,\r
+                                               match;\r
+\r
+                                       var registerDomEvent = function( uiElement, dialog, eventName, func )\r
+                                       {\r
+                                               uiElement.on( 'formLoaded', function()\r
+                                               {\r
+                                                       uiElement.getInputElement().on( eventName, func, uiElement );\r
+                                               });\r
+                                       };\r
+\r
+                                       for ( var i in definition )\r
+                                       {\r
+                                               if ( !( match = i.match( regex ) ) )\r
+                                                       continue;\r
+\r
+                                               if ( this.eventProcessors[i] )\r
+                                                       this.eventProcessors[i].call( this, this._.dialog, definition[i] );\r
+                                               else\r
+                                                       registerDomEvent( this, this._.dialog, match[1].toLowerCase(), definition[i] );\r
+                                       }\r
+\r
+                                       return this;\r
+                               },\r
+\r
+                               /**\r
+                                * Redraws the file input and resets the file path in the file input.\r
+                                * The redraw logic is necessary because non-IE browsers tend to clear\r
+                                * the &lt;iframe&gt; containing the file input after closing the dialog.\r
+                                * @example\r
+                                */\r
+                               reset : function()\r
+                               {\r
+                                       var _ = this._,\r
+                                               frameElement = CKEDITOR.document.getById( _.frameId ),\r
+                                               frameDocument = frameElement.getFrameDocument(),\r
+                                               elementDefinition = _.definition,\r
+                                               buttons = _.buttons,\r
+                                               callNumber = this.formLoadedNumber,\r
+                                               unloadNumber = this.formUnloadNumber,\r
+                                               langDir = _.dialog._.editor.lang.dir,\r
+                                               langCode = _.dialog._.editor.langCode;\r
+\r
+                                       // The callback function for the iframe, but we must call tools.addFunction only once\r
+                                       // so we store the function number in this.formLoadedNumber\r
+                                       if ( !callNumber )\r
+                                       {\r
+                                               callNumber = this.formLoadedNumber = CKEDITOR.tools.addFunction(\r
+                                                       function()\r
+                                                       {\r
+                                                               // Now we can apply the events to the input type=file\r
+                                                               this.fire( 'formLoaded' ) ;\r
+                                                       }, this ) ;\r
+\r
+                                               // Remove listeners attached to the content of the iframe (the file input)\r
+                                               unloadNumber = this.formUnloadNumber = CKEDITOR.tools.addFunction(\r
+                                                       function()\r
+                                                       {\r
+                                                               this.getInputElement().clearCustomData();\r
+                                                       }, this ) ;\r
+\r
+                                               this.getDialog()._.editor.on( 'destroy', function()\r
+                                                               {\r
+                                                                       CKEDITOR.tools.removeFunction( callNumber );\r
+                                                                       CKEDITOR.tools.removeFunction( unloadNumber );\r
+                                                               } );\r
+                                       }\r
+\r
+                                       function generateFormField()\r
+                                       {\r
+                                               frameDocument.$.open();\r
+\r
+                                               // Support for custom document.domain in IE.\r
+                                               if ( CKEDITOR.env.isCustomDomain() )\r
+                                                       frameDocument.$.domain = document.domain;\r
+\r
+                                               var size = '';\r
+                                               if ( elementDefinition.size )\r
+                                                       size = elementDefinition.size - ( CKEDITOR.env.ie  ? 7 : 0 );   // "Browse" button is bigger in IE.\r
+\r
+                                               frameDocument.$.write( [ '<html dir="' + langDir + '" lang="' + langCode + '"><head><title></title></head><body style="margin: 0; overflow: hidden; background: transparent;">',\r
+                                                               '<form enctype="multipart/form-data" method="POST" dir="' + langDir + '" lang="' + langCode + '" action="',\r
+                                                               CKEDITOR.tools.htmlEncode( elementDefinition.action ),\r
+                                                               '">',\r
+                                                               '<input type="file" name="',\r
+                                                               CKEDITOR.tools.htmlEncode( elementDefinition.id || 'cke_upload' ),\r
+                                                               '" size="',\r
+                                                               CKEDITOR.tools.htmlEncode( size > 0 ? size : "" ),\r
+                                                               '" />',\r
+                                                               '</form>',\r
+                                                               '</body></html>',\r
+                                                               '<script>window.parent.CKEDITOR.tools.callFunction(' + callNumber + ');',\r
+                                                               'window.onbeforeunload = function() {window.parent.CKEDITOR.tools.callFunction(' + unloadNumber + ')}</script>' ].join( '' ) );\r
+\r
+                                               frameDocument.$.close();\r
+\r
+                                               for ( var i = 0 ; i < buttons.length ; i++ )\r
+                                                       buttons[i].enable();\r
+                                       }\r
+\r
+                                       // #3465: Wait for the browser to finish rendering the dialog first.\r
+                                       if ( CKEDITOR.env.gecko )\r
+                                               setTimeout( generateFormField, 500 );\r
+                                       else\r
+                                               generateFormField();\r
+                               },\r
+\r
+                               getValue : function()\r
+                               {\r
+                                       return this.getInputElement().$.value || '';\r
+                               },\r
+\r
+                               /***\r
+                                * The default value of input type="file" is an empty string, but during initialization\r
+                                * of this UI element, the iframe still isn't ready so it can't be read from that object\r
+                                * Setting it manually prevents later issues about the current value ("") being different\r
+                                * of the initial value (undefined as it asked for .value of a div)\r
+                                */\r
+                               setInitValue : function()\r
+                               {\r
+                                       this._.initValue = '';\r
+                               },\r
+\r
+                               /**\r
+                                * Defines the onChange event for UI element definitions.\r
+                                * @field\r
+                                * @type Object\r
+                                * @example\r
+                                */\r
+                               eventProcessors :\r
+                               {\r
+                                       onChange : function( dialog, func )\r
+                                       {\r
+                                               // If this method is called several times (I'm not sure about how this can happen but the default\r
+                                               // onChange processor includes this protection)\r
+                                               // In order to reapply to the new element, the property is deleted at the beggining of the registerEvents method\r
+                                               if ( !this._.domOnChangeRegistered )\r
+                                               {\r
+                                                       // By listening for the formLoaded event, this handler will get reapplied when a new\r
+                                                       // form is created\r
+                                                       this.on( 'formLoaded', function()\r
+                                                       {\r
+                                                               this.getInputElement().on( 'change', function(){ this.fire( 'change', { value : this.getValue() } ); }, this );\r
+                                                       }, this );\r
+                                                       this._.domOnChangeRegistered = true;\r
+                                               }\r
+\r
+                                               this.on( 'change', func );\r
+                                       }\r
+                               },\r
+\r
+                               keyboardFocusable : true\r
+                       }, true );\r
+\r
+       CKEDITOR.ui.dialog.fileButton.prototype = new CKEDITOR.ui.dialog.button;\r
+\r
+       CKEDITOR.ui.dialog.fieldset.prototype = CKEDITOR.tools.clone( CKEDITOR.ui.dialog.hbox.prototype );\r
+\r
+       CKEDITOR.dialog.addUIElement( 'text', textBuilder );\r
+       CKEDITOR.dialog.addUIElement( 'password', textBuilder );\r
+       CKEDITOR.dialog.addUIElement( 'textarea', commonBuilder );\r
+       CKEDITOR.dialog.addUIElement( 'checkbox', commonBuilder );\r
+       CKEDITOR.dialog.addUIElement( 'radio', commonBuilder );\r
+       CKEDITOR.dialog.addUIElement( 'button', commonBuilder );\r
+       CKEDITOR.dialog.addUIElement( 'select', commonBuilder );\r
+       CKEDITOR.dialog.addUIElement( 'file', commonBuilder );\r
+       CKEDITOR.dialog.addUIElement( 'fileButton', commonBuilder );\r
+       CKEDITOR.dialog.addUIElement( 'html', commonBuilder );\r
+       CKEDITOR.dialog.addUIElement( 'fieldset', containerBuilder );\r
+})();\r
+\r
+/**\r
+ * Fired when the value of the uiElement is changed\r
+ * @name CKEDITOR.ui.dialog.uiElement#change\r
+ * @event\r
+ */\r
+\r
+/**\r
+ * Fired when the inner frame created by the element is ready.\r
+ * Each time the button is used or the dialog is loaded a new\r
+ * form might be created.\r
+ * @name CKEDITOR.ui.dialog.fileButton#formLoaded\r
+ * @event\r
+ */\r