1 /* 2 Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. 3 For licensing, see LICENSE.html or http://ckeditor.com/license 4 */ 5 6 if ( !CKEDITOR.editor ) 7 { 8 /** 9 * No element is linked to the editor instance. 10 * @constant 11 * @example 12 */ 13 CKEDITOR.ELEMENT_MODE_NONE = 0; 14 15 /** 16 * The element is to be replaced by the editor instance. 17 * @constant 18 * @example 19 */ 20 CKEDITOR.ELEMENT_MODE_REPLACE = 1; 21 22 /** 23 * The editor is to be created inside the element. 24 * @constant 25 * @example 26 */ 27 CKEDITOR.ELEMENT_MODE_APPENDTO = 2; 28 29 /** 30 * Creates an editor class instance. This constructor should be rarely 31 * used, in favor of the {@link CKEDITOR} editor creation functions. 32 * @ class Represents an editor instance. 33 * @param {Object} instanceConfig Configuration values for this specific 34 * instance. 35 * @param {CKEDITOR.dom.element} [element] The element linked to this 36 * instance. 37 * @param {Number} [mode] The mode in which the element is linked to this 38 * instance. See {@link #elementMode}. 39 * @param {String} [data] Since 3.3. Initial value for the instance. 40 * @augments CKEDITOR.event 41 * @example 42 */ 43 CKEDITOR.editor = function( instanceConfig, element, mode, data ) 44 { 45 this._ = 46 { 47 // Save the config to be processed later by the full core code. 48 instanceConfig : instanceConfig, 49 element : element, 50 data : data 51 }; 52 53 /** 54 * The mode in which the {@link #element} is linked to this editor 55 * instance. It can be any of the following values: 56 * <ul> 57 * <li>{@link CKEDITOR.ELEMENT_MODE_NONE}: No element is linked to the 58 * editor instance.</li> 59 * <li>{@link CKEDITOR.ELEMENT_MODE_REPLACE}: The element is to be 60 * replaced by the editor instance.</li> 61 * <li>{@link CKEDITOR.ELEMENT_MODE_APPENDTO}: The editor is to be 62 * created inside the element.</li> 63 * </ul> 64 * @name CKEDITOR.editor.prototype.elementMode 65 * @type Number 66 * @example 67 * var editor = CKEDITOR.replace( 'editor1' ); 68 * alert( <b>editor.elementMode</b> ); "1" 69 */ 70 this.elementMode = mode || CKEDITOR.ELEMENT_MODE_NONE; 71 72 // Call the CKEDITOR.event constructor to initialize this instance. 73 CKEDITOR.event.call( this ); 74 75 this._init(); 76 }; 77 78 /** 79 * Replaces a <textarea> or a DOM element (DIV) with a CKEditor 80 * instance. For textareas, the initial value in the editor will be the 81 * textarea value. For DOM elements, their innerHTML will be used 82 * instead. We recommend using TEXTAREA and DIV elements only. Do not use 83 * this function directly. Use {@link CKEDITOR.replace} instead. 84 * @param {Object|String} elementOrIdOrName The DOM element (textarea), its 85 * ID or name. 86 * @param {Object} [config] The specific configurations to apply to this 87 * editor instance. Configurations set here will override global CKEditor 88 * settings. 89 * @returns {CKEDITOR.editor} The editor instance created. 90 * @example 91 */ 92 CKEDITOR.editor.replace = function( elementOrIdOrName, config ) 93 { 94 var element = elementOrIdOrName; 95 96 if ( typeof element != 'object' ) 97 { 98 // Look for the element by id. We accept any kind of element here. 99 element = document.getElementById( elementOrIdOrName ); 100 101 // Elements that should go into head are unacceptable (#6791). 102 if ( element && element.tagName.toLowerCase() in {style:1,script:1,base:1,link:1,meta:1,title:1} ) 103 element = null; 104 105 // If not found, look for elements by name. In this case we accept only 106 // textareas. 107 if ( !element ) 108 { 109 var i = 0, 110 textareasByName = document.getElementsByName( elementOrIdOrName ); 111 112 while ( ( element = textareasByName[ i++ ] ) && element.tagName.toLowerCase() != 'textarea' ) 113 { /*jsl:pass*/ } 114 } 115 116 if ( !element ) 117 throw '[CKEDITOR.editor.replace] The element with id or name "' + elementOrIdOrName + '" was not found.'; 118 } 119 120 // Do not replace the textarea right now, just hide it. The effective 121 // replacement will be done by the _init function. 122 element.style.visibility = 'hidden'; 123 124 // Create the editor instance. 125 return new CKEDITOR.editor( config, element, CKEDITOR.ELEMENT_MODE_REPLACE ); 126 }; 127 128 /** 129 * Creates a new editor instance inside a specific DOM element. Do not use 130 * this function directly. Use {@link CKEDITOR.appendTo} instead. 131 * @param {Object|String} elementOrId The DOM element or its ID. 132 * @param {Object} [config] The specific configurations to apply to this 133 * editor instance. Configurations set here will override global CKEditor 134 * settings. 135 * @param {String} [data] Since 3.3. Initial value for the instance. 136 * @returns {CKEDITOR.editor} The editor instance created. 137 * @example 138 */ 139 CKEDITOR.editor.appendTo = function( elementOrId, config, data ) 140 { 141 var element = elementOrId; 142 if ( typeof element != 'object' ) 143 { 144 element = document.getElementById( elementOrId ); 145 146 if ( !element ) 147 throw '[CKEDITOR.editor.appendTo] The element with id "' + elementOrId + '" was not found.'; 148 } 149 150 // Create the editor instance. 151 return new CKEDITOR.editor( config, element, CKEDITOR.ELEMENT_MODE_APPENDTO, data ); 152 }; 153 154 CKEDITOR.editor.prototype = 155 { 156 /** 157 * Initializes the editor instance. This function will be overriden by the 158 * full CKEDITOR.editor implementation (editor.js). 159 * @private 160 */ 161 _init : function() 162 { 163 var pending = CKEDITOR.editor._pending || ( CKEDITOR.editor._pending = [] ); 164 pending.push( this ); 165 }, 166 167 // Both fire and fireOnce will always pass this editor instance as the 168 // "editor" param in CKEDITOR.event.fire. So, we override it to do that 169 // automaticaly. 170 171 /** @ignore */ 172 fire : function( eventName, data ) 173 { 174 return CKEDITOR.event.prototype.fire.call( this, eventName, data, this ); 175 }, 176 177 /** @ignore */ 178 fireOnce : function( eventName, data ) 179 { 180 return CKEDITOR.event.prototype.fireOnce.call( this, eventName, data, this ); 181 } 182 }; 183 184 // "Inherit" (copy actually) from CKEDITOR.event. 185 CKEDITOR.event.implementOn( CKEDITOR.editor.prototype, true ); 186 } 187