JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.4.2
[ckeditor.git] / _source / core / skins.js
index 2de7456..2246f6d 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
-Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.\r
+Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.\r
 For licensing, see LICENSE.html or http://ckeditor.com/license\r
 */\r
 \r
@@ -16,15 +16,24 @@ For licensing, see LICENSE.html or http://ckeditor.com/license
 CKEDITOR.skins = (function()\r
 {\r
        // Holds the list of loaded skins.\r
-       var loaded = {};\r
-       var preloaded = {};\r
-       var paths = {};\r
+       var loaded = {},\r
+               preloaded = {},\r
+               paths = {};\r
 \r
-       var loadedPart = function( skinName, part, callback )\r
+       var loadPart = function( editor, skinName, part, callback )\r
        {\r
                // Get the skin definition.\r
                var skinDefinition = loaded[ skinName ];\r
 \r
+               if ( !editor.skin )\r
+               {\r
+                       editor.skin = skinDefinition;\r
+\r
+                       // Trigger init function if any.\r
+                       if ( skinDefinition.init )\r
+                               skinDefinition.init( editor );\r
+               }\r
+\r
                var appendSkinPath = function( fileNames )\r
                {\r
                        for ( var n = 0 ; n < fileNames.length ; n++ )\r
@@ -33,23 +42,43 @@ CKEDITOR.skins = (function()
                        }\r
                };\r
 \r
+               function fixCSSTextRelativePath( cssStyleText, baseUrl )\r
+               {\r
+                       return cssStyleText.replace( /url\s*\(([\s'"]*)(.*?)([\s"']*)\)/g,\r
+                                       function( match, opener, path, closer )\r
+                                       {\r
+                                               if ( /^\/|^\w?:/.test( path ) )\r
+                                                       return match;\r
+                                               else\r
+                                                       return 'url(' + baseUrl + opener +  path + closer + ')';\r
+                                       } );\r
+               }\r
+\r
                // Check if we need to preload images from it.\r
-               if ( !preloaded[ skinName ] )\r
+               var preload = skinDefinition.preload;\r
+               if ( preload && preload.length > 0 )\r
                {\r
-                       var preload = skinDefinition.preload;\r
-                       if ( preload && preload.length > 0 )\r
+                       if ( !preloaded[ skinName ] )\r
                        {\r
+                               // Prepare image URLs\r
                                appendSkinPath( preload );\r
-                               CKEDITOR.imageCacher.load( preload, function()\r
+\r
+                               // Get preloader event dispatcher object.\r
+                               preloaded[ skinName ] = CKEDITOR.imageCacher.load( preload );\r
+                       }\r
+\r
+                       if ( !preloaded[ skinName ].finished )\r
+                       {\r
+                               // Bind listener for this editor instance.\r
+                               preloaded[ skinName ].on( 'loaded', function()\r
                                        {\r
-                                               preloaded[ skinName ] = 1;\r
-                                               loadedPart( skinName, part, callback );\r
-                                       } );\r
+                                               loadPart( editor, skinName, part, callback );\r
+                                       }\r
+                               );\r
+\r
+                               // Execution will be continued from event listener.\r
                                return;\r
                        }\r
-\r
-                       // Mark it as preloaded.\r
-                       preloaded[ skinName ] = 1;\r
                }\r
 \r
                // Get the part definition.\r
@@ -72,8 +101,8 @@ CKEDITOR.skins = (function()
 \r
                        // Check whether the "css" and "js" properties have been defined\r
                        // for that part.\r
-                       var cssIsLoaded = !part.css || !part.css.length;\r
-                       var jsIsLoaded = !part.js || !part.js.length;\r
+                       var cssIsLoaded = !part.css || !part.css.length,\r
+                               jsIsLoaded = !part.js || !part.js.length;\r
 \r
                        // This is the function that will trigger the callback calls on\r
                        // load.\r
@@ -96,10 +125,23 @@ CKEDITOR.skins = (function()
                        // Load the "css" pieces.\r
                        if ( !cssIsLoaded )\r
                        {\r
-                               appendSkinPath( part.css );\r
+                               var cssPart = part.css;\r
+\r
+                               if ( CKEDITOR.tools.isArray( cssPart ) )\r
+                               {\r
+                                       appendSkinPath( cssPart );\r
+                                       for ( var c = 0 ; c < cssPart.length ; c++ )\r
+                                               CKEDITOR.document.appendStyleSheet( cssPart[ c ] );\r
+                               }\r
+                               else\r
+                               {\r
+                                       cssPart = fixCSSTextRelativePath(\r
+                                                               cssPart, CKEDITOR.getUrl( paths[ skinName ] ) );\r
+                                       // Processing Inline CSS part.\r
+                                       CKEDITOR.document.appendStyleText( cssPart );\r
+                               }\r
 \r
-                               for ( var c = 0 ; c < part.css.length ; c++ )\r
-                                       CKEDITOR.document.appendStyleSheet( part.css[ c ] );\r
+                               part.css = cssPart;\r
 \r
                                cssIsLoaded = 1;\r
                        }\r
@@ -135,6 +177,7 @@ CKEDITOR.skins = (function()
                        skinDefinition.skinPath = paths[ skinName ]\r
                                || ( paths[ skinName ] =\r
                                                CKEDITOR.getUrl(\r
+                                                       '_source/' +    // @Packager.RemoveLine\r
                                                        'skins/' + skinName + '/' ) );\r
                },\r
 \r
@@ -155,29 +198,13 @@ CKEDITOR.skins = (function()
                                skinPath = editor.skinPath;\r
 \r
                        if ( loaded[ skinName ] )\r
-                       {\r
-                               loadedPart( skinName, skinPart, callback );\r
-\r
-                               // Get the skin definition.\r
-                               var skinDefinition = loaded[ skinName ];\r
-\r
-                               // Trigger init function if any.\r
-                               if ( skinDefinition.init )\r
-                                       skinDefinition.init( editor );\r
-                       }\r
+                               loadPart( editor, skinName, skinPart, callback );\r
                        else\r
                        {\r
                                paths[ skinName ] = skinPath;\r
-                               CKEDITOR.scriptLoader.load( skinPath + 'skin.js', function()\r
+                               CKEDITOR.scriptLoader.load( CKEDITOR.getUrl( skinPath + 'skin.js' ), function()\r
                                                {\r
-                                                       loadedPart( skinName, skinPart, callback );\r
-\r
-                                                       // Get the skin definition.\r
-                                                       var skinDefinition = loaded[ skinName ];\r
-\r
-                                                       // Trigger init function if any.\r
-                                                       if ( skinDefinition.init )\r
-                                                               skinDefinition.init( editor );\r
+                                                        loadPart( editor, skinName, skinPart, callback );\r
                                                });\r
                        }\r
                }\r