]*>.*?)(<\/P>)","gi") ; // Different because of a IE 5.0 error
+ html = html.replace( re, "
" ) ;
+
+ FCK.InsertHtml( html ) ;
+}
+
+FCK.Preview = function()
+{
+ var oWindow = window.open( '', null, 'toolbar=yes,location=yes,status=yes,menubar=yes,scrollbars=yes,resizable=yes' ) ;
+
+ var sHTML = '
' + FCK.GetHTML() + '' ;
+
+ oWindow.document.write( sHTML );
+ oWindow.document.close();
+
+ // TODO: The CSS of the editor area must be configurable.
+ // oWindow.document.createStyleSheet( config.EditorAreaCSS );
+}
+
+FCK.SwitchEditMode = function()
+{
+ // Check if the actual mode is WYSIWYG.
+ var bWYSIWYG = ( FCK.EditMode == FCK_EDITMODE_WYSIWYG ) ;
+
+ // Display/Hide the TRs.
+ document.getElementById('eWysiwyg').style.display = bWYSIWYG ? 'none' : '' ;
+ document.getElementById('eSource').style.display = bWYSIWYG ? '' : 'none' ;
+
+ // Update the HTML in the view output to show.
+ if ( bWYSIWYG )
+ {
+ if ( FCKBrowserInfo.IsIE )
+ FCKUndo.SaveUndoStep() ;
+ document.getElementById('eSourceField').value = ( FCKConfig.EnableXHTML && FCKConfig.EnableSourceXHTML ? FCK.GetXHTML( FCKConfig.FormatSource ) : FCK.GetHTML( FCKConfig.FormatSource ) ) ;
+ }
+ else
+ FCK.SetHTML( FCK.GetHTML(), true ) ;
+
+ // Updates the actual mode status.
+ FCK.EditMode = bWYSIWYG ? FCK_EDITMODE_SOURCE : FCK_EDITMODE_WYSIWYG ;
+
+ // Update the toolbar.
+ FCKToolbarSet.RefreshModeState() ;
+
+ // Set the Focus.
+ FCK.Focus() ;
+}
+
+FCK.CreateElement = function( tag )
+{
+ var e = FCK.EditorDocument.createElement( tag ) ;
+ return FCK.InsertElementAndGetIt( e ) ;
+}
+
+FCK.InsertElementAndGetIt = function( e )
+{
+ e.setAttribute( '__FCKTempLabel', 1 ) ;
+
+ this.InsertElement( e ) ;
+
+ var aEls = FCK.EditorDocument.getElementsByTagName( e.tagName ) ;
+
+ for ( var i = 0 ; i < aEls.length ; i++ )
+ {
+ if ( aEls[i].getAttribute( '__FCKTempLabel' ) )
+ {
+ aEls[i].removeAttribute( '__FCKTempLabel' ) ;
+ return aEls[i] ;
+ }
+ }
+}
Index: lams_central/web/fckeditor/editor/_source/internals/fck_2_gecko.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fck_2_gecko.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fck_2_gecko.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,200 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fck_2_gecko.js
+ * This is the second part of the "FCK" object creation. This is the main
+ * object that represents an editor instance.
+ * (Gecko specific implementations)
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+// GetNamedCommandState overload for Gecko.
+FCK._BaseGetNamedCommandState = FCK.GetNamedCommandState ;
+FCK.GetNamedCommandState = function( commandName )
+{
+ switch ( commandName )
+ {
+ case 'Unlink' :
+ return FCKSelection.HasAncestorNode('A') ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
+ default :
+ return FCK._BaseGetNamedCommandState( commandName ) ;
+ }
+}
+
+// Named commands to be handled by this browsers specific implementation.
+FCK.RedirectNamedCommands =
+{
+ Print : true,
+ Paste : true,
+ Cut : true,
+ Copy : true
+}
+
+// ExecuteNamedCommand overload for Gecko.
+FCK.ExecuteRedirectedNamedCommand = function( commandName, commandParameter )
+{
+ switch ( commandName )
+ {
+ case 'Print' :
+ FCK.EditorWindow.print() ;
+ break ;
+ case 'Paste' :
+ try { if ( FCK.Paste() ) FCK._BaseExecuteNamedCommand( 'Paste' ) ; }
+ catch (e) { alert( FCKLang.PasteErrorPaste ) ; }
+ break ;
+ case 'Cut' :
+ try { FCK._BaseExecuteNamedCommand( 'Cut' ) ; }
+ catch (e) { alert( FCKLang.PasteErrorCut ) ; }
+ break ;
+ case 'Copy' :
+ try { FCK._BaseExecuteNamedCommand( 'Copy' ) ; }
+ catch (e) { alert( FCKLang.PasteErrorCopy ) ; }
+ break ;
+ default :
+ FCK.ExecuteNamedCommand( commandName, commandParameter ) ;
+ }
+}
+
+FCK.AttachToOnSelectionChange = function( functionPointer )
+{
+ this.Events.AttachEvent( 'OnSelectionChange', functionPointer ) ;
+}
+
+FCK.Paste = function()
+{
+ if ( FCKConfig.ForcePasteAsPlainText )
+ {
+ FCK.PasteAsPlainText() ;
+ return false ;
+ }
+ else if ( FCKConfig.AutoDetectPasteFromWord )
+ {
+ var sHTML = FCK.GetClipboardHTML() ;
+ var re = /<\w[^>]* class="?MsoNormal"?/gi ;
+ if ( re.test( sHTML ) )
+ {
+ if ( confirm( FCKLang["PasteWordConfirm"] ) )
+ {
+ FCK.CleanAndPaste( sHTML ) ;
+ return false ;
+ }
+ }
+ }
+ else
+ return true ;
+}
+
+//**
+// FCK.InsertHtml: Inserts HTML at the current cursor location. Deletes the
+// selected content if any.
+FCK.InsertHtml = function( html )
+{
+ // Delete the actual selection.
+ var oSel = FCKSelection.Delete() ;
+
+// var oContainer = oSel.getRangeAt(0).startContainer ;
+// var iOffSet = oSel.getRangeAt(0).startOffset ;
+
+ // Get the first available range.
+ var oRange = oSel.getRangeAt(0) ;
+
+// var oRange = this.EditorDocument.createRange() ;
+// oRange.setStart( oContainer, iOffSet ) ;
+// oRange.setEnd( oContainer, iOffSet ) ;
+
+ // Create a fragment with the input HTML.
+ var oFragment = oRange.createContextualFragment( html ) ;
+
+ // Get the last available node.
+ var oLastNode = oFragment.lastChild ;
+
+ // Insert the fragment in the range.
+ oRange.insertNode(oFragment) ;
+
+ // Set the cursor after the inserted fragment.
+ oRange.setEndAfter( oLastNode ) ;
+ oRange.setStartAfter( oLastNode ) ;
+
+ oSel.removeAllRanges() ;
+ oSel = FCK.EditorWindow.getSelection() ;
+ oSel.addRange( oRange ) ;
+
+ this.Focus() ;
+}
+
+FCK.InsertElement = function( element )
+{
+ // Deletes the actual selection.
+ var oSel = FCKSelection.Delete() ;
+
+ // Gets the first available range.
+ var oRange = oSel.getRangeAt(0) ;
+
+ // Inserts the element in the range.
+ oRange.insertNode( element ) ;
+
+ // Set the cursor after the inserted fragment.
+ oRange.setEndAfter( element ) ;
+ oRange.setStartAfter( element ) ;
+
+ this.Focus() ;
+}
+
+FCK.PasteAsPlainText = function()
+{
+ // TODO: Implement the "Paste as Plain Text" code.
+
+ FCKDialog.OpenDialog( 'FCKDialog_Paste', FCKLang.PasteAsText, 'dialog/fck_paste.html', 400, 330, 'PlainText' ) ;
+
+/*
+ var sText = FCKTools.HTMLEncode( clipboardData.getData("Text") ) ;
+ sText = sText.replace( /\n/g, '
' ) ;
+ this.InsertHtml( sText ) ;
+*/
+}
+
+FCK.PasteFromWord = function()
+{
+ // TODO: Implement the "Paste as Plain Text" code.
+
+ FCKDialog.OpenDialog( 'FCKDialog_Paste', FCKLang.PasteFromWord, 'dialog/fck_paste.html', 400, 330, 'Word' ) ;
+
+// FCK.CleanAndPaste( FCK.GetClipboardHTML() ) ;
+}
+
+FCK.GetClipboardHTML = function()
+{
+ return '' ;
+}
+
+FCK.CreateLink = function( url )
+{
+ FCK.ExecuteNamedCommand( 'Unlink' ) ;
+
+ if ( url.length > 0 )
+ {
+ // Generate a temporary name for the link.
+ var sTempUrl = 'javascript:void(0);/*' + ( new Date().getTime() ) + '*/' ;
+
+ // Use the internal "CreateLink" command to create the link.
+ FCK.ExecuteNamedCommand( 'CreateLink', sTempUrl ) ;
+
+ // Retrieve the just created link using XPath.
+ var oLink = document.evaluate("//a[@href='" + sTempUrl + "']", this.EditorDocument.body, null, 9, null).singleNodeValue ;
+
+ if ( oLink )
+ {
+ oLink.href = url ;
+ return oLink ;
+ }
+ }
+}
Index: lams_central/web/fckeditor/editor/_source/internals/fck_2_ie.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fck_2_ie.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fck_2_ie.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,155 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fck_2_ie.js
+ * This is the second part of the "FCK" object creation. This is the main
+ * object that represents an editor instance.
+ * (IE specific implementations)
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+/*
+if ( FCKConfig.UseBROnCarriageReturn )
+{
+ // Named commands to be handled by this browsers specific implementation.
+ FCK.RedirectNamedCommands =
+ {
+ InsertOrderedList : true,
+ InsertUnorderedList : true
+ }
+
+ FCK.ExecuteRedirectedNamedCommand = function( commandName, commandParameter )
+ {
+ if ( commandName == 'InsertOrderedList' || commandName == 'InsertUnorderedList' )
+ {
+ if ( !(FCK.EditorDocument.queryCommandState( 'InsertOrderedList' ) || FCK.EditorDocument.queryCommandState( 'InsertUnorderedList' )) )
+ {
+ }
+ }
+
+ FCK.ExecuteNamedCommand( commandName, commandParameter ) ;
+ }
+}
+*/
+
+FCK.Paste = function()
+{
+ if ( FCKConfig.ForcePasteAsPlainText )
+ {
+ FCK.PasteAsPlainText() ;
+ return false ;
+ }
+ else if ( FCKConfig.AutoDetectPasteFromWord )
+ {
+ var sHTML = FCK.GetClipboardHTML() ;
+ var re = /<\w[^>]* class="?MsoNormal"?/gi ;
+ if ( re.test( sHTML ) )
+ {
+ if ( confirm( FCKLang["PasteWordConfirm"] ) )
+ {
+ FCK.CleanAndPaste( sHTML ) ;
+ return false ;
+ }
+ }
+ }
+ else
+ return true ;
+}
+
+FCK.PasteAsPlainText = function()
+{
+ // Get the data available in the clipboard and encodes it in HTML.
+ var sText = FCKTools.HTMLEncode( clipboardData.getData("Text") ) ;
+
+ // Replace the carriage returns with
+ sText = sText.replace( /\n/g, '
' ) ;
+
+ // Insert the resulting data in the editor.
+ this.InsertHtml( sText ) ;
+}
+
+FCK.PasteFromWord = function()
+{
+ FCK.CleanAndPaste( FCK.GetClipboardHTML() ) ;
+}
+
+FCK.InsertElement = function( element )
+{
+ FCK.InsertHtml( element.outerHTML ) ;
+}
+
+FCK.GetClipboardHTML = function()
+{
+ var oDiv = document.getElementById( '___FCKHiddenDiv' ) ;
+
+ if ( !oDiv )
+ {
+ var oDiv = document.createElement( 'DIV' ) ;
+ oDiv.id = '___FCKHiddenDiv' ;
+ oDiv.style.visibility = 'hidden' ;
+ oDiv.style.overflow = 'hidden' ;
+ oDiv.style.position = 'absolute' ;
+ oDiv.style.width = 1 ;
+ oDiv.style.height = 1 ;
+
+ document.body.appendChild( oDiv ) ;
+ }
+
+ oDiv.innerHTML = '' ;
+
+ var oTextRange = document.body.createTextRange() ;
+ oTextRange.moveToElementText( oDiv ) ;
+ oTextRange.execCommand( 'Paste' ) ;
+
+ var sData = oDiv.innerHTML ;
+ oDiv.innerHTML = '' ;
+
+ return sData ;
+}
+
+FCK.AttachToOnSelectionChange = function( functionPointer )
+{
+ this.Events.AttachEvent( 'OnSelectionChange', functionPointer ) ;
+}
+
+/*
+FCK.AttachToOnSelectionChange = function( functionPointer )
+{
+ FCK.EditorDocument.attachEvent( 'onselectionchange', functionPointer ) ;
+}
+*/
+
+FCK.CreateLink = function( url )
+{
+ FCK.ExecuteNamedCommand( 'Unlink' ) ;
+
+ if ( url.length > 0 )
+ {
+ // Generate a temporary name for the link.
+ var sTempUrl = 'javascript:void(0);/*' + ( new Date().getTime() ) + '*/' ;
+
+ // Use the internal "CreateLink" command to create the link.
+ FCK.ExecuteNamedCommand( 'CreateLink', sTempUrl ) ;
+
+ // Loof for the just create link.
+ var oLinks = this.EditorDocument.links ;
+
+ for ( i = 0 ; i < oLinks.length ; i++ )
+ {
+ if ( oLinks[i].href == sTempUrl )
+ {
+ oLinks[i].href = url ;
+ return oLinks[i] ;
+ }
+ }
+ }
+}
Index: lams_central/web/fckeditor/editor/_source/internals/fck_last.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fck_last.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fck_last.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,53 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fck_last.js
+ * These are the last script lines executed in the editor loading process.
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+// This is the last file loaded to complete the editor initialization and activation
+
+// Just check if the document direction has been correctly applied (at fck_onload.js).
+if ( FCKLang && window.document.dir.toLowerCase() != FCKLang.Dir.toLowerCase() )
+ window.document.dir = FCKLang.Dir ;
+
+// Activate pasting operations.
+if ( FCKConfig.ForcePasteAsPlainText )
+ FCK.Events.AttachEvent( "OnPaste", FCK.Paste ) ;
+
+// Load Plugins.
+if ( FCKPlugins.ItemsCount > 0 )
+{
+ FCKScriptLoader.OnEmpty = CompleteLoading ;
+ FCKPlugins.Load() ;
+}
+else
+ CompleteLoading() ;
+
+function CompleteLoading()
+{
+ // Load the Toolbar
+ FCKToolbarSet.Name = FCKURLParams['Toolbar'] || 'Default' ;
+ FCKToolbarSet.Load( FCKToolbarSet.Name ) ;
+ FCKToolbarSet.Restart() ;
+
+ FCK.AttachToOnSelectionChange( FCKToolbarSet.RefreshItemsState ) ;
+ //FCK.AttachToOnSelectionChange( FCKSelection._Reset ) ;
+
+ FCK.SetStatus( FCK_STATUS_COMPLETE ) ;
+
+ // Call the special "FCKeditor_OnComplete" function that should be present in
+ // the HTML page where the editor is located.
+ if ( typeof( window.parent.FCKeditor_OnComplete ) == 'function' )
+ window.parent.FCKeditor_OnComplete( FCK ) ;
+}
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fck_onload.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fck_onload.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fck_onload.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,212 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fck_onload.js
+ * This is the script that is called when the editor page is loaded inside
+ * its IFRAME. It's the editor startup.
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+// Disable the context menu in the editor (areas outside the editor area).
+function Window_OnContextMenu( e )
+{
+ if ( e )
+ e.preventDefault() ; // The Gecko way.
+
+ return false ; // The IE way.
+}
+window.document.oncontextmenu = Window_OnContextMenu ;
+
+// Gecko browsers doens't calculate well that IFRAME size so we must
+// recalculate it every time the window size changes.
+if ( FCKBrowserInfo.IsGecko )
+{
+ function Window_OnResize()
+ {
+ var oFrame = document.getElementById('eEditorArea') ;
+ oFrame.height = 0 ;
+
+ var oCell = document.getElementById( FCK.EditMode == FCK_EDITMODE_WYSIWYG ? 'eWysiwygCell' : 'eSource' ) ;
+ var iHeight = oCell.offsetHeight ;
+
+ oFrame.height = iHeight - 2 ;
+ }
+ window.onresize = Window_OnResize ;
+}
+
+if ( FCKBrowserInfo.IsIE )
+{
+ var aCleanupDocs = new Array() ;
+ aCleanupDocs[0] = document ;
+
+ // On IE, some circular references must be cleared to avoid memory leak.
+ function Window_OnBeforeUnload()
+ {
+ FCKToolbarSet.Collapse() ;
+
+ var e ;
+
+ for ( var j = 0 ; j < aCleanupDocs.length ; j++ )
+ {
+ var d = aCleanupDocs[j] ;
+ var i = 0 ;
+
+ while ( e = d.getElementsByTagName("DIV").item(i++) )
+ {
+ if ( e.FCKToolbarButton )
+ e.FCKToolbarButton = null ;
+
+ if ( e.FCKSpecialCombo )
+ e.FCKSpecialCombo = null ;
+
+ if ( e.Command )
+ e.Command = null ;
+ }
+
+ i = 0 ;
+ while ( e = d.getElementsByTagName("TR").item(i++) )
+ {
+ if ( e.FCKContextMenuItem )
+ e.FCKContextMenuItem = null ;
+ }
+
+ aCleanupDocs[j] = null ;
+ d = null ;
+ }
+ }
+ window.attachEvent( "onbeforeunload", Window_OnBeforeUnload ) ;
+}
+
+// The editor startup follows these steps:
+// 1. Load the editor main page (fckeditor.html).
+// 2. Load the main configuration file (fckconfig.js)
+// 3. Process the configurations set directly in the page code (just load then).
+// 4. Override the configurations with the custom config file (if set).
+// 5. Override the configurations with that ones set directly in the page code.
+// 6. Load the editor skin styles CSS files.
+// 7. Load the first part of tha main scripts.
+// 8. Load the language file.
+// 9. Start the editor.
+
+// Start the editor as soon as the window is loaded.
+function Window_OnLoad()
+{
+ // There is a bug on Netscape when rendering the frame. It goes over the
+ // right border. So we must correct it.
+ if ( FCKBrowserInfo.IsNetscape )
+ document.getElementById('eWysiwygCell').style.paddingRight = '2px' ;
+
+ LoadConfigFile() ;
+}
+window.onload = Window_OnLoad ;
+
+function LoadConfigFile()
+{
+ FCKScriptLoader.OnEmpty = ProcessHiddenField ;
+
+ // First of all load the configuration file.
+ FCKScriptLoader.AddScript( '../fckconfig.js' ) ;
+}
+
+function ProcessHiddenField()
+{
+ FCKConfig.ProcessHiddenField() ;
+
+ LoadCustomConfigFile() ;
+}
+
+function LoadCustomConfigFile()
+{
+ // Load the custom configurations file (if defined).
+ if ( FCKConfig.CustomConfigurationsPath.length > 0 )
+ {
+ // Wait for the configuration file to be loaded to call the "LoadPageConfig".
+ FCKScriptLoader.OnEmpty = LoadPageConfig ;
+
+ FCKScriptLoader.AddScript( FCKConfig.CustomConfigurationsPath ) ;
+ }
+ else
+ {
+ // Load the page defined configurations immediately.
+ LoadPageConfig() ;
+ }
+}
+
+function LoadPageConfig()
+{
+ FCKConfig.LoadPageConfig() ;
+
+ // Load the styles for the configured skin.
+ LoadStyles() ;
+}
+
+function LoadStyles()
+{
+ FCKScriptLoader.OnEmpty = LoadScripts ;
+
+ // Load the active skin CSS.
+ FCKScriptLoader.AddScript( FCKConfig.SkinPath + 'fck_editor.css' ) ;
+ FCKScriptLoader.AddScript( FCKConfig.SkinPath + 'fck_contextmenu.css' ) ;
+}
+
+function LoadScripts()
+{
+ FCKScriptLoader.OnEmpty = null ;
+
+ // @Packager.Compactor.Remove.Start
+ var sSuffix = FCKBrowserInfo.IsIE ? 'ie' : 'gecko' ;
+
+ with ( FCKScriptLoader )
+ {
+ AddScript( '_source/internals/fckdebug.js' ) ;
+ AddScript( '_source/internals/fcktools.js' ) ;
+ AddScript( '_source/internals/fcktools_' + sSuffix + '.js' ) ;
+ AddScript( '_source/internals/fckregexlib.js' ) ;
+ AddScript( '_source/internals/fcklanguagemanager.js' ) ;
+ AddScript( '_source/classes/fckevents.js' ) ;
+ AddScript( '_source/internals/fckxhtmlentities.js' ) ;
+ AddScript( '_source/internals/fckxhtml.js' ) ;
+ AddScript( '_source/internals/fckxhtml_' + sSuffix + '.js' ) ;
+ AddScript( '_source/internals/fckcodeformatter.js' ) ;
+ AddScript( '_source/internals/fckundo_' + sSuffix + '.js' ) ;
+ AddScript( '_source/internals/fck_1.js' ) ;
+ AddScript( '_source/internals/fck_1_' + sSuffix + '.js' ) ;
+ }
+ // @Packager.Compactor.Remove.End
+
+ /* @Packager.Compactor.RemoveLine
+ if ( FCKBrowserInfo.IsIE )
+ FCKScriptLoader.AddScript( 'js/fckeditorcode_ie_1.js' ) ;
+ else
+ FCKScriptLoader.AddScript( 'js/fckeditorcode_gecko_1.js' ) ;
+ @Packager.Compactor.RemoveLine */
+}
+
+function LoadLanguageFile()
+{
+ FCKScriptLoader.OnEmpty = LoadEditor ;
+
+ FCKScriptLoader.AddScript( 'lang/' + FCKLanguageManager.ActiveLanguage.Code + '.js' ) ;
+}
+
+function LoadEditor()
+{
+ // Removes the OnEmpty listener.
+ FCKScriptLoader.OnEmpty = null ;
+
+ // Correct the editor layout to the correct language direction.
+ if ( FCKLang )
+ window.document.dir = FCKLang.Dir ;
+
+ // Starts the editor.
+ FCK.StartEditor() ;
+}
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fckbrowserinfo.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fckbrowserinfo.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fckbrowserinfo.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,29 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fckbrowserinfo.js
+ * Defines the FCKBrowserInfo object that hold some browser informations.
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+var FCKBrowserInfo ;
+
+if ( !( FCKBrowserInfo = NS.FCKBrowserInfo ) )
+{
+ FCKBrowserInfo = NS.FCKBrowserInfo = new Object() ;
+
+ var sAgent = navigator.userAgent.toLowerCase() ;
+
+ FCKBrowserInfo.IsIE = sAgent.indexOf("msie") != -1 ;
+ FCKBrowserInfo.IsGecko = !FCKBrowserInfo.IsIE ;
+ FCKBrowserInfo.IsNetscape = sAgent.indexOf("netscape") != -1 ;
+}
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fckcodeformatter.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fckcodeformatter.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fckcodeformatter.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,73 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fckcodeformatter.js
+ * Format the HTML.
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+var FCKCodeFormatter ;
+
+if ( !( FCKCodeFormatter = NS.FCKCodeFormatter ) )
+{
+ FCKCodeFormatter = NS.FCKCodeFormatter = new Object() ;
+
+ FCKCodeFormatter.Regex = new Object() ;
+
+ // Regex for line breaks.
+ FCKCodeFormatter.Regex.BlocksOpener = /\<(P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|TITLE|META|LINK|BASE|SCRIPT|LINK|TD|AREA|OPTION)[^\>]*\>/gi ;
+ FCKCodeFormatter.Regex.BlocksCloser = /\<\/(P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|TITLE|META|LINK|BASE|SCRIPT|LINK|TD|AREA|OPTION)[^\>]*\>/gi ;
+
+ FCKCodeFormatter.Regex.NewLineTags = /\<(BR|HR)[^\>]\>/gi ;
+
+ FCKCodeFormatter.Regex.MainTags = /\<\/?(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR)[^\>]*\>/gi ;
+
+ FCKCodeFormatter.Regex.LineSplitter = /\s*\n+\s*/g ;
+
+ // Regex for indentation.
+ FCKCodeFormatter.Regex.IncreaseIndent = /^\<(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR|UL|OL)[ \/\>]/i ;
+ FCKCodeFormatter.Regex.DecreaseIndent = /^\<\/(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR|UL|OL)[ \>]/i ;
+ FCKCodeFormatter.Regex.FormatIndentatorRemove = new RegExp( FCKConfig.FormatIndentator ) ;
+
+ FCKCodeFormatter.Format = function( html )
+ {
+ // Line breaks.
+ var sFormatted = html.replace( this.Regex.BlocksOpener, '\n$&' ) ; ;
+ sFormatted = sFormatted.replace( this.Regex.BlocksCloser, '$&\n' ) ;
+ sFormatted = sFormatted.replace( this.Regex.NewLineTags, '$&\n' ) ;
+ sFormatted = sFormatted.replace( this.Regex.MainTags, '\n$&\n' ) ;
+
+ // Indentation.
+ var sIndentation = '' ;
+
+ var asLines = sFormatted.split( this.Regex.LineSplitter ) ;
+ sFormatted = '' ;
+
+ for ( var i = 0 ; i < asLines.length ; i++ )
+ {
+ var sLine = asLines[i] ;
+
+ if ( sLine.length == 0 )
+ continue ;
+
+ if ( this.Regex.DecreaseIndent.test( sLine ) )
+ sIndentation = sIndentation.replace( this.Regex.FormatIndentatorRemove, '' ) ;
+
+ sFormatted += sIndentation + sLine + '\n' ;
+
+ if ( this.Regex.IncreaseIndent.test( sLine ) )
+ sIndentation += FCKConfig.FormatIndentator ;
+ }
+
+ return sFormatted.trim() ;
+ }
+}
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fckcommands.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fckcommands.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fckcommands.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,119 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fckcommands.js
+ * Define all commands available in the editor.
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+var FCKCommands = FCK.Commands = new Object() ;
+FCKCommands.LoadedCommands = new Object() ;
+
+FCKCommands.RegisterCommand = function( commandName, command )
+{
+ this.LoadedCommands[ commandName ] = command ;
+}
+
+FCKCommands.GetCommand = function( commandName )
+{
+ var oCommand = FCKCommands.LoadedCommands[ commandName ] ;
+
+ if ( oCommand )
+ return oCommand ;
+
+ switch ( commandName )
+ {
+ case 'DocProps' : oCommand = new FCKDialogCommand( 'DocProps' , FCKLang.DocProps , 'dialog/fck_docprops.html' , 400, 390, FCKCommands.GetFullPageState ) ; break ;
+ case 'Templates' : oCommand = new FCKDialogCommand( 'Templates' , FCKLang.DlgTemplatesTitle , 'dialog/fck_template.html' , 380, 450 ) ; break ;
+ case 'Link' : oCommand = new FCKDialogCommand( 'Link' , FCKLang.DlgLnkWindowTitle , 'dialog/fck_link.html' , 400, 330, FCK.GetNamedCommandState, 'CreateLink' ) ; break ;
+ case 'Anchor' : oCommand = new FCKDialogCommand( 'Anchor' , FCKLang.DlgAnchorTitle , 'dialog/fck_anchor.html' , 370, 170 ) ; break ;
+ case 'BulletedList' : oCommand = new FCKDialogCommand( 'BulletedList', FCKLang.BulletedListProp , 'dialog/fck_listprop.html' , 370, 170 ) ; break ;
+ case 'NumberedList' : oCommand = new FCKDialogCommand( 'NumberedList', FCKLang.NumberedListProp , 'dialog/fck_listprop.html' , 370, 170 ) ; break ;
+ case 'About' : oCommand = new FCKDialogCommand( 'About' , FCKLang.About , 'dialog/fck_about.html' , 400, 330 ) ; break ;
+
+ case 'Find' : oCommand = new FCKDialogCommand( 'Find' , FCKLang.DlgFindTitle , 'dialog/fck_find.html' , 340, 170 ) ; break ;
+ case 'Replace' : oCommand = new FCKDialogCommand( 'Replace' , FCKLang.DlgReplaceTitle , 'dialog/fck_replace.html' , 340, 200 ) ; break ;
+
+ case 'Image' : oCommand = new FCKDialogCommand( 'Image' , FCKLang.DlgImgTitle , 'dialog/fck_image.html' , 450, 400 ) ; break ;
+ case 'SpecialChar' : oCommand = new FCKDialogCommand( 'SpecialChar', FCKLang.DlgSpecialCharTitle , 'dialog/fck_specialchar.html' , 400, 300 ) ; break ;
+ case 'Smiley' : oCommand = new FCKDialogCommand( 'Smiley' , FCKLang.DlgSmileyTitle , 'dialog/fck_smiley.html' , FCKConfig.SmileyWindowWidth, FCKConfig.SmileyWindowHeight ) ; break ;
+ case 'Table' : oCommand = new FCKDialogCommand( 'Table' , FCKLang.DlgTableTitle , 'dialog/fck_table.html' , 400, 250 ) ; break ;
+ case 'TableProp' : oCommand = new FCKDialogCommand( 'Table' , FCKLang.DlgTableTitle , 'dialog/fck_table.html?Parent', 400, 250 ) ; break ;
+ case 'TableCellProp': oCommand = new FCKDialogCommand( 'TableCell' , FCKLang.DlgCellTitle , 'dialog/fck_tablecell.html' , 500, 250 ) ; break ;
+ case 'UniversalKey' : oCommand = new FCKDialogCommand( 'UniversalKey', FCKLang.UniversalKeyboard , 'dialog/fck_universalkey.html', 415, 300 ) ; break ;
+
+ case 'Style' : oCommand = new FCKStyleCommand() ; break ;
+
+ case 'FontName' : oCommand = new FCKFontNameCommand() ; break ;
+ case 'FontSize' : oCommand = new FCKFontSizeCommand() ; break ;
+ case 'FontFormat' : oCommand = new FCKFormatBlockCommand() ; break ;
+
+ case 'Source' : oCommand = new FCKSourceCommand() ; break ;
+ case 'Preview' : oCommand = new FCKPreviewCommand() ; break ;
+ case 'Save' : oCommand = new FCKSaveCommand() ; break ;
+ case 'NewPage' : oCommand = new FCKNewPageCommand() ; break ;
+
+ case 'TextColor' : oCommand = new FCKTextColorCommand('ForeColor') ; break ;
+ case 'BGColor' : oCommand = new FCKTextColorCommand('BackColor') ; break ;
+
+ case 'PasteText' : oCommand = new FCKPastePlainTextCommand() ; break ;
+ case 'PasteWord' : oCommand = new FCKPasteWordCommand() ; break ;
+
+ case 'TableInsertRow' : oCommand = new FCKTableCommand('TableInsertRow') ; break ;
+ case 'TableDeleteRows' : oCommand = new FCKTableCommand('TableDeleteRows') ; break ;
+ case 'TableInsertColumn' : oCommand = new FCKTableCommand('TableInsertColumn') ; break ;
+ case 'TableDeleteColumns' : oCommand = new FCKTableCommand('TableDeleteColumns') ; break ;
+ case 'TableInsertCell' : oCommand = new FCKTableCommand('TableInsertCell') ; break ;
+ case 'TableDeleteCells' : oCommand = new FCKTableCommand('TableDeleteCells') ; break ;
+ case 'TableMergeCells' : oCommand = new FCKTableCommand('TableMergeCells') ; break ;
+ case 'TableSplitCell' : oCommand = new FCKTableCommand('TableSplitCell') ; break ;
+
+ case 'Form' : oCommand = new FCKDialogCommand( 'Form' , FCKLang.Form , 'dialog/fck_form.html' , 380, 230 ) ; break ;
+ case 'Checkbox' : oCommand = new FCKDialogCommand( 'Checkbox' , FCKLang.Checkbox , 'dialog/fck_checkbox.html' , 380, 230 ) ; break ;
+ case 'Radio' : oCommand = new FCKDialogCommand( 'Radio' , FCKLang.RadioButton , 'dialog/fck_radiobutton.html' , 380, 230 ) ; break ;
+ case 'TextField' : oCommand = new FCKDialogCommand( 'TextField' , FCKLang.TextField , 'dialog/fck_textfield.html' , 380, 230 ) ; break ;
+ case 'Textarea' : oCommand = new FCKDialogCommand( 'Textarea' , FCKLang.Textarea , 'dialog/fck_textarea.html' , 380, 230 ) ; break ;
+ case 'HiddenField' : oCommand = new FCKDialogCommand( 'HiddenField', FCKLang.HiddenField , 'dialog/fck_hiddenfield.html' , 380, 230 ) ; break ;
+ case 'Button' : oCommand = new FCKDialogCommand( 'Button' , FCKLang.Button , 'dialog/fck_button.html' , 380, 230 ) ; break ;
+ case 'Select' : oCommand = new FCKDialogCommand( 'Select' , FCKLang.SelectionField, 'dialog/fck_select.html' , 400, 380 ) ; break ;
+ case 'ImageButton' : oCommand = new FCKDialogCommand( 'ImageButton', FCKLang.ImageButton , 'dialog/fck_image.html?ImageButton', 450, 400 ) ; break ;
+
+ case 'SpellCheck' : oCommand = new FCKSpellCheckCommand() ; break ;
+
+ case 'Undo' : oCommand = new FCKUndoCommand() ; break ;
+ case 'Redo' : oCommand = new FCKRedoCommand() ; break ;
+
+ // Generic Undefined command (usually used when a command is under development).
+ case 'Undefined' : oCommand = new FCKUndefinedCommand() ; break ;
+
+ // By default we assume that it is a named command.
+ default:
+ if ( FCKRegexLib.NamedCommands.test( commandName ) )
+ oCommand = new FCKNamedCommand( commandName ) ;
+ else
+ {
+ alert( FCKLang.UnknownCommand.replace( /%1/g, commandName ) ) ;
+ return ;
+ }
+ }
+
+ FCKCommands.LoadedCommands[ commandName ] = oCommand ;
+
+ return oCommand ;
+}
+
+// Gets the state of the "Document Properties" button. It must be enabled only
+// when "Full Page" editing is available.
+FCKCommands.GetFullPageState = function()
+{
+ return FCKConfig.FullPage ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
+}
Index: lams_central/web/fckeditor/editor/_source/internals/fckconfig.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fckconfig.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fckconfig.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,91 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fckconfig.js
+ * Creates and initializes the FCKConfig object.
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+var FCKConfig = FCK.Config = new Object() ;
+
+// Editor Base Path
+if ( document.location.protocol == 'file:' )
+{
+ FCKConfig.BasePath = document.location.pathname.substr(1) ;
+ FCKConfig.BasePath = FCKConfig.BasePath.replace( /\\/gi, '/' ) ;
+ FCKConfig.BasePath = 'file://' + FCKConfig.BasePath.substring(0,FCKConfig.BasePath.lastIndexOf('/')+1) ;
+}
+else
+{
+ FCKConfig.BasePath = document.location.pathname.substring(0,document.location.pathname.lastIndexOf('/')+1) ;
+ FCKConfig.FullBasePath = document.location.protocol + '//' + document.location.host + FCKConfig.BasePath ;
+}
+
+FCKConfig.EditorPath = FCKConfig.BasePath.replace( /editor\/$/, '' ) ;
+
+// Override the actual configuration values with the values passed throw the
+// hidden field "
___Config".
+FCKConfig.ProcessHiddenField = function()
+{
+ this.PageConfig = new Object() ;
+
+ // Get the hidden field.
+ var oConfigField = window.parent.document.getElementById( FCK.Name + '___Config' ) ;
+
+ // Do nothing if the config field was not defined.
+ if ( ! oConfigField ) return ;
+
+ var aCouples = oConfigField.value.split('&') ;
+
+ for ( var i = 0 ; i < aCouples.length ; i++ )
+ {
+ if ( aCouples[i].length == 0 )
+ continue ;
+
+ var aConfig = aCouples[i].split( '=' ) ;
+ var sKey = unescape( aConfig[0] ) ;
+ var sVal = unescape( aConfig[1] ) ;
+
+ if ( sKey == 'CustomConfigurationsPath' ) // The Custom Config File path must be loaded immediately.
+ FCKConfig[ sKey ] = sVal ;
+
+ else if ( sVal.toLowerCase() == "true" ) // If it is a boolean TRUE.
+ this.PageConfig[ sKey ] = true ;
+
+ else if ( sVal.toLowerCase() == "false" ) // If it is a boolean FALSE.
+ this.PageConfig[ sKey ] = false ;
+
+ else if ( ! isNaN( sVal ) ) // If it is a number.
+ this.PageConfig[ sKey ] = parseInt( sVal ) ;
+
+ else // In any other case it is a string.
+ this.PageConfig[ sKey ] = sVal ;
+ }
+}
+
+FCKConfig.LoadPageConfig = function()
+{
+ for ( var sKey in this.PageConfig )
+ FCKConfig[ sKey ] = this.PageConfig[ sKey ] ;
+}
+
+// Define toolbar sets collection.
+FCKConfig.ToolbarSets = new Object() ;
+
+// Defines the plugins collection.
+FCKConfig.Plugins = new Object() ;
+FCKConfig.Plugins.Items = new Array() ;
+
+FCKConfig.Plugins.Add = function( name, langs, path )
+{
+ FCKConfig.Plugins.Items.addItem( [name, langs, path] ) ;
+}
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fckcontextmenu.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fckcontextmenu.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fckcontextmenu.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,232 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fckcontextmenu.js
+ * Defines the FCKContextMenu object that is responsible for all
+ * Context Menu operations.
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+var FCKContextMenu = new Object() ;
+
+// This property is internally used to indicate that the context menu has been created.
+FCKContextMenu._IsLoaded = false ;
+
+// This method creates the context menu inside a DIV tag. Take a look at the end of this file for a sample output.
+FCKContextMenu.Reload = function()
+{
+ // Create the Main DIV that holds the Context Menu.
+ this._Div = this._Document.createElement( 'DIV' ) ;
+ this._Div.className = 'CM_ContextMenu' ;
+ this._Div.style.position = 'absolute' ;
+ this._Div.style.visibility = 'hidden' ;
+ this._Document.body.appendChild( this._Div );
+
+ // Create the main table for the menu items.
+ var oTable = this._Document.createElement( 'TABLE' ) ;
+ oTable.cellSpacing = 0 ;
+ oTable.cellPadding = 0 ;
+ oTable.border = 0 ;
+ this._Div.appendChild( oTable ) ;
+
+ // Load all configured groups.
+ this.Groups = new Object() ;
+
+ for ( var i = 0 ; i < FCKConfig.ContextMenu.length ; i++ )
+ {
+ var sGroup = FCKConfig.ContextMenu[i] ;
+ this.Groups[ sGroup ] = this._GetGroup( sGroup ) ;
+ this.Groups[ sGroup ].CreateTableRows( oTable ) ;
+ }
+
+ this._IsLoaded = true ;
+}
+
+FCKContextMenu._GetGroup = function( groupName )
+{
+ var oGroup ;
+
+ switch ( groupName )
+ {
+ case 'Generic' :
+ // Generic items that are always available.
+ oGroup = new FCKContextMenuGroup() ;
+ with ( oGroup )
+ {
+ Add( new FCKContextMenuItem( this, 'Cut' , FCKLang.Cut , true ) ) ;
+ Add( new FCKContextMenuItem( this, 'Copy' , FCKLang.Copy , true ) ) ;
+ Add( new FCKContextMenuItem( this, 'Paste' , FCKLang.Paste , true ) ) ;
+ }
+
+ break ;
+
+ case 'Link' :
+ oGroup = new FCKContextMenuGroup() ;
+ with ( oGroup )
+ {
+ Add( new FCKContextMenuSeparator() ) ;
+ Add( new FCKContextMenuItem( this, 'Link' , FCKLang.EditLink , true ) ) ;
+ Add( new FCKContextMenuItem( this, 'Unlink' , FCKLang.RemoveLink, true ) ) ;
+ }
+
+ break ;
+
+ case 'TableCell' :
+ oGroup = new FCKContextMenuGroup() ;
+ with ( oGroup )
+ {
+ Add( new FCKContextMenuSeparator() ) ;
+ Add( new FCKContextMenuItem( this, 'TableInsertRow' , FCKLang.InsertRow, true ) ) ;
+ Add( new FCKContextMenuItem( this, 'TableDeleteRows' , FCKLang.DeleteRows, true ) ) ;
+ Add( new FCKContextMenuSeparator() ) ;
+ Add( new FCKContextMenuItem( this, 'TableInsertColumn' , FCKLang.InsertColumn, true ) ) ;
+ Add( new FCKContextMenuItem( this, 'TableDeleteColumns' , FCKLang.DeleteColumns, true ) ) ;
+ Add( new FCKContextMenuSeparator() ) ;
+ Add( new FCKContextMenuItem( this, 'TableInsertCell' , FCKLang.InsertCell, true ) ) ;
+ Add( new FCKContextMenuItem( this, 'TableDeleteCells' , FCKLang.DeleteCells, true ) ) ;
+ Add( new FCKContextMenuItem( this, 'TableMergeCells' , FCKLang.MergeCells, true ) ) ;
+ Add( new FCKContextMenuItem( this, 'TableSplitCell' , FCKLang.SplitCell, true ) ) ;
+ Add( new FCKContextMenuSeparator() ) ;
+ Add( new FCKContextMenuItem( this, 'TableCellProp' , FCKLang.CellProperties, true ) ) ;
+ Add( new FCKContextMenuItem( this, 'TableProp' , FCKLang.TableProperties, true ) ) ;
+ }
+
+ break ;
+
+ case 'Table' :
+ return new FCKContextMenuGroup( true, this, 'Table', FCKLang.TableProperties, true ) ;
+
+ case 'Image' :
+ return new FCKContextMenuGroup( true, this, 'Image', FCKLang.ImageProperties, true ) ;
+
+ case 'Form' :
+ return new FCKContextMenuGroup( true, this, 'Form', FCKLang.FormProp, true ) ;
+
+ case 'Checkbox' :
+ return new FCKContextMenuGroup( true, this, 'Checkbox', FCKLang.CheckboxProp, true ) ;
+
+ case 'Radio' :
+ return new FCKContextMenuGroup( true, this, 'Radio', FCKLang.RadioButtonProp, true ) ;
+
+ case 'TextField' :
+ return new FCKContextMenuGroup( true, this, 'TextField', FCKLang.TextFieldProp, true ) ;
+
+ case 'HiddenField' :
+ return new FCKContextMenuGroup( true, this, 'HiddenField', FCKLang.HiddenFieldProp, true ) ;
+
+ case 'ImageButton' :
+ return new FCKContextMenuGroup( true, this, 'ImageButton', FCKLang.ImageButtonProp, true ) ;
+
+ case 'Button' :
+ return new FCKContextMenuGroup( true, this, 'Button', FCKLang.ButtonProp, true ) ;
+
+ case 'Select' :
+ return new FCKContextMenuGroup( true, this, 'Select', FCKLang.SelectionFieldProp, true ) ;
+
+ case 'Textarea' :
+ return new FCKContextMenuGroup( true, this, 'Textarea', FCKLang.TextareaProp, true ) ;
+
+ case 'BulletedList' :
+ return new FCKContextMenuGroup( true, this, 'BulletedList', FCKLang.BulletedListProp, true ) ;
+
+ case 'NumberedList' :
+ return new FCKContextMenuGroup( true, this, 'NumberedList', FCKLang.NumberedListProp, true ) ;
+
+ case 'Anchor' :
+ return new FCKContextMenuGroup( true, this, 'Anchor', FCKLang.AnchorProp, true ) ;
+ }
+
+ return oGroup ;
+}
+
+FCKContextMenu.RefreshState = function()
+{
+ // Get the actual selected tag (if any).
+ var oTag = FCKSelection.GetSelectedElement() ;
+ var sTagName ;
+
+ if ( oTag )
+ {
+ sTagName = oTag.tagName ;
+ }
+
+ // Set items visibility.
+
+ var bIsAnchor = ( sTagName == 'A' && oTag.name.length > 0 && oTag.href.length == 0 ) ;
+
+ if ( this.Groups['Anchor'] ) this.Groups['Anchor'].SetVisible( bIsAnchor ) ;
+ if ( this.Groups['Link'] ) this.Groups['Link'].SetVisible( !bIsAnchor && FCK.GetNamedCommandState( 'Unlink' ) != FCK_TRISTATE_DISABLED ) ;
+
+ if ( this.Groups['TableCell'] ) this.Groups['TableCell'].SetVisible( sTagName != 'TABLE' && FCKSelection.HasAncestorNode('TABLE') ) ;
+ if ( this.Groups['Table'] ) this.Groups['Table'].SetVisible( sTagName == 'TABLE' ) ;
+ if ( this.Groups['Image'] ) this.Groups['Image'].SetVisible( sTagName == 'IMG' ) ;
+
+ if ( this.Groups['BulletedList'] ) this.Groups['BulletedList'].SetVisible( FCKSelection.HasAncestorNode('UL') ) ;
+ if ( this.Groups['NumberedList'] ) this.Groups['NumberedList'].SetVisible( FCKSelection.HasAncestorNode('OL') ) ;
+
+ if ( this.Groups['Select'] ) this.Groups['Select'].SetVisible( sTagName == 'SELECT' ) ;
+ if ( this.Groups['Textarea'] ) this.Groups['Textarea'].SetVisible( sTagName == 'TEXTAREA' ) ;
+ if ( this.Groups['Form'] ) this.Groups['Form'].SetVisible( FCKSelection.HasAncestorNode('FORM') ) ;
+ if ( this.Groups['Checkbox'] ) this.Groups['Checkbox'].SetVisible( sTagName == 'INPUT' && oTag.type == 'checkbox' ) ;
+ if ( this.Groups['Radio'] ) this.Groups['Radio'].SetVisible( sTagName == 'INPUT' && oTag.type == 'radio' ) ;
+ if ( this.Groups['TextField'] ) this.Groups['TextField'].SetVisible( sTagName == 'INPUT' && ( oTag.type == 'text' || oTag.type == 'password' ) ) ;
+ if ( this.Groups['HiddenField'] ) this.Groups['HiddenField'].SetVisible( sTagName == 'INPUT' && oTag.type == 'hidden' ) ;
+ if ( this.Groups['ImageButton'] ) this.Groups['ImageButton'].SetVisible( sTagName == 'INPUT' && oTag.type == 'image' ) ;
+ if ( this.Groups['Button'] ) this.Groups['Button'].SetVisible( sTagName == 'INPUT' && ( oTag.type == 'button' || oTag.type == 'submit' || oTag.type == 'reset' ) ) ;
+
+ // Refresh the state of all visible items (active/disactive)
+ for ( var o in this.Groups )
+ {
+ this.Groups[o].RefreshState() ;
+ }
+}
+
+/*
+Sample Context Menu Output
+-----------------------------------------
+
+*/
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fckcontextmenu_gecko.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fckcontextmenu_gecko.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fckcontextmenu_gecko.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,88 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fckcontextmenu_gecko.js
+ * Context Menu operations. (Gecko specific implementations)
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+// The Context Menu CSS must be added to the parent document.
+FCKTools.AppendStyleSheet( window.parent.document, FCKConfig.SkinPath + 'fck_contextmenu.css' ) ;
+
+FCKContextMenu.Show = function( x, y )
+{
+ if ( ! this._Document )
+ {
+ this._Document = window.parent.document ;
+ }
+
+ // Create the context menu if needed.
+ if ( !this._IsLoaded )
+ {
+ this.Reload() ;
+ this._Div.style.zIndex = 10000 ;
+ this._Div.oncontextmenu = function() { return false ; }
+ }
+
+ this.RefreshState() ;
+
+ // Get the editor area and editor frames positions.
+ var oCoordsA = FCKTools.GetElementPosition( FCK.EditorWindow.frameElement ) ;
+ var oCoordsB = FCKTools.GetElementPosition( window.frameElement ) ;
+
+ x += oCoordsA.X + oCoordsB.X ;
+ y += oCoordsA.Y + oCoordsB.Y ;
+
+ // Verifies if the context menu is completely visible.
+ var iXSpace = x + this._Div.offsetWidth - this._Div.ownerDocument.defaultView.innerWidth ;
+ var iYSpace = y + this._Div.offsetHeight - this._Div.ownerDocument.defaultView.innerHeight ;
+
+ if ( iXSpace > 0 ) x -= this._Div.offsetWidth ;
+ if ( iYSpace > 0 ) y -= this._Div.offsetHeight ;
+
+ // Set the context menu DIV in the specified location.
+ this._Div.style.left = x + 'px' ;
+ this._Div.style.top = y + 'px' ;
+
+ // Watch the "OnClick" event for all windows to close the Context Menu.
+ var oActualWindow = FCK.EditorWindow ;
+ while ( oActualWindow )
+ {
+ oActualWindow.document.addEventListener( 'click', FCKContextMenu._OnDocumentClick, false ) ;
+ if ( oActualWindow != oActualWindow.parent )
+ oActualWindow = oActualWindow.parent ;
+ else if ( oActualWindow.opener == null )
+ oActualWindow = oActualWindow.opener ;
+ else
+ break ;
+ }
+
+ // Show it.
+ this._Div.style.visibility = '' ;
+}
+
+FCKContextMenu._OnDocumentClick = function( event )
+{
+ var e = event.target ;
+ while ( e )
+ {
+ if ( e == FCKContextMenu._Div ) return ;
+ e = e.parentNode ;
+ }
+ FCKContextMenu.Hide() ;
+}
+
+FCKContextMenu.Hide = function()
+{
+ this._Div.style.visibility = 'hidden' ;
+ this._Div.style.left = this._Div.style.top = '1px' ;
+}
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fckcontextmenu_ie.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fckcontextmenu_ie.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fckcontextmenu_ie.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,69 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fckcontextmenu_ie.js
+ * Context Menu operations. (IE specific implementations)
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+function FCKContextMenu_OnContextMenu() { return false ; }
+
+FCKContextMenu.Show = function( x, y )
+{
+ // Create the Popup used to show the menu (this is a IE 5.5+ feature).
+ if ( ! this._Popup )
+ {
+ this._Popup = window.createPopup() ;
+ this._Document = this._Popup.document ;
+ this._Document.createStyleSheet( FCKConfig.SkinPath + 'fck_contextmenu.css' ) ;
+ this._Document.oncontextmenu = FCKContextMenu_OnContextMenu ;
+
+ aCleanupDocs[ aCleanupDocs.length ] = this._Document ;
+ }
+
+ // Create the context menu if needed.
+ if ( !this._IsLoaded )
+ {
+ this.Reload() ;
+ this._Div.style.visibility = '' ;
+ }
+
+ this.RefreshState() ;
+
+ // IE doens't get the offsetWidth and offsetHeight values if the element is not visible.
+ // So the Popup must be "shown" with no size to be able to get these values.
+ this._Popup.show( x, y, 0, 0 ) ;
+
+ // This was the previous solution. It works well to.
+ // So a temporary element is created to get this for us.
+ /*
+ if ( !this._DivCopy )
+ {
+ this._DivCopy = document.createElement( 'DIV' ) ;
+ this._DivCopy.className = 'CM_ContextMenu' ;
+ this._DivCopy.style.position = 'absolute' ;
+ this._DivCopy.style.visibility = 'hidden' ;
+ document.body.appendChild( this._DivCopy );
+ }
+
+ this._DivCopy.innerHTML = this._Div.innerHTML ;
+ */
+
+ // Show the Popup at the specified location.
+ this._Popup.show( x, y, this._Div.offsetWidth, this._Div.offsetHeight ) ;
+}
+
+FCKContextMenu.Hide = function()
+{
+ if ( this._Popup )
+ this._Popup.hide() ;
+}
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fckcoreextensions.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fckcoreextensions.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fckcoreextensions.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,84 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fckcoreextensions.js
+ * Some extensions to the Javascript Core.
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+// Extends the Array object, creating a "addItem" method on it.
+Array.prototype.addItem = function( item )
+{
+ var i = this.length ;
+ this[ i ] = item ;
+ return i ;
+}
+
+Array.prototype.indexOf = function( value )
+{
+ for ( var i = 0 ; i < this.length ; i++ )
+ {
+ if ( this[i] == value )
+ return i ;
+ }
+ return -1 ;
+}
+
+String.prototype.startsWith = function( value )
+{
+ return ( this.substr( 0, value.length ) == value ) ;
+}
+
+// Extends the String object, creating a "endsWith" method on it.
+String.prototype.endsWith = function( value )
+{
+ var L1 = this.length ;
+ var L2 = value.length ;
+
+ if ( L2 > L1 )
+ return false ;
+
+ return ( L2 == 0 || this.substr( L1 - L2, L2 ) == value ) ;
+}
+
+String.prototype.remove = function( start, length )
+{
+ var s = '' ;
+
+ if ( start > 0 )
+ s = this.substring( 0, start ) ;
+
+ if ( start + length < this.length )
+ s += this.substring( start + length , this.length ) ;
+
+ return s ;
+}
+
+String.prototype.trim = function()
+{
+ return this.replace( /(^\s*)|(\s*$)/g, '' ) ;
+}
+
+String.prototype.ltrim = function()
+{
+ return this.replace( /^\s*/g, '' ) ;
+}
+
+String.prototype.rtrim = function()
+{
+ return this.replace( /\s*$/g, '' ) ;
+}
+
+String.prototype.replaceNewLineChars = function( replacement )
+{
+ return this.replace( /\n/g, replacement ) ;
+}
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fckdebug.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fckdebug.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fckdebug.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,37 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fckdebug.js
+ * Debug window control and operations.
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+var FCKDebug = new Object() ;
+
+if ( FCKConfig.Debug )
+{
+ FCKDebug.Output = function( message, color )
+ {
+ if ( ! FCKConfig.Debug ) return ;
+
+ if ( message != null && isNaN( message ) )
+ message = message.replace(/= 5 )
+ {
+ sUserLang = sUserLang.substr(0,5) ;
+ if ( this.AvailableLanguages[sUserLang] ) return sUserLang ;
+ }
+
+ // If the user's browser is set to, for example, "pt-br" but only the
+ // "pt" language file is available then get that file.
+ if ( sUserLang.length >= 2 )
+ {
+ sUserLang = sUserLang.substr(0,2) ;
+ if ( this.AvailableLanguages[sUserLang] ) return sUserLang ;
+ }
+ }
+
+ return this.DefaultLanguage ;
+}
+
+FCKLanguageManager.TranslateElements = function( targetDocument, tag, propertyToSet )
+{
+ var aInputs = targetDocument.getElementsByTagName(tag) ;
+
+ for ( var i = 0 ; i < aInputs.length ; i++ )
+ {
+ var sKey = aInputs[i].getAttribute( 'fckLang' ) ;
+
+ if ( sKey )
+ {
+ var s = FCKLang[ sKey ] ;
+ if ( s )
+ eval( 'aInputs[i].' + propertyToSet + ' = s' ) ;
+ }
+ }
+}
+
+FCKLanguageManager.TranslatePage = function( targetDocument )
+{
+ this.TranslateElements( targetDocument, 'INPUT', 'value' ) ;
+ this.TranslateElements( targetDocument, 'SPAN', 'innerHTML' ) ;
+ this.TranslateElements( targetDocument, 'LABEL', 'innerHTML' ) ;
+ this.TranslateElements( targetDocument, 'OPTION', 'innerHTML' ) ;
+}
+
+if ( FCKLanguageManager.AvailableLanguages[ FCKConfig.DefaultLanguage ] )
+ FCKLanguageManager.DefaultLanguage = FCKConfig.DefaultLanguage ;
+else
+ FCKLanguageManager.DefaultLanguage = 'en' ;
+
+FCKLanguageManager.ActiveLanguage = new Object() ;
+FCKLanguageManager.ActiveLanguage.Code = FCKLanguageManager.GetActiveLanguage() ;
+FCKLanguageManager.ActiveLanguage.Name = FCKLanguageManager.AvailableLanguages[ FCKLanguageManager.ActiveLanguage.Code ] ;
+
+FCK.Language = FCKLanguageManager ;
+
+// Load the language file and start the editor.
+LoadLanguageFile() ;
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fcknamespace.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fcknamespace.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fcknamespace.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,25 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fcknamespace.js
+ * This file declares the namespace (object holder) where the common editor
+ * objects and classes are defined.
+ * The namespace is located in the page the editor is running on, so it is
+ * shared by all editor instances.
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+var NS ;
+
+if ( !( NS = window.parent.__FCKeditorNS ) )
+ NS = window.parent.__FCKeditorNS = new Object() ;
+
Index: lams_central/web/fckeditor/editor/_source/internals/fckplugins.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fckplugins.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fckplugins.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,42 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fckplugins.js
+ * Defines the FCKPlugins object that is responsible for loading the Plugins.
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+var FCKPlugins = FCK.Plugins = new Object() ;
+FCKPlugins.ItemsCount = 0 ;
+FCKPlugins.Loaded = false ;
+FCKPlugins.Items = new Object() ;
+
+// Set the defined plugins scripts paths.
+for ( var i = 0 ; i < FCKConfig.Plugins.Items.length ; i++ )
+{
+ var oItem = FCKConfig.Plugins.Items[i] ;
+ FCKPlugins.Items[ oItem[0] ] = new FCKPlugin( oItem[0], oItem[1], oItem[2] ) ;
+ FCKPlugins.ItemsCount++ ;
+}
+
+FCKPlugins.Load = function()
+{
+ // Load all items.
+ for ( var s in this.Items )
+ this.Items[s].Load() ;
+
+ // Mark as loaded.
+ this.Loaded = true ;
+
+ // This is a self destroyable function (must be called once).
+ FCKPlugins.Load = null ;
+}
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fckregexlib.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fckregexlib.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fckregexlib.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,49 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fckregexlib.js
+ * These are some Regular Expresions used by the editor.
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+var FCKRegexLib = new Object() ;
+
+// This is the Regular expression used by the SetHTML method for the "'" entity.
+FCKRegexLib.AposEntity = /'/gi ;
+
+// Used by the Styles combo to identify styles that can't be applied to text.
+FCKRegexLib.ObjectElements = /^(?:IMG|TABLE|TR|TD|INPUT|SELECT|TEXTAREA|HR|OBJECT)$/i ;
+
+// Block Elements.
+FCKRegexLib.BlockElements = /^(?:P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI)$/i ;
+
+// Elements marked as empty "Empty" in the XHTML DTD.
+FCKRegexLib.EmptyElements = /^(?:BASE|META|LINK|HR|BR|PARAM|IMG|AREA|INPUT)$/i ;
+
+// List all named commands (commands that can be interpreted by the browser "execCommand" method.
+FCKRegexLib.NamedCommands = /^(?:Cut|Copy|Paste|Print|SelectAll|RemoveFormat|Unlink|Undo|Redo|Bold|Italic|Underline|StrikeThrough|Subscript|Superscript|JustifyLeft|JustifyCenter|JustifyRight|JustifyFull|Outdent|Indent|InsertOrderedList|InsertUnorderedList|InsertHorizontalRule)$/i ;
+
+FCKRegexLib.BodyContents = /([\s\S]*\]*\>)([\s\S]*)(\<\/body\>[\s\S]*)/i ;
+
+// Temporary text used to solve some browser specific limitations.
+FCKRegexLib.ToReplace = /___fcktoreplace:([\w]+)/ig ;
+
+// Get the META http-equiv attribute from the tag.
+FCKRegexLib.MetaHttpEquiv = /http-equiv\s*=\s*["']?([^"' ]+)/i ;
+
+FCKRegexLib.HasBaseTag = / /i ;
+
+FCKRegexLib.TableBorderClass = /\s*FCK__ShowTableBorders\s*/ ;
+
+FCKRegexLib.ElementName = /^[A-Za-z_:][\w.-:]*$/ ;
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fckscriptloader.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fckscriptloader.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fckscriptloader.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,112 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fckscriptloader.js
+ * Defines the FCKScriptLoader object that is used to dynamically load
+ * scripts in the editor.
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+// This object is used to download scripts and css files sequentialy.
+// A file download is not started until the previous file was not completelly
+// downloaded.
+var FCKScriptLoader = new Object() ;
+FCKScriptLoader.IsLoading = false ;
+FCKScriptLoader.Queue = new Array() ;
+
+// Adds a script or css to the queue.
+FCKScriptLoader.AddScript = function( scriptPath )
+{
+ FCKScriptLoader.Queue[ FCKScriptLoader.Queue.length ] = scriptPath ;
+
+ if ( !this.IsLoading )
+ this.CheckQueue() ;
+}
+
+// Checks the queue to see if there is something to load.
+// This function should not be called by code. It's a internal function
+// that's called recursively.
+FCKScriptLoader.CheckQueue = function()
+{
+ // Check if the queue is not empty.
+ if ( this.Queue.length > 0 )
+ {
+ this.IsLoading = true ;
+
+ // Get the first item in the queue
+ var sScriptPath = this.Queue[0] ;
+
+ // Removes the first item from the queue
+ var oTempArray = new Array() ;
+ for ( i = 1 ; i < this.Queue.length ; i++ )
+ oTempArray[ i - 1 ] = this.Queue[ i ] ;
+ this.Queue = oTempArray ;
+
+// window.status = ( 'Loading ' + sScriptPath + '...' ) ;
+
+ // Dynamically load the file (it can be a CSS or a JS)
+ var e ;
+
+ // If is a CSS
+ if ( sScriptPath.lastIndexOf( '.css' ) > 0 )
+ {
+ e = document.createElement( 'LINK' ) ;
+ e.rel = 'stylesheet' ;
+ e.type = 'text/css' ;
+ }
+ // It is a JS
+ else
+ {
+ e = document.createElement( "script" ) ;
+ e.type = "text/javascript" ;
+ }
+
+ // Add the new object to the HEAD.
+ document.getElementsByTagName("head")[0].appendChild( e ) ;
+
+ // Start downloading it.
+ if ( e.tagName == 'LINK' )
+ {
+ // IE must wait for the file to be downloaded.
+ if ( FCKBrowserInfo.IsIE )
+ e.onload = FCKScriptLoader_OnLoad ;
+ // Gecko doens't fire any event when the CSS is loaded, so we
+ // can't wait for it.
+ else
+ FCKScriptLoader.CheckQueue() ;
+
+ e.href = sScriptPath ;
+ }
+ else
+ {
+ // Gecko fires the "onload" event and IE fires "onreadystatechange"
+ e.onload = e.onreadystatechange = FCKScriptLoader_OnLoad ;
+ e.src = sScriptPath ;
+ }
+ }
+ else
+ {
+ this.IsLoading = false ;
+
+ // Call the "OnEmpty" event.
+ if ( this.OnEmpty )
+ this.OnEmpty() ;
+ }
+}
+
+function FCKScriptLoader_OnLoad()
+{
+ // Gecko doesn't have a "readyState" property
+ if ( this.tagName == 'LINK' || !this.readyState || this.readyState == 'loaded' )
+ // Load the next script available in the queue
+ FCKScriptLoader.CheckQueue() ;
+}
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fckselection.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fckselection.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fckselection.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,20 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fckselection.js
+ * Active selection functions.
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+var FCKSelection = new Object() ;
+
+FCK.Selection = FCKSelection ;
Index: lams_central/web/fckeditor/editor/_source/internals/fckselection_gecko.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fckselection_gecko.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fckselection_gecko.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,137 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fckselection_gecko.js
+ * Active selection functions. (Gecko specific implementation)
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+// Get the selection type (like document.select.type in IE).
+FCKSelection.GetType = function()
+{
+// if ( ! this._Type )
+// {
+ // By default set the type to "Text".
+ this._Type = 'Text' ;
+
+ // Check if the actual selection is a Control (IMG, TABLE, HR, etc...).
+ var oSel = FCK.EditorWindow.getSelection() ;
+ if ( oSel && oSel.rangeCount == 1 )
+ {
+ var oRange = oSel.getRangeAt(0) ;
+ if ( oRange.startContainer == oRange.endContainer && (oRange.endOffset - oRange.startOffset) == 1 )
+ this._Type = 'Control' ;
+ }
+// }
+ return this._Type ;
+}
+
+// Retrieves the selected element (if any), just in the case that a single
+// element (object like and image or a table) is selected.
+FCKSelection.GetSelectedElement = function()
+{
+ if ( this.GetType() == 'Control' )
+ {
+ var oSel = FCK.EditorWindow.getSelection() ;
+ return oSel.anchorNode.childNodes[ oSel.anchorOffset ] ;
+ }
+}
+
+FCKSelection.GetParentElement = function()
+{
+ if ( this.GetType() == 'Control' )
+ return FCKSelection.GetSelectedElement().parentElement ;
+ else
+ {
+ var oSel = FCK.EditorWindow.getSelection() ;
+ if ( oSel )
+ {
+ var oNode = oSel.anchorNode ;
+
+ while ( oNode && oNode.nodeType != 1 )
+ oNode = oNode.parentNode ;
+
+ return oNode ;
+ }
+ }
+}
+
+FCKSelection.SelectNode = function( element )
+{
+ FCK.Focus() ;
+
+ var oRange = FCK.EditorDocument.createRange() ;
+ oRange.selectNode( element ) ;
+
+ var oSel = FCK.EditorWindow.getSelection() ;
+ oSel.removeAllRanges() ;
+ oSel.addRange( oRange ) ;
+}
+
+FCKSelection.Collapse = function( toStart )
+{
+ var oSel = FCK.EditorWindow.getSelection() ;
+
+ if ( toStart == null || toStart === true )
+ oSel.collapseToStart() ;
+ else
+ oSel.collapseToEnd() ;
+}
+
+// The "nodeTagName" parameter must be Upper Case.
+FCKSelection.HasAncestorNode = function( nodeTagName )
+{
+ var oContainer = this.GetSelectedElement() ;
+ if ( ! oContainer && FCK.EditorWindow )
+ {
+ try { oContainer = FCK.EditorWindow.getSelection().getRangeAt(0).startContainer ; }
+ catch(e){}
+ }
+
+ while ( oContainer )
+ {
+ if ( oContainer.tagName == nodeTagName ) return true ;
+ oContainer = oContainer.parentNode ;
+ }
+
+ return false ;
+}
+
+// The "nodeTagName" parameter must be Upper Case.
+FCKSelection.MoveToAncestorNode = function( nodeTagName )
+{
+ var oNode ;
+
+ var oContainer = this.GetSelectedElement() ;
+ if ( ! oContainer )
+ oContainer = FCK.EditorWindow.getSelection().getRangeAt(0).startContainer ;
+
+ while ( oContainer )
+ {
+ if ( oContainer.tagName == nodeTagName ) return oContainer ;
+ oContainer = oContainer.parentNode ;
+ }
+}
+
+FCKSelection.Delete = function()
+{
+ // Gets the actual selection.
+ var oSel = FCK.EditorWindow.getSelection() ;
+
+ // Deletes the actual selection contents.
+ for ( var i = 0 ; i < oSel.rangeCount ; i++ )
+ {
+ oSel.getRangeAt(i).deleteContents() ;
+ }
+
+ return oSel ;
+}
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fckselection_ie.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fckselection_ie.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fckselection_ie.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,127 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fckselection_ie.js
+ * Active selection functions. (IE specific implementation)
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+// Get the selection type.
+FCKSelection.GetType = function()
+{
+ return FCK.EditorDocument.selection.type ;
+}
+
+// Retrieves the selected element (if any), just in the case that a single
+// element (object like and image or a table) is selected.
+FCKSelection.GetSelectedElement = function()
+{
+ if ( this.GetType() == 'Control' )
+ {
+ var oRange = FCK.EditorDocument.selection.createRange() ;
+
+ if ( oRange && oRange.item )
+ return FCK.EditorDocument.selection.createRange().item(0) ;
+ }
+}
+
+FCKSelection.GetParentElement = function()
+{
+ if ( this.GetType() == 'Control' )
+ return FCKSelection.GetSelectedElement().parentElement ;
+ else
+ return FCK.EditorDocument.selection.createRange().parentElement() ;
+}
+
+FCKSelection.SelectNode = function( node )
+{
+ FCK.Focus() ;
+ FCK.EditorDocument.selection.empty() ;
+ var oRange = FCK.EditorDocument.selection.createRange() ;
+ oRange.moveToElementText( node ) ;
+ oRange.select() ;
+}
+
+FCKSelection.Collapse = function( toStart )
+{
+ FCK.Focus() ;
+ var oRange = FCK.EditorDocument.selection.createRange() ;
+ oRange.collapse( toStart == null || toStart === true ) ;
+ oRange.select() ;
+}
+
+// The "nodeTagName" parameter must be Upper Case.
+FCKSelection.HasAncestorNode = function( nodeTagName )
+{
+ var oContainer ;
+
+ if ( FCK.EditorDocument.selection.type == "Control" )
+ {
+ oContainer = this.GetSelectedElement() ;
+ }
+ else
+ {
+ var oRange = FCK.EditorDocument.selection.createRange() ;
+ oContainer = oRange.parentElement() ;
+ }
+
+ while ( oContainer )
+ {
+ if ( oContainer.tagName == nodeTagName ) return true ;
+ oContainer = oContainer.parentNode ;
+ }
+
+ return false ;
+}
+
+// The "nodeTagName" parameter must be UPPER CASE.
+FCKSelection.MoveToAncestorNode = function( nodeTagName )
+{
+ var oNode ;
+
+ if ( FCK.EditorDocument.selection.type == "Control" )
+ {
+ var oRange = FCK.EditorDocument.selection.createRange() ;
+ for ( i = 0 ; i < oRange.length ; i++ )
+ {
+ if (oRange(i).parentNode)
+ {
+ oNode = oRange(i).parentNode ;
+ break ;
+ }
+ }
+ }
+ else
+ {
+ var oRange = FCK.EditorDocument.selection.createRange() ;
+ oNode = oRange.parentElement() ;
+ }
+
+ while ( oNode && oNode.nodeName != nodeTagName )
+ oNode = oNode.parentNode ;
+
+ return oNode ;
+}
+
+FCKSelection.Delete = function()
+{
+ // Gets the actual selection.
+ var oSel = FCK.EditorDocument.selection ;
+
+ // Deletes the actual selection contents.
+ if ( oSel.type.toLowerCase() != "none" )
+ {
+ oSel.clear() ;
+ }
+
+ return oSel ;
+}
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fcktablehandler.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fcktablehandler.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fcktablehandler.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,350 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fcktablehandler.js
+ * Manage table operations.
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+var FCKTableHandler = new Object() ;
+
+FCKTableHandler.InsertRow = function()
+{
+ // Get the row where the selection is placed in.
+ var oRow = FCKSelection.MoveToAncestorNode("TR") ;
+ if ( !oRow ) return ;
+
+ // Create a clone of the row.
+ var oNewRow = oRow.cloneNode( true ) ;
+
+ // Insert the new row (copy) before of it.
+ oRow.parentNode.insertBefore( oNewRow, oRow ) ;
+
+ // Clean the row (it seems that the new row has been added after it).
+ FCKTableHandler.ClearRow( oRow ) ;
+}
+
+FCKTableHandler.DeleteRows = function( row )
+{
+ // If no row has been passed as a parameer,
+ // then get the row where the selection is placed in.
+ if ( !row )
+ row = FCKSelection.MoveToAncestorNode("TR") ;
+ if ( !row ) return ;
+
+ // Get the row's table.
+ var oTable = FCKTools.GetElementAscensor( row, 'TABLE' ) ;
+
+ // If just one row is available then delete the entire table.
+ if ( oTable.rows.length == 1 )
+ {
+ FCKTableHandler.DeleteTable( oTable ) ;
+ return ;
+ }
+
+ // Delete the row.
+ row.parentNode.removeChild( row ) ;
+}
+
+FCKTableHandler.DeleteTable = function( table )
+{
+ // If no table has been passed as a parameer,
+ // then get the table where the selection is placed in.
+ if ( !table )
+ table = FCKSelection.MoveToAncestorNode("TABLE") ;
+ if ( !table ) return ;
+
+ // Delete the table.
+ table.parentNode.removeChild( table ) ;
+}
+
+FCKTableHandler.InsertColumn = function()
+{
+ // Get the cell where the selection is placed in.
+ var oCell = FCKSelection.MoveToAncestorNode("TD") ;
+ if ( !oCell ) return ;
+
+ // Get the cell's table.
+ var oTable = FCKTools.GetElementAscensor( oCell, 'TABLE' ) ;
+
+ // Get the index of the column to be created (based on the cell).
+ var iIndex = oCell.cellIndex + 1 ;
+
+ // Loop throw all rows available in the table.
+ for ( var i = 0 ; i < oTable.rows.length ; i++ )
+ {
+ // Get the row.
+ var oRow = oTable.rows[i] ;
+
+ // If the row doens't have enought cells, ignore it.
+ if ( oRow.cells.length < iIndex )
+ continue ;
+
+ // Create the new cell element to be added.
+ oCell = FCK.EditorDocument.createElement('TD') ;
+ oCell.innerHTML = ' ' ;
+
+ // Get the cell that is placed in the new cell place.
+ var oBaseCell = oRow.cells[iIndex] ;
+
+ // If the cell is available (we are not in the last cell of the row).
+ if ( oBaseCell )
+ {
+ // Insert the new cell just before of it.
+ oRow.insertBefore( oCell, oBaseCell ) ;
+ }
+ else
+ {
+ // Append the cell at the end of the row.
+ oRow.appendChild( oCell ) ;
+ }
+ }
+}
+
+FCKTableHandler.DeleteColumns = function()
+{
+ // Get the cell where the selection is placed in.
+ var oCell = FCKSelection.MoveToAncestorNode("TD") ;
+ if ( !oCell ) return ;
+
+ // Get the cell's table.
+ var oTable = FCKTools.GetElementAscensor( oCell, 'TABLE' ) ;
+
+ // Get the cell index.
+ var iIndex = oCell.cellIndex ;
+
+ // Loop throw all rows (from down to up, because it's possible that some
+ // rows will be deleted).
+ for ( var i = oTable.rows.length - 1 ; i >= 0 ; i-- )
+ {
+ // Get the row.
+ var oRow = oTable.rows[i] ;
+
+ // If the cell to be removed is the first one and the row has just one cell.
+ if ( iIndex == 0 && oRow.cells.length == 1 )
+ {
+ // Remove the entire row.
+ FCKTableHandler.DeleteRows( oRow ) ;
+ continue ;
+ }
+
+ // If the cell to be removed exists the delete it.
+ if ( oRow.cells[iIndex] )
+ oRow.removeChild( oRow.cells[iIndex] ) ;
+ }
+}
+
+FCKTableHandler.InsertCell = function( cell )
+{
+ // Get the cell where the selection is placed in.
+ var oCell = cell ? cell : FCKSelection.MoveToAncestorNode("TD") ;
+ if ( !oCell ) return ;
+
+ // Create the new cell element to be added.
+ var oNewCell = FCK.EditorDocument.createElement("TD");
+ oNewCell.innerHTML = " " ;
+
+ // If it is the last cell in the row.
+ if ( oCell.cellIndex == oCell.parentNode.cells.lenght - 1 )
+ {
+ // Add the new cell at the end of the row.
+ oCell.parentNode.appendChild( oNewCell ) ;
+ }
+ else
+ {
+ // Add the new cell before the next cell (after the active one).
+ oCell.parentNode.insertBefore( oNewCell, oCell.nextSibling ) ;
+ }
+
+ return oNewCell ;
+}
+
+FCKTableHandler.DeleteCell = function( cell )
+{
+ // If this is the last cell in the row.
+ if ( cell.parentNode.cells.length == 1 )
+ {
+ // Delete the entire row.
+ FCKTableHandler.DeleteRows( FCKTools.GetElementAscensor( cell, 'TR' ) ) ;
+ return ;
+ }
+
+ // Delete the cell from the row.
+ cell.parentNode.removeChild( cell ) ;
+}
+
+FCKTableHandler.DeleteCells = function()
+{
+ var aCells = FCKTableHandler.GetSelectedCells() ;
+
+ for ( var i = aCells.length - 1 ; i >= 0 ; i-- )
+ {
+ FCKTableHandler.DeleteCell( aCells[i] ) ;
+ }
+}
+
+FCKTableHandler.MergeCells = function()
+{
+ // Get all selected cells.
+ var aCells = FCKTableHandler.GetSelectedCells() ;
+
+ // At least 2 cells must be selected.
+ if ( aCells.length < 2 )
+ return ;
+
+ // The merge can occour only if the selected cells are from the same row.
+ if ( aCells[0].parentNode != aCells[aCells.length-1].parentNode )
+ return ;
+
+ // Calculate the new colSpan for the first cell.
+ var iColSpan = isNaN( aCells[0].colSpan ) ? 1 : aCells[0].colSpan ;
+
+ var sHtml = '' ;
+
+ for ( var i = aCells.length - 1 ; i > 0 ; i-- )
+ {
+ iColSpan += isNaN( aCells[i].colSpan ) ? 1 : aCells[i].colSpan ;
+
+ // Append the HTML of each cell.
+ sHtml = aCells[i].innerHTML + sHtml ;
+
+ // Delete the cell.
+ FCKTableHandler.DeleteCell( aCells[i] ) ;
+ }
+
+ // Set the innerHTML of the remaining cell (the first one).
+ aCells[0].colSpan = iColSpan ;
+ aCells[0].innerHTML += sHtml ;
+}
+
+FCKTableHandler.SplitCell = function()
+{
+ // Check that just one cell is selected, otherwise return.
+ var aCells = FCKTableHandler.GetSelectedCells() ;
+ if ( aCells.length != 1 )
+ return ;
+
+ var aMap = this._CreateTableMap( aCells[0].parentNode.parentNode ) ;
+ var iCellIndex = FCKTableHandler._GetCellIndexSpan( aMap, aCells[0].parentNode.rowIndex , aCells[0] ) ;
+
+ var aCollCells = this._GetCollumnCells( aMap, iCellIndex ) ;
+
+ for ( var i = 0 ; i < aCollCells.length ; i++ )
+ {
+ if ( aCollCells[i] == aCells[0] )
+ {
+ var oNewCell = this.InsertCell( aCells[0] ) ;
+ if ( !isNaN( aCells[0].rowSpan ) && aCells[0].rowSpan > 1 )
+ oNewCell.rowSpan = aCells[0].rowSpan ;
+ }
+ else
+ {
+ if ( isNaN( aCollCells[i].colSpan ) )
+ aCollCells[i].colSpan = 2 ;
+ else
+ aCollCells[i].colSpan += 1 ;
+ }
+ }
+}
+
+// Get the cell index from a TableMap.
+FCKTableHandler._GetCellIndexSpan = function( tableMap, rowIndex, cell )
+{
+ if ( tableMap.length < rowIndex + 1 )
+ return ;
+
+ var oRow = tableMap[ rowIndex ] ;
+
+ for ( var c = 0 ; c < oRow.length ; c++ )
+ {
+ if ( oRow[c] == cell )
+ return c ;
+ }
+}
+
+// Get the cells available in a collumn of a TableMap.
+FCKTableHandler._GetCollumnCells = function( tableMap, collumnIndex )
+{
+ var aCollCells = new Array() ;
+
+ for ( var r = 0 ; r < tableMap.length ; r++ )
+ {
+ var oCell = tableMap[r][collumnIndex] ;
+ if ( oCell && ( aCollCells.length == 0 || aCollCells[ aCollCells.length - 1 ] != oCell ) )
+ aCollCells[ aCollCells.length ] = oCell ;
+ }
+
+ return aCollCells ;
+}
+
+// This function is quite hard to explain. It creates a matrix representing all cells in a table.
+// The difference here is that the "spanned" cells (colSpan and rowSpan) are duplicated on the matrix
+// cells that are "spanned". For example, a row with 3 cells where the second cell has colSpan=2 and rowSpan=3
+// will produce a bi-dimensional matrix with the following values (representing the cells):
+// Cell1, Cell2, Cell2, Cell 3
+// Cell4, Cell2, Cell2, Cell 5
+FCKTableHandler._CreateTableMap = function( table )
+{
+ var aRows = table.rows ;
+
+ // Row and Collumn counters.
+ var r = -1 ;
+
+ var aMap = new Array() ;
+
+ for ( var i = 0 ; i < aRows.length ; i++ )
+ {
+ r++ ;
+ if ( !aMap[r] )
+ aMap[r] = new Array() ;
+
+ var c = -1 ;
+
+ for ( var j = 0 ; j < aRows[i].cells.length ; j++ )
+ {
+ var oCell = aRows[i].cells[j] ;
+
+ c++ ;
+ while ( aMap[r][c] )
+ c++ ;
+
+ var iColSpan = isNaN( oCell.colSpan ) ? 1 : oCell.colSpan ;
+ var iRowSpan = isNaN( oCell.rowSpan ) ? 1 : oCell.rowSpan ;
+
+ for ( var rs = 0 ; rs < iRowSpan ; rs++ )
+ {
+ if ( !aMap[r + rs] )
+ aMap[r + rs] = new Array() ;
+
+ for ( var cs = 0 ; cs < iColSpan ; cs++ )
+ {
+ aMap[r + rs][c + cs] = aRows[i].cells[j] ;
+ }
+ }
+
+ c += iColSpan - 1 ;
+ }
+ }
+ return aMap ;
+}
+
+FCKTableHandler.ClearRow = function( tr )
+{
+ // Get the array of row's cells.
+ var aCells = tr.cells ;
+
+ // Replace the contents of each cell with "nbsp;".
+ for ( var i = 0 ; i < aCells.length ; i++ )
+ {
+ aCells[i].innerHTML = ' ' ;
+ }
+}
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fcktablehandler_gecko.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fcktablehandler_gecko.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fcktablehandler_gecko.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,46 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fcktablehandler_gecko.js
+ * Manage table operations (IE specific).
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+FCKTableHandler.GetSelectedCells = function()
+{
+ var aCells = new Array() ;
+
+ var oSelection = FCK.EditorWindow.getSelection() ;
+
+ // If the selection is a text.
+ if ( oSelection.rangeCount == 1 && oSelection.anchorNode.nodeType == 3 )
+ {
+ var oParent = FCKTools.GetElementAscensor( oSelection.anchorNode, 'TD' ) ;
+
+ if ( oParent )
+ {
+ aCells[0] = oParent ;
+ return aCells ;
+ }
+ }
+
+ for ( var i = 0 ; i < oSelection.rangeCount ; i++ )
+ {
+ var oRange = oSelection.getRangeAt(i) ;
+ var oCell = oRange.startContainer.childNodes[ oRange.startOffset ] ;
+
+ if ( oCell.tagName == 'TD' )
+ aCells[aCells.length] = oCell ;
+ }
+
+ return aCells ;
+}
Index: lams_central/web/fckeditor/editor/_source/internals/fcktablehandler_ie.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fcktablehandler_ie.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fcktablehandler_ie.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,51 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fcktablehandler_ie.js
+ * Manage table operations (IE specific).
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+FCKTableHandler.GetSelectedCells = function()
+{
+ var aCells = new Array() ;
+
+ var oRange = FCK.EditorDocument.selection.createRange() ;
+ var oParent = oRange.parentElement() ;
+
+ if ( oParent && oParent.tagName == "TD" )
+ aCells[0] = oParent ;
+ else
+ {
+ var oParent = FCKSelection.MoveToAncestorNode( "TABLE" ) ;
+
+ if ( oParent )
+ {
+ // Loops throw all cells checking if the cell is, or part of it, is inside the selection
+ // and then add it to the selected cells collection.
+ for ( var i = 0 ; i < oParent.cells.length ; i++ )
+ {
+ var oCellRange = FCK.EditorDocument.selection.createRange() ;
+ oCellRange.moveToElementText( oParent.cells[i] ) ;
+
+ if ( oRange.inRange( oCellRange )
+ || ( oRange.compareEndPoints('StartToStart',oCellRange) >= 0 && oRange.compareEndPoints('StartToEnd',oCellRange) <= 0 )
+ || ( oRange.compareEndPoints('EndToStart',oCellRange) >= 0 && oRange.compareEndPoints('EndToEnd',oCellRange) <= 0 ) )
+ {
+ aCells[aCells.length] = oParent.cells[i] ;
+ }
+ }
+ }
+ }
+
+ return aCells ;
+}
Index: lams_central/web/fckeditor/editor/_source/internals/fcktoolbaritems.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fcktoolbaritems.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fcktoolbaritems.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,113 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fcktoolbaritems.js
+ * Toolbar items definitions.
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+var FCKToolbarItems = new Object() ;
+FCKToolbarItems.LoadedItems = new Object() ;
+
+FCKToolbarItems.RegisterItem = function( itemName, item )
+{
+ this.LoadedItems[ itemName ] = item ;
+}
+
+FCKToolbarItems.GetItem = function( itemName )
+{
+ var oItem = FCKToolbarItems.LoadedItems[ itemName ] ;
+
+ if ( oItem )
+ return oItem ;
+
+ switch ( itemName )
+ {
+ case 'Source' : oItem = new FCKToolbarButton( 'Source' , FCKLang.Source, null, FCK_TOOLBARITEM_ICONTEXT, true, true ) ; break ;
+ case 'DocProps' : oItem = new FCKToolbarButton( 'DocProps' , FCKLang.DocProps ) ; break ;
+ case 'Templates' : oItem = new FCKToolbarButton( 'Templates' , FCKLang.Templates ) ; break ;
+ case 'Save' : oItem = new FCKToolbarButton( 'Save' , FCKLang.Save, null, null, true ) ; break ;
+ case 'NewPage' : oItem = new FCKToolbarButton( 'NewPage' , FCKLang.NewPage, null, null, true ) ; break ;
+ case 'Preview' : oItem = new FCKToolbarButton( 'Preview' , FCKLang.Preview, null, null, true ) ; break ;
+ case 'About' : oItem = new FCKToolbarButton( 'About' , FCKLang.About, null, null, true ) ; break ;
+
+ case 'Cut' : oItem = new FCKToolbarButton( 'Cut' , FCKLang.Cut, null, null, false, true ) ; break ;
+ case 'Copy' : oItem = new FCKToolbarButton( 'Copy' , FCKLang.Copy, null, null, false, true ) ; break ;
+ case 'Paste' : oItem = new FCKToolbarButton( 'Paste' , FCKLang.Paste, null, null, false, true ) ; break ;
+ case 'PasteText' : oItem = new FCKToolbarButton( 'PasteText' , FCKLang.PasteText, null, null, false, true ) ; break ;
+ case 'PasteWord' : oItem = new FCKToolbarButton( 'PasteWord' , FCKLang.PasteWord, null, null, false, true ) ; break ;
+ case 'Print' : oItem = new FCKToolbarButton( 'Print' , FCKLang.Print, null, null, false, true ) ; break ;
+ case 'SpellCheck' : oItem = new FCKToolbarButton( 'SpellCheck', FCKLang.SpellCheck ) ; break ;
+ case 'Undo' : oItem = new FCKToolbarButton( 'Undo' , FCKLang.Undo, null, null, false, true ) ; break ;
+ case 'Redo' : oItem = new FCKToolbarButton( 'Redo' , FCKLang.Redo, null, null, false, true ) ; break ;
+ case 'SelectAll' : oItem = new FCKToolbarButton( 'SelectAll' , FCKLang.SelectAll ) ; break ;
+ case 'RemoveFormat' : oItem = new FCKToolbarButton( 'RemoveFormat', FCKLang.RemoveFormat, null, null, false, true ) ; break ;
+
+ case 'Bold' : oItem = new FCKToolbarButton( 'Bold' , FCKLang.Bold, null, null, false, true ) ; break ;
+ case 'Italic' : oItem = new FCKToolbarButton( 'Italic' , FCKLang.Italic, null, null, false, true ) ; break ;
+ case 'Underline' : oItem = new FCKToolbarButton( 'Underline' , FCKLang.Underline, null, null, false, true ) ; break ;
+ case 'StrikeThrough' : oItem = new FCKToolbarButton( 'StrikeThrough' , FCKLang.StrikeThrough, null, null, false, true ) ; break ;
+ case 'Subscript' : oItem = new FCKToolbarButton( 'Subscript' , FCKLang.Subscript, null, null, false, true ) ; break ;
+ case 'Superscript' : oItem = new FCKToolbarButton( 'Superscript' , FCKLang.Superscript, null, null, false, true ) ; break ;
+
+ case 'OrderedList' : oItem = new FCKToolbarButton( 'InsertOrderedList' , FCKLang.NumberedListLbl, FCKLang.NumberedList, null, false, true ) ; break ;
+ case 'UnorderedList' : oItem = new FCKToolbarButton( 'InsertUnorderedList' , FCKLang.BulletedListLbl, FCKLang.BulletedList, null, false, true ) ; break ;
+ case 'Outdent' : oItem = new FCKToolbarButton( 'Outdent' , FCKLang.DecreaseIndent, null, null, false, true ) ; break ;
+ case 'Indent' : oItem = new FCKToolbarButton( 'Indent' , FCKLang.IncreaseIndent, null, null, false, true ) ; break ;
+
+ case 'Link' : oItem = new FCKToolbarButton( 'Link' , FCKLang.InsertLinkLbl, FCKLang.InsertLink, null, false, true ) ; break ;
+ case 'Unlink' : oItem = new FCKToolbarButton( 'Unlink' , FCKLang.RemoveLink, null, null, false, true ) ; break ;
+ case 'Anchor' : oItem = new FCKToolbarButton( 'Anchor' , FCKLang.Anchor ) ; break ;
+
+ case 'Image' : oItem = new FCKToolbarButton( 'Image' , FCKLang.InsertImageLbl, FCKLang.InsertImage ) ; break ;
+ case 'Table' : oItem = new FCKToolbarButton( 'Table' , FCKLang.InsertTableLbl, FCKLang.InsertTable ) ; break ;
+ case 'SpecialChar' : oItem = new FCKToolbarButton( 'SpecialChar' , FCKLang.InsertSpecialCharLbl, FCKLang.InsertSpecialChar ) ; break ;
+ case 'Smiley' : oItem = new FCKToolbarButton( 'Smiley' , FCKLang.InsertSmileyLbl, FCKLang.InsertSmiley ) ; break ;
+ case 'UniversalKey' : oItem = new FCKToolbarButton( 'UniversalKey' , FCKLang.UniversalKeyboard ) ; break ;
+
+ case 'Rule' : oItem = new FCKToolbarButton( 'InsertHorizontalRule', FCKLang.InsertLineLbl, FCKLang.InsertLine, null, false, true ) ; break ;
+
+ case 'JustifyLeft' : oItem = new FCKToolbarButton( 'JustifyLeft' , FCKLang.LeftJustify, null, null, false, true ) ; break ;
+ case 'JustifyCenter' : oItem = new FCKToolbarButton( 'JustifyCenter' , FCKLang.CenterJustify, null, null, false, true ) ; break ;
+ case 'JustifyRight' : oItem = new FCKToolbarButton( 'JustifyRight' , FCKLang.RightJustify, null, null, false, true ) ; break ;
+ case 'JustifyFull' : oItem = new FCKToolbarButton( 'JustifyFull' , FCKLang.BlockJustify, null, null, false, true ) ; break ;
+
+ case 'Style' : oItem = new FCKToolbarStyleCombo() ; break ;
+ case 'FontName' : oItem = new FCKToolbarFontsCombo() ; break ;
+ case 'FontSize' : oItem = new FCKToolbarFontSizeCombo() ; break ;
+ case 'FontFormat' : oItem = new FCKToolbarFontFormatCombo() ; break ;
+
+ case 'TextColor' : oItem = new FCKToolbarPanelButton( 'TextColor', FCKLang.TextColor ) ; break ;
+ case 'BGColor' : oItem = new FCKToolbarPanelButton( 'BGColor' , FCKLang.BGColor ) ; break ;
+
+ case 'Find' : oItem = new FCKToolbarButton( 'Find' , FCKLang.Find ) ; break ;
+ case 'Replace' : oItem = new FCKToolbarButton( 'Replace' , FCKLang.Replace ) ; break ;
+
+ case 'Form' : oItem = new FCKToolbarButton( 'Form' , FCKLang.Form ) ; break ;
+ case 'Checkbox' : oItem = new FCKToolbarButton( 'Checkbox' , FCKLang.Checkbox ) ; break ;
+ case 'Radio' : oItem = new FCKToolbarButton( 'Radio' , FCKLang.RadioButton ) ; break ;
+ case 'TextField' : oItem = new FCKToolbarButton( 'TextField' , FCKLang.TextField ) ; break ;
+ case 'Textarea' : oItem = new FCKToolbarButton( 'Textarea' , FCKLang.Textarea ) ; break ;
+ case 'HiddenField' : oItem = new FCKToolbarButton( 'HiddenField' , FCKLang.HiddenField ) ; break ;
+ case 'Button' : oItem = new FCKToolbarButton( 'Button' , FCKLang.Button ) ; break ;
+ case 'Select' : oItem = new FCKToolbarButton( 'Select' , FCKLang.SelectionField ) ; break ;
+ case 'ImageButton' : oItem = new FCKToolbarButton( 'ImageButton' , FCKLang.ImageButton ) ; break ;
+
+ default:
+ alert( FCKLang.UnknownToolbarItem.replace( /%1/g, itemName ) ) ;
+ return ;
+ }
+
+ FCKToolbarItems.LoadedItems[ itemName ] = oItem ;
+
+ return oItem ;
+}
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fcktoolbarset.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fcktoolbarset.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fcktoolbarset.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,164 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fcktoolbarset.js
+ * Defines the FCKToolbarSet object that is used to load and draw the
+ * toolbar.
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+var FCKToolbarSet = FCK.ToolbarSet = new Object() ;
+
+document.getElementById( 'ExpandHandle' ).title = FCKLang.ToolbarExpand ;
+document.getElementById( 'CollapseHandle' ).title = FCKLang.ToolbarCollapse ;
+
+FCKToolbarSet.Toolbars = new Array() ;
+
+// Array of toolbat items that are active only on WYSIWYG mode.
+FCKToolbarSet.ItemsWysiwygOnly = new Array() ;
+
+// Array of toolbar items that are sensitive to the cursor position.
+FCKToolbarSet.ItemsContextSensitive = new Array() ;
+
+FCKToolbarSet.Expand = function()
+{
+ document.getElementById( 'Collapsed' ).style.display = 'none' ;
+ document.getElementById( 'Expanded' ).style.display = '' ;
+
+ if ( ! FCKBrowserInfo.IsIE )
+ {
+ // I had to use "setTimeout" because Gecko was not responding in a right
+ // way when calling window.onresize() directly.
+ window.setTimeout( "window.onresize()", 1 ) ;
+ }
+}
+
+FCKToolbarSet.Collapse = function()
+{
+ document.getElementById( 'Collapsed' ).style.display = '' ;
+ document.getElementById( 'Expanded' ).style.display = 'none' ;
+
+ if ( ! FCKBrowserInfo.IsIE )
+ {
+ // I had to use "setTimeout" because Gecko was not responding in a right
+ // way when calling window.onresize() directly.
+ window.setTimeout( "window.onresize()", 1 ) ;
+ }
+}
+
+FCKToolbarSet.Restart = function()
+{
+ if ( !FCKConfig.ToolbarCanCollapse || FCKConfig.ToolbarStartExpanded )
+ this.Expand() ;
+ else
+ this.Collapse() ;
+
+ document.getElementById( 'CollapseHandle' ).style.display = FCKConfig.ToolbarCanCollapse ? '' : 'none' ;
+}
+
+FCKToolbarSet.Load = function( toolbarSetName )
+{
+ this.DOMElement = document.getElementById( 'eToolbar' ) ;
+
+ var ToolbarSet = FCKConfig.ToolbarSets[toolbarSetName] ;
+
+ if (! ToolbarSet)
+ {
+ alert( FCKLang.UnknownToolbarSet.replace( /%1/g, toolbarSetName ) ) ;
+ return ;
+ }
+
+ this.Toolbars = new Array() ;
+
+ for ( var x = 0 ; x < ToolbarSet.length ; x++ )
+ {
+ var oToolbarItems = ToolbarSet[x] ;
+
+ var oToolbar ;
+
+ if ( typeof( oToolbarItems ) == 'string' )
+ {
+ if ( oToolbarItems == '/' )
+ oToolbar = new FCKToolbarBreak() ;
+ }
+ else
+ {
+ var oToolbar = new FCKToolbar() ;
+
+ for ( var j = 0 ; j < oToolbarItems.length ; j++ )
+ {
+ var sItem = oToolbarItems[j] ;
+
+ if ( sItem == '-')
+ oToolbar.AddSeparator() ;
+ else
+ {
+ var oItem = FCKToolbarItems.GetItem( sItem ) ;
+ if ( oItem )
+ {
+ oToolbar.AddItem( oItem ) ;
+
+ if ( !oItem.SourceView )
+ this.ItemsWysiwygOnly[this.ItemsWysiwygOnly.length] = oItem ;
+
+ if ( oItem.ContextSensitive )
+ this.ItemsContextSensitive[this.ItemsContextSensitive.length] = oItem ;
+ }
+ }
+ }
+
+ oToolbar.AddTerminator() ;
+ }
+
+ this.Toolbars[ this.Toolbars.length ] = oToolbar ;
+ }
+}
+
+FCKToolbarSet.RefreshModeState = function()
+{
+ if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
+ {
+ // Enable all buttons that are available on WYSIWYG mode only.
+ for ( var i = 0 ; i < FCKToolbarSet.ItemsWysiwygOnly.length ; i++ )
+ FCKToolbarSet.ItemsWysiwygOnly[i].Enable() ;
+
+ // Refresh the buttons state.
+ FCKToolbarSet.RefreshItemsState() ;
+ }
+ else
+ {
+ // Refresh the buttons state.
+ FCKToolbarSet.RefreshItemsState() ;
+
+ // Disable all buttons that are available on WYSIWYG mode only.
+ for ( var i = 0 ; i < FCKToolbarSet.ItemsWysiwygOnly.length ; i++ )
+ FCKToolbarSet.ItemsWysiwygOnly[i].Disable() ;
+ }
+}
+
+FCKToolbarSet.RefreshItemsState = function()
+{
+
+ for ( var i = 0 ; i < FCKToolbarSet.ItemsContextSensitive.length ; i++ )
+ FCKToolbarSet.ItemsContextSensitive[i].RefreshState() ;
+/*
+ TODO: Delete this commented block on stable version.
+ for ( var i = 0 ; i < FCKToolbarSet.Toolbars.length ; i++ )
+ {
+ var oToolbar = FCKToolbarSet.Toolbars[i] ;
+ for ( var j = 0 ; j < oToolbar.Items.length ; j++ )
+ {
+ oToolbar.Items[j].RefreshState() ;
+ }
+ }
+*/
+}
Index: lams_central/web/fckeditor/editor/_source/internals/fcktools.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fcktools.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fcktools.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,206 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fcktools.js
+ * Utility functions.
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+var FCKTools = new Object() ;
+
+//**
+// FCKTools.GetLinkedFieldValue: Gets the value of the hidden INPUT element
+// that is associated to the editor. This element has its ID set to the
+// editor's instance name so the user reffers to the instance name when getting
+// the posted data.
+FCKTools.GetLinkedFieldValue = function()
+{
+ return FCK.LinkedField.value ;
+}
+
+//**
+// FCKTools.SetLinkedFieldValue: Sets the value of the hidden INPUT element
+// that is associated to the editor. This element has its ID set to the
+// editor's instance name so the user reffers to the instance name when getting
+// the posted data.
+FCKTools.SetLinkedFieldValue = function( value )
+{
+ if ( FCKConfig.FormatOutput )
+ FCK.LinkedField.value = FCKCodeFormatter.Format( value ) ;
+ else
+ FCK.LinkedField.value = value ;
+}
+
+//**
+// FCKTools.AttachToLinkedFieldFormSubmit: attaches a function call to the
+// submit event of the linked field form. This function us generally used to
+// update the linked field value before submitting the form.
+FCKTools.AttachToLinkedFieldFormSubmit = function( functionPointer )
+{
+ // Gets the linked field form
+ var oForm = FCK.LinkedField.form ;
+
+ // Return now if no form is available
+ if (!oForm) return ;
+
+ // Attaches the functionPointer call to the onsubmit event
+ if ( FCKBrowserInfo.IsIE )
+ oForm.attachEvent( "onsubmit", functionPointer ) ;
+ else
+ oForm.addEventListener( 'submit', functionPointer, true ) ;
+
+ //**
+ // Attaches the functionPointer call to the submit method
+ // This is done because IE doesn't fire onsubmit when the submit method is called
+ // BEGIN --
+
+ // Creates a Array in the form object that will hold all Attached function call
+ // (in the case there are more than one editor in the same page)
+ if (! oForm.updateFCKEditor) oForm.updateFCKEditor = new Array() ;
+
+ // Adds the function pointer to the array of functions to call when "submit" is called
+ oForm.updateFCKEditor[oForm.updateFCKEditor.length] = functionPointer ;
+
+ // Switches the original submit method with a new one that first call all functions
+ // on the above array and the call the original submit
+ // IE sees it oForm.submit function as an 'object'.
+ if (! oForm.originalSubmit && ( typeof( oForm.submit ) == 'function' || ( !oForm.submit.tagName && !oForm.submit.length ) ) )
+ {
+ // Creates a copy of the original submit
+ oForm.originalSubmit = oForm.submit ;
+
+ // Creates our replacement for the submit
+ oForm.submit = FCKTools_SubmitReplacer ;
+ }
+ // END --
+}
+
+function FCKTools_SubmitReplacer()
+{
+ if (this.updateFCKEditor)
+ {
+ // Calls all functions in the functions array
+ for (var i = 0 ; i < this.updateFCKEditor.length ; i++)
+ this.updateFCKEditor[i]() ;
+ }
+ // Calls the original "submit"
+ this.originalSubmit() ;
+}
+
+//**
+// FCKTools.AddSelectOption: Adds a option to a SELECT element.
+FCKTools.AddSelectOption = function( targetDocument, selectElement, optionText, optionValue )
+{
+ var oOption = targetDocument.createElement("OPTION") ;
+
+ oOption.text = optionText ;
+ oOption.value = optionValue ;
+
+ selectElement.options.add(oOption) ;
+
+ return oOption ;
+}
+
+FCKTools.RemoveAllSelectOptions = function( selectElement )
+{
+ for ( var i = selectElement.options.length - 1 ; i >= 0 ; i-- )
+ {
+ selectElement.options.remove(i) ;
+ }
+}
+
+FCKTools.SelectNoCase = function( selectElement, value, defaultValue )
+{
+ var sNoCaseValue = value.toString().toLowerCase() ;
+
+ for ( var i = 0 ; i < selectElement.options.length ; i++ )
+ {
+ if ( sNoCaseValue == selectElement.options[i].value.toLowerCase() )
+ {
+ selectElement.selectedIndex = i ;
+ return ;
+ }
+ }
+
+ if ( defaultValue != null ) FCKTools.SelectNoCase( selectElement, defaultValue ) ;
+}
+
+FCKTools.HTMLEncode = function( text )
+{
+ text = text.replace( /&/g, "&" ) ;
+ text = text.replace( /"/g, """ ) ;
+ text = text.replace( //g, ">" ) ;
+ text = text.replace( /'/g, "'" ) ;
+
+ return text ;
+}
+
+//**
+// FCKTools.GetResultingArray: Gets a array from a string (where the elements
+// are separated by a character), a fuction (that returns a array) or a array.
+FCKTools.GetResultingArray = function( arraySource, separator )
+{
+ switch ( typeof( arraySource ) )
+ {
+ case "string" :
+ return arraySource.split( separator ) ;
+ case "function" :
+ return separator() ;
+ default :
+ if ( isArray( arraySource ) ) return arraySource ;
+ else return new Array() ;
+ }
+}
+
+FCKTools.GetElementPosition = function( el )
+{
+ // Initializes the Coordinates object that will be returned by the function.
+ var c = { X:0, Y:0 } ;
+
+ // Loop throw the offset chain.
+ while ( el )
+ {
+ c.X += el.offsetLeft ;
+ c.Y += el.offsetTop ;
+
+ el = el.offsetParent ;
+ }
+
+ // Return the Coordinates object
+ return c ;
+}
+
+FCKTools.GetElementAscensor = function( element, ascensorTagName )
+{
+ var e = element.parentNode ;
+
+ while ( e )
+ {
+ if ( e.nodeName == ascensorTagName )
+ return e ;
+
+ e = e.parentNode ;
+ }
+}
+
+FCKTools.Pause = function( miliseconds )
+{
+ var oStart = new Date() ;
+
+ while (true)
+ {
+ var oNow = new Date() ;
+ if ( miliseconds < oNow - oStart )
+ return ;
+ }
+}
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fcktools_gecko.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fcktools_gecko.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fcktools_gecko.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,85 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fcktools_gecko.js
+ * Utility functions. (Gecko version).
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+// Appends a CSS file to a document.
+FCKTools.AppendStyleSheet = function( documentElement, cssFileUrl )
+{
+ var e = documentElement.createElement( 'LINK' ) ;
+ e.rel = 'stylesheet' ;
+ e.type = 'text/css' ;
+ e.href = cssFileUrl ;
+ documentElement.getElementsByTagName("HEAD")[0].appendChild( e ) ;
+}
+
+// Removes all attributes and values from the element.
+FCKTools.ClearElementAttributes = function( element )
+{
+ // Loop throw all attributes in the element
+ for ( var i = 0 ; i < element.attributes.length ; i++ )
+ {
+ // Remove the element by name.
+ element.removeAttribute( element.attributes[i].name, 0 ) ; // 0 : Case Insensitive
+ }
+}
+
+// Returns an Array of strings with all defined in the elements inside another element.
+FCKTools.GetAllChildrenIds = function( parentElement )
+{
+ // Create the array that will hold all Ids.
+ var aIds = new Array() ;
+
+ // Define a recursive function that search for the Ids.
+ var fGetIds = function( parent )
+ {
+ for ( var i = 0 ; i < parent.childNodes.length ; i++ )
+ {
+ var sId = parent.childNodes[i].id ;
+
+ // Check if the Id is defined for the element.
+ if ( sId && sId.length > 0 ) aIds[ aIds.length ] = sId ;
+
+ // Recursive call.
+ fGetIds( parent.childNodes[i] ) ;
+ }
+ }
+
+ // Start the recursive calls.
+ fGetIds( parentElement ) ;
+
+ return aIds ;
+}
+
+FCKTools.RemoveOuterTags = function( e )
+{
+ var oFragment = e.ownerDocument.createDocumentFragment() ;
+
+ for ( var i = 0 ; i < e.childNodes.length ; i++ )
+ oFragment.appendChild( e.childNodes[i] ) ;
+
+ e.parentNode.replaceChild( oFragment, e ) ;
+}
+
+FCKTools.CreateXmlObject = function( object )
+{
+ switch ( object )
+ {
+ case 'XmlHttp' :
+ return new XMLHttpRequest() ;
+ case 'DOMDocument' :
+ return document.implementation.createDocument( '', '', null ) ;
+ }
+}
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fcktools_ie.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fcktools_ie.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fcktools_ie.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,68 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fcktools_ie.js
+ * Utility functions. (IE version).
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+// Appends a CSS file to a document.
+FCKTools.AppendStyleSheet = function( documentElement, cssFileUrl )
+{
+ return documentElement.createStyleSheet( cssFileUrl ) ;
+}
+
+// Removes all attributes and values from the element.
+FCKTools.ClearElementAttributes = function( element )
+{
+ element.clearAttributes() ;
+}
+
+FCKTools.GetAllChildrenIds = function( parentElement )
+{
+ var aIds = new Array() ;
+ for ( var i = 0 ; i < parentElement.all.length ; i++ )
+ {
+ var sId = parentElement.all[i].id ;
+ if ( sId && sId.length > 0 )
+ aIds[ aIds.length ] = sId ;
+ }
+ return aIds ;
+}
+
+FCKTools.RemoveOuterTags = function( e )
+{
+ e.insertAdjacentHTML( 'beforeBegin', e.innerHTML ) ;
+ e.parentNode.removeChild( e ) ;
+}
+
+FCKTools.CreateXmlObject = function( object )
+{
+ var aObjs ;
+
+ switch ( object )
+ {
+ case 'XmlHttp' :
+ aObjs = [ 'MSXML2.XmlHttp', 'Microsoft.XmlHttp' ] ;
+ break ;
+
+ case 'DOMDocument' :
+ aObjs = [ 'MSXML2.DOMDocument', 'Microsoft.XmlDom' ] ;
+ break ;
+ }
+
+ for ( var i = 0 ; i < 2 ; i++ )
+ {
+ try { return new ActiveXObject( aObjs[i] ) ; }
+ catch (e) {}
+ }
+}
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fckundo_gecko.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fckundo_gecko.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fckundo_gecko.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,4 @@
+var FCKUndo = new Object() ;
+
+FCKUndo.SaveUndoStep = function()
+{}
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fckundo_ie.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fckundo_ie.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fckundo_ie.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,78 @@
+var FCKUndo = new Object() ;
+
+FCKUndo.SavedData = new Array() ;
+FCKUndo.CurrentIndex = -1 ;
+
+FCKUndo.SaveUndoStep = function()
+{
+ // Shrink the array to the current level.
+ FCKUndo.SavedData = FCKUndo.SavedData.slice( 0, FCKUndo.CurrentIndex + 1 ) ;
+
+ // Get the Actual HTML.
+ var sHtml = FCK.EditorDocument.body.innerHTML ;
+
+ // Cancel operation if the new step is identical to the previous one.
+ if ( FCKUndo.CurrentIndex >= 0 && sHtml == FCKUndo.SavedData[ FCKUndo.CurrentIndex ][0] )
+ return ;
+
+ // If we reach the Maximun number of undo levels, we must remove the first
+ // entry of the list shifting all elements.
+ if ( FCKUndo.CurrentIndex + 1 >= FCKConfig.MaxUndoLevels )
+ FCKUndo.SavedData.shift() ;
+ else
+ FCKUndo.CurrentIndex++ ;
+
+ // Get the actual selection.
+ var sBookmark ;
+ if ( FCK.EditorDocument.selection.type == 'Text' )
+ sBookmark = FCK.EditorDocument.selection.createRange().getBookmark() ;
+
+ // Save the new level in front of the actual position.
+ FCKUndo.SavedData[ FCKUndo.CurrentIndex ] = [ sHtml, sBookmark ] ;
+
+ FCK.Events.FireEvent( "OnSelectionChange" ) ;
+}
+
+FCKUndo.Undo = function()
+{
+ if ( FCKUndo.CurrentIndex > 0 )
+ {
+ // If it is the first step.
+ if ( FCKUndo.CurrentIndex == ( FCKUndo.SavedData.length - 1 ) )
+ {
+ // Save the actual state for a possible "Redo" call.
+ FCKUndo.SaveUndoStep() ;
+ }
+
+ // Go a step back.
+ FCKUndo._ApplyUndoLevel( --FCKUndo.CurrentIndex ) ;
+
+ FCK.Events.FireEvent( "OnSelectionChange" ) ;
+ }
+}
+
+FCKUndo.Redo = function()
+{
+ if ( FCKUndo.CurrentIndex < ( FCKUndo.SavedData.length - 1 ) )
+ {
+ // Go a step forward.
+ FCKUndo._ApplyUndoLevel( ++FCKUndo.CurrentIndex ) ;
+
+ FCK.Events.FireEvent( "OnSelectionChange" ) ;
+ }
+}
+
+FCKUndo._ApplyUndoLevel = function(level)
+{
+ var oData = FCKUndo.SavedData[ level ] ;
+
+ // Update the editor contents with that step data.
+ FCK.EditorDocument.body.innerHTML = oData[0] ;
+
+ if ( oData[1] )
+ {
+ var oRange = FCK.EditorDocument.selection.createRange() ;
+ oRange.moveToBookmark( oData[1] ) ;
+ oRange.select() ;
+ }
+}
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fckurlparams.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fckurlparams.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fckurlparams.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,30 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fckurlparams.js
+ * Defines the FCKURLParams object that is used to get all parameters
+ * passed by the URL QueryString (after the "?").
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+// #### URLParams: holds all URL passed parameters (like ?Param1=Value1&Param2=Value2)
+var FCKURLParams = new Object() ;
+
+var aParams = document.location.search.substr(1).split('&') ;
+for ( i = 0 ; i < aParams.length ; i++ )
+{
+ var aParam = aParams[i].split('=') ;
+ var sParamName = aParam[0] ;
+ var sParamValue = aParam[1] ;
+
+ FCKURLParams[ sParamName ] = sParamValue ;
+}
\ No newline at end of file
Index: lams_central/web/fckeditor/editor/_source/internals/fckxhtml.js
===================================================================
diff -u
--- lams_central/web/fckeditor/editor/_source/internals/fckxhtml.js (revision 0)
+++ lams_central/web/fckeditor/editor/_source/internals/fckxhtml.js (revision ec7cf4ccd30c2f44920a59691c6055f714e5e36c)
@@ -0,0 +1,307 @@
+/*
+ * FCKeditor - The text editor for internet
+ * Copyright (C) 2003-2005 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/
+ *
+ * File Name: fckxhtml.js
+ * Defines the FCKXHtml object, responsible for the XHTML operations.
+ *
+ * File Authors:
+ * Frederico Caldeira Knabben (fredck@fckeditor.net)
+ */
+
+var FCKXHtml = new Object() ;
+
+FCKXHtml.CurrentJobNum = 0 ;
+
+FCKXHtml.GetXHTML = function( node, includeNode, format )
+{
+ // Special blocks are blocks of content that remain untouched during the
+ // process. It is used for SCRIPTs and STYLEs.
+ FCKXHtml.SpecialBlocks = new Array() ;
+
+ // Create the XML DOMDocument object.
+ this.XML = FCKTools.CreateXmlObject( 'DOMDocument' ) ;
+
+ // Add a root element that holds all child nodes.
+ this.MainNode = this.XML.appendChild( this.XML.createElement( 'xhtml' ) ) ;
+
+ FCKXHtml.CurrentJobNum++ ;
+
+ if ( includeNode )
+ this._AppendNode( this.MainNode, node ) ;
+ else
+ this._AppendChildNodes( this.MainNode, node, false ) ;
+
+ // Get the resulting XHTML as a string.
+ var sXHTML = this._GetMainXmlString() ;
+
+ // Strip the "XHTML" root node.
+ sXHTML = sXHTML.substr( 7, sXHTML.length - 15 ).trim() ;
+
+ if ( FCKConfig.ForceSimpleAmpersand )
+ sXHTML = sXHTML.replace( /___FCKAmp___/g, '&' ) ;
+
+ if ( format )
+ sXHTML = FCKCodeFormatter.Format( sXHTML ) ;
+
+ // Now we put back the SpecialBlocks contents.
+ for ( var i = 0 ; i < FCKXHtml.SpecialBlocks.length ; i++ )
+ {
+ var oRegex = new RegExp( '___FCKsi___' + i ) ;
+ sXHTML = sXHTML.replace( oRegex, FCKXHtml.SpecialBlocks[i] ) ;
+ }
+
+ this.XML = null ;
+
+ return sXHTML
+}
+
+FCKXHtml._AppendAttribute = function( xmlNode, attributeName, attributeValue )
+{
+ try
+ {
+ // Create the attribute.
+ var oXmlAtt = this.XML.createAttribute( attributeName ) ;
+
+ oXmlAtt.value = attributeValue ? attributeValue : '' ;
+
+ // Set the attribute in the node.
+ xmlNode.attributes.setNamedItem( oXmlAtt ) ;
+ }
+ catch (e)
+ {}
+}
+
+FCKXHtml._AppendChildNodes = function( xmlNode, htmlNode, isBlockElement )
+{
+ if ( htmlNode.hasChildNodes() )
+ {
+ // Get all children nodes.
+ var oChildren = htmlNode.childNodes ;
+
+ for ( var i = 0 ; i < oChildren.length ; i++ )
+ this._AppendNode( xmlNode, oChildren[i] ) ;
+ }
+ else
+ {
+ if ( isBlockElement && FCKConfig.FillEmptyBlocks )
+ {
+ this._AppendEntity( xmlNode, 'nbsp' ) ;
+ return ;
+ }
+
+ // We can't use short representation of empty elements that are not marked
+ // as empty in th XHTML DTD.
+ if ( ! FCKRegexLib.EmptyElements.test( htmlNode.nodeName ) )
+ xmlNode.appendChild( this.XML.createTextNode('') ) ;
+ }
+}
+
+FCKXHtml._AppendNode = function( xmlNode, htmlNode )
+{
+ switch ( htmlNode.nodeType )
+ {
+ // Element Node.
+ case 1 :
+ // Mozilla insert custom nodes in the DOM.
+ if ( FCKBrowserInfo.IsGecko && htmlNode.hasAttribute('_moz_editor_bogus_node') )
+ return ;
+
+ // Create the Element.
+ var sNodeName = htmlNode.nodeName ;
+
+ // Check if the node name is valid, otherwise ignore this tag.
+ if ( !FCKRegexLib.ElementName.test( sNodeName ) )
+ return ;
+
+ sNodeName = sNodeName.toLowerCase() ;
+
+ if ( FCKBrowserInfo.IsGecko && sNodeName == 'br' && htmlNode.hasAttribute('type') && htmlNode.getAttribute( 'type', 2 ) == '_moz' )
+ return ;
+
+ // The already processed nodes must be marked to avoid then to be duplicated (bad formatted HTML).
+ // So here, the "mark" is checked... if the element is Ok, then mark it.
+ if ( htmlNode._fckxhtmljob == FCKXHtml.CurrentJobNum )
+ return ;
+ else
+ htmlNode._fckxhtmljob = FCKXHtml.CurrentJobNum ;
+
+ // If the nodeName starts with a slash, it is a orphan closing tag.
+ // On some strange cases, the nodeName is empty, even if the node exists.
+// if ( sNodeName.length == 0 || sNodeName.substr(0,1) == '/' )
+// break ;
+
+ var oNode = this.XML.createElement( sNodeName ) ;
+
+ // Add all attributes.
+ FCKXHtml._AppendAttributes( xmlNode, htmlNode, oNode, sNodeName ) ;
+
+ // Tag specific processing.
+ var oTagProcessor = FCKXHtml.TagProcessors[ sNodeName ] ;
+
+ if ( oTagProcessor )
+ {
+ oNode = oTagProcessor( oNode, htmlNode ) ;
+ if ( !oNode ) break ;
+ }
+ else
+ this._AppendChildNodes( oNode, htmlNode, FCKRegexLib.BlockElements.test( sNodeName ) ) ;
+
+ xmlNode.appendChild( oNode ) ;
+
+ break ;
+
+ // Text Node.
+ case 3 :
+ this._AppendTextNode( xmlNode, htmlNode.nodeValue.replaceNewLineChars(' ') ) ;
+ break ;
+
+ // Comment
+ case 8 :
+ xmlNode.appendChild( this.XML.createComment( htmlNode.nodeValue ) ) ;
+ break ;
+
+ // Unknown Node type.
+ default :
+ xmlNode.appendChild( this.XML.createComment( "Element not supported - Type: " + htmlNode.nodeType + " Name: " + htmlNode.nodeName ) ) ;
+ break ;
+ }
+}
+
+// Append an item to the SpecialBlocks array and returns the tag to be used.
+FCKXHtml._AppendSpecialItem = function( item )
+{
+ return '___FCKsi___' + FCKXHtml.SpecialBlocks.addItem( item ) ;
+}
+
+if ( FCKConfig.ProcessHTMLEntities )
+{
+ FCKXHtml._AppendTextNode = function( targetNode, textValue )
+ {
+ // We can't just replace the special chars with entities and create a
+ // text node with it. We must split the text isolating the special chars
+ // and add each piece a time.
+ var asPieces = textValue.match( FCKXHtmlEntities.EntitiesRegex ) ;
+
+ if ( asPieces )
+ {
+ for ( var i = 0 ; i < asPieces.length ; i++ )
+ {
+ if ( asPieces[i].length == 1 )
+ {
+ var sEntity = FCKXHtmlEntities.Entities[ asPieces[i] ] ;
+ if ( sEntity != null )
+ {
+ this._AppendEntity( targetNode, sEntity ) ;
+ continue ;
+ }
+ }
+ targetNode.appendChild( this.XML.createTextNode( asPieces[i] ) ) ;
+ }
+ }
+ }
+}
+else
+{
+ FCKXHtml._AppendTextNode = function( targetNode, textValue )
+ {
+ targetNode.appendChild( this.XML.createTextNode( textValue ) ) ;
+ }
+}
+
+// An object that hold tag specific operations.
+FCKXHtml.TagProcessors = new Object() ;
+
+FCKXHtml.TagProcessors['img'] = function( node )
+{
+ // The "ALT" attribute is required in XHTML.
+ if ( ! node.attributes.getNamedItem( 'alt' ) )
+ FCKXHtml._AppendAttribute( node, 'alt', '' ) ;
+
+ return node ;
+}
+
+FCKXHtml.TagProcessors['script'] = function( node, htmlNode )
+{
+ // The "TYPE" attribute is required in XHTML.
+ if ( ! node.attributes.getNamedItem( 'type' ) )
+ FCKXHtml._AppendAttribute( node, 'type', 'text/javascript' ) ;
+
+ node.appendChild( FCKXHtml.XML.createTextNode( FCKXHtml._AppendSpecialItem( htmlNode.text ) ) ) ;
+
+ return node ;
+}
+
+FCKXHtml.TagProcessors['style'] = function( node, htmlNode )
+{
+ // The "_fcktemp" attribute is used to mark the
+
+
+
+
+
+