2 Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
3 For licensing, see LICENSE.html or http://ckeditor.com/license
7 * @fileOverview Defines the {@link CKEDITOR.resourceManager} class, which is
8 * the base for resource managers, like plugins and themes.
12 * Base class for resource managers, like plugins and themes. This class is not
13 * intended to be used out of the CKEditor core code.
14 * @param {String} basePath The path for the resources folder.
15 * @param {String} fileName The name used for resource files.
19 CKEDITOR.resourceManager = function( basePath, fileName )
22 * The base directory containing all resources.
23 * @name CKEDITOR.resourceManager.prototype.basePath
27 this.basePath = basePath;
30 * The name used for resource files.
31 * @name CKEDITOR.resourceManager.prototype.fileName
35 this.fileName = fileName;
38 * Contains references to all resources that have already been registered
40 * @name CKEDITOR.resourceManager.prototype.registered
47 * Contains references to all resources that have already been loaded
49 * @name CKEDITOR.resourceManager.prototype.loaded
56 * Contains references to all resources that have already been registered
57 * with {@link #addExternal}.
58 * @name CKEDITOR.resourceManager.prototype.externals
69 // List of callbacks waiting for plugins to be loaded.
74 CKEDITOR.resourceManager.prototype =
77 * Registers a resource.
78 * @param {String} name The resource name.
79 * @param {Object} [definition] The resource definition.
81 * CKEDITOR.plugins.add( 'sample', { ... plugin definition ... } );
82 * @see CKEDITOR.pluginDefinition
84 add : function( name, definition )
86 if ( this.registered[ name ] )
87 throw '[CKEDITOR.resourceManager.add] The resource name "' + name + '" is already registered.';
89 CKEDITOR.fire( name + CKEDITOR.tools.capitalize( this.fileName ) + 'Ready',
90 this.registered[ name ] = definition || {} );
94 * Gets the definition of a specific resource.
95 * @param {String} name The resource name.
98 * var definition = <b>CKEDITOR.plugins.get( 'sample' )</b>;
100 get : function( name )
102 return this.registered[ name ] || null;
106 * Get the folder path for a specific loaded resource.
107 * @param {String} name The resource name.
110 * alert( <b>CKEDITOR.plugins.getPath( 'sample' )</b> ); // "<editor path>/plugins/sample/"
112 getPath : function( name )
114 var external = this.externals[ name ];
115 return CKEDITOR.getUrl( ( external && external.dir ) || this.basePath + name + '/' );
119 * Get the file path for a specific loaded resource.
120 * @param {String} name The resource name.
123 * alert( <b>CKEDITOR.plugins.getFilePath( 'sample' )</b> ); // "<editor path>/plugins/sample/plugin.js"
125 getFilePath : function( name )
127 var external = this.externals[ name ];
128 return CKEDITOR.getUrl(
129 this.getPath( name ) +
130 ( ( external && ( typeof external.file == 'string' ) ) ? external.file : this.fileName + '.js' ) );
134 * Registers one or more resources to be loaded from an external path
135 * instead of the core base path.
136 * @param {String} names The resource names, separated by commas.
137 * @param {String} path The path of the folder containing the resource.
138 * @param {String} [fileName] The resource file name. If not provided, the
139 * default name is used; If provided with a empty string, will implicitly indicates that {@param path}
140 * is already the full path.
142 * // Loads a plugin from '/myplugin/samples/plugin.js'.
143 * CKEDITOR.plugins.addExternal( 'sample', '/myplugins/sample/' );
145 * // Loads a plugin from '/myplugin/samples/my_plugin.js'.
146 * CKEDITOR.plugins.addExternal( 'sample', '/myplugins/sample/', 'my_plugin.js' );
148 * // Loads a plugin from '/myplugin/samples/my_plugin.js'.
149 * CKEDITOR.plugins.addExternal( 'sample', '/myplugins/sample/my_plugin.js', '' );
151 addExternal : function( names, path, fileName )
153 names = names.split( ',' );
154 for ( var i = 0 ; i < names.length ; i++ )
156 var name = names[ i ];
158 this.externals[ name ] =
167 * Loads one or more resources.
168 * @param {String|Array} name The name of the resource to load. It may be a
169 * string with a single resource name, or an array with several names.
170 * @param {Function} callback A function to be called when all resources
171 * are loaded. The callback will receive an array containing all
173 * @param {Object} [scope] The scope object to be used for the callback
176 * <b>CKEDITOR.plugins.load</b>( 'myplugin', function( plugins )
178 * alert( plugins['myplugin'] ); // "object"
181 load : function( names, callback, scope )
183 // Ensure that we have an array of names.
184 if ( !CKEDITOR.tools.isArray( names ) )
185 names = names ? [ names ] : [];
187 var loaded = this.loaded,
188 registered = this.registered,
193 // Loop through all names.
194 for ( var i = 0 ; i < names.length ; i++ )
196 var name = names[ i ];
201 // If not available yet.
202 if ( !loaded[ name ] && !registered[ name ] )
204 var url = this.getFilePath( name );
206 if ( !( url in urlsNames ) )
207 urlsNames[ url ] = [];
208 urlsNames[ url ].push( name );
211 resources[ name ] = this.get( name );
214 CKEDITOR.scriptLoader.load( urls, function( completed, failed )
218 throw '[CKEDITOR.resourceManager.load] Resource name "' + urlsNames[ failed[ 0 ] ].join( ',' )
219 + '" was not found at "' + failed[ 0 ] + '".';
222 for ( var i = 0 ; i < completed.length ; i++ )
224 var nameList = urlsNames[ completed[ i ] ];
225 for ( var j = 0 ; j < nameList.length ; j++ )
227 var name = nameList[ j ];
228 resources[ name ] = this.get( name );
234 callback.call( scope, resources );