source: sandbox/2.3-MailArchiver/filemanager/tp/ckeditor/_source/plugins/dialogui/plugin.js @ 6779

Revision 6779, 41.1 KB checked in by rafaelraymundo, 12 years ago (diff)

Ticket #2946 - Liberado Expresso(branch 2.3) integrado ao MailArchiver?.

Line 
1/*
2Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
3For licensing, see LICENSE.html or http://ckeditor.com/license
4*/
5
6/** @fileoverview The "dialogui" plugin. */
7
8CKEDITOR.plugins.add( 'dialogui' );
9
10(function()
11{
12        var initPrivateObject = function( elementDefinition )
13        {
14                this._ || ( this._ = {} );
15                this._['default'] = this._.initValue = elementDefinition['default'] || '';
16                var args = [ this._ ];
17                for ( var i = 1 ; i < arguments.length ; i++ )
18                        args.push( arguments[i] );
19                args.push( true );
20                CKEDITOR.tools.extend.apply( CKEDITOR.tools, args );
21                return this._;
22        },
23        textBuilder =
24        {
25                build : function( dialog, elementDefinition, output )
26                {
27                        return new CKEDITOR.ui.dialog.textInput( dialog, elementDefinition, output );
28                }
29        },
30        commonBuilder =
31        {
32                build : function( dialog, elementDefinition, output )
33                {
34                        return new CKEDITOR.ui.dialog[elementDefinition.type]( dialog, elementDefinition, output );
35                }
36        },
37        commonPrototype =
38        {
39                isChanged : function()
40                {
41                        return this.getValue() != this.getInitValue();
42                },
43
44                reset : function()
45                {
46                        this.setValue( this.getInitValue() );
47                },
48
49                setInitValue : function()
50                {
51                        this._.initValue = this.getValue();
52                },
53
54                resetInitValue : function()
55                {
56                        this._.initValue = this._['default'];
57                },
58
59                getInitValue : function()
60                {
61                        return this._.initValue;
62                }
63        },
64        commonEventProcessors = CKEDITOR.tools.extend( {}, CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,
65                {
66                        onChange : function( dialog, func )
67                        {
68                                if ( !this._.domOnChangeRegistered )
69                                {
70                                        dialog.on( 'load', function()
71                                                {
72                                                        this.getInputElement().on( 'change', function(){ this.fire( 'change', { value : this.getValue() } ); }, this );
73                                                }, this );
74                                        this._.domOnChangeRegistered = true;
75                                }
76
77                                this.on( 'change', func );
78                        }
79                }, true ),
80        eventRegex = /^on([A-Z]\w+)/,
81        cleanInnerDefinition = function( def )
82        {
83                // An inner UI element should not have the parent's type, title or events.
84                for ( var i in def )
85                {
86                        if ( eventRegex.test( i ) || i == 'title' || i == 'type' )
87                                delete def[i];
88                }
89                return def;
90        };
91
92        CKEDITOR.tools.extend( CKEDITOR.ui.dialog,
93                /** @lends CKEDITOR.ui.dialog */
94                {
95                        /**
96                         * Base class for all dialog elements with a textual label on the left.
97                         * @constructor
98                         * @example
99                         * @extends CKEDITOR.ui.dialog.uiElement
100                         * @param {CKEDITOR.dialog} dialog
101                         * Parent dialog object.
102                         * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
103                         * The element definition. Accepted fields:
104                         * <ul>
105                         *      <li><strong>label</strong> (Required) The label string.</li>
106                         *      <li><strong>labelLayout</strong> (Optional) Put 'horizontal' here if the
107                         *      label element is to be layed out horizontally. Otherwise a vertical
108                         *      layout will be used.</li>
109                         *      <li><strong>widths</strong> (Optional) This applies only for horizontal
110                         *      layouts - an 2-element array of lengths to specify the widths of the
111                         *      label and the content element.</li>
112                         * </ul>
113                         * @param {Array} htmlList
114                         * List of HTML code to output to.
115                         * @param {Function} contentHtml
116                         * A function returning the HTML code string to be added inside the content
117                         * cell.
118                         */
119                        labeledElement : function( dialog, elementDefinition, htmlList, contentHtml )
120                        {
121                                if ( arguments.length < 4 )
122                                        return;
123
124                                var _ = initPrivateObject.call( this, elementDefinition );
125                                _.labelId = CKEDITOR.tools.getNextNumber() + '_label';
126                                var children = this._.children = [];
127                                /** @ignore */
128                                var innerHTML = function()
129                                {
130                                        var html = [];
131                                        if ( elementDefinition.labelLayout != 'horizontal' )
132                                                html.push( '<div class="cke_dialog_ui_labeled_label" id="',
133                                                                _.labelId,
134                                                                '" >',
135                                                                elementDefinition.label,
136                                                                '</div>',
137                                                                '<div class="cke_dialog_ui_labeled_content">',
138                                                                contentHtml( dialog, elementDefinition ),
139                                                                '</div>' );
140                                        else
141                                        {
142                                                var hboxDefinition = {
143                                                        type : 'hbox',
144                                                        widths : elementDefinition.widths,
145                                                        padding : 0,
146                                                        children :
147                                                        [
148                                                                {
149                                                                        type : 'html',
150                                                                        html : '<span class="cke_dialog_ui_labeled_label" ' +
151                                                                                'id="' + _.labelId + '">' +  CKEDITOR.tools.htmlEncode( elementDefinition.label ) +
152                                                                                '</span>'
153                                                                },
154                                                                {
155                                                                        type : 'html',
156                                                                        html : '<span class="cke_dialog_ui_labeled_content">' +
157                                                                                contentHtml( dialog, elementDefinition ) +
158                                                                                '</span>'
159                                                                }
160                                                        ]
161                                                };
162                                                CKEDITOR.dialog._.uiElementBuilders.hbox.build( dialog, hboxDefinition, html );
163                                        }
164                                        return html.join( '' );
165                                };
166                                CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, htmlList, 'div', null, null, innerHTML );
167                        },
168
169                        /**
170                         * A text input with a label. This UI element class represents both the
171                         * single-line text inputs and password inputs in dialog boxes.
172                         * @constructor
173                         * @example
174                         * @extends CKEDITOR.ui.dialog.labeledElement
175                         * @param {CKEDITOR.dialog} dialog
176                         * Parent dialog object.
177                         * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
178                         * The element definition. Accepted fields:
179                         * <ul>
180                         *      <li><strong>default</strong> (Optional) The default value.</li>
181                         *      <li><strong>validate</strong> (Optional) The validation function. </li>
182                         *      <li><strong>maxLength</strong> (Optional) The maximum length of text box
183                         *      contents.</li>
184                         *      <li><strong>size</strong> (Optional) The size of the text box. This is
185                         *      usually overridden by the size defined by the skin, however.</li>
186                         * </ul>
187                         * @param {Array} htmlList
188                         * List of HTML code to output to.
189                         */
190                        textInput : function( dialog, elementDefinition, htmlList )
191                        {
192                                if ( arguments.length < 3 )
193                                        return;
194
195                                initPrivateObject.call( this, elementDefinition );
196                                var domId = this._.inputId = CKEDITOR.tools.getNextNumber() + '_textInput',
197                                        attributes = { 'class' : 'cke_dialog_ui_input_' + elementDefinition.type, id : domId, type : 'text' },
198                                        i;
199
200                                // Set the validator, if any.
201                                if ( elementDefinition.validate )
202                                        this.validate = elementDefinition.validate;
203
204                                // Set the max length and size.
205                                if ( elementDefinition.maxLength )
206                                        attributes.maxlength = elementDefinition.maxLength;
207                                if ( elementDefinition.size )
208                                        attributes.size = elementDefinition.size;
209
210                                // If user presses Enter in a text box, it implies clicking OK for the dialog.
211                                var me = this, keyPressedOnMe = false;
212                                dialog.on( 'load', function()
213                                        {
214                                                me.getInputElement().on( 'keydown', function( evt )
215                                                        {
216                                                                if ( evt.data.getKeystroke() == 13 )
217                                                                        keyPressedOnMe = true;
218                                                        } );
219
220                                                // Lower the priority this 'keyup' since 'ok' will close the dialog.(#3749)
221                                                me.getInputElement().on( 'keyup', function( evt )
222                                                        {
223                                                                if ( evt.data.getKeystroke() == 13 && keyPressedOnMe )
224                                                                {
225                                                                        dialog.getButton( 'ok' ) && dialog.getButton( 'ok' ).click();
226                                                                        keyPressedOnMe = false;
227                                                                }
228                                                        }, null, null, 1000 );
229                                        } );
230
231                                /** @ignore */
232                                var innerHTML = function()
233                                {
234                                        // IE BUG: Text input fields in IE at 100% would exceed a <td> or inline
235                                        // container's width, so need to wrap it inside a <div>.
236                                        var html = [ '<div class="cke_dialog_ui_input_', elementDefinition.type, '"' ];
237
238                                        if ( elementDefinition.width )
239                                                html.push( 'style="width:'+ elementDefinition.width +'" ' );
240
241                                        html.push( '><input ' );
242                                        for ( var i in attributes )
243                                                html.push( i + '="' + attributes[i] + '" ' );
244                                        html.push( ' /></div>' );
245                                        return html.join( '' );
246                                };
247                                CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML );
248                        },
249
250                        /**
251                         * A text area with a label on the top or left.
252                         * @constructor
253                         * @extends CKEDITOR.ui.dialog.labeledElement
254                         * @example
255                         * @param {CKEDITOR.dialog} dialog
256                         * Parent dialog object.
257                         * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
258                         * The element definition. Accepted fields:
259                         * <ul>
260                         *      <li><strong>rows</strong> (Optional) The number of rows displayed.
261                         *      Defaults to 5 if not defined.</li>
262                         *      <li><strong>cols</strong> (Optional) The number of cols displayed.
263                         *      Defaults to 20 if not defined. Usually overridden by skins.</li>
264                         *      <li><strong>default</strong> (Optional) The default value.</li>
265                         *      <li><strong>validate</strong> (Optional) The validation function. </li>
266                         * </ul>
267                         * @param {Array} htmlList
268                         * List of HTML code to output to.
269                         */
270                        textarea : function( dialog, elementDefinition, htmlList )
271                        {
272                                if ( arguments.length < 3 )
273                                        return;
274
275                                initPrivateObject.call( this, elementDefinition );
276                                var me = this,
277                                        domId = this._.inputId = CKEDITOR.tools.getNextNumber() + '_textarea',
278                                        attributes = {};
279
280                                if ( elementDefinition.validate )
281                                        this.validate = elementDefinition.validate;
282
283                                // Generates the essential attributes for the textarea tag.
284                                attributes.rows = elementDefinition.rows || 5;
285                                attributes.cols = elementDefinition.cols || 20;
286
287                                /** @ignore */
288                                var innerHTML = function()
289                                {
290                                        var html = [ '<div class="cke_dialog_ui_input_textarea"><textarea class="cke_dialog_ui_input_textarea" id="', domId, '" ' ];
291                                        for ( var i in attributes )
292                                                html.push( i + '="' + CKEDITOR.tools.htmlEncode( attributes[i] ) + '" ' );
293                                        html.push( '>', CKEDITOR.tools.htmlEncode( me._['default'] ), '</textarea></div>' );
294                                        return html.join( '' );
295                                };
296                                CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML );
297                        },
298
299                        /**
300                         * A single checkbox with a label on the right.
301                         * @constructor
302                         * @extends CKEDITOR.ui.dialog.uiElement
303                         * @example
304                         * @param {CKEDITOR.dialog} dialog
305                         * Parent dialog object.
306                         * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
307                         * The element definition. Accepted fields:
308                         * <ul>
309                         *      <li><strong>checked</strong> (Optional) Whether the checkbox is checked
310                         *      on instantiation. Defaults to false.</li>
311                         *      <li><strong>validate</strong> (Optional) The validation function.</li>
312                         *      <li><strong>label</strong> (Optional) The checkbox label.</li>
313                         * </ul>
314                         * @param {Array} htmlList
315                         * List of HTML code to output to.
316                         */
317                        checkbox : function( dialog, elementDefinition, htmlList )
318                        {
319                                if ( arguments.length < 3 )
320                                        return;
321
322                                var _ = initPrivateObject.call( this, elementDefinition, { 'default' : !!elementDefinition[ 'default' ] } );
323
324                                if ( elementDefinition.validate )
325                                        this.validate = elementDefinition.validate;
326
327                                /** @ignore */
328                                var innerHTML = function()
329                                {
330                                        var myDefinition = CKEDITOR.tools.extend( {}, elementDefinition,
331                                                        {
332                                                                id : elementDefinition.id ? elementDefinition.id + '_checkbox' : CKEDITOR.tools.getNextNumber() + '_checkbox'
333                                                        }, true ),
334                                                html = [],
335                                                attributes = { 'class' : 'cke_dialog_ui_checkbox_input', type : 'checkbox' };
336                                        cleanInnerDefinition( myDefinition );
337                                        if ( elementDefinition[ 'default' ] )
338                                                attributes.checked = 'checked';
339                                        _.checkbox = new CKEDITOR.ui.dialog.uiElement( dialog, myDefinition, html, 'input', null, attributes );
340                                        html.push( ' <label for="', attributes.id, '">',
341                                                        CKEDITOR.tools.htmlEncode( elementDefinition.label ),
342                                                        '</label>' );
343                                        return html.join( '' );
344                                };
345
346                                CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, htmlList, 'span', null, null, innerHTML );
347                        },
348
349                        /**
350                         * A group of radio buttons.
351                         * @constructor
352                         * @example
353                         * @extends CKEDITOR.ui.dialog.labeledElement
354                         * @param {CKEDITOR.dialog} dialog
355                         * Parent dialog object.
356                         * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
357                         * The element definition. Accepted fields:
358                         * <ul>
359                         *      <li><strong>default</strong> (Required) The default value.</li>
360                         *      <li><strong>validate</strong> (Optional) The validation function.</li>
361                         *      <li><strong>items</strong> (Required) An array of options. Each option
362                         *      is a 1- or 2-item array of format [ 'Description', 'Value' ]. If 'Value'
363                         *      is missing, then the value would be assumed to be the same as the
364                         *      description.</li>
365                         * </ul>
366                         * @param {Array} htmlList
367                         * List of HTML code to output to.
368                         */
369                        radio : function( dialog, elementDefinition, htmlList )
370                        {
371                                if ( arguments.length < 3)
372                                        return;
373
374                                initPrivateObject.call( this, elementDefinition );
375                                if ( !this._['default'] )
376                                        this._['default'] = this._.initValue = elementDefinition.items[0][1];
377                                if ( elementDefinition.validate )
378                                        this.validate = elementDefinition.valdiate;
379                                var children = [], me = this;
380
381                                /** @ignore */
382                                var innerHTML = function()
383                                {
384                                        var inputHtmlList = [], html = [],
385                                                commonAttributes = { 'class' : 'cke_dialog_ui_radio_item' },
386                                                commonName = elementDefinition.id ? elementDefinition.id + '_radio' : CKEDITOR.tools.getNextNumber() + '_radio';
387                                        for ( var i = 0 ; i < elementDefinition.items.length ; i++ )
388                                        {
389                                                var item = elementDefinition.items[i],
390                                                        title = item[2] !== undefined ? item[2] : item[0],
391                                                        value = item[1] !== undefined ? item[1] : item[0],
392                                                        inputDefinition = CKEDITOR.tools.extend( {}, elementDefinition,
393                                                                        {
394                                                                                id : CKEDITOR.tools.getNextNumber() + '_radio_input',
395                                                                                title : null,
396                                                                                type : null
397                                                                        }, true ),
398                                                        labelDefinition = CKEDITOR.tools.extend( {}, inputDefinition,
399                                                                        {
400                                                                                id : null,
401                                                                                title : title
402                                                                        }, true ),
403                                                        inputAttributes =
404                                                        {
405                                                                type : 'radio',
406                                                                'class' : 'cke_dialog_ui_radio_input',
407                                                                name : commonName,
408                                                                value : value
409                                                        },
410                                                        inputHtml = [];
411                                                if ( me._['default'] == value )
412                                                        inputAttributes.checked = 'checked';
413                                                cleanInnerDefinition( inputDefinition );
414                                                cleanInnerDefinition( labelDefinition );
415                                                children.push( new CKEDITOR.ui.dialog.uiElement( dialog, inputDefinition, inputHtml, 'input', null, inputAttributes ) );
416                                                inputHtml.push( ' ' );
417                                                new CKEDITOR.ui.dialog.uiElement( dialog, labelDefinition, inputHtml, 'label', null, { 'for' : inputAttributes.id },
418                                                           item[0] );
419                                                inputHtmlList.push( inputHtml.join( '' ) );
420                                        }
421                                        new CKEDITOR.ui.dialog.hbox( dialog, [], inputHtmlList, html );
422                                        return html.join( '' );
423                                };
424
425                                CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML );
426                                this._.children = children;
427                        },
428
429                        /**
430                         * A button with a label inside.
431                         * @constructor
432                         * @example
433                         * @extends CKEDITOR.ui.dialog.uiElement
434                         * @param {CKEDITOR.dialog} dialog
435                         * Parent dialog object.
436                         * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
437                         * The element definition. Accepted fields:
438                         * <ul>
439                         *      <li><strong>label</strong> (Required) The button label.</li>
440                         *      <li><strong>disabled</strong> (Optional) Set to true if you want the
441                         *      button to appear in disabled state.</li>
442                         * </ul>
443                         * @param {Array} htmlList
444                         * List of HTML code to output to.
445                         */
446                        button : function( dialog, elementDefinition, htmlList )
447                        {
448                                if ( !arguments.length )
449                                        return;
450
451                                if ( typeof elementDefinition == 'function' )
452                                        elementDefinition = elementDefinition( dialog.getParentEditor() );
453
454                                initPrivateObject.call( this, elementDefinition, { disabled : elementDefinition.disabled || false } );
455
456                                // Add OnClick event to this input.
457                                CKEDITOR.event.implementOn( this );
458
459                                var me = this;
460
461                                // Register an event handler for processing button clicks.
462                                dialog.on( 'load', function( eventInfo )
463                                        {
464                                                var element = this.getElement();
465
466                                                (function()
467                                                {
468                                                        element.on( 'click', function( evt )
469                                                                {
470                                                                        me.fire( 'click', { dialog : me.getDialog() } );
471                                                                        evt.data.preventDefault();
472                                                                } );
473                                                })();
474
475                                                element.unselectable();
476                                        }, this );
477
478                                var outerDefinition = CKEDITOR.tools.extend( {}, elementDefinition );
479                                delete outerDefinition.style;
480
481                                CKEDITOR.ui.dialog.uiElement.call(
482                                        this,
483                                        dialog,
484                                        outerDefinition,
485                                        htmlList,
486                                        'a',
487                                        null,
488                                        {
489                                                style : elementDefinition.style,
490                                                href : 'javascript:void(0)',
491                                                title : elementDefinition.label,
492                                                hidefocus : 'true',
493                                                'class' : elementDefinition['class']
494                                        },
495                                        '<span class="cke_dialog_ui_button">' +
496                                                CKEDITOR.tools.htmlEncode( elementDefinition.label ) +
497                                        '</span>' );
498                        },
499
500                        /**
501                         * A select box.
502                         * @extends CKEDITOR.ui.dialog.uiElement
503                         * @example
504                         * @constructor
505                         * @param {CKEDITOR.dialog} dialog
506                         * Parent dialog object.
507                         * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
508                         * The element definition. Accepted fields:
509                         * <ul>
510                         *      <li><strong>default</strong> (Required) The default value.</li>
511                         *      <li><strong>validate</strong> (Optional) The validation function.</li>
512                         *      <li><strong>items</strong> (Required) An array of options. Each option
513                         *      is a 1- or 2-item array of format [ 'Description', 'Value' ]. If 'Value'
514                         *      is missing, then the value would be assumed to be the same as the
515                         *      description.</li>
516                         *      <li><strong>multiple</strong> (Optional) Set this to true if you'd like
517                         *      to have a multiple-choice select box.</li>
518                         *      <li><strong>size</strong> (Optional) The number of items to display in
519                         *      the select box.</li>
520                         * </ul>
521                         * @param {Array} htmlList
522                         * List of HTML code to output to.
523                         */
524                        select : function( dialog, elementDefinition, htmlList )
525                        {
526                                if ( arguments.length < 3 )
527                                        return;
528
529                                var _ = initPrivateObject.call( this, elementDefinition );
530
531                                if ( elementDefinition.validate )
532                                        this.validate = elementDefinition.validate;
533
534                                /** @ignore */
535                                var innerHTML = function()
536                                {
537                                        var myDefinition = CKEDITOR.tools.extend( {}, elementDefinition,
538                                                        {
539                                                                id : elementDefinition.id ? elementDefinition.id + '_select' : CKEDITOR.tools.getNextNumber() + '_select'
540                                                        }, true ),
541                                                html = [],
542                                                innerHTML = [],
543                                                attributes = { 'class' : 'cke_dialog_ui_input_select' };
544
545                                        // Add multiple and size attributes from element definition.
546                                        if ( elementDefinition.size != undefined )
547                                                attributes.size = elementDefinition.size;
548                                        if ( elementDefinition.multiple != undefined )
549                                                attributes.multiple = elementDefinition.multiple;
550
551                                        cleanInnerDefinition( myDefinition );
552                                        for ( var i = 0, item ; i < elementDefinition.items.length && ( item = elementDefinition.items[i] ) ; i++ )
553                                        {
554                                                innerHTML.push( '<option value="',
555                                                        CKEDITOR.tools.htmlEncode( item[1] !== undefined ? item[1] : item[0] ), '" /> ',
556                                                        CKEDITOR.tools.htmlEncode( item[0] ) );
557                                        }
558
559                                        _.select = new CKEDITOR.ui.dialog.uiElement( dialog, myDefinition, html, 'select', null, attributes, innerHTML.join( '' ) );
560                                        return html.join( '' );
561                                };
562
563                                CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML );
564                        },
565
566                        /**
567                         * A file upload input.
568                         * @extends CKEDITOR.ui.dialog.labeledElement
569                         * @example
570                         * @constructor
571                         * @param {CKEDITOR.dialog} dialog
572                         * Parent dialog object.
573                         * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
574                         * The element definition. Accepted fields:
575                         * <ul>
576                         *      <li><strong>validate</strong> (Optional) The validation function.</li>
577                         * </ul>
578                         * @param {Array} htmlList
579                         * List of HTML code to output to.
580                         */
581                        file : function( dialog, elementDefinition, htmlList )
582                        {
583                                if ( arguments.length < 3 )
584                                        return;
585
586                                if ( elementDefinition['default'] === undefined )
587                                        elementDefinition['default'] = '';
588
589                                var _ = CKEDITOR.tools.extend( initPrivateObject.call( this, elementDefinition ), { definition : elementDefinition, buttons : [] } );
590
591                                if ( elementDefinition.validate )
592                                        this.validate = elementDefinition.validate;
593
594                                /** @ignore */
595                                var innerHTML = function()
596                                {
597                                        _.frameId = CKEDITOR.tools.getNextNumber() + '_fileInput';
598
599                                        // Support for custom document.domain in IE.
600                                        var isCustomDomain = CKEDITOR.env.isCustomDomain();
601
602                                        var html = [
603                                                '<iframe' +
604                                                        ' frameborder="0"' +
605                                                        ' allowtransparency="0"' +
606                                                        ' class="cke_dialog_ui_input_file"' +
607                                                        ' id="', _.frameId, '"' +
608                                                        ' title="', elementDefinition.label, '"' +
609                                                        ' src="javascript:void(' ];
610
611                                        html.push(
612                                                        isCustomDomain ?
613                                                                '(function(){' +
614                                                                        'document.open();' +
615                                                                        'document.domain=\'' + document.domain + '\';' +
616                                                                        'document.close();' +
617                                                                '})()'
618                                                        :
619                                                                '0' );
620
621                                        html.push(
622                                                        ')">' +
623                                                '</iframe>' );
624
625                                        return html.join( '' );
626                                };
627
628                                // IE BUG: Parent container does not resize to contain the iframe automatically.
629                                dialog.on( 'load', function()
630                                        {
631                                                var iframe = CKEDITOR.document.getById( _.frameId ),
632                                                        contentDiv = iframe.getParent();
633                                                contentDiv.addClass( 'cke_dialog_ui_input_file' );
634                                        } );
635
636                                CKEDITOR.ui.dialog.labeledElement.call( this, dialog, elementDefinition, htmlList, innerHTML );
637                        },
638
639                        /**
640                         * A button for submitting the file in a file upload input.
641                         * @extends CKEDITOR.ui.dialog.button
642                         * @example
643                         * @constructor
644                         * @param {CKEDITOR.dialog} dialog
645                         * Parent dialog object.
646                         * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition
647                         * The element definition. Accepted fields:
648                         * <ul>
649                         *      <li><strong>for</strong> (Required) The file input's page and element Id
650                         *      to associate to, in a 2-item array format: [ 'page_id', 'element_id' ].
651                         *      </li>
652                         *      <li><strong>validate</strong> (Optional) The validation function.</li>
653                         * </ul>
654                         * @param {Array} htmlList
655                         * List of HTML code to output to.
656                         */
657                        fileButton : function( dialog, elementDefinition, htmlList )
658                        {
659                                if ( arguments.length < 3 )
660                                        return;
661
662                                var _ = initPrivateObject.call( this, elementDefinition ),
663                                        me = this;
664
665                                if ( elementDefinition.validate )
666                                        this.validate = elementDefinition.validate;
667
668                                var myDefinition = CKEDITOR.tools.extend( {}, elementDefinition );
669                                var onClick = myDefinition.onClick;
670                                myDefinition.className = ( myDefinition.className ? myDefinition.className + ' ' : '' ) + 'cke_dialog_ui_button';
671                                myDefinition.onClick = function( evt )
672                                {
673                                        var target = elementDefinition[ 'for' ];                // [ pageId, elementId ]
674                                        if ( !onClick || onClick.call( this, evt ) !== false )
675                                        {
676                                                dialog.getContentElement( target[0], target[1] ).submit();
677                                                this.disable();
678                                        }
679                                };
680
681                                dialog.on( 'load', function()
682                                                {
683                                                        dialog.getContentElement( elementDefinition[ 'for' ][0], elementDefinition[ 'for' ][1] )._.buttons.push( me );
684                                                } );
685
686                                CKEDITOR.ui.dialog.button.call( this, dialog, myDefinition, htmlList );
687                        },
688
689                        html : (function()
690                        {
691                                var myHtmlRe = /^\s*<[\w:]+\s+([^>]*)?>/,
692                                        theirHtmlRe = /^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,
693                                        emptyTagRe = /\/$/;
694                                /**
695                                 * A dialog element made from raw HTML code.
696                                 * @extends CKEDITOR.ui.dialog.uiElement
697                                 * @name CKEDITOR.ui.dialog.html
698                                 * @param {CKEDITOR.dialog} dialog Parent dialog object.
699                                 * @param {CKEDITOR.dialog.uiElementDefinition} elementDefinition Element definition.
700                                 * Accepted fields:
701                                 * <ul>
702                                 *      <li><strong>html</strong> (Required) HTML code of this element.</li>
703                                 * </ul>
704                                 * @param {Array} htmlList List of HTML code to be added to the dialog's content area.
705                                 * @example
706                                 * @constructor
707                                 */
708                                return function( dialog, elementDefinition, htmlList )
709                                {
710                                        if ( arguments.length < 3 )
711                                                return;
712
713                                        var myHtmlList = [],
714                                                myHtml,
715                                                theirHtml = elementDefinition.html,
716                                                myMatch, theirMatch;
717
718                                        // If the HTML input doesn't contain any tags at the beginning, add a <span> tag around it.
719                                        if ( theirHtml.charAt( 0 ) != '<' )
720                                                theirHtml = '<span>' + theirHtml + '</span>';
721
722                                        // Look for focus function in definition.
723                                        if ( elementDefinition.focus )
724                                        {
725                                                var oldFocus = this.focus;
726                                                this.focus = function()
727                                                {
728                                                        oldFocus.call( this );
729                                                        elementDefinition.focus.call( this );
730                                                        this.fire( 'focus' );
731                                                };
732                                                if ( elementDefinition.isFocusable )
733                                                {
734                                                        var oldIsFocusable = this.isFocusable;
735                                                        this.isFocusable = oldIsFocusable;
736                                                }
737                                                this.keyboardFocusable = true;
738                                        }
739
740                                        CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, myHtmlList, 'span', null, null, '' );
741
742                                        // Append the attributes created by the uiElement call to the real HTML.
743                                        myHtml = myHtmlList.join( '' );
744                                        myMatch = myHtml.match( myHtmlRe );
745                                        theirMatch = theirHtml.match( theirHtmlRe ) || [ '', '', '' ];
746
747                                        if ( emptyTagRe.test( theirMatch[1] ) )
748                                        {
749                                                theirMatch[1] = theirMatch[1].slice( 0, -1 );
750                                                theirMatch[2] = '/' + theirMatch[2];
751                                        }
752
753                                        htmlList.push( [ theirMatch[1], ' ', myMatch[1] || '', theirMatch[2] ].join( '' ) );
754                                };
755                        })()
756                }, true );
757
758        CKEDITOR.ui.dialog.html.prototype = new CKEDITOR.ui.dialog.uiElement;
759
760        CKEDITOR.ui.dialog.labeledElement.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement,
761                        /** @lends CKEDITOR.ui.dialog.labeledElement.prototype */
762                        {
763                                /**
764                                 * Sets the label text of the element.
765                                 * @param {String} label The new label text.
766                                 * @returns {CKEDITOR.ui.dialog.labeledElement} The current labeled element.
767                                 * @example
768                                 */
769                                setLabel : function( label )
770                                {
771                                        var node = CKEDITOR.document.getById( this._.labelId );
772                                        if ( node.getChildCount() < 1 )
773                                                ( new CKEDITOR.dom.text( label, CKEDITOR.document ) ).appendTo( node );
774                                        else
775                                                node.getChild( 0 ).$.nodeValue = label;
776                                        return this;
777                                },
778
779                                /**
780                                 * Retrieves the current label text of the elment.
781                                 * @returns {String} The current label text.
782                                 * @example
783                                 */
784                                getLabel : function()
785                                {
786                                        var node = CKEDITOR.document.getById( this._.labelId );
787                                        if ( !node || node.getChildCount() < 1 )
788                                                return '';
789                                        else
790                                                return node.getChild( 0 ).getText();
791                                },
792
793                                /**
794                                 * Defines the onChange event for UI element definitions.
795                                 * @field
796                                 * @type Object
797                                 * @example
798                                 */
799                                eventProcessors : commonEventProcessors
800                        }, true );
801
802        CKEDITOR.ui.dialog.button.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement,
803                        /** @lends CKEDITOR.ui.dialog.button.prototype */
804                        {
805                                /**
806                                 * Simulates a click to the button.
807                                 * @example
808                                 * @returns {Object} Return value of the 'click' event.
809                                 */
810                                click : function()
811                                {
812                                        if ( !this._.disabled )
813                                                return this.fire( 'click', { dialog : this._.dialog } );
814                                        this.getElement().$.blur();
815                                        return false;
816                                },
817
818                                /**
819                                 * Enables the button.
820                                 * @example
821                                 */
822                                enable : function()
823                                {
824                                        this._.disabled = false;
825                                        var element = this.getElement();
826                                        element && element.removeClass( 'disabled' );
827                                },
828
829                                /**
830                                 * Disables the button.
831                                 * @example
832                                 */
833                                disable : function()
834                                {
835                                        this._.disabled = true;
836                                        this.getElement().addClass( 'disabled' );
837                                },
838
839                                isVisible : function()
840                                {
841                                        return !!this.getElement().$.firstChild.offsetHeight;
842                                },
843
844                                isEnabled : function()
845                                {
846                                        return !this._.disabled;
847                                },
848
849                                /**
850                                 * Defines the onChange event and onClick for button element definitions.
851                                 * @field
852                                 * @type Object
853                                 * @example
854                                 */
855                                eventProcessors : CKEDITOR.tools.extend( {}, CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors,
856                                        {
857                                                /** @ignore */
858                                                onClick : function( dialog, func )
859                                                {
860                                                        this.on( 'click', func );
861                                                }
862                                        }, true ),
863
864                                /**
865                                 * Handler for the element's access key up event. Simulates a click to
866                                 * the button.
867                                 * @example
868                                 */
869                                accessKeyUp : function()
870                                {
871                                        this.click();
872                                },
873
874                                /**
875                                 * Handler for the element's access key down event. Simulates a mouse
876                                 * down to the button.
877                                 * @example
878                                 */
879                                accessKeyDown : function()
880                                {
881                                        this.focus();
882                                },
883
884                                keyboardFocusable : true
885                        }, true );
886
887        CKEDITOR.ui.dialog.textInput.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.labeledElement,
888                        /** @lends CKEDITOR.ui.dialog.textInput.prototype */
889                        {
890                                /**
891                                 * Gets the text input DOM element under this UI object.
892                                 * @example
893                                 * @returns {CKEDITOR.dom.element} The DOM element of the text input.
894                                 */
895                                getInputElement : function()
896                                {
897                                        return CKEDITOR.document.getById( this._.inputId );
898                                },
899
900                                /**
901                                 * Puts focus into the text input.
902                                 * @example
903                                 */
904                                focus : function()
905                                {
906                                        var me = this.selectParentTab();
907
908                                        // GECKO BUG: setTimeout() is needed to workaround invisible selections.
909                                        setTimeout( function()
910                                                {
911                                                        var element = me.getInputElement();
912                                                        element && element.$.focus();
913                                                }, 0 );
914                                },
915
916                                /**
917                                 * Selects all the text in the text input.
918                                 * @example
919                                 */
920                                select : function()
921                                {
922                                        var me = this.selectParentTab();
923
924                                        // GECKO BUG: setTimeout() is needed to workaround invisible selections.
925                                        setTimeout( function()
926                                                {
927                                                        var e = me.getInputElement();
928                                                        if ( e )
929                                                        {
930                                                                e.$.focus();
931                                                                e.$.select();
932                                                        }
933                                                }, 0 );
934                                },
935
936                                /**
937                                 * Handler for the text input's access key up event. Makes a select()
938                                 * call to the text input.
939                                 * @example
940                                 */
941                                accessKeyUp : function()
942                                {
943                                        this.select();
944                                },
945
946                                /**
947                                 * Sets the value of this text input object.
948                                 * @param {Object} value The new value.
949                                 * @returns {CKEDITOR.ui.dialog.textInput} The current UI element.
950                                 * @example
951                                 * uiElement.setValue( 'Blamo' );
952                                 */
953                                setValue : function( value )
954                                {
955                                        value = value || '';
956                                        return CKEDITOR.ui.dialog.uiElement.prototype.setValue.call( this, value );
957                                },
958
959                                keyboardFocusable : true
960                        }, commonPrototype, true );
961
962        CKEDITOR.ui.dialog.textarea.prototype = new CKEDITOR.ui.dialog.textInput();
963
964        CKEDITOR.ui.dialog.select.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.labeledElement,
965                        /** @lends CKEDITOR.ui.dialog.select.prototype */
966                        {
967                                /**
968                                 * Gets the DOM element of the select box.
969                                 * @returns {CKEDITOR.dom.element} The &lt;select&gt; element of this UI
970                                 * element.
971                                 * @example
972                                 */
973                                getInputElement : function()
974                                {
975                                        return this._.select.getElement();
976                                },
977
978                                /**
979                                 * Adds an option to the select box.
980                                 * @param {String} label Option label.
981                                 * @param {String} value (Optional) Option value, if not defined it'll be
982                                 * assumed to be the same as the label.
983                                 * @param {Number} index (Optional) Position of the option to be inserted
984                                 * to. If not defined the new option will be inserted to the end of list.
985                                 * @example
986                                 * @returns {CKEDITOR.ui.dialog.select} The current select UI element.
987                                 */
988                                add : function( label, value, index )
989                                {
990                                        var option = new CKEDITOR.dom.element( 'option', this.getDialog().getParentEditor().document ),
991                                                selectElement = this.getInputElement().$;
992                                        option.$.text = label;
993                                        option.$.value = ( value === undefined || value === null ) ? label : value;
994                                        if ( index === undefined || index === null )
995                                        {
996                                                if ( CKEDITOR.env.ie )
997                                                        selectElement.add( option.$ );
998                                                else
999                                                        selectElement.add( option.$, null );
1000                                        }
1001                                        else
1002                                                selectElement.add( option.$, index );
1003                                        return this;
1004                                },
1005
1006                                /**
1007                                 * Removes an option from the selection list.
1008                                 * @param {Number} index Index of the option to be removed.
1009                                 * @example
1010                                 * @returns {CKEDITOR.ui.dialog.select} The current select UI element.
1011                                 */
1012                                remove : function( index )
1013                                {
1014                                        var selectElement = this.getInputElement().$;
1015                                        selectElement.remove( index );
1016                                        return this;
1017                                },
1018
1019                                /**
1020                                 * Clears all options out of the selection list.
1021                                 * @returns {CKEDITOR.ui.dialog.select} The current select UI element.
1022                                 */
1023                                clear : function()
1024                                {
1025                                        var selectElement = this.getInputElement().$;
1026                                        while ( selectElement.length > 0 )
1027                                                selectElement.remove( 0 );
1028                                        return this;
1029                                },
1030
1031                                keyboardFocusable : true
1032                        }, commonPrototype, true );
1033
1034        CKEDITOR.ui.dialog.checkbox.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement,
1035                        /** @lends CKEDITOR.ui.dialog.checkbox.prototype */
1036                        {
1037                                /**
1038                                 * Gets the checkbox DOM element.
1039                                 * @example
1040                                 * @returns {CKEDITOR.dom.element} The DOM element of the checkbox.
1041                                 */
1042                                getInputElement : function()
1043                                {
1044                                        return this._.checkbox.getElement();
1045                                },
1046
1047                                /**
1048                                 * Sets the state of the checkbox.
1049                                 * @example
1050                                 * @param {Boolean} true to tick the checkbox, false to untick it.
1051                                 */
1052                                setValue : function( checked )
1053                                {
1054                                        this.getInputElement().$.checked = checked;
1055                                        this.fire( 'change', { value : checked } );
1056                                },
1057
1058                                /**
1059                                 * Gets the state of the checkbox.
1060                                 * @example
1061                                 * @returns {Boolean} true means the checkbox is ticked, false means it's not ticked.
1062                                 */
1063                                getValue : function()
1064                                {
1065                                        return this.getInputElement().$.checked;
1066                                },
1067
1068                                /**
1069                                 * Handler for the access key up event. Toggles the checkbox.
1070                                 * @example
1071                                 */
1072                                accessKeyUp : function()
1073                                {
1074                                        this.setValue( !this.getValue() );
1075                                },
1076
1077                                /**
1078                                 * Defines the onChange event for UI element definitions.
1079                                 * @field
1080                                 * @type Object
1081                                 * @example
1082                                 */
1083                                eventProcessors :
1084                                {
1085                                        onChange : function( dialog, func )
1086                                        {
1087                                                if ( !CKEDITOR.env.ie )
1088                                                        return commonEventProcessors.onChange.apply( this, arguments );
1089                                                else
1090                                                {
1091                                                        dialog.on( 'load', function()
1092                                                                {
1093                                                                        var element = this._.checkbox.getElement();
1094                                                                        element.on( 'propertychange', function( evt )
1095                                                                                {
1096                                                                                        evt = evt.data.$;
1097                                                                                        if ( evt.propertyName == 'checked' )
1098                                                                                                this.fire( 'change', { value : element.$.checked } );
1099                                                                                }, this );
1100                                                                }, this );
1101                                                        this.on( 'change', func );
1102                                                }
1103                                                return null;
1104                                        }
1105                                },
1106
1107                                keyboardFocusable : true
1108                        }, commonPrototype, true );
1109
1110        CKEDITOR.ui.dialog.radio.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.uiElement,
1111                        /** @lends CKEDITOR.ui.dialog.radio.prototype */
1112                        {
1113                                /**
1114                                 * Checks one of the radio buttons in this button group.
1115                                 * @example
1116                                 * @param {String} value The value of the button to be chcked.
1117                                 */
1118                                setValue : function( value )
1119                                {
1120                                        var children = this._.children,
1121                                                item;
1122                                        for ( var i = 0 ; ( i < children.length ) && ( item = children[i] ) ; i++ )
1123                                                item.getElement().$.checked = ( item.getValue() == value );
1124                                        this.fire( 'change', { value : value } );
1125                                },
1126
1127                                /**
1128                                 * Gets the value of the currently checked radio button.
1129                                 * @example
1130                                 * @returns {String} The currently checked button's value.
1131                                 */
1132                                getValue : function()
1133                                {
1134                                        var children = this._.children;
1135                                        for ( var i = 0 ; i < children.length ; i++ )
1136                                        {
1137                                                if ( children[i].getElement().$.checked )
1138                                                        return children[i].getValue();
1139                                        }
1140                                        return null;
1141                                },
1142
1143                                /**
1144                                 * Handler for the access key up event. Focuses the currently
1145                                 * selected radio button, or the first radio button if none is
1146                                 * selected.
1147                                 * @example
1148                                 */
1149                                accessKeyUp : function()
1150                                {
1151                                        var children = this._.children, i;
1152                                        for ( i = 0 ; i < children.length ; i++ )
1153                                        {
1154                                                if ( children[i].getElement().$.checked )
1155                                                {
1156                                                        children[i].getElement().focus();
1157                                                        return;
1158                                                }
1159                                        }
1160                                        children[0].getElement().focus();
1161                                },
1162
1163                                /**
1164                                 * Defines the onChange event for UI element definitions.
1165                                 * @field
1166                                 * @type Object
1167                                 * @example
1168                                 */
1169                                eventProcessors :
1170                                {
1171                                        onChange : function( dialog, func )
1172                                        {
1173                                                if ( !CKEDITOR.env.ie )
1174                                                        return commonEventProcessors.onChange.apply( this, arguments );
1175                                                else
1176                                                {
1177                                                        dialog.on( 'load', function()
1178                                                                {
1179                                                                        var children = this._.children, me = this;
1180                                                                        for ( var i = 0 ; i < children.length ; i++ )
1181                                                                        {
1182                                                                                var element = children[i].getElement();
1183                                                                                element.on( 'propertychange', function( evt )
1184                                                                                        {
1185                                                                                                evt = evt.data.$;
1186                                                                                                if ( evt.propertyName == 'checked' && this.$.checked )
1187                                                                                                        me.fire( 'change', { value : this.getAttribute( 'value' ) } );
1188                                                                                        } );
1189                                                                        }
1190                                                                }, this );
1191                                                        this.on( 'change', func );
1192                                                }
1193                                                return null;
1194                                        }
1195                                },
1196
1197                                keyboardFocusable : true
1198                        }, commonPrototype, true );
1199
1200        CKEDITOR.ui.dialog.file.prototype = CKEDITOR.tools.extend( new CKEDITOR.ui.dialog.labeledElement,
1201                        commonPrototype,
1202                        /** @lends CKEDITOR.ui.dialog.file.prototype */
1203                        {
1204                                /**
1205                                 * Gets the &lt;input&gt; element of this file input.
1206                                 * @returns {CKEDITOR.dom.element} The file input element.
1207                                 * @example
1208                                 */
1209                                getInputElement : function()
1210                                {
1211                                        var frameDocument = CKEDITOR.document.getById( this._.frameId ).getFrameDocument();
1212                                        return frameDocument.$.forms.length > 0 ?
1213                                                new CKEDITOR.dom.element( frameDocument.$.forms[0].elements[0] ) :
1214                                                this.getElement();
1215                                },
1216
1217                                /**
1218                                 * Uploads the file in the file input.
1219                                 * @returns {CKEDITOR.ui.dialog.file} This object.
1220                                 * @example
1221                                 */
1222                                submit : function()
1223                                {
1224                                        this.getInputElement().getParent().$.submit();
1225                                        return this;
1226                                },
1227
1228                                /**
1229                                 * Get the action assigned to the form.
1230                                 * @returns {String} The value of the action.
1231                                 * @example
1232                                 */
1233                                getAction : function( action )
1234                                {
1235                                        return this.getInputElement().getParent().$.action;
1236                                },
1237
1238                                /**
1239                                 * Redraws the file input and resets the file path in the file input.
1240                                 * The redraw logic is necessary because non-IE browsers tend to clear
1241                                 * the &lt;iframe&gt; containing the file input after closing the dialog.
1242                                 * @example
1243                                 */
1244                                reset : function()
1245                                {
1246                                        var frameElement = CKEDITOR.document.getById( this._.frameId ),
1247                                                frameDocument = frameElement.getFrameDocument(),
1248                                                elementDefinition = this._.definition,
1249                                                buttons = this._.buttons;
1250
1251                                        function generateFormField()
1252                                        {
1253                                                frameDocument.$.open();
1254
1255                                                // Support for custom document.domain in IE.
1256                                                if ( CKEDITOR.env.isCustomDomain() )
1257                                                        frameDocument.$.domain = document.domain;
1258
1259                                                var size = '';
1260                                                if ( elementDefinition.size )
1261                                                        size = elementDefinition.size - ( CKEDITOR.env.ie  ? 7 : 0 );   // "Browse" button is bigger in IE.
1262
1263                                                frameDocument.$.write( [ '<html><head><title></title></head><body style="margin: 0; overflow: hidden; background: transparent;">',
1264                                                                '<form enctype="multipart/form-data" method="POST" action="',
1265                                                                CKEDITOR.tools.htmlEncode( elementDefinition.action ),
1266                                                                '">',
1267                                                                '<input type="file" name="',
1268                                                                CKEDITOR.tools.htmlEncode( elementDefinition.id || 'cke_upload' ),
1269                                                                '" size="',
1270                                                                CKEDITOR.tools.htmlEncode( size > 0 ? size : "" ),
1271                                                                '" />',
1272                                                                '</form>',
1273                                                                '</body></html>' ].join( '' ) );
1274
1275                                                frameDocument.$.close();
1276
1277                                                for ( var i = 0 ; i < buttons.length ; i++ )
1278                                                        buttons[i].enable();
1279                                        }
1280
1281                                        // #3465: Wait for the browser to finish rendering the dialog first.
1282                                        if ( CKEDITOR.env.gecko )
1283                                                setTimeout( generateFormField, 500 );
1284                                        else
1285                                                generateFormField();
1286                                },
1287
1288                                getValue : function()
1289                                {
1290                                        // The file path returned from the input tag is incomplete anyway, so it's
1291                                        // safe to ignore it and prevent the confirmation dialog from appearing.
1292                                        // (Part of #3465)
1293                                        return '';
1294                                },
1295
1296                                /**
1297                                 * Defines the onChange event for UI element definitions.
1298                                 * @field
1299                                 * @type Object
1300                                 * @example
1301                                 */
1302                                eventProcessors : commonEventProcessors,
1303
1304                                keyboardFocusable : true
1305                        }, true );
1306
1307        CKEDITOR.ui.dialog.fileButton.prototype = new CKEDITOR.ui.dialog.button;
1308
1309        CKEDITOR.dialog.addUIElement( 'text', textBuilder );
1310        CKEDITOR.dialog.addUIElement( 'password', textBuilder );
1311        CKEDITOR.dialog.addUIElement( 'textarea', commonBuilder );
1312        CKEDITOR.dialog.addUIElement( 'checkbox', commonBuilder );
1313        CKEDITOR.dialog.addUIElement( 'radio', commonBuilder );
1314        CKEDITOR.dialog.addUIElement( 'button', commonBuilder );
1315        CKEDITOR.dialog.addUIElement( 'select', commonBuilder );
1316        CKEDITOR.dialog.addUIElement( 'file', commonBuilder );
1317        CKEDITOR.dialog.addUIElement( 'fileButton', commonBuilder );
1318        CKEDITOR.dialog.addUIElement( 'html', commonBuilder );
1319})();
Note: See TracBrowser for help on using the repository browser.