Rev 1372 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
/** FCKeditor - The text editor for internet* Copyright (C) 2003-2006 Frederico Caldeira Knabben** Licensed under the terms of the GNU Lesser General Public License:* http://www.opensource.org/licenses/lgpl-license.php** For further information visit:* http://www.fckeditor.net/** "Support Open Source software. What about a donation today?"** File Name: fckeditingarea.js* FCKEditingArea Class: renders an editable area.** File Authors:* Frederico Caldeira Knabben (fredck@fckeditor.net)*//*** @constructor* @param {String} targetElement The element that will hold the editing area. Any child element present in the target will be deleted.*/var FCKEditingArea = function( targetElement ){this.TargetElement = targetElement ;this.Mode = FCK_EDITMODE_WYSIWYG ;if ( FCK.IECleanup )FCK.IECleanup.AddItem( this, FCKEditingArea_Cleanup ) ;}/*** @param {String} html The complete HTML for the page, including DOCTYPE and the <html> tag.*/FCKEditingArea.prototype.Start = function( html, secondCall ){var eTargetElement = this.TargetElement ;var oTargetDocument = FCKTools.GetElementDocument( eTargetElement ) ;// Remove all child nodes from the target.while( eTargetElement.childNodes.length > 0 )eTargetElement.removeChild( eTargetElement.childNodes[0] ) ;if ( this.Mode == FCK_EDITMODE_WYSIWYG ){if ( FCKBrowserInfo.IsGecko )html = html.replace( /(<body[^>]*>)\s*(<\/body>)/i, '$1' + GECKO_BOGUS + '$2' ) ;// Create the editing area IFRAME.var oIFrame = this.IFrame = oTargetDocument.createElement( 'iframe' ) ;oIFrame.src = 'javascript:void(0)' ;oIFrame.frameBorder = 0 ;oIFrame.width = oIFrame.height = '100%' ;// Append the new IFRAME to the target.eTargetElement.appendChild( oIFrame ) ;// IE has a bug with the <base> tag... it must have a </base> closer,// otherwise the all sucessive tags will be set as children nodes of the <base>.if ( FCKBrowserInfo.IsIE )html = html.replace( /(<base[^>]*?)\s*\/?>(?!\s*<\/base>)/gi, '$1></base>' ) ;// Get the window and document objects used to interact with the newly created IFRAME.this.Window = oIFrame.contentWindow ;// IE: Avoid JavaScript errors thrown by the editing are source (like tags events).// TODO: This error handler is not being fired.// this.Window.onerror = function() { alert( 'Error!' ) ; return true ; }var oDoc = this.Document = this.Window.document ;oDoc.open() ;oDoc.write( html ) ;oDoc.close() ;// Firefox 1.0.x is buggy... ohh yes... so let's do it two times and it// will magicaly work.if ( FCKBrowserInfo.IsGecko10 && !secondCall ){this.Start( html, true ) ;return ;}this.Window._FCKEditingArea = this ;// FF 1.0.x is buggy... we must wait a lot to enable editing because// sometimes the content simply disappears, for example when pasting// "bla1!<img src='some_url'>!bla2" in the source and then switching// back to design.if ( FCKBrowserInfo.IsGecko10 )this.Window.setTimeout( FCKEditingArea_CompleteStart, 500 ) ;elseFCKEditingArea_CompleteStart.call( this.Window ) ;}else{var eTextarea = this.Textarea = oTargetDocument.createElement( 'textarea' ) ;eTextarea.className = 'SourceField' ;eTextarea.dir = 'ltr' ;eTextarea.style.width = eTextarea.style.height = '100%' ;eTextarea.style.border = 'none' ;eTargetElement.appendChild( eTextarea ) ;eTextarea.value = html ;// Fire the "OnLoad" event.FCKTools.RunFunction( this.OnLoad ) ;}}// "this" here is FCKEditingArea.Windowfunction FCKEditingArea_CompleteStart(){// Of Firefox, the DOM takes a little to become available. So we must wait for it in a loop.if ( !this.document.body ){this.setTimeout( FCKEditingArea_CompleteStart, 50 ) ;return ;}var oEditorArea = this._FCKEditingArea ;oEditorArea.MakeEditable() ;// Fire the "OnLoad" event.FCKTools.RunFunction( oEditorArea.OnLoad ) ;}FCKEditingArea.prototype.MakeEditable = function(){var oDoc = this.Document ;if ( FCKBrowserInfo.IsIE )oDoc.body.contentEditable = true ;else{try{oDoc.designMode = 'on' ;// Tell Gecko to use or not the <SPAN> tag for the bold, italic and underline.oDoc.execCommand( 'useCSS', false, !FCKConfig.GeckoUseSPAN ) ;// Analysing Firefox 1.5 source code, it seams that there is support for a// "insertBrOnReturn" command. Applying it gives no error, but it doesn't// gives the same behavior that you have with IE. It works only if you are// already inside a paragraph and it doesn't render correctly in the first enter.// oDoc.execCommand( 'insertBrOnReturn', false, false ) ;// Tell Gecko (Firefox 1.5+) to enable or not live resizing of objects (by Alfonso Martinez)oDoc.execCommand( 'enableObjectResizing', false, !FCKConfig.DisableObjectResizing ) ;// Disable the standard table editing features of Firefox.oDoc.execCommand( 'enableInlineTableEditing', false, !FCKConfig.DisableFFTableHandles ) ;}catch (e) {}}}FCKEditingArea.prototype.Focus = function(){try{if ( this.Mode == FCK_EDITMODE_WYSIWYG ){if ( FCKBrowserInfo.IsSafari )this.IFrame.focus() ;elsethis.Window.focus() ;}elsethis.Textarea.focus() ;}catch(e) {}}function FCKEditingArea_Cleanup(){this.TargetElement = null ;this.IFrame = null ;this.Document = null ;this.Textarea = null ;if ( this.Window ){this.Window._FCKEditingArea = null ;this.Window = null ;}}