/** * @license Copyright (c) 2003-2014, CKSource - Frederico Knabben. All rights reserved. * For licensing, see LICENSE.md or http://ckeditor.com/license */ /** * @fileOverview The Dialog User Interface plugin. */ CKEDITOR.plugins.add( 'dialogui', { onLoad: function() { var initPrivateObject = function( elementDefinition ) { this._ || ( this._ = {} ); this._[ 'default' ] = this._.initValue = elementDefinition[ 'default' ] || ''; this._.required = elementDefinition[ 'required' ] || false; var args = [ this._ ]; for ( var i = 1; i < arguments.length; i++ ) args.push( arguments[ i ] ); args.push( true ); CKEDITOR.tools.extend.apply( CKEDITOR.tools, args ); return this._; }, textBuilder = { build: function( dialog, elementDefinition, output ) { return new CKEDITOR.ui.dialog.textInput( dialog, elementDefinition, output ); } }, commonBuilder = { build: function( dialog, elementDefinition, output ) { return new CKEDITOR.ui.dialog[ elementDefinition.type ]( dialog, elementDefinition, output ); } }, containerBuilder = { build: function( dialog, elementDefinition, output ) { var children = elementDefinition.children, child, childHtmlList = [], childObjList = []; for ( var i = 0; ( i < children.length && ( child = children[ i ] ) ); i++ ) { var childHtml = []; childHtmlList.push( childHtml ); childObjList.push( CKEDITOR.dialog._.uiElementBuilders[ child.type ].build( dialog, child, childHtml ) ); } return new CKEDITOR.ui.dialog[ elementDefinition.type ]( dialog, childObjList, childHtmlList, output, elementDefinition ); } }, commonPrototype = { isChanged: function() { return this.getValue() != this.getInitValue(); }, reset: function( noChangeEvent ) { this.setValue( this.getInitValue(), noChangeEvent ); }, setInitValue: function() { this._.initValue = this.getValue(); }, resetInitValue: function() { this._.initValue = this._[ 'default' ]; }, getInitValue: function() { return this._.initValue; } }, commonEventProcessors = CKEDITOR.tools.extend( {}, CKEDITOR.ui.dialog.uiElement.prototype.eventProcessors, { onChange: function( dialog, func ) { if ( !this._.domOnChangeRegistered ) { dialog.on( 'load', function() { this.getInputElement().on( 'change', function() { // Make sure 'onchange' doesn't get fired after dialog closed. (#5719) if ( !dialog.parts.dialog.isVisible() ) return; this.fire( 'change', { value: this.getValue() } ); }, this ); }, this ); this._.domOnChangeRegistered = true; } this.on( 'change', func ); } }, true ), eventRegex = /^on([A-Z]\w+)/, cleanInnerDefinition = function( def ) { // An inner UI element should not have the parent's type, title or events. for ( var i in def ) { if ( eventRegex.test( i ) || i == 'title' || i == 'type' ) delete def[ i ]; } return def; }; CKEDITOR.tools.extend( CKEDITOR.ui.dialog, { /** * Base class for all dialog window elements with a textual label on the left. * * @class CKEDITOR.ui.dialog.labeledElement * @extends CKEDITOR.ui.dialog.uiElement * @constructor Creates a labeledElement class instance. * @param {CKEDITOR.dialog} dialog Parent dialog window object. * @param {CKEDITOR.dialog.definition.uiElement} elementDefinition * The element definition. Accepted fields: * * * `label` (Required) The label string. * * `labelLayout` (Optional) Put 'horizontal' here if the * label element is to be laid out horizontally. Otherwise a vertical * layout will be used. * * `widths` (Optional) This applies only to horizontal * layouts — a two-element array of lengths to specify the widths of the * label and the content element. * * `role` (Optional) Value for the `role` attribute. * * `includeLabel` (Optional) If set to `true`, the `aria-labelledby` attribute * will be included. * * @param {Array} htmlList The list of HTML code to output to. * @param {Function} contentHtml * A function returning the HTML code string to be added inside the content * cell. */ labeledElement: function( dialog, elementDefinition, htmlList, contentHtml ) { if ( arguments.length < 4 ) return; var _ = initPrivateObject.call( this, elementDefinition ); _.labelId = CKEDITOR.tools.getNextId() + '_label'; var children = this._.children = []; var innerHTML = function() { var html = [], requiredClass = elementDefinition.required ? ' cke_required' : ''; if ( elementDefinition.labelLayout != 'horizontal' ) { html.push( '', '' ); } else { var hboxDefinition = { type: 'hbox', widths: elementDefinition.widths, padding: 0, children: [ { type: 'html', html: '