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 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 * Represents an editor instance. This constructor should be rarely used, 31 * being the {@link CKEDITOR} methods preferible. 32 * @constructor 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. 39 * @augments CKEDITOR.event 40 * @example 41 */ 42 CKEDITOR.editor = function( instanceConfig, element, mode ) 43 { 44 this._ = 45 { 46 // Save the config to be processed later by the full core code. 47 instanceConfig : instanceConfig, 48 element : element 49 }; 50 51 /** 52 * The mode in which the {@link #element} is linked to this editor 53 * instance. It can be any of the following values: 54 * <ul> 55 * <li><b>CKEDITOR.ELEMENT_MODE_NONE</b>: No element is linked to the 56 * editor instance.</li> 57 * <li><b>CKEDITOR.ELEMENT_MODE_REPLACE</b>: The element is to be 58 * replaced by the editor instance.</li> 59 * <li><b>CKEDITOR.ELEMENT_MODE_APPENDTO</b>: The editor is to be 60 * created inside the element.</li> 61 * </ul> 62 * @name CKEDITOR.editor.prototype.elementMode 63 * @type Number 64 * @example 65 * var editor = CKEDITOR.replace( 'editor1' ); 66 * alert( <b>editor.elementMode</b> ); "1" 67 */ 68 this.elementMode = mode || CKEDITOR.ELEMENT_MODE_NONE; 69 70 // Call the CKEDITOR.event constructor to initialize this instance. 71 CKEDITOR.event.call( this ); 72 73 this._init(); 74 }; 75 76 /** 77 * Replaces a <textarea> or a DOM element (DIV) with a CKEditor 78 * instance. For textareas, the initial value in the editor will be the 79 * textarea value. For DOM elements, their innerHTML will be used 80 * instead. We recommend using TEXTAREA and DIV elements only. Do not use 81 * this function directly. Use {@link CKEDITOR.replace} instead. 82 * @param {Object|String} elementOrIdOrName The DOM element (textarea), its 83 * ID or name. 84 * @param {Object} [config] The specific configurations to apply to this 85 * editor instance. Configurations set here will override global CKEditor 86 * settings. 87 * @returns {CKEDITOR.editor} The editor instance created. 88 * @example 89 */ 90 CKEDITOR.editor.replace = function( elementOrIdOrName, config ) 91 { 92 var element = elementOrIdOrName; 93 94 if ( typeof element != 'object' ) 95 { 96 // Look for the element by id. We accept any kind of element here. 97 element = document.getElementById( elementOrIdOrName ); 98 99 // If not found, look for elements by name. In this case we accept only 100 // textareas. 101 if ( !element ) 102 { 103 var i = 0, 104 textareasByName = document.getElementsByName( elementOrIdOrName ); 105 106 while ( ( element = textareasByName[ i++ ] ) && element.tagName.toLowerCase() != 'textarea' ) 107 { /*jsl:pass*/ } 108 } 109 110 if ( !element ) 111 throw '[CKEDITOR.editor.replace] The element with id or name "' + elementOrIdOrName + '" was not found.'; 112 } 113 114 // Do not replace the textarea right now, just hide it. The effective 115 // replacement will be done by the _init function. 116 element.style.visibility = 'hidden'; 117 118 // Create the editor instance. 119 return new CKEDITOR.editor( config, element, CKEDITOR.ELEMENT_MODE_REPLACE ); 120 }; 121 122 /** 123 * Creates a new editor instance inside a specific DOM element. Do not use 124 * this function directly. Use {@link CKEDITOR.appendTo} instead. 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 */ 132 CKEDITOR.editor.appendTo = function( elementOrId, config ) 133 { 134 if ( typeof elementOrId != 'object' ) 135 { 136 elementOrId = document.getElementById( elementOrId ); 137 138 if ( !elementOrId ) 139 throw '[CKEDITOR.editor.appendTo] The element with id "' + elementOrId + '" was not found.'; 140 } 141 142 // Create the editor instance. 143 return new CKEDITOR.editor( config, elementOrId, CKEDITOR.ELEMENT_MODE_APPENDTO ); 144 }; 145 146 CKEDITOR.editor.prototype = 147 { 148 /** 149 * Initializes the editor instance. This function will be overriden by the 150 * full CKEDITOR.editor implementation (editor.js). 151 * @private 152 */ 153 _init : function() 154 { 155 var pending = CKEDITOR.editor._pending || ( CKEDITOR.editor._pending = [] ); 156 pending.push( this ); 157 }, 158 159 // Both fire and fireOnce will always pass this editor instance as the 160 // "editor" param in CKEDITOR.event.fire. So, we override it to do that 161 // automaticaly. 162 163 /** @ignore */ 164 fire : function( eventName, data ) 165 { 166 return CKEDITOR.event.prototype.fire.call( this, eventName, data, this ); 167 }, 168 169 /** @ignore */ 170 fireOnce : function( eventName, data ) 171 { 172 return CKEDITOR.event.prototype.fireOnce.call( this, eventName, data, this ); 173 } 174 }; 175 176 // "Inherit" (copy actually) from CKEDITOR.event. 177 CKEDITOR.event.implementOn( CKEDITOR.editor.prototype ); 178 } 179