JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
22ff5fcdbbcb4d3b1fa6fec6ae8591d807ba3e66
[ckeditor.git] / _source / core / skins.js
1 /*\r
2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.\r
3 For licensing, see LICENSE.html or http://ckeditor.com/license\r
4 */\r
5 \r
6 /**\r
7  * @fileOverview Defines the {@link CKEDITOR.skins} object, which is used to\r
8  *              manage skins loading.\r
9  */\r
10 \r
11 /**\r
12  * Manages skins loading.\r
13  * @namespace\r
14  * @example\r
15  */\r
16 CKEDITOR.skins = (function()\r
17 {\r
18         // Holds the list of loaded skins.\r
19         var loaded = {};\r
20         var preloaded = {};\r
21         var paths = {};\r
22 \r
23         var loadedPart = function( skinName, part, callback )\r
24         {\r
25                 // Get the skin definition.\r
26                 var skinDefinition = loaded[ skinName ];\r
27 \r
28                 var appendSkinPath = function( fileNames )\r
29                 {\r
30                         for ( var n = 0 ; n < fileNames.length ; n++ )\r
31                         {\r
32                                 fileNames[ n ] = CKEDITOR.getUrl( paths[ skinName ] + fileNames[ n ] );\r
33                         }\r
34                 };\r
35 \r
36                 // Check if we need to preload images from it.\r
37                 if ( !preloaded[ skinName ] )\r
38                 {\r
39                         var preload = skinDefinition.preload;\r
40                         if ( preload && preload.length > 0 )\r
41                         {\r
42                                 appendSkinPath( preload );\r
43                                 CKEDITOR.imageCacher.load( preload, function()\r
44                                         {\r
45                                                 preloaded[ skinName ] = 1;\r
46                                                 loadedPart( skinName, part, callback );\r
47                                         } );\r
48                                 return;\r
49                         }\r
50 \r
51                         // Mark it as preloaded.\r
52                         preloaded[ skinName ] = 1;\r
53                 }\r
54 \r
55                 // Get the part definition.\r
56                 part = skinDefinition[ part ];\r
57                 var partIsLoaded = !part || !!part._isLoaded;\r
58 \r
59                 // Call the callback immediately if already loaded.\r
60                 if ( partIsLoaded )\r
61                         callback && callback();\r
62                 else\r
63                 {\r
64                         // Put the callback in a queue.\r
65                         var pending = part._pending || ( part._pending = [] );\r
66                         pending.push( callback );\r
67 \r
68                         // We may have more than one skin part load request. Just the first\r
69                         // one must do the loading job.\r
70                         if ( pending.length > 1 )\r
71                                 return;\r
72 \r
73                         // Check whether the "css" and "js" properties have been defined\r
74                         // for that part.\r
75                         var cssIsLoaded = !part.css || !part.css.length;\r
76                         var jsIsLoaded = !part.js || !part.js.length;\r
77 \r
78                         // This is the function that will trigger the callback calls on\r
79                         // load.\r
80                         var checkIsLoaded = function()\r
81                         {\r
82                                 if ( cssIsLoaded && jsIsLoaded )\r
83                                 {\r
84                                         // Mark the part as loaded.\r
85                                         part._isLoaded = 1;\r
86 \r
87                                         // Call all pending callbacks.\r
88                                         for ( var i = 0 ; i < pending.length ; i++ )\r
89                                         {\r
90                                                 if ( pending[ i ] )\r
91                                                         pending[ i ]();\r
92                                         }\r
93                                 }\r
94                         };\r
95 \r
96                         // Load the "css" pieces.\r
97                         if ( !cssIsLoaded )\r
98                         {\r
99                                 appendSkinPath( part.css );\r
100 \r
101                                 for ( var c = 0 ; c < part.css.length ; c++ )\r
102                                         CKEDITOR.document.appendStyleSheet( part.css[ c ] );\r
103 \r
104                                 cssIsLoaded = 1;\r
105                         }\r
106 \r
107                         // Load the "js" pieces.\r
108                         if ( !jsIsLoaded )\r
109                         {\r
110                                 appendSkinPath( part.js );\r
111                                 CKEDITOR.scriptLoader.load( part.js, function()\r
112                                         {\r
113                                                 jsIsLoaded = 1;\r
114                                                 checkIsLoaded();\r
115                                         });\r
116                         }\r
117 \r
118                         // We may have nothing to load, so check it immediately.\r
119                         checkIsLoaded();\r
120                 }\r
121         };\r
122 \r
123         return /** @lends CKEDITOR.skins */ {\r
124 \r
125                 /**\r
126                  * Registers a skin definition.\r
127                  * @param {String} skinName The skin name.\r
128                  * @param {Object} skinDefinition The skin definition.\r
129                  * @example\r
130                  */\r
131                 add : function( skinName, skinDefinition )\r
132                 {\r
133                         loaded[ skinName ] = skinDefinition;\r
134 \r
135                         skinDefinition.skinPath = paths[ skinName ]\r
136                                 || ( paths[ skinName ] =\r
137                                                 CKEDITOR.getUrl(\r
138                                                         '_source/' +    // @Packager.RemoveLine\r
139                                                         'skins/' + skinName + '/' ) );\r
140                 },\r
141 \r
142                 /**\r
143                  * Loads a skin part. Skins are defined in parts, which are basically\r
144                  * separated CSS files. This function is mainly used by the core code and\r
145                  * should not have much use out of it.\r
146                  * @param {String} skinName The name of the skin to be loaded.\r
147                  * @param {String} skinPart The skin part to be loaded. Common skin parts\r
148                  *              are "editor" and "dialog".\r
149                  * @param {Function} [callback] A function to be called once the skin\r
150                  *              part files are loaded.\r
151                  * @example\r
152                  */\r
153                 load : function( editor, skinPart, callback )\r
154                 {\r
155                         var skinName = editor.skinName,\r
156                                 skinPath = editor.skinPath;\r
157 \r
158                         if ( loaded[ skinName ] )\r
159                         {\r
160                                 loadedPart( skinName, skinPart, callback );\r
161 \r
162                                 // Get the skin definition.\r
163                                 var skinDefinition = loaded[ skinName ];\r
164 \r
165                                 // Trigger init function if any.\r
166                                 if ( skinDefinition.init )\r
167                                         skinDefinition.init( editor );\r
168                         }\r
169                         else\r
170                         {\r
171                                 paths[ skinName ] = skinPath;\r
172                                 CKEDITOR.scriptLoader.load( skinPath + 'skin.js', function()\r
173                                                 {\r
174                                                         loadedPart( skinName, skinPart, callback );\r
175 \r
176                                                         // Get the skin definition.\r
177                                                         var skinDefinition = loaded[ skinName ];\r
178 \r
179                                                         // Trigger init function if any.\r
180                                                         if ( skinDefinition.init )\r
181                                                                 skinDefinition.init( editor );\r
182                                                 });\r
183                         }\r
184                 }\r
185         };\r
186 })();\r