1 /* 2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved. 3 For licensing, see LICENSE.html or http://ckeditor.com/license 4 */ 5 6 /** 7 * @fileOverview Contains the second part of the {@link CKEDITOR} object 8 * definition, which defines the basic editor features to be available in 9 * the root ckeditor_basic.js file. 10 */ 11 12 if ( CKEDITOR.status == 'unloaded' ) 13 { 14 (function() 15 { 16 CKEDITOR.event.implementOn( CKEDITOR ); 17 18 /** 19 * Forces the full CKEditor core code, in the case only the basic code has been 20 * loaded (ckeditor_basic.js). This method self-destroys (becomes undefined) in 21 * the first call or as soon as the full code is available. 22 * @example 23 * // Check if the full core code has been loaded and load it. 24 * if ( CKEDITOR.loadFullCore ) 25 * <b>CKEDITOR.loadFullCore()</b>; 26 */ 27 CKEDITOR.loadFullCore = function() 28 { 29 // If not the basic code is not ready it, just mark it to be loaded. 30 if ( CKEDITOR.status != 'basic_ready' ) 31 { 32 CKEDITOR.loadFullCore._load = true; 33 return; 34 } 35 36 // Destroy this function. 37 delete CKEDITOR.loadFullCore; 38 39 // Append the script to the head. 40 var script = document.createElement( 'script' ); 41 script.type = 'text/javascript'; 42 script.src = CKEDITOR.basePath + 'ckeditor.js'; 44 45 document.getElementsByTagName( 'head' )[0].appendChild( script ); 46 }; 47 48 /** 49 * The time to wait (in seconds) to load the full editor code after the 50 * page load, if the "ckeditor_basic" file is used. If set to zero, the 51 * editor is loaded on demand, as soon as an instance is created. 52 * 53 * This value must be set on the page before the page load completion. 54 * @type Number 55 * @default 0 (zero) 56 * @example 57 * // Loads the full source after five seconds. 58 * CKEDITOR.loadFullCoreTimeout = 5; 59 */ 60 CKEDITOR.loadFullCoreTimeout = 0; 61 62 /** 63 * The class name used to identify <textarea> elements to be replace 64 * by CKEditor instances. 65 * @type String 66 * @default 'ckeditor' 67 * @example 68 * <b>CKEDITOR.replaceClass</b> = 'rich_editor'; 69 */ 70 CKEDITOR.replaceClass = 'ckeditor'; 71 72 /** 73 * Enables the replacement of all textareas with class name matching 74 * {@link CKEDITOR.replaceClass}. 75 * @type Boolean 76 * @default true 77 * @example 78 * // Disable the auto-replace feature. 79 * <b>CKEDITOR.replaceByClassEnabled</b> = false; 80 */ 81 CKEDITOR.replaceByClassEnabled = true; 82 83 var createInstance = function( elementOrIdOrName, config, creationFunction ) 84 { 85 if ( CKEDITOR.env.isCompatible ) 86 { 87 // Load the full core. 88 if ( CKEDITOR.loadFullCore ) 89 CKEDITOR.loadFullCore(); 90 91 var editor = creationFunction( elementOrIdOrName, config ); 92 CKEDITOR.add( editor ); 93 return editor; 94 } 95 96 return null; 97 }; 98 99 /** 100 * Replaces a <textarea> or a DOM element (DIV) with a CKEditor 101 * instance. For textareas, the initial value in the editor will be the 102 * textarea value. For DOM elements, their innerHTML will be used 103 * instead. We recommend using TEXTAREA and DIV elements only. 104 * @param {Object|String} elementOrIdOrName The DOM element (textarea), its 105 * ID or name. 106 * @param {Object} [config] The specific configurations to apply to this 107 * editor instance. Configurations set here will override global CKEditor 108 * settings. 109 * @returns {CKEDITOR.editor} The editor instance created. 110 * @example 111 * <textarea id="myfield" name="myfield"><:/textarea> 112 * ... 113 * <b>CKEDITOR.replace( 'myfield' )</b>; 114 * @example 115 * var textarea = document.body.appendChild( document.createElement( 'textarea' ) ); 116 * <b>CKEDITOR.replace( textarea )</b>; 117 */ 118 CKEDITOR.replace = function( elementOrIdOrName, config ) 119 { 120 return createInstance( elementOrIdOrName, config, CKEDITOR.editor.replace ); 121 }; 122 123 /** 124 * Creates a new editor instance inside a specific DOM element. 125 * @param {Object|String} elementOrId The DOM element or its ID. 126 * @param {Object} [config] The specific configurations to apply to this 127 * editor instance. Configurations set here will override global CKEditor 128 * settings. 129 * @returns {CKEDITOR.editor} The editor instance created. 130 * @example 131 * <div id="editorSpace"><:/div> 132 * ... 133 * <b>CKEDITOR.appendTo( 'editorSpace' )</b>; 134 */ 135 CKEDITOR.appendTo = function( elementOrId, config ) 136 { 137 return createInstance( elementOrId, config, CKEDITOR.editor.appendTo ); 138 }; 139 140 /** 141 * @ignore 142 * Documented at ckeditor.js. 143 */ 144 CKEDITOR.add = function( editor ) 145 { 146 // For now, just put the editor in the pending list. It will be 147 // processed as soon as the full code gets loaded. 148 var pending = this._.pending || ( this._.pending = [] ); 149 pending.push( editor ); 150 }; 151 152 /** 153 * Replace all <textarea> elements available in the document with 154 * editor instances. 155 * @example 156 * // Replace all <textarea> elements in the page. 157 * CKEDITOR.replaceAll(); 158 * @example 159 * // Replace all <textarea class="myClassName"> elements in the page. 160 * CKEDITOR.replaceAll( 'myClassName' ); 161 * @example 162 * // Selectively replace <textarea> elements, based on custom assertions. 163 * CKEDITOR.replaceAll( function( textarea, config ) 164 * { 165 * // Custom code to evaluate the replace, returning false 166 * // if it must not be done. 167 * // It also passes the "config" parameter, so the 168 * // developer can customize the instance. 169 * } ); 170 */ 171 CKEDITOR.replaceAll = function() 172 { 173 var textareas = document.getElementsByTagName( 'textarea' ); 174 175 for ( var i = 0 ; i < textareas.length ; i++ ) 176 { 177 var config = null; 178 var textarea = textareas[i]; 179 var name = textarea.name; 180 181 // The "name" and/or "id" attribute must exist. 182 if ( !textarea.name && !textarea.id ) 183 continue; 184 185 if ( typeof arguments[0] == 'string' ) 186 { 187 // The textarea class name could be passed as the function 188 // parameter. 189 190 var classRegex = new RegExp( '(?:^| )' + arguments[0] + '(?:$| )' ); 191 192 if ( !classRegex.test( textarea.className ) ) 193 continue; 194 } 195 else if ( typeof arguments[0] == 'function' ) 196 { 197 // An assertion function could be passed as the function parameter. 198 // It must explicitly return "false" to ignore a specific <textarea>. 199 config = {}; 200 if ( arguments[0]( textarea, config ) === false ) 201 continue; 202 } 203 204 this.replace( textarea, config ); 205 } 206 }; 207 208 (function() 209 { 210 var onload = function() 211 { 212 var loadFullCore = CKEDITOR.loadFullCore, 213 loadFullCoreTimeout = CKEDITOR.loadFullCoreTimeout; 214 215 // Replace all textareas with the default class name. 216 if ( CKEDITOR.replaceByClassEnabled ) 217 CKEDITOR.replaceAll( CKEDITOR.replaceClass ); 218 219 CKEDITOR.status = 'basic_ready'; 220 221 if ( loadFullCore && loadFullCore._load ) 222 loadFullCore(); 223 else if ( loadFullCoreTimeout ) 224 { 225 setTimeout( function() 226 { 227 if ( CKEDITOR.loadFullCore ) 228 CKEDITOR.loadFullCore(); 229 } 230 , loadFullCoreTimeout * 1000 ); 231 } 232 }; 233 234 if ( window.addEventListener ) 235 window.addEventListener( 'load', onload, false ); 236 else if ( window.attachEvent ) 237 window.attachEvent( 'onload', onload ); 238 })(); 239 240 CKEDITOR.status = 'basic_loaded'; 241 })(); 242 } 243