      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