mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-12-26 00:29:38 +01:00
update to FCK 2.6.3, please note: you probably have to delete your browser cache!
this should fix the <br type="_moz"> bug. -added the about button in all egw_config settings, as it enables the user to check the version of the editor -added the show-blocks button in all egw_config settings, as it enables the user to check the structure elements of his document
This commit is contained in:
parent
bad25ee249
commit
260ce05397
@ -1,38 +1,38 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* This is the sample plugin definition file.
|
* This is the sample plugin definition file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Register the related commands.
|
// Register the related commands.
|
||||||
FCKCommands.RegisterCommand( 'My_Find' , new FCKDialogCommand( FCKLang['DlgMyFindTitle'] , FCKLang['DlgMyFindTitle'] , FCKConfig.PluginsPath + 'findreplace/find.html' , 340, 170 ) ) ;
|
FCKCommands.RegisterCommand( 'My_Find' , new FCKDialogCommand( FCKLang['DlgMyFindTitle'] , FCKLang['DlgMyFindTitle'] , FCKConfig.PluginsPath + 'findreplace/find.html' , 340, 170 ) ) ;
|
||||||
FCKCommands.RegisterCommand( 'My_Replace' , new FCKDialogCommand( FCKLang['DlgMyReplaceTitle'], FCKLang['DlgMyReplaceTitle'] , FCKConfig.PluginsPath + 'findreplace/replace.html', 340, 200 ) ) ;
|
FCKCommands.RegisterCommand( 'My_Replace' , new FCKDialogCommand( FCKLang['DlgMyReplaceTitle'], FCKLang['DlgMyReplaceTitle'] , FCKConfig.PluginsPath + 'findreplace/replace.html', 340, 200 ) ) ;
|
||||||
|
|
||||||
// Create the "Find" toolbar button.
|
// Create the "Find" toolbar button.
|
||||||
var oFindItem = new FCKToolbarButton( 'My_Find', FCKLang['DlgMyFindTitle'] ) ;
|
var oFindItem = new FCKToolbarButton( 'My_Find', FCKLang['DlgMyFindTitle'] ) ;
|
||||||
oFindItem.IconPath = FCKConfig.PluginsPath + 'findreplace/find.gif' ;
|
oFindItem.IconPath = FCKConfig.PluginsPath + 'findreplace/find.gif' ;
|
||||||
|
|
||||||
FCKToolbarItems.RegisterItem( 'My_Find', oFindItem ) ; // 'My_Find' is the name used in the Toolbar config.
|
FCKToolbarItems.RegisterItem( 'My_Find', oFindItem ) ; // 'My_Find' is the name used in the Toolbar config.
|
||||||
|
|
||||||
// Create the "Replace" toolbar button.
|
// Create the "Replace" toolbar button.
|
||||||
var oReplaceItem = new FCKToolbarButton( 'My_Replace', FCKLang['DlgMyReplaceTitle'] ) ;
|
var oReplaceItem = new FCKToolbarButton( 'My_Replace', FCKLang['DlgMyReplaceTitle'] ) ;
|
||||||
oReplaceItem.IconPath = FCKConfig.PluginsPath + 'findreplace/replace.gif' ;
|
oReplaceItem.IconPath = FCKConfig.PluginsPath + 'findreplace/replace.gif' ;
|
||||||
|
|
||||||
FCKToolbarItems.RegisterItem( 'My_Replace', oReplaceItem ) ; // 'My_Replace' is the name used in the Toolbar config.
|
FCKToolbarItems.RegisterItem( 'My_Replace', oReplaceItem ) ; // 'My_Replace' is the name used in the Toolbar config.
|
||||||
|
@ -1,33 +1,33 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* English language file for the sample plugin.
|
* English language file for the sample plugin.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
FCKLang['DlgMyReplaceTitle'] = 'Plugin - Replace' ;
|
FCKLang['DlgMyReplaceTitle'] = 'Plugin - Replace' ;
|
||||||
FCKLang['DlgMyReplaceFindLbl'] = 'Find what:' ;
|
FCKLang['DlgMyReplaceFindLbl'] = 'Find what:' ;
|
||||||
FCKLang['DlgMyReplaceReplaceLbl'] = 'Replace with:' ;
|
FCKLang['DlgMyReplaceReplaceLbl'] = 'Replace with:' ;
|
||||||
FCKLang['DlgMyReplaceCaseChk'] = 'Match case' ;
|
FCKLang['DlgMyReplaceCaseChk'] = 'Match case' ;
|
||||||
FCKLang['DlgMyReplaceReplaceBtn'] = 'Replace' ;
|
FCKLang['DlgMyReplaceReplaceBtn'] = 'Replace' ;
|
||||||
FCKLang['DlgMyReplaceReplAllBtn'] = 'Replace All' ;
|
FCKLang['DlgMyReplaceReplAllBtn'] = 'Replace All' ;
|
||||||
FCKLang['DlgMyReplaceWordChk'] = 'Match whole word' ;
|
FCKLang['DlgMyReplaceWordChk'] = 'Match whole word' ;
|
||||||
|
|
||||||
FCKLang['DlgMyFindTitle'] = 'Plugin - Find' ;
|
FCKLang['DlgMyFindTitle'] = 'Plugin - Find' ;
|
||||||
FCKLang['DlgMyFindFindBtn'] = 'Find' ;
|
FCKLang['DlgMyFindFindBtn'] = 'Find' ;
|
||||||
|
@ -1,33 +1,33 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* French language file for the sample plugin.
|
* French language file for the sample plugin.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
FCKLang['DlgMyReplaceTitle'] = 'Plugin - Remplacer' ;
|
FCKLang['DlgMyReplaceTitle'] = 'Plugin - Remplacer' ;
|
||||||
FCKLang['DlgMyReplaceFindLbl'] = 'Chercher:' ;
|
FCKLang['DlgMyReplaceFindLbl'] = 'Chercher:' ;
|
||||||
FCKLang['DlgMyReplaceReplaceLbl'] = 'Remplacer par:' ;
|
FCKLang['DlgMyReplaceReplaceLbl'] = 'Remplacer par:' ;
|
||||||
FCKLang['DlgMyReplaceCaseChk'] = 'Respecter la casse' ;
|
FCKLang['DlgMyReplaceCaseChk'] = 'Respecter la casse' ;
|
||||||
FCKLang['DlgMyReplaceReplaceBtn'] = 'Remplacer' ;
|
FCKLang['DlgMyReplaceReplaceBtn'] = 'Remplacer' ;
|
||||||
FCKLang['DlgMyReplaceReplAllBtn'] = 'Remplacer Tout' ;
|
FCKLang['DlgMyReplaceReplAllBtn'] = 'Remplacer Tout' ;
|
||||||
FCKLang['DlgMyReplaceWordChk'] = 'Mot entier' ;
|
FCKLang['DlgMyReplaceWordChk'] = 'Mot entier' ;
|
||||||
|
|
||||||
FCKLang['DlgMyFindTitle'] = 'Plugin - Chercher' ;
|
FCKLang['DlgMyFindTitle'] = 'Plugin - Chercher' ;
|
||||||
FCKLang['DlgMyFindFindBtn'] = 'Chercher' ;
|
FCKLang['DlgMyFindFindBtn'] = 'Chercher' ;
|
||||||
|
@ -1,33 +1,33 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Italian language file for the sample plugin.
|
* Italian language file for the sample plugin.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
FCKLang['DlgMyReplaceTitle'] = 'Plugin - Sostituisci' ;
|
FCKLang['DlgMyReplaceTitle'] = 'Plugin - Sostituisci' ;
|
||||||
FCKLang['DlgMyReplaceFindLbl'] = 'Trova:' ;
|
FCKLang['DlgMyReplaceFindLbl'] = 'Trova:' ;
|
||||||
FCKLang['DlgMyReplaceReplaceLbl'] = 'Sostituisci con:' ;
|
FCKLang['DlgMyReplaceReplaceLbl'] = 'Sostituisci con:' ;
|
||||||
FCKLang['DlgMyReplaceCaseChk'] = 'Maiuscole/minuscole' ;
|
FCKLang['DlgMyReplaceCaseChk'] = 'Maiuscole/minuscole' ;
|
||||||
FCKLang['DlgMyReplaceReplaceBtn'] = 'Sostituisci' ;
|
FCKLang['DlgMyReplaceReplaceBtn'] = 'Sostituisci' ;
|
||||||
FCKLang['DlgMyReplaceReplAllBtn'] = 'Sostituisci tutto' ;
|
FCKLang['DlgMyReplaceReplAllBtn'] = 'Sostituisci tutto' ;
|
||||||
FCKLang['DlgMyReplaceWordChk'] = 'Parola intera' ;
|
FCKLang['DlgMyReplaceWordChk'] = 'Parola intera' ;
|
||||||
|
|
||||||
FCKLang['DlgMyFindTitle'] = 'Plugin - Cerca' ;
|
FCKLang['DlgMyFindTitle'] = 'Plugin - Cerca' ;
|
||||||
FCKLang['DlgMyFindFindBtn'] = 'Cerca' ;
|
FCKLang['DlgMyFindFindBtn'] = 'Cerca' ;
|
||||||
|
@ -1,73 +1,73 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* This is a sample plugin definition file.
|
* This is a sample plugin definition file.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Here we define our custom Style combo, with custom widths.
|
// Here we define our custom Style combo, with custom widths.
|
||||||
var oMyBigStyleCombo = new FCKToolbarStyleCombo() ;
|
var oMyBigStyleCombo = new FCKToolbarStyleCombo() ;
|
||||||
oMyBigStyleCombo.FieldWidth = 250 ;
|
oMyBigStyleCombo.FieldWidth = 250 ;
|
||||||
oMyBigStyleCombo.PanelWidth = 300 ;
|
oMyBigStyleCombo.PanelWidth = 300 ;
|
||||||
FCKToolbarItems.RegisterItem( 'My_BigStyle', oMyBigStyleCombo ) ;
|
FCKToolbarItems.RegisterItem( 'My_BigStyle', oMyBigStyleCombo ) ;
|
||||||
|
|
||||||
|
|
||||||
// ##### Defining a custom context menu entry.
|
// ##### Defining a custom context menu entry.
|
||||||
|
|
||||||
// ## 1. Define the command to be executed when selecting the context menu item.
|
// ## 1. Define the command to be executed when selecting the context menu item.
|
||||||
var oMyCMCommand = new Object() ;
|
var oMyCMCommand = new Object() ;
|
||||||
oMyCMCommand.Name = 'OpenImage' ;
|
oMyCMCommand.Name = 'OpenImage' ;
|
||||||
|
|
||||||
// This is the standard function used to execute the command (called when clicking in the context menu item).
|
// This is the standard function used to execute the command (called when clicking in the context menu item).
|
||||||
oMyCMCommand.Execute = function()
|
oMyCMCommand.Execute = function()
|
||||||
{
|
{
|
||||||
// This command is called only when an image element is selected (IMG).
|
// This command is called only when an image element is selected (IMG).
|
||||||
// Get image URL (src).
|
// Get image URL (src).
|
||||||
var sUrl = FCKSelection.GetSelectedElement().src ;
|
var sUrl = FCKSelection.GetSelectedElement().src ;
|
||||||
|
|
||||||
// Open the URL in a new window.
|
// Open the URL in a new window.
|
||||||
window.top.open( sUrl ) ;
|
window.top.open( sUrl ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is the standard function used to retrieve the command state (it could be disabled for some reason).
|
// This is the standard function used to retrieve the command state (it could be disabled for some reason).
|
||||||
oMyCMCommand.GetState = function()
|
oMyCMCommand.GetState = function()
|
||||||
{
|
{
|
||||||
// Let's make it always enabled.
|
// Let's make it always enabled.
|
||||||
return FCK_TRISTATE_OFF ;
|
return FCK_TRISTATE_OFF ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ## 2. Register our custom command.
|
// ## 2. Register our custom command.
|
||||||
FCKCommands.RegisterCommand( 'OpenImage', oMyCMCommand ) ;
|
FCKCommands.RegisterCommand( 'OpenImage', oMyCMCommand ) ;
|
||||||
|
|
||||||
// ## 3. Define the context menu "listener".
|
// ## 3. Define the context menu "listener".
|
||||||
var oMyContextMenuListener = new Object() ;
|
var oMyContextMenuListener = new Object() ;
|
||||||
|
|
||||||
// This is the standard function called right before sowing the context menu.
|
// This is the standard function called right before sowing the context menu.
|
||||||
oMyContextMenuListener.AddItems = function( contextMenu, tag, tagName )
|
oMyContextMenuListener.AddItems = function( contextMenu, tag, tagName )
|
||||||
{
|
{
|
||||||
// Let's show our custom option only for images.
|
// Let's show our custom option only for images.
|
||||||
if ( tagName == 'IMG' )
|
if ( tagName == 'IMG' )
|
||||||
{
|
{
|
||||||
contextMenu.AddSeparator() ;
|
contextMenu.AddSeparator() ;
|
||||||
contextMenu.AddItem( 'OpenImage', 'Open image in a new window (Custom)' ) ;
|
contextMenu.AddItem( 'OpenImage', 'Open image in a new window (Custom)' ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ## 4. Register our context menu listener.
|
// ## 4. Register our context menu listener.
|
||||||
FCK.ContextMenu.RegisterListener( oMyContextMenuListener ) ;
|
FCK.ContextMenu.RegisterListener( oMyContextMenuListener ) ;
|
||||||
|
@ -27,17 +27,20 @@
|
|||||||
<title>FCKeditor - AFP - Samples - Posted Data</title>
|
<title>FCKeditor - AFP - Samples - Posted Data</title>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
<meta name="robots" content="noindex, nofollow">
|
<meta name="robots" content="noindex, nofollow">
|
||||||
<link href="../sample.css" rel="stylesheet" type="text/css" />
|
<link href="../sample.css" rel="stylesheet" type="text/css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>FCKeditor - Samples - Posted Data</h1>
|
<h1>FCKeditor - Samples - Posted Data</h1>
|
||||||
This page lists all data posted by the form.
|
This page lists all data posted by the form.
|
||||||
<hr>
|
<hr>
|
||||||
<table width="100%" border="1" cellspacing="0" bordercolor="#999999">
|
<table border="1" cellspacing="0" id="outputSample">
|
||||||
<tr style="FONT-WEIGHT: bold; COLOR: #dddddd; BACKGROUND-COLOR: #999999">
|
<colgroup><col width="80"><col></colgroup>
|
||||||
<td nowrap>Field Name </td>
|
<thead>
|
||||||
<td>Value</td>
|
<tr>
|
||||||
</tr>
|
<th>Field Name</th>
|
||||||
|
<th>Value</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
<%
|
<%
|
||||||
lcForm=REQUEST.Form()
|
lcForm=REQUEST.Form()
|
||||||
lcForm=STRTRAN(lcForm,"&",CHR(13)+CHR(10))
|
lcForm=STRTRAN(lcForm,"&",CHR(13)+CHR(10))
|
||||||
@ -51,7 +54,7 @@
|
|||||||
lcWert=STRTRAN(lcWert,"<","<")
|
lcWert=STRTRAN(lcWert,"<","<")
|
||||||
lcWert=STRTRAN(lcWert,">",">") && ... if wanted remove/translate HTML Chars ...
|
lcWert=STRTRAN(lcWert,">",">") && ... if wanted remove/translate HTML Chars ...
|
||||||
|
|
||||||
? [<tr><td>]+lcVariable+[ =</td><td>]+lcWert+[</td></tr>]
|
? [<tr><th>]+lcVariable+[ =</th><td><pre>]+lcWert+[</pre></td></tr>]
|
||||||
ENDIF
|
ENDIF
|
||||||
NEXT
|
NEXT
|
||||||
%>
|
%>
|
||||||
|
@ -28,24 +28,27 @@
|
|||||||
<title>FCKeditor - Samples - Posted Data</title>
|
<title>FCKeditor - Samples - Posted Data</title>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
<meta name="robots" content="noindex, nofollow">
|
<meta name="robots" content="noindex, nofollow">
|
||||||
<link href="../sample.css" rel="stylesheet" type="text/css" />
|
<link href="../sample.css" rel="stylesheet" type="text/css" >
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>FCKeditor - Samples - Posted Data</h1>
|
<h1>FCKeditor - Samples - Posted Data</h1>
|
||||||
This page lists all data posted by the form.
|
This page lists all data posted by the form.
|
||||||
<hr>
|
<hr>
|
||||||
<table width="100%" border="1" cellspacing="0" bordercolor="#999999">
|
<table border="1" cellspacing="0" id="outputSample">
|
||||||
<tr style="FONT-WEIGHT: bold; COLOR: #dddddd; BACKGROUND-COLOR: #999999">
|
<colgroup><col width="80"><col></colgroup>
|
||||||
<td noWrap>Field Name </td>
|
<thead>
|
||||||
<td>Value</td>
|
<tr>
|
||||||
</tr>
|
<th>Field Name</th>
|
||||||
|
<th>Value</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
<%
|
<%
|
||||||
Dim sForm
|
Dim sForm
|
||||||
For Each sForm in Request.Form
|
For Each sForm in Request.Form
|
||||||
%>
|
%>
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top" nowrap><b><%=sForm%></b></td>
|
<th><%=sForm%></th>
|
||||||
<td width="100%" style="white-space:pre"><%=Server.HTMLEncode( Request.Form(sForm) )%></td>
|
<td><pre><%=Server.HTMLEncode( Request.Form(sForm) )%></pre></td>
|
||||||
</tr>
|
</tr>
|
||||||
<% Next %>
|
<% Next %>
|
||||||
</table>
|
</table>
|
||||||
|
@ -38,23 +38,22 @@
|
|||||||
<cfif isDefined( 'FORM.fieldnames' )>
|
<cfif isDefined( 'FORM.fieldnames' )>
|
||||||
<cfoutput>
|
<cfoutput>
|
||||||
<hr />
|
<hr />
|
||||||
<style>
|
<table border="1" cellspacing="0" id="outputSample">
|
||||||
<!--
|
<colgroup><col width="80"><col></colgroup>
|
||||||
td, th { font: 11px Verdana, Arial, Helv, Helvetica, sans-serif; }
|
<thead>
|
||||||
-->
|
<tr>
|
||||||
</style>
|
<th>Field Name</th>
|
||||||
<table border="1" cellspacing="0" cellpadding="2" bordercolor="darkblue" bordercolordark="darkblue" bordercolorlight="darkblue">
|
<th>Value</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th colspan="2" bgcolor="darkblue"><font color="white"><strong>Dump of FORM Variables</strong></font></th>
|
<th>FieldNames</th>
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td bgcolor="lightskyblue">FieldNames</td>
|
|
||||||
<td>#FORM.fieldNames#</td>
|
<td>#FORM.fieldNames#</td>
|
||||||
</tr>
|
</tr>
|
||||||
<cfloop list="#FORM.fieldnames#" index="key">
|
<cfloop list="#FORM.fieldnames#" index="key">
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top" bgcolor="lightskyblue">#key#</td>
|
<th>#key#</th>
|
||||||
<td style="white-space:pre">#HTMLEditFormat( evaluate( "FORM.#key#" ) )#</td>
|
<td><pre>#HTMLEditFormat( evaluate( "FORM.#key#" ) )#</pre></td>
|
||||||
</tr>
|
</tr>
|
||||||
</cfloop>
|
</cfloop>
|
||||||
</table>
|
</table>
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
This sample displays a normal HTML form with an FCKeditor with full features enabled.
|
This sample displays a normal HTML form with an FCKeditor with full features enabled.
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
<form action="sampleposteddata.asp" method="post" target="_blank">
|
<form action="../php/sampleposteddata.php" method="post" target="_blank">
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
<!--
|
<!--
|
||||||
// Automatically calculates the editor base path based on the _samples directory.
|
// Automatically calculates the editor base path based on the _samples directory.
|
||||||
|
@ -52,7 +52,7 @@ window.onload = function()
|
|||||||
It uses the "ReplaceTextarea" command to create the editor.
|
It uses the "ReplaceTextarea" command to create the editor.
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
<form action="sampleposteddata.asp" method="post" target="_blank">
|
<form action="../php/sampleposteddata.php" method="post" target="_blank">
|
||||||
<div>
|
<div>
|
||||||
<textarea name="FCKeditor1" rows="10" cols="80" style="width: 100%; height: 200px"><p>This is some <strong>sample text</strong>. You are using <a href="http://www.fckeditor.net/">FCKeditor</a>.</p></textarea>
|
<textarea name="FCKeditor1" rows="10" cols="80" style="width: 100%; height: 200px"><p>This is some <strong>sample text</strong>. You are using <a href="http://www.fckeditor.net/">FCKeditor</a>.</p></textarea>
|
||||||
</div>
|
</div>
|
||||||
|
@ -105,7 +105,7 @@ function ChangeLanguage( languageCode )
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<br />
|
<br />
|
||||||
<form action="sampleposteddata.asp" method="post" target="_blank">
|
<form action="../php/sampleposteddata.php" method="post" target="_blank">
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
<!--
|
<!--
|
||||||
// Automatically calculates the editor base path based on the _samples directory.
|
// Automatically calculates the editor base path based on the _samples directory.
|
||||||
|
@ -65,7 +65,7 @@ function ChangeLanguage( languageCode )
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<br />
|
<br />
|
||||||
<form action="sampleposteddata.asp" method="post" target="_blank">
|
<form action="../php/sampleposteddata.php" method="post" target="_blank">
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
<!--
|
<!--
|
||||||
// Automatically calculates the editor base path based on the _samples directory.
|
// Automatically calculates the editor base path based on the _samples directory.
|
||||||
|
@ -71,7 +71,7 @@ function ChangeLanguage( languageCode )
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<br />
|
<br />
|
||||||
<form action="sampleposteddata.asp" method="post" target="_blank">
|
<form action="../php/sampleposteddata.php" method="post" target="_blank">
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
<!--
|
<!--
|
||||||
// Automatically calculates the editor base path based on the _samples directory.
|
// Automatically calculates the editor base path based on the _samples directory.
|
||||||
|
@ -1,49 +1,49 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Sample custom configuration settings used in the plugin sample page (sample06).
|
* Sample custom configuration settings used in the plugin sample page (sample06).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Set our sample toolbar.
|
// Set our sample toolbar.
|
||||||
FCKConfig.ToolbarSets['PluginTest'] = [
|
FCKConfig.ToolbarSets['PluginTest'] = [
|
||||||
['SourceSimple'],
|
['SourceSimple'],
|
||||||
['My_Find','My_Replace','-','Placeholder'],
|
['My_Find','My_Replace','-','Placeholder'],
|
||||||
['StyleSimple','FontFormatSimple','FontNameSimple','FontSizeSimple'],
|
['StyleSimple','FontFormatSimple','FontNameSimple','FontSizeSimple'],
|
||||||
['Table','-','TableInsertRowAfter','TableDeleteRows','TableInsertColumnAfter','TableDeleteColumns','TableInsertCellAfter','TableDeleteCells','TableMergeCells','TableHorizontalSplitCell','TableCellProp'],
|
['Table','-','TableInsertRowAfter','TableDeleteRows','TableInsertColumnAfter','TableDeleteColumns','TableInsertCellAfter','TableDeleteCells','TableMergeCells','TableHorizontalSplitCell','TableCellProp'],
|
||||||
['Bold','Italic','-','OrderedList','UnorderedList','-','Link','Unlink'],
|
['Bold','Italic','-','OrderedList','UnorderedList','-','Link','Unlink'],
|
||||||
'/',
|
'/',
|
||||||
['My_BigStyle','-','Smiley','-','About']
|
['My_BigStyle','-','Smiley','-','About']
|
||||||
] ;
|
] ;
|
||||||
|
|
||||||
// Change the default plugin path.
|
// Change the default plugin path.
|
||||||
FCKConfig.PluginsPath = FCKConfig.BasePath.substr(0, FCKConfig.BasePath.length - 7) + '_samples/_plugins/' ;
|
FCKConfig.PluginsPath = FCKConfig.BasePath.substr(0, FCKConfig.BasePath.length - 7) + '_samples/_plugins/' ;
|
||||||
|
|
||||||
// Add our plugin to the plugins list.
|
// Add our plugin to the plugins list.
|
||||||
// FCKConfig.Plugins.Add( pluginName, availableLanguages )
|
// FCKConfig.Plugins.Add( pluginName, availableLanguages )
|
||||||
// pluginName: The plugin name. The plugin directory must match this name.
|
// pluginName: The plugin name. The plugin directory must match this name.
|
||||||
// availableLanguages: a list of available language files for the plugin (separated by a comma).
|
// availableLanguages: a list of available language files for the plugin (separated by a comma).
|
||||||
FCKConfig.Plugins.Add( 'findreplace', 'en,fr,it' ) ;
|
FCKConfig.Plugins.Add( 'findreplace', 'en,fr,it' ) ;
|
||||||
FCKConfig.Plugins.Add( 'samples' ) ;
|
FCKConfig.Plugins.Add( 'samples' ) ;
|
||||||
|
|
||||||
// If you want to use plugins found on other directories, just use the third parameter.
|
// If you want to use plugins found on other directories, just use the third parameter.
|
||||||
var sOtherPluginPath = FCKConfig.BasePath.substr(0, FCKConfig.BasePath.length - 7) + 'editor/plugins/' ;
|
var sOtherPluginPath = FCKConfig.BasePath.substr(0, FCKConfig.BasePath.length - 7) + 'editor/plugins/' ;
|
||||||
FCKConfig.Plugins.Add( 'placeholder', 'de,en,es,fr,it,pl', sOtherPluginPath ) ;
|
FCKConfig.Plugins.Add( 'placeholder', 'de,en,es,fr,it,pl', sOtherPluginPath ) ;
|
||||||
FCKConfig.Plugins.Add( 'tablecommands', null, sOtherPluginPath ) ;
|
FCKConfig.Plugins.Add( 'tablecommands', null, sOtherPluginPath ) ;
|
||||||
FCKConfig.Plugins.Add( 'simplecommands', null, sOtherPluginPath ) ;
|
FCKConfig.Plugins.Add( 'simplecommands', null, sOtherPluginPath ) ;
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
<form action="sampleposteddata.asp" method="post" target="_blank">
|
<form action="../php/sampleposteddata.php" method="post" target="_blank">
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
<!--
|
<!--
|
||||||
// Automatically calculates the editor base path based on the _samples directory.
|
// Automatically calculates the editor base path based on the _samples directory.
|
||||||
@ -57,7 +57,7 @@ var oFCKeditor = new FCKeditor( 'FCKeditor1' ) ;
|
|||||||
oFCKeditor.BasePath = sBasePath ;
|
oFCKeditor.BasePath = sBasePath ;
|
||||||
|
|
||||||
// Set the custom configurations file path (in this way the original file is mantained).
|
// Set the custom configurations file path (in this way the original file is mantained).
|
||||||
oFCKeditor.Config['CustomConfigurationsPath'] = sBasePath + '_samples/html/sample06.config.js' ;
|
oFCKeditor.Config['CustomConfigurationsPath'] = sBasePath + '_samples/html/assets/sample06.config.js' ;
|
||||||
|
|
||||||
// Let's use a custom toolbar for this sample.
|
// Let's use a custom toolbar for this sample.
|
||||||
oFCKeditor.ToolbarSet = 'PluginTest' ;
|
oFCKeditor.ToolbarSet = 'PluginTest' ;
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
to </HTML>).
|
to </HTML>).
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
<form action="sampleposteddata.asp" method="post" target="_blank">
|
<form action="../php/sampleposteddata.php" method="post" target="_blank">
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
<!--
|
<!--
|
||||||
// Automatically calculates the editor base path based on the _samples directory.
|
// Automatically calculates the editor base path based on the _samples directory.
|
||||||
|
@ -148,7 +148,7 @@ function ResetIsDirty()
|
|||||||
at runtime.
|
at runtime.
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
<form action="sampleposteddata.asp" method="post" target="_blank">
|
<form action="../php/sampleposteddata.php" method="post" target="_blank">
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
<!--
|
<!--
|
||||||
// Automatically calculates the editor base path based on the _samples directory.
|
// Automatically calculates the editor base path based on the _samples directory.
|
||||||
|
@ -57,7 +57,7 @@ function FCKeditor_OnFocus( editorInstance )
|
|||||||
in the JavaScript API.
|
in the JavaScript API.
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
<form action="sampleposteddata.asp" method="post" target="_blank">
|
<form action="../php/sampleposteddata.php" method="post" target="_blank">
|
||||||
Normal text field:<br />
|
Normal text field:<br />
|
||||||
<input name="NormaText" value="Plain Text" />
|
<input name="NormaText" value="Plain Text" />
|
||||||
<br />
|
<br />
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
<hr />
|
<hr />
|
||||||
<div id="xToolbar"></div>
|
<div id="xToolbar"></div>
|
||||||
<hr />
|
<hr />
|
||||||
<form action="sampleposteddata.asp" method="post" target="_blank">
|
<form action="../php/sampleposteddata.php" method="post" target="_blank">
|
||||||
Normal text field:<br />
|
Normal text field:<br />
|
||||||
<input name="NormaText" value="Plain Text" />
|
<input name="NormaText" value="Plain Text" />
|
||||||
<br />
|
<br />
|
||||||
|
@ -38,6 +38,6 @@
|
|||||||
<hr />
|
<hr />
|
||||||
<div id="xToolbar"></div>
|
<div id="xToolbar"></div>
|
||||||
<hr />
|
<hr />
|
||||||
<iframe src="sample11_frame.html" width="100%" height="300"></iframe>
|
<iframe src="assets/sample11_frame.html" width="100%" height="300"></iframe>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -76,7 +76,7 @@ function ChangeMode()
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<br />
|
<br />
|
||||||
<form action="sampleposteddata.asp" method="post" target="_blank">
|
<form action="../php/sampleposteddata.php" method="post" target="_blank">
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
<!--
|
<!--
|
||||||
// Automatically calculates the editor base path based on the _samples directory.
|
// Automatically calculates the editor base path based on the _samples directory.
|
||||||
|
@ -125,7 +125,7 @@ function PrepareSave()
|
|||||||
operations so it will work even if the internal implementation changes.
|
operations so it will work even if the internal implementation changes.
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
<form action="sampleposteddata.asp" method="post" target="_blank" onsubmit="PrepareSave();">
|
<form action="../php/sampleposteddata.php" method="post" target="_blank" onsubmit="PrepareSave();">
|
||||||
<div id="Textarea">
|
<div id="Textarea">
|
||||||
<input type="button" value="Switch to FCKeditor" onclick="Toggle()" />
|
<input type="button" value="Switch to FCKeditor" onclick="Toggle()" />
|
||||||
<br />
|
<br />
|
||||||
|
@ -1,121 +1,121 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Configuration settings used by the XHTML 1.1 sample page (sample14.html).
|
* Configuration settings used by the XHTML 1.1 sample page (sample14.html).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Our intention is force all formatting features to use CSS classes or
|
// Our intention is force all formatting features to use CSS classes or
|
||||||
// semantic aware elements.
|
// semantic aware elements.
|
||||||
|
|
||||||
// Load our custom CSS files for this sample.
|
// Load our custom CSS files for this sample.
|
||||||
// We are using "BasePath" just for this sample convenience. In normal
|
// We are using "BasePath" just for this sample convenience. In normal
|
||||||
// situations it would be just pointed to the file directly,
|
// situations it would be just pointed to the file directly,
|
||||||
// like "/css/myfile.css".
|
// like "/css/myfile.css".
|
||||||
FCKConfig.EditorAreaCSS = FCKConfig.BasePath + '../_samples/html/sample14.styles.css' ;
|
FCKConfig.EditorAreaCSS = FCKConfig.BasePath + '../_samples/html/sample14.styles.css' ;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Core styles.
|
* Core styles.
|
||||||
*/
|
*/
|
||||||
FCKConfig.CoreStyles.Bold = { Element : 'span', Attributes : { 'class' : 'Bold' } } ;
|
FCKConfig.CoreStyles.Bold = { Element : 'span', Attributes : { 'class' : 'Bold' } } ;
|
||||||
FCKConfig.CoreStyles.Italic = { Element : 'span', Attributes : { 'class' : 'Italic' } } ;
|
FCKConfig.CoreStyles.Italic = { Element : 'span', Attributes : { 'class' : 'Italic' } } ;
|
||||||
FCKConfig.CoreStyles.Underline = { Element : 'span', Attributes : { 'class' : 'Underline' } } ;
|
FCKConfig.CoreStyles.Underline = { Element : 'span', Attributes : { 'class' : 'Underline' } } ;
|
||||||
FCKConfig.CoreStyles.StrikeThrough = { Element : 'span', Attributes : { 'class' : 'StrikeThrough' } } ;
|
FCKConfig.CoreStyles.StrikeThrough = { Element : 'span', Attributes : { 'class' : 'StrikeThrough' } } ;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Font face
|
* Font face
|
||||||
*/
|
*/
|
||||||
// List of fonts available in the toolbar combo. Each font definition is
|
// List of fonts available in the toolbar combo. Each font definition is
|
||||||
// separated by a semi-colon (;). We are using class names here, so each font
|
// separated by a semi-colon (;). We are using class names here, so each font
|
||||||
// is defined by {Class Name}/{Combo Label}.
|
// is defined by {Class Name}/{Combo Label}.
|
||||||
FCKConfig.FontNames = 'FontComic/Comic Sans MS;FontCourier/Courier New;FontTimes/Times New Roman' ;
|
FCKConfig.FontNames = 'FontComic/Comic Sans MS;FontCourier/Courier New;FontTimes/Times New Roman' ;
|
||||||
|
|
||||||
// Define the way font elements will be applied to the document. The "span"
|
// Define the way font elements will be applied to the document. The "span"
|
||||||
// element will be used. When a font is selected, the font name defined in the
|
// element will be used. When a font is selected, the font name defined in the
|
||||||
// above list is passed to this definition with the name "Font", being it
|
// above list is passed to this definition with the name "Font", being it
|
||||||
// injected in the "class" attribute.
|
// injected in the "class" attribute.
|
||||||
// We must also instruct the editor to replace span elements that are used to
|
// We must also instruct the editor to replace span elements that are used to
|
||||||
// set the font (Overrides).
|
// set the font (Overrides).
|
||||||
FCKConfig.CoreStyles.FontFace =
|
FCKConfig.CoreStyles.FontFace =
|
||||||
{
|
{
|
||||||
Element : 'span',
|
Element : 'span',
|
||||||
Attributes : { 'class' : '#("Font")' },
|
Attributes : { 'class' : '#("Font")' },
|
||||||
Overrides : [ { Element : 'span', Attributes : { 'class' : /^Font(?:Comic|Courier|Times)$/ } } ]
|
Overrides : [ { Element : 'span', Attributes : { 'class' : /^Font(?:Comic|Courier|Times)$/ } } ]
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Font sizes.
|
* Font sizes.
|
||||||
*/
|
*/
|
||||||
FCKConfig.FontSizes = 'FontSmaller/Smaller;FontLarger/Larger;FontSmall/8pt;FontBig/14pt;FontDouble/Double Size' ;
|
FCKConfig.FontSizes = 'FontSmaller/Smaller;FontLarger/Larger;FontSmall/8pt;FontBig/14pt;FontDouble/Double Size' ;
|
||||||
FCKConfig.CoreStyles.Size =
|
FCKConfig.CoreStyles.Size =
|
||||||
{
|
{
|
||||||
Element : 'span',
|
Element : 'span',
|
||||||
Attributes : { 'class' : '#("Size")' },
|
Attributes : { 'class' : '#("Size")' },
|
||||||
Overrides : [ { Element : 'span', Attributes : { 'class' : /^Font(?:Smaller|Larger|Small|Big|Double)$/ } } ]
|
Overrides : [ { Element : 'span', Attributes : { 'class' : /^Font(?:Smaller|Larger|Small|Big|Double)$/ } } ]
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Font colors.
|
* Font colors.
|
||||||
*/
|
*/
|
||||||
FCKConfig.EnableMoreFontColors = false ;
|
FCKConfig.EnableMoreFontColors = false ;
|
||||||
FCKConfig.FontColors = 'ff9900/FontColor1,0066cc/FontColor2,ff0000/FontColor3' ;
|
FCKConfig.FontColors = 'ff9900/FontColor1,0066cc/FontColor2,ff0000/FontColor3' ;
|
||||||
FCKConfig.CoreStyles.Color =
|
FCKConfig.CoreStyles.Color =
|
||||||
{
|
{
|
||||||
Element : 'span',
|
Element : 'span',
|
||||||
Attributes : { 'class' : '#("Color")' },
|
Attributes : { 'class' : '#("Color")' },
|
||||||
Overrides : [ { Element : 'span', Attributes : { 'class' : /^FontColor(?:1|2|3)$/ } } ]
|
Overrides : [ { Element : 'span', Attributes : { 'class' : /^FontColor(?:1|2|3)$/ } } ]
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
FCKConfig.CoreStyles.BackColor =
|
FCKConfig.CoreStyles.BackColor =
|
||||||
{
|
{
|
||||||
Element : 'span',
|
Element : 'span',
|
||||||
Attributes : { 'class' : '#("Color")BG' },
|
Attributes : { 'class' : '#("Color")BG' },
|
||||||
Overrides : [ { Element : 'span', Attributes : { 'class' : /^FontColor(?:1|2|3)BG$/ } } ]
|
Overrides : [ { Element : 'span', Attributes : { 'class' : /^FontColor(?:1|2|3)BG$/ } } ]
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indentation.
|
* Indentation.
|
||||||
*/
|
*/
|
||||||
FCKConfig.IndentClasses = [ 'Indent1', 'Indent2', 'Indent3' ] ;
|
FCKConfig.IndentClasses = [ 'Indent1', 'Indent2', 'Indent3' ] ;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Paragraph justification.
|
* Paragraph justification.
|
||||||
*/
|
*/
|
||||||
FCKConfig.JustifyClasses = [ 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyFull' ] ;
|
FCKConfig.JustifyClasses = [ 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyFull' ] ;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Styles combo.
|
* Styles combo.
|
||||||
*/
|
*/
|
||||||
FCKConfig.StylesXmlPath = '' ;
|
FCKConfig.StylesXmlPath = '' ;
|
||||||
FCKConfig.CustomStyles =
|
FCKConfig.CustomStyles =
|
||||||
{
|
{
|
||||||
'Strong Emphasis' : { Element : 'strong' },
|
'Strong Emphasis' : { Element : 'strong' },
|
||||||
'Emphasis' : { Element : 'em' },
|
'Emphasis' : { Element : 'em' },
|
||||||
|
|
||||||
'Computer Code' : { Element : 'code' },
|
'Computer Code' : { Element : 'code' },
|
||||||
'Keyboard Phrase' : { Element : 'kbd' },
|
'Keyboard Phrase' : { Element : 'kbd' },
|
||||||
'Sample Text' : { Element : 'samp' },
|
'Sample Text' : { Element : 'samp' },
|
||||||
'Variable' : { Element : 'var' },
|
'Variable' : { Element : 'var' },
|
||||||
|
|
||||||
'Deleted Text' : { Element : 'del' },
|
'Deleted Text' : { Element : 'del' },
|
||||||
'Inserted Text' : { Element : 'ins' },
|
'Inserted Text' : { Element : 'ins' },
|
||||||
|
|
||||||
'Cited Work' : { Element : 'cite' },
|
'Cited Work' : { Element : 'cite' },
|
||||||
'Inline Quotation' : { Element : 'q' }
|
'Inline Quotation' : { Element : 'q' }
|
||||||
} ;
|
} ;
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
or the "style" attribute, are avoided.
|
or the "style" attribute, are avoided.
|
||||||
</div>
|
</div>
|
||||||
<hr />
|
<hr />
|
||||||
<form action="sampleposteddata.asp" method="post" target="_blank">
|
<form action="../php/sampleposteddata.php" method="post" target="_blank">
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
<!--
|
<!--
|
||||||
// Automatically calculates the editor base path based on the _samples directory.
|
// Automatically calculates the editor base path based on the _samples directory.
|
||||||
@ -52,7 +52,7 @@ oFCKeditor.BasePath = sBasePath ;
|
|||||||
|
|
||||||
// Instruct the editor to load our configurations from a custom file, leaving the
|
// Instruct the editor to load our configurations from a custom file, leaving the
|
||||||
// original configuration file untouched.
|
// original configuration file untouched.
|
||||||
oFCKeditor.Config['CustomConfigurationsPath'] = sBasePath + '_samples/html/sample14.config.js' ;
|
oFCKeditor.Config['CustomConfigurationsPath'] = sBasePath + '_samples/html/assets/sample14.config.js' ;
|
||||||
|
|
||||||
oFCKeditor.Height = 300 ;
|
oFCKeditor.Height = 300 ;
|
||||||
oFCKeditor.Value = '<p>This is some <span class="Bold">sample text<\/span>. You are using <a href="http://www.fckeditor.net/">FCKeditor<\/a>.<\/p>' ;
|
oFCKeditor.Value = '<p>This is some <span class="Bold">sample text<\/span>. You are using <a href="http://www.fckeditor.net/">FCKeditor<\/a>.<\/p>' ;
|
||||||
|
@ -28,21 +28,24 @@
|
|||||||
<title>FCKeditor - Samples - Posted Data</title>
|
<title>FCKeditor - Samples - Posted Data</title>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
<meta name="robots" content="noindex, nofollow">
|
<meta name="robots" content="noindex, nofollow">
|
||||||
<link href="../sample.css" rel="stylesheet" type="text/css" />
|
<link href="../sample.css" rel="stylesheet" type="text/css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>FCKeditor - Samples - Posted Data</h1>
|
<h1>FCKeditor - Samples - Posted Data</h1>
|
||||||
This page lists all data posted by the form.
|
This page lists all data posted by the form.
|
||||||
<hr>
|
<hr>
|
||||||
<table width="100%" border="1" cellspacing="0" bordercolor="#999999">
|
<table border="1" cellspacing="0" id="outputSample">
|
||||||
<tr style="FONT-WEIGHT: bold; COLOR: #dddddd; BACKGROUND-COLOR: #999999">
|
<colgroup><col width="80"><col></colgroup>
|
||||||
<td nowrap>Field Name </td>
|
<thead>
|
||||||
<td>Value</td>
|
<tr>
|
||||||
</tr>
|
<th>Field Name</th>
|
||||||
|
<th>Value</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
[iterate(client_postparams, local('this'))]
|
[iterate(client_postparams, local('this'))]
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top" nowrap><b>[#this->first]</b></td>
|
<th>[#this->first]</th>
|
||||||
<td width="100%" style="white-space:pre">[#this->second]</td>
|
<td><pre>[#this->second]</pre></td>
|
||||||
</tr>
|
</tr>
|
||||||
[/iterate]
|
[/iterate]
|
||||||
</table>
|
</table>
|
||||||
|
@ -70,31 +70,33 @@ require '../../fckeditor.pl';
|
|||||||
print "Content-type: text/html\n\n";
|
print "Content-type: text/html\n\n";
|
||||||
print <<"_HTML_TAG_";
|
print <<"_HTML_TAG_";
|
||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||||
|
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>FCKeditor - Samples - Posted Data</title>
|
<title>FCKeditor - Samples - Posted Data</title>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
<meta name="robots" content="noindex, nofollow">
|
<meta name="robots" content="noindex, nofollow">
|
||||||
<link href="../sample.css" rel="stylesheet" type="text/css" />
|
<link href="../sample.css" rel="stylesheet" type="text/css" >
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>FCKeditor - Samples - Posted Data</h1>
|
<h1>FCKeditor - Samples - Posted Data</h1>
|
||||||
This page lists all data posted by the form.
|
This page lists all data posted by the form.
|
||||||
<hr>
|
<hr>
|
||||||
<table width="100%" border="1" cellspacing="0" bordercolor="#999999">
|
<table border="1" cellspacing="0" id="outputSample">
|
||||||
<tr style="FONT-WEIGHT: bold; COLOR: #dddddd; BACKGROUND-COLOR: #999999">
|
<colgroup><col width="80"><col></colgroup>
|
||||||
<td nowrap>Field Name </td>
|
<thead>
|
||||||
<td>Value</td>
|
<tr>
|
||||||
</tr>
|
<th>Field Name</th>
|
||||||
|
<th>Value</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
_HTML_TAG_
|
_HTML_TAG_
|
||||||
|
|
||||||
foreach $key (keys %FORM) {
|
foreach $key (keys %FORM) {
|
||||||
$postedValue = &specialchar_cnv($FORM{$key});
|
$postedValue = &specialchar_cnv($FORM{$key});
|
||||||
print <<"_HTML_TAG_";
|
print <<"_HTML_TAG_";
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top" nowrap><b>$key</b></td>
|
<th>$key</th>
|
||||||
<td width="100%" style="white-space:pre">$postedValue</td>
|
<td><pre>$postedValue</pre></td>
|
||||||
</tr>
|
</tr>
|
||||||
_HTML_TAG_
|
_HTML_TAG_
|
||||||
}
|
}
|
||||||
|
@ -1,57 +1,57 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Sample page.
|
* Sample page.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
include("../../fckeditor.php") ;
|
include("../../fckeditor.php") ;
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>FCKeditor - Sample</title>
|
<title>FCKeditor - Sample</title>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
<meta name="robots" content="noindex, nofollow">
|
<meta name="robots" content="noindex, nofollow">
|
||||||
<link href="../sample.css" rel="stylesheet" type="text/css" />
|
<link href="../sample.css" rel="stylesheet" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>FCKeditor - PHP - Sample 1</h1>
|
<h1>FCKeditor - PHP - Sample 1</h1>
|
||||||
This sample displays a normal HTML form with an FCKeditor with full features
|
This sample displays a normal HTML form with an FCKeditor with full features
|
||||||
enabled.
|
enabled.
|
||||||
<hr>
|
<hr>
|
||||||
<form action="sampleposteddata.php" method="post" target="_blank">
|
<form action="sampleposteddata.php" method="post" target="_blank">
|
||||||
<?php
|
<?php
|
||||||
// Automatically calculates the editor base path based on the _samples directory.
|
// Automatically calculates the editor base path based on the _samples directory.
|
||||||
// This is usefull only for these samples. A real application should use something like this:
|
// This is usefull only for these samples. A real application should use something like this:
|
||||||
// $oFCKeditor->BasePath = '/fckeditor/' ; // '/fckeditor/' is the default value.
|
// $oFCKeditor->BasePath = '/fckeditor/' ; // '/fckeditor/' is the default value.
|
||||||
$sBasePath = $_SERVER['PHP_SELF'] ;
|
$sBasePath = $_SERVER['PHP_SELF'] ;
|
||||||
$sBasePath = substr( $sBasePath, 0, strpos( $sBasePath, "_samples" ) ) ;
|
$sBasePath = substr( $sBasePath, 0, strpos( $sBasePath, "_samples" ) ) ;
|
||||||
|
|
||||||
$oFCKeditor = new FCKeditor('FCKeditor1') ;
|
$oFCKeditor = new FCKeditor('FCKeditor1') ;
|
||||||
$oFCKeditor->BasePath = $sBasePath ;
|
$oFCKeditor->BasePath = $sBasePath ;
|
||||||
$oFCKeditor->Value = '<p>This is some <strong>sample text</strong>. You are using <a href="http://www.fckeditor.net/">FCKeditor</a>.</p>' ;
|
$oFCKeditor->Value = '<p>This is some <strong>sample text</strong>. You are using <a href="http://www.fckeditor.net/">FCKeditor</a>.</p>' ;
|
||||||
$oFCKeditor->Create() ;
|
$oFCKeditor->Create() ;
|
||||||
?>
|
?>
|
||||||
<br>
|
<br>
|
||||||
<input type="submit" value="Submit">
|
<input type="submit" value="Submit">
|
||||||
</form>
|
</form>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,108 +1,108 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Sample page.
|
* Sample page.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
include("../../fckeditor.php") ;
|
include("../../fckeditor.php") ;
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>FCKeditor - Sample</title>
|
<title>FCKeditor - Sample</title>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
<meta name="robots" content="noindex, nofollow">
|
<meta name="robots" content="noindex, nofollow">
|
||||||
<link href="../sample.css" rel="stylesheet" type="text/css" />
|
<link href="../sample.css" rel="stylesheet" type="text/css" />
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
function FCKeditor_OnComplete( editorInstance )
|
function FCKeditor_OnComplete( editorInstance )
|
||||||
{
|
{
|
||||||
var oCombo = document.getElementById( 'cmbLanguages' ) ;
|
var oCombo = document.getElementById( 'cmbLanguages' ) ;
|
||||||
for ( code in editorInstance.Language.AvailableLanguages )
|
for ( code in editorInstance.Language.AvailableLanguages )
|
||||||
{
|
{
|
||||||
AddComboOption( oCombo, editorInstance.Language.AvailableLanguages[code] + ' (' + code + ')', code ) ;
|
AddComboOption( oCombo, editorInstance.Language.AvailableLanguages[code] + ' (' + code + ')', code ) ;
|
||||||
}
|
}
|
||||||
oCombo.value = editorInstance.Language.ActiveLanguage.Code ;
|
oCombo.value = editorInstance.Language.ActiveLanguage.Code ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function AddComboOption(combo, optionText, optionValue)
|
function AddComboOption(combo, optionText, optionValue)
|
||||||
{
|
{
|
||||||
var oOption = document.createElement("OPTION") ;
|
var oOption = document.createElement("OPTION") ;
|
||||||
|
|
||||||
combo.options.add(oOption) ;
|
combo.options.add(oOption) ;
|
||||||
|
|
||||||
oOption.innerHTML = optionText ;
|
oOption.innerHTML = optionText ;
|
||||||
oOption.value = optionValue ;
|
oOption.value = optionValue ;
|
||||||
|
|
||||||
return oOption ;
|
return oOption ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function ChangeLanguage( languageCode )
|
function ChangeLanguage( languageCode )
|
||||||
{
|
{
|
||||||
window.location.href = window.location.pathname + "?Lang=" + languageCode ;
|
window.location.href = window.location.pathname + "?Lang=" + languageCode ;
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>FCKeditor - PHP - Sample 2</h1>
|
<h1>FCKeditor - PHP - Sample 2</h1>
|
||||||
This sample shows the editor in all its available languages.
|
This sample shows the editor in all its available languages.
|
||||||
<hr>
|
<hr>
|
||||||
<table cellpadding="0" cellspacing="0" border="0">
|
<table cellpadding="0" cellspacing="0" border="0">
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
Select a language:
|
Select a language:
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<select id="cmbLanguages" onchange="ChangeLanguage(this.value);">
|
<select id="cmbLanguages" onchange="ChangeLanguage(this.value);">
|
||||||
</select>
|
</select>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<br>
|
<br>
|
||||||
<form action="sampleposteddata.php" method="post" target="_blank">
|
<form action="sampleposteddata.php" method="post" target="_blank">
|
||||||
<?php
|
<?php
|
||||||
// Automatically calculates the editor base path based on the _samples directory.
|
// Automatically calculates the editor base path based on the _samples directory.
|
||||||
// This is usefull only for these samples. A real application should use something like this:
|
// This is usefull only for these samples. A real application should use something like this:
|
||||||
// $oFCKeditor->BasePath = '/fckeditor/' ; // '/fckeditor/' is the default value.
|
// $oFCKeditor->BasePath = '/fckeditor/' ; // '/fckeditor/' is the default value.
|
||||||
$sBasePath = $_SERVER['PHP_SELF'] ;
|
$sBasePath = $_SERVER['PHP_SELF'] ;
|
||||||
$sBasePath = substr( $sBasePath, 0, strpos( $sBasePath, "_samples" ) ) ;
|
$sBasePath = substr( $sBasePath, 0, strpos( $sBasePath, "_samples" ) ) ;
|
||||||
|
|
||||||
$oFCKeditor = new FCKeditor('FCKeditor1') ;
|
$oFCKeditor = new FCKeditor('FCKeditor1') ;
|
||||||
$oFCKeditor->BasePath = $sBasePath ;
|
$oFCKeditor->BasePath = $sBasePath ;
|
||||||
|
|
||||||
if ( isset($_GET['Lang']) )
|
if ( isset($_GET['Lang']) )
|
||||||
{
|
{
|
||||||
$oFCKeditor->Config['AutoDetectLanguage'] = false ;
|
$oFCKeditor->Config['AutoDetectLanguage'] = false ;
|
||||||
$oFCKeditor->Config['DefaultLanguage'] = $_GET['Lang'] ;
|
$oFCKeditor->Config['DefaultLanguage'] = $_GET['Lang'] ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$oFCKeditor->Config['AutoDetectLanguage'] = true ;
|
$oFCKeditor->Config['AutoDetectLanguage'] = true ;
|
||||||
$oFCKeditor->Config['DefaultLanguage'] = 'en' ;
|
$oFCKeditor->Config['DefaultLanguage'] = 'en' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
$oFCKeditor->Value = '<p>This is some <strong>sample text</strong>. You are using <a href="http://www.fckeditor.net/">FCKeditor</a>.</p>' ;
|
$oFCKeditor->Value = '<p>This is some <strong>sample text</strong>. You are using <a href="http://www.fckeditor.net/">FCKeditor</a>.</p>' ;
|
||||||
$oFCKeditor->Create() ;
|
$oFCKeditor->Create() ;
|
||||||
?> <br>
|
?> <br>
|
||||||
<input type="submit" value="Submit">
|
<input type="submit" value="Submit">
|
||||||
</form>
|
</form>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,89 +1,89 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Sample page.
|
* Sample page.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
include("../../fckeditor.php") ;
|
include("../../fckeditor.php") ;
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>FCKeditor - Sample</title>
|
<title>FCKeditor - Sample</title>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
<meta name="robots" content="noindex, nofollow">
|
<meta name="robots" content="noindex, nofollow">
|
||||||
<link href="../sample.css" rel="stylesheet" type="text/css" />
|
<link href="../sample.css" rel="stylesheet" type="text/css" />
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
function FCKeditor_OnComplete( editorInstance )
|
function FCKeditor_OnComplete( editorInstance )
|
||||||
{
|
{
|
||||||
var oCombo = document.getElementById( 'cmbToolbars' ) ;
|
var oCombo = document.getElementById( 'cmbToolbars' ) ;
|
||||||
oCombo.value = editorInstance.ToolbarSet.Name ;
|
oCombo.value = editorInstance.ToolbarSet.Name ;
|
||||||
oCombo.style.visibility = '' ;
|
oCombo.style.visibility = '' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function ChangeToolbar( toolbarName )
|
function ChangeToolbar( toolbarName )
|
||||||
{
|
{
|
||||||
window.location.href = window.location.pathname + "?Toolbar=" + toolbarName ;
|
window.location.href = window.location.pathname + "?Toolbar=" + toolbarName ;
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>FCKeditor - PHP - Sample 3</h1>
|
<h1>FCKeditor - PHP - Sample 3</h1>
|
||||||
This sample shows how to change the editor toolbar.
|
This sample shows how to change the editor toolbar.
|
||||||
<hr>
|
<hr>
|
||||||
<table cellpadding="0" cellspacing="0" border="0">
|
<table cellpadding="0" cellspacing="0" border="0">
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
Select the toolbar to load:
|
Select the toolbar to load:
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<select id="cmbToolbars" onchange="ChangeToolbar(this.value);" style="VISIBILITY: hidden">
|
<select id="cmbToolbars" onchange="ChangeToolbar(this.value);" style="VISIBILITY: hidden">
|
||||||
<option value="Default" selected>Default</option>
|
<option value="Default" selected>Default</option>
|
||||||
<option value="Basic">Basic</option>
|
<option value="Basic">Basic</option>
|
||||||
</select>
|
</select>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<br>
|
<br>
|
||||||
<form action="sampleposteddata.php" method="post" target="_blank">
|
<form action="sampleposteddata.php" method="post" target="_blank">
|
||||||
<?php
|
<?php
|
||||||
// Automatically calculates the editor base path based on the _samples directory.
|
// Automatically calculates the editor base path based on the _samples directory.
|
||||||
// This is usefull only for these samples. A real application should use something like this:
|
// This is usefull only for these samples. A real application should use something like this:
|
||||||
// $oFCKeditor->BasePath = '/fckeditor/' ; // '/fckeditor/' is the default value.
|
// $oFCKeditor->BasePath = '/fckeditor/' ; // '/fckeditor/' is the default value.
|
||||||
$sBasePath = $_SERVER['PHP_SELF'] ;
|
$sBasePath = $_SERVER['PHP_SELF'] ;
|
||||||
$sBasePath = substr( $sBasePath, 0, strpos( $sBasePath, "_samples" ) ) ;
|
$sBasePath = substr( $sBasePath, 0, strpos( $sBasePath, "_samples" ) ) ;
|
||||||
|
|
||||||
$oFCKeditor = new FCKeditor('FCKeditor1') ;
|
$oFCKeditor = new FCKeditor('FCKeditor1') ;
|
||||||
$oFCKeditor->BasePath = $sBasePath ;
|
$oFCKeditor->BasePath = $sBasePath ;
|
||||||
|
|
||||||
if ( isset($_GET['Toolbar']) )
|
if ( isset($_GET['Toolbar']) )
|
||||||
$oFCKeditor->ToolbarSet = htmlspecialchars($_GET['Toolbar']);
|
$oFCKeditor->ToolbarSet = htmlspecialchars($_GET['Toolbar']);
|
||||||
|
|
||||||
$oFCKeditor->Value = '<p>This is some <strong>sample text</strong>. You are using <a href="http://www.fckeditor.net/">FCKeditor</a>.</p>' ;
|
$oFCKeditor->Value = '<p>This is some <strong>sample text</strong>. You are using <a href="http://www.fckeditor.net/">FCKeditor</a>.</p>' ;
|
||||||
$oFCKeditor->Create() ;
|
$oFCKeditor->Create() ;
|
||||||
?>
|
?>
|
||||||
<br>
|
<br>
|
||||||
<input type="submit" value="Submit">
|
<input type="submit" value="Submit">
|
||||||
</form>
|
</form>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,95 +1,95 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Sample page.
|
* Sample page.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
include("../../fckeditor.php") ;
|
include("../../fckeditor.php") ;
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>FCKeditor - Sample</title>
|
<title>FCKeditor - Sample</title>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
<meta name="robots" content="noindex, nofollow">
|
<meta name="robots" content="noindex, nofollow">
|
||||||
<link href="../sample.css" rel="stylesheet" type="text/css" />
|
<link href="../sample.css" rel="stylesheet" type="text/css" />
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
|
|
||||||
function FCKeditor_OnComplete( editorInstance )
|
function FCKeditor_OnComplete( editorInstance )
|
||||||
{
|
{
|
||||||
var oCombo = document.getElementById( 'cmbSkins' ) ;
|
var oCombo = document.getElementById( 'cmbSkins' ) ;
|
||||||
|
|
||||||
// Get the active skin.
|
// Get the active skin.
|
||||||
var sSkin = editorInstance.Config['SkinPath'] ;
|
var sSkin = editorInstance.Config['SkinPath'] ;
|
||||||
sSkin = sSkin.match( /[^\/]+(?=\/$)/g ) ;
|
sSkin = sSkin.match( /[^\/]+(?=\/$)/g ) ;
|
||||||
|
|
||||||
oCombo.value = sSkin ;
|
oCombo.value = sSkin ;
|
||||||
oCombo.style.visibility = '' ;
|
oCombo.style.visibility = '' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function ChangeSkin( skinName )
|
function ChangeSkin( skinName )
|
||||||
{
|
{
|
||||||
window.location.href = window.location.pathname + "?Skin=" + skinName ;
|
window.location.href = window.location.pathname + "?Skin=" + skinName ;
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>FCKeditor - PHP - Sample 4</h1>
|
<h1>FCKeditor - PHP - Sample 4</h1>
|
||||||
This sample shows how to change the editor skin.
|
This sample shows how to change the editor skin.
|
||||||
<hr>
|
<hr>
|
||||||
<table cellpadding="0" cellspacing="0" border="0">
|
<table cellpadding="0" cellspacing="0" border="0">
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
Select the skin to load:
|
Select the skin to load:
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<select id="cmbSkins" onchange="ChangeSkin(this.value);" style="VISIBILITY: hidden">
|
<select id="cmbSkins" onchange="ChangeSkin(this.value);" style="VISIBILITY: hidden">
|
||||||
<option value="default" selected>Default</option>
|
<option value="default" selected>Default</option>
|
||||||
<option value="office2003">Office 2003</option>
|
<option value="office2003">Office 2003</option>
|
||||||
<option value="silver">Silver</option>
|
<option value="silver">Silver</option>
|
||||||
</select>
|
</select>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<br>
|
<br>
|
||||||
<form action="sampleposteddata.php" method="post" target="_blank">
|
<form action="sampleposteddata.php" method="post" target="_blank">
|
||||||
<?php
|
<?php
|
||||||
// Automatically calculates the editor base path based on the _samples directory.
|
// Automatically calculates the editor base path based on the _samples directory.
|
||||||
// This is usefull only for these samples. A real application should use something like this:
|
// This is usefull only for these samples. A real application should use something like this:
|
||||||
// $oFCKeditor->BasePath = '/fckeditor/' ; // '/fckeditor/' is the default value.
|
// $oFCKeditor->BasePath = '/fckeditor/' ; // '/fckeditor/' is the default value.
|
||||||
$sBasePath = $_SERVER['PHP_SELF'] ;
|
$sBasePath = $_SERVER['PHP_SELF'] ;
|
||||||
$sBasePath = substr( $sBasePath, 0, strpos( $sBasePath, "_samples" ) ) ;
|
$sBasePath = substr( $sBasePath, 0, strpos( $sBasePath, "_samples" ) ) ;
|
||||||
|
|
||||||
$oFCKeditor = new FCKeditor('FCKeditor1') ;
|
$oFCKeditor = new FCKeditor('FCKeditor1') ;
|
||||||
$oFCKeditor->BasePath = $sBasePath ;
|
$oFCKeditor->BasePath = $sBasePath ;
|
||||||
|
|
||||||
if ( isset($_GET['Skin']) )
|
if ( isset($_GET['Skin']) )
|
||||||
$oFCKeditor->Config['SkinPath'] = $sBasePath . 'editor/skins/' . htmlspecialchars($_GET['Skin']) . '/' ;
|
$oFCKeditor->Config['SkinPath'] = $sBasePath . 'editor/skins/' . htmlspecialchars($_GET['Skin']) . '/' ;
|
||||||
|
|
||||||
$oFCKeditor->Value = '<p>This is some <strong>sample text</strong>. You are using <a href="http://www.fckeditor.net/">FCKeditor</a>.</p>' ;
|
$oFCKeditor->Value = '<p>This is some <strong>sample text</strong>. You are using <a href="http://www.fckeditor.net/">FCKeditor</a>.</p>' ;
|
||||||
$oFCKeditor->Create() ;
|
$oFCKeditor->Create() ;
|
||||||
?>
|
?>
|
||||||
<br>
|
<br>
|
||||||
<input type="submit" value="Submit">
|
<input type="submit" value="Submit">
|
||||||
</form>
|
</form>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,66 +1,69 @@
|
|||||||
<?php
|
<?php
|
||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* This page lists the data posted by a form.
|
* This page lists the data posted by a form.
|
||||||
*/
|
*/
|
||||||
?>
|
?>
|
||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>FCKeditor - Samples - Posted Data</title>
|
<title>FCKeditor - Samples - Posted Data</title>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
<meta name="robots" content="noindex, nofollow">
|
<meta name="robots" content="noindex, nofollow">
|
||||||
<link href="../sample.css" rel="stylesheet" type="text/css" />
|
<link href="../sample.css" rel="stylesheet" type="text/css" >
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>FCKeditor - Samples - Posted Data</h1>
|
<h1>FCKeditor - Samples - Posted Data</h1>
|
||||||
This page lists all data posted by the form.
|
This page lists all data posted by the form.
|
||||||
<hr>
|
<hr>
|
||||||
<table width="100%" border="1" cellspacing="0" bordercolor="#999999">
|
<table border="1" cellspacing="0" id="outputSample">
|
||||||
<tr style="FONT-WEIGHT: bold; COLOR: #dddddd; BACKGROUND-COLOR: #999999">
|
<colgroup><col width="80"><col></colgroup>
|
||||||
<td nowrap>Field Name </td>
|
<thead>
|
||||||
<td>Value</td>
|
<tr>
|
||||||
</tr>
|
<th>Field Name</th>
|
||||||
<?php
|
<th>Value</th>
|
||||||
|
</tr>
|
||||||
if ( isset( $_POST ) )
|
</thead>
|
||||||
$postArray = &$_POST ; // 4.1.0 or later, use $_POST
|
<?php
|
||||||
else
|
|
||||||
$postArray = &$HTTP_POST_VARS ; // prior to 4.1.0, use HTTP_POST_VARS
|
if ( isset( $_POST ) )
|
||||||
|
$postArray = &$_POST ; // 4.1.0 or later, use $_POST
|
||||||
foreach ( $postArray as $sForm => $value )
|
else
|
||||||
{
|
$postArray = &$HTTP_POST_VARS ; // prior to 4.1.0, use HTTP_POST_VARS
|
||||||
if ( get_magic_quotes_gpc() )
|
|
||||||
$postedValue = htmlspecialchars( stripslashes( $value ) ) ;
|
foreach ( $postArray as $sForm => $value )
|
||||||
else
|
{
|
||||||
$postedValue = htmlspecialchars( $value ) ;
|
if ( get_magic_quotes_gpc() )
|
||||||
|
$postedValue = htmlspecialchars( stripslashes( $value ) ) ;
|
||||||
?>
|
else
|
||||||
<tr>
|
$postedValue = htmlspecialchars( $value ) ;
|
||||||
<td valign="top" nowrap><b><?=$sForm?></b></td>
|
|
||||||
<td width="100%" style="white-space:pre"><?=$postedValue?></td>
|
?>
|
||||||
</tr>
|
<tr>
|
||||||
<?php
|
<th><?php echo $sForm?></th>
|
||||||
}
|
<td><pre><?php echo $postedValue?></pre></td>
|
||||||
?>
|
</tr>
|
||||||
</table>
|
<?php
|
||||||
</body>
|
}
|
||||||
</html>
|
?>
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
@ -53,19 +53,22 @@ print """
|
|||||||
<h1>FCKeditor - Samples - Posted Data</h1>
|
<h1>FCKeditor - Samples - Posted Data</h1>
|
||||||
This page lists all data posted by the form.
|
This page lists all data posted by the form.
|
||||||
<hr>
|
<hr>
|
||||||
<table width="100%" border="1" cellspacing="0" bordercolor="#999999">
|
<table border="1" cellspacing="0" id="outputSample">
|
||||||
<tr style="FONT-WEIGHT: bold; COLOR: #dddddd; BACKGROUND-COLOR: #999999">
|
<colgroup><col width="80"><col></colgroup>
|
||||||
<td nowrap>Field Name </td>
|
<thead>
|
||||||
<td>Value</td>
|
<tr>
|
||||||
</tr>
|
<th>Field Name</th>
|
||||||
|
<th>Value</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
"""
|
"""
|
||||||
for key in form.keys():
|
for key in form.keys():
|
||||||
try:
|
try:
|
||||||
value = form[key].value
|
value = form[key].value
|
||||||
print """
|
print """
|
||||||
<tr>
|
<tr>
|
||||||
<td valign="top" nowrap><b>%s</b></td>
|
<th>%s</th>
|
||||||
<td width="100%%" style="white-space:pre">%s</td>
|
<td><pre>%s</pre></td>
|
||||||
</tr>
|
</tr>
|
||||||
""" % (key, value)
|
""" % (key, value)
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
* Styles used in the samples pages.
|
* Styles used in the samples pages.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
body, td, input, select, textarea
|
body, td, th, input, select, textarea
|
||||||
{
|
{
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
font-family: Arial, Verdana, Sans-Serif;
|
font-family: Arial, Verdana, Sans-Serif;
|
||||||
@ -36,15 +36,39 @@ h1
|
|||||||
|
|
||||||
form
|
form
|
||||||
{
|
{
|
||||||
margin: 0px 0px 0px 0px;
|
margin: 0;
|
||||||
padding: 0px 0px 0px 0px;
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#outputSample
|
||||||
|
{
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
pre
|
pre
|
||||||
{
|
{
|
||||||
margin:0px;
|
margin: 0;
|
||||||
padding:0px;
|
padding: 0;
|
||||||
white-space: pre-wrap; /* css-3 */
|
|
||||||
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
|
white-space: pre; /* CSS2 */
|
||||||
word-wrap: break-word; /* Internet Explorer 5.5+ */
|
white-space: -moz-pre-wrap; /* Mozilla*/
|
||||||
|
white-space: -o-pre-wrap; /* Opera 7 */
|
||||||
|
white-space: pre-wrap; /* CSS 2.1 */
|
||||||
|
white-space: pre-line; /* CSS 3 (and 2.1 as well, actually) */
|
||||||
|
word-wrap: break-word; /* IE */
|
||||||
|
}
|
||||||
|
|
||||||
|
#outputSample thead th
|
||||||
|
{
|
||||||
|
color: #dddddd;
|
||||||
|
background-color: #999999;
|
||||||
|
padding: 4px;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
#outputSample tbody th
|
||||||
|
{
|
||||||
|
vertical-align: top;
|
||||||
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
@ -64,6 +64,8 @@ function OpenSample( sample )
|
|||||||
<option value="html/sample12.html">JavaScript : Sample 12 : Enter key behavior</option>
|
<option value="html/sample12.html">JavaScript : Sample 12 : Enter key behavior</option>
|
||||||
<option value="html/sample13.html">JavaScript : Sample 13 : Dinamically switching with a Textarea</option>
|
<option value="html/sample13.html">JavaScript : Sample 13 : Dinamically switching with a Textarea</option>
|
||||||
<option value="html/sample14.html">JavaScript : Sample 14 : XHTML 1.1</option>
|
<option value="html/sample14.html">JavaScript : Sample 14 : XHTML 1.1</option>
|
||||||
|
<option value="html/sample15.html">JavaScript : Sample 15 : Legacy HTML 4 tags</option>
|
||||||
|
<option value="html/sample16.html">JavaScript : Sample 16 : Flash content editor</option>
|
||||||
<option value=""></option>
|
<option value=""></option>
|
||||||
</optgroup>
|
</optgroup>
|
||||||
<optgroup label="Active Fox Pro">
|
<optgroup label="Active Fox Pro">
|
||||||
|
@ -33,261 +33,135 @@
|
|||||||
<h1>
|
<h1>
|
||||||
FCKeditor ChangeLog - What's New?</h1>
|
FCKeditor ChangeLog - What's New?</h1>
|
||||||
<h3>
|
<h3>
|
||||||
Version 2.6</h3>
|
Version 2.6.3</h3>
|
||||||
<p>
|
|
||||||
No changes. The stabilization of the 2.6 RC was completed successfully, as expected.</p>
|
|
||||||
<h3>
|
|
||||||
Version 2.6 RC</h3>
|
|
||||||
<p>
|
|
||||||
New Features and Improvements:</p>
|
|
||||||
<ul>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2017">#2017</a>] The FCKeditorAPI.Instances
|
|
||||||
object can now be used to access all FCKeditor instances available in the page.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1980">#1980</a>] <span
|
|
||||||
style="color: #ff0000">Attention:</span> By default, the editor now produces <strong>
|
|
||||||
and <em> instead of <b> and <i>.</li>
|
|
||||||
</ul>
|
|
||||||
<p>
|
<p>
|
||||||
Fixed Bugs:</p>
|
Fixed Bugs:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1924">#1924</a>] The dialog
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2412">#2412</a>] FCK.InsertHtml()
|
||||||
close button is now correctly positioned in IE in RTL languages.</li>
|
is now properly removing selected contents after content insertion in Firefox.</li>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1933">#1933</a>] Placeholder
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2420">#2420</a>] Spelling
|
||||||
dialog will now display the placeholder value correctly in IE.</li>
|
mistake corrections made by the spell checking dialog are now undoable. </li>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/957">#957</a>] Pressing
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2411">#2411</a>] Insert
|
||||||
Enter or typing after a placeholder with the placeholder plugin will no longer generate
|
anchor was not working for non-empty selections.</li>
|
||||||
colored text.</li>
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2426">#2426</a>] It was
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1952">#1952</a>] Fixed
|
impossible to switch between editor areas with a single click.</li>
|
||||||
an issue in FCKTools.FixCssUrls that, other than wrong, was breaking Opera.</li>
|
<li>Language file updates for the following languages:
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1695">#1695</a>] Removed
|
<ul>
|
||||||
Ctrl-Tab hotkey for Source mode and allowed Ctrl-T to work in Firefox.</li>
|
<li>Canadian French</li>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1666">#1666</a>] Fixed
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2402">#2402</a>] Catalan
|
||||||
permission denied errors during opening popup menus in IE6 under domain relaxation
|
</li>
|
||||||
mode.</li>
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2400">#2400</a>] Chinese
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1934">#1934</a>] Fixed
|
(Simplified and Traditional)</li>
|
||||||
JavaScript errors when calling Selection.EnsureSelection() in dialogs.</li>
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2401">#2401</a>] Croatian</li>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1920">#1920</a>] Fixed
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2422">#2422</a>] Czech</li>
|
||||||
SSL warning message when opening image and flash dialogs under HTTPS in IE6.</li>
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2417">#2417</a>] Dutch</li>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1955">#1955</a>] [<a
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2428">#2428</a>] French</li>
|
||||||
target="_blank" href="http://dev.fckeditor.net/ticket/1981">#1981</a>] [<a target="_blank"
|
<li>German</li>
|
||||||
href="http://dev.fckeditor.net/ticket/1985">#1985</a>] [<a target="_blank" href="http://dev.fckeditor.net/ticket/1989">#1989</a>]
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2427">#2427</a>] Hebrew</li>
|
||||||
Fixed XHTML source formatting errors in non-IE browsers.</li>
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2410">#2410</a>] Hindi</li>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2000">#2000</a>] The #
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2405">#2405</a>] Japanese</li>
|
||||||
character is now properly encoded in file names returned by the File Browser.</li>
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2409">#2409</a>] Norwegian
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1945">#1945</a>] New folders
|
and Norwegian Bokmål</li>
|
||||||
and file names are now properly sanitized against control characters. </li>
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2429">#2429</a>] Spanish</li>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1944">#1944</a>] Backslash
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2406">#2406</a>] Vietnamese</li>
|
||||||
character is now disallowed in current folder path.</li>
|
</ul>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1055">#1055</a>] Added
|
|
||||||
logic to override JavaScript errors occurring inside the editing frame due to user
|
|
||||||
added JavaScript code.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1647">#1647</a>] Hitting
|
|
||||||
ENTER on list items containing block elements will now create new list item elements,
|
|
||||||
instead of adding further blocks to the same list item.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1411">#1411</a>] Label
|
|
||||||
only combos now get properly grayed out when moving to source view.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2009">#2009</a>] Fixed
|
|
||||||
an important bug regarding styles removal on styled text boundaries, introduced
|
|
||||||
with the 2.6 Beta 1. </li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2011">#2011</a>] Internal
|
|
||||||
CSS <style> tags where being outputted when FullPage=true.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2016">#2016</a>] The Link
|
|
||||||
dialog now properly selects the first field when opening it to modify mailto or
|
|
||||||
anchor links. This problem was also throwing an error in IE.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2021">#2021</a>] The caret
|
|
||||||
will no longer remain behind in the editing area when the placeholder dialog is
|
|
||||||
opened.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2024">#2024</a>] Fixed
|
|
||||||
JavaScript error in IE when the user tries to open dialogs in Source mode.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1853">#1853</a>] Setting
|
|
||||||
ShiftEnterMode to p or div now works correctly when EnterMode is br.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1838">#1838</a>] Fixed
|
|
||||||
the issue where context menus sometimes don't disappear after selecting an option.
|
|
||||||
</li>
|
</li>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2028">#2028</a>] Fixed
|
|
||||||
JavaScript error when EnterMode=br and user tries to insert a page break.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2002">#2002</a>] Fixed
|
|
||||||
the issue where the maximize editor button does not vertically expand the editing
|
|
||||||
area in Firefox.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1842">#1842</a>] PHP integration:
|
|
||||||
fixed filename encoding problems in file browser.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1832">#1832</a>] Calling
|
|
||||||
FCK.InsertHtml() in non-IE browsers would now activate the document processor as
|
|
||||||
expected.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1998">#1998</a>] The native
|
|
||||||
XMLHttpRequest class is now used in IE, whenever it is available.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1792">#1792</a>] In IE,
|
|
||||||
the browser was able to enter in an infinite loop when working with multiple editors
|
|
||||||
in the same page. </li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1948">#1948</a>] Some
|
|
||||||
CSS rules are reset to dialog elements to avoid conflict with the page CSS.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1965">#1965</a>] IE was
|
|
||||||
having problems with SpellerPages, causing some errors to be thrown when completing
|
|
||||||
the spell checking in some situations.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2042">#2042</a>] The FitWindow
|
|
||||||
command was throwing an error if executed in an editor where its relative button
|
|
||||||
is not present in the toolbar.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/922">#922</a>] Implemented
|
|
||||||
a generic document processor for <OBJECT> and <EMBED> tags.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1831">#1831</a>] Fixed
|
|
||||||
the issue where the placeholder icon for <EMBED> tags does not always show
|
|
||||||
up in IE7.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2049">#2049</a>] Fixed
|
|
||||||
a deleted cursor CSS attribute in the minified CSS inside fck_dialog_common.js.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1806">#1806</a>] In IE,
|
|
||||||
the caret will not any more move to the previous line when selecting a Format style
|
|
||||||
inside an empty paragraph.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1990">#1990</a>] In IE,
|
|
||||||
dialogs using API calls which deals with the selection, like InsertHtml now can
|
|
||||||
be sure the selection will be placed in the correct position.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1997">#1997</a>] With
|
|
||||||
IE, the first character of table captions where being lost on table creation.</li>
|
|
||||||
<li>The selection and cursor position was not being properly handled when creating some
|
|
||||||
elements like forms and tables.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/662">#662</a>] In the
|
|
||||||
Perl sample files, the GetServerPath function will now calculate the path properly.</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
<p>
|
||||||
|
This version has been sponsored by <a href="http://www.dataillusion.com/fs/">Data Illusion
|
||||||
|
survey software solutions</a>.</p>
|
||||||
<h3>
|
<h3>
|
||||||
Version 2.6 Beta 1</h3>
|
Version 2.6.3 Beta</h3>
|
||||||
<p>
|
<p>
|
||||||
New Features and Improvements:</p>
|
New Features and Improvements:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/35">#35</a>] <strong>New
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/439">#439</a>] Added a
|
||||||
(and cool!) floating dialog system</strong>, avoiding problems with popup blockers
|
new <strong>context menu option for opening links</strong> in the editor.</li>
|
||||||
and enhancing the editor usability.</li>
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2220">#2220</a>] <strong>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1886">#1886</a>] <strong>
|
Email links</strong> from the Link dialog <strong>are now encoded</strong> by default
|
||||||
Adobe AIR</strong> compatibility.</li>
|
to prevent being harvested by spammers. (Kudos to asuter for proposing the patch)
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/123">#123</a>] Full support
|
</li>
|
||||||
for <strong>document.domain</strong> with automatic domain detection.</li>
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2234">#2234</a>] Added
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1622">#1622</a>] New <strong>
|
the ability to create, modify and remove <strong>DIV containers</strong>. </li>
|
||||||
inline CSS cache</strong> feature, making it possible to avoid downloading the CSS
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2247">#2247</a>] The <strong>
|
||||||
files for the editing area and skins. For that, it is enough to set the EditorAreaCSS,
|
SHIFT+SPACE</strong> keystroke will now <strong>produce a &nbsp;</strong> character.
|
||||||
SkinEditorCSS and SkinDialogCSS to string values in the format "/absolute/path/for/urls/|<minified
|
</li>
|
||||||
CSS styles". All internal CSS links are already using this feature. </li>
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2252">#2252</a>] It's
|
||||||
<li>New language file for <strong>Canadian French</strong>.</li>
|
now possible to enable the browsers default menu using the configuration file (FCKConfig.BrowserContextMenu
|
||||||
|
option). </li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2032">#2032</a>] Added
|
||||||
|
HTML samples for legacy HTML and Flash HTML. </li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/234">#234</a>] Introduced
|
||||||
|
the "PreventSubmitHandler" setting, which makes it possible to instruct the editor
|
||||||
|
to not handle the hidden field update on form submit events.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>
|
<p>
|
||||||
Fixed Bugs:</p>
|
Fixed Bugs:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1643">#1643</a>] Resolved
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2319">#2319</a>] On Opera
|
||||||
several "strict warning" messages in Firefox when running FCKeditor.</li>
|
and Firefox 3, the entire page was scrolling on SHIFT+ENTER, or when EnterMode='br'.</li>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1522">#1522</a>] The ENTER
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2321">#2321</a>] On Firefox
|
||||||
key will now work properly in IE with the cursor at the start of a formatted block.</li>
|
3, the entire page was scrolling when inserting block elements with the FCK.InsertElement
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1503">#1503</a>] It's
|
function, used by the Table and Horizontal Rule buttons.. </li>
|
||||||
possible to define in the Styles that a Style (with an empty class) must be shown
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/692">#692</a>] Added some
|
||||||
selected only when no class is present in the current element, and selecting that
|
hints in editor/css/fck_editorarea.css on how to handle style items that would break
|
||||||
item will clear the current class (it does apply to any attribute, not only classes).</li>
|
the style combo. </li>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/191">#191</a>] The scrollbars
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2263">#2263</a>] Fixed
|
||||||
are now being properly shown in Firefox Mac when placing FCKeditor inside a hidden
|
a JavaScript error in IE which occurs when there are placeholder elements in the
|
||||||
div.</li>
|
document and the user has pressed the Source button.</li>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/503">#503</a>] Orphaned
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2314">#2314</a>] Corrected
|
||||||
<li> elements now get properly enclosed in a <ul> on output.</li>
|
mixed up Chinese translations for the blockquote command.</li>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/309">#309</a>] The ENTER
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2323">#2323</a>] Fixed
|
||||||
key will not any more break <button> elements at the beginning of paragraphs.</li>
|
the issue where the show blocks command loses the current selection from the view
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1654">#1654</a>] The editor
|
area when editing a long document.</li>
|
||||||
was not loading on a specific unknown situation. The breaking point has been removed.</li>
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2322">#2322</a>] Fixed
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1707">#1707</a>] The editor
|
the issue where the fit window command loses the current selection and scroll position
|
||||||
no longer hangs when operating on documents imported from Microsoft Word.</li>
|
in the editing area.</li>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1514">#1514</a>] Floating
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1917">#1917</a>] Fixed
|
||||||
panels attached to a shared toolbar among multiple FCKeditor instances are no longer
|
the issue where the merge down command for tables cells does not work in IE for
|
||||||
misplaced when the editing areas are absolutely or relatively positioned.</li>
|
more than two cells.</li>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1715">#1715</a>] The ShowDropDialog
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2320">#2320</a>] Fixed
|
||||||
is now enforced only when ForcePasteAsPlainText = true.</li>
|
the issue where the Find/Replace dialog scrolls the entire page.</li>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1336">#1336</a>] Sometimes
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1645">#1645</a>] Added
|
||||||
the autogrow plugin didn't work properly in Firefox.</li>
|
warning message about Firefox 3's strict origin policy.</li>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1728">#1728</a>] External
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2272">#2272</a>] Improved
|
||||||
toolbars are now properly sized in Opera.</li>
|
the garbage filter in Paste from Word dialog.</li>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1782">#1782</a>] Clicking
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2327">#2327</a>] Fixed
|
||||||
on radio buttons or checkboxes in the editor in IE will no longer cause lockups
|
invalid HTML in the Paste dialog.</li>
|
||||||
in IE.</li>
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1907">#1907</a>] Fixed
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/805">#805</a>] The FCKConfig.Keystrokes
|
sporadic "FCKeditorAPI is not defined" errors in Firefox 3.</li>
|
||||||
commands where executed even if the command itself was disabled.</li>
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2356">#2356</a>] Fixed
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/982">#982</a>] The button
|
access denied error in IE7 when FCKeditor is launched from local filesystem.</li>
|
||||||
to empty the box in the "Paste from Word" has been removed as it leads to confusion
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1150">#1150</a>] Fixed
|
||||||
for some users.</li>
|
the type="_moz" attribute that sometimes appear in <br> tags in non-IE browsers.</li>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1682">#1682</a>] Editing
|
|
||||||
control elements in Firefox, Opera and Safari now works properly.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1613">#1613</a>] The editor
|
|
||||||
was surrounded by a <div> element that wasn't really needed.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/676">#676</a>] If a form
|
|
||||||
control was moved in IE after creating it, then it did lose its name.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/738">#738</a>] It wasn't
|
|
||||||
possible to change the type of an existing button.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1854">#1854</a>] Indentation
|
|
||||||
now works inside table cells.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1717">#1717</a>] The editor
|
|
||||||
was entering on looping on some specific cases when dealing with invalid source
|
|
||||||
markup.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1530">#1530</a>] Pasting
|
|
||||||
text into the "Find what" fields in the Find and Replace dialog would now activate
|
|
||||||
the find and replace buttons.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1828">#1828</a>] The Find/Replace
|
|
||||||
dialog will no longer display wrong starting positions for the match when there
|
|
||||||
are multiple and identical characters preceding the character at the real starting
|
|
||||||
point of the match.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1878">#1878</a>] Fixed
|
|
||||||
a JavaScript error which occurs in the Find/Replace dialog when the user presses
|
|
||||||
"Find" or "Replace" after the "No match found" message has appeared.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1355">#1355</a>] Line
|
|
||||||
breaks and spaces are now conserved when converting to and from the "Formatted"
|
|
||||||
format.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1670">#1670</a>] Improved
|
|
||||||
the background color behind smiley icons and special characters in their corresponding
|
|
||||||
dialogs.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1693">#1693</a>] Custom
|
|
||||||
error messages are now properly displayed in the file browser.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/970">#970</a>] The text
|
|
||||||
and value fields in the selection box dialog will no longer extend beyond the dialog
|
|
||||||
limits when the user inputs a very long text or value for one of the selection options.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/479">#479</a>] Fixed the
|
|
||||||
issue where pressing Enter in an <o:p> tag in IE does not generate line breaks.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/481">#481</a>] Fixed the
|
|
||||||
issue where the image preview in image dialog sometimes doesn't display after selecting
|
|
||||||
the image from server browser.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1488">#1488</a>] PHP integration:
|
|
||||||
the FCKeditor class is now more PHP5/6 friendly ("public" keyword is used instead
|
|
||||||
of depreciated "var").</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1815">#1815</a>] PHP integration:
|
|
||||||
removed closing tag: "?>", so no additional whitespace added when files are included.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1906">#1906</a>] PHP file
|
|
||||||
browser: fixed problems with DetectHtml() function when open_basedir was set.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1871">#1871</a>] PHP file
|
|
||||||
browser: permissions applied with the chmod command are now configurable.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1872">#1872</a>] Perl
|
|
||||||
file browser: permissions applied with the chmod command are now configurable.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1873">#1873</a>] Python
|
|
||||||
file browser: permissions applied with the chmod command are now configurable.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1572">#1572</a>] ColdFusion
|
|
||||||
integration: fixed issues with setting the editor height.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1692">#1692</a>] ColdFusion
|
|
||||||
file browser: it is possible now to define TempDirectory to avoid issues with GetTempdirectory()
|
|
||||||
returning an empty string.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1379">#1379</a>] ColdFusion
|
|
||||||
file browser: resolved issues with OnRequestEnd.cfm breaking the file browser.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1509">#1509</a>] InsertHtml()
|
|
||||||
in IE will no longer turn the preceding normal whitespace into &nbsp;.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/958">#958</a>] The AddItem
|
|
||||||
method now has an additional fifth parameter "customData" that will be sent to the
|
|
||||||
Execute method of the command for that menu item, allowing a single command to be
|
|
||||||
used for different menu items..</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1502">#1502</a>] The RemoveFormat
|
|
||||||
command now also removes the attributes from the cleaned text. The list of attributes
|
|
||||||
is configurable with FCKConfig.RemoveAttributes.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1596">#1596</a>] On Safari,
|
|
||||||
dialogs have now right-to-left layout when it runs a RTL language, like Arabic.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1344">#1344</a>] Added
|
|
||||||
warning message on Copy and Cut operation failure on IE due to paste permission
|
|
||||||
settings.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1868">#1868</a>] Links
|
|
||||||
to file browser has been changed to avoid requests containing double dots.</li>
|
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1229">#1229</a>] Converting
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1229">#1229</a>] Converting
|
||||||
multiple contiguous paragraphs to Formatted will now be merged into a single <PRE>
|
multiple contiguous paragraphs to Formatted will now be merged into a single <PRE>
|
||||||
block.</li>
|
block.</li>
|
||||||
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1627">#1627</a>] Samples
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2363">#2363</a>] There
|
||||||
failed to load from local filesystem in IE7.</li>
|
were some sporadic "Permission Denied" errors with IE on some situations.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2135">#2135</a>] Fixed
|
||||||
|
a data loss bug in IE when there are @import statements in the editor's CSS files,
|
||||||
|
and IE's cache is set to "Check for newer versions on every visit".</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2376">#2376</a>] FCK.InsertHtml()
|
||||||
|
will now insert to the last selected position after the user has selected things
|
||||||
|
outside of FCKeditor, in IE.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2368">#2368</a>] Fixed
|
||||||
|
broken protect source logic for comments in IE.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2387">#2387</a>] Fixed
|
||||||
|
JavaScript error with list commands when the editable document is selected with
|
||||||
|
Ctrl-A.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2390">#2390</a>] Fixed
|
||||||
|
the issue where indent styles in JavaScript-generated <p> blocks are erased
|
||||||
|
in IE.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2394">#2394</a>] Fixed
|
||||||
|
JavaScript error with the "split vertically" command in IE when attempting to split
|
||||||
|
cells in the last row of a table.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2316">#2316</a>] The sample
|
||||||
|
posted data page has now the table fixed at 100% width. </li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2396">#2396</a>] SpellerPages
|
||||||
|
was causing a "Permission Denied" error in some situations. </li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>
|
<p>
|
||||||
<a href="_whatsnew_history.html">See previous versions history</a>
|
<a href="_whatsnew_history.html">See previous versions history</a></p>
|
||||||
</p>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -32,6 +32,420 @@
|
|||||||
<body>
|
<body>
|
||||||
<h1>
|
<h1>
|
||||||
FCKeditor ChangeLog - What's New?</h1>
|
FCKeditor ChangeLog - What's New?</h1>
|
||||||
|
<h3>
|
||||||
|
Version 2.6.2</h3>
|
||||||
|
<p>
|
||||||
|
New Features and Improvements:</p>
|
||||||
|
<ul>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2043">#2043</a>] The debug
|
||||||
|
script is not any more part of the compressed files. If FCKeditor native debugging
|
||||||
|
features (FCKDebug) are required, the _source folder must be present in your installation.</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
Fixed Bugs:</p>
|
||||||
|
<ul>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2248">#2248</a>] Calling
|
||||||
|
FCK.InsertHtml( 'nbsp;') was inserting a plain space instead of a non breaking space
|
||||||
|
character.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2273">#2273</a>] The dragresizetable
|
||||||
|
plugin now works in Firefox 3 as well.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2254">#2254</a>] Minor
|
||||||
|
fix in FCKSelection for nodeTagName object.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1614">#1614</a>] Unified
|
||||||
|
FCKConfig.FullBasePath with FCKConfig.BasePath.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2127">#2127</a>] Changed
|
||||||
|
floating dialogs to use fixed positioning so that they are no longer affected by
|
||||||
|
scrolling.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2018">#2018</a>] Reversed
|
||||||
|
the fix for <a target="_blank" href="http://dev.fckeditor.net/ticket/183">#183</a>
|
||||||
|
which broke FCKeditorAPI's cleanup logic. A new configuration directive <strong>MsWebBrowserControlCompat</strong>
|
||||||
|
has been added for those who wish to force the #183 fix to be enabled.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2276">#2276</a>] [<a
|
||||||
|
target="_blank" href="http://dev.fckeditor.net/ticket/2279">#2279</a>] On Opera
|
||||||
|
and Firefox 3, the entire page was scrolling on ENTER.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2149">#2149</a>] CSS urls
|
||||||
|
with querystring parameters were not being accepted for CSS values in the configuration
|
||||||
|
file (like EditorAreaCSS).</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2287">#2287</a>] On some
|
||||||
|
specific cases, with Firefox 2, some extra spacing was appearing in the final HTML
|
||||||
|
on posting, if inserting two successive tables.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2287">#2287</a>] Block
|
||||||
|
elements (like tables or horizontal rules) will be inserted correctly now when the
|
||||||
|
cursor is at the start or the end of blocks. No extra paragraphs will be included
|
||||||
|
in this operation.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2149">#2197</a>] The TAB
|
||||||
|
key will now have the default browser behavior if TabSpaces=0. It will move the
|
||||||
|
focus out of the editor (expect on Safari).</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2296">#2296</a>] Fixed
|
||||||
|
permission denied error on clicking on files in the file browser.</li>
|
||||||
|
</ul>
|
||||||
|
<h3>
|
||||||
|
Version 2.6.1</h3>
|
||||||
|
<p>
|
||||||
|
New Features and Improvements:</p>
|
||||||
|
<ul>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2150">#2150</a>] The searching
|
||||||
|
speed of the Find/Replace dialog has been vastly improved.</li>
|
||||||
|
<li>New language file for <strong>Gujarati</strong> (by Nilam Doctor).</li>
|
||||||
|
<li>A new TabIndex property has been added to the JavaScript integration files.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2215">#2215</a>] Following
|
||||||
|
the above new feature, the ReplaceTextarea method will now copy the textarea.tabIndex
|
||||||
|
value if available.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2163">#2163</a>] If the
|
||||||
|
FCKConfig.DocType setting points to a HTML DocType then the output won't generate
|
||||||
|
self-closing tags (it will output <img > instead of <img />).</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2173">#2173</a>] A throbber
|
||||||
|
will be shown in the Quick Uploads.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2142">#2142</a>] HTML
|
||||||
|
samples will now use sampleposteddata.php in action parameter inside a form.</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
Fixed Bugs:</p>
|
||||||
|
<ul>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/768">#768</a>] It is no
|
||||||
|
longer possible for an image to have its width and height defined with both HTML
|
||||||
|
attributes and inline CSS styles in IE.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1426">#1426</a>] Fixed
|
||||||
|
the error loading fckstyles.xml in servers which cannot return the correct content
|
||||||
|
type header for .xml files.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2102">#2102</a>] Fixed
|
||||||
|
FCKConfig.DocType which stopped working in FCKeditor 2.6.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2039">#2039</a>] Fixed
|
||||||
|
the locking up issue in the Find/Replace dialog.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2124">#2124</a>] PHP File
|
||||||
|
Browser: fixed issue with resolving paths on Windows servers with PHP 5.2.4/5.2.5.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2059">#2059</a>] Fixed
|
||||||
|
the error in the toolbar name in fckeditor.py.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2065">#2065</a>] Floating
|
||||||
|
dialogs will now block the user from re-selecting the editing area by pressing Tab.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2114">#2114</a>] Added
|
||||||
|
a workaround for an IE6 bug which causes floating dialogs to appear blank after
|
||||||
|
opening it for the first time.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2136">#2136</a>] Fixed
|
||||||
|
JavaScript error in IE when opening the bullet list properties dialog.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1633">#1633</a>] External
|
||||||
|
styles should no longer interfere with the appearance of the editor and floating
|
||||||
|
panels now.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2113">#2113</a>] Fixed
|
||||||
|
unneeded <span class="Apple-style-span"> created after inserting
|
||||||
|
special characters.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2170">#2170</a>] Fixed
|
||||||
|
Ctrl-Insert hotkey for copying.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2125">#2125</a>] Fixed
|
||||||
|
the issue that FCK.InsertHtml() doesn't insert contents at the caret position when
|
||||||
|
dialogs are opened in IE. </li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1764">#1764</a>] FCKeditor
|
||||||
|
will no longer catch focus in IE on load when StartupFocus is false and the initial
|
||||||
|
content is empty.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2126">#2126</a>] Opening
|
||||||
|
and closing floating dialogs will no longer cause toolbar button states to become
|
||||||
|
frozen.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2159">#2159</a>] Selection
|
||||||
|
are now correctly restored when undoing changes made by the Replace dialog.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2160">#2160</a>] "Match
|
||||||
|
whole word" in the Find and Replace dialog will now find words next to punctuation
|
||||||
|
marks as well.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2162">#2162</a>] If the
|
||||||
|
configuration is set to work including the <head> (FullPage), references to
|
||||||
|
stylesheets added by Firefox extensions won't be added to the output.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2168">#2168</a>] Comments
|
||||||
|
won't generate new paragraphs in the output.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2184">#2184</a>] Fixed
|
||||||
|
several validation errors in the File Browser.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1383">#1383</a>] Fixed
|
||||||
|
an IE issue where pressing backspace may merge a hyperlink on the previous line
|
||||||
|
with the text on the current line.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1691">#1691</a>] Creation
|
||||||
|
of links in Safari failed if there was no selection.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2188">#2188</a>] PreserveSessionOnFileBrowser
|
||||||
|
is now removed as it was made obsolete with 2.6.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/898">#898</a>] The styles
|
||||||
|
for the editing area are applied in the image preview dialog.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2056">#2056</a>] Fixed
|
||||||
|
several validation errors in the dialogs.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2063">#2063</a>] Fixed
|
||||||
|
some problems in asp related to the use of network paths for the location of the
|
||||||
|
uploaded files.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1593">#1593</a>] The "Sample
|
||||||
|
Posted Data" page will now properly wrap the text.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2239">#2239</a>] The PHP
|
||||||
|
code in sampleposteddata.php has been changed from "<?=" to "<? echo".</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2241">#2241</a>] Fixed
|
||||||
|
404 error in floating panels when FCKeditor is installed to a different domain.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2066">#2066</a>] Added
|
||||||
|
a workaround for a Mac Safari 3.1 browser bug which caused the Fit Window button
|
||||||
|
to give a blank screen.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2218">#2218</a>] Improved
|
||||||
|
Gecko based browser detection to accept Epiphany/Gecko as well.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2193">#2193</a>] Fixed
|
||||||
|
the issue where the caret cannot reach the last character of a paragraph in Opera
|
||||||
|
9.50.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2264">#2264</a>] Fixed
|
||||||
|
empty spaces that appear at the top of the editor in Opera 9.50.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2238">#2238</a>] The <object>
|
||||||
|
placeholder was not being properly displayed in the compressed distribution version
|
||||||
|
and nightly builds.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2115">#2115</a>] Fixed
|
||||||
|
JavaScript (permission denied) error in Firefox when file has been uploaded.</li>
|
||||||
|
</ul>
|
||||||
|
<h3>
|
||||||
|
Version 2.6</h3>
|
||||||
|
<p>
|
||||||
|
No changes. The stabilization of the 2.6 RC was completed successfully, as expected.</p>
|
||||||
|
<h3>
|
||||||
|
Version 2.6 RC</h3>
|
||||||
|
<p>
|
||||||
|
New Features and Improvements:</p>
|
||||||
|
<ul>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2017">#2017</a>] The FCKeditorAPI.Instances
|
||||||
|
object can now be used to access all FCKeditor instances available in the page.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1980">#1980</a>] <span
|
||||||
|
style="color: #ff0000">Attention:</span> By default, the editor now produces <strong>
|
||||||
|
and <em> instead of <b> and <i>.</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
Fixed Bugs:</p>
|
||||||
|
<ul>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1924">#1924</a>] The dialog
|
||||||
|
close button is now correctly positioned in IE in RTL languages.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1933">#1933</a>] Placeholder
|
||||||
|
dialog will now display the placeholder value correctly in IE.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/957">#957</a>] Pressing
|
||||||
|
Enter or typing after a placeholder with the placeholder plugin will no longer generate
|
||||||
|
colored text.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1952">#1952</a>] Fixed
|
||||||
|
an issue in FCKTools.FixCssUrls that, other than wrong, was breaking Opera.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1695">#1695</a>] Removed
|
||||||
|
Ctrl-Tab hotkey for Source mode and allowed Ctrl-T to work in Firefox.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1666">#1666</a>] Fixed
|
||||||
|
permission denied errors during opening popup menus in IE6 under domain relaxation
|
||||||
|
mode.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1934">#1934</a>] Fixed
|
||||||
|
JavaScript errors when calling Selection.EnsureSelection() in dialogs.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1920">#1920</a>] Fixed
|
||||||
|
SSL warning message when opening image and flash dialogs under HTTPS in IE6.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1955">#1955</a>] [<a
|
||||||
|
target="_blank" href="http://dev.fckeditor.net/ticket/1981">#1981</a>] [<a target="_blank"
|
||||||
|
href="http://dev.fckeditor.net/ticket/1985">#1985</a>] [<a target="_blank" href="http://dev.fckeditor.net/ticket/1989">#1989</a>]
|
||||||
|
Fixed XHTML source formatting errors in non-IE browsers.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2000">#2000</a>] The #
|
||||||
|
character is now properly encoded in file names returned by the File Browser.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1945">#1945</a>] New folders
|
||||||
|
and file names are now properly sanitized against control characters. </li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1944">#1944</a>] Backslash
|
||||||
|
character is now disallowed in current folder path.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1055">#1055</a>] Added
|
||||||
|
logic to override JavaScript errors occurring inside the editing frame due to user
|
||||||
|
added JavaScript code.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1647">#1647</a>] Hitting
|
||||||
|
ENTER on list items containing block elements will now create new list item elements,
|
||||||
|
instead of adding further blocks to the same list item.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1411">#1411</a>] Label
|
||||||
|
only combos now get properly grayed out when moving to source view.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2009">#2009</a>] Fixed
|
||||||
|
an important bug regarding styles removal on styled text boundaries, introduced
|
||||||
|
with the 2.6 Beta 1. </li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2011">#2011</a>] Internal
|
||||||
|
CSS <style> tags where being outputted when FullPage=true.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2016">#2016</a>] The Link
|
||||||
|
dialog now properly selects the first field when opening it to modify mailto or
|
||||||
|
anchor links. This problem was also throwing an error in IE.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2021">#2021</a>] The caret
|
||||||
|
will no longer remain behind in the editing area when the placeholder dialog is
|
||||||
|
opened.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2024">#2024</a>] Fixed
|
||||||
|
JavaScript error in IE when the user tries to open dialogs in Source mode.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1853">#1853</a>] Setting
|
||||||
|
ShiftEnterMode to p or div now works correctly when EnterMode is br.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1838">#1838</a>] Fixed
|
||||||
|
the issue where context menus sometimes don't disappear after selecting an option.
|
||||||
|
</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2028">#2028</a>] Fixed
|
||||||
|
JavaScript error when EnterMode=br and user tries to insert a page break.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2002">#2002</a>] Fixed
|
||||||
|
the issue where the maximize editor button does not vertically expand the editing
|
||||||
|
area in Firefox.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1842">#1842</a>] PHP integration:
|
||||||
|
fixed filename encoding problems in file browser.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1832">#1832</a>] Calling
|
||||||
|
FCK.InsertHtml() in non-IE browsers would now activate the document processor as
|
||||||
|
expected.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1998">#1998</a>] The native
|
||||||
|
XMLHttpRequest class is now used in IE, whenever it is available.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1792">#1792</a>] In IE,
|
||||||
|
the browser was able to enter in an infinite loop when working with multiple editors
|
||||||
|
in the same page. </li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1948">#1948</a>] Some
|
||||||
|
CSS rules are reset to dialog elements to avoid conflict with the page CSS.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1965">#1965</a>] IE was
|
||||||
|
having problems with SpellerPages, causing some errors to be thrown when completing
|
||||||
|
the spell checking in some situations.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2042">#2042</a>] The FitWindow
|
||||||
|
command was throwing an error if executed in an editor where its relative button
|
||||||
|
is not present in the toolbar.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/922">#922</a>] Implemented
|
||||||
|
a generic document processor for <OBJECT> and <EMBED> tags.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1831">#1831</a>] Fixed
|
||||||
|
the issue where the placeholder icon for <EMBED> tags does not always show
|
||||||
|
up in IE7.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2049">#2049</a>] Fixed
|
||||||
|
a deleted cursor CSS attribute in the minified CSS inside fck_dialog_common.js.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1806">#1806</a>] In IE,
|
||||||
|
the caret will not any more move to the previous line when selecting a Format style
|
||||||
|
inside an empty paragraph.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1990">#1990</a>] In IE,
|
||||||
|
dialogs using API calls which deals with the selection, like InsertHtml now can
|
||||||
|
be sure the selection will be placed in the correct position.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1997">#1997</a>] With
|
||||||
|
IE, the first character of table captions where being lost on table creation.</li>
|
||||||
|
<li>The selection and cursor position was not being properly handled when creating some
|
||||||
|
elements like forms and tables.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/662">#662</a>] In the
|
||||||
|
Perl sample files, the GetServerPath function will now calculate the path properly.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2208">#2208</a>] Added
|
||||||
|
missing translations in Italian language file.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/2096">#2096</a>] Added
|
||||||
|
the codepage to basexml file. Filenames with special chars should now display properly.</li>
|
||||||
|
</ul>
|
||||||
|
<h3>
|
||||||
|
Version 2.6 Beta 1</h3>
|
||||||
|
<p>
|
||||||
|
New Features and Improvements:</p>
|
||||||
|
<ul>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/35">#35</a>] <strong>New
|
||||||
|
(and cool!) floating dialog system</strong>, avoiding problems with popup blockers
|
||||||
|
and enhancing the editor usability.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1886">#1886</a>] <strong>
|
||||||
|
Adobe AIR</strong> compatibility.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/123">#123</a>] Full support
|
||||||
|
for <strong>document.domain</strong> with automatic domain detection.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1622">#1622</a>] New <strong>
|
||||||
|
inline CSS cache</strong> feature, making it possible to avoid downloading the CSS
|
||||||
|
files for the editing area and skins. For that, it is enough to set the EditorAreaCSS,
|
||||||
|
SkinEditorCSS and SkinDialogCSS to string values in the format "/absolute/path/for/urls/|<minified
|
||||||
|
CSS styles". All internal CSS links are already using this feature. </li>
|
||||||
|
<li>New language file for <strong>Canadian French</strong>.</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
Fixed Bugs:</p>
|
||||||
|
<ul>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1643">#1643</a>] Resolved
|
||||||
|
several "strict warning" messages in Firefox when running FCKeditor.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1522">#1522</a>] The ENTER
|
||||||
|
key will now work properly in IE with the cursor at the start of a formatted block.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1503">#1503</a>] It's
|
||||||
|
possible to define in the Styles that a Style (with an empty class) must be shown
|
||||||
|
selected only when no class is present in the current element, and selecting that
|
||||||
|
item will clear the current class (it does apply to any attribute, not only classes).</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/191">#191</a>] The scrollbars
|
||||||
|
are now being properly shown in Firefox Mac when placing FCKeditor inside a hidden
|
||||||
|
div.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/503">#503</a>] Orphaned
|
||||||
|
<li> elements now get properly enclosed in a <ul> on output.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/309">#309</a>] The ENTER
|
||||||
|
key will not any more break <button> elements at the beginning of paragraphs.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1654">#1654</a>] The editor
|
||||||
|
was not loading on a specific unknown situation. The breaking point has been removed.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1707">#1707</a>] The editor
|
||||||
|
no longer hangs when operating on documents imported from Microsoft Word.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1514">#1514</a>] Floating
|
||||||
|
panels attached to a shared toolbar among multiple FCKeditor instances are no longer
|
||||||
|
misplaced when the editing areas are absolutely or relatively positioned.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1715">#1715</a>] The ShowDropDialog
|
||||||
|
is now enforced only when ForcePasteAsPlainText = true.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1336">#1336</a>] Sometimes
|
||||||
|
the autogrow plugin didn't work properly in Firefox.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1728">#1728</a>] External
|
||||||
|
toolbars are now properly sized in Opera.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1782">#1782</a>] Clicking
|
||||||
|
on radio buttons or checkboxes in the editor in IE will no longer cause lockups
|
||||||
|
in IE.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/805">#805</a>] The FCKConfig.Keystrokes
|
||||||
|
commands where executed even if the command itself was disabled.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/982">#982</a>] The button
|
||||||
|
to empty the box in the "Paste from Word" has been removed as it leads to confusion
|
||||||
|
for some users.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1682">#1682</a>] Editing
|
||||||
|
control elements in Firefox, Opera and Safari now works properly.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1613">#1613</a>] The editor
|
||||||
|
was surrounded by a <div> element that wasn't really needed.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/676">#676</a>] If a form
|
||||||
|
control was moved in IE after creating it, then it did lose its name.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/738">#738</a>] It wasn't
|
||||||
|
possible to change the type of an existing button.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1854">#1854</a>] Indentation
|
||||||
|
now works inside table cells.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1717">#1717</a>] The editor
|
||||||
|
was entering on looping on some specific cases when dealing with invalid source
|
||||||
|
markup.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1530">#1530</a>] Pasting
|
||||||
|
text into the "Find what" fields in the Find and Replace dialog would now activate
|
||||||
|
the find and replace buttons.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1828">#1828</a>] The Find/Replace
|
||||||
|
dialog will no longer display wrong starting positions for the match when there
|
||||||
|
are multiple and identical characters preceding the character at the real starting
|
||||||
|
point of the match.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1878">#1878</a>] Fixed
|
||||||
|
a JavaScript error which occurs in the Find/Replace dialog when the user presses
|
||||||
|
"Find" or "Replace" after the "No match found" message has appeared.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1355">#1355</a>] Line
|
||||||
|
breaks and spaces are now conserved when converting to and from the "Formatted"
|
||||||
|
format.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1670">#1670</a>] Improved
|
||||||
|
the background color behind smiley icons and special characters in their corresponding
|
||||||
|
dialogs.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1693">#1693</a>] Custom
|
||||||
|
error messages are now properly displayed in the file browser.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/970">#970</a>] The text
|
||||||
|
and value fields in the selection box dialog will no longer extend beyond the dialog
|
||||||
|
limits when the user inputs a very long text or value for one of the selection options.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/479">#479</a>] Fixed the
|
||||||
|
issue where pressing Enter in an <o:p> tag in IE does not generate line breaks.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/481">#481</a>] Fixed the
|
||||||
|
issue where the image preview in image dialog sometimes doesn't display after selecting
|
||||||
|
the image from server browser.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1488">#1488</a>] PHP integration:
|
||||||
|
the FCKeditor class is now more PHP5/6 friendly ("public" keyword is used instead
|
||||||
|
of depreciated "var").</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1815">#1815</a>] PHP integration:
|
||||||
|
removed closing tag: "?>", so no additional whitespace added when files are included.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1906">#1906</a>] PHP file
|
||||||
|
browser: fixed problems with DetectHtml() function when open_basedir was set.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1871">#1871</a>] PHP file
|
||||||
|
browser: permissions applied with the chmod command are now configurable.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1872">#1872</a>] Perl
|
||||||
|
file browser: permissions applied with the chmod command are now configurable.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1873">#1873</a>] Python
|
||||||
|
file browser: permissions applied with the chmod command are now configurable.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1572">#1572</a>] ColdFusion
|
||||||
|
integration: fixed issues with setting the editor height.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1692">#1692</a>] ColdFusion
|
||||||
|
file browser: it is possible now to define TempDirectory to avoid issues with GetTempdirectory()
|
||||||
|
returning an empty string.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1379">#1379</a>] ColdFusion
|
||||||
|
file browser: resolved issues with OnRequestEnd.cfm breaking the file browser.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1509">#1509</a>] InsertHtml()
|
||||||
|
in IE will no longer turn the preceding normal whitespace into &nbsp;.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/958">#958</a>] The AddItem
|
||||||
|
method now has an additional fifth parameter "customData" that will be sent to the
|
||||||
|
Execute method of the command for that menu item, allowing a single command to be
|
||||||
|
used for different menu items..</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1502">#1502</a>] The RemoveFormat
|
||||||
|
command now also removes the attributes from the cleaned text. The list of attributes
|
||||||
|
is configurable with FCKConfig.RemoveAttributes.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1596">#1596</a>] On Safari,
|
||||||
|
dialogs have now right-to-left layout when it runs a RTL language, like Arabic.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1344">#1344</a>] Added
|
||||||
|
warning message on Copy and Cut operation failure on IE due to paste permission
|
||||||
|
settings.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1868">#1868</a>] Links
|
||||||
|
to file browser has been changed to avoid requests containing double dots.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1229">#1229</a>] Converting
|
||||||
|
multiple contiguous paragraphs to Formatted will now be merged into a single <PRE>
|
||||||
|
block.</li>
|
||||||
|
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1627">#1627</a>] Samples
|
||||||
|
failed to load from local filesystem in IE7.</li>
|
||||||
|
</ul>
|
||||||
<h3>
|
<h3>
|
||||||
Version 2.5.1</h3>
|
Version 2.5.1</h3>
|
||||||
<p>
|
<p>
|
||||||
|
@ -1,214 +1,223 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKContextMenu Class: renders an control a context menu.
|
* FCKContextMenu Class: renders an control a context menu.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKContextMenu = function( parentWindow, langDir )
|
var FCKContextMenu = function( parentWindow, langDir )
|
||||||
{
|
{
|
||||||
this.CtrlDisable = false ;
|
this.CtrlDisable = false ;
|
||||||
|
|
||||||
var oPanel = this._Panel = new FCKPanel( parentWindow ) ;
|
var oPanel = this._Panel = new FCKPanel( parentWindow ) ;
|
||||||
oPanel.AppendStyleSheet( FCKConfig.SkinEditorCSS ) ;
|
oPanel.AppendStyleSheet( FCKConfig.SkinEditorCSS ) ;
|
||||||
oPanel.IsContextMenu = true ;
|
oPanel.IsContextMenu = true ;
|
||||||
|
|
||||||
// The FCKTools.DisableSelection doesn't seems to work to avoid dragging of the icons in Mozilla
|
// The FCKTools.DisableSelection doesn't seems to work to avoid dragging of the icons in Mozilla
|
||||||
// so we stop the start of the dragging
|
// so we stop the start of the dragging
|
||||||
if ( FCKBrowserInfo.IsGecko )
|
if ( FCKBrowserInfo.IsGecko )
|
||||||
oPanel.Document.addEventListener( 'draggesture', function(e) {e.preventDefault(); return false;}, true ) ;
|
oPanel.Document.addEventListener( 'draggesture', function(e) {e.preventDefault(); return false;}, true ) ;
|
||||||
|
|
||||||
var oMenuBlock = this._MenuBlock = new FCKMenuBlock() ;
|
var oMenuBlock = this._MenuBlock = new FCKMenuBlock() ;
|
||||||
oMenuBlock.Panel = oPanel ;
|
oMenuBlock.Panel = oPanel ;
|
||||||
oMenuBlock.OnClick = FCKTools.CreateEventListener( FCKContextMenu_MenuBlock_OnClick, this ) ;
|
oMenuBlock.OnClick = FCKTools.CreateEventListener( FCKContextMenu_MenuBlock_OnClick, this ) ;
|
||||||
|
|
||||||
this._Redraw = true ;
|
this._Redraw = true ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
FCKContextMenu.prototype.SetMouseClickWindow = function( mouseClickWindow )
|
FCKContextMenu.prototype.SetMouseClickWindow = function( mouseClickWindow )
|
||||||
{
|
{
|
||||||
if ( !FCKBrowserInfo.IsIE )
|
if ( !FCKBrowserInfo.IsIE )
|
||||||
{
|
{
|
||||||
this._Document = mouseClickWindow.document ;
|
this._Document = mouseClickWindow.document ;
|
||||||
if ( FCKBrowserInfo.IsOpera && !( 'oncontextmenu' in document.createElement('foo') ) )
|
if ( FCKBrowserInfo.IsOpera && !( 'oncontextmenu' in document.createElement('foo') ) )
|
||||||
{
|
{
|
||||||
this._Document.addEventListener( 'mousedown', FCKContextMenu_Document_OnMouseDown, false ) ;
|
this._Document.addEventListener( 'mousedown', FCKContextMenu_Document_OnMouseDown, false ) ;
|
||||||
this._Document.addEventListener( 'mouseup', FCKContextMenu_Document_OnMouseUp, false ) ;
|
this._Document.addEventListener( 'mouseup', FCKContextMenu_Document_OnMouseUp, false ) ;
|
||||||
}
|
}
|
||||||
this._Document.addEventListener( 'contextmenu', FCKContextMenu_Document_OnContextMenu, false ) ;
|
this._Document.addEventListener( 'contextmenu', FCKContextMenu_Document_OnContextMenu, false ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The customData parameter is just a value that will be send to the command that is executed,
|
The customData parameter is just a value that will be send to the command that is executed,
|
||||||
so it's possible to reuse the same command for several items just by assigning different data for each one.
|
so it's possible to reuse the same command for several items just by assigning different data for each one.
|
||||||
*/
|
*/
|
||||||
FCKContextMenu.prototype.AddItem = function( name, label, iconPathOrStripInfoArrayOrIndex, isDisabled, customData )
|
FCKContextMenu.prototype.AddItem = function( name, label, iconPathOrStripInfoArrayOrIndex, isDisabled, customData )
|
||||||
{
|
{
|
||||||
var oItem = this._MenuBlock.AddItem( name, label, iconPathOrStripInfoArrayOrIndex, isDisabled, customData ) ;
|
var oItem = this._MenuBlock.AddItem( name, label, iconPathOrStripInfoArrayOrIndex, isDisabled, customData ) ;
|
||||||
this._Redraw = true ;
|
this._Redraw = true ;
|
||||||
return oItem ;
|
return oItem ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKContextMenu.prototype.AddSeparator = function()
|
FCKContextMenu.prototype.AddSeparator = function()
|
||||||
{
|
{
|
||||||
this._MenuBlock.AddSeparator() ;
|
this._MenuBlock.AddSeparator() ;
|
||||||
this._Redraw = true ;
|
this._Redraw = true ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKContextMenu.prototype.RemoveAllItems = function()
|
FCKContextMenu.prototype.RemoveAllItems = function()
|
||||||
{
|
{
|
||||||
this._MenuBlock.RemoveAllItems() ;
|
this._MenuBlock.RemoveAllItems() ;
|
||||||
this._Redraw = true ;
|
this._Redraw = true ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKContextMenu.prototype.AttachToElement = function( element )
|
FCKContextMenu.prototype.AttachToElement = function( element )
|
||||||
{
|
{
|
||||||
if ( FCKBrowserInfo.IsIE )
|
if ( FCKBrowserInfo.IsIE )
|
||||||
FCKTools.AddEventListenerEx( element, 'contextmenu', FCKContextMenu_AttachedElement_OnContextMenu, this ) ;
|
FCKTools.AddEventListenerEx( element, 'contextmenu', FCKContextMenu_AttachedElement_OnContextMenu, this ) ;
|
||||||
else
|
else
|
||||||
element._FCKContextMenu = this ;
|
element._FCKContextMenu = this ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKContextMenu_Document_OnContextMenu( e )
|
function FCKContextMenu_Document_OnContextMenu( e )
|
||||||
{
|
{
|
||||||
var el = e.target ;
|
if ( FCKConfig.BrowserContextMenu )
|
||||||
|
return true ;
|
||||||
while ( el )
|
|
||||||
{
|
var el = e.target ;
|
||||||
if ( el._FCKContextMenu )
|
|
||||||
{
|
while ( el )
|
||||||
if ( el._FCKContextMenu.CtrlDisable && ( e.ctrlKey || e.metaKey ) )
|
{
|
||||||
return true ;
|
if ( el._FCKContextMenu )
|
||||||
|
{
|
||||||
FCKTools.CancelEvent( e ) ;
|
if ( el._FCKContextMenu.CtrlDisable && ( e.ctrlKey || e.metaKey ) )
|
||||||
FCKContextMenu_AttachedElement_OnContextMenu( e, el._FCKContextMenu, el ) ;
|
return true ;
|
||||||
return false ;
|
|
||||||
}
|
FCKTools.CancelEvent( e ) ;
|
||||||
el = el.parentNode ;
|
FCKContextMenu_AttachedElement_OnContextMenu( e, el._FCKContextMenu, el ) ;
|
||||||
}
|
return false ;
|
||||||
return true ;
|
}
|
||||||
}
|
el = el.parentNode ;
|
||||||
|
}
|
||||||
var FCKContextMenu_OverrideButton ;
|
return true ;
|
||||||
|
}
|
||||||
function FCKContextMenu_Document_OnMouseDown( e )
|
|
||||||
{
|
var FCKContextMenu_OverrideButton ;
|
||||||
if( !e || e.button != 2 )
|
|
||||||
return false ;
|
function FCKContextMenu_Document_OnMouseDown( e )
|
||||||
|
{
|
||||||
var el = e.target ;
|
if( !e || e.button != 2 )
|
||||||
|
return false ;
|
||||||
while ( el )
|
|
||||||
{
|
if ( FCKConfig.BrowserContextMenu )
|
||||||
if ( el._FCKContextMenu )
|
return true ;
|
||||||
{
|
|
||||||
if ( el._FCKContextMenu.CtrlDisable && ( e.ctrlKey || e.metaKey ) )
|
var el = e.target ;
|
||||||
return true ;
|
|
||||||
|
while ( el )
|
||||||
var overrideButton = FCKContextMenu_OverrideButton ;
|
{
|
||||||
if( !overrideButton )
|
if ( el._FCKContextMenu )
|
||||||
{
|
{
|
||||||
var doc = FCKTools.GetElementDocument( e.target ) ;
|
if ( el._FCKContextMenu.CtrlDisable && ( e.ctrlKey || e.metaKey ) )
|
||||||
overrideButton = FCKContextMenu_OverrideButton = doc.createElement('input') ;
|
return true ;
|
||||||
overrideButton.type = 'button' ;
|
|
||||||
var buttonHolder = doc.createElement('p') ;
|
var overrideButton = FCKContextMenu_OverrideButton ;
|
||||||
doc.body.appendChild( buttonHolder ) ;
|
if( !overrideButton )
|
||||||
buttonHolder.appendChild( overrideButton ) ;
|
{
|
||||||
}
|
var doc = FCKTools.GetElementDocument( e.target ) ;
|
||||||
|
overrideButton = FCKContextMenu_OverrideButton = doc.createElement('input') ;
|
||||||
overrideButton.style.cssText = 'position:absolute;top:' + ( e.clientY - 2 ) +
|
overrideButton.type = 'button' ;
|
||||||
'px;left:' + ( e.clientX - 2 ) +
|
var buttonHolder = doc.createElement('p') ;
|
||||||
'px;width:5px;height:5px;opacity:0.01' ;
|
doc.body.appendChild( buttonHolder ) ;
|
||||||
}
|
buttonHolder.appendChild( overrideButton ) ;
|
||||||
el = el.parentNode ;
|
}
|
||||||
}
|
|
||||||
return false ;
|
overrideButton.style.cssText = 'position:absolute;top:' + ( e.clientY - 2 ) +
|
||||||
}
|
'px;left:' + ( e.clientX - 2 ) +
|
||||||
|
'px;width:5px;height:5px;opacity:0.01' ;
|
||||||
function FCKContextMenu_Document_OnMouseUp( e )
|
}
|
||||||
{
|
el = el.parentNode ;
|
||||||
var overrideButton = FCKContextMenu_OverrideButton ;
|
}
|
||||||
|
return false ;
|
||||||
if ( overrideButton )
|
}
|
||||||
{
|
|
||||||
var parent = overrideButton.parentNode ;
|
function FCKContextMenu_Document_OnMouseUp( e )
|
||||||
parent.parentNode.removeChild( parent ) ;
|
{
|
||||||
FCKContextMenu_OverrideButton = undefined ;
|
if ( FCKConfig.BrowserContextMenu )
|
||||||
|
return true ;
|
||||||
if( e && e.button == 2 )
|
|
||||||
{
|
var overrideButton = FCKContextMenu_OverrideButton ;
|
||||||
FCKContextMenu_Document_OnContextMenu( e ) ;
|
|
||||||
return false ;
|
if ( overrideButton )
|
||||||
}
|
{
|
||||||
}
|
var parent = overrideButton.parentNode ;
|
||||||
return true ;
|
parent.parentNode.removeChild( parent ) ;
|
||||||
}
|
FCKContextMenu_OverrideButton = undefined ;
|
||||||
|
|
||||||
function FCKContextMenu_AttachedElement_OnContextMenu( ev, fckContextMenu, el )
|
if( e && e.button == 2 )
|
||||||
{
|
{
|
||||||
if ( fckContextMenu.CtrlDisable && ( ev.ctrlKey || ev.metaKey ) )
|
FCKContextMenu_Document_OnContextMenu( e ) ;
|
||||||
return true ;
|
return false ;
|
||||||
|
}
|
||||||
var eTarget = el || this ;
|
}
|
||||||
|
return true ;
|
||||||
if ( fckContextMenu.OnBeforeOpen )
|
}
|
||||||
fckContextMenu.OnBeforeOpen.call( fckContextMenu, eTarget ) ;
|
|
||||||
|
function FCKContextMenu_AttachedElement_OnContextMenu( ev, fckContextMenu, el )
|
||||||
if ( fckContextMenu._MenuBlock.Count() == 0 )
|
{
|
||||||
return false ;
|
if ( ( fckContextMenu.CtrlDisable && ( ev.ctrlKey || ev.metaKey ) ) || FCKConfig.BrowserContextMenu )
|
||||||
|
return true ;
|
||||||
if ( fckContextMenu._Redraw )
|
|
||||||
{
|
var eTarget = el || this ;
|
||||||
fckContextMenu._MenuBlock.Create( fckContextMenu._Panel.MainNode ) ;
|
|
||||||
fckContextMenu._Redraw = false ;
|
if ( fckContextMenu.OnBeforeOpen )
|
||||||
}
|
fckContextMenu.OnBeforeOpen.call( fckContextMenu, eTarget ) ;
|
||||||
|
|
||||||
// This will avoid that the content of the context menu can be dragged in IE
|
if ( fckContextMenu._MenuBlock.Count() == 0 )
|
||||||
// as the content of the panel is recreated we need to do it every time
|
return false ;
|
||||||
FCKTools.DisableSelection( fckContextMenu._Panel.Document.body ) ;
|
|
||||||
|
if ( fckContextMenu._Redraw )
|
||||||
var x = 0 ;
|
{
|
||||||
var y = 0 ;
|
fckContextMenu._MenuBlock.Create( fckContextMenu._Panel.MainNode ) ;
|
||||||
if ( FCKBrowserInfo.IsIE )
|
fckContextMenu._Redraw = false ;
|
||||||
{
|
}
|
||||||
x = ev.screenX ;
|
|
||||||
y = ev.screenY ;
|
// This will avoid that the content of the context menu can be dragged in IE
|
||||||
}
|
// as the content of the panel is recreated we need to do it every time
|
||||||
else if ( FCKBrowserInfo.IsSafari )
|
FCKTools.DisableSelection( fckContextMenu._Panel.Document.body ) ;
|
||||||
{
|
|
||||||
x = ev.clientX ;
|
var x = 0 ;
|
||||||
y = ev.clientY ;
|
var y = 0 ;
|
||||||
}
|
if ( FCKBrowserInfo.IsIE )
|
||||||
else
|
{
|
||||||
{
|
x = ev.screenX ;
|
||||||
x = ev.pageX ;
|
y = ev.screenY ;
|
||||||
y = ev.pageY ;
|
}
|
||||||
}
|
else if ( FCKBrowserInfo.IsSafari )
|
||||||
fckContextMenu._Panel.Show( x, y, ev.currentTarget || null ) ;
|
{
|
||||||
|
x = ev.clientX ;
|
||||||
return false ;
|
y = ev.clientY ;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
function FCKContextMenu_MenuBlock_OnClick( menuItem, contextMenu )
|
{
|
||||||
{
|
x = ev.pageX ;
|
||||||
contextMenu._Panel.Hide() ;
|
y = ev.pageY ;
|
||||||
FCKTools.RunFunction( contextMenu.OnItemClick, contextMenu, menuItem ) ;
|
}
|
||||||
}
|
fckContextMenu._Panel.Show( x, y, ev.currentTarget || null ) ;
|
||||||
|
|
||||||
|
return false ;
|
||||||
|
}
|
||||||
|
|
||||||
|
function FCKContextMenu_MenuBlock_OnClick( menuItem, contextMenu )
|
||||||
|
{
|
||||||
|
contextMenu._Panel.Hide() ;
|
||||||
|
FCKTools.RunFunction( contextMenu.OnItemClick, contextMenu, menuItem ) ;
|
||||||
|
}
|
||||||
|
@ -1,119 +1,119 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* The Data Processor is responsible for transforming the input and output data
|
* The Data Processor is responsible for transforming the input and output data
|
||||||
* in the editor. For more info:
|
* in the editor. For more info:
|
||||||
* http://dev.fckeditor.net/wiki/Components/DataProcessor
|
* http://dev.fckeditor.net/wiki/Components/DataProcessor
|
||||||
*
|
*
|
||||||
* The default implementation offers the base XHTML compatibility features of
|
* The default implementation offers the base XHTML compatibility features of
|
||||||
* FCKeditor. Further Data Processors may be implemented for other purposes.
|
* FCKeditor. Further Data Processors may be implemented for other purposes.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKDataProcessor = function()
|
var FCKDataProcessor = function()
|
||||||
{}
|
{}
|
||||||
|
|
||||||
FCKDataProcessor.prototype =
|
FCKDataProcessor.prototype =
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Returns a string representing the HTML format of "data". The returned
|
* Returns a string representing the HTML format of "data". The returned
|
||||||
* value will be loaded in the editor.
|
* value will be loaded in the editor.
|
||||||
* The HTML must be from <html> to </html>, including <head>, <body> and
|
* The HTML must be from <html> to </html>, including <head>, <body> and
|
||||||
* eventually the DOCTYPE.
|
* eventually the DOCTYPE.
|
||||||
* Note: HTML comments may already be part of the data because of the
|
* Note: HTML comments may already be part of the data because of the
|
||||||
* pre-processing made with ProtectedSource.
|
* pre-processing made with ProtectedSource.
|
||||||
* @param {String} data The data to be converted in the
|
* @param {String} data The data to be converted in the
|
||||||
* DataProcessor specific format.
|
* DataProcessor specific format.
|
||||||
*/
|
*/
|
||||||
ConvertToHtml : function( data )
|
ConvertToHtml : function( data )
|
||||||
{
|
{
|
||||||
// The default data processor must handle two different cases depending
|
// The default data processor must handle two different cases depending
|
||||||
// on the FullPage setting. Custom Data Processors will not be
|
// on the FullPage setting. Custom Data Processors will not be
|
||||||
// compatible with FullPage, much probably.
|
// compatible with FullPage, much probably.
|
||||||
if ( FCKConfig.FullPage )
|
if ( FCKConfig.FullPage )
|
||||||
{
|
{
|
||||||
// Save the DOCTYPE.
|
// Save the DOCTYPE.
|
||||||
FCK.DocTypeDeclaration = data.match( FCKRegexLib.DocTypeTag ) ;
|
FCK.DocTypeDeclaration = data.match( FCKRegexLib.DocTypeTag ) ;
|
||||||
|
|
||||||
// Check if the <body> tag is available.
|
// Check if the <body> tag is available.
|
||||||
if ( !FCKRegexLib.HasBodyTag.test( data ) )
|
if ( !FCKRegexLib.HasBodyTag.test( data ) )
|
||||||
data = '<body>' + data + '</body>' ;
|
data = '<body>' + data + '</body>' ;
|
||||||
|
|
||||||
// Check if the <html> tag is available.
|
// Check if the <html> tag is available.
|
||||||
if ( !FCKRegexLib.HtmlOpener.test( data ) )
|
if ( !FCKRegexLib.HtmlOpener.test( data ) )
|
||||||
data = '<html dir="' + FCKConfig.ContentLangDirection + '">' + data + '</html>' ;
|
data = '<html dir="' + FCKConfig.ContentLangDirection + '">' + data + '</html>' ;
|
||||||
|
|
||||||
// Check if the <head> tag is available.
|
// Check if the <head> tag is available.
|
||||||
if ( !FCKRegexLib.HeadOpener.test( data ) )
|
if ( !FCKRegexLib.HeadOpener.test( data ) )
|
||||||
data = data.replace( FCKRegexLib.HtmlOpener, '$&<head><title></title></head>' ) ;
|
data = data.replace( FCKRegexLib.HtmlOpener, '$&<head><title></title></head>' ) ;
|
||||||
|
|
||||||
return data ;
|
return data ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var html =
|
var html =
|
||||||
FCKConfig.DocType +
|
FCKConfig.DocType +
|
||||||
'<html dir="' + FCKConfig.ContentLangDirection + '"' ;
|
'<html dir="' + FCKConfig.ContentLangDirection + '"' ;
|
||||||
|
|
||||||
// On IE, if you are using a DOCTYPE different of HTML 4 (like
|
// On IE, if you are using a DOCTYPE different of HTML 4 (like
|
||||||
// XHTML), you must force the vertical scroll to show, otherwise
|
// XHTML), you must force the vertical scroll to show, otherwise
|
||||||
// the horizontal one may appear when the page needs vertical scrolling.
|
// the horizontal one may appear when the page needs vertical scrolling.
|
||||||
// TODO : Check it with IE7 and make it IE6- if it is the case.
|
// TODO : Check it with IE7 and make it IE6- if it is the case.
|
||||||
if ( FCKBrowserInfo.IsIE && FCKConfig.DocType.length > 0 && !FCKRegexLib.Html4DocType.test( FCKConfig.DocType ) )
|
if ( FCKBrowserInfo.IsIE && FCKConfig.DocType.length > 0 && !FCKRegexLib.Html4DocType.test( FCKConfig.DocType ) )
|
||||||
html += ' style="overflow-y: scroll"' ;
|
html += ' style="overflow-y: scroll"' ;
|
||||||
|
|
||||||
html += '><head><title></title></head>' +
|
html += '><head><title></title></head>' +
|
||||||
'<body' + FCKConfig.GetBodyAttributes() + '>' +
|
'<body' + FCKConfig.GetBodyAttributes() + '>' +
|
||||||
data +
|
data +
|
||||||
'</body></html>' ;
|
'</body></html>' ;
|
||||||
|
|
||||||
return html ;
|
return html ;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Converts a DOM (sub-)tree to a string in the data format.
|
* Converts a DOM (sub-)tree to a string in the data format.
|
||||||
* @param {Object} rootNode The node that contains the DOM tree to be
|
* @param {Object} rootNode The node that contains the DOM tree to be
|
||||||
* converted to the data format.
|
* converted to the data format.
|
||||||
* @param {Boolean} excludeRoot Indicates that the root node must not
|
* @param {Boolean} excludeRoot Indicates that the root node must not
|
||||||
* be included in the conversion, only its children.
|
* be included in the conversion, only its children.
|
||||||
* @param {Boolean} format Indicates that the data must be formatted
|
* @param {Boolean} format Indicates that the data must be formatted
|
||||||
* for human reading. Not all Data Processors may provide it.
|
* for human reading. Not all Data Processors may provide it.
|
||||||
*/
|
*/
|
||||||
ConvertToDataFormat : function( rootNode, excludeRoot, ignoreIfEmptyParagraph, format )
|
ConvertToDataFormat : function( rootNode, excludeRoot, ignoreIfEmptyParagraph, format )
|
||||||
{
|
{
|
||||||
var data = FCKXHtml.GetXHTML( rootNode, !excludeRoot, format ) ;
|
var data = FCKXHtml.GetXHTML( rootNode, !excludeRoot, format ) ;
|
||||||
|
|
||||||
if ( ignoreIfEmptyParagraph && FCKRegexLib.EmptyOutParagraph.test( data ) )
|
if ( ignoreIfEmptyParagraph && FCKRegexLib.EmptyOutParagraph.test( data ) )
|
||||||
return '' ;
|
return '' ;
|
||||||
|
|
||||||
return data ;
|
return data ;
|
||||||
},
|
},
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Makes any necessary changes to a piece of HTML for insertion in the
|
* Makes any necessary changes to a piece of HTML for insertion in the
|
||||||
* editor selection position.
|
* editor selection position.
|
||||||
* @param {String} html The HTML to be fixed.
|
* @param {String} html The HTML to be fixed.
|
||||||
*/
|
*/
|
||||||
FixHtml : function( html )
|
FixHtml : function( html )
|
||||||
{
|
{
|
||||||
return html ;
|
return html ;
|
||||||
}
|
}
|
||||||
} ;
|
} ;
|
||||||
|
@ -1,46 +1,53 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* This is a generic Document Fragment object. It is not intended to provide
|
* This is a generic Document Fragment object. It is not intended to provide
|
||||||
* the W3C implementation, but is a way to fix the missing of a real Document
|
* the W3C implementation, but is a way to fix the missing of a real Document
|
||||||
* Fragment in IE (where document.createDocumentFragment() returns a normal
|
* Fragment in IE (where document.createDocumentFragment() returns a normal
|
||||||
* document instead), giving a standard interface for it.
|
* document instead), giving a standard interface for it.
|
||||||
* (IE Implementation)
|
* (IE Implementation)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKDocumentFragment = function( parentDocument, baseDocFrag )
|
var FCKDocumentFragment = function( parentDocument, baseDocFrag )
|
||||||
{
|
{
|
||||||
this.RootNode = baseDocFrag || parentDocument.createDocumentFragment() ;
|
this.RootNode = baseDocFrag || parentDocument.createDocumentFragment() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKDocumentFragment.prototype =
|
FCKDocumentFragment.prototype =
|
||||||
{
|
{
|
||||||
|
|
||||||
// Append the contents of this Document Fragment to another element.
|
// Append the contents of this Document Fragment to another element.
|
||||||
AppendTo : function( targetNode )
|
AppendTo : function( targetNode )
|
||||||
{
|
{
|
||||||
targetNode.appendChild( this.RootNode ) ;
|
targetNode.appendChild( this.RootNode ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
InsertAfterNode : function( existingNode )
|
AppendHtml : function( html )
|
||||||
{
|
{
|
||||||
FCKDomTools.InsertAfterNode( existingNode, this.RootNode ) ;
|
var eTmpDiv = this.RootNode.ownerDocument.createElement( 'div' ) ;
|
||||||
}
|
eTmpDiv.innerHTML = html ;
|
||||||
}
|
FCKDomTools.MoveChildren( eTmpDiv, this.RootNode ) ;
|
||||||
|
},
|
||||||
|
|
||||||
|
InsertAfterNode : function( existingNode )
|
||||||
|
{
|
||||||
|
FCKDomTools.InsertAfterNode( existingNode, this.RootNode ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,58 +1,58 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* This is a generic Document Fragment object. It is not intended to provide
|
* This is a generic Document Fragment object. It is not intended to provide
|
||||||
* the W3C implementation, but is a way to fix the missing of a real Document
|
* the W3C implementation, but is a way to fix the missing of a real Document
|
||||||
* Fragment in IE (where document.createDocumentFragment() returns a normal
|
* Fragment in IE (where document.createDocumentFragment() returns a normal
|
||||||
* document instead), giving a standard interface for it.
|
* document instead), giving a standard interface for it.
|
||||||
* (IE Implementation)
|
* (IE Implementation)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKDocumentFragment = function( parentDocument )
|
var FCKDocumentFragment = function( parentDocument )
|
||||||
{
|
{
|
||||||
this._Document = parentDocument ;
|
this._Document = parentDocument ;
|
||||||
this.RootNode = parentDocument.createElement( 'div' ) ;
|
this.RootNode = parentDocument.createElement( 'div' ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Append the contents of this Document Fragment to another node.
|
// Append the contents of this Document Fragment to another node.
|
||||||
FCKDocumentFragment.prototype =
|
FCKDocumentFragment.prototype =
|
||||||
{
|
{
|
||||||
|
|
||||||
AppendTo : function( targetNode )
|
AppendTo : function( targetNode )
|
||||||
{
|
{
|
||||||
FCKDomTools.MoveChildren( this.RootNode, targetNode ) ;
|
FCKDomTools.MoveChildren( this.RootNode, targetNode ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
AppendHtml : function( html )
|
AppendHtml : function( html )
|
||||||
{
|
{
|
||||||
var eTmpDiv = this._Document.createElement( 'div' ) ;
|
var eTmpDiv = this._Document.createElement( 'div' ) ;
|
||||||
eTmpDiv.innerHTML = html ;
|
eTmpDiv.innerHTML = html ;
|
||||||
FCKDomTools.MoveChildren( eTmpDiv, this.RootNode ) ;
|
FCKDomTools.MoveChildren( eTmpDiv, this.RootNode ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
InsertAfterNode : function( existingNode )
|
InsertAfterNode : function( existingNode )
|
||||||
{
|
{
|
||||||
var eRoot = this.RootNode ;
|
var eRoot = this.RootNode ;
|
||||||
var eLast ;
|
var eLast ;
|
||||||
|
|
||||||
while( ( eLast = eRoot.lastChild ) )
|
while( ( eLast = eRoot.lastChild ) )
|
||||||
FCKDomTools.InsertAfterNode( existingNode, eRoot.removeChild( eLast ) ) ;
|
FCKDomTools.InsertAfterNode( existingNode, eRoot.removeChild( eLast ) ) ;
|
||||||
}
|
}
|
||||||
} ;
|
} ;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,104 +1,104 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Class for working with a selection range, much like the W3C DOM Range, but
|
* Class for working with a selection range, much like the W3C DOM Range, but
|
||||||
* it is not intended to be an implementation of the W3C interface.
|
* it is not intended to be an implementation of the W3C interface.
|
||||||
* (Gecko Implementation)
|
* (Gecko Implementation)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
FCKDomRange.prototype.MoveToSelection = function()
|
FCKDomRange.prototype.MoveToSelection = function()
|
||||||
{
|
{
|
||||||
this.Release( true ) ;
|
this.Release( true ) ;
|
||||||
|
|
||||||
var oSel = this.Window.getSelection() ;
|
var oSel = this.Window.getSelection() ;
|
||||||
|
|
||||||
if ( oSel && oSel.rangeCount > 0 )
|
if ( oSel && oSel.rangeCount > 0 )
|
||||||
{
|
{
|
||||||
this._Range = FCKW3CRange.CreateFromRange( this.Window.document, oSel.getRangeAt(0) ) ;
|
this._Range = FCKW3CRange.CreateFromRange( this.Window.document, oSel.getRangeAt(0) ) ;
|
||||||
this._UpdateElementInfo() ;
|
this._UpdateElementInfo() ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if ( this.Window.document )
|
if ( this.Window.document )
|
||||||
this.MoveToElementStart( this.Window.document.body ) ;
|
this.MoveToElementStart( this.Window.document.body ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKDomRange.prototype.Select = function()
|
FCKDomRange.prototype.Select = function()
|
||||||
{
|
{
|
||||||
var oRange = this._Range ;
|
var oRange = this._Range ;
|
||||||
if ( oRange )
|
if ( oRange )
|
||||||
{
|
{
|
||||||
var startContainer = oRange.startContainer ;
|
var startContainer = oRange.startContainer ;
|
||||||
|
|
||||||
// If we have a collapsed range, inside an empty element, we must add
|
// If we have a collapsed range, inside an empty element, we must add
|
||||||
// something to it, otherwise the caret will not be visible.
|
// something to it, otherwise the caret will not be visible.
|
||||||
if ( oRange.collapsed && startContainer.nodeType == 1 && startContainer.childNodes.length == 0 )
|
if ( oRange.collapsed && startContainer.nodeType == 1 && startContainer.childNodes.length == 0 )
|
||||||
startContainer.appendChild( oRange._Document.createTextNode('') ) ;
|
startContainer.appendChild( oRange._Document.createTextNode('') ) ;
|
||||||
|
|
||||||
var oDocRange = this.Window.document.createRange() ;
|
var oDocRange = this.Window.document.createRange() ;
|
||||||
oDocRange.setStart( startContainer, oRange.startOffset ) ;
|
oDocRange.setStart( startContainer, oRange.startOffset ) ;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
oDocRange.setEnd( oRange.endContainer, oRange.endOffset ) ;
|
oDocRange.setEnd( oRange.endContainer, oRange.endOffset ) ;
|
||||||
}
|
}
|
||||||
catch ( e )
|
catch ( e )
|
||||||
{
|
{
|
||||||
// There is a bug in Firefox implementation (it would be too easy
|
// There is a bug in Firefox implementation (it would be too easy
|
||||||
// otherwise). The new start can't be after the end (W3C says it can).
|
// otherwise). The new start can't be after the end (W3C says it can).
|
||||||
// So, let's create a new range and collapse it to the desired point.
|
// So, let's create a new range and collapse it to the desired point.
|
||||||
if ( e.toString().Contains( 'NS_ERROR_ILLEGAL_VALUE' ) )
|
if ( e.toString().Contains( 'NS_ERROR_ILLEGAL_VALUE' ) )
|
||||||
{
|
{
|
||||||
oRange.collapse( true ) ;
|
oRange.collapse( true ) ;
|
||||||
oDocRange.setEnd( oRange.endContainer, oRange.endOffset ) ;
|
oDocRange.setEnd( oRange.endContainer, oRange.endOffset ) ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
throw( e ) ;
|
throw( e ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
var oSel = this.Window.getSelection() ;
|
var oSel = this.Window.getSelection() ;
|
||||||
oSel.removeAllRanges() ;
|
oSel.removeAllRanges() ;
|
||||||
|
|
||||||
// We must add a clone otherwise Firefox will have rendering issues.
|
// We must add a clone otherwise Firefox will have rendering issues.
|
||||||
oSel.addRange( oDocRange ) ;
|
oSel.addRange( oDocRange ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Not compatible with bookmark created with CreateBookmark2.
|
// Not compatible with bookmark created with CreateBookmark2.
|
||||||
// The bookmark nodes will be deleted from the document.
|
// The bookmark nodes will be deleted from the document.
|
||||||
FCKDomRange.prototype.SelectBookmark = function( bookmark )
|
FCKDomRange.prototype.SelectBookmark = function( bookmark )
|
||||||
{
|
{
|
||||||
var domRange = this.Window.document.createRange() ;
|
var domRange = this.Window.document.createRange() ;
|
||||||
|
|
||||||
var startNode = this.GetBookmarkNode( bookmark, true ) ;
|
var startNode = this.GetBookmarkNode( bookmark, true ) ;
|
||||||
var endNode = this.GetBookmarkNode( bookmark, false ) ;
|
var endNode = this.GetBookmarkNode( bookmark, false ) ;
|
||||||
|
|
||||||
domRange.setStart( startNode.parentNode, FCKDomTools.GetIndexOf( startNode ) ) ;
|
domRange.setStart( startNode.parentNode, FCKDomTools.GetIndexOf( startNode ) ) ;
|
||||||
FCKDomTools.RemoveNode( startNode ) ;
|
FCKDomTools.RemoveNode( startNode ) ;
|
||||||
|
|
||||||
if ( endNode )
|
if ( endNode )
|
||||||
{
|
{
|
||||||
domRange.setEnd( endNode.parentNode, FCKDomTools.GetIndexOf( endNode ) ) ;
|
domRange.setEnd( endNode.parentNode, FCKDomTools.GetIndexOf( endNode ) ) ;
|
||||||
FCKDomTools.RemoveNode( endNode ) ;
|
FCKDomTools.RemoveNode( endNode ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
var selection = this.Window.getSelection() ;
|
var selection = this.Window.getSelection() ;
|
||||||
selection.removeAllRanges() ;
|
selection.removeAllRanges() ;
|
||||||
selection.addRange( domRange ) ;
|
selection.addRange( domRange ) ;
|
||||||
}
|
}
|
||||||
|
@ -1,199 +1,199 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Class for working with a selection range, much like the W3C DOM Range, but
|
* Class for working with a selection range, much like the W3C DOM Range, but
|
||||||
* it is not intended to be an implementation of the W3C interface.
|
* it is not intended to be an implementation of the W3C interface.
|
||||||
* (IE Implementation)
|
* (IE Implementation)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
FCKDomRange.prototype.MoveToSelection = function()
|
FCKDomRange.prototype.MoveToSelection = function()
|
||||||
{
|
{
|
||||||
this.Release( true ) ;
|
this.Release( true ) ;
|
||||||
|
|
||||||
this._Range = new FCKW3CRange( this.Window.document ) ;
|
this._Range = new FCKW3CRange( this.Window.document ) ;
|
||||||
|
|
||||||
var oSel = this.Window.document.selection ;
|
var oSel = this.Window.document.selection ;
|
||||||
|
|
||||||
if ( oSel.type != 'Control' )
|
if ( oSel.type != 'Control' )
|
||||||
{
|
{
|
||||||
var eMarkerStart = this._GetSelectionMarkerTag( true ) ;
|
var eMarkerStart = this._GetSelectionMarkerTag( true ) ;
|
||||||
var eMarkerEnd = this._GetSelectionMarkerTag( false ) ;
|
var eMarkerEnd = this._GetSelectionMarkerTag( false ) ;
|
||||||
|
|
||||||
if ( !eMarkerStart && !eMarkerEnd )
|
if ( !eMarkerStart && !eMarkerEnd )
|
||||||
{
|
{
|
||||||
this._Range.setStart( this.Window.document.body, 0 ) ;
|
this._Range.setStart( this.Window.document.body, 0 ) ;
|
||||||
this._UpdateElementInfo() ;
|
this._UpdateElementInfo() ;
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the start boundary.
|
// Set the start boundary.
|
||||||
this._Range.setStart( eMarkerStart.parentNode, FCKDomTools.GetIndexOf( eMarkerStart ) ) ;
|
this._Range.setStart( eMarkerStart.parentNode, FCKDomTools.GetIndexOf( eMarkerStart ) ) ;
|
||||||
eMarkerStart.parentNode.removeChild( eMarkerStart ) ;
|
eMarkerStart.parentNode.removeChild( eMarkerStart ) ;
|
||||||
|
|
||||||
// Set the end boundary.
|
// Set the end boundary.
|
||||||
this._Range.setEnd( eMarkerEnd.parentNode, FCKDomTools.GetIndexOf( eMarkerEnd ) ) ;
|
this._Range.setEnd( eMarkerEnd.parentNode, FCKDomTools.GetIndexOf( eMarkerEnd ) ) ;
|
||||||
eMarkerEnd.parentNode.removeChild( eMarkerEnd ) ;
|
eMarkerEnd.parentNode.removeChild( eMarkerEnd ) ;
|
||||||
|
|
||||||
this._UpdateElementInfo() ;
|
this._UpdateElementInfo() ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var oControl = oSel.createRange().item(0) ;
|
var oControl = oSel.createRange().item(0) ;
|
||||||
|
|
||||||
if ( oControl )
|
if ( oControl )
|
||||||
{
|
{
|
||||||
this._Range.setStartBefore( oControl ) ;
|
this._Range.setStartBefore( oControl ) ;
|
||||||
this._Range.setEndAfter( oControl ) ;
|
this._Range.setEndAfter( oControl ) ;
|
||||||
this._UpdateElementInfo() ;
|
this._UpdateElementInfo() ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKDomRange.prototype.Select = function( forceExpand )
|
FCKDomRange.prototype.Select = function( forceExpand )
|
||||||
{
|
{
|
||||||
if ( this._Range )
|
if ( this._Range )
|
||||||
this.SelectBookmark( this.CreateBookmark( true ), forceExpand ) ;
|
this.SelectBookmark( this.CreateBookmark( true ), forceExpand ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Not compatible with bookmark created with CreateBookmark2.
|
// Not compatible with bookmark created with CreateBookmark2.
|
||||||
// The bookmark nodes will be deleted from the document.
|
// The bookmark nodes will be deleted from the document.
|
||||||
FCKDomRange.prototype.SelectBookmark = function( bookmark, forceExpand )
|
FCKDomRange.prototype.SelectBookmark = function( bookmark, forceExpand )
|
||||||
{
|
{
|
||||||
var bIsCollapsed = this.CheckIsCollapsed() ;
|
var bIsCollapsed = this.CheckIsCollapsed() ;
|
||||||
var bIsStartMakerAlone ;
|
var bIsStartMakerAlone ;
|
||||||
var dummySpan ;
|
var dummySpan ;
|
||||||
|
|
||||||
// Create marker tags for the start and end boundaries.
|
// Create marker tags for the start and end boundaries.
|
||||||
var eStartMarker = this.GetBookmarkNode( bookmark, true ) ;
|
var eStartMarker = this.GetBookmarkNode( bookmark, true ) ;
|
||||||
|
|
||||||
if ( !eStartMarker )
|
if ( !eStartMarker )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
var eEndMarker ;
|
var eEndMarker ;
|
||||||
if ( !bIsCollapsed )
|
if ( !bIsCollapsed )
|
||||||
eEndMarker = this.GetBookmarkNode( bookmark, false ) ;
|
eEndMarker = this.GetBookmarkNode( bookmark, false ) ;
|
||||||
|
|
||||||
// Create the main range which will be used for the selection.
|
// Create the main range which will be used for the selection.
|
||||||
var oIERange = this.Window.document.body.createTextRange() ;
|
var oIERange = this.Window.document.body.createTextRange() ;
|
||||||
|
|
||||||
// Position the range at the start boundary.
|
// Position the range at the start boundary.
|
||||||
oIERange.moveToElementText( eStartMarker ) ;
|
oIERange.moveToElementText( eStartMarker ) ;
|
||||||
oIERange.moveStart( 'character', 1 ) ;
|
oIERange.moveStart( 'character', 1 ) ;
|
||||||
|
|
||||||
if ( eEndMarker )
|
if ( eEndMarker )
|
||||||
{
|
{
|
||||||
// Create a tool range for the end.
|
// Create a tool range for the end.
|
||||||
var oIERangeEnd = this.Window.document.body.createTextRange() ;
|
var oIERangeEnd = this.Window.document.body.createTextRange() ;
|
||||||
|
|
||||||
// Position the tool range at the end.
|
// Position the tool range at the end.
|
||||||
oIERangeEnd.moveToElementText( eEndMarker ) ;
|
oIERangeEnd.moveToElementText( eEndMarker ) ;
|
||||||
|
|
||||||
// Move the end boundary of the main range to match the tool range.
|
// Move the end boundary of the main range to match the tool range.
|
||||||
oIERange.setEndPoint( 'EndToEnd', oIERangeEnd ) ;
|
oIERange.setEndPoint( 'EndToEnd', oIERangeEnd ) ;
|
||||||
oIERange.moveEnd( 'character', -1 ) ;
|
oIERange.moveEnd( 'character', -1 ) ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
bIsStartMakerAlone = ( forceExpand || !eStartMarker.previousSibling || eStartMarker.previousSibling.nodeName.toLowerCase() == 'br' ) && !eStartMarker.nextSibing ;
|
bIsStartMakerAlone = ( forceExpand || !eStartMarker.previousSibling || eStartMarker.previousSibling.nodeName.toLowerCase() == 'br' ) && !eStartMarker.nextSibing ;
|
||||||
|
|
||||||
// Append a temporary <span></span> before the selection.
|
// Append a temporary <span></span> before the selection.
|
||||||
// This is needed to avoid IE destroying selections inside empty
|
// This is needed to avoid IE destroying selections inside empty
|
||||||
// inline elements, like <b></b> (#253).
|
// inline elements, like <b></b> (#253).
|
||||||
// It is also needed when placing the selection right after an inline
|
// It is also needed when placing the selection right after an inline
|
||||||
// element to avoid the selection moving inside of it.
|
// element to avoid the selection moving inside of it.
|
||||||
dummySpan = this.Window.document.createElement( 'span' ) ;
|
dummySpan = this.Window.document.createElement( 'span' ) ;
|
||||||
dummySpan.innerHTML = '' ; // Zero Width No-Break Space (U+FEFF). See #1359.
|
dummySpan.innerHTML = '' ; // Zero Width No-Break Space (U+FEFF). See #1359.
|
||||||
eStartMarker.parentNode.insertBefore( dummySpan, eStartMarker ) ;
|
eStartMarker.parentNode.insertBefore( dummySpan, eStartMarker ) ;
|
||||||
|
|
||||||
if ( bIsStartMakerAlone )
|
if ( bIsStartMakerAlone )
|
||||||
{
|
{
|
||||||
// To expand empty blocks or line spaces after <br>, we need
|
// To expand empty blocks or line spaces after <br>, we need
|
||||||
// instead to have any char, which will be later deleted using the
|
// instead to have any char, which will be later deleted using the
|
||||||
// selection.
|
// selection.
|
||||||
// \ufeff = Zero Width No-Break Space (U+FEFF). See #1359.
|
// \ufeff = Zero Width No-Break Space (U+FEFF). See #1359.
|
||||||
eStartMarker.parentNode.insertBefore( this.Window.document.createTextNode( '\ufeff' ), eStartMarker ) ;
|
eStartMarker.parentNode.insertBefore( this.Window.document.createTextNode( '\ufeff' ), eStartMarker ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !this._Range )
|
if ( !this._Range )
|
||||||
this._Range = this.CreateRange() ;
|
this._Range = this.CreateRange() ;
|
||||||
|
|
||||||
// Remove the markers (reset the position, because of the changes in the DOM tree).
|
// Remove the markers (reset the position, because of the changes in the DOM tree).
|
||||||
this._Range.setStartBefore( eStartMarker ) ;
|
this._Range.setStartBefore( eStartMarker ) ;
|
||||||
eStartMarker.parentNode.removeChild( eStartMarker ) ;
|
eStartMarker.parentNode.removeChild( eStartMarker ) ;
|
||||||
|
|
||||||
if ( bIsCollapsed )
|
if ( bIsCollapsed )
|
||||||
{
|
{
|
||||||
if ( bIsStartMakerAlone )
|
if ( bIsStartMakerAlone )
|
||||||
{
|
{
|
||||||
// Move the selection start to include the temporary .
|
// Move the selection start to include the temporary .
|
||||||
oIERange.moveStart( 'character', -1 ) ;
|
oIERange.moveStart( 'character', -1 ) ;
|
||||||
|
|
||||||
oIERange.select() ;
|
oIERange.select() ;
|
||||||
|
|
||||||
// Remove our temporary stuff.
|
// Remove our temporary stuff.
|
||||||
this.Window.document.selection.clear() ;
|
this.Window.document.selection.clear() ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
oIERange.select() ;
|
oIERange.select() ;
|
||||||
|
|
||||||
FCKDomTools.RemoveNode( dummySpan ) ;
|
FCKDomTools.RemoveNode( dummySpan ) ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this._Range.setEndBefore( eEndMarker ) ;
|
this._Range.setEndBefore( eEndMarker ) ;
|
||||||
eEndMarker.parentNode.removeChild( eEndMarker ) ;
|
eEndMarker.parentNode.removeChild( eEndMarker ) ;
|
||||||
oIERange.select() ;
|
oIERange.select() ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKDomRange.prototype._GetSelectionMarkerTag = function( toStart )
|
FCKDomRange.prototype._GetSelectionMarkerTag = function( toStart )
|
||||||
{
|
{
|
||||||
var doc = this.Window.document ;
|
var doc = this.Window.document ;
|
||||||
var selection = doc.selection ;
|
var selection = doc.selection ;
|
||||||
|
|
||||||
// Get a range for the start boundary.
|
// Get a range for the start boundary.
|
||||||
var oRange ;
|
var oRange ;
|
||||||
|
|
||||||
// IE may throw an "unspecified error" on some cases (it happened when
|
// IE may throw an "unspecified error" on some cases (it happened when
|
||||||
// loading _samples/default.html), so try/catch.
|
// loading _samples/default.html), so try/catch.
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
oRange = selection.createRange() ;
|
oRange = selection.createRange() ;
|
||||||
}
|
}
|
||||||
catch (e)
|
catch (e)
|
||||||
{
|
{
|
||||||
return null ;
|
return null ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// IE might take the range object to the main window instead of inside the editor iframe window.
|
// IE might take the range object to the main window instead of inside the editor iframe window.
|
||||||
// This is known to happen when the editor window has not been selected before (See #933).
|
// This is known to happen when the editor window has not been selected before (See #933).
|
||||||
// We need to avoid that.
|
// We need to avoid that.
|
||||||
if ( oRange.parentElement().document != doc )
|
if ( oRange.parentElement().document != doc )
|
||||||
return null ;
|
return null ;
|
||||||
|
|
||||||
oRange.collapse( toStart === true ) ;
|
oRange.collapse( toStart === true ) ;
|
||||||
|
|
||||||
// Paste a marker element at the collapsed range and get it from the DOM.
|
// Paste a marker element at the collapsed range and get it from the DOM.
|
||||||
var sMarkerId = 'fck_dom_range_temp_' + (new Date()).valueOf() + '_' + Math.floor(Math.random()*1000) ;
|
var sMarkerId = 'fck_dom_range_temp_' + (new Date()).valueOf() + '_' + Math.floor(Math.random()*1000) ;
|
||||||
oRange.pasteHTML( '<span id="' + sMarkerId + '"></span>' ) ;
|
oRange.pasteHTML( '<span id="' + sMarkerId + '"></span>' ) ;
|
||||||
|
|
||||||
return doc.getElementById( sMarkerId ) ;
|
return doc.getElementById( sMarkerId ) ;
|
||||||
}
|
}
|
||||||
|
@ -1,327 +1,327 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* This class can be used to interate through nodes inside a range.
|
* This class can be used to interate through nodes inside a range.
|
||||||
*
|
*
|
||||||
* During interation, the provided range can become invalid, due to document
|
* During interation, the provided range can become invalid, due to document
|
||||||
* mutations, so CreateBookmark() used to restore it after processing, if
|
* mutations, so CreateBookmark() used to restore it after processing, if
|
||||||
* needed.
|
* needed.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKDomRangeIterator = function( range )
|
var FCKDomRangeIterator = function( range )
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* The FCKDomRange object that marks the interation boundaries.
|
* The FCKDomRange object that marks the interation boundaries.
|
||||||
*/
|
*/
|
||||||
this.Range = range ;
|
this.Range = range ;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indicates that <br> elements must be used as paragraph boundaries.
|
* Indicates that <br> elements must be used as paragraph boundaries.
|
||||||
*/
|
*/
|
||||||
this.ForceBrBreak = false ;
|
this.ForceBrBreak = false ;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Guarantees that the iterator will always return "real" block elements.
|
* Guarantees that the iterator will always return "real" block elements.
|
||||||
* If "false", elements like <li>, <th> and <td> are returned. If "true", a
|
* If "false", elements like <li>, <th> and <td> are returned. If "true", a
|
||||||
* dedicated block element block element will be created inside those
|
* dedicated block element block element will be created inside those
|
||||||
* elements to hold the selected content.
|
* elements to hold the selected content.
|
||||||
*/
|
*/
|
||||||
this.EnforceRealBlocks = false ;
|
this.EnforceRealBlocks = false ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKDomRangeIterator.CreateFromSelection = function( targetWindow )
|
FCKDomRangeIterator.CreateFromSelection = function( targetWindow )
|
||||||
{
|
{
|
||||||
var range = new FCKDomRange( targetWindow ) ;
|
var range = new FCKDomRange( targetWindow ) ;
|
||||||
range.MoveToSelection() ;
|
range.MoveToSelection() ;
|
||||||
return new FCKDomRangeIterator( range ) ;
|
return new FCKDomRangeIterator( range ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKDomRangeIterator.prototype =
|
FCKDomRangeIterator.prototype =
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Get the next paragraph element. It automatically breaks the document
|
* Get the next paragraph element. It automatically breaks the document
|
||||||
* when necessary to generate block elements for the paragraphs.
|
* when necessary to generate block elements for the paragraphs.
|
||||||
*/
|
*/
|
||||||
GetNextParagraph : function()
|
GetNextParagraph : function()
|
||||||
{
|
{
|
||||||
// The block element to be returned.
|
// The block element to be returned.
|
||||||
var block ;
|
var block ;
|
||||||
|
|
||||||
// The range object used to identify the paragraph contents.
|
// The range object used to identify the paragraph contents.
|
||||||
var range ;
|
var range ;
|
||||||
|
|
||||||
// Indicated that the current element in the loop is the last one.
|
// Indicated that the current element in the loop is the last one.
|
||||||
var isLast ;
|
var isLast ;
|
||||||
|
|
||||||
// Instructs to cleanup remaining BRs.
|
// Instructs to cleanup remaining BRs.
|
||||||
var removePreviousBr ;
|
var removePreviousBr ;
|
||||||
var removeLastBr ;
|
var removeLastBr ;
|
||||||
|
|
||||||
var boundarySet = this.ForceBrBreak ? FCKListsLib.ListBoundaries : FCKListsLib.BlockBoundaries ;
|
var boundarySet = this.ForceBrBreak ? FCKListsLib.ListBoundaries : FCKListsLib.BlockBoundaries ;
|
||||||
|
|
||||||
// This is the first iteration. Let's initialize it.
|
// This is the first iteration. Let's initialize it.
|
||||||
if ( !this._LastNode )
|
if ( !this._LastNode )
|
||||||
{
|
{
|
||||||
var range = this.Range.Clone() ;
|
var range = this.Range.Clone() ;
|
||||||
range.Expand( this.ForceBrBreak ? 'list_contents' : 'block_contents' ) ;
|
range.Expand( this.ForceBrBreak ? 'list_contents' : 'block_contents' ) ;
|
||||||
|
|
||||||
this._NextNode = range.GetTouchedStartNode() ;
|
this._NextNode = range.GetTouchedStartNode() ;
|
||||||
this._LastNode = range.GetTouchedEndNode() ;
|
this._LastNode = range.GetTouchedEndNode() ;
|
||||||
|
|
||||||
// Let's reuse this variable.
|
// Let's reuse this variable.
|
||||||
range = null ;
|
range = null ;
|
||||||
}
|
}
|
||||||
|
|
||||||
var currentNode = this._NextNode ;
|
var currentNode = this._NextNode ;
|
||||||
var lastNode = this._LastNode ;
|
var lastNode = this._LastNode ;
|
||||||
|
|
||||||
this._NextNode = null ;
|
this._NextNode = null ;
|
||||||
|
|
||||||
while ( currentNode )
|
while ( currentNode )
|
||||||
{
|
{
|
||||||
// closeRange indicates that a paragraph boundary has been found,
|
// closeRange indicates that a paragraph boundary has been found,
|
||||||
// so the range can be closed.
|
// so the range can be closed.
|
||||||
var closeRange = false ;
|
var closeRange = false ;
|
||||||
|
|
||||||
// includeNode indicates that the current node is good to be part
|
// includeNode indicates that the current node is good to be part
|
||||||
// of the range. By default, any non-element node is ok for it.
|
// of the range. By default, any non-element node is ok for it.
|
||||||
var includeNode = ( currentNode.nodeType != 1 ) ;
|
var includeNode = ( currentNode.nodeType != 1 ) ;
|
||||||
|
|
||||||
var continueFromSibling = false ;
|
var continueFromSibling = false ;
|
||||||
|
|
||||||
// If it is an element node, let's check if it can be part of the
|
// If it is an element node, let's check if it can be part of the
|
||||||
// range.
|
// range.
|
||||||
if ( !includeNode )
|
if ( !includeNode )
|
||||||
{
|
{
|
||||||
var nodeName = currentNode.nodeName.toLowerCase() ;
|
var nodeName = currentNode.nodeName.toLowerCase() ;
|
||||||
|
|
||||||
if ( boundarySet[ nodeName ] && ( !FCKBrowserInfo.IsIE || currentNode.scopeName == 'HTML' ) )
|
if ( boundarySet[ nodeName ] && ( !FCKBrowserInfo.IsIE || currentNode.scopeName == 'HTML' ) )
|
||||||
{
|
{
|
||||||
// <br> boundaries must be part of the range. It will
|
// <br> boundaries must be part of the range. It will
|
||||||
// happen only if ForceBrBreak.
|
// happen only if ForceBrBreak.
|
||||||
if ( nodeName == 'br' )
|
if ( nodeName == 'br' )
|
||||||
includeNode = true ;
|
includeNode = true ;
|
||||||
else if ( !range && currentNode.childNodes.length == 0 && nodeName != 'hr' )
|
else if ( !range && currentNode.childNodes.length == 0 && nodeName != 'hr' )
|
||||||
{
|
{
|
||||||
// If we have found an empty block, and haven't started
|
// If we have found an empty block, and haven't started
|
||||||
// the range yet, it means we must return this block.
|
// the range yet, it means we must return this block.
|
||||||
block = currentNode ;
|
block = currentNode ;
|
||||||
isLast = currentNode == lastNode ;
|
isLast = currentNode == lastNode ;
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The range must finish right before the boundary,
|
// The range must finish right before the boundary,
|
||||||
// including possibly skipped empty spaces. (#1603)
|
// including possibly skipped empty spaces. (#1603)
|
||||||
if ( range )
|
if ( range )
|
||||||
{
|
{
|
||||||
range.SetEnd( currentNode, 3, true ) ;
|
range.SetEnd( currentNode, 3, true ) ;
|
||||||
|
|
||||||
// The found boundary must be set as the next one at this
|
// The found boundary must be set as the next one at this
|
||||||
// point. (#1717)
|
// point. (#1717)
|
||||||
if ( nodeName != 'br' )
|
if ( nodeName != 'br' )
|
||||||
this._NextNode = currentNode ;
|
this._NextNode = FCKDomTools.GetNextSourceNode( currentNode, true, null, lastNode ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
closeRange = true ;
|
closeRange = true ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// If we have child nodes, let's check them.
|
// If we have child nodes, let's check them.
|
||||||
if ( currentNode.firstChild )
|
if ( currentNode.firstChild )
|
||||||
{
|
{
|
||||||
// If we don't have a range yet, let's start it.
|
// If we don't have a range yet, let's start it.
|
||||||
if ( !range )
|
if ( !range )
|
||||||
{
|
{
|
||||||
range = new FCKDomRange( this.Range.Window ) ;
|
range = new FCKDomRange( this.Range.Window ) ;
|
||||||
range.SetStart( currentNode, 3, true ) ;
|
range.SetStart( currentNode, 3, true ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
currentNode = currentNode.firstChild ;
|
currentNode = currentNode.firstChild ;
|
||||||
continue ;
|
continue ;
|
||||||
}
|
}
|
||||||
includeNode = true ;
|
includeNode = true ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( currentNode.nodeType == 3 )
|
else if ( currentNode.nodeType == 3 )
|
||||||
{
|
{
|
||||||
// Ignore normal whitespaces (i.e. not including or
|
// Ignore normal whitespaces (i.e. not including or
|
||||||
// other unicode whitespaces) before/after a block node.
|
// other unicode whitespaces) before/after a block node.
|
||||||
if ( /^[\r\n\t ]+$/.test( currentNode.nodeValue ) )
|
if ( /^[\r\n\t ]+$/.test( currentNode.nodeValue ) )
|
||||||
includeNode = false ;
|
includeNode = false ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The current node is good to be part of the range and we are
|
// The current node is good to be part of the range and we are
|
||||||
// starting a new range, initialize it first.
|
// starting a new range, initialize it first.
|
||||||
if ( includeNode && !range )
|
if ( includeNode && !range )
|
||||||
{
|
{
|
||||||
range = new FCKDomRange( this.Range.Window ) ;
|
range = new FCKDomRange( this.Range.Window ) ;
|
||||||
range.SetStart( currentNode, 3, true ) ;
|
range.SetStart( currentNode, 3, true ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The last node has been found.
|
// The last node has been found.
|
||||||
isLast = ( ( !closeRange || includeNode ) && currentNode == lastNode ) ;
|
isLast = ( ( !closeRange || includeNode ) && currentNode == lastNode ) ;
|
||||||
// isLast = ( currentNode == lastNode && ( currentNode.nodeType != 1 || currentNode.childNodes.length == 0 ) ) ;
|
// isLast = ( currentNode == lastNode && ( currentNode.nodeType != 1 || currentNode.childNodes.length == 0 ) ) ;
|
||||||
|
|
||||||
// If we are in an element boundary, let's check if it is time
|
// If we are in an element boundary, let's check if it is time
|
||||||
// to close the range, otherwise we include the parent within it.
|
// to close the range, otherwise we include the parent within it.
|
||||||
if ( range && !closeRange )
|
if ( range && !closeRange )
|
||||||
{
|
{
|
||||||
while ( !currentNode.nextSibling && !isLast )
|
while ( !currentNode.nextSibling && !isLast )
|
||||||
{
|
{
|
||||||
var parentNode = currentNode.parentNode ;
|
var parentNode = currentNode.parentNode ;
|
||||||
|
|
||||||
if ( boundarySet[ parentNode.nodeName.toLowerCase() ] )
|
if ( boundarySet[ parentNode.nodeName.toLowerCase() ] )
|
||||||
{
|
{
|
||||||
closeRange = true ;
|
closeRange = true ;
|
||||||
isLast = isLast || ( parentNode == lastNode ) ;
|
isLast = isLast || ( parentNode == lastNode ) ;
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
|
|
||||||
currentNode = parentNode ;
|
currentNode = parentNode ;
|
||||||
includeNode = true ;
|
includeNode = true ;
|
||||||
isLast = ( currentNode == lastNode ) ;
|
isLast = ( currentNode == lastNode ) ;
|
||||||
continueFromSibling = true ;
|
continueFromSibling = true ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now finally include the node.
|
// Now finally include the node.
|
||||||
if ( includeNode )
|
if ( includeNode )
|
||||||
range.SetEnd( currentNode, 4, true ) ;
|
range.SetEnd( currentNode, 4, true ) ;
|
||||||
|
|
||||||
// We have found a block boundary. Let's close the range and move out of the
|
// We have found a block boundary. Let's close the range and move out of the
|
||||||
// loop.
|
// loop.
|
||||||
if ( ( closeRange || isLast ) && range )
|
if ( ( closeRange || isLast ) && range )
|
||||||
{
|
{
|
||||||
range._UpdateElementInfo() ;
|
range._UpdateElementInfo() ;
|
||||||
|
|
||||||
if ( range.StartNode == range.EndNode
|
if ( range.StartNode == range.EndNode
|
||||||
&& range.StartNode.parentNode == range.StartBlockLimit
|
&& range.StartNode.parentNode == range.StartBlockLimit
|
||||||
&& range.StartNode.getAttribute && range.StartNode.getAttribute( '_fck_bookmark' ) )
|
&& range.StartNode.getAttribute && range.StartNode.getAttribute( '_fck_bookmark' ) )
|
||||||
range = null ;
|
range = null ;
|
||||||
else
|
else
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( isLast )
|
if ( isLast )
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
currentNode = FCKDomTools.GetNextSourceNode( currentNode, continueFromSibling, null, lastNode ) ;
|
currentNode = FCKDomTools.GetNextSourceNode( currentNode, continueFromSibling, null, lastNode ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now, based on the processed range, look for (or create) the block to be returned.
|
// Now, based on the processed range, look for (or create) the block to be returned.
|
||||||
if ( !block )
|
if ( !block )
|
||||||
{
|
{
|
||||||
// If no range has been found, this is the end.
|
// If no range has been found, this is the end.
|
||||||
if ( !range )
|
if ( !range )
|
||||||
{
|
{
|
||||||
this._NextNode = null ;
|
this._NextNode = null ;
|
||||||
return null ;
|
return null ;
|
||||||
}
|
}
|
||||||
|
|
||||||
block = range.StartBlock ;
|
block = range.StartBlock ;
|
||||||
|
|
||||||
if ( !block
|
if ( !block
|
||||||
&& !this.EnforceRealBlocks
|
&& !this.EnforceRealBlocks
|
||||||
&& range.StartBlockLimit.nodeName.IEquals( 'DIV', 'TH', 'TD' )
|
&& range.StartBlockLimit.nodeName.IEquals( 'DIV', 'TH', 'TD' )
|
||||||
&& range.CheckStartOfBlock()
|
&& range.CheckStartOfBlock()
|
||||||
&& range.CheckEndOfBlock() )
|
&& range.CheckEndOfBlock() )
|
||||||
{
|
{
|
||||||
block = range.StartBlockLimit ;
|
block = range.StartBlockLimit ;
|
||||||
}
|
}
|
||||||
else if ( !block || ( this.EnforceRealBlocks && block.nodeName.toLowerCase() == 'li' ) )
|
else if ( !block || ( this.EnforceRealBlocks && block.nodeName.toLowerCase() == 'li' ) )
|
||||||
{
|
{
|
||||||
// Create the fixed block.
|
// Create the fixed block.
|
||||||
block = this.Range.Window.document.createElement( FCKConfig.EnterMode == 'p' ? 'p' : 'div' ) ;
|
block = this.Range.Window.document.createElement( FCKConfig.EnterMode == 'p' ? 'p' : 'div' ) ;
|
||||||
|
|
||||||
// Move the contents of the temporary range to the fixed block.
|
// Move the contents of the temporary range to the fixed block.
|
||||||
range.ExtractContents().AppendTo( block ) ;
|
range.ExtractContents().AppendTo( block ) ;
|
||||||
FCKDomTools.TrimNode( block ) ;
|
FCKDomTools.TrimNode( block ) ;
|
||||||
|
|
||||||
// Insert the fixed block into the DOM.
|
// Insert the fixed block into the DOM.
|
||||||
range.InsertNode( block ) ;
|
range.InsertNode( block ) ;
|
||||||
|
|
||||||
removePreviousBr = true ;
|
removePreviousBr = true ;
|
||||||
removeLastBr = true ;
|
removeLastBr = true ;
|
||||||
}
|
}
|
||||||
else if ( block.nodeName.toLowerCase() != 'li' )
|
else if ( block.nodeName.toLowerCase() != 'li' )
|
||||||
{
|
{
|
||||||
// If the range doesn't includes the entire contents of the
|
// If the range doesn't includes the entire contents of the
|
||||||
// block, we must split it, isolating the range in a dedicated
|
// block, we must split it, isolating the range in a dedicated
|
||||||
// block.
|
// block.
|
||||||
if ( !range.CheckStartOfBlock() || !range.CheckEndOfBlock() )
|
if ( !range.CheckStartOfBlock() || !range.CheckEndOfBlock() )
|
||||||
{
|
{
|
||||||
// The resulting block will be a clone of the current one.
|
// The resulting block will be a clone of the current one.
|
||||||
block = block.cloneNode( false ) ;
|
block = block.cloneNode( false ) ;
|
||||||
|
|
||||||
// Extract the range contents, moving it to the new block.
|
// Extract the range contents, moving it to the new block.
|
||||||
range.ExtractContents().AppendTo( block ) ;
|
range.ExtractContents().AppendTo( block ) ;
|
||||||
FCKDomTools.TrimNode( block ) ;
|
FCKDomTools.TrimNode( block ) ;
|
||||||
|
|
||||||
// Split the block. At this point, the range will be in the
|
// Split the block. At this point, the range will be in the
|
||||||
// right position for our intents.
|
// right position for our intents.
|
||||||
var splitInfo = range.SplitBlock() ;
|
var splitInfo = range.SplitBlock() ;
|
||||||
|
|
||||||
removePreviousBr = !splitInfo.WasStartOfBlock ;
|
removePreviousBr = !splitInfo.WasStartOfBlock ;
|
||||||
removeLastBr = !splitInfo.WasEndOfBlock ;
|
removeLastBr = !splitInfo.WasEndOfBlock ;
|
||||||
|
|
||||||
// Insert the new block into the DOM.
|
// Insert the new block into the DOM.
|
||||||
range.InsertNode( block ) ;
|
range.InsertNode( block ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( !isLast )
|
else if ( !isLast )
|
||||||
{
|
{
|
||||||
// LIs are returned as is, with all their children (due to the
|
// LIs are returned as is, with all their children (due to the
|
||||||
// nested lists). But, the next node is the node right after
|
// nested lists). But, the next node is the node right after
|
||||||
// the current range, which could be an <li> child (nested
|
// the current range, which could be an <li> child (nested
|
||||||
// lists) or the next sibling <li>.
|
// lists) or the next sibling <li>.
|
||||||
|
|
||||||
this._NextNode = block == lastNode ? null : FCKDomTools.GetNextSourceNode( range.EndNode, true, null, lastNode ) ;
|
this._NextNode = block == lastNode ? null : FCKDomTools.GetNextSourceNode( range.EndNode, true, null, lastNode ) ;
|
||||||
return block ;
|
return block ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( removePreviousBr )
|
if ( removePreviousBr )
|
||||||
{
|
{
|
||||||
var previousSibling = block.previousSibling ;
|
var previousSibling = block.previousSibling ;
|
||||||
if ( previousSibling && previousSibling.nodeType == 1 )
|
if ( previousSibling && previousSibling.nodeType == 1 )
|
||||||
{
|
{
|
||||||
if ( previousSibling.nodeName.toLowerCase() == 'br' )
|
if ( previousSibling.nodeName.toLowerCase() == 'br' )
|
||||||
previousSibling.parentNode.removeChild( previousSibling ) ;
|
previousSibling.parentNode.removeChild( previousSibling ) ;
|
||||||
else if ( previousSibling.lastChild && previousSibling.lastChild.nodeName.IEquals( 'br' ) )
|
else if ( previousSibling.lastChild && previousSibling.lastChild.nodeName.IEquals( 'br' ) )
|
||||||
previousSibling.removeChild( previousSibling.lastChild ) ;
|
previousSibling.removeChild( previousSibling.lastChild ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( removeLastBr )
|
if ( removeLastBr )
|
||||||
{
|
{
|
||||||
var lastChild = block.lastChild ;
|
var lastChild = block.lastChild ;
|
||||||
if ( lastChild && lastChild.nodeType == 1 && lastChild.nodeName.toLowerCase() == 'br' )
|
if ( lastChild && lastChild.nodeType == 1 && lastChild.nodeName.toLowerCase() == 'br' )
|
||||||
block.removeChild( lastChild ) ;
|
block.removeChild( lastChild ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get a reference for the next element. This is important because the
|
// Get a reference for the next element. This is important because the
|
||||||
// above block can be removed or changed, so we can rely on it for the
|
// above block can be removed or changed, so we can rely on it for the
|
||||||
// next interation.
|
// next interation.
|
||||||
if ( !this._NextNode )
|
if ( !this._NextNode )
|
||||||
this._NextNode = ( isLast || block == lastNode ) ? null : FCKDomTools.GetNextSourceNode( block, true, null, lastNode ) ;
|
this._NextNode = ( isLast || block == lastNode ) ? null : FCKDomTools.GetNextSourceNode( block, true, null, lastNode ) ;
|
||||||
|
|
||||||
return block ;
|
return block ;
|
||||||
}
|
}
|
||||||
} ;
|
} ;
|
||||||
|
@ -1,362 +1,368 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKEditingArea Class: renders an editable area.
|
* FCKEditingArea Class: renders an editable area.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @constructor
|
* @constructor
|
||||||
* @param {String} targetElement The element that will hold the editing area. Any child element present in the target will be deleted.
|
* @param {String} targetElement The element that will hold the editing area. Any child element present in the target will be deleted.
|
||||||
*/
|
*/
|
||||||
var FCKEditingArea = function( targetElement )
|
var FCKEditingArea = function( targetElement )
|
||||||
{
|
{
|
||||||
this.TargetElement = targetElement ;
|
this.TargetElement = targetElement ;
|
||||||
this.Mode = FCK_EDITMODE_WYSIWYG ;
|
this.Mode = FCK_EDITMODE_WYSIWYG ;
|
||||||
|
|
||||||
if ( FCK.IECleanup )
|
if ( FCK.IECleanup )
|
||||||
FCK.IECleanup.AddItem( this, FCKEditingArea_Cleanup ) ;
|
FCK.IECleanup.AddItem( this, FCKEditingArea_Cleanup ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {String} html The complete HTML for the page, including DOCTYPE and the <html> tag.
|
* @param {String} html The complete HTML for the page, including DOCTYPE and the <html> tag.
|
||||||
*/
|
*/
|
||||||
FCKEditingArea.prototype.Start = function( html, secondCall )
|
FCKEditingArea.prototype.Start = function( html, secondCall )
|
||||||
{
|
{
|
||||||
var eTargetElement = this.TargetElement ;
|
var eTargetElement = this.TargetElement ;
|
||||||
var oTargetDocument = FCKTools.GetElementDocument( eTargetElement ) ;
|
var oTargetDocument = FCKTools.GetElementDocument( eTargetElement ) ;
|
||||||
|
|
||||||
// Remove all child nodes from the target.
|
// Remove all child nodes from the target.
|
||||||
while( eTargetElement.firstChild )
|
while( eTargetElement.firstChild )
|
||||||
eTargetElement.removeChild( eTargetElement.firstChild ) ;
|
eTargetElement.removeChild( eTargetElement.firstChild ) ;
|
||||||
|
|
||||||
if ( this.Mode == FCK_EDITMODE_WYSIWYG )
|
if ( this.Mode == FCK_EDITMODE_WYSIWYG )
|
||||||
{
|
{
|
||||||
// For FF, document.domain must be set only when different, otherwhise
|
// For FF, document.domain must be set only when different, otherwhise
|
||||||
// we'll strangely have "Permission denied" issues.
|
// we'll strangely have "Permission denied" issues.
|
||||||
if ( FCK_IS_CUSTOM_DOMAIN )
|
if ( FCK_IS_CUSTOM_DOMAIN )
|
||||||
html = '<script>document.domain="' + FCK_RUNTIME_DOMAIN + '";</script>' + html ;
|
html = '<script>document.domain="' + FCK_RUNTIME_DOMAIN + '";</script>' + html ;
|
||||||
|
|
||||||
// IE has a bug with the <base> tag... it must have a </base> closer,
|
// IE has a bug with the <base> tag... it must have a </base> closer,
|
||||||
// otherwise the all successive tags will be set as children nodes of the <base>.
|
// otherwise the all successive tags will be set as children nodes of the <base>.
|
||||||
if ( FCKBrowserInfo.IsIE )
|
if ( FCKBrowserInfo.IsIE )
|
||||||
html = html.replace( /(<base[^>]*?)\s*\/?>(?!\s*<\/base>)/gi, '$1></base>' ) ;
|
html = html.replace( /(<base[^>]*?)\s*\/?>(?!\s*<\/base>)/gi, '$1></base>' ) ;
|
||||||
else if ( !secondCall )
|
else if ( !secondCall )
|
||||||
{
|
{
|
||||||
// Gecko moves some tags out of the body to the head, so we must use
|
// Gecko moves some tags out of the body to the head, so we must use
|
||||||
// innerHTML to set the body contents (SF BUG 1526154).
|
// innerHTML to set the body contents (SF BUG 1526154).
|
||||||
|
|
||||||
// Extract the BODY contents from the html.
|
// Extract the BODY contents from the html.
|
||||||
var oMatchBefore = html.match( FCKRegexLib.BeforeBody ) ;
|
var oMatchBefore = html.match( FCKRegexLib.BeforeBody ) ;
|
||||||
var oMatchAfter = html.match( FCKRegexLib.AfterBody ) ;
|
var oMatchAfter = html.match( FCKRegexLib.AfterBody ) ;
|
||||||
|
|
||||||
if ( oMatchBefore && oMatchAfter )
|
if ( oMatchBefore && oMatchAfter )
|
||||||
{
|
{
|
||||||
var sBody = html.substr( oMatchBefore[1].length,
|
var sBody = html.substr( oMatchBefore[1].length,
|
||||||
html.length - oMatchBefore[1].length - oMatchAfter[1].length ) ; // This is the BODY tag contents.
|
html.length - oMatchBefore[1].length - oMatchAfter[1].length ) ; // This is the BODY tag contents.
|
||||||
|
|
||||||
html =
|
html =
|
||||||
oMatchBefore[1] + // This is the HTML until the <body...> tag, inclusive.
|
oMatchBefore[1] + // This is the HTML until the <body...> tag, inclusive.
|
||||||
' ' +
|
' ' +
|
||||||
oMatchAfter[1] ; // This is the HTML from the </body> tag, inclusive.
|
oMatchAfter[1] ; // This is the HTML from the </body> tag, inclusive.
|
||||||
|
|
||||||
// If nothing in the body, place a BOGUS tag so the cursor will appear.
|
// If nothing in the body, place a BOGUS tag so the cursor will appear.
|
||||||
if ( FCKBrowserInfo.IsGecko && ( sBody.length == 0 || FCKRegexLib.EmptyParagraph.test( sBody ) ) )
|
if ( FCKBrowserInfo.IsGecko && ( sBody.length == 0 || FCKRegexLib.EmptyParagraph.test( sBody ) ) )
|
||||||
sBody = '<br type="_moz">' ;
|
sBody = '<br type="_moz">' ;
|
||||||
|
|
||||||
this._BodyHTML = sBody ;
|
this._BodyHTML = sBody ;
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
this._BodyHTML = html ; // Invalid HTML input.
|
this._BodyHTML = html ; // Invalid HTML input.
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the editing area IFRAME.
|
// Create the editing area IFRAME.
|
||||||
var oIFrame = this.IFrame = oTargetDocument.createElement( 'iframe' ) ;
|
var oIFrame = this.IFrame = oTargetDocument.createElement( 'iframe' ) ;
|
||||||
|
|
||||||
// IE: Avoid JavaScript errors thrown by the editing are source (like tags events).
|
// IE: Avoid JavaScript errors thrown by the editing are source (like tags events).
|
||||||
// See #1055.
|
// See #1055.
|
||||||
var sOverrideError = '<script type="text/javascript" _fcktemp="true">window.onerror=function(){return true;};</script>' ;
|
var sOverrideError = '<script type="text/javascript" _fcktemp="true">window.onerror=function(){return true;};</script>' ;
|
||||||
|
|
||||||
oIFrame.frameBorder = 0 ;
|
oIFrame.frameBorder = 0 ;
|
||||||
oIFrame.width = oIFrame.height = '100%' ;
|
oIFrame.style.width = oIFrame.style.height = '100%' ;
|
||||||
|
|
||||||
if ( FCK_IS_CUSTOM_DOMAIN && FCKBrowserInfo.IsIE )
|
if ( FCK_IS_CUSTOM_DOMAIN && FCKBrowserInfo.IsIE )
|
||||||
{
|
{
|
||||||
window._FCKHtmlToLoad = sOverrideError + html ;
|
window._FCKHtmlToLoad = html.replace( /<head>/i, '<head>' + sOverrideError ) ;
|
||||||
oIFrame.src = 'javascript:void( (function(){' +
|
oIFrame.src = 'javascript:void( (function(){' +
|
||||||
'document.open() ;' +
|
'document.open() ;' +
|
||||||
'document.domain="' + document.domain + '" ;' +
|
'document.domain="' + document.domain + '" ;' +
|
||||||
'document.write( window.parent._FCKHtmlToLoad );' +
|
'document.write( window.parent._FCKHtmlToLoad );' +
|
||||||
'document.close() ;' +
|
'document.close() ;' +
|
||||||
'window.parent._FCKHtmlToLoad = null ;' +
|
'window.parent._FCKHtmlToLoad = null ;' +
|
||||||
'})() )' ;
|
'})() )' ;
|
||||||
}
|
}
|
||||||
else if ( !FCKBrowserInfo.IsGecko )
|
else if ( !FCKBrowserInfo.IsGecko )
|
||||||
{
|
{
|
||||||
// Firefox will render the tables inside the body in Quirks mode if the
|
// Firefox will render the tables inside the body in Quirks mode if the
|
||||||
// source of the iframe is set to javascript. see #515
|
// source of the iframe is set to javascript. see #515
|
||||||
oIFrame.src = 'javascript:void(0)' ;
|
oIFrame.src = 'javascript:void(0)' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Append the new IFRAME to the target. For IE, it must be done after
|
// Append the new IFRAME to the target. For IE, it must be done after
|
||||||
// setting the "src", to avoid the "secure/unsecure" message under HTTPS.
|
// setting the "src", to avoid the "secure/unsecure" message under HTTPS.
|
||||||
eTargetElement.appendChild( oIFrame ) ;
|
eTargetElement.appendChild( oIFrame ) ;
|
||||||
|
|
||||||
// Get the window and document objects used to interact with the newly created IFRAME.
|
// Get the window and document objects used to interact with the newly created IFRAME.
|
||||||
this.Window = oIFrame.contentWindow ;
|
this.Window = oIFrame.contentWindow ;
|
||||||
|
|
||||||
// IE: Avoid JavaScript errors thrown by the editing are source (like tags events).
|
// IE: Avoid JavaScript errors thrown by the editing are source (like tags events).
|
||||||
// TODO: This error handler is not being fired.
|
// TODO: This error handler is not being fired.
|
||||||
// this.Window.onerror = function() { alert( 'Error!' ) ; return true ; }
|
// this.Window.onerror = function() { alert( 'Error!' ) ; return true ; }
|
||||||
|
|
||||||
if ( !FCK_IS_CUSTOM_DOMAIN || !FCKBrowserInfo.IsIE )
|
if ( !FCK_IS_CUSTOM_DOMAIN || !FCKBrowserInfo.IsIE )
|
||||||
{
|
{
|
||||||
var oDoc = this.Window.document ;
|
var oDoc = this.Window.document ;
|
||||||
|
|
||||||
oDoc.open() ;
|
oDoc.open() ;
|
||||||
oDoc.write( sOverrideError + html ) ;
|
oDoc.write( html.replace( /<head>/i, '<head>' + sOverrideError ) ) ;
|
||||||
oDoc.close() ;
|
oDoc.close() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( FCKBrowserInfo.IsAIR )
|
if ( FCKBrowserInfo.IsAIR )
|
||||||
FCKAdobeAIR.EditingArea_Start( oDoc, html ) ;
|
FCKAdobeAIR.EditingArea_Start( oDoc, html ) ;
|
||||||
|
|
||||||
// Firefox 1.0.x is buggy... ohh yes... so let's do it two times and it
|
// Firefox 1.0.x is buggy... ohh yes... so let's do it two times and it
|
||||||
// will magically work.
|
// will magically work.
|
||||||
if ( FCKBrowserInfo.IsGecko10 && !secondCall )
|
if ( FCKBrowserInfo.IsGecko10 && !secondCall )
|
||||||
{
|
{
|
||||||
this.Start( html, true ) ;
|
this.Start( html, true ) ;
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( oIFrame.readyState && oIFrame.readyState != 'completed' )
|
if ( oIFrame.readyState && oIFrame.readyState != 'completed' )
|
||||||
{
|
{
|
||||||
var editArea = this ;
|
var editArea = this ;
|
||||||
( oIFrame.onreadystatechange = function()
|
|
||||||
{
|
// Using a IE alternative for DOMContentLoaded, similar to the
|
||||||
if ( oIFrame.readyState == 'complete' )
|
// solution proposed at http://javascript.nwbox.com/IEContentLoaded/
|
||||||
{
|
setTimeout( function()
|
||||||
oIFrame.onreadystatechange = null ;
|
{
|
||||||
editArea.Window._FCKEditingArea = editArea ;
|
try
|
||||||
FCKEditingArea_CompleteStart.call( editArea.Window ) ;
|
{
|
||||||
}
|
editArea.Window.document.documentElement.doScroll("left") ;
|
||||||
// It happened that IE changed the state to "complete" after the
|
}
|
||||||
// "if" and before the "onreadystatechange" assignement, making we
|
catch(e)
|
||||||
// lost the event call, so we do a manual call just to be sure.
|
{
|
||||||
} )() ;
|
setTimeout( arguments.callee, 0 ) ;
|
||||||
}
|
return ;
|
||||||
else
|
}
|
||||||
{
|
editArea.Window._FCKEditingArea = editArea ;
|
||||||
this.Window._FCKEditingArea = this ;
|
FCKEditingArea_CompleteStart.call( editArea.Window ) ;
|
||||||
|
}, 0 ) ;
|
||||||
// FF 1.0.x is buggy... we must wait a lot to enable editing because
|
}
|
||||||
// sometimes the content simply disappears, for example when pasting
|
else
|
||||||
// "bla1!<img src='some_url'>!bla2" in the source and then switching
|
{
|
||||||
// back to design.
|
this.Window._FCKEditingArea = this ;
|
||||||
if ( FCKBrowserInfo.IsGecko10 )
|
|
||||||
this.Window.setTimeout( FCKEditingArea_CompleteStart, 500 ) ;
|
// FF 1.0.x is buggy... we must wait a lot to enable editing because
|
||||||
else
|
// sometimes the content simply disappears, for example when pasting
|
||||||
FCKEditingArea_CompleteStart.call( this.Window ) ;
|
// "bla1!<img src='some_url'>!bla2" in the source and then switching
|
||||||
}
|
// back to design.
|
||||||
}
|
if ( FCKBrowserInfo.IsGecko10 )
|
||||||
else
|
this.Window.setTimeout( FCKEditingArea_CompleteStart, 500 ) ;
|
||||||
{
|
else
|
||||||
var eTextarea = this.Textarea = oTargetDocument.createElement( 'textarea' ) ;
|
FCKEditingArea_CompleteStart.call( this.Window ) ;
|
||||||
eTextarea.className = 'SourceField' ;
|
}
|
||||||
eTextarea.dir = 'ltr' ;
|
}
|
||||||
FCKDomTools.SetElementStyles( eTextarea,
|
else
|
||||||
{
|
{
|
||||||
width : '100%',
|
var eTextarea = this.Textarea = oTargetDocument.createElement( 'textarea' ) ;
|
||||||
height : '100%',
|
eTextarea.className = 'SourceField' ;
|
||||||
border : 'none',
|
eTextarea.dir = 'ltr' ;
|
||||||
resize : 'none',
|
FCKDomTools.SetElementStyles( eTextarea,
|
||||||
outline : 'none'
|
{
|
||||||
} ) ;
|
width : '100%',
|
||||||
eTargetElement.appendChild( eTextarea ) ;
|
height : '100%',
|
||||||
|
border : 'none',
|
||||||
eTextarea.value = html ;
|
resize : 'none',
|
||||||
|
outline : 'none'
|
||||||
// Fire the "OnLoad" event.
|
} ) ;
|
||||||
FCKTools.RunFunction( this.OnLoad ) ;
|
eTargetElement.appendChild( eTextarea ) ;
|
||||||
}
|
|
||||||
}
|
eTextarea.value = html ;
|
||||||
|
|
||||||
// "this" here is FCKEditingArea.Window
|
// Fire the "OnLoad" event.
|
||||||
function FCKEditingArea_CompleteStart()
|
FCKTools.RunFunction( this.OnLoad ) ;
|
||||||
{
|
}
|
||||||
// On Firefox, the DOM takes a little to become available. So we must wait for it in a loop.
|
}
|
||||||
if ( !this.document.body )
|
|
||||||
{
|
// "this" here is FCKEditingArea.Window
|
||||||
this.setTimeout( FCKEditingArea_CompleteStart, 50 ) ;
|
function FCKEditingArea_CompleteStart()
|
||||||
return ;
|
{
|
||||||
}
|
// On Firefox, the DOM takes a little to become available. So we must wait for it in a loop.
|
||||||
|
if ( !this.document.body )
|
||||||
var oEditorArea = this._FCKEditingArea ;
|
{
|
||||||
|
this.setTimeout( FCKEditingArea_CompleteStart, 50 ) ;
|
||||||
// Save this reference to be re-used later.
|
return ;
|
||||||
oEditorArea.Document = oEditorArea.Window.document ;
|
}
|
||||||
|
|
||||||
oEditorArea.MakeEditable() ;
|
var oEditorArea = this._FCKEditingArea ;
|
||||||
|
|
||||||
// Fire the "OnLoad" event.
|
// Save this reference to be re-used later.
|
||||||
FCKTools.RunFunction( oEditorArea.OnLoad ) ;
|
oEditorArea.Document = oEditorArea.Window.document ;
|
||||||
}
|
|
||||||
|
oEditorArea.MakeEditable() ;
|
||||||
FCKEditingArea.prototype.MakeEditable = function()
|
|
||||||
{
|
// Fire the "OnLoad" event.
|
||||||
var oDoc = this.Document ;
|
FCKTools.RunFunction( oEditorArea.OnLoad ) ;
|
||||||
|
}
|
||||||
if ( FCKBrowserInfo.IsIE )
|
|
||||||
{
|
FCKEditingArea.prototype.MakeEditable = function()
|
||||||
// Kludge for #141 and #523
|
{
|
||||||
oDoc.body.disabled = true ;
|
var oDoc = this.Document ;
|
||||||
oDoc.body.contentEditable = true ;
|
|
||||||
oDoc.body.removeAttribute( "disabled" ) ;
|
if ( FCKBrowserInfo.IsIE )
|
||||||
|
{
|
||||||
/* The following commands don't throw errors, but have no effect.
|
// Kludge for #141 and #523
|
||||||
oDoc.execCommand( 'AutoDetect', false, false ) ;
|
oDoc.body.disabled = true ;
|
||||||
oDoc.execCommand( 'KeepSelection', false, true ) ;
|
oDoc.body.contentEditable = true ;
|
||||||
*/
|
oDoc.body.removeAttribute( "disabled" ) ;
|
||||||
}
|
|
||||||
else
|
/* The following commands don't throw errors, but have no effect.
|
||||||
{
|
oDoc.execCommand( 'AutoDetect', false, false ) ;
|
||||||
try
|
oDoc.execCommand( 'KeepSelection', false, true ) ;
|
||||||
{
|
*/
|
||||||
// Disable Firefox 2 Spell Checker.
|
}
|
||||||
oDoc.body.spellcheck = ( this.FFSpellChecker !== false ) ;
|
else
|
||||||
|
{
|
||||||
if ( this._BodyHTML )
|
try
|
||||||
{
|
{
|
||||||
oDoc.body.innerHTML = this._BodyHTML ;
|
// Disable Firefox 2 Spell Checker.
|
||||||
this._BodyHTML = null ;
|
oDoc.body.spellcheck = ( this.FFSpellChecker !== false ) ;
|
||||||
}
|
|
||||||
|
if ( this._BodyHTML )
|
||||||
oDoc.designMode = 'on' ;
|
{
|
||||||
|
oDoc.body.innerHTML = this._BodyHTML ;
|
||||||
// Tell Gecko (Firefox 1.5+) to enable or not live resizing of objects (by Alfonso Martinez)
|
oDoc.body.offsetLeft ; // Don't remove, this is a hack to fix Opera 9.50, see #2264.
|
||||||
oDoc.execCommand( 'enableObjectResizing', false, !FCKConfig.DisableObjectResizing ) ;
|
this._BodyHTML = null ;
|
||||||
|
}
|
||||||
// Disable the standard table editing features of Firefox.
|
|
||||||
oDoc.execCommand( 'enableInlineTableEditing', false, !FCKConfig.DisableFFTableHandles ) ;
|
oDoc.designMode = 'on' ;
|
||||||
}
|
|
||||||
catch (e)
|
// Tell Gecko (Firefox 1.5+) to enable or not live resizing of objects (by Alfonso Martinez)
|
||||||
{
|
oDoc.execCommand( 'enableObjectResizing', false, !FCKConfig.DisableObjectResizing ) ;
|
||||||
// In Firefox if the iframe is initially hidden it can't be set to designMode and it raises an exception
|
|
||||||
// So we set up a DOM Mutation event Listener on the HTML, as it will raise several events when the document is visible again
|
// Disable the standard table editing features of Firefox.
|
||||||
FCKTools.AddEventListener( this.Window.frameElement, 'DOMAttrModified', FCKEditingArea_Document_AttributeNodeModified ) ;
|
oDoc.execCommand( 'enableInlineTableEditing', false, !FCKConfig.DisableFFTableHandles ) ;
|
||||||
}
|
}
|
||||||
|
catch (e)
|
||||||
}
|
{
|
||||||
}
|
// In Firefox if the iframe is initially hidden it can't be set to designMode and it raises an exception
|
||||||
|
// So we set up a DOM Mutation event Listener on the HTML, as it will raise several events when the document is visible again
|
||||||
// This function processes the notifications of the DOM Mutation event on the document
|
FCKTools.AddEventListener( this.Window.frameElement, 'DOMAttrModified', FCKEditingArea_Document_AttributeNodeModified ) ;
|
||||||
// We use it to know that the document will be ready to be editable again (or we hope so)
|
}
|
||||||
function FCKEditingArea_Document_AttributeNodeModified( evt )
|
|
||||||
{
|
}
|
||||||
var editingArea = evt.currentTarget.contentWindow._FCKEditingArea ;
|
}
|
||||||
|
|
||||||
// We want to run our function after the events no longer fire, so we can know that it's a stable situation
|
// This function processes the notifications of the DOM Mutation event on the document
|
||||||
if ( editingArea._timer )
|
// We use it to know that the document will be ready to be editable again (or we hope so)
|
||||||
window.clearTimeout( editingArea._timer ) ;
|
function FCKEditingArea_Document_AttributeNodeModified( evt )
|
||||||
|
{
|
||||||
editingArea._timer = FCKTools.SetTimeout( FCKEditingArea_MakeEditableByMutation, 1000, editingArea ) ;
|
var editingArea = evt.currentTarget.contentWindow._FCKEditingArea ;
|
||||||
}
|
|
||||||
|
// We want to run our function after the events no longer fire, so we can know that it's a stable situation
|
||||||
// This function ideally should be called after the document is visible, it does clean up of the
|
if ( editingArea._timer )
|
||||||
// mutation tracking and tries again to make the area editable.
|
window.clearTimeout( editingArea._timer ) ;
|
||||||
function FCKEditingArea_MakeEditableByMutation()
|
|
||||||
{
|
editingArea._timer = FCKTools.SetTimeout( FCKEditingArea_MakeEditableByMutation, 1000, editingArea ) ;
|
||||||
// Clean up
|
}
|
||||||
delete this._timer ;
|
|
||||||
// Now we don't want to keep on getting this event
|
// This function ideally should be called after the document is visible, it does clean up of the
|
||||||
FCKTools.RemoveEventListener( this.Window.frameElement, 'DOMAttrModified', FCKEditingArea_Document_AttributeNodeModified ) ;
|
// mutation tracking and tries again to make the area editable.
|
||||||
// Let's try now to set the editing area editable
|
function FCKEditingArea_MakeEditableByMutation()
|
||||||
// If it fails it will set up the Mutation Listener again automatically
|
{
|
||||||
this.MakeEditable() ;
|
// Clean up
|
||||||
}
|
delete this._timer ;
|
||||||
|
// Now we don't want to keep on getting this event
|
||||||
FCKEditingArea.prototype.Focus = function()
|
FCKTools.RemoveEventListener( this.Window.frameElement, 'DOMAttrModified', FCKEditingArea_Document_AttributeNodeModified ) ;
|
||||||
{
|
// Let's try now to set the editing area editable
|
||||||
try
|
// If it fails it will set up the Mutation Listener again automatically
|
||||||
{
|
this.MakeEditable() ;
|
||||||
if ( this.Mode == FCK_EDITMODE_WYSIWYG )
|
}
|
||||||
{
|
|
||||||
if ( FCKBrowserInfo.IsIE )
|
FCKEditingArea.prototype.Focus = function()
|
||||||
this._FocusIE() ;
|
{
|
||||||
else
|
try
|
||||||
this.Window.focus() ;
|
{
|
||||||
}
|
if ( this.Mode == FCK_EDITMODE_WYSIWYG )
|
||||||
else
|
{
|
||||||
{
|
if ( FCKBrowserInfo.IsIE )
|
||||||
var oDoc = FCKTools.GetElementDocument( this.Textarea ) ;
|
this._FocusIE() ;
|
||||||
if ( (!oDoc.hasFocus || oDoc.hasFocus() ) && oDoc.activeElement == this.Textarea )
|
else
|
||||||
return ;
|
this.Window.focus() ;
|
||||||
|
}
|
||||||
this.Textarea.focus() ;
|
else
|
||||||
}
|
{
|
||||||
}
|
var oDoc = FCKTools.GetElementDocument( this.Textarea ) ;
|
||||||
catch(e) {}
|
if ( (!oDoc.hasFocus || oDoc.hasFocus() ) && oDoc.activeElement == this.Textarea )
|
||||||
}
|
return ;
|
||||||
|
|
||||||
FCKEditingArea.prototype._FocusIE = function()
|
this.Textarea.focus() ;
|
||||||
{
|
}
|
||||||
// In IE it can happen that the document is in theory focused but the
|
}
|
||||||
// active element is outside of it.
|
catch(e) {}
|
||||||
this.Document.body.setActive() ;
|
}
|
||||||
|
|
||||||
this.Window.focus() ;
|
FCKEditingArea.prototype._FocusIE = function()
|
||||||
|
{
|
||||||
// Kludge for #141... yet more code to workaround IE bugs
|
// In IE it can happen that the document is in theory focused but the
|
||||||
var range = this.Document.selection.createRange() ;
|
// active element is outside of it.
|
||||||
|
this.Document.body.setActive() ;
|
||||||
var parentNode = range.parentElement() ;
|
|
||||||
var parentTag = parentNode.nodeName.toLowerCase() ;
|
this.Window.focus() ;
|
||||||
|
|
||||||
// Only apply the fix when in a block, and the block is empty.
|
// Kludge for #141... yet more code to workaround IE bugs
|
||||||
if ( parentNode.childNodes.length > 0 ||
|
var range = this.Document.selection.createRange() ;
|
||||||
!( FCKListsLib.BlockElements[parentTag] ||
|
|
||||||
FCKListsLib.NonEmptyBlockElements[parentTag] ) )
|
var parentNode = range.parentElement() ;
|
||||||
{
|
var parentTag = parentNode.nodeName.toLowerCase() ;
|
||||||
return ;
|
|
||||||
}
|
// Only apply the fix when in a block, and the block is empty.
|
||||||
|
if ( parentNode.childNodes.length > 0 ||
|
||||||
// Force the selection to happen, in this way we guarantee the focus will
|
!( FCKListsLib.BlockElements[parentTag] ||
|
||||||
// be there.
|
FCKListsLib.NonEmptyBlockElements[parentTag] ) )
|
||||||
range = new FCKDomRange( this.Window ) ;
|
{
|
||||||
range.MoveToElementEditStart( parentNode ) ;
|
return ;
|
||||||
range.Select() ;
|
}
|
||||||
}
|
|
||||||
|
// Force the selection to happen, in this way we guarantee the focus will
|
||||||
function FCKEditingArea_Cleanup()
|
// be there.
|
||||||
{
|
range = new FCKDomRange( this.Window ) ;
|
||||||
if ( this.Document )
|
range.MoveToElementEditStart( parentNode ) ;
|
||||||
this.Document.body.innerHTML = "" ;
|
range.Select() ;
|
||||||
this.TargetElement = null ;
|
}
|
||||||
this.IFrame = null ;
|
|
||||||
this.Document = null ;
|
function FCKEditingArea_Cleanup()
|
||||||
this.Textarea = null ;
|
{
|
||||||
|
if ( this.Document )
|
||||||
if ( this.Window )
|
this.Document.body.innerHTML = "" ;
|
||||||
{
|
this.TargetElement = null ;
|
||||||
this.Window._FCKEditingArea = null ;
|
this.IFrame = null ;
|
||||||
this.Window = null ;
|
this.Document = null ;
|
||||||
}
|
this.Textarea = null ;
|
||||||
}
|
|
||||||
|
if ( this.Window )
|
||||||
|
{
|
||||||
|
this.Window._FCKEditingArea = null ;
|
||||||
|
this.Window = null ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,89 +1,89 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Manages the DOM ascensors element list of a specific DOM node
|
* Manages the DOM ascensors element list of a specific DOM node
|
||||||
* (limited to body, inclusive).
|
* (limited to body, inclusive).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKElementPath = function( lastNode )
|
var FCKElementPath = function( lastNode )
|
||||||
{
|
{
|
||||||
var eBlock = null ;
|
var eBlock = null ;
|
||||||
var eBlockLimit = null ;
|
var eBlockLimit = null ;
|
||||||
|
|
||||||
var aElements = new Array() ;
|
var aElements = new Array() ;
|
||||||
|
|
||||||
var e = lastNode ;
|
var e = lastNode ;
|
||||||
while ( e )
|
while ( e )
|
||||||
{
|
{
|
||||||
if ( e.nodeType == 1 )
|
if ( e.nodeType == 1 )
|
||||||
{
|
{
|
||||||
if ( !this.LastElement )
|
if ( !this.LastElement )
|
||||||
this.LastElement = e ;
|
this.LastElement = e ;
|
||||||
|
|
||||||
var sElementName = e.nodeName.toLowerCase() ;
|
var sElementName = e.nodeName.toLowerCase() ;
|
||||||
if ( FCKBrowserInfo.IsIE && e.scopeName != 'HTML' )
|
if ( FCKBrowserInfo.IsIE && e.scopeName != 'HTML' )
|
||||||
sElementName = e.scopeName.toLowerCase() + ':' + sElementName ;
|
sElementName = e.scopeName.toLowerCase() + ':' + sElementName ;
|
||||||
|
|
||||||
if ( !eBlockLimit )
|
if ( !eBlockLimit )
|
||||||
{
|
{
|
||||||
if ( !eBlock && FCKListsLib.PathBlockElements[ sElementName ] != null )
|
if ( !eBlock && FCKListsLib.PathBlockElements[ sElementName ] != null )
|
||||||
eBlock = e ;
|
eBlock = e ;
|
||||||
|
|
||||||
if ( FCKListsLib.PathBlockLimitElements[ sElementName ] != null )
|
if ( FCKListsLib.PathBlockLimitElements[ sElementName ] != null )
|
||||||
{
|
{
|
||||||
// DIV is considered the Block, if no block is available (#525)
|
// DIV is considered the Block, if no block is available (#525)
|
||||||
// and if it doesn't contain other blocks.
|
// and if it doesn't contain other blocks.
|
||||||
if ( !eBlock && sElementName == 'div' && !FCKElementPath._CheckHasBlock( e ) )
|
if ( !eBlock && sElementName == 'div' && !FCKElementPath._CheckHasBlock( e ) )
|
||||||
eBlock = e ;
|
eBlock = e ;
|
||||||
else
|
else
|
||||||
eBlockLimit = e ;
|
eBlockLimit = e ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
aElements.push( e ) ;
|
aElements.push( e ) ;
|
||||||
|
|
||||||
if ( sElementName == 'body' )
|
if ( sElementName == 'body' )
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
e = e.parentNode ;
|
e = e.parentNode ;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.Block = eBlock ;
|
this.Block = eBlock ;
|
||||||
this.BlockLimit = eBlockLimit ;
|
this.BlockLimit = eBlockLimit ;
|
||||||
this.Elements = aElements ;
|
this.Elements = aElements ;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if an element contains any block element.
|
* Check if an element contains any block element.
|
||||||
*/
|
*/
|
||||||
FCKElementPath._CheckHasBlock = function( element )
|
FCKElementPath._CheckHasBlock = function( element )
|
||||||
{
|
{
|
||||||
var childNodes = element.childNodes ;
|
var childNodes = element.childNodes ;
|
||||||
|
|
||||||
for ( var i = 0, count = childNodes.length ; i < count ; i++ )
|
for ( var i = 0, count = childNodes.length ; i < count ; i++ )
|
||||||
{
|
{
|
||||||
var child = childNodes[i] ;
|
var child = childNodes[i] ;
|
||||||
|
|
||||||
if ( child.nodeType == 1 && FCKListsLib.BlockElements[ child.nodeName.toLowerCase() ] )
|
if ( child.nodeType == 1 && FCKListsLib.BlockElements[ child.nodeName.toLowerCase() ] )
|
||||||
return true ;
|
return true ;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false ;
|
return false ;
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,71 +1,71 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKEvents Class: used to handle events is a advanced way.
|
* FCKEvents Class: used to handle events is a advanced way.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKEvents = function( eventsOwner )
|
var FCKEvents = function( eventsOwner )
|
||||||
{
|
{
|
||||||
this.Owner = eventsOwner ;
|
this.Owner = eventsOwner ;
|
||||||
this._RegisteredEvents = new Object() ;
|
this._RegisteredEvents = new Object() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKEvents.prototype.AttachEvent = function( eventName, functionPointer )
|
FCKEvents.prototype.AttachEvent = function( eventName, functionPointer )
|
||||||
{
|
{
|
||||||
var aTargets ;
|
var aTargets ;
|
||||||
|
|
||||||
if ( !( aTargets = this._RegisteredEvents[ eventName ] ) )
|
if ( !( aTargets = this._RegisteredEvents[ eventName ] ) )
|
||||||
this._RegisteredEvents[ eventName ] = [ functionPointer ] ;
|
this._RegisteredEvents[ eventName ] = [ functionPointer ] ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Check that the event handler isn't already registered with the same listener
|
// Check that the event handler isn't already registered with the same listener
|
||||||
// It doesn't detect function pointers belonging to an object (at least in Gecko)
|
// It doesn't detect function pointers belonging to an object (at least in Gecko)
|
||||||
if ( aTargets.IndexOf( functionPointer ) == -1 )
|
if ( aTargets.IndexOf( functionPointer ) == -1 )
|
||||||
aTargets.push( functionPointer ) ;
|
aTargets.push( functionPointer ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKEvents.prototype.FireEvent = function( eventName, params )
|
FCKEvents.prototype.FireEvent = function( eventName, params )
|
||||||
{
|
{
|
||||||
var bReturnValue = true ;
|
var bReturnValue = true ;
|
||||||
|
|
||||||
var oCalls = this._RegisteredEvents[ eventName ] ;
|
var oCalls = this._RegisteredEvents[ eventName ] ;
|
||||||
|
|
||||||
if ( oCalls )
|
if ( oCalls )
|
||||||
{
|
{
|
||||||
for ( var i = 0 ; i < oCalls.length ; i++ )
|
for ( var i = 0 ; i < oCalls.length ; i++ )
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
bReturnValue = ( oCalls[ i ]( this.Owner, params ) && bReturnValue ) ;
|
bReturnValue = ( oCalls[ i ]( this.Owner, params ) && bReturnValue ) ;
|
||||||
}
|
}
|
||||||
catch(e)
|
catch(e)
|
||||||
{
|
{
|
||||||
// Ignore the following error. It may happen if pointing to a
|
// Ignore the following error. It may happen if pointing to a
|
||||||
// script not anymore available (#934):
|
// script not anymore available (#934):
|
||||||
// -2146823277 = Can't execute code from a freed script
|
// -2146823277 = Can't execute code from a freed script
|
||||||
if ( e.number != -2146823277 )
|
if ( e.number != -2146823277 )
|
||||||
throw e ;
|
throw e ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return bReturnValue ;
|
return bReturnValue ;
|
||||||
}
|
}
|
||||||
|
@ -1,103 +1,103 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKIcon Class: renders an icon from a single image, a strip or even a
|
* FCKIcon Class: renders an icon from a single image, a strip or even a
|
||||||
* spacer.
|
* spacer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKIcon = function( iconPathOrStripInfoArray )
|
var FCKIcon = function( iconPathOrStripInfoArray )
|
||||||
{
|
{
|
||||||
var sTypeOf = iconPathOrStripInfoArray ? typeof( iconPathOrStripInfoArray ) : 'undefined' ;
|
var sTypeOf = iconPathOrStripInfoArray ? typeof( iconPathOrStripInfoArray ) : 'undefined' ;
|
||||||
switch ( sTypeOf )
|
switch ( sTypeOf )
|
||||||
{
|
{
|
||||||
case 'number' :
|
case 'number' :
|
||||||
this.Path = FCKConfig.SkinPath + 'fck_strip.gif' ;
|
this.Path = FCKConfig.SkinPath + 'fck_strip.gif' ;
|
||||||
this.Size = 16 ;
|
this.Size = 16 ;
|
||||||
this.Position = iconPathOrStripInfoArray ;
|
this.Position = iconPathOrStripInfoArray ;
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
case 'undefined' :
|
case 'undefined' :
|
||||||
this.Path = FCK_SPACER_PATH ;
|
this.Path = FCK_SPACER_PATH ;
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
case 'string' :
|
case 'string' :
|
||||||
this.Path = iconPathOrStripInfoArray ;
|
this.Path = iconPathOrStripInfoArray ;
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
default :
|
default :
|
||||||
// It is an array in the format [ StripFilePath, IconSize, IconPosition ]
|
// It is an array in the format [ StripFilePath, IconSize, IconPosition ]
|
||||||
this.Path = iconPathOrStripInfoArray[0] ;
|
this.Path = iconPathOrStripInfoArray[0] ;
|
||||||
this.Size = iconPathOrStripInfoArray[1] ;
|
this.Size = iconPathOrStripInfoArray[1] ;
|
||||||
this.Position = iconPathOrStripInfoArray[2] ;
|
this.Position = iconPathOrStripInfoArray[2] ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKIcon.prototype.CreateIconElement = function( document )
|
FCKIcon.prototype.CreateIconElement = function( document )
|
||||||
{
|
{
|
||||||
var eIcon, eIconImage ;
|
var eIcon, eIconImage ;
|
||||||
|
|
||||||
if ( this.Position ) // It is using an icons strip image.
|
if ( this.Position ) // It is using an icons strip image.
|
||||||
{
|
{
|
||||||
var sPos = '-' + ( ( this.Position - 1 ) * this.Size ) + 'px' ;
|
var sPos = '-' + ( ( this.Position - 1 ) * this.Size ) + 'px' ;
|
||||||
|
|
||||||
if ( FCKBrowserInfo.IsIE )
|
if ( FCKBrowserInfo.IsIE )
|
||||||
{
|
{
|
||||||
// <div class="TB_Button_Image"><img src="strip.gif" style="top:-16px"></div>
|
// <div class="TB_Button_Image"><img src="strip.gif" style="top:-16px"></div>
|
||||||
|
|
||||||
eIcon = document.createElement( 'DIV' ) ;
|
eIcon = document.createElement( 'DIV' ) ;
|
||||||
|
|
||||||
eIconImage = eIcon.appendChild( document.createElement( 'IMG' ) ) ;
|
eIconImage = eIcon.appendChild( document.createElement( 'IMG' ) ) ;
|
||||||
eIconImage.src = this.Path ;
|
eIconImage.src = this.Path ;
|
||||||
eIconImage.style.top = sPos ;
|
eIconImage.style.top = sPos ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// <img class="TB_Button_Image" src="spacer.gif" style="background-position: 0px -16px;background-image: url(strip.gif);">
|
// <img class="TB_Button_Image" src="spacer.gif" style="background-position: 0px -16px;background-image: url(strip.gif);">
|
||||||
|
|
||||||
eIcon = document.createElement( 'IMG' ) ;
|
eIcon = document.createElement( 'IMG' ) ;
|
||||||
eIcon.src = FCK_SPACER_PATH ;
|
eIcon.src = FCK_SPACER_PATH ;
|
||||||
eIcon.style.backgroundPosition = '0px ' + sPos ;
|
eIcon.style.backgroundPosition = '0px ' + sPos ;
|
||||||
eIcon.style.backgroundImage = 'url("' + this.Path + '")' ;
|
eIcon.style.backgroundImage = 'url("' + this.Path + '")' ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // It is using a single icon image.
|
else // It is using a single icon image.
|
||||||
{
|
{
|
||||||
if ( FCKBrowserInfo.IsIE )
|
if ( FCKBrowserInfo.IsIE )
|
||||||
{
|
{
|
||||||
// IE makes the button 1px higher if using the <img> directly, so we
|
// IE makes the button 1px higher if using the <img> directly, so we
|
||||||
// are changing to the <div> system to clip the image correctly.
|
// are changing to the <div> system to clip the image correctly.
|
||||||
eIcon = document.createElement( 'DIV' ) ;
|
eIcon = document.createElement( 'DIV' ) ;
|
||||||
|
|
||||||
eIconImage = eIcon.appendChild( document.createElement( 'IMG' ) ) ;
|
eIconImage = eIcon.appendChild( document.createElement( 'IMG' ) ) ;
|
||||||
eIconImage.src = this.Path ? this.Path : FCK_SPACER_PATH ;
|
eIconImage.src = this.Path ? this.Path : FCK_SPACER_PATH ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// This is not working well with IE. See notes above.
|
// This is not working well with IE. See notes above.
|
||||||
// <img class="TB_Button_Image" src="smiley.gif">
|
// <img class="TB_Button_Image" src="smiley.gif">
|
||||||
eIcon = document.createElement( 'IMG' ) ;
|
eIcon = document.createElement( 'IMG' ) ;
|
||||||
eIcon.src = this.Path ? this.Path : FCK_SPACER_PATH ;
|
eIcon.src = this.Path ? this.Path : FCK_SPACER_PATH ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
eIcon.className = 'TB_Button_Image' ;
|
eIcon.className = 'TB_Button_Image' ;
|
||||||
|
|
||||||
return eIcon ;
|
return eIcon ;
|
||||||
}
|
}
|
||||||
|
@ -1,68 +1,68 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKIECleanup Class: a generic class used as a tool to remove IE leaks.
|
* FCKIECleanup Class: a generic class used as a tool to remove IE leaks.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKIECleanup = function( attachWindow )
|
var FCKIECleanup = function( attachWindow )
|
||||||
{
|
{
|
||||||
// If the attachWindow already have a cleanup object, just use that one.
|
// If the attachWindow already have a cleanup object, just use that one.
|
||||||
if ( attachWindow._FCKCleanupObj )
|
if ( attachWindow._FCKCleanupObj )
|
||||||
this.Items = attachWindow._FCKCleanupObj.Items ;
|
this.Items = attachWindow._FCKCleanupObj.Items ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.Items = new Array() ;
|
this.Items = new Array() ;
|
||||||
|
|
||||||
attachWindow._FCKCleanupObj = this ;
|
attachWindow._FCKCleanupObj = this ;
|
||||||
FCKTools.AddEventListenerEx( attachWindow, 'unload', FCKIECleanup_Cleanup ) ;
|
FCKTools.AddEventListenerEx( attachWindow, 'unload', FCKIECleanup_Cleanup ) ;
|
||||||
// attachWindow.attachEvent( 'onunload', FCKIECleanup_Cleanup ) ;
|
// attachWindow.attachEvent( 'onunload', FCKIECleanup_Cleanup ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKIECleanup.prototype.AddItem = function( dirtyItem, cleanupFunction )
|
FCKIECleanup.prototype.AddItem = function( dirtyItem, cleanupFunction )
|
||||||
{
|
{
|
||||||
this.Items.push( [ dirtyItem, cleanupFunction ] ) ;
|
this.Items.push( [ dirtyItem, cleanupFunction ] ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKIECleanup_Cleanup()
|
function FCKIECleanup_Cleanup()
|
||||||
{
|
{
|
||||||
if ( !this._FCKCleanupObj || !window.FCKUnloadFlag )
|
if ( !this._FCKCleanupObj || ( FCKConfig.MsWebBrowserControlCompat && !window.FCKUnloadFlag ) )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
var aItems = this._FCKCleanupObj.Items ;
|
var aItems = this._FCKCleanupObj.Items ;
|
||||||
|
|
||||||
while ( aItems.length > 0 )
|
while ( aItems.length > 0 )
|
||||||
{
|
{
|
||||||
|
|
||||||
// It is important to remove from the end to the beginning (pop()),
|
// It is important to remove from the end to the beginning (pop()),
|
||||||
// because of the order things get created in the editor. In the code,
|
// because of the order things get created in the editor. In the code,
|
||||||
// elements in deeper position in the DOM are placed at the end of the
|
// elements in deeper position in the DOM are placed at the end of the
|
||||||
// cleanup function, so we must cleanup then first, otherwise IE could
|
// cleanup function, so we must cleanup then first, otherwise IE could
|
||||||
// throw some crazy memory errors (IE bug).
|
// throw some crazy memory errors (IE bug).
|
||||||
var oItem = aItems.pop() ;
|
var oItem = aItems.pop() ;
|
||||||
if ( oItem )
|
if ( oItem )
|
||||||
oItem[1].call( oItem[0] ) ;
|
oItem[1].call( oItem[0] ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._FCKCleanupObj = null ;
|
this._FCKCleanupObj = null ;
|
||||||
|
|
||||||
if ( CollectGarbage )
|
if ( CollectGarbage )
|
||||||
CollectGarbage() ;
|
CollectGarbage() ;
|
||||||
}
|
}
|
||||||
|
@ -1,64 +1,64 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Preload a list of images, firing an event when complete.
|
* Preload a list of images, firing an event when complete.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKImagePreloader = function()
|
var FCKImagePreloader = function()
|
||||||
{
|
{
|
||||||
this._Images = new Array() ;
|
this._Images = new Array() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKImagePreloader.prototype =
|
FCKImagePreloader.prototype =
|
||||||
{
|
{
|
||||||
AddImages : function( images )
|
AddImages : function( images )
|
||||||
{
|
{
|
||||||
if ( typeof( images ) == 'string' )
|
if ( typeof( images ) == 'string' )
|
||||||
images = images.split( ';' ) ;
|
images = images.split( ';' ) ;
|
||||||
|
|
||||||
this._Images = this._Images.concat( images ) ;
|
this._Images = this._Images.concat( images ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
Start : function()
|
Start : function()
|
||||||
{
|
{
|
||||||
var aImages = this._Images ;
|
var aImages = this._Images ;
|
||||||
this._PreloadCount = aImages.length ;
|
this._PreloadCount = aImages.length ;
|
||||||
|
|
||||||
for ( var i = 0 ; i < aImages.length ; i++ )
|
for ( var i = 0 ; i < aImages.length ; i++ )
|
||||||
{
|
{
|
||||||
var eImg = document.createElement( 'img' ) ;
|
var eImg = document.createElement( 'img' ) ;
|
||||||
FCKTools.AddEventListenerEx( eImg, 'load', _FCKImagePreloader_OnImage, this ) ;
|
FCKTools.AddEventListenerEx( eImg, 'load', _FCKImagePreloader_OnImage, this ) ;
|
||||||
FCKTools.AddEventListenerEx( eImg, 'error', _FCKImagePreloader_OnImage, this ) ;
|
FCKTools.AddEventListenerEx( eImg, 'error', _FCKImagePreloader_OnImage, this ) ;
|
||||||
eImg.src = aImages[i] ;
|
eImg.src = aImages[i] ;
|
||||||
|
|
||||||
_FCKImagePreloader_ImageCache.push( eImg ) ;
|
_FCKImagePreloader_ImageCache.push( eImg ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// All preloaded images must be placed in a global array, otherwise the preload
|
// All preloaded images must be placed in a global array, otherwise the preload
|
||||||
// magic will not happen.
|
// magic will not happen.
|
||||||
var _FCKImagePreloader_ImageCache = new Array() ;
|
var _FCKImagePreloader_ImageCache = new Array() ;
|
||||||
|
|
||||||
function _FCKImagePreloader_OnImage( ev, imagePreloader )
|
function _FCKImagePreloader_OnImage( ev, imagePreloader )
|
||||||
{
|
{
|
||||||
if ( (--imagePreloader._PreloadCount) == 0 && imagePreloader.OnComplete )
|
if ( (--imagePreloader._PreloadCount) == 0 && imagePreloader.OnComplete )
|
||||||
imagePreloader.OnComplete() ;
|
imagePreloader.OnComplete() ;
|
||||||
}
|
}
|
||||||
|
@ -1,141 +1,141 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Control keyboard keystroke combinations.
|
* Control keyboard keystroke combinations.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKKeystrokeHandler = function( cancelCtrlDefaults )
|
var FCKKeystrokeHandler = function( cancelCtrlDefaults )
|
||||||
{
|
{
|
||||||
this.Keystrokes = new Object() ;
|
this.Keystrokes = new Object() ;
|
||||||
this.CancelCtrlDefaults = ( cancelCtrlDefaults !== false ) ;
|
this.CancelCtrlDefaults = ( cancelCtrlDefaults !== false ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Listen to keystroke events in an element or DOM document object.
|
* Listen to keystroke events in an element or DOM document object.
|
||||||
* @target: The element or document to listen to keystroke events.
|
* @target: The element or document to listen to keystroke events.
|
||||||
*/
|
*/
|
||||||
FCKKeystrokeHandler.prototype.AttachToElement = function( target )
|
FCKKeystrokeHandler.prototype.AttachToElement = function( target )
|
||||||
{
|
{
|
||||||
// For newer browsers, it is enough to listen to the keydown event only.
|
// For newer browsers, it is enough to listen to the keydown event only.
|
||||||
// Some browsers instead, don't cancel key events in the keydown, but in the
|
// Some browsers instead, don't cancel key events in the keydown, but in the
|
||||||
// keypress. So we must do a longer trip in those cases.
|
// keypress. So we must do a longer trip in those cases.
|
||||||
FCKTools.AddEventListenerEx( target, 'keydown', _FCKKeystrokeHandler_OnKeyDown, this ) ;
|
FCKTools.AddEventListenerEx( target, 'keydown', _FCKKeystrokeHandler_OnKeyDown, this ) ;
|
||||||
if ( FCKBrowserInfo.IsGecko10 || FCKBrowserInfo.IsOpera || ( FCKBrowserInfo.IsGecko && FCKBrowserInfo.IsMac ) )
|
if ( FCKBrowserInfo.IsGecko10 || FCKBrowserInfo.IsOpera || ( FCKBrowserInfo.IsGecko && FCKBrowserInfo.IsMac ) )
|
||||||
FCKTools.AddEventListenerEx( target, 'keypress', _FCKKeystrokeHandler_OnKeyPress, this ) ;
|
FCKTools.AddEventListenerEx( target, 'keypress', _FCKKeystrokeHandler_OnKeyPress, this ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sets a list of keystrokes. It can receive either a single array or "n"
|
* Sets a list of keystrokes. It can receive either a single array or "n"
|
||||||
* arguments, each one being an array of 1 or 2 elemenst. The first element
|
* arguments, each one being an array of 1 or 2 elemenst. The first element
|
||||||
* is the keystroke combination, and the second is the value to assign to it.
|
* is the keystroke combination, and the second is the value to assign to it.
|
||||||
* If the second element is missing, the keystroke definition is removed.
|
* If the second element is missing, the keystroke definition is removed.
|
||||||
*/
|
*/
|
||||||
FCKKeystrokeHandler.prototype.SetKeystrokes = function()
|
FCKKeystrokeHandler.prototype.SetKeystrokes = function()
|
||||||
{
|
{
|
||||||
// Look through the arguments.
|
// Look through the arguments.
|
||||||
for ( var i = 0 ; i < arguments.length ; i++ )
|
for ( var i = 0 ; i < arguments.length ; i++ )
|
||||||
{
|
{
|
||||||
var keyDef = arguments[i] ;
|
var keyDef = arguments[i] ;
|
||||||
|
|
||||||
// If the configuration for the keystrokes is missing some element or has any extra comma
|
// If the configuration for the keystrokes is missing some element or has any extra comma
|
||||||
// this item won't be valid, so skip it and keep on processing.
|
// this item won't be valid, so skip it and keep on processing.
|
||||||
if ( !keyDef )
|
if ( !keyDef )
|
||||||
continue ;
|
continue ;
|
||||||
|
|
||||||
if ( typeof( keyDef[0] ) == 'object' ) // It is an array with arrays defining the keystrokes.
|
if ( typeof( keyDef[0] ) == 'object' ) // It is an array with arrays defining the keystrokes.
|
||||||
this.SetKeystrokes.apply( this, keyDef ) ;
|
this.SetKeystrokes.apply( this, keyDef ) ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ( keyDef.length == 1 ) // If it has only one element, remove the keystroke.
|
if ( keyDef.length == 1 ) // If it has only one element, remove the keystroke.
|
||||||
delete this.Keystrokes[ keyDef[0] ] ;
|
delete this.Keystrokes[ keyDef[0] ] ;
|
||||||
else // Otherwise add it.
|
else // Otherwise add it.
|
||||||
this.Keystrokes[ keyDef[0] ] = keyDef[1] === true ? true : keyDef ;
|
this.Keystrokes[ keyDef[0] ] = keyDef[1] === true ? true : keyDef ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function _FCKKeystrokeHandler_OnKeyDown( ev, keystrokeHandler )
|
function _FCKKeystrokeHandler_OnKeyDown( ev, keystrokeHandler )
|
||||||
{
|
{
|
||||||
// Get the key code.
|
// Get the key code.
|
||||||
var keystroke = ev.keyCode || ev.which ;
|
var keystroke = ev.keyCode || ev.which ;
|
||||||
|
|
||||||
// Combine it with the CTRL, SHIFT and ALT states.
|
// Combine it with the CTRL, SHIFT and ALT states.
|
||||||
var keyModifiers = 0 ;
|
var keyModifiers = 0 ;
|
||||||
|
|
||||||
if ( ev.ctrlKey || ev.metaKey )
|
if ( ev.ctrlKey || ev.metaKey )
|
||||||
keyModifiers += CTRL ;
|
keyModifiers += CTRL ;
|
||||||
|
|
||||||
if ( ev.shiftKey )
|
if ( ev.shiftKey )
|
||||||
keyModifiers += SHIFT ;
|
keyModifiers += SHIFT ;
|
||||||
|
|
||||||
if ( ev.altKey )
|
if ( ev.altKey )
|
||||||
keyModifiers += ALT ;
|
keyModifiers += ALT ;
|
||||||
|
|
||||||
var keyCombination = keystroke + keyModifiers ;
|
var keyCombination = keystroke + keyModifiers ;
|
||||||
|
|
||||||
var cancelIt = keystrokeHandler._CancelIt = false ;
|
var cancelIt = keystrokeHandler._CancelIt = false ;
|
||||||
|
|
||||||
// Look for its definition availability.
|
// Look for its definition availability.
|
||||||
var keystrokeValue = keystrokeHandler.Keystrokes[ keyCombination ] ;
|
var keystrokeValue = keystrokeHandler.Keystrokes[ keyCombination ] ;
|
||||||
|
|
||||||
// FCKDebug.Output( 'KeyDown: ' + keyCombination + ' - Value: ' + keystrokeValue ) ;
|
// FCKDebug.Output( 'KeyDown: ' + keyCombination + ' - Value: ' + keystrokeValue ) ;
|
||||||
|
|
||||||
// If the keystroke is defined
|
// If the keystroke is defined
|
||||||
if ( keystrokeValue )
|
if ( keystrokeValue )
|
||||||
{
|
{
|
||||||
// If the keystroke has been explicitly set to "true" OR calling the
|
// If the keystroke has been explicitly set to "true" OR calling the
|
||||||
// "OnKeystroke" event, it doesn't return "true", the default behavior
|
// "OnKeystroke" event, it doesn't return "true", the default behavior
|
||||||
// must be preserved.
|
// must be preserved.
|
||||||
if ( keystrokeValue === true || !( keystrokeHandler.OnKeystroke && keystrokeHandler.OnKeystroke.apply( keystrokeHandler, keystrokeValue ) ) )
|
if ( keystrokeValue === true || !( keystrokeHandler.OnKeystroke && keystrokeHandler.OnKeystroke.apply( keystrokeHandler, keystrokeValue ) ) )
|
||||||
return true ;
|
return true ;
|
||||||
|
|
||||||
cancelIt = true ;
|
cancelIt = true ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// By default, it will cancel all combinations with the CTRL key only (except positioning keys).
|
// By default, it will cancel all combinations with the CTRL key only (except positioning keys).
|
||||||
if ( cancelIt || ( keystrokeHandler.CancelCtrlDefaults && keyModifiers == CTRL && ( keystroke < 33 || keystroke > 40 ) ) )
|
if ( cancelIt || ( keystrokeHandler.CancelCtrlDefaults && keyModifiers == CTRL && ( keystroke < 33 || keystroke > 40 ) ) )
|
||||||
{
|
{
|
||||||
keystrokeHandler._CancelIt = true ;
|
keystrokeHandler._CancelIt = true ;
|
||||||
|
|
||||||
if ( ev.preventDefault )
|
if ( ev.preventDefault )
|
||||||
return ev.preventDefault() ;
|
return ev.preventDefault() ;
|
||||||
|
|
||||||
ev.returnValue = false ;
|
ev.returnValue = false ;
|
||||||
ev.cancelBubble = true ;
|
ev.cancelBubble = true ;
|
||||||
return false ;
|
return false ;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true ;
|
return true ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function _FCKKeystrokeHandler_OnKeyPress( ev, keystrokeHandler )
|
function _FCKKeystrokeHandler_OnKeyPress( ev, keystrokeHandler )
|
||||||
{
|
{
|
||||||
if ( keystrokeHandler._CancelIt )
|
if ( keystrokeHandler._CancelIt )
|
||||||
{
|
{
|
||||||
// FCKDebug.Output( 'KeyPress Cancel', 'Red') ;
|
// FCKDebug.Output( 'KeyPress Cancel', 'Red') ;
|
||||||
|
|
||||||
if ( ev.preventDefault )
|
if ( ev.preventDefault )
|
||||||
return ev.preventDefault() ;
|
return ev.preventDefault() ;
|
||||||
|
|
||||||
return false ;
|
return false ;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true ;
|
return true ;
|
||||||
}
|
}
|
||||||
|
@ -1,153 +1,153 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Renders a list of menu items.
|
* Renders a list of menu items.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKMenuBlock = function()
|
var FCKMenuBlock = function()
|
||||||
{
|
{
|
||||||
this._Items = new Array() ;
|
this._Items = new Array() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
FCKMenuBlock.prototype.Count = function()
|
FCKMenuBlock.prototype.Count = function()
|
||||||
{
|
{
|
||||||
return this._Items.length ;
|
return this._Items.length ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKMenuBlock.prototype.AddItem = function( name, label, iconPathOrStripInfoArrayOrIndex, isDisabled, customData )
|
FCKMenuBlock.prototype.AddItem = function( name, label, iconPathOrStripInfoArrayOrIndex, isDisabled, customData )
|
||||||
{
|
{
|
||||||
var oItem = new FCKMenuItem( this, name, label, iconPathOrStripInfoArrayOrIndex, isDisabled, customData ) ;
|
var oItem = new FCKMenuItem( this, name, label, iconPathOrStripInfoArrayOrIndex, isDisabled, customData ) ;
|
||||||
|
|
||||||
oItem.OnClick = FCKTools.CreateEventListener( FCKMenuBlock_Item_OnClick, this ) ;
|
oItem.OnClick = FCKTools.CreateEventListener( FCKMenuBlock_Item_OnClick, this ) ;
|
||||||
oItem.OnActivate = FCKTools.CreateEventListener( FCKMenuBlock_Item_OnActivate, this ) ;
|
oItem.OnActivate = FCKTools.CreateEventListener( FCKMenuBlock_Item_OnActivate, this ) ;
|
||||||
|
|
||||||
this._Items.push( oItem ) ;
|
this._Items.push( oItem ) ;
|
||||||
|
|
||||||
return oItem ;
|
return oItem ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKMenuBlock.prototype.AddSeparator = function()
|
FCKMenuBlock.prototype.AddSeparator = function()
|
||||||
{
|
{
|
||||||
this._Items.push( new FCKMenuSeparator() ) ;
|
this._Items.push( new FCKMenuSeparator() ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKMenuBlock.prototype.RemoveAllItems = function()
|
FCKMenuBlock.prototype.RemoveAllItems = function()
|
||||||
{
|
{
|
||||||
this._Items = new Array() ;
|
this._Items = new Array() ;
|
||||||
|
|
||||||
var eItemsTable = this._ItemsTable ;
|
var eItemsTable = this._ItemsTable ;
|
||||||
if ( eItemsTable )
|
if ( eItemsTable )
|
||||||
{
|
{
|
||||||
while ( eItemsTable.rows.length > 0 )
|
while ( eItemsTable.rows.length > 0 )
|
||||||
eItemsTable.deleteRow( 0 ) ;
|
eItemsTable.deleteRow( 0 ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKMenuBlock.prototype.Create = function( parentElement )
|
FCKMenuBlock.prototype.Create = function( parentElement )
|
||||||
{
|
{
|
||||||
if ( !this._ItemsTable )
|
if ( !this._ItemsTable )
|
||||||
{
|
{
|
||||||
if ( FCK.IECleanup )
|
if ( FCK.IECleanup )
|
||||||
FCK.IECleanup.AddItem( this, FCKMenuBlock_Cleanup ) ;
|
FCK.IECleanup.AddItem( this, FCKMenuBlock_Cleanup ) ;
|
||||||
|
|
||||||
this._Window = FCKTools.GetElementWindow( parentElement ) ;
|
this._Window = FCKTools.GetElementWindow( parentElement ) ;
|
||||||
|
|
||||||
var oDoc = FCKTools.GetElementDocument( parentElement ) ;
|
var oDoc = FCKTools.GetElementDocument( parentElement ) ;
|
||||||
|
|
||||||
var eTable = parentElement.appendChild( oDoc.createElement( 'table' ) ) ;
|
var eTable = parentElement.appendChild( oDoc.createElement( 'table' ) ) ;
|
||||||
eTable.cellPadding = 0 ;
|
eTable.cellPadding = 0 ;
|
||||||
eTable.cellSpacing = 0 ;
|
eTable.cellSpacing = 0 ;
|
||||||
|
|
||||||
FCKTools.DisableSelection( eTable ) ;
|
FCKTools.DisableSelection( eTable ) ;
|
||||||
|
|
||||||
var oMainElement = eTable.insertRow(-1).insertCell(-1) ;
|
var oMainElement = eTable.insertRow(-1).insertCell(-1) ;
|
||||||
oMainElement.className = 'MN_Menu' ;
|
oMainElement.className = 'MN_Menu' ;
|
||||||
|
|
||||||
var eItemsTable = this._ItemsTable = oMainElement.appendChild( oDoc.createElement( 'table' ) ) ;
|
var eItemsTable = this._ItemsTable = oMainElement.appendChild( oDoc.createElement( 'table' ) ) ;
|
||||||
eItemsTable.cellPadding = 0 ;
|
eItemsTable.cellPadding = 0 ;
|
||||||
eItemsTable.cellSpacing = 0 ;
|
eItemsTable.cellSpacing = 0 ;
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( var i = 0 ; i < this._Items.length ; i++ )
|
for ( var i = 0 ; i < this._Items.length ; i++ )
|
||||||
this._Items[i].Create( this._ItemsTable ) ;
|
this._Items[i].Create( this._ItemsTable ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Events */
|
/* Events */
|
||||||
|
|
||||||
function FCKMenuBlock_Item_OnClick( clickedItem, menuBlock )
|
function FCKMenuBlock_Item_OnClick( clickedItem, menuBlock )
|
||||||
{
|
{
|
||||||
if ( menuBlock.Hide )
|
if ( menuBlock.Hide )
|
||||||
menuBlock.Hide() ;
|
menuBlock.Hide() ;
|
||||||
|
|
||||||
FCKTools.RunFunction( menuBlock.OnClick, menuBlock, [ clickedItem ] ) ;
|
FCKTools.RunFunction( menuBlock.OnClick, menuBlock, [ clickedItem ] ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKMenuBlock_Item_OnActivate( menuBlock )
|
function FCKMenuBlock_Item_OnActivate( menuBlock )
|
||||||
{
|
{
|
||||||
var oActiveItem = menuBlock._ActiveItem ;
|
var oActiveItem = menuBlock._ActiveItem ;
|
||||||
|
|
||||||
if ( oActiveItem && oActiveItem != this )
|
if ( oActiveItem && oActiveItem != this )
|
||||||
{
|
{
|
||||||
// Set the focus to this menu block window (to fire OnBlur on opened panels).
|
// Set the focus to this menu block window (to fire OnBlur on opened panels).
|
||||||
if ( !FCKBrowserInfo.IsIE && oActiveItem.HasSubMenu && !this.HasSubMenu )
|
if ( !FCKBrowserInfo.IsIE && oActiveItem.HasSubMenu && !this.HasSubMenu )
|
||||||
{
|
{
|
||||||
menuBlock._Window.focus() ;
|
menuBlock._Window.focus() ;
|
||||||
|
|
||||||
// Due to the event model provided by Opera, we need to set
|
// Due to the event model provided by Opera, we need to set
|
||||||
// HasFocus here as the above focus() call will not fire the focus
|
// HasFocus here as the above focus() call will not fire the focus
|
||||||
// event in the panel immediately (#1200).
|
// event in the panel immediately (#1200).
|
||||||
menuBlock.Panel.HasFocus = true ;
|
menuBlock.Panel.HasFocus = true ;
|
||||||
}
|
}
|
||||||
|
|
||||||
oActiveItem.Deactivate() ;
|
oActiveItem.Deactivate() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
menuBlock._ActiveItem = this ;
|
menuBlock._ActiveItem = this ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKMenuBlock_Cleanup()
|
function FCKMenuBlock_Cleanup()
|
||||||
{
|
{
|
||||||
this._Window = null ;
|
this._Window = null ;
|
||||||
this._ItemsTable = null ;
|
this._ItemsTable = null ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ################# //
|
// ################# //
|
||||||
|
|
||||||
var FCKMenuSeparator = function()
|
var FCKMenuSeparator = function()
|
||||||
{}
|
{}
|
||||||
|
|
||||||
FCKMenuSeparator.prototype.Create = function( parentTable )
|
FCKMenuSeparator.prototype.Create = function( parentTable )
|
||||||
{
|
{
|
||||||
var oDoc = FCKTools.GetElementDocument( parentTable ) ;
|
var oDoc = FCKTools.GetElementDocument( parentTable ) ;
|
||||||
|
|
||||||
var r = parentTable.insertRow(-1) ;
|
var r = parentTable.insertRow(-1) ;
|
||||||
|
|
||||||
var eCell = r.insertCell(-1) ;
|
var eCell = r.insertCell(-1) ;
|
||||||
eCell.className = 'MN_Separator MN_Icon' ;
|
eCell.className = 'MN_Separator MN_Icon' ;
|
||||||
|
|
||||||
eCell = r.insertCell(-1) ;
|
eCell = r.insertCell(-1) ;
|
||||||
eCell.className = 'MN_Separator' ;
|
eCell.className = 'MN_Separator' ;
|
||||||
eCell.appendChild( oDoc.createElement( 'DIV' ) ).className = 'MN_Separator_Line' ;
|
eCell.appendChild( oDoc.createElement( 'DIV' ) ).className = 'MN_Separator_Line' ;
|
||||||
|
|
||||||
eCell = r.insertCell(-1) ;
|
eCell = r.insertCell(-1) ;
|
||||||
eCell.className = 'MN_Separator' ;
|
eCell.className = 'MN_Separator' ;
|
||||||
eCell.appendChild( oDoc.createElement( 'DIV' ) ).className = 'MN_Separator_Line' ;
|
eCell.appendChild( oDoc.createElement( 'DIV' ) ).className = 'MN_Separator_Line' ;
|
||||||
}
|
}
|
||||||
|
@ -1,54 +1,54 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* This class is a menu block that behaves like a panel. It's a mix of the
|
* This class is a menu block that behaves like a panel. It's a mix of the
|
||||||
* FCKMenuBlock and FCKPanel classes.
|
* FCKMenuBlock and FCKPanel classes.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKMenuBlockPanel = function()
|
var FCKMenuBlockPanel = function()
|
||||||
{
|
{
|
||||||
// Call the "base" constructor.
|
// Call the "base" constructor.
|
||||||
FCKMenuBlock.call( this ) ;
|
FCKMenuBlock.call( this ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKMenuBlockPanel.prototype = new FCKMenuBlock() ;
|
FCKMenuBlockPanel.prototype = new FCKMenuBlock() ;
|
||||||
|
|
||||||
|
|
||||||
// Override the create method.
|
// Override the create method.
|
||||||
FCKMenuBlockPanel.prototype.Create = function()
|
FCKMenuBlockPanel.prototype.Create = function()
|
||||||
{
|
{
|
||||||
var oPanel = this.Panel = ( this.Parent && this.Parent.Panel ? this.Parent.Panel.CreateChildPanel() : new FCKPanel() ) ;
|
var oPanel = this.Panel = ( this.Parent && this.Parent.Panel ? this.Parent.Panel.CreateChildPanel() : new FCKPanel() ) ;
|
||||||
oPanel.AppendStyleSheet( FCKConfig.SkinEditorCSS ) ;
|
oPanel.AppendStyleSheet( FCKConfig.SkinEditorCSS ) ;
|
||||||
|
|
||||||
// Call the "base" implementation.
|
// Call the "base" implementation.
|
||||||
FCKMenuBlock.prototype.Create.call( this, oPanel.MainNode ) ;
|
FCKMenuBlock.prototype.Create.call( this, oPanel.MainNode ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKMenuBlockPanel.prototype.Show = function( x, y, relElement )
|
FCKMenuBlockPanel.prototype.Show = function( x, y, relElement )
|
||||||
{
|
{
|
||||||
if ( !this.Panel.CheckIsOpened() )
|
if ( !this.Panel.CheckIsOpened() )
|
||||||
this.Panel.Show( x, y, relElement ) ;
|
this.Panel.Show( x, y, relElement ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKMenuBlockPanel.prototype.Hide = function()
|
FCKMenuBlockPanel.prototype.Hide = function()
|
||||||
{
|
{
|
||||||
if ( this.Panel.CheckIsOpened() )
|
if ( this.Panel.CheckIsOpened() )
|
||||||
this.Panel.Hide() ;
|
this.Panel.Hide() ;
|
||||||
}
|
}
|
||||||
|
@ -1,161 +1,161 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Defines and renders a menu items in a menu block.
|
* Defines and renders a menu items in a menu block.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKMenuItem = function( parentMenuBlock, name, label, iconPathOrStripInfoArray, isDisabled, customData )
|
var FCKMenuItem = function( parentMenuBlock, name, label, iconPathOrStripInfoArray, isDisabled, customData )
|
||||||
{
|
{
|
||||||
this.Name = name ;
|
this.Name = name ;
|
||||||
this.Label = label || name ;
|
this.Label = label || name ;
|
||||||
this.IsDisabled = isDisabled ;
|
this.IsDisabled = isDisabled ;
|
||||||
|
|
||||||
this.Icon = new FCKIcon( iconPathOrStripInfoArray ) ;
|
this.Icon = new FCKIcon( iconPathOrStripInfoArray ) ;
|
||||||
|
|
||||||
this.SubMenu = new FCKMenuBlockPanel() ;
|
this.SubMenu = new FCKMenuBlockPanel() ;
|
||||||
this.SubMenu.Parent = parentMenuBlock ;
|
this.SubMenu.Parent = parentMenuBlock ;
|
||||||
this.SubMenu.OnClick = FCKTools.CreateEventListener( FCKMenuItem_SubMenu_OnClick, this ) ;
|
this.SubMenu.OnClick = FCKTools.CreateEventListener( FCKMenuItem_SubMenu_OnClick, this ) ;
|
||||||
this.CustomData = customData ;
|
this.CustomData = customData ;
|
||||||
|
|
||||||
if ( FCK.IECleanup )
|
if ( FCK.IECleanup )
|
||||||
FCK.IECleanup.AddItem( this, FCKMenuItem_Cleanup ) ;
|
FCK.IECleanup.AddItem( this, FCKMenuItem_Cleanup ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
FCKMenuItem.prototype.AddItem = function( name, label, iconPathOrStripInfoArrayOrIndex, isDisabled, customData )
|
FCKMenuItem.prototype.AddItem = function( name, label, iconPathOrStripInfoArrayOrIndex, isDisabled, customData )
|
||||||
{
|
{
|
||||||
this.HasSubMenu = true ;
|
this.HasSubMenu = true ;
|
||||||
return this.SubMenu.AddItem( name, label, iconPathOrStripInfoArrayOrIndex, isDisabled, customData ) ;
|
return this.SubMenu.AddItem( name, label, iconPathOrStripInfoArrayOrIndex, isDisabled, customData ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKMenuItem.prototype.AddSeparator = function()
|
FCKMenuItem.prototype.AddSeparator = function()
|
||||||
{
|
{
|
||||||
this.SubMenu.AddSeparator() ;
|
this.SubMenu.AddSeparator() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKMenuItem.prototype.Create = function( parentTable )
|
FCKMenuItem.prototype.Create = function( parentTable )
|
||||||
{
|
{
|
||||||
var bHasSubMenu = this.HasSubMenu ;
|
var bHasSubMenu = this.HasSubMenu ;
|
||||||
|
|
||||||
var oDoc = FCKTools.GetElementDocument( parentTable ) ;
|
var oDoc = FCKTools.GetElementDocument( parentTable ) ;
|
||||||
|
|
||||||
// Add a row in the table to hold the menu item.
|
// Add a row in the table to hold the menu item.
|
||||||
var r = this.MainElement = parentTable.insertRow(-1) ;
|
var r = this.MainElement = parentTable.insertRow(-1) ;
|
||||||
r.className = this.IsDisabled ? 'MN_Item_Disabled' : 'MN_Item' ;
|
r.className = this.IsDisabled ? 'MN_Item_Disabled' : 'MN_Item' ;
|
||||||
|
|
||||||
// Set the row behavior.
|
// Set the row behavior.
|
||||||
if ( !this.IsDisabled )
|
if ( !this.IsDisabled )
|
||||||
{
|
{
|
||||||
FCKTools.AddEventListenerEx( r, 'mouseover', FCKMenuItem_OnMouseOver, [ this ] ) ;
|
FCKTools.AddEventListenerEx( r, 'mouseover', FCKMenuItem_OnMouseOver, [ this ] ) ;
|
||||||
FCKTools.AddEventListenerEx( r, 'click', FCKMenuItem_OnClick, [ this ] ) ;
|
FCKTools.AddEventListenerEx( r, 'click', FCKMenuItem_OnClick, [ this ] ) ;
|
||||||
|
|
||||||
if ( !bHasSubMenu )
|
if ( !bHasSubMenu )
|
||||||
FCKTools.AddEventListenerEx( r, 'mouseout', FCKMenuItem_OnMouseOut, [ this ] ) ;
|
FCKTools.AddEventListenerEx( r, 'mouseout', FCKMenuItem_OnMouseOut, [ this ] ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the icon cell.
|
// Create the icon cell.
|
||||||
var eCell = r.insertCell(-1) ;
|
var eCell = r.insertCell(-1) ;
|
||||||
eCell.className = 'MN_Icon' ;
|
eCell.className = 'MN_Icon' ;
|
||||||
eCell.appendChild( this.Icon.CreateIconElement( oDoc ) ) ;
|
eCell.appendChild( this.Icon.CreateIconElement( oDoc ) ) ;
|
||||||
|
|
||||||
// Create the label cell.
|
// Create the label cell.
|
||||||
eCell = r.insertCell(-1) ;
|
eCell = r.insertCell(-1) ;
|
||||||
eCell.className = 'MN_Label' ;
|
eCell.className = 'MN_Label' ;
|
||||||
eCell.noWrap = true ;
|
eCell.noWrap = true ;
|
||||||
eCell.appendChild( oDoc.createTextNode( this.Label ) ) ;
|
eCell.appendChild( oDoc.createTextNode( this.Label ) ) ;
|
||||||
|
|
||||||
// Create the arrow cell and setup the sub menu panel (if needed).
|
// Create the arrow cell and setup the sub menu panel (if needed).
|
||||||
eCell = r.insertCell(-1) ;
|
eCell = r.insertCell(-1) ;
|
||||||
if ( bHasSubMenu )
|
if ( bHasSubMenu )
|
||||||
{
|
{
|
||||||
eCell.className = 'MN_Arrow' ;
|
eCell.className = 'MN_Arrow' ;
|
||||||
|
|
||||||
// The arrow is a fixed size image.
|
// The arrow is a fixed size image.
|
||||||
var eArrowImg = eCell.appendChild( oDoc.createElement( 'IMG' ) ) ;
|
var eArrowImg = eCell.appendChild( oDoc.createElement( 'IMG' ) ) ;
|
||||||
eArrowImg.src = FCK_IMAGES_PATH + 'arrow_' + FCKLang.Dir + '.gif' ;
|
eArrowImg.src = FCK_IMAGES_PATH + 'arrow_' + FCKLang.Dir + '.gif' ;
|
||||||
eArrowImg.width = 4 ;
|
eArrowImg.width = 4 ;
|
||||||
eArrowImg.height = 7 ;
|
eArrowImg.height = 7 ;
|
||||||
|
|
||||||
this.SubMenu.Create() ;
|
this.SubMenu.Create() ;
|
||||||
this.SubMenu.Panel.OnHide = FCKTools.CreateEventListener( FCKMenuItem_SubMenu_OnHide, this ) ;
|
this.SubMenu.Panel.OnHide = FCKTools.CreateEventListener( FCKMenuItem_SubMenu_OnHide, this ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKMenuItem.prototype.Activate = function()
|
FCKMenuItem.prototype.Activate = function()
|
||||||
{
|
{
|
||||||
this.MainElement.className = 'MN_Item_Over' ;
|
this.MainElement.className = 'MN_Item_Over' ;
|
||||||
|
|
||||||
if ( this.HasSubMenu )
|
if ( this.HasSubMenu )
|
||||||
{
|
{
|
||||||
// Show the child menu block. The ( +2, -2 ) correction is done because
|
// Show the child menu block. The ( +2, -2 ) correction is done because
|
||||||
// of the padding in the skin. It is not a good solution because one
|
// of the padding in the skin. It is not a good solution because one
|
||||||
// could change the skin and so the final result would not be accurate.
|
// could change the skin and so the final result would not be accurate.
|
||||||
// For now it is ok because we are controlling the skin.
|
// For now it is ok because we are controlling the skin.
|
||||||
this.SubMenu.Show( this.MainElement.offsetWidth + 2, -2, this.MainElement ) ;
|
this.SubMenu.Show( this.MainElement.offsetWidth + 2, -2, this.MainElement ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKTools.RunFunction( this.OnActivate, this ) ;
|
FCKTools.RunFunction( this.OnActivate, this ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKMenuItem.prototype.Deactivate = function()
|
FCKMenuItem.prototype.Deactivate = function()
|
||||||
{
|
{
|
||||||
this.MainElement.className = 'MN_Item' ;
|
this.MainElement.className = 'MN_Item' ;
|
||||||
|
|
||||||
if ( this.HasSubMenu )
|
if ( this.HasSubMenu )
|
||||||
this.SubMenu.Hide() ;
|
this.SubMenu.Hide() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Events */
|
/* Events */
|
||||||
|
|
||||||
function FCKMenuItem_SubMenu_OnClick( clickedItem, listeningItem )
|
function FCKMenuItem_SubMenu_OnClick( clickedItem, listeningItem )
|
||||||
{
|
{
|
||||||
FCKTools.RunFunction( listeningItem.OnClick, listeningItem, [ clickedItem ] ) ;
|
FCKTools.RunFunction( listeningItem.OnClick, listeningItem, [ clickedItem ] ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKMenuItem_SubMenu_OnHide( menuItem )
|
function FCKMenuItem_SubMenu_OnHide( menuItem )
|
||||||
{
|
{
|
||||||
menuItem.Deactivate() ;
|
menuItem.Deactivate() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKMenuItem_OnClick( ev, menuItem )
|
function FCKMenuItem_OnClick( ev, menuItem )
|
||||||
{
|
{
|
||||||
if ( menuItem.HasSubMenu )
|
if ( menuItem.HasSubMenu )
|
||||||
menuItem.Activate() ;
|
menuItem.Activate() ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
menuItem.Deactivate() ;
|
menuItem.Deactivate() ;
|
||||||
FCKTools.RunFunction( menuItem.OnClick, menuItem, [ menuItem ] ) ;
|
FCKTools.RunFunction( menuItem.OnClick, menuItem, [ menuItem ] ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKMenuItem_OnMouseOver( ev, menuItem )
|
function FCKMenuItem_OnMouseOver( ev, menuItem )
|
||||||
{
|
{
|
||||||
menuItem.Activate() ;
|
menuItem.Activate() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKMenuItem_OnMouseOut( ev, menuItem )
|
function FCKMenuItem_OnMouseOut( ev, menuItem )
|
||||||
{
|
{
|
||||||
menuItem.Deactivate() ;
|
menuItem.Deactivate() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKMenuItem_Cleanup()
|
function FCKMenuItem_Cleanup()
|
||||||
{
|
{
|
||||||
this.MainElement = null ;
|
this.MainElement = null ;
|
||||||
}
|
}
|
||||||
|
@ -1,385 +1,386 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Component that creates floating panels. It is used by many
|
* Component that creates floating panels. It is used by many
|
||||||
* other components, like the toolbar items, context menu, etc...
|
* other components, like the toolbar items, context menu, etc...
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKPanel = function( parentWindow )
|
var FCKPanel = function( parentWindow )
|
||||||
{
|
{
|
||||||
this.IsRTL = ( FCKLang.Dir == 'rtl' ) ;
|
this.IsRTL = ( FCKLang.Dir == 'rtl' ) ;
|
||||||
this.IsContextMenu = false ;
|
this.IsContextMenu = false ;
|
||||||
this._LockCounter = 0 ;
|
this._LockCounter = 0 ;
|
||||||
|
|
||||||
this._Window = parentWindow || window ;
|
this._Window = parentWindow || window ;
|
||||||
|
|
||||||
var oDocument ;
|
var oDocument ;
|
||||||
|
|
||||||
if ( FCKBrowserInfo.IsIE )
|
if ( FCKBrowserInfo.IsIE )
|
||||||
{
|
{
|
||||||
// Create the Popup that will hold the panel.
|
// Create the Popup that will hold the panel.
|
||||||
// The popup has to be created before playing with domain hacks, see #1666.
|
// The popup has to be created before playing with domain hacks, see #1666.
|
||||||
this._Popup = this._Window.createPopup() ;
|
this._Popup = this._Window.createPopup() ;
|
||||||
|
|
||||||
// this._Window cannot be accessed while playing with domain hacks, but local variable is ok.
|
// this._Window cannot be accessed while playing with domain hacks, but local variable is ok.
|
||||||
// See #1666.
|
// See #1666.
|
||||||
var pDoc = this._Window.document ;
|
var pDoc = this._Window.document ;
|
||||||
|
|
||||||
// This is a trick to IE6 (not IE7). The original domain must be set
|
// This is a trick to IE6 (not IE7). The original domain must be set
|
||||||
// before creating the popup, so we are able to take a refence to the
|
// before creating the popup, so we are able to take a refence to the
|
||||||
// document inside of it, and the set the proper domain for it. (#123)
|
// document inside of it, and the set the proper domain for it. (#123)
|
||||||
if ( FCK_IS_CUSTOM_DOMAIN && !FCKBrowserInfo.IsIE7 )
|
if ( FCK_IS_CUSTOM_DOMAIN && !FCKBrowserInfo.IsIE7 )
|
||||||
{
|
{
|
||||||
pDoc.domain = FCK_ORIGINAL_DOMAIN ;
|
pDoc.domain = FCK_ORIGINAL_DOMAIN ;
|
||||||
document.domain = FCK_ORIGINAL_DOMAIN ;
|
document.domain = FCK_ORIGINAL_DOMAIN ;
|
||||||
}
|
}
|
||||||
|
|
||||||
oDocument = this.Document = this._Popup.document ;
|
oDocument = this.Document = this._Popup.document ;
|
||||||
|
|
||||||
// Set the proper domain inside the popup.
|
// Set the proper domain inside the popup.
|
||||||
if ( FCK_IS_CUSTOM_DOMAIN )
|
if ( FCK_IS_CUSTOM_DOMAIN )
|
||||||
{
|
{
|
||||||
oDocument.domain = FCK_RUNTIME_DOMAIN ;
|
oDocument.domain = FCK_RUNTIME_DOMAIN ;
|
||||||
pDoc.domain = FCK_RUNTIME_DOMAIN ;
|
pDoc.domain = FCK_RUNTIME_DOMAIN ;
|
||||||
document.domain = FCK_RUNTIME_DOMAIN ;
|
document.domain = FCK_RUNTIME_DOMAIN ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCK.IECleanup.AddItem( this, FCKPanel_Cleanup ) ;
|
FCK.IECleanup.AddItem( this, FCKPanel_Cleanup ) ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var oIFrame = this._IFrame = this._Window.document.createElement('iframe') ;
|
var oIFrame = this._IFrame = this._Window.document.createElement('iframe') ;
|
||||||
oIFrame.src = 'javascript:void(0)' ;
|
FCKTools.ResetStyles( oIFrame );
|
||||||
oIFrame.allowTransparency = true ;
|
oIFrame.src = 'javascript:void(0)' ;
|
||||||
oIFrame.frameBorder = '0' ;
|
oIFrame.allowTransparency = true ;
|
||||||
oIFrame.scrolling = 'no' ;
|
oIFrame.frameBorder = '0' ;
|
||||||
oIFrame.width = oIFrame.height = 0 ;
|
oIFrame.scrolling = 'no' ;
|
||||||
FCKDomTools.SetElementStyles( oIFrame,
|
oIFrame.style.width = oIFrame.style.height = '0px' ;
|
||||||
{
|
FCKDomTools.SetElementStyles( oIFrame,
|
||||||
position : 'absolute',
|
{
|
||||||
zIndex : FCKConfig.FloatingPanelsZIndex
|
position : 'absolute',
|
||||||
} ) ;
|
zIndex : FCKConfig.FloatingPanelsZIndex
|
||||||
|
} ) ;
|
||||||
this._Window.document.body.appendChild( oIFrame ) ;
|
|
||||||
|
this._Window.document.body.appendChild( oIFrame ) ;
|
||||||
var oIFrameWindow = oIFrame.contentWindow ;
|
|
||||||
|
var oIFrameWindow = oIFrame.contentWindow ;
|
||||||
oDocument = this.Document = oIFrameWindow.document ;
|
|
||||||
|
oDocument = this.Document = oIFrameWindow.document ;
|
||||||
// Workaround for Safari 12256. Ticket #63
|
|
||||||
var sBase = '' ;
|
// Workaround for Safari 12256. Ticket #63
|
||||||
if ( FCKBrowserInfo.IsSafari )
|
var sBase = '' ;
|
||||||
sBase = '<base href="' + window.document.location + '">' ;
|
if ( FCKBrowserInfo.IsSafari )
|
||||||
|
sBase = '<base href="' + window.document.location + '">' ;
|
||||||
// Initialize the IFRAME document body.
|
|
||||||
oDocument.open() ;
|
// Initialize the IFRAME document body.
|
||||||
oDocument.write( '<html><head>' + sBase + '<\/head><body style="margin:0px;padding:0px;"><\/body><\/html>' ) ;
|
oDocument.open() ;
|
||||||
oDocument.close() ;
|
oDocument.write( '<html><head>' + sBase + '<\/head><body style="margin:0px;padding:0px;"><\/body><\/html>' ) ;
|
||||||
|
oDocument.close() ;
|
||||||
if( FCKBrowserInfo.IsAIR )
|
|
||||||
FCKAdobeAIR.Panel_Contructor( oDocument, window.document.location ) ;
|
if( FCKBrowserInfo.IsAIR )
|
||||||
|
FCKAdobeAIR.Panel_Contructor( oDocument, window.document.location ) ;
|
||||||
FCKTools.AddEventListenerEx( oIFrameWindow, 'focus', FCKPanel_Window_OnFocus, this ) ;
|
|
||||||
FCKTools.AddEventListenerEx( oIFrameWindow, 'blur', FCKPanel_Window_OnBlur, this ) ;
|
FCKTools.AddEventListenerEx( oIFrameWindow, 'focus', FCKPanel_Window_OnFocus, this ) ;
|
||||||
}
|
FCKTools.AddEventListenerEx( oIFrameWindow, 'blur', FCKPanel_Window_OnBlur, this ) ;
|
||||||
|
}
|
||||||
oDocument.dir = FCKLang.Dir ;
|
|
||||||
|
oDocument.dir = FCKLang.Dir ;
|
||||||
FCKTools.AddEventListener( oDocument, 'contextmenu', FCKTools.CancelEvent ) ;
|
|
||||||
|
FCKTools.AddEventListener( oDocument, 'contextmenu', FCKTools.CancelEvent ) ;
|
||||||
|
|
||||||
// Create the main DIV that is used as the panel base.
|
|
||||||
this.MainNode = oDocument.body.appendChild( oDocument.createElement('DIV') ) ;
|
// Create the main DIV that is used as the panel base.
|
||||||
|
this.MainNode = oDocument.body.appendChild( oDocument.createElement('DIV') ) ;
|
||||||
// The "float" property must be set so Firefox calculates the size correctly.
|
|
||||||
this.MainNode.style.cssFloat = this.IsRTL ? 'right' : 'left' ;
|
// The "float" property must be set so Firefox calculates the size correctly.
|
||||||
}
|
this.MainNode.style.cssFloat = this.IsRTL ? 'right' : 'left' ;
|
||||||
|
}
|
||||||
|
|
||||||
FCKPanel.prototype.AppendStyleSheet = function( styleSheet )
|
|
||||||
{
|
FCKPanel.prototype.AppendStyleSheet = function( styleSheet )
|
||||||
FCKTools.AppendStyleSheet( this.Document, styleSheet ) ;
|
{
|
||||||
}
|
FCKTools.AppendStyleSheet( this.Document, styleSheet ) ;
|
||||||
|
}
|
||||||
FCKPanel.prototype.Preload = function( x, y, relElement )
|
|
||||||
{
|
FCKPanel.prototype.Preload = function( x, y, relElement )
|
||||||
// The offsetWidth and offsetHeight properties are not available if the
|
{
|
||||||
// element is not visible. So we must "show" the popup with no size to
|
// The offsetWidth and offsetHeight properties are not available if the
|
||||||
// be able to use that values in the second call (IE only).
|
// element is not visible. So we must "show" the popup with no size to
|
||||||
if ( this._Popup )
|
// be able to use that values in the second call (IE only).
|
||||||
this._Popup.show( x, y, 0, 0, relElement ) ;
|
if ( this._Popup )
|
||||||
}
|
this._Popup.show( x, y, 0, 0, relElement ) ;
|
||||||
|
}
|
||||||
FCKPanel.prototype.Show = function( x, y, relElement, width, height )
|
|
||||||
{
|
FCKPanel.prototype.Show = function( x, y, relElement, width, height )
|
||||||
var iMainWidth ;
|
{
|
||||||
var eMainNode = this.MainNode ;
|
var iMainWidth ;
|
||||||
|
var eMainNode = this.MainNode ;
|
||||||
if ( this._Popup )
|
|
||||||
{
|
if ( this._Popup )
|
||||||
// The offsetWidth and offsetHeight properties are not available if the
|
{
|
||||||
// element is not visible. So we must "show" the popup with no size to
|
// The offsetWidth and offsetHeight properties are not available if the
|
||||||
// be able to use that values in the second call.
|
// element is not visible. So we must "show" the popup with no size to
|
||||||
this._Popup.show( x, y, 0, 0, relElement ) ;
|
// be able to use that values in the second call.
|
||||||
|
this._Popup.show( x, y, 0, 0, relElement ) ;
|
||||||
// The following lines must be place after the above "show", otherwise it
|
|
||||||
// doesn't has the desired effect.
|
// The following lines must be place after the above "show", otherwise it
|
||||||
FCKDomTools.SetElementStyles( eMainNode,
|
// doesn't has the desired effect.
|
||||||
{
|
FCKDomTools.SetElementStyles( eMainNode,
|
||||||
width : width ? width + 'px' : '',
|
{
|
||||||
height : height ? height + 'px' : ''
|
width : width ? width + 'px' : '',
|
||||||
} ) ;
|
height : height ? height + 'px' : ''
|
||||||
|
} ) ;
|
||||||
iMainWidth = eMainNode.offsetWidth ;
|
|
||||||
|
iMainWidth = eMainNode.offsetWidth ;
|
||||||
if ( this.IsRTL )
|
|
||||||
{
|
if ( this.IsRTL )
|
||||||
if ( this.IsContextMenu )
|
{
|
||||||
x = x - iMainWidth + 1 ;
|
if ( this.IsContextMenu )
|
||||||
else if ( relElement )
|
x = x - iMainWidth + 1 ;
|
||||||
x = ( x * -1 ) + relElement.offsetWidth - iMainWidth ;
|
else if ( relElement )
|
||||||
}
|
x = ( x * -1 ) + relElement.offsetWidth - iMainWidth ;
|
||||||
|
}
|
||||||
// Second call: Show the Popup at the specified location, with the correct size.
|
|
||||||
this._Popup.show( x, y, iMainWidth, eMainNode.offsetHeight, relElement ) ;
|
// Second call: Show the Popup at the specified location, with the correct size.
|
||||||
|
this._Popup.show( x, y, iMainWidth, eMainNode.offsetHeight, relElement ) ;
|
||||||
if ( this.OnHide )
|
|
||||||
{
|
if ( this.OnHide )
|
||||||
if ( this._Timer )
|
{
|
||||||
CheckPopupOnHide.call( this, true ) ;
|
if ( this._Timer )
|
||||||
|
CheckPopupOnHide.call( this, true ) ;
|
||||||
this._Timer = FCKTools.SetInterval( CheckPopupOnHide, 100, this ) ;
|
|
||||||
}
|
this._Timer = FCKTools.SetInterval( CheckPopupOnHide, 100, this ) ;
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
{
|
else
|
||||||
// Do not fire OnBlur while the panel is opened.
|
{
|
||||||
if ( typeof( FCK.ToolbarSet.CurrentInstance.FocusManager ) != 'undefined' )
|
// Do not fire OnBlur while the panel is opened.
|
||||||
FCK.ToolbarSet.CurrentInstance.FocusManager.Lock() ;
|
if ( typeof( FCK.ToolbarSet.CurrentInstance.FocusManager ) != 'undefined' )
|
||||||
|
FCK.ToolbarSet.CurrentInstance.FocusManager.Lock() ;
|
||||||
if ( this.ParentPanel )
|
|
||||||
{
|
if ( this.ParentPanel )
|
||||||
this.ParentPanel.Lock() ;
|
{
|
||||||
|
this.ParentPanel.Lock() ;
|
||||||
// Due to a bug on FF3, we must ensure that the parent panel will
|
|
||||||
// blur (#1584).
|
// Due to a bug on FF3, we must ensure that the parent panel will
|
||||||
FCKPanel_Window_OnBlur( null, this.ParentPanel ) ;
|
// blur (#1584).
|
||||||
}
|
FCKPanel_Window_OnBlur( null, this.ParentPanel ) ;
|
||||||
|
}
|
||||||
// Toggle the iframe scrolling attribute to prevent the panel
|
|
||||||
// scrollbars from disappearing in FF Mac. (#191)
|
// Toggle the iframe scrolling attribute to prevent the panel
|
||||||
if ( FCKBrowserInfo.IsGecko && FCKBrowserInfo.IsMac )
|
// scrollbars from disappearing in FF Mac. (#191)
|
||||||
{
|
if ( FCKBrowserInfo.IsGecko && FCKBrowserInfo.IsMac )
|
||||||
this._IFrame.scrolling = '' ;
|
{
|
||||||
FCKTools.RunFunction( function(){ this._IFrame.scrolling = 'no'; }, this ) ;
|
this._IFrame.scrolling = '' ;
|
||||||
}
|
FCKTools.RunFunction( function(){ this._IFrame.scrolling = 'no'; }, this ) ;
|
||||||
|
}
|
||||||
// Be sure we'll not have more than one Panel opened at the same time.
|
|
||||||
// Do not unlock focus manager here because we're displaying another floating panel
|
// Be sure we'll not have more than one Panel opened at the same time.
|
||||||
// instead of returning the editor to a "no panel" state (Bug #1514).
|
// Do not unlock focus manager here because we're displaying another floating panel
|
||||||
if ( FCK.ToolbarSet.CurrentInstance.GetInstanceObject( 'FCKPanel' )._OpenedPanel &&
|
// instead of returning the editor to a "no panel" state (Bug #1514).
|
||||||
FCK.ToolbarSet.CurrentInstance.GetInstanceObject( 'FCKPanel' )._OpenedPanel != this )
|
if ( FCK.ToolbarSet.CurrentInstance.GetInstanceObject( 'FCKPanel' )._OpenedPanel &&
|
||||||
FCK.ToolbarSet.CurrentInstance.GetInstanceObject( 'FCKPanel' )._OpenedPanel.Hide( false, true ) ;
|
FCK.ToolbarSet.CurrentInstance.GetInstanceObject( 'FCKPanel' )._OpenedPanel != this )
|
||||||
|
FCK.ToolbarSet.CurrentInstance.GetInstanceObject( 'FCKPanel' )._OpenedPanel.Hide( false, true ) ;
|
||||||
FCKDomTools.SetElementStyles( eMainNode,
|
|
||||||
{
|
FCKDomTools.SetElementStyles( eMainNode,
|
||||||
width : width ? width + 'px' : '',
|
{
|
||||||
height : height ? height + 'px' : ''
|
width : width ? width + 'px' : '',
|
||||||
} ) ;
|
height : height ? height + 'px' : ''
|
||||||
|
} ) ;
|
||||||
iMainWidth = eMainNode.offsetWidth ;
|
|
||||||
|
iMainWidth = eMainNode.offsetWidth ;
|
||||||
if ( !width ) this._IFrame.width = 1 ;
|
|
||||||
if ( !height ) this._IFrame.height = 1 ;
|
if ( !width ) this._IFrame.width = 1 ;
|
||||||
|
if ( !height ) this._IFrame.height = 1 ;
|
||||||
// This is weird... but with Firefox, we must get the offsetWidth before
|
|
||||||
// setting the _IFrame size (which returns "0"), and then after that,
|
// This is weird... but with Firefox, we must get the offsetWidth before
|
||||||
// to return the correct width. Remove the first step and it will not
|
// setting the _IFrame size (which returns "0"), and then after that,
|
||||||
// work when the editor is in RTL.
|
// to return the correct width. Remove the first step and it will not
|
||||||
//
|
// work when the editor is in RTL.
|
||||||
// The "|| eMainNode.firstChild.offsetWidth" part has been added
|
//
|
||||||
// for Opera compatibility (see #570).
|
// The "|| eMainNode.firstChild.offsetWidth" part has been added
|
||||||
iMainWidth = eMainNode.offsetWidth || eMainNode.firstChild.offsetWidth ;
|
// for Opera compatibility (see #570).
|
||||||
|
iMainWidth = eMainNode.offsetWidth || eMainNode.firstChild.offsetWidth ;
|
||||||
// Base the popup coordinates upon the coordinates of relElement.
|
|
||||||
var oPos = FCKTools.GetDocumentPosition( this._Window,
|
// Base the popup coordinates upon the coordinates of relElement.
|
||||||
relElement.nodeType == 9 ?
|
var oPos = FCKTools.GetDocumentPosition( this._Window,
|
||||||
( FCKTools.IsStrictMode( relElement ) ? relElement.documentElement : relElement.body ) :
|
relElement.nodeType == 9 ?
|
||||||
relElement ) ;
|
( FCKTools.IsStrictMode( relElement ) ? relElement.documentElement : relElement.body ) :
|
||||||
|
relElement ) ;
|
||||||
// Minus the offsets provided by any positioned parent element of the panel iframe.
|
|
||||||
var positionedAncestor = FCKDomTools.GetPositionedAncestor( this._IFrame.parentNode ) ;
|
// Minus the offsets provided by any positioned parent element of the panel iframe.
|
||||||
if ( positionedAncestor )
|
var positionedAncestor = FCKDomTools.GetPositionedAncestor( this._IFrame.parentNode ) ;
|
||||||
{
|
if ( positionedAncestor )
|
||||||
var nPos = FCKTools.GetDocumentPosition( FCKTools.GetElementWindow( positionedAncestor ), positionedAncestor ) ;
|
{
|
||||||
oPos.x -= nPos.x ;
|
var nPos = FCKTools.GetDocumentPosition( FCKTools.GetElementWindow( positionedAncestor ), positionedAncestor ) ;
|
||||||
oPos.y -= nPos.y ;
|
oPos.x -= nPos.x ;
|
||||||
}
|
oPos.y -= nPos.y ;
|
||||||
|
}
|
||||||
if ( this.IsRTL && !this.IsContextMenu )
|
|
||||||
x = ( x * -1 ) ;
|
if ( this.IsRTL && !this.IsContextMenu )
|
||||||
|
x = ( x * -1 ) ;
|
||||||
x += oPos.x ;
|
|
||||||
y += oPos.y ;
|
x += oPos.x ;
|
||||||
|
y += oPos.y ;
|
||||||
if ( this.IsRTL )
|
|
||||||
{
|
if ( this.IsRTL )
|
||||||
if ( this.IsContextMenu )
|
{
|
||||||
x = x - iMainWidth + 1 ;
|
if ( this.IsContextMenu )
|
||||||
else if ( relElement )
|
x = x - iMainWidth + 1 ;
|
||||||
x = x + relElement.offsetWidth - iMainWidth ;
|
else if ( relElement )
|
||||||
}
|
x = x + relElement.offsetWidth - iMainWidth ;
|
||||||
else
|
}
|
||||||
{
|
else
|
||||||
var oViewPaneSize = FCKTools.GetViewPaneSize( this._Window ) ;
|
{
|
||||||
var oScrollPosition = FCKTools.GetScrollPosition( this._Window ) ;
|
var oViewPaneSize = FCKTools.GetViewPaneSize( this._Window ) ;
|
||||||
|
var oScrollPosition = FCKTools.GetScrollPosition( this._Window ) ;
|
||||||
var iViewPaneHeight = oViewPaneSize.Height + oScrollPosition.Y ;
|
|
||||||
var iViewPaneWidth = oViewPaneSize.Width + oScrollPosition.X ;
|
var iViewPaneHeight = oViewPaneSize.Height + oScrollPosition.Y ;
|
||||||
|
var iViewPaneWidth = oViewPaneSize.Width + oScrollPosition.X ;
|
||||||
if ( ( x + iMainWidth ) > iViewPaneWidth )
|
|
||||||
x -= x + iMainWidth - iViewPaneWidth ;
|
if ( ( x + iMainWidth ) > iViewPaneWidth )
|
||||||
|
x -= x + iMainWidth - iViewPaneWidth ;
|
||||||
if ( ( y + eMainNode.offsetHeight ) > iViewPaneHeight )
|
|
||||||
y -= y + eMainNode.offsetHeight - iViewPaneHeight ;
|
if ( ( y + eMainNode.offsetHeight ) > iViewPaneHeight )
|
||||||
}
|
y -= y + eMainNode.offsetHeight - iViewPaneHeight ;
|
||||||
|
}
|
||||||
// Set the context menu DIV in the specified location.
|
|
||||||
FCKDomTools.SetElementStyles( this._IFrame,
|
// Set the context menu DIV in the specified location.
|
||||||
{
|
FCKDomTools.SetElementStyles( this._IFrame,
|
||||||
left : x + 'px',
|
{
|
||||||
top : y + 'px'
|
left : x + 'px',
|
||||||
} ) ;
|
top : y + 'px'
|
||||||
|
} ) ;
|
||||||
// Move the focus to the IFRAME so we catch the "onblur".
|
|
||||||
this._IFrame.contentWindow.focus() ;
|
// Move the focus to the IFRAME so we catch the "onblur".
|
||||||
this._IsOpened = true ;
|
this._IFrame.contentWindow.focus() ;
|
||||||
|
this._IsOpened = true ;
|
||||||
var me = this ;
|
|
||||||
this._resizeTimer = setTimeout( function()
|
var me = this ;
|
||||||
{
|
this._resizeTimer = setTimeout( function()
|
||||||
var iWidth = eMainNode.offsetWidth || eMainNode.firstChild.offsetWidth ;
|
{
|
||||||
var iHeight = eMainNode.offsetHeight ;
|
var iWidth = eMainNode.offsetWidth || eMainNode.firstChild.offsetWidth ;
|
||||||
me._IFrame.width = iWidth ;
|
var iHeight = eMainNode.offsetHeight ;
|
||||||
me._IFrame.height = iHeight ;
|
me._IFrame.style.width = iWidth + 'px' ;
|
||||||
|
me._IFrame.style.height = iHeight + 'px' ;
|
||||||
}, 0 ) ;
|
|
||||||
|
}, 0 ) ;
|
||||||
FCK.ToolbarSet.CurrentInstance.GetInstanceObject( 'FCKPanel' )._OpenedPanel = this ;
|
|
||||||
}
|
FCK.ToolbarSet.CurrentInstance.GetInstanceObject( 'FCKPanel' )._OpenedPanel = this ;
|
||||||
|
}
|
||||||
FCKTools.RunFunction( this.OnShow, this ) ;
|
|
||||||
}
|
FCKTools.RunFunction( this.OnShow, this ) ;
|
||||||
|
}
|
||||||
FCKPanel.prototype.Hide = function( ignoreOnHide, ignoreFocusManagerUnlock )
|
|
||||||
{
|
FCKPanel.prototype.Hide = function( ignoreOnHide, ignoreFocusManagerUnlock )
|
||||||
if ( this._Popup )
|
{
|
||||||
this._Popup.hide() ;
|
if ( this._Popup )
|
||||||
else
|
this._Popup.hide() ;
|
||||||
{
|
else
|
||||||
if ( !this._IsOpened || this._LockCounter > 0 )
|
{
|
||||||
return ;
|
if ( !this._IsOpened || this._LockCounter > 0 )
|
||||||
|
return ;
|
||||||
// Enable the editor to fire the "OnBlur".
|
|
||||||
if ( typeof( FCKFocusManager ) != 'undefined' && !ignoreFocusManagerUnlock )
|
// Enable the editor to fire the "OnBlur".
|
||||||
FCKFocusManager.Unlock() ;
|
if ( typeof( FCKFocusManager ) != 'undefined' && !ignoreFocusManagerUnlock )
|
||||||
|
FCKFocusManager.Unlock() ;
|
||||||
// It is better to set the sizes to 0, otherwise Firefox would have
|
|
||||||
// rendering problems.
|
// It is better to set the sizes to 0, otherwise Firefox would have
|
||||||
this._IFrame.width = this._IFrame.height = 0 ;
|
// rendering problems.
|
||||||
|
this._IFrame.style.width = this._IFrame.style.height = '0px' ;
|
||||||
this._IsOpened = false ;
|
|
||||||
|
this._IsOpened = false ;
|
||||||
if ( this._resizeTimer )
|
|
||||||
{
|
if ( this._resizeTimer )
|
||||||
clearTimeout( this._resizeTimer ) ;
|
{
|
||||||
this._resizeTimer = null ;
|
clearTimeout( this._resizeTimer ) ;
|
||||||
}
|
this._resizeTimer = null ;
|
||||||
|
}
|
||||||
if ( this.ParentPanel )
|
|
||||||
this.ParentPanel.Unlock() ;
|
if ( this.ParentPanel )
|
||||||
|
this.ParentPanel.Unlock() ;
|
||||||
if ( !ignoreOnHide )
|
|
||||||
FCKTools.RunFunction( this.OnHide, this ) ;
|
if ( !ignoreOnHide )
|
||||||
}
|
FCKTools.RunFunction( this.OnHide, this ) ;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
FCKPanel.prototype.CheckIsOpened = function()
|
|
||||||
{
|
FCKPanel.prototype.CheckIsOpened = function()
|
||||||
if ( this._Popup )
|
{
|
||||||
return this._Popup.isOpen ;
|
if ( this._Popup )
|
||||||
else
|
return this._Popup.isOpen ;
|
||||||
return this._IsOpened ;
|
else
|
||||||
}
|
return this._IsOpened ;
|
||||||
|
}
|
||||||
FCKPanel.prototype.CreateChildPanel = function()
|
|
||||||
{
|
FCKPanel.prototype.CreateChildPanel = function()
|
||||||
var oWindow = this._Popup ? FCKTools.GetDocumentWindow( this.Document ) : this._Window ;
|
{
|
||||||
|
var oWindow = this._Popup ? FCKTools.GetDocumentWindow( this.Document ) : this._Window ;
|
||||||
var oChildPanel = new FCKPanel( oWindow ) ;
|
|
||||||
oChildPanel.ParentPanel = this ;
|
var oChildPanel = new FCKPanel( oWindow ) ;
|
||||||
|
oChildPanel.ParentPanel = this ;
|
||||||
return oChildPanel ;
|
|
||||||
}
|
return oChildPanel ;
|
||||||
|
}
|
||||||
FCKPanel.prototype.Lock = function()
|
|
||||||
{
|
FCKPanel.prototype.Lock = function()
|
||||||
this._LockCounter++ ;
|
{
|
||||||
}
|
this._LockCounter++ ;
|
||||||
|
}
|
||||||
FCKPanel.prototype.Unlock = function()
|
|
||||||
{
|
FCKPanel.prototype.Unlock = function()
|
||||||
if ( --this._LockCounter == 0 && !this.HasFocus )
|
{
|
||||||
this.Hide() ;
|
if ( --this._LockCounter == 0 && !this.HasFocus )
|
||||||
}
|
this.Hide() ;
|
||||||
|
}
|
||||||
/* Events */
|
|
||||||
|
/* Events */
|
||||||
function FCKPanel_Window_OnFocus( e, panel )
|
|
||||||
{
|
function FCKPanel_Window_OnFocus( e, panel )
|
||||||
panel.HasFocus = true ;
|
{
|
||||||
}
|
panel.HasFocus = true ;
|
||||||
|
}
|
||||||
function FCKPanel_Window_OnBlur( e, panel )
|
|
||||||
{
|
function FCKPanel_Window_OnBlur( e, panel )
|
||||||
panel.HasFocus = false ;
|
{
|
||||||
|
panel.HasFocus = false ;
|
||||||
if ( panel._LockCounter == 0 )
|
|
||||||
FCKTools.RunFunction( panel.Hide, panel ) ;
|
if ( panel._LockCounter == 0 )
|
||||||
}
|
FCKTools.RunFunction( panel.Hide, panel ) ;
|
||||||
|
}
|
||||||
function CheckPopupOnHide( forceHide )
|
|
||||||
{
|
function CheckPopupOnHide( forceHide )
|
||||||
if ( forceHide || !this._Popup.isOpen )
|
{
|
||||||
{
|
if ( forceHide || !this._Popup.isOpen )
|
||||||
window.clearInterval( this._Timer ) ;
|
{
|
||||||
this._Timer = null ;
|
window.clearInterval( this._Timer ) ;
|
||||||
|
this._Timer = null ;
|
||||||
FCKTools.RunFunction( this.OnHide, this ) ;
|
|
||||||
}
|
FCKTools.RunFunction( this.OnHide, this ) ;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
function FCKPanel_Cleanup()
|
|
||||||
{
|
function FCKPanel_Cleanup()
|
||||||
this._Popup = null ;
|
{
|
||||||
this._Window = null ;
|
this._Popup = null ;
|
||||||
this.Document = null ;
|
this._Window = null ;
|
||||||
this.MainNode = null ;
|
this.Document = null ;
|
||||||
}
|
this.MainNode = null ;
|
||||||
|
}
|
||||||
|
@ -1,56 +1,56 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKPlugin Class: Represents a single plugin.
|
* FCKPlugin Class: Represents a single plugin.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKPlugin = function( name, availableLangs, basePath )
|
var FCKPlugin = function( name, availableLangs, basePath )
|
||||||
{
|
{
|
||||||
this.Name = name ;
|
this.Name = name ;
|
||||||
this.BasePath = basePath ? basePath : FCKConfig.PluginsPath ;
|
this.BasePath = basePath ? basePath : FCKConfig.PluginsPath ;
|
||||||
this.Path = this.BasePath + name + '/' ;
|
this.Path = this.BasePath + name + '/' ;
|
||||||
|
|
||||||
if ( !availableLangs || availableLangs.length == 0 )
|
if ( !availableLangs || availableLangs.length == 0 )
|
||||||
this.AvailableLangs = new Array() ;
|
this.AvailableLangs = new Array() ;
|
||||||
else
|
else
|
||||||
this.AvailableLangs = availableLangs.split(',') ;
|
this.AvailableLangs = availableLangs.split(',') ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKPlugin.prototype.Load = function()
|
FCKPlugin.prototype.Load = function()
|
||||||
{
|
{
|
||||||
// Load the language file, if defined.
|
// Load the language file, if defined.
|
||||||
if ( this.AvailableLangs.length > 0 )
|
if ( this.AvailableLangs.length > 0 )
|
||||||
{
|
{
|
||||||
var sLang ;
|
var sLang ;
|
||||||
|
|
||||||
// Check if the plugin has the language file for the active language.
|
// Check if the plugin has the language file for the active language.
|
||||||
if ( this.AvailableLangs.IndexOf( FCKLanguageManager.ActiveLanguage.Code ) >= 0 )
|
if ( this.AvailableLangs.IndexOf( FCKLanguageManager.ActiveLanguage.Code ) >= 0 )
|
||||||
sLang = FCKLanguageManager.ActiveLanguage.Code ;
|
sLang = FCKLanguageManager.ActiveLanguage.Code ;
|
||||||
else
|
else
|
||||||
// Load the default language file (first one) if the current one is not available.
|
// Load the default language file (first one) if the current one is not available.
|
||||||
sLang = this.AvailableLangs[0] ;
|
sLang = this.AvailableLangs[0] ;
|
||||||
|
|
||||||
// Add the main plugin script.
|
// Add the main plugin script.
|
||||||
LoadScript( this.Path + 'lang/' + sLang + '.js' ) ;
|
LoadScript( this.Path + 'lang/' + sLang + '.js' ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the main plugin script.
|
// Add the main plugin script.
|
||||||
LoadScript( this.Path + 'fckplugin.js' ) ;
|
LoadScript( this.Path + 'fckplugin.js' ) ;
|
||||||
}
|
}
|
||||||
|
@ -1,376 +1,376 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKSpecialCombo Class: represents a special combo.
|
* FCKSpecialCombo Class: represents a special combo.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKSpecialCombo = function( caption, fieldWidth, panelWidth, panelMaxHeight, parentWindow )
|
var FCKSpecialCombo = function( caption, fieldWidth, panelWidth, panelMaxHeight, parentWindow )
|
||||||
{
|
{
|
||||||
// Default properties values.
|
// Default properties values.
|
||||||
this.FieldWidth = fieldWidth || 100 ;
|
this.FieldWidth = fieldWidth || 100 ;
|
||||||
this.PanelWidth = panelWidth || 150 ;
|
this.PanelWidth = panelWidth || 150 ;
|
||||||
this.PanelMaxHeight = panelMaxHeight || 150 ;
|
this.PanelMaxHeight = panelMaxHeight || 150 ;
|
||||||
this.Label = ' ' ;
|
this.Label = ' ' ;
|
||||||
this.Caption = caption ;
|
this.Caption = caption ;
|
||||||
this.Tooltip = caption ;
|
this.Tooltip = caption ;
|
||||||
this.Style = FCK_TOOLBARITEM_ICONTEXT ;
|
this.Style = FCK_TOOLBARITEM_ICONTEXT ;
|
||||||
|
|
||||||
this.Enabled = true ;
|
this.Enabled = true ;
|
||||||
|
|
||||||
this.Items = new Object() ;
|
this.Items = new Object() ;
|
||||||
|
|
||||||
this._Panel = new FCKPanel( parentWindow || window ) ;
|
this._Panel = new FCKPanel( parentWindow || window ) ;
|
||||||
this._Panel.AppendStyleSheet( FCKConfig.SkinEditorCSS ) ;
|
this._Panel.AppendStyleSheet( FCKConfig.SkinEditorCSS ) ;
|
||||||
this._PanelBox = this._Panel.MainNode.appendChild( this._Panel.Document.createElement( 'DIV' ) ) ;
|
this._PanelBox = this._Panel.MainNode.appendChild( this._Panel.Document.createElement( 'DIV' ) ) ;
|
||||||
this._PanelBox.className = 'SC_Panel' ;
|
this._PanelBox.className = 'SC_Panel' ;
|
||||||
this._PanelBox.style.width = this.PanelWidth + 'px' ;
|
this._PanelBox.style.width = this.PanelWidth + 'px' ;
|
||||||
|
|
||||||
this._PanelBox.innerHTML = '<table cellpadding="0" cellspacing="0" width="100%" style="TABLE-LAYOUT: fixed"><tr><td nowrap></td></tr></table>' ;
|
this._PanelBox.innerHTML = '<table cellpadding="0" cellspacing="0" width="100%" style="TABLE-LAYOUT: fixed"><tr><td nowrap></td></tr></table>' ;
|
||||||
|
|
||||||
this._ItemsHolderEl = this._PanelBox.getElementsByTagName('TD')[0] ;
|
this._ItemsHolderEl = this._PanelBox.getElementsByTagName('TD')[0] ;
|
||||||
|
|
||||||
if ( FCK.IECleanup )
|
if ( FCK.IECleanup )
|
||||||
FCK.IECleanup.AddItem( this, FCKSpecialCombo_Cleanup ) ;
|
FCK.IECleanup.AddItem( this, FCKSpecialCombo_Cleanup ) ;
|
||||||
|
|
||||||
// this._Panel.StyleSheet = FCKConfig.SkinPath + 'fck_contextmenu.css' ;
|
// this._Panel.StyleSheet = FCKConfig.SkinPath + 'fck_contextmenu.css' ;
|
||||||
// this._Panel.Create() ;
|
// this._Panel.Create() ;
|
||||||
// this._Panel.PanelDiv.className += ' SC_Panel' ;
|
// this._Panel.PanelDiv.className += ' SC_Panel' ;
|
||||||
// this._Panel.PanelDiv.innerHTML = '<table cellpadding="0" cellspacing="0" width="100%" style="TABLE-LAYOUT: fixed"><tr><td nowrap></td></tr></table>' ;
|
// this._Panel.PanelDiv.innerHTML = '<table cellpadding="0" cellspacing="0" width="100%" style="TABLE-LAYOUT: fixed"><tr><td nowrap></td></tr></table>' ;
|
||||||
// this._ItemsHolderEl = this._Panel.PanelDiv.getElementsByTagName('TD')[0] ;
|
// this._ItemsHolderEl = this._Panel.PanelDiv.getElementsByTagName('TD')[0] ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKSpecialCombo_ItemOnMouseOver()
|
function FCKSpecialCombo_ItemOnMouseOver()
|
||||||
{
|
{
|
||||||
this.className += ' SC_ItemOver' ;
|
this.className += ' SC_ItemOver' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKSpecialCombo_ItemOnMouseOut()
|
function FCKSpecialCombo_ItemOnMouseOut()
|
||||||
{
|
{
|
||||||
this.className = this.originalClass ;
|
this.className = this.originalClass ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKSpecialCombo_ItemOnClick( ev, specialCombo, itemId )
|
function FCKSpecialCombo_ItemOnClick( ev, specialCombo, itemId )
|
||||||
{
|
{
|
||||||
this.className = this.originalClass ;
|
this.className = this.originalClass ;
|
||||||
|
|
||||||
specialCombo._Panel.Hide() ;
|
specialCombo._Panel.Hide() ;
|
||||||
|
|
||||||
specialCombo.SetLabel( this.FCKItemLabel ) ;
|
specialCombo.SetLabel( this.FCKItemLabel ) ;
|
||||||
|
|
||||||
if ( typeof( specialCombo.OnSelect ) == 'function' )
|
if ( typeof( specialCombo.OnSelect ) == 'function' )
|
||||||
specialCombo.OnSelect( itemId, this ) ;
|
specialCombo.OnSelect( itemId, this ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKSpecialCombo.prototype.ClearItems = function ()
|
FCKSpecialCombo.prototype.ClearItems = function ()
|
||||||
{
|
{
|
||||||
if ( this.Items )
|
if ( this.Items )
|
||||||
this.Items = {} ;
|
this.Items = {} ;
|
||||||
|
|
||||||
var itemsholder = this._ItemsHolderEl ;
|
var itemsholder = this._ItemsHolderEl ;
|
||||||
while ( itemsholder.firstChild )
|
while ( itemsholder.firstChild )
|
||||||
itemsholder.removeChild( itemsholder.firstChild ) ;
|
itemsholder.removeChild( itemsholder.firstChild ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKSpecialCombo.prototype.AddItem = function( id, html, label, bgColor )
|
FCKSpecialCombo.prototype.AddItem = function( id, html, label, bgColor )
|
||||||
{
|
{
|
||||||
// <div class="SC_Item" onmouseover="this.className='SC_Item SC_ItemOver';" onmouseout="this.className='SC_Item';"><b>Bold 1</b></div>
|
// <div class="SC_Item" onmouseover="this.className='SC_Item SC_ItemOver';" onmouseout="this.className='SC_Item';"><b>Bold 1</b></div>
|
||||||
var oDiv = this._ItemsHolderEl.appendChild( this._Panel.Document.createElement( 'DIV' ) ) ;
|
var oDiv = this._ItemsHolderEl.appendChild( this._Panel.Document.createElement( 'DIV' ) ) ;
|
||||||
oDiv.className = oDiv.originalClass = 'SC_Item' ;
|
oDiv.className = oDiv.originalClass = 'SC_Item' ;
|
||||||
oDiv.innerHTML = html ;
|
oDiv.innerHTML = html ;
|
||||||
oDiv.FCKItemLabel = label || id ;
|
oDiv.FCKItemLabel = label || id ;
|
||||||
oDiv.Selected = false ;
|
oDiv.Selected = false ;
|
||||||
|
|
||||||
// In IE, the width must be set so the borders are shown correctly when the content overflows.
|
// In IE, the width must be set so the borders are shown correctly when the content overflows.
|
||||||
if ( FCKBrowserInfo.IsIE )
|
if ( FCKBrowserInfo.IsIE )
|
||||||
oDiv.style.width = '100%' ;
|
oDiv.style.width = '100%' ;
|
||||||
|
|
||||||
if ( bgColor )
|
if ( bgColor )
|
||||||
oDiv.style.backgroundColor = bgColor ;
|
oDiv.style.backgroundColor = bgColor ;
|
||||||
|
|
||||||
FCKTools.AddEventListenerEx( oDiv, 'mouseover', FCKSpecialCombo_ItemOnMouseOver ) ;
|
FCKTools.AddEventListenerEx( oDiv, 'mouseover', FCKSpecialCombo_ItemOnMouseOver ) ;
|
||||||
FCKTools.AddEventListenerEx( oDiv, 'mouseout', FCKSpecialCombo_ItemOnMouseOut ) ;
|
FCKTools.AddEventListenerEx( oDiv, 'mouseout', FCKSpecialCombo_ItemOnMouseOut ) ;
|
||||||
FCKTools.AddEventListenerEx( oDiv, 'click', FCKSpecialCombo_ItemOnClick, [ this, id ] ) ;
|
FCKTools.AddEventListenerEx( oDiv, 'click', FCKSpecialCombo_ItemOnClick, [ this, id ] ) ;
|
||||||
|
|
||||||
this.Items[ id.toString().toLowerCase() ] = oDiv ;
|
this.Items[ id.toString().toLowerCase() ] = oDiv ;
|
||||||
|
|
||||||
return oDiv ;
|
return oDiv ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKSpecialCombo.prototype.SelectItem = function( item )
|
FCKSpecialCombo.prototype.SelectItem = function( item )
|
||||||
{
|
{
|
||||||
if ( typeof item == 'string' )
|
if ( typeof item == 'string' )
|
||||||
item = this.Items[ item.toString().toLowerCase() ] ;
|
item = this.Items[ item.toString().toLowerCase() ] ;
|
||||||
|
|
||||||
if ( item )
|
if ( item )
|
||||||
{
|
{
|
||||||
item.className = item.originalClass = 'SC_ItemSelected' ;
|
item.className = item.originalClass = 'SC_ItemSelected' ;
|
||||||
item.Selected = true ;
|
item.Selected = true ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKSpecialCombo.prototype.SelectItemByLabel = function( itemLabel, setLabel )
|
FCKSpecialCombo.prototype.SelectItemByLabel = function( itemLabel, setLabel )
|
||||||
{
|
{
|
||||||
for ( var id in this.Items )
|
for ( var id in this.Items )
|
||||||
{
|
{
|
||||||
var oDiv = this.Items[id] ;
|
var oDiv = this.Items[id] ;
|
||||||
|
|
||||||
if ( oDiv.FCKItemLabel == itemLabel )
|
if ( oDiv.FCKItemLabel == itemLabel )
|
||||||
{
|
{
|
||||||
oDiv.className = oDiv.originalClass = 'SC_ItemSelected' ;
|
oDiv.className = oDiv.originalClass = 'SC_ItemSelected' ;
|
||||||
oDiv.Selected = true ;
|
oDiv.Selected = true ;
|
||||||
|
|
||||||
if ( setLabel )
|
if ( setLabel )
|
||||||
this.SetLabel( itemLabel ) ;
|
this.SetLabel( itemLabel ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKSpecialCombo.prototype.DeselectAll = function( clearLabel )
|
FCKSpecialCombo.prototype.DeselectAll = function( clearLabel )
|
||||||
{
|
{
|
||||||
for ( var i in this.Items )
|
for ( var i in this.Items )
|
||||||
{
|
{
|
||||||
if ( !this.Items[i] ) continue;
|
if ( !this.Items[i] ) continue;
|
||||||
this.Items[i].className = this.Items[i].originalClass = 'SC_Item' ;
|
this.Items[i].className = this.Items[i].originalClass = 'SC_Item' ;
|
||||||
this.Items[i].Selected = false ;
|
this.Items[i].Selected = false ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( clearLabel )
|
if ( clearLabel )
|
||||||
this.SetLabel( '' ) ;
|
this.SetLabel( '' ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKSpecialCombo.prototype.SetLabelById = function( id )
|
FCKSpecialCombo.prototype.SetLabelById = function( id )
|
||||||
{
|
{
|
||||||
id = id ? id.toString().toLowerCase() : '' ;
|
id = id ? id.toString().toLowerCase() : '' ;
|
||||||
|
|
||||||
var oDiv = this.Items[ id ] ;
|
var oDiv = this.Items[ id ] ;
|
||||||
this.SetLabel( oDiv ? oDiv.FCKItemLabel : '' ) ;
|
this.SetLabel( oDiv ? oDiv.FCKItemLabel : '' ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKSpecialCombo.prototype.SetLabel = function( text )
|
FCKSpecialCombo.prototype.SetLabel = function( text )
|
||||||
{
|
{
|
||||||
text = ( !text || text.length == 0 ) ? ' ' : text ;
|
text = ( !text || text.length == 0 ) ? ' ' : text ;
|
||||||
|
|
||||||
if ( text == this.Label )
|
if ( text == this.Label )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
this.Label = text ;
|
this.Label = text ;
|
||||||
|
|
||||||
var labelEl = this._LabelEl ;
|
var labelEl = this._LabelEl ;
|
||||||
if ( labelEl )
|
if ( labelEl )
|
||||||
{
|
{
|
||||||
labelEl.innerHTML = text ;
|
labelEl.innerHTML = text ;
|
||||||
|
|
||||||
// It may happen that the label is some HTML, including tags. This
|
// It may happen that the label is some HTML, including tags. This
|
||||||
// would be a problem because when the user click on those tags, the
|
// would be a problem because when the user click on those tags, the
|
||||||
// combo will get the selection from the editing area. So we must
|
// combo will get the selection from the editing area. So we must
|
||||||
// disable any kind of selection here.
|
// disable any kind of selection here.
|
||||||
FCKTools.DisableSelection( labelEl ) ;
|
FCKTools.DisableSelection( labelEl ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKSpecialCombo.prototype.SetEnabled = function( isEnabled )
|
FCKSpecialCombo.prototype.SetEnabled = function( isEnabled )
|
||||||
{
|
{
|
||||||
this.Enabled = isEnabled ;
|
this.Enabled = isEnabled ;
|
||||||
|
|
||||||
// In IE it can happen when the page is reloaded that _OuterTable is null, so check its existence
|
// In IE it can happen when the page is reloaded that _OuterTable is null, so check its existence
|
||||||
if ( this._OuterTable )
|
if ( this._OuterTable )
|
||||||
this._OuterTable.className = isEnabled ? '' : 'SC_FieldDisabled' ;
|
this._OuterTable.className = isEnabled ? '' : 'SC_FieldDisabled' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKSpecialCombo.prototype.Create = function( targetElement )
|
FCKSpecialCombo.prototype.Create = function( targetElement )
|
||||||
{
|
{
|
||||||
var oDoc = FCKTools.GetElementDocument( targetElement ) ;
|
var oDoc = FCKTools.GetElementDocument( targetElement ) ;
|
||||||
var eOuterTable = this._OuterTable = targetElement.appendChild( oDoc.createElement( 'TABLE' ) ) ;
|
var eOuterTable = this._OuterTable = targetElement.appendChild( oDoc.createElement( 'TABLE' ) ) ;
|
||||||
eOuterTable.cellPadding = 0 ;
|
eOuterTable.cellPadding = 0 ;
|
||||||
eOuterTable.cellSpacing = 0 ;
|
eOuterTable.cellSpacing = 0 ;
|
||||||
|
|
||||||
eOuterTable.insertRow(-1) ;
|
eOuterTable.insertRow(-1) ;
|
||||||
|
|
||||||
var sClass ;
|
var sClass ;
|
||||||
var bShowLabel ;
|
var bShowLabel ;
|
||||||
|
|
||||||
switch ( this.Style )
|
switch ( this.Style )
|
||||||
{
|
{
|
||||||
case FCK_TOOLBARITEM_ONLYICON :
|
case FCK_TOOLBARITEM_ONLYICON :
|
||||||
sClass = 'TB_ButtonType_Icon' ;
|
sClass = 'TB_ButtonType_Icon' ;
|
||||||
bShowLabel = false;
|
bShowLabel = false;
|
||||||
break ;
|
break ;
|
||||||
case FCK_TOOLBARITEM_ONLYTEXT :
|
case FCK_TOOLBARITEM_ONLYTEXT :
|
||||||
sClass = 'TB_ButtonType_Text' ;
|
sClass = 'TB_ButtonType_Text' ;
|
||||||
bShowLabel = false;
|
bShowLabel = false;
|
||||||
break ;
|
break ;
|
||||||
case FCK_TOOLBARITEM_ICONTEXT :
|
case FCK_TOOLBARITEM_ICONTEXT :
|
||||||
bShowLabel = true;
|
bShowLabel = true;
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( this.Caption && this.Caption.length > 0 && bShowLabel )
|
if ( this.Caption && this.Caption.length > 0 && bShowLabel )
|
||||||
{
|
{
|
||||||
var oCaptionCell = eOuterTable.rows[0].insertCell(-1) ;
|
var oCaptionCell = eOuterTable.rows[0].insertCell(-1) ;
|
||||||
oCaptionCell.innerHTML = this.Caption ;
|
oCaptionCell.innerHTML = this.Caption ;
|
||||||
oCaptionCell.className = 'SC_FieldCaption' ;
|
oCaptionCell.className = 'SC_FieldCaption' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the main DIV element.
|
// Create the main DIV element.
|
||||||
var oField = FCKTools.AppendElement( eOuterTable.rows[0].insertCell(-1), 'div' ) ;
|
var oField = FCKTools.AppendElement( eOuterTable.rows[0].insertCell(-1), 'div' ) ;
|
||||||
if ( bShowLabel )
|
if ( bShowLabel )
|
||||||
{
|
{
|
||||||
oField.className = 'SC_Field' ;
|
oField.className = 'SC_Field' ;
|
||||||
oField.style.width = this.FieldWidth + 'px' ;
|
oField.style.width = this.FieldWidth + 'px' ;
|
||||||
oField.innerHTML = '<table width="100%" cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldLabel"><label> </label></td><td class="SC_FieldButton"> </td></tr></tbody></table>' ;
|
oField.innerHTML = '<table width="100%" cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldLabel"><label> </label></td><td class="SC_FieldButton"> </td></tr></tbody></table>' ;
|
||||||
|
|
||||||
this._LabelEl = oField.getElementsByTagName('label')[0] ; // Memory Leak
|
this._LabelEl = oField.getElementsByTagName('label')[0] ; // Memory Leak
|
||||||
this._LabelEl.innerHTML = this.Label ;
|
this._LabelEl.innerHTML = this.Label ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
oField.className = 'TB_Button_Off' ;
|
oField.className = 'TB_Button_Off' ;
|
||||||
//oField.innerHTML = '<span className="SC_FieldCaption">' + this.Caption + '<table cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldButton" style="border-left: none;"> </td></tr></tbody></table>' ;
|
//oField.innerHTML = '<span className="SC_FieldCaption">' + this.Caption + '<table cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldButton" style="border-left: none;"> </td></tr></tbody></table>' ;
|
||||||
//oField.innerHTML = '<table cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldButton" style="border-left: none;"> </td></tr></tbody></table>' ;
|
//oField.innerHTML = '<table cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldButton" style="border-left: none;"> </td></tr></tbody></table>' ;
|
||||||
|
|
||||||
// Gets the correct CSS class to use for the specified style (param).
|
// Gets the correct CSS class to use for the specified style (param).
|
||||||
oField.innerHTML = '<table title="' + this.Tooltip + '" class="' + sClass + '" cellspacing="0" cellpadding="0" border="0">' +
|
oField.innerHTML = '<table title="' + this.Tooltip + '" class="' + sClass + '" cellspacing="0" cellpadding="0" border="0">' +
|
||||||
'<tr>' +
|
'<tr>' +
|
||||||
//'<td class="TB_Icon"><img src="' + FCKConfig.SkinPath + 'toolbar/' + this.Command.Name.toLowerCase() + '.gif" width="21" height="21"></td>' +
|
//'<td class="TB_Icon"><img src="' + FCKConfig.SkinPath + 'toolbar/' + this.Command.Name.toLowerCase() + '.gif" width="21" height="21"></td>' +
|
||||||
'<td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td>' +
|
'<td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td>' +
|
||||||
'<td class="TB_Text">' + this.Caption + '</td>' +
|
'<td class="TB_Text">' + this.Caption + '</td>' +
|
||||||
'<td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td>' +
|
'<td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td>' +
|
||||||
'<td class="TB_ButtonArrow"><img src="' + FCKConfig.SkinPath + 'images/toolbar.buttonarrow.gif" width="5" height="3"></td>' +
|
'<td class="TB_ButtonArrow"><img src="' + FCKConfig.SkinPath + 'images/toolbar.buttonarrow.gif" width="5" height="3"></td>' +
|
||||||
'<td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td>' +
|
'<td><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td>' +
|
||||||
'</tr>' +
|
'</tr>' +
|
||||||
'</table>' ;
|
'</table>' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Events Handlers
|
// Events Handlers
|
||||||
|
|
||||||
FCKTools.AddEventListenerEx( oField, 'mouseover', FCKSpecialCombo_OnMouseOver, this ) ;
|
FCKTools.AddEventListenerEx( oField, 'mouseover', FCKSpecialCombo_OnMouseOver, this ) ;
|
||||||
FCKTools.AddEventListenerEx( oField, 'mouseout', FCKSpecialCombo_OnMouseOut, this ) ;
|
FCKTools.AddEventListenerEx( oField, 'mouseout', FCKSpecialCombo_OnMouseOut, this ) ;
|
||||||
FCKTools.AddEventListenerEx( oField, 'click', FCKSpecialCombo_OnClick, this ) ;
|
FCKTools.AddEventListenerEx( oField, 'click', FCKSpecialCombo_OnClick, this ) ;
|
||||||
|
|
||||||
FCKTools.DisableSelection( this._Panel.Document.body ) ;
|
FCKTools.DisableSelection( this._Panel.Document.body ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKSpecialCombo_Cleanup()
|
function FCKSpecialCombo_Cleanup()
|
||||||
{
|
{
|
||||||
this._LabelEl = null ;
|
this._LabelEl = null ;
|
||||||
this._OuterTable = null ;
|
this._OuterTable = null ;
|
||||||
this._ItemsHolderEl = null ;
|
this._ItemsHolderEl = null ;
|
||||||
this._PanelBox = null ;
|
this._PanelBox = null ;
|
||||||
|
|
||||||
if ( this.Items )
|
if ( this.Items )
|
||||||
{
|
{
|
||||||
for ( var key in this.Items )
|
for ( var key in this.Items )
|
||||||
this.Items[key] = null ;
|
this.Items[key] = null ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKSpecialCombo_OnMouseOver( ev, specialCombo )
|
function FCKSpecialCombo_OnMouseOver( ev, specialCombo )
|
||||||
{
|
{
|
||||||
if ( specialCombo.Enabled )
|
if ( specialCombo.Enabled )
|
||||||
{
|
{
|
||||||
switch ( specialCombo.Style )
|
switch ( specialCombo.Style )
|
||||||
{
|
{
|
||||||
case FCK_TOOLBARITEM_ONLYICON :
|
case FCK_TOOLBARITEM_ONLYICON :
|
||||||
this.className = 'TB_Button_On_Over';
|
this.className = 'TB_Button_On_Over';
|
||||||
break ;
|
break ;
|
||||||
case FCK_TOOLBARITEM_ONLYTEXT :
|
case FCK_TOOLBARITEM_ONLYTEXT :
|
||||||
this.className = 'TB_Button_On_Over';
|
this.className = 'TB_Button_On_Over';
|
||||||
break ;
|
break ;
|
||||||
case FCK_TOOLBARITEM_ICONTEXT :
|
case FCK_TOOLBARITEM_ICONTEXT :
|
||||||
this.className = 'SC_Field SC_FieldOver' ;
|
this.className = 'SC_Field SC_FieldOver' ;
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKSpecialCombo_OnMouseOut( ev, specialCombo )
|
function FCKSpecialCombo_OnMouseOut( ev, specialCombo )
|
||||||
{
|
{
|
||||||
switch ( specialCombo.Style )
|
switch ( specialCombo.Style )
|
||||||
{
|
{
|
||||||
case FCK_TOOLBARITEM_ONLYICON :
|
case FCK_TOOLBARITEM_ONLYICON :
|
||||||
this.className = 'TB_Button_Off';
|
this.className = 'TB_Button_Off';
|
||||||
break ;
|
break ;
|
||||||
case FCK_TOOLBARITEM_ONLYTEXT :
|
case FCK_TOOLBARITEM_ONLYTEXT :
|
||||||
this.className = 'TB_Button_Off';
|
this.className = 'TB_Button_Off';
|
||||||
break ;
|
break ;
|
||||||
case FCK_TOOLBARITEM_ICONTEXT :
|
case FCK_TOOLBARITEM_ICONTEXT :
|
||||||
this.className='SC_Field' ;
|
this.className='SC_Field' ;
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKSpecialCombo_OnClick( e, specialCombo )
|
function FCKSpecialCombo_OnClick( e, specialCombo )
|
||||||
{
|
{
|
||||||
// For Mozilla we must stop the event propagation to avoid it hiding
|
// For Mozilla we must stop the event propagation to avoid it hiding
|
||||||
// the panel because of a click outside of it.
|
// the panel because of a click outside of it.
|
||||||
// if ( e )
|
// if ( e )
|
||||||
// {
|
// {
|
||||||
// e.stopPropagation() ;
|
// e.stopPropagation() ;
|
||||||
// FCKPanelEventHandlers.OnDocumentClick( e ) ;
|
// FCKPanelEventHandlers.OnDocumentClick( e ) ;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
if ( specialCombo.Enabled )
|
if ( specialCombo.Enabled )
|
||||||
{
|
{
|
||||||
var oPanel = specialCombo._Panel ;
|
var oPanel = specialCombo._Panel ;
|
||||||
var oPanelBox = specialCombo._PanelBox ;
|
var oPanelBox = specialCombo._PanelBox ;
|
||||||
var oItemsHolder = specialCombo._ItemsHolderEl ;
|
var oItemsHolder = specialCombo._ItemsHolderEl ;
|
||||||
var iMaxHeight = specialCombo.PanelMaxHeight ;
|
var iMaxHeight = specialCombo.PanelMaxHeight ;
|
||||||
|
|
||||||
if ( specialCombo.OnBeforeClick )
|
if ( specialCombo.OnBeforeClick )
|
||||||
specialCombo.OnBeforeClick( specialCombo ) ;
|
specialCombo.OnBeforeClick( specialCombo ) ;
|
||||||
|
|
||||||
// This is a tricky thing. We must call the "Load" function, otherwise
|
// This is a tricky thing. We must call the "Load" function, otherwise
|
||||||
// it will not be possible to retrieve "oItemsHolder.offsetHeight" (IE only).
|
// it will not be possible to retrieve "oItemsHolder.offsetHeight" (IE only).
|
||||||
if ( FCKBrowserInfo.IsIE )
|
if ( FCKBrowserInfo.IsIE )
|
||||||
oPanel.Preload( 0, this.offsetHeight, this ) ;
|
oPanel.Preload( 0, this.offsetHeight, this ) ;
|
||||||
|
|
||||||
if ( oItemsHolder.offsetHeight > iMaxHeight )
|
if ( oItemsHolder.offsetHeight > iMaxHeight )
|
||||||
// {
|
// {
|
||||||
oPanelBox.style.height = iMaxHeight + 'px' ;
|
oPanelBox.style.height = iMaxHeight + 'px' ;
|
||||||
|
|
||||||
// if ( FCKBrowserInfo.IsGecko )
|
// if ( FCKBrowserInfo.IsGecko )
|
||||||
// oPanelBox.style.overflow = '-moz-scrollbars-vertical' ;
|
// oPanelBox.style.overflow = '-moz-scrollbars-vertical' ;
|
||||||
// }
|
// }
|
||||||
else
|
else
|
||||||
oPanelBox.style.height = '' ;
|
oPanelBox.style.height = '' ;
|
||||||
|
|
||||||
// oPanel.PanelDiv.style.width = specialCombo.PanelWidth + 'px' ;
|
// oPanel.PanelDiv.style.width = specialCombo.PanelWidth + 'px' ;
|
||||||
|
|
||||||
oPanel.Show( 0, this.offsetHeight, this ) ;
|
oPanel.Show( 0, this.offsetHeight, this ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// return false ;
|
// return false ;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Sample Combo Field HTML output:
|
Sample Combo Field HTML output:
|
||||||
|
|
||||||
<div class="SC_Field" style="width: 80px;">
|
<div class="SC_Field" style="width: 80px;">
|
||||||
<table width="100%" cellpadding="0" cellspacing="0" style="table-layout: fixed;">
|
<table width="100%" cellpadding="0" cellspacing="0" style="table-layout: fixed;">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="SC_FieldLabel"><label> </label></td>
|
<td class="SC_FieldLabel"><label> </label></td>
|
||||||
<td class="SC_FieldButton"> </td>
|
<td class="SC_FieldButton"> </td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
*/
|
*/
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,103 +1,103 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKToolbar Class: represents a toolbar in the toolbarset. It is a group of
|
* FCKToolbar Class: represents a toolbar in the toolbarset. It is a group of
|
||||||
* toolbar items.
|
* toolbar items.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKToolbar = function()
|
var FCKToolbar = function()
|
||||||
{
|
{
|
||||||
this.Items = new Array() ;
|
this.Items = new Array() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbar.prototype.AddItem = function( item )
|
FCKToolbar.prototype.AddItem = function( item )
|
||||||
{
|
{
|
||||||
return this.Items[ this.Items.length ] = item ;
|
return this.Items[ this.Items.length ] = item ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbar.prototype.AddButton = function( name, label, tooltip, iconPathOrStripInfoArrayOrIndex, style, state )
|
FCKToolbar.prototype.AddButton = function( name, label, tooltip, iconPathOrStripInfoArrayOrIndex, style, state )
|
||||||
{
|
{
|
||||||
if ( typeof( iconPathOrStripInfoArrayOrIndex ) == 'number' )
|
if ( typeof( iconPathOrStripInfoArrayOrIndex ) == 'number' )
|
||||||
iconPathOrStripInfoArrayOrIndex = [ this.DefaultIconsStrip, this.DefaultIconSize, iconPathOrStripInfoArrayOrIndex ] ;
|
iconPathOrStripInfoArrayOrIndex = [ this.DefaultIconsStrip, this.DefaultIconSize, iconPathOrStripInfoArrayOrIndex ] ;
|
||||||
|
|
||||||
var oButton = new FCKToolbarButtonUI( name, label, tooltip, iconPathOrStripInfoArrayOrIndex, style, state ) ;
|
var oButton = new FCKToolbarButtonUI( name, label, tooltip, iconPathOrStripInfoArrayOrIndex, style, state ) ;
|
||||||
oButton._FCKToolbar = this ;
|
oButton._FCKToolbar = this ;
|
||||||
oButton.OnClick = FCKToolbar_OnItemClick ;
|
oButton.OnClick = FCKToolbar_OnItemClick ;
|
||||||
|
|
||||||
return this.AddItem( oButton ) ;
|
return this.AddItem( oButton ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKToolbar_OnItemClick( item )
|
function FCKToolbar_OnItemClick( item )
|
||||||
{
|
{
|
||||||
var oToolbar = item._FCKToolbar ;
|
var oToolbar = item._FCKToolbar ;
|
||||||
|
|
||||||
if ( oToolbar.OnItemClick )
|
if ( oToolbar.OnItemClick )
|
||||||
oToolbar.OnItemClick( oToolbar, item ) ;
|
oToolbar.OnItemClick( oToolbar, item ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbar.prototype.AddSeparator = function()
|
FCKToolbar.prototype.AddSeparator = function()
|
||||||
{
|
{
|
||||||
this.AddItem( new FCKToolbarSeparator() ) ;
|
this.AddItem( new FCKToolbarSeparator() ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbar.prototype.Create = function( parentElement )
|
FCKToolbar.prototype.Create = function( parentElement )
|
||||||
{
|
{
|
||||||
var oDoc = FCKTools.GetElementDocument( parentElement ) ;
|
var oDoc = FCKTools.GetElementDocument( parentElement ) ;
|
||||||
|
|
||||||
var e = oDoc.createElement( 'table' ) ;
|
var e = oDoc.createElement( 'table' ) ;
|
||||||
e.className = 'TB_Toolbar' ;
|
e.className = 'TB_Toolbar' ;
|
||||||
e.style.styleFloat = e.style.cssFloat = ( FCKLang.Dir == 'ltr' ? 'left' : 'right' ) ;
|
e.style.styleFloat = e.style.cssFloat = ( FCKLang.Dir == 'ltr' ? 'left' : 'right' ) ;
|
||||||
e.dir = FCKLang.Dir ;
|
e.dir = FCKLang.Dir ;
|
||||||
e.cellPadding = 0 ;
|
e.cellPadding = 0 ;
|
||||||
e.cellSpacing = 0 ;
|
e.cellSpacing = 0 ;
|
||||||
|
|
||||||
var targetRow = e.insertRow(-1) ;
|
var targetRow = e.insertRow(-1) ;
|
||||||
|
|
||||||
// Insert the start cell.
|
// Insert the start cell.
|
||||||
var eCell ;
|
var eCell ;
|
||||||
|
|
||||||
if ( !this.HideStart )
|
if ( !this.HideStart )
|
||||||
{
|
{
|
||||||
eCell = targetRow.insertCell(-1) ;
|
eCell = targetRow.insertCell(-1) ;
|
||||||
eCell.appendChild( oDoc.createElement( 'div' ) ).className = 'TB_Start' ;
|
eCell.appendChild( oDoc.createElement( 'div' ) ).className = 'TB_Start' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( var i = 0 ; i < this.Items.length ; i++ )
|
for ( var i = 0 ; i < this.Items.length ; i++ )
|
||||||
{
|
{
|
||||||
this.Items[i].Create( targetRow.insertCell(-1) ) ;
|
this.Items[i].Create( targetRow.insertCell(-1) ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Insert the ending cell.
|
// Insert the ending cell.
|
||||||
if ( !this.HideEnd )
|
if ( !this.HideEnd )
|
||||||
{
|
{
|
||||||
eCell = targetRow.insertCell(-1) ;
|
eCell = targetRow.insertCell(-1) ;
|
||||||
eCell.appendChild( oDoc.createElement( 'div' ) ).className = 'TB_End' ;
|
eCell.appendChild( oDoc.createElement( 'div' ) ).className = 'TB_End' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
parentElement.appendChild( e ) ;
|
parentElement.appendChild( e ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
var FCKToolbarSeparator = function()
|
var FCKToolbarSeparator = function()
|
||||||
{}
|
{}
|
||||||
|
|
||||||
FCKToolbarSeparator.prototype.Create = function( parentElement )
|
FCKToolbarSeparator.prototype.Create = function( parentElement )
|
||||||
{
|
{
|
||||||
FCKTools.AppendElement( parentElement, 'div' ).className = 'TB_Separator' ;
|
FCKTools.AppendElement( parentElement, 'div' ).className = 'TB_Separator' ;
|
||||||
}
|
}
|
||||||
|
@ -1,36 +1,36 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKToolbarBreak Class: breaks the toolbars.
|
* FCKToolbarBreak Class: breaks the toolbars.
|
||||||
* It makes it possible to force the toolbar to break to a new line.
|
* It makes it possible to force the toolbar to break to a new line.
|
||||||
* This is the Gecko specific implementation.
|
* This is the Gecko specific implementation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKToolbarBreak = function()
|
var FCKToolbarBreak = function()
|
||||||
{}
|
{}
|
||||||
|
|
||||||
FCKToolbarBreak.prototype.Create = function( targetElement )
|
FCKToolbarBreak.prototype.Create = function( targetElement )
|
||||||
{
|
{
|
||||||
var oBreakDiv = targetElement.ownerDocument.createElement( 'div' ) ;
|
var oBreakDiv = targetElement.ownerDocument.createElement( 'div' ) ;
|
||||||
|
|
||||||
oBreakDiv.style.clear = oBreakDiv.style.cssFloat = FCKLang.Dir == 'rtl' ? 'right' : 'left' ;
|
oBreakDiv.style.clear = oBreakDiv.style.cssFloat = FCKLang.Dir == 'rtl' ? 'right' : 'left' ;
|
||||||
|
|
||||||
targetElement.appendChild( oBreakDiv ) ;
|
targetElement.appendChild( oBreakDiv ) ;
|
||||||
}
|
}
|
||||||
|
@ -1,38 +1,38 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKToolbarBreak Class: breaks the toolbars.
|
* FCKToolbarBreak Class: breaks the toolbars.
|
||||||
* It makes it possible to force the toolbar to break to a new line.
|
* It makes it possible to force the toolbar to break to a new line.
|
||||||
* This is the IE specific implementation.
|
* This is the IE specific implementation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKToolbarBreak = function()
|
var FCKToolbarBreak = function()
|
||||||
{}
|
{}
|
||||||
|
|
||||||
FCKToolbarBreak.prototype.Create = function( targetElement )
|
FCKToolbarBreak.prototype.Create = function( targetElement )
|
||||||
{
|
{
|
||||||
var oBreakDiv = FCKTools.GetElementDocument( targetElement ).createElement( 'div' ) ;
|
var oBreakDiv = FCKTools.GetElementDocument( targetElement ).createElement( 'div' ) ;
|
||||||
|
|
||||||
oBreakDiv.className = 'TB_Break' ;
|
oBreakDiv.className = 'TB_Break' ;
|
||||||
|
|
||||||
oBreakDiv.style.clear = FCKLang.Dir == 'rtl' ? 'left' : 'right' ;
|
oBreakDiv.style.clear = FCKLang.Dir == 'rtl' ? 'left' : 'right' ;
|
||||||
|
|
||||||
targetElement.appendChild( oBreakDiv ) ;
|
targetElement.appendChild( oBreakDiv ) ;
|
||||||
}
|
}
|
||||||
|
@ -1,81 +1,81 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKToolbarButton Class: represents a button in the toolbar.
|
* FCKToolbarButton Class: represents a button in the toolbar.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKToolbarButton = function( commandName, label, tooltip, style, sourceView, contextSensitive, icon )
|
var FCKToolbarButton = function( commandName, label, tooltip, style, sourceView, contextSensitive, icon )
|
||||||
{
|
{
|
||||||
this.CommandName = commandName ;
|
this.CommandName = commandName ;
|
||||||
this.Label = label ;
|
this.Label = label ;
|
||||||
this.Tooltip = tooltip ;
|
this.Tooltip = tooltip ;
|
||||||
this.Style = style ;
|
this.Style = style ;
|
||||||
this.SourceView = sourceView ? true : false ;
|
this.SourceView = sourceView ? true : false ;
|
||||||
this.ContextSensitive = contextSensitive ? true : false ;
|
this.ContextSensitive = contextSensitive ? true : false ;
|
||||||
|
|
||||||
if ( icon == null )
|
if ( icon == null )
|
||||||
this.IconPath = FCKConfig.SkinPath + 'toolbar/' + commandName.toLowerCase() + '.gif' ;
|
this.IconPath = FCKConfig.SkinPath + 'toolbar/' + commandName.toLowerCase() + '.gif' ;
|
||||||
else if ( typeof( icon ) == 'number' )
|
else if ( typeof( icon ) == 'number' )
|
||||||
this.IconPath = [ FCKConfig.SkinPath + 'fck_strip.gif', 16, icon ] ;
|
this.IconPath = [ FCKConfig.SkinPath + 'fck_strip.gif', 16, icon ] ;
|
||||||
else
|
else
|
||||||
this.IconPath = icon ;
|
this.IconPath = icon ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarButton.prototype.Create = function( targetElement )
|
FCKToolbarButton.prototype.Create = function( targetElement )
|
||||||
{
|
{
|
||||||
this._UIButton = new FCKToolbarButtonUI( this.CommandName, this.Label, this.Tooltip, this.IconPath, this.Style ) ;
|
this._UIButton = new FCKToolbarButtonUI( this.CommandName, this.Label, this.Tooltip, this.IconPath, this.Style ) ;
|
||||||
this._UIButton.OnClick = this.Click ;
|
this._UIButton.OnClick = this.Click ;
|
||||||
this._UIButton._ToolbarButton = this ;
|
this._UIButton._ToolbarButton = this ;
|
||||||
this._UIButton.Create( targetElement ) ;
|
this._UIButton.Create( targetElement ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarButton.prototype.RefreshState = function()
|
FCKToolbarButton.prototype.RefreshState = function()
|
||||||
{
|
{
|
||||||
var uiButton = this._UIButton ;
|
var uiButton = this._UIButton ;
|
||||||
|
|
||||||
if ( !uiButton )
|
if ( !uiButton )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
// Gets the actual state.
|
// Gets the actual state.
|
||||||
var eState = FCK.ToolbarSet.CurrentInstance.Commands.GetCommand( this.CommandName ).GetState() ;
|
var eState = FCK.ToolbarSet.CurrentInstance.Commands.GetCommand( this.CommandName ).GetState() ;
|
||||||
|
|
||||||
// If there are no state changes than do nothing and return.
|
// If there are no state changes than do nothing and return.
|
||||||
if ( eState == uiButton.State ) return ;
|
if ( eState == uiButton.State ) return ;
|
||||||
|
|
||||||
// Sets the actual state.
|
// Sets the actual state.
|
||||||
uiButton.ChangeState( eState ) ;
|
uiButton.ChangeState( eState ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarButton.prototype.Click = function()
|
FCKToolbarButton.prototype.Click = function()
|
||||||
{
|
{
|
||||||
var oToolbarButton = this._ToolbarButton || this ;
|
var oToolbarButton = this._ToolbarButton || this ;
|
||||||
FCK.ToolbarSet.CurrentInstance.Commands.GetCommand( oToolbarButton.CommandName ).Execute() ;
|
FCK.ToolbarSet.CurrentInstance.Commands.GetCommand( oToolbarButton.CommandName ).Execute() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarButton.prototype.Enable = function()
|
FCKToolbarButton.prototype.Enable = function()
|
||||||
{
|
{
|
||||||
this.RefreshState() ;
|
this.RefreshState() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarButton.prototype.Disable = function()
|
FCKToolbarButton.prototype.Disable = function()
|
||||||
{
|
{
|
||||||
// Sets the actual state.
|
// Sets the actual state.
|
||||||
this._UIButton.ChangeState( FCK_TRISTATE_DISABLED ) ;
|
this._UIButton.ChangeState( FCK_TRISTATE_DISABLED ) ;
|
||||||
}
|
}
|
||||||
|
@ -1,198 +1,198 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKToolbarButtonUI Class: interface representation of a toolbar button.
|
* FCKToolbarButtonUI Class: interface representation of a toolbar button.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKToolbarButtonUI = function( name, label, tooltip, iconPathOrStripInfoArray, style, state )
|
var FCKToolbarButtonUI = function( name, label, tooltip, iconPathOrStripInfoArray, style, state )
|
||||||
{
|
{
|
||||||
this.Name = name ;
|
this.Name = name ;
|
||||||
this.Label = label || name ;
|
this.Label = label || name ;
|
||||||
this.Tooltip = tooltip || this.Label ;
|
this.Tooltip = tooltip || this.Label ;
|
||||||
this.Style = style || FCK_TOOLBARITEM_ONLYICON ;
|
this.Style = style || FCK_TOOLBARITEM_ONLYICON ;
|
||||||
this.State = state || FCK_TRISTATE_OFF ;
|
this.State = state || FCK_TRISTATE_OFF ;
|
||||||
|
|
||||||
this.Icon = new FCKIcon( iconPathOrStripInfoArray ) ;
|
this.Icon = new FCKIcon( iconPathOrStripInfoArray ) ;
|
||||||
|
|
||||||
if ( FCK.IECleanup )
|
if ( FCK.IECleanup )
|
||||||
FCK.IECleanup.AddItem( this, FCKToolbarButtonUI_Cleanup ) ;
|
FCK.IECleanup.AddItem( this, FCKToolbarButtonUI_Cleanup ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
FCKToolbarButtonUI.prototype._CreatePaddingElement = function( document )
|
FCKToolbarButtonUI.prototype._CreatePaddingElement = function( document )
|
||||||
{
|
{
|
||||||
var oImg = document.createElement( 'IMG' ) ;
|
var oImg = document.createElement( 'IMG' ) ;
|
||||||
oImg.className = 'TB_Button_Padding' ;
|
oImg.className = 'TB_Button_Padding' ;
|
||||||
oImg.src = FCK_SPACER_PATH ;
|
oImg.src = FCK_SPACER_PATH ;
|
||||||
return oImg ;
|
return oImg ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarButtonUI.prototype.Create = function( parentElement )
|
FCKToolbarButtonUI.prototype.Create = function( parentElement )
|
||||||
{
|
{
|
||||||
var oDoc = FCKTools.GetElementDocument( parentElement ) ;
|
var oDoc = FCKTools.GetElementDocument( parentElement ) ;
|
||||||
|
|
||||||
// Create the Main Element.
|
// Create the Main Element.
|
||||||
var oMainElement = this.MainElement = oDoc.createElement( 'DIV' ) ;
|
var oMainElement = this.MainElement = oDoc.createElement( 'DIV' ) ;
|
||||||
oMainElement.title = this.Tooltip ;
|
oMainElement.title = this.Tooltip ;
|
||||||
|
|
||||||
// The following will prevent the button from catching the focus.
|
// The following will prevent the button from catching the focus.
|
||||||
if ( FCKBrowserInfo.IsGecko )
|
if ( FCKBrowserInfo.IsGecko )
|
||||||
oMainElement.onmousedown = FCKTools.CancelEvent ;
|
oMainElement.onmousedown = FCKTools.CancelEvent ;
|
||||||
|
|
||||||
FCKTools.AddEventListenerEx( oMainElement, 'mouseover', FCKToolbarButtonUI_OnMouseOver, this ) ;
|
FCKTools.AddEventListenerEx( oMainElement, 'mouseover', FCKToolbarButtonUI_OnMouseOver, this ) ;
|
||||||
FCKTools.AddEventListenerEx( oMainElement, 'mouseout', FCKToolbarButtonUI_OnMouseOut, this ) ;
|
FCKTools.AddEventListenerEx( oMainElement, 'mouseout', FCKToolbarButtonUI_OnMouseOut, this ) ;
|
||||||
FCKTools.AddEventListenerEx( oMainElement, 'click', FCKToolbarButtonUI_OnClick, this ) ;
|
FCKTools.AddEventListenerEx( oMainElement, 'click', FCKToolbarButtonUI_OnClick, this ) ;
|
||||||
|
|
||||||
this.ChangeState( this.State, true ) ;
|
this.ChangeState( this.State, true ) ;
|
||||||
|
|
||||||
if ( this.Style == FCK_TOOLBARITEM_ONLYICON && !this.ShowArrow )
|
if ( this.Style == FCK_TOOLBARITEM_ONLYICON && !this.ShowArrow )
|
||||||
{
|
{
|
||||||
// <td><div class="TB_Button_On" title="Smiley">{Image}</div></td>
|
// <td><div class="TB_Button_On" title="Smiley">{Image}</div></td>
|
||||||
|
|
||||||
oMainElement.appendChild( this.Icon.CreateIconElement( oDoc ) ) ;
|
oMainElement.appendChild( this.Icon.CreateIconElement( oDoc ) ) ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// <td><div class="TB_Button_On" title="Smiley"><table cellpadding="0" cellspacing="0"><tr><td>{Image}</td><td nowrap>Toolbar Button</td><td><img class="TB_Button_Padding"></td></tr></table></div></td>
|
// <td><div class="TB_Button_On" title="Smiley"><table cellpadding="0" cellspacing="0"><tr><td>{Image}</td><td nowrap>Toolbar Button</td><td><img class="TB_Button_Padding"></td></tr></table></div></td>
|
||||||
// <td><div class="TB_Button_On" title="Smiley"><table cellpadding="0" cellspacing="0"><tr><td><img class="TB_Button_Padding"></td><td nowrap>Toolbar Button</td><td><img class="TB_Button_Padding"></td></tr></table></div></td>
|
// <td><div class="TB_Button_On" title="Smiley"><table cellpadding="0" cellspacing="0"><tr><td><img class="TB_Button_Padding"></td><td nowrap>Toolbar Button</td><td><img class="TB_Button_Padding"></td></tr></table></div></td>
|
||||||
|
|
||||||
var oTable = oMainElement.appendChild( oDoc.createElement( 'TABLE' ) ) ;
|
var oTable = oMainElement.appendChild( oDoc.createElement( 'TABLE' ) ) ;
|
||||||
oTable.cellPadding = 0 ;
|
oTable.cellPadding = 0 ;
|
||||||
oTable.cellSpacing = 0 ;
|
oTable.cellSpacing = 0 ;
|
||||||
|
|
||||||
var oRow = oTable.insertRow(-1) ;
|
var oRow = oTable.insertRow(-1) ;
|
||||||
|
|
||||||
// The Image cell (icon or padding).
|
// The Image cell (icon or padding).
|
||||||
var oCell = oRow.insertCell(-1) ;
|
var oCell = oRow.insertCell(-1) ;
|
||||||
|
|
||||||
if ( this.Style == FCK_TOOLBARITEM_ONLYICON || this.Style == FCK_TOOLBARITEM_ICONTEXT )
|
if ( this.Style == FCK_TOOLBARITEM_ONLYICON || this.Style == FCK_TOOLBARITEM_ICONTEXT )
|
||||||
oCell.appendChild( this.Icon.CreateIconElement( oDoc ) ) ;
|
oCell.appendChild( this.Icon.CreateIconElement( oDoc ) ) ;
|
||||||
else
|
else
|
||||||
oCell.appendChild( this._CreatePaddingElement( oDoc ) ) ;
|
oCell.appendChild( this._CreatePaddingElement( oDoc ) ) ;
|
||||||
|
|
||||||
if ( this.Style == FCK_TOOLBARITEM_ONLYTEXT || this.Style == FCK_TOOLBARITEM_ICONTEXT )
|
if ( this.Style == FCK_TOOLBARITEM_ONLYTEXT || this.Style == FCK_TOOLBARITEM_ICONTEXT )
|
||||||
{
|
{
|
||||||
// The Text cell.
|
// The Text cell.
|
||||||
oCell = oRow.insertCell(-1) ;
|
oCell = oRow.insertCell(-1) ;
|
||||||
oCell.className = 'TB_Button_Text' ;
|
oCell.className = 'TB_Button_Text' ;
|
||||||
oCell.noWrap = true ;
|
oCell.noWrap = true ;
|
||||||
oCell.appendChild( oDoc.createTextNode( this.Label ) ) ;
|
oCell.appendChild( oDoc.createTextNode( this.Label ) ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( this.ShowArrow )
|
if ( this.ShowArrow )
|
||||||
{
|
{
|
||||||
if ( this.Style != FCK_TOOLBARITEM_ONLYICON )
|
if ( this.Style != FCK_TOOLBARITEM_ONLYICON )
|
||||||
{
|
{
|
||||||
// A padding cell.
|
// A padding cell.
|
||||||
oRow.insertCell(-1).appendChild( this._CreatePaddingElement( oDoc ) ) ;
|
oRow.insertCell(-1).appendChild( this._CreatePaddingElement( oDoc ) ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
oCell = oRow.insertCell(-1) ;
|
oCell = oRow.insertCell(-1) ;
|
||||||
var eImg = oCell.appendChild( oDoc.createElement( 'IMG' ) ) ;
|
var eImg = oCell.appendChild( oDoc.createElement( 'IMG' ) ) ;
|
||||||
eImg.src = FCKConfig.SkinPath + 'images/toolbar.buttonarrow.gif' ;
|
eImg.src = FCKConfig.SkinPath + 'images/toolbar.buttonarrow.gif' ;
|
||||||
eImg.width = 5 ;
|
eImg.width = 5 ;
|
||||||
eImg.height = 3 ;
|
eImg.height = 3 ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The last padding cell.
|
// The last padding cell.
|
||||||
oCell = oRow.insertCell(-1) ;
|
oCell = oRow.insertCell(-1) ;
|
||||||
oCell.appendChild( this._CreatePaddingElement( oDoc ) ) ;
|
oCell.appendChild( this._CreatePaddingElement( oDoc ) ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
parentElement.appendChild( oMainElement ) ;
|
parentElement.appendChild( oMainElement ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarButtonUI.prototype.ChangeState = function( newState, force )
|
FCKToolbarButtonUI.prototype.ChangeState = function( newState, force )
|
||||||
{
|
{
|
||||||
if ( !force && this.State == newState )
|
if ( !force && this.State == newState )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
var e = this.MainElement ;
|
var e = this.MainElement ;
|
||||||
|
|
||||||
// In IE it can happen when the page is reloaded that MainElement is null, so exit here
|
// In IE it can happen when the page is reloaded that MainElement is null, so exit here
|
||||||
if ( !e )
|
if ( !e )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
switch ( parseInt( newState, 10 ) )
|
switch ( parseInt( newState, 10 ) )
|
||||||
{
|
{
|
||||||
case FCK_TRISTATE_OFF :
|
case FCK_TRISTATE_OFF :
|
||||||
e.className = 'TB_Button_Off' ;
|
e.className = 'TB_Button_Off' ;
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
case FCK_TRISTATE_ON :
|
case FCK_TRISTATE_ON :
|
||||||
e.className = 'TB_Button_On' ;
|
e.className = 'TB_Button_On' ;
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
case FCK_TRISTATE_DISABLED :
|
case FCK_TRISTATE_DISABLED :
|
||||||
e.className = 'TB_Button_Disabled' ;
|
e.className = 'TB_Button_Disabled' ;
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.State = newState ;
|
this.State = newState ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKToolbarButtonUI_OnMouseOver( ev, button )
|
function FCKToolbarButtonUI_OnMouseOver( ev, button )
|
||||||
{
|
{
|
||||||
if ( button.State == FCK_TRISTATE_OFF )
|
if ( button.State == FCK_TRISTATE_OFF )
|
||||||
this.className = 'TB_Button_Off_Over' ;
|
this.className = 'TB_Button_Off_Over' ;
|
||||||
else if ( button.State == FCK_TRISTATE_ON )
|
else if ( button.State == FCK_TRISTATE_ON )
|
||||||
this.className = 'TB_Button_On_Over' ;
|
this.className = 'TB_Button_On_Over' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKToolbarButtonUI_OnMouseOut( ev, button )
|
function FCKToolbarButtonUI_OnMouseOut( ev, button )
|
||||||
{
|
{
|
||||||
if ( button.State == FCK_TRISTATE_OFF )
|
if ( button.State == FCK_TRISTATE_OFF )
|
||||||
this.className = 'TB_Button_Off' ;
|
this.className = 'TB_Button_Off' ;
|
||||||
else if ( button.State == FCK_TRISTATE_ON )
|
else if ( button.State == FCK_TRISTATE_ON )
|
||||||
this.className = 'TB_Button_On' ;
|
this.className = 'TB_Button_On' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKToolbarButtonUI_OnClick( ev, button )
|
function FCKToolbarButtonUI_OnClick( ev, button )
|
||||||
{
|
{
|
||||||
if ( button.OnClick && button.State != FCK_TRISTATE_DISABLED )
|
if ( button.OnClick && button.State != FCK_TRISTATE_DISABLED )
|
||||||
button.OnClick( button ) ;
|
button.OnClick( button ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKToolbarButtonUI_Cleanup()
|
function FCKToolbarButtonUI_Cleanup()
|
||||||
{
|
{
|
||||||
// This one should not cause memory leak, but just for safety, let's clean
|
// This one should not cause memory leak, but just for safety, let's clean
|
||||||
// it up.
|
// it up.
|
||||||
this.MainElement = null ;
|
this.MainElement = null ;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Sample outputs:
|
Sample outputs:
|
||||||
|
|
||||||
This is the base structure. The variation is the image that is marked as {Image}:
|
This is the base structure. The variation is the image that is marked as {Image}:
|
||||||
<td><div class="TB_Button_On" title="Smiley">{Image}</div></td>
|
<td><div class="TB_Button_On" title="Smiley">{Image}</div></td>
|
||||||
<td><div class="TB_Button_On" title="Smiley"><table cellpadding="0" cellspacing="0"><tr><td>{Image}</td><td nowrap>Toolbar Button</td><td><img class="TB_Button_Padding"></td></tr></table></div></td>
|
<td><div class="TB_Button_On" title="Smiley"><table cellpadding="0" cellspacing="0"><tr><td>{Image}</td><td nowrap>Toolbar Button</td><td><img class="TB_Button_Padding"></td></tr></table></div></td>
|
||||||
<td><div class="TB_Button_On" title="Smiley"><table cellpadding="0" cellspacing="0"><tr><td><img class="TB_Button_Padding"></td><td nowrap>Toolbar Button</td><td><img class="TB_Button_Padding"></td></tr></table></div></td>
|
<td><div class="TB_Button_On" title="Smiley"><table cellpadding="0" cellspacing="0"><tr><td><img class="TB_Button_Padding"></td><td nowrap>Toolbar Button</td><td><img class="TB_Button_Padding"></td></tr></table></div></td>
|
||||||
|
|
||||||
These are samples of possible {Image} values:
|
These are samples of possible {Image} values:
|
||||||
|
|
||||||
Strip - IE version:
|
Strip - IE version:
|
||||||
<div class="TB_Button_Image"><img src="strip.gif" style="top:-16px"></div>
|
<div class="TB_Button_Image"><img src="strip.gif" style="top:-16px"></div>
|
||||||
|
|
||||||
Strip : Firefox, Safari and Opera version
|
Strip : Firefox, Safari and Opera version
|
||||||
<img class="TB_Button_Image" style="background-position: 0px -16px;background-image: url(strip.gif);">
|
<img class="TB_Button_Image" style="background-position: 0px -16px;background-image: url(strip.gif);">
|
||||||
|
|
||||||
No-Strip : Browser independent:
|
No-Strip : Browser independent:
|
||||||
<img class="TB_Button_Image" src="smiley.gif">
|
<img class="TB_Button_Image" src="smiley.gif">
|
||||||
*/
|
*/
|
||||||
|
@ -1,139 +1,139 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKToolbarPanelButton Class: Handles the Fonts combo selector.
|
* FCKToolbarPanelButton Class: Handles the Fonts combo selector.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKToolbarFontFormatCombo = function( tooltip, style )
|
var FCKToolbarFontFormatCombo = function( tooltip, style )
|
||||||
{
|
{
|
||||||
if ( tooltip === false )
|
if ( tooltip === false )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
this.CommandName = 'FontFormat' ;
|
this.CommandName = 'FontFormat' ;
|
||||||
this.Label = this.GetLabel() ;
|
this.Label = this.GetLabel() ;
|
||||||
this.Tooltip = tooltip ? tooltip : this.Label ;
|
this.Tooltip = tooltip ? tooltip : this.Label ;
|
||||||
this.Style = style ? style : FCK_TOOLBARITEM_ICONTEXT ;
|
this.Style = style ? style : FCK_TOOLBARITEM_ICONTEXT ;
|
||||||
|
|
||||||
this.NormalLabel = 'Normal' ;
|
this.NormalLabel = 'Normal' ;
|
||||||
|
|
||||||
this.PanelWidth = 190 ;
|
this.PanelWidth = 190 ;
|
||||||
|
|
||||||
this.DefaultLabel = FCKConfig.DefaultFontFormatLabel || '' ;
|
this.DefaultLabel = FCKConfig.DefaultFontFormatLabel || '' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Inherit from FCKToolbarSpecialCombo.
|
// Inherit from FCKToolbarSpecialCombo.
|
||||||
FCKToolbarFontFormatCombo.prototype = new FCKToolbarStyleCombo( false ) ;
|
FCKToolbarFontFormatCombo.prototype = new FCKToolbarStyleCombo( false ) ;
|
||||||
|
|
||||||
FCKToolbarFontFormatCombo.prototype.GetLabel = function()
|
FCKToolbarFontFormatCombo.prototype.GetLabel = function()
|
||||||
{
|
{
|
||||||
return FCKLang.FontFormat ;
|
return FCKLang.FontFormat ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarFontFormatCombo.prototype.GetStyles = function()
|
FCKToolbarFontFormatCombo.prototype.GetStyles = function()
|
||||||
{
|
{
|
||||||
var styles = {} ;
|
var styles = {} ;
|
||||||
|
|
||||||
// Get the format names from the language file.
|
// Get the format names from the language file.
|
||||||
var aNames = FCKLang['FontFormats'].split(';') ;
|
var aNames = FCKLang['FontFormats'].split(';') ;
|
||||||
var oNames = {
|
var oNames = {
|
||||||
p : aNames[0],
|
p : aNames[0],
|
||||||
pre : aNames[1],
|
pre : aNames[1],
|
||||||
address : aNames[2],
|
address : aNames[2],
|
||||||
h1 : aNames[3],
|
h1 : aNames[3],
|
||||||
h2 : aNames[4],
|
h2 : aNames[4],
|
||||||
h3 : aNames[5],
|
h3 : aNames[5],
|
||||||
h4 : aNames[6],
|
h4 : aNames[6],
|
||||||
h5 : aNames[7],
|
h5 : aNames[7],
|
||||||
h6 : aNames[8],
|
h6 : aNames[8],
|
||||||
div : aNames[9] || ( aNames[0] + ' (DIV)')
|
div : aNames[9] || ( aNames[0] + ' (DIV)')
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
// Get the available formats from the configuration file.
|
// Get the available formats from the configuration file.
|
||||||
var elements = FCKConfig.FontFormats.split(';') ;
|
var elements = FCKConfig.FontFormats.split(';') ;
|
||||||
|
|
||||||
for ( var i = 0 ; i < elements.length ; i++ )
|
for ( var i = 0 ; i < elements.length ; i++ )
|
||||||
{
|
{
|
||||||
var elementName = elements[ i ] ;
|
var elementName = elements[ i ] ;
|
||||||
var style = FCKStyles.GetStyle( '_FCK_' + elementName ) ;
|
var style = FCKStyles.GetStyle( '_FCK_' + elementName ) ;
|
||||||
if ( style )
|
if ( style )
|
||||||
{
|
{
|
||||||
style.Label = oNames[ elementName ] ;
|
style.Label = oNames[ elementName ] ;
|
||||||
styles[ '_FCK_' + elementName ] = style ;
|
styles[ '_FCK_' + elementName ] = style ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
alert( "The FCKConfig.CoreStyles['" + elementName + "'] setting was not found. Please check the fckconfig.js file" ) ;
|
alert( "The FCKConfig.CoreStyles['" + elementName + "'] setting was not found. Please check the fckconfig.js file" ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
return styles ;
|
return styles ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarFontFormatCombo.prototype.RefreshActiveItems = function( targetSpecialCombo )
|
FCKToolbarFontFormatCombo.prototype.RefreshActiveItems = function( targetSpecialCombo )
|
||||||
{
|
{
|
||||||
var startElement = FCK.ToolbarSet.CurrentInstance.Selection.GetBoundaryParentElement( true ) ;
|
var startElement = FCK.ToolbarSet.CurrentInstance.Selection.GetBoundaryParentElement( true ) ;
|
||||||
|
|
||||||
if ( startElement )
|
if ( startElement )
|
||||||
{
|
{
|
||||||
var path = new FCKElementPath( startElement ) ;
|
var path = new FCKElementPath( startElement ) ;
|
||||||
var blockElement = path.Block ;
|
var blockElement = path.Block ;
|
||||||
|
|
||||||
if ( blockElement )
|
if ( blockElement )
|
||||||
{
|
{
|
||||||
for ( var i in targetSpecialCombo.Items )
|
for ( var i in targetSpecialCombo.Items )
|
||||||
{
|
{
|
||||||
var item = targetSpecialCombo.Items[i] ;
|
var item = targetSpecialCombo.Items[i] ;
|
||||||
var style = item.Style ;
|
var style = item.Style ;
|
||||||
|
|
||||||
if ( style.CheckElementRemovable( blockElement ) )
|
if ( style.CheckElementRemovable( blockElement ) )
|
||||||
{
|
{
|
||||||
targetSpecialCombo.SetLabel( style.Label ) ;
|
targetSpecialCombo.SetLabel( style.Label ) ;
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
targetSpecialCombo.SetLabel( this.DefaultLabel ) ;
|
targetSpecialCombo.SetLabel( this.DefaultLabel ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarFontFormatCombo.prototype.StyleCombo_OnBeforeClick = function( targetSpecialCombo )
|
FCKToolbarFontFormatCombo.prototype.StyleCombo_OnBeforeClick = function( targetSpecialCombo )
|
||||||
{
|
{
|
||||||
// Clear the current selection.
|
// Clear the current selection.
|
||||||
targetSpecialCombo.DeselectAll() ;
|
targetSpecialCombo.DeselectAll() ;
|
||||||
|
|
||||||
var startElement = FCK.ToolbarSet.CurrentInstance.Selection.GetBoundaryParentElement( true ) ;
|
var startElement = FCK.ToolbarSet.CurrentInstance.Selection.GetBoundaryParentElement( true ) ;
|
||||||
|
|
||||||
if ( startElement )
|
if ( startElement )
|
||||||
{
|
{
|
||||||
var path = new FCKElementPath( startElement ) ;
|
var path = new FCKElementPath( startElement ) ;
|
||||||
var blockElement = path.Block ;
|
var blockElement = path.Block ;
|
||||||
|
|
||||||
for ( var i in targetSpecialCombo.Items )
|
for ( var i in targetSpecialCombo.Items )
|
||||||
{
|
{
|
||||||
var item = targetSpecialCombo.Items[i] ;
|
var item = targetSpecialCombo.Items[i] ;
|
||||||
var style = item.Style ;
|
var style = item.Style ;
|
||||||
|
|
||||||
if ( style.CheckElementRemovable( blockElement ) )
|
if ( style.CheckElementRemovable( blockElement ) )
|
||||||
{
|
{
|
||||||
targetSpecialCombo.SelectItem( item ) ;
|
targetSpecialCombo.SelectItem( item ) ;
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,98 +1,98 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKToolbarPanelButton Class: Handles the Fonts combo selector.
|
* FCKToolbarPanelButton Class: Handles the Fonts combo selector.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKToolbarFontsCombo = function( tooltip, style )
|
var FCKToolbarFontsCombo = function( tooltip, style )
|
||||||
{
|
{
|
||||||
this.CommandName = 'FontName' ;
|
this.CommandName = 'FontName' ;
|
||||||
this.Label = this.GetLabel() ;
|
this.Label = this.GetLabel() ;
|
||||||
this.Tooltip = tooltip ? tooltip : this.Label ;
|
this.Tooltip = tooltip ? tooltip : this.Label ;
|
||||||
this.Style = style ? style : FCK_TOOLBARITEM_ICONTEXT ;
|
this.Style = style ? style : FCK_TOOLBARITEM_ICONTEXT ;
|
||||||
|
|
||||||
this.DefaultLabel = FCKConfig.DefaultFontLabel || '' ;
|
this.DefaultLabel = FCKConfig.DefaultFontLabel || '' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Inherit from FCKToolbarSpecialCombo.
|
// Inherit from FCKToolbarSpecialCombo.
|
||||||
FCKToolbarFontsCombo.prototype = new FCKToolbarFontFormatCombo( false ) ;
|
FCKToolbarFontsCombo.prototype = new FCKToolbarFontFormatCombo( false ) ;
|
||||||
|
|
||||||
FCKToolbarFontsCombo.prototype.GetLabel = function()
|
FCKToolbarFontsCombo.prototype.GetLabel = function()
|
||||||
{
|
{
|
||||||
return FCKLang.Font ;
|
return FCKLang.Font ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarFontsCombo.prototype.GetStyles = function()
|
FCKToolbarFontsCombo.prototype.GetStyles = function()
|
||||||
{
|
{
|
||||||
var baseStyle = FCKStyles.GetStyle( '_FCK_FontFace' ) ;
|
var baseStyle = FCKStyles.GetStyle( '_FCK_FontFace' ) ;
|
||||||
|
|
||||||
if ( !baseStyle )
|
if ( !baseStyle )
|
||||||
{
|
{
|
||||||
alert( "The FCKConfig.CoreStyles['Size'] setting was not found. Please check the fckconfig.js file" ) ;
|
alert( "The FCKConfig.CoreStyles['Size'] setting was not found. Please check the fckconfig.js file" ) ;
|
||||||
return {} ;
|
return {} ;
|
||||||
}
|
}
|
||||||
|
|
||||||
var styles = {} ;
|
var styles = {} ;
|
||||||
|
|
||||||
var fonts = FCKConfig.FontNames.split(';') ;
|
var fonts = FCKConfig.FontNames.split(';') ;
|
||||||
|
|
||||||
for ( var i = 0 ; i < fonts.length ; i++ )
|
for ( var i = 0 ; i < fonts.length ; i++ )
|
||||||
{
|
{
|
||||||
var fontParts = fonts[i].split('/') ;
|
var fontParts = fonts[i].split('/') ;
|
||||||
var font = fontParts[0] ;
|
var font = fontParts[0] ;
|
||||||
var caption = fontParts[1] || font ;
|
var caption = fontParts[1] || font ;
|
||||||
|
|
||||||
var style = FCKTools.CloneObject( baseStyle ) ;
|
var style = FCKTools.CloneObject( baseStyle ) ;
|
||||||
|
|
||||||
style.SetVariable( 'Font', font ) ;
|
style.SetVariable( 'Font', font ) ;
|
||||||
style.Label = caption ;
|
style.Label = caption ;
|
||||||
|
|
||||||
styles[ caption ] = style ;
|
styles[ caption ] = style ;
|
||||||
}
|
}
|
||||||
|
|
||||||
return styles ;
|
return styles ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarFontsCombo.prototype.RefreshActiveItems = FCKToolbarStyleCombo.prototype.RefreshActiveItems ;
|
FCKToolbarFontsCombo.prototype.RefreshActiveItems = FCKToolbarStyleCombo.prototype.RefreshActiveItems ;
|
||||||
|
|
||||||
FCKToolbarFontsCombo.prototype.StyleCombo_OnBeforeClick = function( targetSpecialCombo )
|
FCKToolbarFontsCombo.prototype.StyleCombo_OnBeforeClick = function( targetSpecialCombo )
|
||||||
{
|
{
|
||||||
// Clear the current selection.
|
// Clear the current selection.
|
||||||
targetSpecialCombo.DeselectAll() ;
|
targetSpecialCombo.DeselectAll() ;
|
||||||
|
|
||||||
var startElement = FCKSelection.GetBoundaryParentElement( true ) ;
|
var startElement = FCKSelection.GetBoundaryParentElement( true ) ;
|
||||||
|
|
||||||
if ( startElement )
|
if ( startElement )
|
||||||
{
|
{
|
||||||
var path = new FCKElementPath( startElement ) ;
|
var path = new FCKElementPath( startElement ) ;
|
||||||
|
|
||||||
for ( var i in targetSpecialCombo.Items )
|
for ( var i in targetSpecialCombo.Items )
|
||||||
{
|
{
|
||||||
var item = targetSpecialCombo.Items[i] ;
|
var item = targetSpecialCombo.Items[i] ;
|
||||||
var style = item.Style ;
|
var style = item.Style ;
|
||||||
|
|
||||||
if ( style.CheckActive( path ) )
|
if ( style.CheckActive( path ) )
|
||||||
{
|
{
|
||||||
targetSpecialCombo.SelectItem( item ) ;
|
targetSpecialCombo.SelectItem( item ) ;
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,76 +1,76 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKToolbarPanelButton Class: Handles the Fonts combo selector.
|
* FCKToolbarPanelButton Class: Handles the Fonts combo selector.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKToolbarFontSizeCombo = function( tooltip, style )
|
var FCKToolbarFontSizeCombo = function( tooltip, style )
|
||||||
{
|
{
|
||||||
this.CommandName = 'FontSize' ;
|
this.CommandName = 'FontSize' ;
|
||||||
this.Label = this.GetLabel() ;
|
this.Label = this.GetLabel() ;
|
||||||
this.Tooltip = tooltip ? tooltip : this.Label ;
|
this.Tooltip = tooltip ? tooltip : this.Label ;
|
||||||
this.Style = style ? style : FCK_TOOLBARITEM_ICONTEXT ;
|
this.Style = style ? style : FCK_TOOLBARITEM_ICONTEXT ;
|
||||||
|
|
||||||
this.DefaultLabel = FCKConfig.DefaultFontSizeLabel || '' ;
|
this.DefaultLabel = FCKConfig.DefaultFontSizeLabel || '' ;
|
||||||
|
|
||||||
this.FieldWidth = 70 ;
|
this.FieldWidth = 70 ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Inherit from FCKToolbarSpecialCombo.
|
// Inherit from FCKToolbarSpecialCombo.
|
||||||
FCKToolbarFontSizeCombo.prototype = new FCKToolbarFontFormatCombo( false ) ;
|
FCKToolbarFontSizeCombo.prototype = new FCKToolbarFontFormatCombo( false ) ;
|
||||||
|
|
||||||
FCKToolbarFontSizeCombo.prototype.GetLabel = function()
|
FCKToolbarFontSizeCombo.prototype.GetLabel = function()
|
||||||
{
|
{
|
||||||
return FCKLang.FontSize ;
|
return FCKLang.FontSize ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarFontSizeCombo.prototype.GetStyles = function()
|
FCKToolbarFontSizeCombo.prototype.GetStyles = function()
|
||||||
{
|
{
|
||||||
var baseStyle = FCKStyles.GetStyle( '_FCK_Size' ) ;
|
var baseStyle = FCKStyles.GetStyle( '_FCK_Size' ) ;
|
||||||
|
|
||||||
if ( !baseStyle )
|
if ( !baseStyle )
|
||||||
{
|
{
|
||||||
alert( "The FCKConfig.CoreStyles['FontFace'] setting was not found. Please check the fckconfig.js file" ) ;
|
alert( "The FCKConfig.CoreStyles['FontFace'] setting was not found. Please check the fckconfig.js file" ) ;
|
||||||
return {} ;
|
return {} ;
|
||||||
}
|
}
|
||||||
|
|
||||||
var styles = {} ;
|
var styles = {} ;
|
||||||
|
|
||||||
var fonts = FCKConfig.FontSizes.split(';') ;
|
var fonts = FCKConfig.FontSizes.split(';') ;
|
||||||
|
|
||||||
for ( var i = 0 ; i < fonts.length ; i++ )
|
for ( var i = 0 ; i < fonts.length ; i++ )
|
||||||
{
|
{
|
||||||
var fontParts = fonts[i].split('/') ;
|
var fontParts = fonts[i].split('/') ;
|
||||||
var font = fontParts[0] ;
|
var font = fontParts[0] ;
|
||||||
var caption = fontParts[1] || font ;
|
var caption = fontParts[1] || font ;
|
||||||
|
|
||||||
var style = FCKTools.CloneObject( baseStyle ) ;
|
var style = FCKTools.CloneObject( baseStyle ) ;
|
||||||
style.SetVariable( 'Size', font ) ;
|
style.SetVariable( 'Size', font ) ;
|
||||||
style.Label = caption ;
|
style.Label = caption ;
|
||||||
|
|
||||||
styles[ caption ] = style ;
|
styles[ caption ] = style ;
|
||||||
}
|
}
|
||||||
|
|
||||||
return styles ;
|
return styles ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarFontSizeCombo.prototype.RefreshActiveItems = FCKToolbarStyleCombo.prototype.RefreshActiveItems ;
|
FCKToolbarFontSizeCombo.prototype.RefreshActiveItems = FCKToolbarStyleCombo.prototype.RefreshActiveItems ;
|
||||||
|
|
||||||
FCKToolbarFontSizeCombo.prototype.StyleCombo_OnBeforeClick = FCKToolbarFontsCombo.prototype.StyleCombo_OnBeforeClick ;
|
FCKToolbarFontSizeCombo.prototype.StyleCombo_OnBeforeClick = FCKToolbarFontsCombo.prototype.StyleCombo_OnBeforeClick ;
|
||||||
|
@ -1,103 +1,103 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKToolbarPanelButton Class: represents a special button in the toolbar
|
* FCKToolbarPanelButton Class: represents a special button in the toolbar
|
||||||
* that shows a panel when pressed.
|
* that shows a panel when pressed.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKToolbarPanelButton = function( commandName, label, tooltip, style, icon )
|
var FCKToolbarPanelButton = function( commandName, label, tooltip, style, icon )
|
||||||
{
|
{
|
||||||
this.CommandName = commandName ;
|
this.CommandName = commandName ;
|
||||||
|
|
||||||
var oIcon ;
|
var oIcon ;
|
||||||
|
|
||||||
if ( icon == null )
|
if ( icon == null )
|
||||||
oIcon = FCKConfig.SkinPath + 'toolbar/' + commandName.toLowerCase() + '.gif' ;
|
oIcon = FCKConfig.SkinPath + 'toolbar/' + commandName.toLowerCase() + '.gif' ;
|
||||||
else if ( typeof( icon ) == 'number' )
|
else if ( typeof( icon ) == 'number' )
|
||||||
oIcon = [ FCKConfig.SkinPath + 'fck_strip.gif', 16, icon ] ;
|
oIcon = [ FCKConfig.SkinPath + 'fck_strip.gif', 16, icon ] ;
|
||||||
|
|
||||||
var oUIButton = this._UIButton = new FCKToolbarButtonUI( commandName, label, tooltip, oIcon, style ) ;
|
var oUIButton = this._UIButton = new FCKToolbarButtonUI( commandName, label, tooltip, oIcon, style ) ;
|
||||||
oUIButton._FCKToolbarPanelButton = this ;
|
oUIButton._FCKToolbarPanelButton = this ;
|
||||||
oUIButton.ShowArrow = true ;
|
oUIButton.ShowArrow = true ;
|
||||||
oUIButton.OnClick = FCKToolbarPanelButton_OnButtonClick ;
|
oUIButton.OnClick = FCKToolbarPanelButton_OnButtonClick ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarPanelButton.prototype.TypeName = 'FCKToolbarPanelButton' ;
|
FCKToolbarPanelButton.prototype.TypeName = 'FCKToolbarPanelButton' ;
|
||||||
|
|
||||||
FCKToolbarPanelButton.prototype.Create = function( parentElement )
|
FCKToolbarPanelButton.prototype.Create = function( parentElement )
|
||||||
{
|
{
|
||||||
parentElement.className += 'Menu' ;
|
parentElement.className += 'Menu' ;
|
||||||
|
|
||||||
this._UIButton.Create( parentElement ) ;
|
this._UIButton.Create( parentElement ) ;
|
||||||
|
|
||||||
var oPanel = FCK.ToolbarSet.CurrentInstance.Commands.GetCommand( this.CommandName )._Panel ;
|
var oPanel = FCK.ToolbarSet.CurrentInstance.Commands.GetCommand( this.CommandName )._Panel ;
|
||||||
this.RegisterPanel( oPanel ) ;
|
this.RegisterPanel( oPanel ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarPanelButton.prototype.RegisterPanel = function( oPanel )
|
FCKToolbarPanelButton.prototype.RegisterPanel = function( oPanel )
|
||||||
{
|
{
|
||||||
if ( oPanel._FCKToolbarPanelButton )
|
if ( oPanel._FCKToolbarPanelButton )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
oPanel._FCKToolbarPanelButton = this ;
|
oPanel._FCKToolbarPanelButton = this ;
|
||||||
|
|
||||||
var eLineDiv = oPanel.Document.body.appendChild( oPanel.Document.createElement( 'div' ) ) ;
|
var eLineDiv = oPanel.Document.body.appendChild( oPanel.Document.createElement( 'div' ) ) ;
|
||||||
eLineDiv.style.position = 'absolute' ;
|
eLineDiv.style.position = 'absolute' ;
|
||||||
eLineDiv.style.top = '0px' ;
|
eLineDiv.style.top = '0px' ;
|
||||||
|
|
||||||
var eLine = oPanel._FCKToolbarPanelButtonLineDiv = eLineDiv.appendChild( oPanel.Document.createElement( 'IMG' ) ) ;
|
var eLine = oPanel._FCKToolbarPanelButtonLineDiv = eLineDiv.appendChild( oPanel.Document.createElement( 'IMG' ) ) ;
|
||||||
eLine.className = 'TB_ConnectionLine' ;
|
eLine.className = 'TB_ConnectionLine' ;
|
||||||
eLine.style.position = 'absolute' ;
|
eLine.style.position = 'absolute' ;
|
||||||
// eLine.style.backgroundColor = 'Red' ;
|
// eLine.style.backgroundColor = 'Red' ;
|
||||||
eLine.src = FCK_SPACER_PATH ;
|
eLine.src = FCK_SPACER_PATH ;
|
||||||
|
|
||||||
oPanel.OnHide = FCKToolbarPanelButton_OnPanelHide ;
|
oPanel.OnHide = FCKToolbarPanelButton_OnPanelHide ;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Events
|
Events
|
||||||
*/
|
*/
|
||||||
|
|
||||||
function FCKToolbarPanelButton_OnButtonClick( toolbarButton )
|
function FCKToolbarPanelButton_OnButtonClick( toolbarButton )
|
||||||
{
|
{
|
||||||
var oButton = this._FCKToolbarPanelButton ;
|
var oButton = this._FCKToolbarPanelButton ;
|
||||||
var e = oButton._UIButton.MainElement ;
|
var e = oButton._UIButton.MainElement ;
|
||||||
|
|
||||||
oButton._UIButton.ChangeState( FCK_TRISTATE_ON ) ;
|
oButton._UIButton.ChangeState( FCK_TRISTATE_ON ) ;
|
||||||
|
|
||||||
// oButton.LineImg.style.width = ( e.offsetWidth - 2 ) + 'px' ;
|
// oButton.LineImg.style.width = ( e.offsetWidth - 2 ) + 'px' ;
|
||||||
|
|
||||||
var oCommand = FCK.ToolbarSet.CurrentInstance.Commands.GetCommand( oButton.CommandName ) ;
|
var oCommand = FCK.ToolbarSet.CurrentInstance.Commands.GetCommand( oButton.CommandName ) ;
|
||||||
var oPanel = oCommand._Panel ;
|
var oPanel = oCommand._Panel ;
|
||||||
oPanel._FCKToolbarPanelButtonLineDiv.style.width = ( e.offsetWidth - 2 ) + 'px' ;
|
oPanel._FCKToolbarPanelButtonLineDiv.style.width = ( e.offsetWidth - 2 ) + 'px' ;
|
||||||
oCommand.Execute( 0, e.offsetHeight - 1, e ) ; // -1 to be over the border
|
oCommand.Execute( 0, e.offsetHeight - 1, e ) ; // -1 to be over the border
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKToolbarPanelButton_OnPanelHide()
|
function FCKToolbarPanelButton_OnPanelHide()
|
||||||
{
|
{
|
||||||
var oMenuButton = this._FCKToolbarPanelButton ;
|
var oMenuButton = this._FCKToolbarPanelButton ;
|
||||||
oMenuButton._UIButton.ChangeState( FCK_TRISTATE_OFF ) ;
|
oMenuButton._UIButton.ChangeState( FCK_TRISTATE_OFF ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The Panel Button works like a normal button so the refresh state functions
|
// The Panel Button works like a normal button so the refresh state functions
|
||||||
// defined for the normal button can be reused here.
|
// defined for the normal button can be reused here.
|
||||||
FCKToolbarPanelButton.prototype.RefreshState = FCKToolbarButton.prototype.RefreshState ;
|
FCKToolbarPanelButton.prototype.RefreshState = FCKToolbarButton.prototype.RefreshState ;
|
||||||
FCKToolbarPanelButton.prototype.Enable = FCKToolbarButton.prototype.Enable ;
|
FCKToolbarPanelButton.prototype.Enable = FCKToolbarButton.prototype.Enable ;
|
||||||
FCKToolbarPanelButton.prototype.Disable = FCKToolbarButton.prototype.Disable ;
|
FCKToolbarPanelButton.prototype.Disable = FCKToolbarButton.prototype.Disable ;
|
||||||
|
@ -1,146 +1,146 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKToolbarSpecialCombo Class: This is a "abstract" base class to be used
|
* FCKToolbarSpecialCombo Class: This is a "abstract" base class to be used
|
||||||
* by the special combo toolbar elements like font name, font size, paragraph format, etc...
|
* by the special combo toolbar elements like font name, font size, paragraph format, etc...
|
||||||
*
|
*
|
||||||
* The following properties and methods must be implemented when inheriting from
|
* The following properties and methods must be implemented when inheriting from
|
||||||
* this class:
|
* this class:
|
||||||
* - Property: CommandName [ The command name to be executed ]
|
* - Property: CommandName [ The command name to be executed ]
|
||||||
* - Method: GetLabel() [ Returns the label ]
|
* - Method: GetLabel() [ Returns the label ]
|
||||||
* - CreateItems( targetSpecialCombo ) [ Add all items in the special combo ]
|
* - CreateItems( targetSpecialCombo ) [ Add all items in the special combo ]
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKToolbarSpecialCombo = function()
|
var FCKToolbarSpecialCombo = function()
|
||||||
{
|
{
|
||||||
this.SourceView = false ;
|
this.SourceView = false ;
|
||||||
this.ContextSensitive = true ;
|
this.ContextSensitive = true ;
|
||||||
this.FieldWidth = null ;
|
this.FieldWidth = null ;
|
||||||
this.PanelWidth = null ;
|
this.PanelWidth = null ;
|
||||||
this.PanelMaxHeight = null ;
|
this.PanelMaxHeight = null ;
|
||||||
//this._LastValue = null ;
|
//this._LastValue = null ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
FCKToolbarSpecialCombo.prototype.DefaultLabel = '' ;
|
FCKToolbarSpecialCombo.prototype.DefaultLabel = '' ;
|
||||||
|
|
||||||
function FCKToolbarSpecialCombo_OnSelect( itemId, item )
|
function FCKToolbarSpecialCombo_OnSelect( itemId, item )
|
||||||
{
|
{
|
||||||
FCK.ToolbarSet.CurrentInstance.Commands.GetCommand( this.CommandName ).Execute( itemId, item ) ;
|
FCK.ToolbarSet.CurrentInstance.Commands.GetCommand( this.CommandName ).Execute( itemId, item ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarSpecialCombo.prototype.Create = function( targetElement )
|
FCKToolbarSpecialCombo.prototype.Create = function( targetElement )
|
||||||
{
|
{
|
||||||
this._Combo = new FCKSpecialCombo( this.GetLabel(), this.FieldWidth, this.PanelWidth, this.PanelMaxHeight, FCKBrowserInfo.IsIE ? window : FCKTools.GetElementWindow( targetElement ).parent ) ;
|
this._Combo = new FCKSpecialCombo( this.GetLabel(), this.FieldWidth, this.PanelWidth, this.PanelMaxHeight, FCKBrowserInfo.IsIE ? window : FCKTools.GetElementWindow( targetElement ).parent ) ;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
this._Combo.FieldWidth = this.FieldWidth != null ? this.FieldWidth : 100 ;
|
this._Combo.FieldWidth = this.FieldWidth != null ? this.FieldWidth : 100 ;
|
||||||
this._Combo.PanelWidth = this.PanelWidth != null ? this.PanelWidth : 150 ;
|
this._Combo.PanelWidth = this.PanelWidth != null ? this.PanelWidth : 150 ;
|
||||||
this._Combo.PanelMaxHeight = this.PanelMaxHeight != null ? this.PanelMaxHeight : 150 ;
|
this._Combo.PanelMaxHeight = this.PanelMaxHeight != null ? this.PanelMaxHeight : 150 ;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//this._Combo.Command.Name = this.Command.Name;
|
//this._Combo.Command.Name = this.Command.Name;
|
||||||
// this._Combo.Label = this.Label ;
|
// this._Combo.Label = this.Label ;
|
||||||
this._Combo.Tooltip = this.Tooltip ;
|
this._Combo.Tooltip = this.Tooltip ;
|
||||||
this._Combo.Style = this.Style ;
|
this._Combo.Style = this.Style ;
|
||||||
|
|
||||||
this.CreateItems( this._Combo ) ;
|
this.CreateItems( this._Combo ) ;
|
||||||
|
|
||||||
this._Combo.Create( targetElement ) ;
|
this._Combo.Create( targetElement ) ;
|
||||||
|
|
||||||
this._Combo.CommandName = this.CommandName ;
|
this._Combo.CommandName = this.CommandName ;
|
||||||
|
|
||||||
this._Combo.OnSelect = FCKToolbarSpecialCombo_OnSelect ;
|
this._Combo.OnSelect = FCKToolbarSpecialCombo_OnSelect ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKToolbarSpecialCombo_RefreshActiveItems( combo, value )
|
function FCKToolbarSpecialCombo_RefreshActiveItems( combo, value )
|
||||||
{
|
{
|
||||||
combo.DeselectAll() ;
|
combo.DeselectAll() ;
|
||||||
combo.SelectItem( value ) ;
|
combo.SelectItem( value ) ;
|
||||||
combo.SetLabelById( value ) ;
|
combo.SetLabelById( value ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarSpecialCombo.prototype.RefreshState = function()
|
FCKToolbarSpecialCombo.prototype.RefreshState = function()
|
||||||
{
|
{
|
||||||
// Gets the actual state.
|
// Gets the actual state.
|
||||||
var eState ;
|
var eState ;
|
||||||
|
|
||||||
// if ( FCK.EditMode == FCK_EDITMODE_SOURCE && ! this.SourceView )
|
// if ( FCK.EditMode == FCK_EDITMODE_SOURCE && ! this.SourceView )
|
||||||
// eState = FCK_TRISTATE_DISABLED ;
|
// eState = FCK_TRISTATE_DISABLED ;
|
||||||
// else
|
// else
|
||||||
// {
|
// {
|
||||||
var sValue = FCK.ToolbarSet.CurrentInstance.Commands.GetCommand( this.CommandName ).GetState() ;
|
var sValue = FCK.ToolbarSet.CurrentInstance.Commands.GetCommand( this.CommandName ).GetState() ;
|
||||||
|
|
||||||
// FCKDebug.Output( 'RefreshState of Special Combo "' + this.TypeOf + '" - State: ' + sValue ) ;
|
// FCKDebug.Output( 'RefreshState of Special Combo "' + this.TypeOf + '" - State: ' + sValue ) ;
|
||||||
|
|
||||||
if ( sValue != FCK_TRISTATE_DISABLED )
|
if ( sValue != FCK_TRISTATE_DISABLED )
|
||||||
{
|
{
|
||||||
eState = FCK_TRISTATE_ON ;
|
eState = FCK_TRISTATE_ON ;
|
||||||
|
|
||||||
if ( this.RefreshActiveItems )
|
if ( this.RefreshActiveItems )
|
||||||
this.RefreshActiveItems( this._Combo, sValue ) ;
|
this.RefreshActiveItems( this._Combo, sValue ) ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ( this._LastValue !== sValue)
|
if ( this._LastValue !== sValue)
|
||||||
{
|
{
|
||||||
this._LastValue = sValue ;
|
this._LastValue = sValue ;
|
||||||
|
|
||||||
if ( !sValue || sValue.length == 0 )
|
if ( !sValue || sValue.length == 0 )
|
||||||
{
|
{
|
||||||
this._Combo.DeselectAll() ;
|
this._Combo.DeselectAll() ;
|
||||||
this._Combo.SetLabel( this.DefaultLabel ) ;
|
this._Combo.SetLabel( this.DefaultLabel ) ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
FCKToolbarSpecialCombo_RefreshActiveItems( this._Combo, sValue ) ;
|
FCKToolbarSpecialCombo_RefreshActiveItems( this._Combo, sValue ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
eState = FCK_TRISTATE_DISABLED ;
|
eState = FCK_TRISTATE_DISABLED ;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// If there are no state changes then do nothing and return.
|
// If there are no state changes then do nothing and return.
|
||||||
if ( eState == this.State ) return ;
|
if ( eState == this.State ) return ;
|
||||||
|
|
||||||
if ( eState == FCK_TRISTATE_DISABLED )
|
if ( eState == FCK_TRISTATE_DISABLED )
|
||||||
{
|
{
|
||||||
this._Combo.DeselectAll() ;
|
this._Combo.DeselectAll() ;
|
||||||
this._Combo.SetLabel( '' ) ;
|
this._Combo.SetLabel( '' ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sets the actual state.
|
// Sets the actual state.
|
||||||
this.State = eState ;
|
this.State = eState ;
|
||||||
|
|
||||||
// Updates the graphical state.
|
// Updates the graphical state.
|
||||||
this._Combo.SetEnabled( eState != FCK_TRISTATE_DISABLED ) ;
|
this._Combo.SetEnabled( eState != FCK_TRISTATE_DISABLED ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarSpecialCombo.prototype.Enable = function()
|
FCKToolbarSpecialCombo.prototype.Enable = function()
|
||||||
{
|
{
|
||||||
this.RefreshState() ;
|
this.RefreshState() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarSpecialCombo.prototype.Disable = function()
|
FCKToolbarSpecialCombo.prototype.Disable = function()
|
||||||
{
|
{
|
||||||
this.State = FCK_TRISTATE_DISABLED ;
|
this.State = FCK_TRISTATE_DISABLED ;
|
||||||
this._Combo.DeselectAll() ;
|
this._Combo.DeselectAll() ;
|
||||||
this._Combo.SetLabel( '' ) ;
|
this._Combo.SetLabel( '' ) ;
|
||||||
this._Combo.SetEnabled( false ) ;
|
this._Combo.SetEnabled( false ) ;
|
||||||
}
|
}
|
||||||
|
@ -1,200 +1,200 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKToolbarPanelButton Class: Handles the Fonts combo selector.
|
* FCKToolbarPanelButton Class: Handles the Fonts combo selector.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKToolbarStyleCombo = function( tooltip, style )
|
var FCKToolbarStyleCombo = function( tooltip, style )
|
||||||
{
|
{
|
||||||
if ( tooltip === false )
|
if ( tooltip === false )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
this.CommandName = 'Style' ;
|
this.CommandName = 'Style' ;
|
||||||
this.Label = this.GetLabel() ;
|
this.Label = this.GetLabel() ;
|
||||||
this.Tooltip = tooltip ? tooltip : this.Label ;
|
this.Tooltip = tooltip ? tooltip : this.Label ;
|
||||||
this.Style = style ? style : FCK_TOOLBARITEM_ICONTEXT ;
|
this.Style = style ? style : FCK_TOOLBARITEM_ICONTEXT ;
|
||||||
|
|
||||||
this.DefaultLabel = FCKConfig.DefaultStyleLabel || '' ;
|
this.DefaultLabel = FCKConfig.DefaultStyleLabel || '' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Inherit from FCKToolbarSpecialCombo.
|
// Inherit from FCKToolbarSpecialCombo.
|
||||||
FCKToolbarStyleCombo.prototype = new FCKToolbarSpecialCombo ;
|
FCKToolbarStyleCombo.prototype = new FCKToolbarSpecialCombo ;
|
||||||
|
|
||||||
FCKToolbarStyleCombo.prototype.GetLabel = function()
|
FCKToolbarStyleCombo.prototype.GetLabel = function()
|
||||||
{
|
{
|
||||||
return FCKLang.Style ;
|
return FCKLang.Style ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarStyleCombo.prototype.GetStyles = function()
|
FCKToolbarStyleCombo.prototype.GetStyles = function()
|
||||||
{
|
{
|
||||||
var styles = {} ;
|
var styles = {} ;
|
||||||
var allStyles = FCK.ToolbarSet.CurrentInstance.Styles.GetStyles() ;
|
var allStyles = FCK.ToolbarSet.CurrentInstance.Styles.GetStyles() ;
|
||||||
|
|
||||||
for ( var styleName in allStyles )
|
for ( var styleName in allStyles )
|
||||||
{
|
{
|
||||||
var style = allStyles[ styleName ] ;
|
var style = allStyles[ styleName ] ;
|
||||||
if ( !style.IsCore )
|
if ( !style.IsCore )
|
||||||
styles[ styleName ] = style ;
|
styles[ styleName ] = style ;
|
||||||
}
|
}
|
||||||
return styles ;
|
return styles ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarStyleCombo.prototype.CreateItems = function( targetSpecialCombo )
|
FCKToolbarStyleCombo.prototype.CreateItems = function( targetSpecialCombo )
|
||||||
{
|
{
|
||||||
var targetDoc = targetSpecialCombo._Panel.Document ;
|
var targetDoc = targetSpecialCombo._Panel.Document ;
|
||||||
|
|
||||||
// Add the Editor Area CSS to the panel so the style classes are previewed correctly.
|
// Add the Editor Area CSS to the panel so the style classes are previewed correctly.
|
||||||
FCKTools.AppendStyleSheet( targetDoc, FCKConfig.ToolbarComboPreviewCSS ) ;
|
FCKTools.AppendStyleSheet( targetDoc, FCKConfig.ToolbarComboPreviewCSS ) ;
|
||||||
FCKTools.AppendStyleString( targetDoc, FCKConfig.EditorAreaStyles ) ;
|
FCKTools.AppendStyleString( targetDoc, FCKConfig.EditorAreaStyles ) ;
|
||||||
targetDoc.body.className += ' ForceBaseFont' ;
|
targetDoc.body.className += ' ForceBaseFont' ;
|
||||||
|
|
||||||
// Add ID and Class to the body.
|
// Add ID and Class to the body.
|
||||||
FCKConfig.ApplyBodyAttributes( targetDoc.body ) ;
|
FCKConfig.ApplyBodyAttributes( targetDoc.body ) ;
|
||||||
|
|
||||||
// Get the styles list.
|
// Get the styles list.
|
||||||
var styles = this.GetStyles() ;
|
var styles = this.GetStyles() ;
|
||||||
|
|
||||||
for ( var styleName in styles )
|
for ( var styleName in styles )
|
||||||
{
|
{
|
||||||
var style = styles[ styleName ] ;
|
var style = styles[ styleName ] ;
|
||||||
|
|
||||||
// Object type styles have no preview.
|
// Object type styles have no preview.
|
||||||
var caption = style.GetType() == FCK_STYLE_OBJECT ?
|
var caption = style.GetType() == FCK_STYLE_OBJECT ?
|
||||||
styleName :
|
styleName :
|
||||||
FCKToolbarStyleCombo_BuildPreview( style, style.Label || styleName ) ;
|
FCKToolbarStyleCombo_BuildPreview( style, style.Label || styleName ) ;
|
||||||
|
|
||||||
var item = targetSpecialCombo.AddItem( styleName, caption ) ;
|
var item = targetSpecialCombo.AddItem( styleName, caption ) ;
|
||||||
|
|
||||||
item.Style = style ;
|
item.Style = style ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We must prepare the list before showing it.
|
// We must prepare the list before showing it.
|
||||||
targetSpecialCombo.OnBeforeClick = this.StyleCombo_OnBeforeClick ;
|
targetSpecialCombo.OnBeforeClick = this.StyleCombo_OnBeforeClick ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarStyleCombo.prototype.RefreshActiveItems = function( targetSpecialCombo )
|
FCKToolbarStyleCombo.prototype.RefreshActiveItems = function( targetSpecialCombo )
|
||||||
{
|
{
|
||||||
var startElement = FCK.ToolbarSet.CurrentInstance.Selection.GetBoundaryParentElement( true ) ;
|
var startElement = FCK.ToolbarSet.CurrentInstance.Selection.GetBoundaryParentElement( true ) ;
|
||||||
|
|
||||||
if ( startElement )
|
if ( startElement )
|
||||||
{
|
{
|
||||||
var path = new FCKElementPath( startElement ) ;
|
var path = new FCKElementPath( startElement ) ;
|
||||||
var elements = path.Elements ;
|
var elements = path.Elements ;
|
||||||
|
|
||||||
for ( var e = 0 ; e < elements.length ; e++ )
|
for ( var e = 0 ; e < elements.length ; e++ )
|
||||||
{
|
{
|
||||||
for ( var i in targetSpecialCombo.Items )
|
for ( var i in targetSpecialCombo.Items )
|
||||||
{
|
{
|
||||||
var item = targetSpecialCombo.Items[i] ;
|
var item = targetSpecialCombo.Items[i] ;
|
||||||
var style = item.Style ;
|
var style = item.Style ;
|
||||||
|
|
||||||
if ( style.CheckElementRemovable( elements[ e ], true ) )
|
if ( style.CheckElementRemovable( elements[ e ], true ) )
|
||||||
{
|
{
|
||||||
targetSpecialCombo.SetLabel( style.Label || style.Name ) ;
|
targetSpecialCombo.SetLabel( style.Label || style.Name ) ;
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
targetSpecialCombo.SetLabel( this.DefaultLabel ) ;
|
targetSpecialCombo.SetLabel( this.DefaultLabel ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKToolbarStyleCombo.prototype.StyleCombo_OnBeforeClick = function( targetSpecialCombo )
|
FCKToolbarStyleCombo.prototype.StyleCombo_OnBeforeClick = function( targetSpecialCombo )
|
||||||
{
|
{
|
||||||
// Two things are done here:
|
// Two things are done here:
|
||||||
// - In a control selection, get the element name, so we'll display styles
|
// - In a control selection, get the element name, so we'll display styles
|
||||||
// for that element only.
|
// for that element only.
|
||||||
// - Select the styles that are active for the current selection.
|
// - Select the styles that are active for the current selection.
|
||||||
|
|
||||||
// Clear the current selection.
|
// Clear the current selection.
|
||||||
targetSpecialCombo.DeselectAll() ;
|
targetSpecialCombo.DeselectAll() ;
|
||||||
|
|
||||||
var startElement ;
|
var startElement ;
|
||||||
var path ;
|
var path ;
|
||||||
var tagName ;
|
var tagName ;
|
||||||
|
|
||||||
var selection = FCK.ToolbarSet.CurrentInstance.Selection ;
|
var selection = FCK.ToolbarSet.CurrentInstance.Selection ;
|
||||||
|
|
||||||
if ( selection.GetType() == 'Control' )
|
if ( selection.GetType() == 'Control' )
|
||||||
{
|
{
|
||||||
startElement = selection.GetSelectedElement() ;
|
startElement = selection.GetSelectedElement() ;
|
||||||
tagName = startElement.nodeName.toLowerCase() ;
|
tagName = startElement.nodeName.toLowerCase() ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
startElement = selection.GetBoundaryParentElement( true ) ;
|
startElement = selection.GetBoundaryParentElement( true ) ;
|
||||||
path = new FCKElementPath( startElement ) ;
|
path = new FCKElementPath( startElement ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( var i in targetSpecialCombo.Items )
|
for ( var i in targetSpecialCombo.Items )
|
||||||
{
|
{
|
||||||
var item = targetSpecialCombo.Items[i] ;
|
var item = targetSpecialCombo.Items[i] ;
|
||||||
var style = item.Style ;
|
var style = item.Style ;
|
||||||
|
|
||||||
if ( ( tagName && style.Element == tagName ) || ( !tagName && style.GetType() != FCK_STYLE_OBJECT ) )
|
if ( ( tagName && style.Element == tagName ) || ( !tagName && style.GetType() != FCK_STYLE_OBJECT ) )
|
||||||
{
|
{
|
||||||
item.style.display = '' ;
|
item.style.display = '' ;
|
||||||
|
|
||||||
if ( ( path && style.CheckActive( path ) ) || ( !path && style.CheckElementRemovable( startElement, true ) ) )
|
if ( ( path && style.CheckActive( path ) ) || ( !path && style.CheckElementRemovable( startElement, true ) ) )
|
||||||
targetSpecialCombo.SelectItem( style.Name ) ;
|
targetSpecialCombo.SelectItem( style.Name ) ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
item.style.display = 'none' ;
|
item.style.display = 'none' ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKToolbarStyleCombo_BuildPreview( style, caption )
|
function FCKToolbarStyleCombo_BuildPreview( style, caption )
|
||||||
{
|
{
|
||||||
var styleType = style.GetType() ;
|
var styleType = style.GetType() ;
|
||||||
var html = [] ;
|
var html = [] ;
|
||||||
|
|
||||||
if ( styleType == FCK_STYLE_BLOCK )
|
if ( styleType == FCK_STYLE_BLOCK )
|
||||||
html.push( '<div class="BaseFont">' ) ;
|
html.push( '<div class="BaseFont">' ) ;
|
||||||
|
|
||||||
var elementName = style.Element ;
|
var elementName = style.Element ;
|
||||||
|
|
||||||
// Avoid <bdo> in the preview.
|
// Avoid <bdo> in the preview.
|
||||||
if ( elementName == 'bdo' )
|
if ( elementName == 'bdo' )
|
||||||
elementName = 'span' ;
|
elementName = 'span' ;
|
||||||
|
|
||||||
html = [ '<', elementName ] ;
|
html = [ '<', elementName ] ;
|
||||||
|
|
||||||
// Assign all defined attributes.
|
// Assign all defined attributes.
|
||||||
var attribs = style._StyleDesc.Attributes ;
|
var attribs = style._StyleDesc.Attributes ;
|
||||||
if ( attribs )
|
if ( attribs )
|
||||||
{
|
{
|
||||||
for ( var att in attribs )
|
for ( var att in attribs )
|
||||||
{
|
{
|
||||||
html.push( ' ', att, '="', style.GetFinalAttributeValue( att ), '"' ) ;
|
html.push( ' ', att, '="', style.GetFinalAttributeValue( att ), '"' ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assign the style attribute.
|
// Assign the style attribute.
|
||||||
if ( style._GetStyleText().length > 0 )
|
if ( style._GetStyleText().length > 0 )
|
||||||
html.push( ' style="', style.GetFinalStyleValue(), '"' ) ;
|
html.push( ' style="', style.GetFinalStyleValue(), '"' ) ;
|
||||||
|
|
||||||
html.push( '>', caption, '</', elementName, '>' ) ;
|
html.push( '>', caption, '</', elementName, '>' ) ;
|
||||||
|
|
||||||
if ( styleType == FCK_STYLE_BLOCK )
|
if ( styleType == FCK_STYLE_BLOCK )
|
||||||
html.push( '</div>' ) ;
|
html.push( '</div>' ) ;
|
||||||
|
|
||||||
return html.join( '' ) ;
|
return html.join( '' ) ;
|
||||||
}
|
}
|
||||||
|
@ -1,451 +1,451 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* This class partially implements the W3C DOM Range for browser that don't
|
* This class partially implements the W3C DOM Range for browser that don't
|
||||||
* support the standards (like IE):
|
* support the standards (like IE):
|
||||||
* http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html
|
* http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKW3CRange = function( parentDocument )
|
var FCKW3CRange = function( parentDocument )
|
||||||
{
|
{
|
||||||
this._Document = parentDocument ;
|
this._Document = parentDocument ;
|
||||||
|
|
||||||
this.startContainer = null ;
|
this.startContainer = null ;
|
||||||
this.startOffset = null ;
|
this.startOffset = null ;
|
||||||
this.endContainer = null ;
|
this.endContainer = null ;
|
||||||
this.endOffset = null ;
|
this.endOffset = null ;
|
||||||
this.collapsed = true ;
|
this.collapsed = true ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKW3CRange.CreateRange = function( parentDocument )
|
FCKW3CRange.CreateRange = function( parentDocument )
|
||||||
{
|
{
|
||||||
// We could opt to use the Range implementation of the browsers. The problem
|
// We could opt to use the Range implementation of the browsers. The problem
|
||||||
// is that every browser have different bugs on their implementations,
|
// is that every browser have different bugs on their implementations,
|
||||||
// mostly related to different interpretations of the W3C specifications.
|
// mostly related to different interpretations of the W3C specifications.
|
||||||
// So, for now, let's use our implementation and pray for browsers fixings
|
// So, for now, let's use our implementation and pray for browsers fixings
|
||||||
// soon. Otherwise will go crazy on trying to find out workarounds.
|
// soon. Otherwise will go crazy on trying to find out workarounds.
|
||||||
/*
|
/*
|
||||||
// Get the browser implementation of the range, if available.
|
// Get the browser implementation of the range, if available.
|
||||||
if ( parentDocument.createRange )
|
if ( parentDocument.createRange )
|
||||||
{
|
{
|
||||||
var range = parentDocument.createRange() ;
|
var range = parentDocument.createRange() ;
|
||||||
if ( typeof( range.startContainer ) != 'undefined' )
|
if ( typeof( range.startContainer ) != 'undefined' )
|
||||||
return range ;
|
return range ;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
return new FCKW3CRange( parentDocument ) ;
|
return new FCKW3CRange( parentDocument ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKW3CRange.CreateFromRange = function( parentDocument, sourceRange )
|
FCKW3CRange.CreateFromRange = function( parentDocument, sourceRange )
|
||||||
{
|
{
|
||||||
var range = FCKW3CRange.CreateRange( parentDocument ) ;
|
var range = FCKW3CRange.CreateRange( parentDocument ) ;
|
||||||
range.setStart( sourceRange.startContainer, sourceRange.startOffset ) ;
|
range.setStart( sourceRange.startContainer, sourceRange.startOffset ) ;
|
||||||
range.setEnd( sourceRange.endContainer, sourceRange.endOffset ) ;
|
range.setEnd( sourceRange.endContainer, sourceRange.endOffset ) ;
|
||||||
return range ;
|
return range ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKW3CRange.prototype =
|
FCKW3CRange.prototype =
|
||||||
{
|
{
|
||||||
|
|
||||||
_UpdateCollapsed : function()
|
_UpdateCollapsed : function()
|
||||||
{
|
{
|
||||||
this.collapsed = ( this.startContainer == this.endContainer && this.startOffset == this.endOffset ) ;
|
this.collapsed = ( this.startContainer == this.endContainer && this.startOffset == this.endOffset ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
// W3C requires a check for the new position. If it is after the end
|
// W3C requires a check for the new position. If it is after the end
|
||||||
// boundary, the range should be collapsed to the new start. It seams we
|
// boundary, the range should be collapsed to the new start. It seams we
|
||||||
// will not need this check for our use of this class so we can ignore it for now.
|
// will not need this check for our use of this class so we can ignore it for now.
|
||||||
setStart : function( refNode, offset )
|
setStart : function( refNode, offset )
|
||||||
{
|
{
|
||||||
this.startContainer = refNode ;
|
this.startContainer = refNode ;
|
||||||
this.startOffset = offset ;
|
this.startOffset = offset ;
|
||||||
|
|
||||||
if ( !this.endContainer )
|
if ( !this.endContainer )
|
||||||
{
|
{
|
||||||
this.endContainer = refNode ;
|
this.endContainer = refNode ;
|
||||||
this.endOffset = offset ;
|
this.endOffset = offset ;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._UpdateCollapsed() ;
|
this._UpdateCollapsed() ;
|
||||||
},
|
},
|
||||||
|
|
||||||
// W3C requires a check for the new position. If it is before the start
|
// W3C requires a check for the new position. If it is before the start
|
||||||
// boundary, the range should be collapsed to the new end. It seams we
|
// boundary, the range should be collapsed to the new end. It seams we
|
||||||
// will not need this check for our use of this class so we can ignore it for now.
|
// will not need this check for our use of this class so we can ignore it for now.
|
||||||
setEnd : function( refNode, offset )
|
setEnd : function( refNode, offset )
|
||||||
{
|
{
|
||||||
this.endContainer = refNode ;
|
this.endContainer = refNode ;
|
||||||
this.endOffset = offset ;
|
this.endOffset = offset ;
|
||||||
|
|
||||||
if ( !this.startContainer )
|
if ( !this.startContainer )
|
||||||
{
|
{
|
||||||
this.startContainer = refNode ;
|
this.startContainer = refNode ;
|
||||||
this.startOffset = offset ;
|
this.startOffset = offset ;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._UpdateCollapsed() ;
|
this._UpdateCollapsed() ;
|
||||||
},
|
},
|
||||||
|
|
||||||
setStartAfter : function( refNode )
|
setStartAfter : function( refNode )
|
||||||
{
|
{
|
||||||
this.setStart( refNode.parentNode, FCKDomTools.GetIndexOf( refNode ) + 1 ) ;
|
this.setStart( refNode.parentNode, FCKDomTools.GetIndexOf( refNode ) + 1 ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
setStartBefore : function( refNode )
|
setStartBefore : function( refNode )
|
||||||
{
|
{
|
||||||
this.setStart( refNode.parentNode, FCKDomTools.GetIndexOf( refNode ) ) ;
|
this.setStart( refNode.parentNode, FCKDomTools.GetIndexOf( refNode ) ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
setEndAfter : function( refNode )
|
setEndAfter : function( refNode )
|
||||||
{
|
{
|
||||||
this.setEnd( refNode.parentNode, FCKDomTools.GetIndexOf( refNode ) + 1 ) ;
|
this.setEnd( refNode.parentNode, FCKDomTools.GetIndexOf( refNode ) + 1 ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
setEndBefore : function( refNode )
|
setEndBefore : function( refNode )
|
||||||
{
|
{
|
||||||
this.setEnd( refNode.parentNode, FCKDomTools.GetIndexOf( refNode ) ) ;
|
this.setEnd( refNode.parentNode, FCKDomTools.GetIndexOf( refNode ) ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
collapse : function( toStart )
|
collapse : function( toStart )
|
||||||
{
|
{
|
||||||
if ( toStart )
|
if ( toStart )
|
||||||
{
|
{
|
||||||
this.endContainer = this.startContainer ;
|
this.endContainer = this.startContainer ;
|
||||||
this.endOffset = this.startOffset ;
|
this.endOffset = this.startOffset ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.startContainer = this.endContainer ;
|
this.startContainer = this.endContainer ;
|
||||||
this.startOffset = this.endOffset ;
|
this.startOffset = this.endOffset ;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.collapsed = true ;
|
this.collapsed = true ;
|
||||||
},
|
},
|
||||||
|
|
||||||
selectNodeContents : function( refNode )
|
selectNodeContents : function( refNode )
|
||||||
{
|
{
|
||||||
this.setStart( refNode, 0 ) ;
|
this.setStart( refNode, 0 ) ;
|
||||||
this.setEnd( refNode, refNode.nodeType == 3 ? refNode.data.length : refNode.childNodes.length ) ;
|
this.setEnd( refNode, refNode.nodeType == 3 ? refNode.data.length : refNode.childNodes.length ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
insertNode : function( newNode )
|
insertNode : function( newNode )
|
||||||
{
|
{
|
||||||
var startContainer = this.startContainer ;
|
var startContainer = this.startContainer ;
|
||||||
var startOffset = this.startOffset ;
|
var startOffset = this.startOffset ;
|
||||||
|
|
||||||
// If we are in a text node.
|
// If we are in a text node.
|
||||||
if ( startContainer.nodeType == 3 )
|
if ( startContainer.nodeType == 3 )
|
||||||
{
|
{
|
||||||
startContainer.splitText( startOffset ) ;
|
startContainer.splitText( startOffset ) ;
|
||||||
|
|
||||||
// Check if it is necessary to update the end boundary.
|
// Check if it is necessary to update the end boundary.
|
||||||
if ( startContainer == this.endContainer )
|
if ( startContainer == this.endContainer )
|
||||||
this.setEnd( startContainer.nextSibling, this.endOffset - this.startOffset ) ;
|
this.setEnd( startContainer.nextSibling, this.endOffset - this.startOffset ) ;
|
||||||
|
|
||||||
// Insert the new node it after the text node.
|
// Insert the new node it after the text node.
|
||||||
FCKDomTools.InsertAfterNode( startContainer, newNode ) ;
|
FCKDomTools.InsertAfterNode( startContainer, newNode ) ;
|
||||||
|
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Simply insert the new node before the current start node.
|
// Simply insert the new node before the current start node.
|
||||||
startContainer.insertBefore( newNode, startContainer.childNodes[ startOffset ] || null ) ;
|
startContainer.insertBefore( newNode, startContainer.childNodes[ startOffset ] || null ) ;
|
||||||
|
|
||||||
// Check if it is necessary to update the end boundary.
|
// Check if it is necessary to update the end boundary.
|
||||||
if ( startContainer == this.endContainer )
|
if ( startContainer == this.endContainer )
|
||||||
{
|
{
|
||||||
this.endOffset++ ;
|
this.endOffset++ ;
|
||||||
this.collapsed = false ;
|
this.collapsed = false ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
deleteContents : function()
|
deleteContents : function()
|
||||||
{
|
{
|
||||||
if ( this.collapsed )
|
if ( this.collapsed )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
this._ExecContentsAction( 0 ) ;
|
this._ExecContentsAction( 0 ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
extractContents : function()
|
extractContents : function()
|
||||||
{
|
{
|
||||||
var docFrag = new FCKDocumentFragment( this._Document ) ;
|
var docFrag = new FCKDocumentFragment( this._Document ) ;
|
||||||
|
|
||||||
if ( !this.collapsed )
|
if ( !this.collapsed )
|
||||||
this._ExecContentsAction( 1, docFrag ) ;
|
this._ExecContentsAction( 1, docFrag ) ;
|
||||||
|
|
||||||
return docFrag ;
|
return docFrag ;
|
||||||
},
|
},
|
||||||
|
|
||||||
// The selection may be lost when cloning (due to the splitText() call).
|
// The selection may be lost when cloning (due to the splitText() call).
|
||||||
cloneContents : function()
|
cloneContents : function()
|
||||||
{
|
{
|
||||||
var docFrag = new FCKDocumentFragment( this._Document ) ;
|
var docFrag = new FCKDocumentFragment( this._Document ) ;
|
||||||
|
|
||||||
if ( !this.collapsed )
|
if ( !this.collapsed )
|
||||||
this._ExecContentsAction( 2, docFrag ) ;
|
this._ExecContentsAction( 2, docFrag ) ;
|
||||||
|
|
||||||
return docFrag ;
|
return docFrag ;
|
||||||
},
|
},
|
||||||
|
|
||||||
_ExecContentsAction : function( action, docFrag )
|
_ExecContentsAction : function( action, docFrag )
|
||||||
{
|
{
|
||||||
var startNode = this.startContainer ;
|
var startNode = this.startContainer ;
|
||||||
var endNode = this.endContainer ;
|
var endNode = this.endContainer ;
|
||||||
|
|
||||||
var startOffset = this.startOffset ;
|
var startOffset = this.startOffset ;
|
||||||
var endOffset = this.endOffset ;
|
var endOffset = this.endOffset ;
|
||||||
|
|
||||||
var removeStartNode = false ;
|
var removeStartNode = false ;
|
||||||
var removeEndNode = false ;
|
var removeEndNode = false ;
|
||||||
|
|
||||||
// Check the start and end nodes and make the necessary removals or changes.
|
// Check the start and end nodes and make the necessary removals or changes.
|
||||||
|
|
||||||
// Start from the end, otherwise DOM mutations (splitText) made in the
|
// Start from the end, otherwise DOM mutations (splitText) made in the
|
||||||
// start boundary may interfere on the results here.
|
// start boundary may interfere on the results here.
|
||||||
|
|
||||||
// For text containers, we must simply split the node and point to the
|
// For text containers, we must simply split the node and point to the
|
||||||
// second part. The removal will be handled by the rest of the code .
|
// second part. The removal will be handled by the rest of the code .
|
||||||
if ( endNode.nodeType == 3 )
|
if ( endNode.nodeType == 3 )
|
||||||
endNode = endNode.splitText( endOffset ) ;
|
endNode = endNode.splitText( endOffset ) ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// If the end container has children and the offset is pointing
|
// If the end container has children and the offset is pointing
|
||||||
// to a child, then we should start from it.
|
// to a child, then we should start from it.
|
||||||
if ( endNode.childNodes.length > 0 )
|
if ( endNode.childNodes.length > 0 )
|
||||||
{
|
{
|
||||||
// If the offset points after the last node.
|
// If the offset points after the last node.
|
||||||
if ( endOffset > endNode.childNodes.length - 1 )
|
if ( endOffset > endNode.childNodes.length - 1 )
|
||||||
{
|
{
|
||||||
// Let's create a temporary node and mark it for removal.
|
// Let's create a temporary node and mark it for removal.
|
||||||
endNode = FCKDomTools.InsertAfterNode( endNode.lastChild, this._Document.createTextNode('') ) ;
|
endNode = FCKDomTools.InsertAfterNode( endNode.lastChild, this._Document.createTextNode('') ) ;
|
||||||
removeEndNode = true ;
|
removeEndNode = true ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
endNode = endNode.childNodes[ endOffset ] ;
|
endNode = endNode.childNodes[ endOffset ] ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// For text containers, we must simply split the node. The removal will
|
// For text containers, we must simply split the node. The removal will
|
||||||
// be handled by the rest of the code .
|
// be handled by the rest of the code .
|
||||||
if ( startNode.nodeType == 3 )
|
if ( startNode.nodeType == 3 )
|
||||||
{
|
{
|
||||||
startNode.splitText( startOffset ) ;
|
startNode.splitText( startOffset ) ;
|
||||||
|
|
||||||
// In cases the end node is the same as the start node, the above
|
// In cases the end node is the same as the start node, the above
|
||||||
// splitting will also split the end, so me must move the end to
|
// splitting will also split the end, so me must move the end to
|
||||||
// the second part of the split.
|
// the second part of the split.
|
||||||
if ( startNode == endNode )
|
if ( startNode == endNode )
|
||||||
endNode = startNode.nextSibling ;
|
endNode = startNode.nextSibling ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// If the start container has children and the offset is pointing
|
// If the start container has children and the offset is pointing
|
||||||
// to a child, then we should start from its previous sibling.
|
// to a child, then we should start from its previous sibling.
|
||||||
|
|
||||||
// If the offset points to the first node, we don't have a
|
// If the offset points to the first node, we don't have a
|
||||||
// sibling, so let's use the first one, but mark it for removal.
|
// sibling, so let's use the first one, but mark it for removal.
|
||||||
if ( startOffset == 0 )
|
if ( startOffset == 0 )
|
||||||
{
|
{
|
||||||
// Let's create a temporary node and mark it for removal.
|
// Let's create a temporary node and mark it for removal.
|
||||||
startNode = startNode.insertBefore( this._Document.createTextNode(''), startNode.firstChild ) ;
|
startNode = startNode.insertBefore( this._Document.createTextNode(''), startNode.firstChild ) ;
|
||||||
removeStartNode = true ;
|
removeStartNode = true ;
|
||||||
}
|
}
|
||||||
else if ( startOffset > startNode.childNodes.length - 1 )
|
else if ( startOffset > startNode.childNodes.length - 1 )
|
||||||
{
|
{
|
||||||
// Let's create a temporary node and mark it for removal.
|
// Let's create a temporary node and mark it for removal.
|
||||||
startNode = startNode.appendChild( this._Document.createTextNode('') ) ;
|
startNode = startNode.appendChild( this._Document.createTextNode('') ) ;
|
||||||
removeStartNode = true ;
|
removeStartNode = true ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
startNode = startNode.childNodes[ startOffset ].previousSibling ;
|
startNode = startNode.childNodes[ startOffset ].previousSibling ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the parent nodes tree for the start and end boundaries.
|
// Get the parent nodes tree for the start and end boundaries.
|
||||||
var startParents = FCKDomTools.GetParents( startNode ) ;
|
var startParents = FCKDomTools.GetParents( startNode ) ;
|
||||||
var endParents = FCKDomTools.GetParents( endNode ) ;
|
var endParents = FCKDomTools.GetParents( endNode ) ;
|
||||||
|
|
||||||
// Compare them, to find the top most siblings.
|
// Compare them, to find the top most siblings.
|
||||||
var i, topStart, topEnd ;
|
var i, topStart, topEnd ;
|
||||||
|
|
||||||
for ( i = 0 ; i < startParents.length ; i++ )
|
for ( i = 0 ; i < startParents.length ; i++ )
|
||||||
{
|
{
|
||||||
topStart = startParents[i] ;
|
topStart = startParents[i] ;
|
||||||
topEnd = endParents[i] ;
|
topEnd = endParents[i] ;
|
||||||
|
|
||||||
// The compared nodes will match until we find the top most
|
// The compared nodes will match until we find the top most
|
||||||
// siblings (different nodes that have the same parent).
|
// siblings (different nodes that have the same parent).
|
||||||
// "i" will hold the index in the parents array for the top
|
// "i" will hold the index in the parents array for the top
|
||||||
// most element.
|
// most element.
|
||||||
if ( topStart != topEnd )
|
if ( topStart != topEnd )
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
|
|
||||||
var clone, levelStartNode, levelClone, currentNode, currentSibling ;
|
var clone, levelStartNode, levelClone, currentNode, currentSibling ;
|
||||||
|
|
||||||
if ( docFrag )
|
if ( docFrag )
|
||||||
clone = docFrag.RootNode ;
|
clone = docFrag.RootNode ;
|
||||||
|
|
||||||
// Remove all successive sibling nodes for every node in the
|
// Remove all successive sibling nodes for every node in the
|
||||||
// startParents tree.
|
// startParents tree.
|
||||||
for ( var j = i ; j < startParents.length ; j++ )
|
for ( var j = i ; j < startParents.length ; j++ )
|
||||||
{
|
{
|
||||||
levelStartNode = startParents[j] ;
|
levelStartNode = startParents[j] ;
|
||||||
|
|
||||||
// For Extract and Clone, we must clone this level.
|
// For Extract and Clone, we must clone this level.
|
||||||
if ( clone && levelStartNode != startNode ) // action = 0 = Delete
|
if ( clone && levelStartNode != startNode ) // action = 0 = Delete
|
||||||
levelClone = clone.appendChild( levelStartNode.cloneNode( levelStartNode == startNode ) ) ;
|
levelClone = clone.appendChild( levelStartNode.cloneNode( levelStartNode == startNode ) ) ;
|
||||||
|
|
||||||
currentNode = levelStartNode.nextSibling ;
|
currentNode = levelStartNode.nextSibling ;
|
||||||
|
|
||||||
while( currentNode )
|
while( currentNode )
|
||||||
{
|
{
|
||||||
// Stop processing when the current node matches a node in the
|
// Stop processing when the current node matches a node in the
|
||||||
// endParents tree or if it is the endNode.
|
// endParents tree or if it is the endNode.
|
||||||
if ( currentNode == endParents[j] || currentNode == endNode )
|
if ( currentNode == endParents[j] || currentNode == endNode )
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
// Cache the next sibling.
|
// Cache the next sibling.
|
||||||
currentSibling = currentNode.nextSibling ;
|
currentSibling = currentNode.nextSibling ;
|
||||||
|
|
||||||
// If cloning, just clone it.
|
// If cloning, just clone it.
|
||||||
if ( action == 2 ) // 2 = Clone
|
if ( action == 2 ) // 2 = Clone
|
||||||
clone.appendChild( currentNode.cloneNode( true ) ) ;
|
clone.appendChild( currentNode.cloneNode( true ) ) ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Both Delete and Extract will remove the node.
|
// Both Delete and Extract will remove the node.
|
||||||
currentNode.parentNode.removeChild( currentNode ) ;
|
currentNode.parentNode.removeChild( currentNode ) ;
|
||||||
|
|
||||||
// When Extracting, move the removed node to the docFrag.
|
// When Extracting, move the removed node to the docFrag.
|
||||||
if ( action == 1 ) // 1 = Extract
|
if ( action == 1 ) // 1 = Extract
|
||||||
clone.appendChild( currentNode ) ;
|
clone.appendChild( currentNode ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
currentNode = currentSibling ;
|
currentNode = currentSibling ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( clone )
|
if ( clone )
|
||||||
clone = levelClone ;
|
clone = levelClone ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( docFrag )
|
if ( docFrag )
|
||||||
clone = docFrag.RootNode ;
|
clone = docFrag.RootNode ;
|
||||||
|
|
||||||
// Remove all previous sibling nodes for every node in the
|
// Remove all previous sibling nodes for every node in the
|
||||||
// endParents tree.
|
// endParents tree.
|
||||||
for ( var k = i ; k < endParents.length ; k++ )
|
for ( var k = i ; k < endParents.length ; k++ )
|
||||||
{
|
{
|
||||||
levelStartNode = endParents[k] ;
|
levelStartNode = endParents[k] ;
|
||||||
|
|
||||||
// For Extract and Clone, we must clone this level.
|
// For Extract and Clone, we must clone this level.
|
||||||
if ( action > 0 && levelStartNode != endNode ) // action = 0 = Delete
|
if ( action > 0 && levelStartNode != endNode ) // action = 0 = Delete
|
||||||
levelClone = clone.appendChild( levelStartNode.cloneNode( levelStartNode == endNode ) ) ;
|
levelClone = clone.appendChild( levelStartNode.cloneNode( levelStartNode == endNode ) ) ;
|
||||||
|
|
||||||
// The processing of siblings may have already been done by the parent.
|
// The processing of siblings may have already been done by the parent.
|
||||||
if ( !startParents[k] || levelStartNode.parentNode != startParents[k].parentNode )
|
if ( !startParents[k] || levelStartNode.parentNode != startParents[k].parentNode )
|
||||||
{
|
{
|
||||||
currentNode = levelStartNode.previousSibling ;
|
currentNode = levelStartNode.previousSibling ;
|
||||||
|
|
||||||
while( currentNode )
|
while( currentNode )
|
||||||
{
|
{
|
||||||
// Stop processing when the current node matches a node in the
|
// Stop processing when the current node matches a node in the
|
||||||
// startParents tree or if it is the startNode.
|
// startParents tree or if it is the startNode.
|
||||||
if ( currentNode == startParents[k] || currentNode == startNode )
|
if ( currentNode == startParents[k] || currentNode == startNode )
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
// Cache the next sibling.
|
// Cache the next sibling.
|
||||||
currentSibling = currentNode.previousSibling ;
|
currentSibling = currentNode.previousSibling ;
|
||||||
|
|
||||||
// If cloning, just clone it.
|
// If cloning, just clone it.
|
||||||
if ( action == 2 ) // 2 = Clone
|
if ( action == 2 ) // 2 = Clone
|
||||||
clone.insertBefore( currentNode.cloneNode( true ), clone.firstChild ) ;
|
clone.insertBefore( currentNode.cloneNode( true ), clone.firstChild ) ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Both Delete and Extract will remove the node.
|
// Both Delete and Extract will remove the node.
|
||||||
currentNode.parentNode.removeChild( currentNode ) ;
|
currentNode.parentNode.removeChild( currentNode ) ;
|
||||||
|
|
||||||
// When Extracting, mode the removed node to the docFrag.
|
// When Extracting, mode the removed node to the docFrag.
|
||||||
if ( action == 1 ) // 1 = Extract
|
if ( action == 1 ) // 1 = Extract
|
||||||
clone.insertBefore( currentNode, clone.firstChild ) ;
|
clone.insertBefore( currentNode, clone.firstChild ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
currentNode = currentSibling ;
|
currentNode = currentSibling ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( clone )
|
if ( clone )
|
||||||
clone = levelClone ;
|
clone = levelClone ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( action == 2 ) // 2 = Clone.
|
if ( action == 2 ) // 2 = Clone.
|
||||||
{
|
{
|
||||||
// No changes in the DOM should be done, so fix the split text (if any).
|
// No changes in the DOM should be done, so fix the split text (if any).
|
||||||
|
|
||||||
var startTextNode = this.startContainer ;
|
var startTextNode = this.startContainer ;
|
||||||
if ( startTextNode.nodeType == 3 )
|
if ( startTextNode.nodeType == 3 )
|
||||||
{
|
{
|
||||||
startTextNode.data += startTextNode.nextSibling.data ;
|
startTextNode.data += startTextNode.nextSibling.data ;
|
||||||
startTextNode.parentNode.removeChild( startTextNode.nextSibling ) ;
|
startTextNode.parentNode.removeChild( startTextNode.nextSibling ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
var endTextNode = this.endContainer ;
|
var endTextNode = this.endContainer ;
|
||||||
if ( endTextNode.nodeType == 3 && endTextNode.nextSibling )
|
if ( endTextNode.nodeType == 3 && endTextNode.nextSibling )
|
||||||
{
|
{
|
||||||
endTextNode.data += endTextNode.nextSibling.data ;
|
endTextNode.data += endTextNode.nextSibling.data ;
|
||||||
endTextNode.parentNode.removeChild( endTextNode.nextSibling ) ;
|
endTextNode.parentNode.removeChild( endTextNode.nextSibling ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Collapse the range.
|
// Collapse the range.
|
||||||
|
|
||||||
// If a node has been partially selected, collapse the range between
|
// If a node has been partially selected, collapse the range between
|
||||||
// topStart and topEnd. Otherwise, simply collapse it to the start. (W3C specs).
|
// topStart and topEnd. Otherwise, simply collapse it to the start. (W3C specs).
|
||||||
if ( topStart && topEnd && ( startNode.parentNode != topStart.parentNode || endNode.parentNode != topEnd.parentNode ) )
|
if ( topStart && topEnd && ( startNode.parentNode != topStart.parentNode || endNode.parentNode != topEnd.parentNode ) )
|
||||||
{
|
{
|
||||||
var endIndex = FCKDomTools.GetIndexOf( topEnd ) ;
|
var endIndex = FCKDomTools.GetIndexOf( topEnd ) ;
|
||||||
|
|
||||||
// If the start node is to be removed, we must correct the
|
// If the start node is to be removed, we must correct the
|
||||||
// index to reflect the removal.
|
// index to reflect the removal.
|
||||||
if ( removeStartNode && topEnd.parentNode == startNode.parentNode )
|
if ( removeStartNode && topEnd.parentNode == startNode.parentNode )
|
||||||
endIndex-- ;
|
endIndex-- ;
|
||||||
|
|
||||||
this.setStart( topEnd.parentNode, endIndex ) ;
|
this.setStart( topEnd.parentNode, endIndex ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Collapse it to the start.
|
// Collapse it to the start.
|
||||||
this.collapse( true ) ;
|
this.collapse( true ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cleanup any marked node.
|
// Cleanup any marked node.
|
||||||
if( removeStartNode )
|
if( removeStartNode )
|
||||||
startNode.parentNode.removeChild( startNode ) ;
|
startNode.parentNode.removeChild( startNode ) ;
|
||||||
|
|
||||||
if( removeEndNode && endNode.parentNode )
|
if( removeEndNode && endNode.parentNode )
|
||||||
endNode.parentNode.removeChild( endNode ) ;
|
endNode.parentNode.removeChild( endNode ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
cloneRange : function()
|
cloneRange : function()
|
||||||
{
|
{
|
||||||
return FCKW3CRange.CreateFromRange( this._Document, this ) ;
|
return FCKW3CRange.CreateFromRange( this._Document, this ) ;
|
||||||
}
|
}
|
||||||
} ;
|
} ;
|
||||||
|
@ -1,108 +1,108 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKXml Class: class to load and manipulate XML files.
|
* FCKXml Class: class to load and manipulate XML files.
|
||||||
* (IE specific implementation)
|
* (IE specific implementation)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKXml = function()
|
var FCKXml = function()
|
||||||
{
|
{
|
||||||
this.Error = false ;
|
this.Error = false ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKXml.GetAttribute = function( node, attName, defaultValue )
|
FCKXml.GetAttribute = function( node, attName, defaultValue )
|
||||||
{
|
{
|
||||||
var attNode = node.attributes.getNamedItem( attName ) ;
|
var attNode = node.attributes.getNamedItem( attName ) ;
|
||||||
return attNode ? attNode.value : defaultValue ;
|
return attNode ? attNode.value : defaultValue ;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Transforms a XML element node in a JavaScript object. Attributes defined for
|
* Transforms a XML element node in a JavaScript object. Attributes defined for
|
||||||
* the element will be available as properties, as long as child element
|
* the element will be available as properties, as long as child element
|
||||||
* nodes, but the later will generate arrays with property names prefixed with "$".
|
* nodes, but the later will generate arrays with property names prefixed with "$".
|
||||||
*
|
*
|
||||||
* For example, the following XML element:
|
* For example, the following XML element:
|
||||||
*
|
*
|
||||||
* <SomeNode name="Test" key="2">
|
* <SomeNode name="Test" key="2">
|
||||||
* <MyChild id="10">
|
* <MyChild id="10">
|
||||||
* <OtherLevel name="Level 3" />
|
* <OtherLevel name="Level 3" />
|
||||||
* </MyChild>
|
* </MyChild>
|
||||||
* <MyChild id="25" />
|
* <MyChild id="25" />
|
||||||
* <AnotherChild price="499" />
|
* <AnotherChild price="499" />
|
||||||
* </SomeNode>
|
* </SomeNode>
|
||||||
*
|
*
|
||||||
* ... results in the following object:
|
* ... results in the following object:
|
||||||
*
|
*
|
||||||
* {
|
* {
|
||||||
* name : "Test",
|
* name : "Test",
|
||||||
* key : "2",
|
* key : "2",
|
||||||
* $MyChild :
|
* $MyChild :
|
||||||
* [
|
* [
|
||||||
* {
|
* {
|
||||||
* id : "10",
|
* id : "10",
|
||||||
* $OtherLevel :
|
* $OtherLevel :
|
||||||
* {
|
* {
|
||||||
* name : "Level 3"
|
* name : "Level 3"
|
||||||
* }
|
* }
|
||||||
* },
|
* },
|
||||||
* {
|
* {
|
||||||
* id : "25"
|
* id : "25"
|
||||||
* }
|
* }
|
||||||
* ],
|
* ],
|
||||||
* $AnotherChild :
|
* $AnotherChild :
|
||||||
* [
|
* [
|
||||||
* {
|
* {
|
||||||
* price : "499"
|
* price : "499"
|
||||||
* }
|
* }
|
||||||
* ]
|
* ]
|
||||||
* }
|
* }
|
||||||
*/
|
*/
|
||||||
FCKXml.TransformToObject = function( element )
|
FCKXml.TransformToObject = function( element )
|
||||||
{
|
{
|
||||||
if ( !element )
|
if ( !element )
|
||||||
return null ;
|
return null ;
|
||||||
|
|
||||||
var obj = {} ;
|
var obj = {} ;
|
||||||
|
|
||||||
var attributes = element.attributes ;
|
var attributes = element.attributes ;
|
||||||
for ( var i = 0 ; i < attributes.length ; i++ )
|
for ( var i = 0 ; i < attributes.length ; i++ )
|
||||||
{
|
{
|
||||||
var att = attributes[i] ;
|
var att = attributes[i] ;
|
||||||
obj[ att.name ] = att.value ;
|
obj[ att.name ] = att.value ;
|
||||||
}
|
}
|
||||||
|
|
||||||
var childNodes = element.childNodes ;
|
var childNodes = element.childNodes ;
|
||||||
for ( i = 0 ; i < childNodes.length ; i++ )
|
for ( i = 0 ; i < childNodes.length ; i++ )
|
||||||
{
|
{
|
||||||
var child = childNodes[i] ;
|
var child = childNodes[i] ;
|
||||||
|
|
||||||
if ( child.nodeType == 1 )
|
if ( child.nodeType == 1 )
|
||||||
{
|
{
|
||||||
var childName = '$' + child.nodeName ;
|
var childName = '$' + child.nodeName ;
|
||||||
var childList = obj[ childName ] ;
|
var childList = obj[ childName ] ;
|
||||||
if ( !childList )
|
if ( !childList )
|
||||||
childList = obj[ childName ] = [] ;
|
childList = obj[ childName ] = [] ;
|
||||||
|
|
||||||
childList.push( this.TransformToObject( child ) ) ;
|
childList.push( this.TransformToObject( child ) ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return obj ;
|
return obj ;
|
||||||
}
|
}
|
||||||
|
@ -1,102 +1,106 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKXml Class: class to load and manipulate XML files.
|
* FCKXml Class: class to load and manipulate XML files.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
FCKXml.prototype =
|
FCKXml.prototype =
|
||||||
{
|
{
|
||||||
LoadUrl : function( urlToCall )
|
LoadUrl : function( urlToCall )
|
||||||
{
|
{
|
||||||
this.Error = false ;
|
this.Error = false ;
|
||||||
|
|
||||||
var oXml ;
|
var oXml ;
|
||||||
var oXmlHttp = FCKTools.CreateXmlObject( 'XmlHttp' ) ;
|
var oXmlHttp = FCKTools.CreateXmlObject( 'XmlHttp' ) ;
|
||||||
oXmlHttp.open( 'GET', urlToCall, false ) ;
|
oXmlHttp.open( 'GET', urlToCall, false ) ;
|
||||||
oXmlHttp.send( null ) ;
|
oXmlHttp.send( null ) ;
|
||||||
|
|
||||||
if ( oXmlHttp.status == 200 || oXmlHttp.status == 304 )
|
if ( oXmlHttp.status == 200 || oXmlHttp.status == 304 || ( oXmlHttp.status == 0 && oXmlHttp.readyState == 4 ) )
|
||||||
oXml = oXmlHttp.responseXML ;
|
{
|
||||||
else if ( oXmlHttp.status == 0 && oXmlHttp.readyState == 4 )
|
oXml = oXmlHttp.responseXML ;
|
||||||
oXml = oXmlHttp.responseXML ;
|
// #1426: Fallback if responseXML isn't set for some
|
||||||
else
|
// reason (e.g. improperly configured web server)
|
||||||
oXml = null ;
|
if ( !oXml )
|
||||||
|
oXml = (new DOMParser()).parseFromString( oXmlHttp.responseText, 'text/xml' ) ;
|
||||||
if ( oXml )
|
}
|
||||||
{
|
else
|
||||||
// Try to access something on it.
|
oXml = null ;
|
||||||
try
|
|
||||||
{
|
if ( oXml )
|
||||||
var test = oXml.firstChild ;
|
{
|
||||||
}
|
// Try to access something on it.
|
||||||
catch (e)
|
try
|
||||||
{
|
{
|
||||||
// If document.domain has been changed (#123), we'll have a security
|
var test = oXml.firstChild ;
|
||||||
// error at this point. The workaround here is parsing the responseText:
|
}
|
||||||
// http://alexander.kirk.at/2006/07/27/firefox-15-xmlhttprequest-reqresponsexml-and-documentdomain/
|
catch (e)
|
||||||
oXml = (new DOMParser()).parseFromString( oXmlHttp.responseText, 'text/xml' ) ;
|
{
|
||||||
}
|
// If document.domain has been changed (#123), we'll have a security
|
||||||
}
|
// error at this point. The workaround here is parsing the responseText:
|
||||||
|
// http://alexander.kirk.at/2006/07/27/firefox-15-xmlhttprequest-reqresponsexml-and-documentdomain/
|
||||||
if ( !oXml || !oXml.firstChild )
|
oXml = (new DOMParser()).parseFromString( oXmlHttp.responseText, 'text/xml' ) ;
|
||||||
{
|
}
|
||||||
this.Error = true ;
|
}
|
||||||
if ( window.confirm( 'Error loading "' + urlToCall + '" (HTTP Status: ' + oXmlHttp.status + ').\r\nDo you want to see the server response dump?' ) )
|
|
||||||
alert( oXmlHttp.responseText ) ;
|
if ( !oXml || !oXml.firstChild )
|
||||||
}
|
{
|
||||||
|
this.Error = true ;
|
||||||
this.DOMDocument = oXml ;
|
if ( window.confirm( 'Error loading "' + urlToCall + '" (HTTP Status: ' + oXmlHttp.status + ').\r\nDo you want to see the server response dump?' ) )
|
||||||
},
|
alert( oXmlHttp.responseText ) ;
|
||||||
|
}
|
||||||
SelectNodes : function( xpath, contextNode )
|
|
||||||
{
|
this.DOMDocument = oXml ;
|
||||||
if ( this.Error )
|
},
|
||||||
return new Array() ;
|
|
||||||
|
SelectNodes : function( xpath, contextNode )
|
||||||
var aNodeArray = new Array();
|
{
|
||||||
|
if ( this.Error )
|
||||||
var xPathResult = this.DOMDocument.evaluate( xpath, contextNode ? contextNode : this.DOMDocument,
|
return new Array() ;
|
||||||
this.DOMDocument.createNSResolver(this.DOMDocument.documentElement), XPathResult.ORDERED_NODE_ITERATOR_TYPE, null) ;
|
|
||||||
if ( xPathResult )
|
var aNodeArray = new Array();
|
||||||
{
|
|
||||||
var oNode = xPathResult.iterateNext() ;
|
var xPathResult = this.DOMDocument.evaluate( xpath, contextNode ? contextNode : this.DOMDocument,
|
||||||
while( oNode )
|
this.DOMDocument.createNSResolver(this.DOMDocument.documentElement), XPathResult.ORDERED_NODE_ITERATOR_TYPE, null) ;
|
||||||
{
|
if ( xPathResult )
|
||||||
aNodeArray[aNodeArray.length] = oNode ;
|
{
|
||||||
oNode = xPathResult.iterateNext();
|
var oNode = xPathResult.iterateNext() ;
|
||||||
}
|
while( oNode )
|
||||||
}
|
{
|
||||||
return aNodeArray ;
|
aNodeArray[aNodeArray.length] = oNode ;
|
||||||
},
|
oNode = xPathResult.iterateNext();
|
||||||
|
}
|
||||||
SelectSingleNode : function( xpath, contextNode )
|
}
|
||||||
{
|
return aNodeArray ;
|
||||||
if ( this.Error )
|
},
|
||||||
return null ;
|
|
||||||
|
SelectSingleNode : function( xpath, contextNode )
|
||||||
var xPathResult = this.DOMDocument.evaluate( xpath, contextNode ? contextNode : this.DOMDocument,
|
{
|
||||||
this.DOMDocument.createNSResolver(this.DOMDocument.documentElement), 9, null);
|
if ( this.Error )
|
||||||
|
return null ;
|
||||||
if ( xPathResult && xPathResult.singleNodeValue )
|
|
||||||
return xPathResult.singleNodeValue ;
|
var xPathResult = this.DOMDocument.evaluate( xpath, contextNode ? contextNode : this.DOMDocument,
|
||||||
else
|
this.DOMDocument.createNSResolver(this.DOMDocument.documentElement), 9, null);
|
||||||
return null ;
|
|
||||||
}
|
if ( xPathResult && xPathResult.singleNodeValue )
|
||||||
} ;
|
return xPathResult.singleNodeValue ;
|
||||||
|
else
|
||||||
|
return null ;
|
||||||
|
}
|
||||||
|
} ;
|
||||||
|
@ -1,88 +1,93 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKXml Class: class to load and manipulate XML files.
|
* FCKXml Class: class to load and manipulate XML files.
|
||||||
* (IE specific implementation)
|
* (IE specific implementation)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
FCKXml.prototype =
|
FCKXml.prototype =
|
||||||
{
|
{
|
||||||
LoadUrl : function( urlToCall )
|
LoadUrl : function( urlToCall )
|
||||||
{
|
{
|
||||||
this.Error = false ;
|
this.Error = false ;
|
||||||
|
|
||||||
var oXmlHttp = FCKTools.CreateXmlObject( 'XmlHttp' ) ;
|
var oXmlHttp = FCKTools.CreateXmlObject( 'XmlHttp' ) ;
|
||||||
|
|
||||||
if ( !oXmlHttp )
|
if ( !oXmlHttp )
|
||||||
{
|
{
|
||||||
this.Error = true ;
|
this.Error = true ;
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
oXmlHttp.open( "GET", urlToCall, false ) ;
|
oXmlHttp.open( "GET", urlToCall, false ) ;
|
||||||
|
|
||||||
oXmlHttp.send( null ) ;
|
oXmlHttp.send( null ) ;
|
||||||
|
|
||||||
if ( oXmlHttp.status == 200 || oXmlHttp.status == 304 )
|
if ( oXmlHttp.status == 200 || oXmlHttp.status == 304 || ( oXmlHttp.status == 0 && oXmlHttp.readyState == 4 ) )
|
||||||
this.DOMDocument = oXmlHttp.responseXML ;
|
{
|
||||||
else if ( oXmlHttp.status == 0 && oXmlHttp.readyState == 4 )
|
this.DOMDocument = oXmlHttp.responseXML ;
|
||||||
{
|
|
||||||
this.DOMDocument = FCKTools.CreateXmlObject( 'DOMDocument' ) ;
|
// #1426: Fallback if responseXML isn't set for some
|
||||||
this.DOMDocument.async = false ;
|
// reason (e.g. improperly configured web server)
|
||||||
this.DOMDocument.resolveExternals = false ;
|
if ( !this.DOMDocument || this.DOMDocument.firstChild == null )
|
||||||
this.DOMDocument.loadXML( oXmlHttp.responseText ) ;
|
{
|
||||||
}
|
this.DOMDocument = FCKTools.CreateXmlObject( 'DOMDocument' ) ;
|
||||||
else
|
this.DOMDocument.async = false ;
|
||||||
{
|
this.DOMDocument.resolveExternals = false ;
|
||||||
this.DOMDocument = null ;
|
this.DOMDocument.loadXML( oXmlHttp.responseText ) ;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if ( this.DOMDocument == null || this.DOMDocument.firstChild == null )
|
else
|
||||||
{
|
{
|
||||||
this.Error = true ;
|
this.DOMDocument = null ;
|
||||||
if (window.confirm( 'Error loading "' + urlToCall + '"\r\nDo you want to see more info?' ) )
|
}
|
||||||
alert( 'URL requested: "' + urlToCall + '"\r\n' +
|
|
||||||
'Server response:\r\nStatus: ' + oXmlHttp.status + '\r\n' +
|
if ( this.DOMDocument == null || this.DOMDocument.firstChild == null )
|
||||||
'Response text:\r\n' + oXmlHttp.responseText ) ;
|
{
|
||||||
}
|
this.Error = true ;
|
||||||
},
|
if (window.confirm( 'Error loading "' + urlToCall + '"\r\nDo you want to see more info?' ) )
|
||||||
|
alert( 'URL requested: "' + urlToCall + '"\r\n' +
|
||||||
SelectNodes : function( xpath, contextNode )
|
'Server response:\r\nStatus: ' + oXmlHttp.status + '\r\n' +
|
||||||
{
|
'Response text:\r\n' + oXmlHttp.responseText ) ;
|
||||||
if ( this.Error )
|
}
|
||||||
return new Array() ;
|
},
|
||||||
|
|
||||||
if ( contextNode )
|
SelectNodes : function( xpath, contextNode )
|
||||||
return contextNode.selectNodes( xpath ) ;
|
{
|
||||||
else
|
if ( this.Error )
|
||||||
return this.DOMDocument.selectNodes( xpath ) ;
|
return new Array() ;
|
||||||
},
|
|
||||||
|
if ( contextNode )
|
||||||
SelectSingleNode : function( xpath, contextNode )
|
return contextNode.selectNodes( xpath ) ;
|
||||||
{
|
else
|
||||||
if ( this.Error )
|
return this.DOMDocument.selectNodes( xpath ) ;
|
||||||
return null ;
|
},
|
||||||
|
|
||||||
if ( contextNode )
|
SelectSingleNode : function( xpath, contextNode )
|
||||||
return contextNode.selectSingleNode( xpath ) ;
|
{
|
||||||
else
|
if ( this.Error )
|
||||||
return this.DOMDocument.selectSingleNode( xpath ) ;
|
return null ;
|
||||||
}
|
|
||||||
} ;
|
if ( contextNode )
|
||||||
|
return contextNode.selectSingleNode( xpath ) ;
|
||||||
|
else
|
||||||
|
return this.DOMDocument.selectSingleNode( xpath ) ;
|
||||||
|
}
|
||||||
|
} ;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,250 +1,250 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKBlockQuoteCommand Class: adds or removes blockquote tags.
|
* FCKBlockQuoteCommand Class: adds or removes blockquote tags.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKBlockQuoteCommand = function()
|
var FCKBlockQuoteCommand = function()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKBlockQuoteCommand.prototype =
|
FCKBlockQuoteCommand.prototype =
|
||||||
{
|
{
|
||||||
Execute : function()
|
Execute : function()
|
||||||
{
|
{
|
||||||
FCKUndo.SaveUndoStep() ;
|
FCKUndo.SaveUndoStep() ;
|
||||||
|
|
||||||
var state = this.GetState() ;
|
var state = this.GetState() ;
|
||||||
|
|
||||||
var range = new FCKDomRange( FCK.EditorWindow ) ;
|
var range = new FCKDomRange( FCK.EditorWindow ) ;
|
||||||
range.MoveToSelection() ;
|
range.MoveToSelection() ;
|
||||||
|
|
||||||
var bookmark = range.CreateBookmark() ;
|
var bookmark = range.CreateBookmark() ;
|
||||||
|
|
||||||
// Kludge for #1592: if the bookmark nodes are in the beginning of
|
// Kludge for #1592: if the bookmark nodes are in the beginning of
|
||||||
// blockquote, then move them to the nearest block element in the
|
// blockquote, then move them to the nearest block element in the
|
||||||
// blockquote.
|
// blockquote.
|
||||||
if ( FCKBrowserInfo.IsIE )
|
if ( FCKBrowserInfo.IsIE )
|
||||||
{
|
{
|
||||||
var bStart = range.GetBookmarkNode( bookmark, true ) ;
|
var bStart = range.GetBookmarkNode( bookmark, true ) ;
|
||||||
var bEnd = range.GetBookmarkNode( bookmark, false ) ;
|
var bEnd = range.GetBookmarkNode( bookmark, false ) ;
|
||||||
|
|
||||||
var cursor ;
|
var cursor ;
|
||||||
|
|
||||||
if ( bStart
|
if ( bStart
|
||||||
&& bStart.parentNode.nodeName.IEquals( 'blockquote' )
|
&& bStart.parentNode.nodeName.IEquals( 'blockquote' )
|
||||||
&& !bStart.previousSibling )
|
&& !bStart.previousSibling )
|
||||||
{
|
{
|
||||||
cursor = bStart ;
|
cursor = bStart ;
|
||||||
while ( ( cursor = cursor.nextSibling ) )
|
while ( ( cursor = cursor.nextSibling ) )
|
||||||
{
|
{
|
||||||
if ( FCKListsLib.BlockElements[ cursor.nodeName.toLowerCase() ] )
|
if ( FCKListsLib.BlockElements[ cursor.nodeName.toLowerCase() ] )
|
||||||
FCKDomTools.MoveNode( bStart, cursor, true ) ;
|
FCKDomTools.MoveNode( bStart, cursor, true ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( bEnd
|
if ( bEnd
|
||||||
&& bEnd.parentNode.nodeName.IEquals( 'blockquote' )
|
&& bEnd.parentNode.nodeName.IEquals( 'blockquote' )
|
||||||
&& !bEnd.previousSibling )
|
&& !bEnd.previousSibling )
|
||||||
{
|
{
|
||||||
cursor = bEnd ;
|
cursor = bEnd ;
|
||||||
while ( ( cursor = cursor.nextSibling ) )
|
while ( ( cursor = cursor.nextSibling ) )
|
||||||
{
|
{
|
||||||
if ( FCKListsLib.BlockElements[ cursor.nodeName.toLowerCase() ] )
|
if ( FCKListsLib.BlockElements[ cursor.nodeName.toLowerCase() ] )
|
||||||
{
|
{
|
||||||
if ( cursor.firstChild == bStart )
|
if ( cursor.firstChild == bStart )
|
||||||
FCKDomTools.InsertAfterNode( bStart, bEnd ) ;
|
FCKDomTools.InsertAfterNode( bStart, bEnd ) ;
|
||||||
else
|
else
|
||||||
FCKDomTools.MoveNode( bEnd, cursor, true ) ;
|
FCKDomTools.MoveNode( bEnd, cursor, true ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var iterator = new FCKDomRangeIterator( range ) ;
|
var iterator = new FCKDomRangeIterator( range ) ;
|
||||||
var block ;
|
var block ;
|
||||||
|
|
||||||
if ( state == FCK_TRISTATE_OFF )
|
if ( state == FCK_TRISTATE_OFF )
|
||||||
{
|
{
|
||||||
iterator.EnforceRealBlocks = true ;
|
iterator.EnforceRealBlocks = true ;
|
||||||
var paragraphs = [] ;
|
var paragraphs = [] ;
|
||||||
while ( ( block = iterator.GetNextParagraph() ) )
|
while ( ( block = iterator.GetNextParagraph() ) )
|
||||||
paragraphs.push( block ) ;
|
paragraphs.push( block ) ;
|
||||||
|
|
||||||
// If no paragraphs, create one from the current selection position.
|
// If no paragraphs, create one from the current selection position.
|
||||||
if ( paragraphs.length < 1 )
|
if ( paragraphs.length < 1 )
|
||||||
{
|
{
|
||||||
para = range.Window.document.createElement( FCKConfig.EnterMode.IEquals( 'p' ) ? 'p' : 'div' ) ;
|
para = range.Window.document.createElement( FCKConfig.EnterMode.IEquals( 'p' ) ? 'p' : 'div' ) ;
|
||||||
range.InsertNode( para ) ;
|
range.InsertNode( para ) ;
|
||||||
para.appendChild( range.Window.document.createTextNode( '\ufeff' ) ) ;
|
para.appendChild( range.Window.document.createTextNode( '\ufeff' ) ) ;
|
||||||
range.MoveToBookmark( bookmark ) ;
|
range.MoveToBookmark( bookmark ) ;
|
||||||
range.MoveToNodeContents( para ) ;
|
range.MoveToNodeContents( para ) ;
|
||||||
range.Collapse( true ) ;
|
range.Collapse( true ) ;
|
||||||
bookmark = range.CreateBookmark() ;
|
bookmark = range.CreateBookmark() ;
|
||||||
paragraphs.push( para ) ;
|
paragraphs.push( para ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make sure all paragraphs have the same parent.
|
// Make sure all paragraphs have the same parent.
|
||||||
var commonParent = paragraphs[0].parentNode ;
|
var commonParent = paragraphs[0].parentNode ;
|
||||||
var tmp = [] ;
|
var tmp = [] ;
|
||||||
for ( var i = 0 ; i < paragraphs.length ; i++ )
|
for ( var i = 0 ; i < paragraphs.length ; i++ )
|
||||||
{
|
{
|
||||||
block = paragraphs[i] ;
|
block = paragraphs[i] ;
|
||||||
commonParent = FCKDomTools.GetCommonParents( block.parentNode, commonParent ).pop() ;
|
commonParent = FCKDomTools.GetCommonParents( block.parentNode, commonParent ).pop() ;
|
||||||
}
|
}
|
||||||
var lastBlock = null ;
|
var lastBlock = null ;
|
||||||
while ( paragraphs.length > 0 )
|
while ( paragraphs.length > 0 )
|
||||||
{
|
{
|
||||||
block = paragraphs.shift() ;
|
block = paragraphs.shift() ;
|
||||||
while ( block.parentNode != commonParent )
|
while ( block.parentNode != commonParent )
|
||||||
block = block.parentNode ;
|
block = block.parentNode ;
|
||||||
if ( block != lastBlock )
|
if ( block != lastBlock )
|
||||||
tmp.push( block ) ;
|
tmp.push( block ) ;
|
||||||
lastBlock = block ;
|
lastBlock = block ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If any of the selected blocks is a blockquote, remove it to prevent nested blockquotes.
|
// If any of the selected blocks is a blockquote, remove it to prevent nested blockquotes.
|
||||||
while ( tmp.length > 0 )
|
while ( tmp.length > 0 )
|
||||||
{
|
{
|
||||||
block = tmp.shift() ;
|
block = tmp.shift() ;
|
||||||
if ( block.nodeName.IEquals( 'blockquote' ) )
|
if ( block.nodeName.IEquals( 'blockquote' ) )
|
||||||
{
|
{
|
||||||
var docFrag = FCKTools.GetElementDocument( block ).createDocumentFragment() ;
|
var docFrag = FCKTools.GetElementDocument( block ).createDocumentFragment() ;
|
||||||
while ( block.firstChild )
|
while ( block.firstChild )
|
||||||
{
|
{
|
||||||
docFrag.appendChild( block.removeChild( block.firstChild ) ) ;
|
docFrag.appendChild( block.removeChild( block.firstChild ) ) ;
|
||||||
paragraphs.push( docFrag.lastChild ) ;
|
paragraphs.push( docFrag.lastChild ) ;
|
||||||
}
|
}
|
||||||
block.parentNode.replaceChild( docFrag, block ) ;
|
block.parentNode.replaceChild( docFrag, block ) ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
paragraphs.push( block ) ;
|
paragraphs.push( block ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now we have all the blocks to be included in a new blockquote node.
|
// Now we have all the blocks to be included in a new blockquote node.
|
||||||
var bqBlock = range.Window.document.createElement( 'blockquote' ) ;
|
var bqBlock = range.Window.document.createElement( 'blockquote' ) ;
|
||||||
commonParent.insertBefore( bqBlock, paragraphs[0] ) ;
|
commonParent.insertBefore( bqBlock, paragraphs[0] ) ;
|
||||||
while ( paragraphs.length > 0 )
|
while ( paragraphs.length > 0 )
|
||||||
{
|
{
|
||||||
block = paragraphs.shift() ;
|
block = paragraphs.shift() ;
|
||||||
bqBlock.appendChild( block ) ;
|
bqBlock.appendChild( block ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ( state == FCK_TRISTATE_ON )
|
else if ( state == FCK_TRISTATE_ON )
|
||||||
{
|
{
|
||||||
var moveOutNodes = [] ;
|
var moveOutNodes = [] ;
|
||||||
while ( ( block = iterator.GetNextParagraph() ) )
|
while ( ( block = iterator.GetNextParagraph() ) )
|
||||||
{
|
{
|
||||||
var bqParent = null ;
|
var bqParent = null ;
|
||||||
var bqChild = null ;
|
var bqChild = null ;
|
||||||
while ( block.parentNode )
|
while ( block.parentNode )
|
||||||
{
|
{
|
||||||
if ( block.parentNode.nodeName.IEquals( 'blockquote' ) )
|
if ( block.parentNode.nodeName.IEquals( 'blockquote' ) )
|
||||||
{
|
{
|
||||||
bqParent = block.parentNode ;
|
bqParent = block.parentNode ;
|
||||||
bqChild = block ;
|
bqChild = block ;
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
block = block.parentNode ;
|
block = block.parentNode ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( bqParent && bqChild )
|
if ( bqParent && bqChild )
|
||||||
moveOutNodes.push( bqChild ) ;
|
moveOutNodes.push( bqChild ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
var movedNodes = [] ;
|
var movedNodes = [] ;
|
||||||
while ( moveOutNodes.length > 0 )
|
while ( moveOutNodes.length > 0 )
|
||||||
{
|
{
|
||||||
var node = moveOutNodes.shift() ;
|
var node = moveOutNodes.shift() ;
|
||||||
var bqBlock = node.parentNode ;
|
var bqBlock = node.parentNode ;
|
||||||
|
|
||||||
// If the node is located at the beginning or the end, just take it out without splitting.
|
// If the node is located at the beginning or the end, just take it out without splitting.
|
||||||
// Otherwise, split the blockquote node and move the paragraph in between the two blockquote nodes.
|
// Otherwise, split the blockquote node and move the paragraph in between the two blockquote nodes.
|
||||||
if ( node == node.parentNode.firstChild )
|
if ( node == node.parentNode.firstChild )
|
||||||
{
|
{
|
||||||
bqBlock.parentNode.insertBefore( bqBlock.removeChild( node ), bqBlock ) ;
|
bqBlock.parentNode.insertBefore( bqBlock.removeChild( node ), bqBlock ) ;
|
||||||
if ( ! bqBlock.firstChild )
|
if ( ! bqBlock.firstChild )
|
||||||
bqBlock.parentNode.removeChild( bqBlock ) ;
|
bqBlock.parentNode.removeChild( bqBlock ) ;
|
||||||
}
|
}
|
||||||
else if ( node == node.parentNode.lastChild )
|
else if ( node == node.parentNode.lastChild )
|
||||||
{
|
{
|
||||||
bqBlock.parentNode.insertBefore( bqBlock.removeChild( node ), bqBlock.nextSibling ) ;
|
bqBlock.parentNode.insertBefore( bqBlock.removeChild( node ), bqBlock.nextSibling ) ;
|
||||||
if ( ! bqBlock.firstChild )
|
if ( ! bqBlock.firstChild )
|
||||||
bqBlock.parentNode.removeChild( bqBlock ) ;
|
bqBlock.parentNode.removeChild( bqBlock ) ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
FCKDomTools.BreakParent( node, node.parentNode, range ) ;
|
FCKDomTools.BreakParent( node, node.parentNode, range ) ;
|
||||||
|
|
||||||
movedNodes.push( node ) ;
|
movedNodes.push( node ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( FCKConfig.EnterMode.IEquals( 'br' ) )
|
if ( FCKConfig.EnterMode.IEquals( 'br' ) )
|
||||||
{
|
{
|
||||||
while ( movedNodes.length )
|
while ( movedNodes.length )
|
||||||
{
|
{
|
||||||
var node = movedNodes.shift() ;
|
var node = movedNodes.shift() ;
|
||||||
var firstTime = true ;
|
var firstTime = true ;
|
||||||
if ( node.nodeName.IEquals( 'div' ) )
|
if ( node.nodeName.IEquals( 'div' ) )
|
||||||
{
|
{
|
||||||
var docFrag = FCKTools.GetElementDocument( node ).createDocumentFragment() ;
|
var docFrag = FCKTools.GetElementDocument( node ).createDocumentFragment() ;
|
||||||
var needBeginBr = firstTime && node.previousSibling &&
|
var needBeginBr = firstTime && node.previousSibling &&
|
||||||
!FCKListsLib.BlockBoundaries[node.previousSibling.nodeName.toLowerCase()] ;
|
!FCKListsLib.BlockBoundaries[node.previousSibling.nodeName.toLowerCase()] ;
|
||||||
if ( firstTime && needBeginBr )
|
if ( firstTime && needBeginBr )
|
||||||
docFrag.appendChild( FCKTools.GetElementDocument( node ).createElement( 'br' ) ) ;
|
docFrag.appendChild( FCKTools.GetElementDocument( node ).createElement( 'br' ) ) ;
|
||||||
var needEndBr = node.nextSibling &&
|
var needEndBr = node.nextSibling &&
|
||||||
!FCKListsLib.BlockBoundaries[node.nextSibling.nodeName.toLowerCase()] ;
|
!FCKListsLib.BlockBoundaries[node.nextSibling.nodeName.toLowerCase()] ;
|
||||||
while ( node.firstChild )
|
while ( node.firstChild )
|
||||||
docFrag.appendChild( node.removeChild( node.firstChild ) ) ;
|
docFrag.appendChild( node.removeChild( node.firstChild ) ) ;
|
||||||
if ( needEndBr )
|
if ( needEndBr )
|
||||||
docFrag.appendChild( FCKTools.GetElementDocument( node ).createElement( 'br' ) ) ;
|
docFrag.appendChild( FCKTools.GetElementDocument( node ).createElement( 'br' ) ) ;
|
||||||
node.parentNode.replaceChild( docFrag, node ) ;
|
node.parentNode.replaceChild( docFrag, node ) ;
|
||||||
firstTime = false ;
|
firstTime = false ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
range.MoveToBookmark( bookmark ) ;
|
range.MoveToBookmark( bookmark ) ;
|
||||||
range.Select() ;
|
range.Select() ;
|
||||||
|
|
||||||
FCK.Focus() ;
|
FCK.Focus() ;
|
||||||
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
GetState : function()
|
GetState : function()
|
||||||
{
|
{
|
||||||
// Disabled if not WYSIWYG.
|
// Disabled if not WYSIWYG.
|
||||||
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || ! FCK.EditorWindow )
|
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || ! FCK.EditorWindow )
|
||||||
return FCK_TRISTATE_DISABLED ;
|
return FCK_TRISTATE_DISABLED ;
|
||||||
|
|
||||||
var path = new FCKElementPath( FCKSelection.GetBoundaryParentElement( true ) ) ;
|
var path = new FCKElementPath( FCKSelection.GetBoundaryParentElement( true ) ) ;
|
||||||
var firstBlock = path.Block || path.BlockLimit ;
|
var firstBlock = path.Block || path.BlockLimit ;
|
||||||
|
|
||||||
if ( !firstBlock || firstBlock.nodeName.toLowerCase() == 'body' )
|
if ( !firstBlock || firstBlock.nodeName.toLowerCase() == 'body' )
|
||||||
return FCK_TRISTATE_OFF ;
|
return FCK_TRISTATE_OFF ;
|
||||||
|
|
||||||
// See if the first block has a blockquote parent.
|
// See if the first block has a blockquote parent.
|
||||||
for ( var i = 0 ; i < path.Elements.length ; i++ )
|
for ( var i = 0 ; i < path.Elements.length ; i++ )
|
||||||
{
|
{
|
||||||
if ( path.Elements[i].nodeName.IEquals( 'blockquote' ) )
|
if ( path.Elements[i].nodeName.IEquals( 'blockquote' ) )
|
||||||
return FCK_TRISTATE_ON ;
|
return FCK_TRISTATE_ON ;
|
||||||
}
|
}
|
||||||
return FCK_TRISTATE_OFF ;
|
return FCK_TRISTATE_OFF ;
|
||||||
}
|
}
|
||||||
} ;
|
} ;
|
||||||
|
@ -1,61 +1,61 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKCoreStyleCommand Class: controls the execution of a core style. Core
|
* FCKCoreStyleCommand Class: controls the execution of a core style. Core
|
||||||
* styles are usually represented as buttons in the toolbar., like Bold and
|
* styles are usually represented as buttons in the toolbar., like Bold and
|
||||||
* Italic.
|
* Italic.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKCoreStyleCommand = function( coreStyleName )
|
var FCKCoreStyleCommand = function( coreStyleName )
|
||||||
{
|
{
|
||||||
this.Name = 'CoreStyle' ;
|
this.Name = 'CoreStyle' ;
|
||||||
this.StyleName = '_FCK_' + coreStyleName ;
|
this.StyleName = '_FCK_' + coreStyleName ;
|
||||||
this.IsActive = false ;
|
this.IsActive = false ;
|
||||||
|
|
||||||
FCKStyles.AttachStyleStateChange( this.StyleName, this._OnStyleStateChange, this ) ;
|
FCKStyles.AttachStyleStateChange( this.StyleName, this._OnStyleStateChange, this ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKCoreStyleCommand.prototype =
|
FCKCoreStyleCommand.prototype =
|
||||||
{
|
{
|
||||||
Execute : function()
|
Execute : function()
|
||||||
{
|
{
|
||||||
FCKUndo.SaveUndoStep() ;
|
FCKUndo.SaveUndoStep() ;
|
||||||
|
|
||||||
if ( this.IsActive )
|
if ( this.IsActive )
|
||||||
FCKStyles.RemoveStyle( this.StyleName ) ;
|
FCKStyles.RemoveStyle( this.StyleName ) ;
|
||||||
else
|
else
|
||||||
FCKStyles.ApplyStyle( this.StyleName ) ;
|
FCKStyles.ApplyStyle( this.StyleName ) ;
|
||||||
|
|
||||||
FCK.Focus() ;
|
FCK.Focus() ;
|
||||||
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
GetState : function()
|
GetState : function()
|
||||||
{
|
{
|
||||||
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
|
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
|
||||||
return FCK_TRISTATE_DISABLED ;
|
return FCK_TRISTATE_DISABLED ;
|
||||||
return this.IsActive ? FCK_TRISTATE_ON : FCK_TRISTATE_OFF ;
|
return this.IsActive ? FCK_TRISTATE_ON : FCK_TRISTATE_OFF ;
|
||||||
},
|
},
|
||||||
|
|
||||||
_OnStyleStateChange : function( styleName, isActive )
|
_OnStyleStateChange : function( styleName, isActive )
|
||||||
{
|
{
|
||||||
this.IsActive = isActive ;
|
this.IsActive = isActive ;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1,180 +1,190 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Stretch the editor to full window size and back.
|
* Stretch the editor to full window size and back.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKFitWindow = function()
|
var FCKFitWindow = function()
|
||||||
{
|
{
|
||||||
this.Name = 'FitWindow' ;
|
this.Name = 'FitWindow' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKFitWindow.prototype.Execute = function()
|
FCKFitWindow.prototype.Execute = function()
|
||||||
{
|
{
|
||||||
var eEditorFrame = window.frameElement ;
|
var eEditorFrame = window.frameElement ;
|
||||||
var eEditorFrameStyle = eEditorFrame.style ;
|
var eEditorFrameStyle = eEditorFrame.style ;
|
||||||
|
|
||||||
var eMainWindow = parent ;
|
var eMainWindow = parent ;
|
||||||
var eDocEl = eMainWindow.document.documentElement ;
|
var eDocEl = eMainWindow.document.documentElement ;
|
||||||
var eBody = eMainWindow.document.body ;
|
var eBody = eMainWindow.document.body ;
|
||||||
var eBodyStyle = eBody.style ;
|
var eBodyStyle = eBody.style ;
|
||||||
var eParent ;
|
var eParent ;
|
||||||
|
|
||||||
// No original style properties known? Go fullscreen.
|
// Save the current selection and scroll position.
|
||||||
if ( !this.IsMaximized )
|
var oRange = new FCKDomRange( FCK.EditorWindow ) ;
|
||||||
{
|
oRange.MoveToSelection() ;
|
||||||
// Registering an event handler when the window gets resized.
|
var oEditorScrollPos = FCKTools.GetScrollPosition( FCK.EditorWindow ) ;
|
||||||
if( FCKBrowserInfo.IsIE )
|
|
||||||
eMainWindow.attachEvent( 'onresize', FCKFitWindow_Resize ) ;
|
// No original style properties known? Go fullscreen.
|
||||||
else
|
if ( !this.IsMaximized )
|
||||||
eMainWindow.addEventListener( 'resize', FCKFitWindow_Resize, true ) ;
|
{
|
||||||
|
// Registering an event handler when the window gets resized.
|
||||||
// Save the scrollbars position.
|
if( FCKBrowserInfo.IsIE )
|
||||||
this._ScrollPos = FCKTools.GetScrollPosition( eMainWindow ) ;
|
eMainWindow.attachEvent( 'onresize', FCKFitWindow_Resize ) ;
|
||||||
|
else
|
||||||
// Save and reset the styles for the entire node tree. They could interfere in the result.
|
eMainWindow.addEventListener( 'resize', FCKFitWindow_Resize, true ) ;
|
||||||
eParent = eEditorFrame ;
|
|
||||||
// The extra () is to avoid a warning with strict error checking. This is ok.
|
// Save the scrollbars position.
|
||||||
while( (eParent = eParent.parentNode) )
|
this._ScrollPos = FCKTools.GetScrollPosition( eMainWindow ) ;
|
||||||
{
|
|
||||||
if ( eParent.nodeType == 1 )
|
// Save and reset the styles for the entire node tree. They could interfere in the result.
|
||||||
{
|
eParent = eEditorFrame ;
|
||||||
eParent._fckSavedStyles = FCKTools.SaveStyles( eParent ) ;
|
// The extra () is to avoid a warning with strict error checking. This is ok.
|
||||||
eParent.style.zIndex = FCKConfig.FloatingPanelsZIndex - 1 ;
|
while( (eParent = eParent.parentNode) )
|
||||||
}
|
{
|
||||||
}
|
if ( eParent.nodeType == 1 )
|
||||||
|
{
|
||||||
// Hide IE scrollbars (in strict mode).
|
eParent._fckSavedStyles = FCKTools.SaveStyles( eParent ) ;
|
||||||
if ( FCKBrowserInfo.IsIE )
|
eParent.style.zIndex = FCKConfig.FloatingPanelsZIndex - 1 ;
|
||||||
{
|
}
|
||||||
this.documentElementOverflow = eDocEl.style.overflow ;
|
}
|
||||||
eDocEl.style.overflow = 'hidden' ;
|
|
||||||
eBodyStyle.overflow = 'hidden' ;
|
// Hide IE scrollbars (in strict mode).
|
||||||
}
|
if ( FCKBrowserInfo.IsIE )
|
||||||
else
|
{
|
||||||
{
|
this.documentElementOverflow = eDocEl.style.overflow ;
|
||||||
// Hide the scroolbars in Firefox.
|
eDocEl.style.overflow = 'hidden' ;
|
||||||
eBodyStyle.overflow = 'hidden' ;
|
eBodyStyle.overflow = 'hidden' ;
|
||||||
eBodyStyle.width = '0px' ;
|
}
|
||||||
eBodyStyle.height = '0px' ;
|
else
|
||||||
}
|
{
|
||||||
|
// Hide the scroolbars in Firefox.
|
||||||
// Save the IFRAME styles.
|
eBodyStyle.overflow = 'hidden' ;
|
||||||
this._EditorFrameStyles = FCKTools.SaveStyles( eEditorFrame ) ;
|
eBodyStyle.width = '0px' ;
|
||||||
|
eBodyStyle.height = '0px' ;
|
||||||
// Resize.
|
}
|
||||||
var oViewPaneSize = FCKTools.GetViewPaneSize( eMainWindow ) ;
|
|
||||||
|
// Save the IFRAME styles.
|
||||||
eEditorFrameStyle.position = "absolute";
|
this._EditorFrameStyles = FCKTools.SaveStyles( eEditorFrame ) ;
|
||||||
eEditorFrameStyle.zIndex = FCKConfig.FloatingPanelsZIndex - 1;
|
|
||||||
eEditorFrameStyle.left = "0px";
|
// Resize.
|
||||||
eEditorFrameStyle.top = "0px";
|
var oViewPaneSize = FCKTools.GetViewPaneSize( eMainWindow ) ;
|
||||||
eEditorFrameStyle.width = oViewPaneSize.Width + "px";
|
|
||||||
eEditorFrameStyle.height = oViewPaneSize.Height + "px";
|
eEditorFrameStyle.position = "absolute";
|
||||||
|
eEditorFrame.offsetLeft ; // Kludge for Safari 3.1 browser bug, do not remove. See #2066.
|
||||||
// Giving the frame some (huge) borders on his right and bottom
|
eEditorFrameStyle.zIndex = FCKConfig.FloatingPanelsZIndex - 1;
|
||||||
// side to hide the background that would otherwise show when the
|
eEditorFrameStyle.left = "0px";
|
||||||
// editor is in fullsize mode and the window is increased in size
|
eEditorFrameStyle.top = "0px";
|
||||||
// not for IE, because IE immediately adapts the editor on resize,
|
eEditorFrameStyle.width = oViewPaneSize.Width + "px";
|
||||||
// without showing any of the background oddly in firefox, the
|
eEditorFrameStyle.height = oViewPaneSize.Height + "px";
|
||||||
// editor seems not to fill the whole frame, so just setting the
|
|
||||||
// background of it to white to cover the page laying behind it anyway.
|
// Giving the frame some (huge) borders on his right and bottom
|
||||||
if ( !FCKBrowserInfo.IsIE )
|
// side to hide the background that would otherwise show when the
|
||||||
{
|
// editor is in fullsize mode and the window is increased in size
|
||||||
eEditorFrameStyle.borderRight = eEditorFrameStyle.borderBottom = "9999px solid white" ;
|
// not for IE, because IE immediately adapts the editor on resize,
|
||||||
eEditorFrameStyle.backgroundColor = "white";
|
// without showing any of the background oddly in firefox, the
|
||||||
}
|
// editor seems not to fill the whole frame, so just setting the
|
||||||
|
// background of it to white to cover the page laying behind it anyway.
|
||||||
// Scroll to top left.
|
if ( !FCKBrowserInfo.IsIE )
|
||||||
eMainWindow.scrollTo(0, 0);
|
{
|
||||||
|
eEditorFrameStyle.borderRight = eEditorFrameStyle.borderBottom = "9999px solid white" ;
|
||||||
// Is the editor still not on the top left? Let's find out and fix that as well. (Bug #174)
|
eEditorFrameStyle.backgroundColor = "white";
|
||||||
var editorPos = FCKTools.GetWindowPosition( eMainWindow, eEditorFrame ) ;
|
}
|
||||||
if ( editorPos.x != 0 )
|
|
||||||
eEditorFrameStyle.left = ( -1 * editorPos.x ) + "px" ;
|
// Scroll to top left.
|
||||||
if ( editorPos.y != 0 )
|
eMainWindow.scrollTo(0, 0);
|
||||||
eEditorFrameStyle.top = ( -1 * editorPos.y ) + "px" ;
|
|
||||||
|
// Is the editor still not on the top left? Let's find out and fix that as well. (Bug #174)
|
||||||
this.IsMaximized = true ;
|
var editorPos = FCKTools.GetWindowPosition( eMainWindow, eEditorFrame ) ;
|
||||||
}
|
if ( editorPos.x != 0 )
|
||||||
else // Resize to original size.
|
eEditorFrameStyle.left = ( -1 * editorPos.x ) + "px" ;
|
||||||
{
|
if ( editorPos.y != 0 )
|
||||||
// Remove the event handler of window resizing.
|
eEditorFrameStyle.top = ( -1 * editorPos.y ) + "px" ;
|
||||||
if( FCKBrowserInfo.IsIE )
|
|
||||||
eMainWindow.detachEvent( "onresize", FCKFitWindow_Resize ) ;
|
this.IsMaximized = true ;
|
||||||
else
|
}
|
||||||
eMainWindow.removeEventListener( "resize", FCKFitWindow_Resize, true ) ;
|
else // Resize to original size.
|
||||||
|
{
|
||||||
// Restore the CSS position for the entire node tree.
|
// Remove the event handler of window resizing.
|
||||||
eParent = eEditorFrame ;
|
if( FCKBrowserInfo.IsIE )
|
||||||
// The extra () is to avoid a warning with strict error checking. This is ok.
|
eMainWindow.detachEvent( "onresize", FCKFitWindow_Resize ) ;
|
||||||
while( (eParent = eParent.parentNode) )
|
else
|
||||||
{
|
eMainWindow.removeEventListener( "resize", FCKFitWindow_Resize, true ) ;
|
||||||
if ( eParent._fckSavedStyles )
|
|
||||||
{
|
// Restore the CSS position for the entire node tree.
|
||||||
FCKTools.RestoreStyles( eParent, eParent._fckSavedStyles ) ;
|
eParent = eEditorFrame ;
|
||||||
eParent._fckSavedStyles = null ;
|
// The extra () is to avoid a warning with strict error checking. This is ok.
|
||||||
}
|
while( (eParent = eParent.parentNode) )
|
||||||
}
|
{
|
||||||
|
if ( eParent._fckSavedStyles )
|
||||||
// Restore IE scrollbars
|
{
|
||||||
if ( FCKBrowserInfo.IsIE )
|
FCKTools.RestoreStyles( eParent, eParent._fckSavedStyles ) ;
|
||||||
eDocEl.style.overflow = this.documentElementOverflow ;
|
eParent._fckSavedStyles = null ;
|
||||||
|
}
|
||||||
// Restore original size
|
}
|
||||||
FCKTools.RestoreStyles( eEditorFrame, this._EditorFrameStyles ) ;
|
|
||||||
|
// Restore IE scrollbars
|
||||||
// Restore the window scroll position.
|
if ( FCKBrowserInfo.IsIE )
|
||||||
eMainWindow.scrollTo( this._ScrollPos.X, this._ScrollPos.Y ) ;
|
eDocEl.style.overflow = this.documentElementOverflow ;
|
||||||
|
|
||||||
this.IsMaximized = false ;
|
// Restore original size
|
||||||
}
|
FCKTools.RestoreStyles( eEditorFrame, this._EditorFrameStyles ) ;
|
||||||
|
|
||||||
FCKToolbarItems.GetItem('FitWindow').RefreshState() ;
|
// Restore the window scroll position.
|
||||||
|
eMainWindow.scrollTo( this._ScrollPos.X, this._ScrollPos.Y ) ;
|
||||||
// It seams that Firefox restarts the editing area when making this changes.
|
|
||||||
// On FF 1.0.x, the area is not anymore editable. On FF 1.5+, the special
|
this.IsMaximized = false ;
|
||||||
//configuration, like DisableFFTableHandles and DisableObjectResizing get
|
}
|
||||||
//lost, so we must reset it. Also, the cursor position and selection are
|
|
||||||
//also lost, even if you comment the following line (MakeEditable).
|
FCKToolbarItems.GetItem('FitWindow').RefreshState() ;
|
||||||
// if ( FCKBrowserInfo.IsGecko10 ) // Initially I thought it was a FF 1.0 only problem.
|
|
||||||
if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
|
// It seams that Firefox restarts the editing area when making this changes.
|
||||||
FCK.EditingArea.MakeEditable() ;
|
// On FF 1.0.x, the area is not anymore editable. On FF 1.5+, the special
|
||||||
|
//configuration, like DisableFFTableHandles and DisableObjectResizing get
|
||||||
FCK.Focus() ;
|
//lost, so we must reset it. Also, the cursor position and selection are
|
||||||
}
|
//also lost, even if you comment the following line (MakeEditable).
|
||||||
|
// if ( FCKBrowserInfo.IsGecko10 ) // Initially I thought it was a FF 1.0 only problem.
|
||||||
FCKFitWindow.prototype.GetState = function()
|
if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
|
||||||
{
|
FCK.EditingArea.MakeEditable() ;
|
||||||
if ( FCKConfig.ToolbarLocation != 'In' )
|
|
||||||
return FCK_TRISTATE_DISABLED ;
|
FCK.Focus() ;
|
||||||
else
|
|
||||||
return ( this.IsMaximized ? FCK_TRISTATE_ON : FCK_TRISTATE_OFF );
|
// Restore the selection and scroll position of inside the document.
|
||||||
}
|
oRange.Select() ;
|
||||||
|
FCK.EditorWindow.scrollTo( oEditorScrollPos.X, oEditorScrollPos.Y ) ;
|
||||||
function FCKFitWindow_Resize()
|
}
|
||||||
{
|
|
||||||
var oViewPaneSize = FCKTools.GetViewPaneSize( parent ) ;
|
FCKFitWindow.prototype.GetState = function()
|
||||||
|
{
|
||||||
var eEditorFrameStyle = window.frameElement.style ;
|
if ( FCKConfig.ToolbarLocation != 'In' )
|
||||||
|
return FCK_TRISTATE_DISABLED ;
|
||||||
eEditorFrameStyle.width = oViewPaneSize.Width + 'px' ;
|
else
|
||||||
eEditorFrameStyle.height = oViewPaneSize.Height + 'px' ;
|
return ( this.IsMaximized ? FCK_TRISTATE_ON : FCK_TRISTATE_OFF );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function FCKFitWindow_Resize()
|
||||||
|
{
|
||||||
|
var oViewPaneSize = FCKTools.GetViewPaneSize( parent ) ;
|
||||||
|
|
||||||
|
var eEditorFrameStyle = window.frameElement.style ;
|
||||||
|
|
||||||
|
eEditorFrameStyle.width = oViewPaneSize.Width + 'px' ;
|
||||||
|
eEditorFrameStyle.height = oViewPaneSize.Height + 'px' ;
|
||||||
|
}
|
||||||
|
@ -1,282 +1,282 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKIndentCommand Class: controls block indentation.
|
* FCKIndentCommand Class: controls block indentation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKIndentCommand = function( name, offset )
|
var FCKIndentCommand = function( name, offset )
|
||||||
{
|
{
|
||||||
this.Name = name ;
|
this.Name = name ;
|
||||||
this.Offset = offset ;
|
this.Offset = offset ;
|
||||||
this.IndentCSSProperty = FCKConfig.ContentLangDirection.IEquals( 'ltr' ) ? 'marginLeft' : 'marginRight' ;
|
this.IndentCSSProperty = FCKConfig.ContentLangDirection.IEquals( 'ltr' ) ? 'marginLeft' : 'marginRight' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKIndentCommand._InitIndentModeParameters = function()
|
FCKIndentCommand._InitIndentModeParameters = function()
|
||||||
{
|
{
|
||||||
if ( FCKConfig.IndentClasses && FCKConfig.IndentClasses.length > 0 )
|
if ( FCKConfig.IndentClasses && FCKConfig.IndentClasses.length > 0 )
|
||||||
{
|
{
|
||||||
this._UseIndentClasses = true ;
|
this._UseIndentClasses = true ;
|
||||||
this._IndentClassMap = {} ;
|
this._IndentClassMap = {} ;
|
||||||
for ( var i = 0 ; i < FCKConfig.IndentClasses.length ;i++ )
|
for ( var i = 0 ; i < FCKConfig.IndentClasses.length ;i++ )
|
||||||
this._IndentClassMap[FCKConfig.IndentClasses[i]] = i + 1 ;
|
this._IndentClassMap[FCKConfig.IndentClasses[i]] = i + 1 ;
|
||||||
this._ClassNameRegex = new RegExp( '(?:^|\\s+)(' + FCKConfig.IndentClasses.join( '|' ) + ')(?=$|\\s)' ) ;
|
this._ClassNameRegex = new RegExp( '(?:^|\\s+)(' + FCKConfig.IndentClasses.join( '|' ) + ')(?=$|\\s)' ) ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
this._UseIndentClasses = false ;
|
this._UseIndentClasses = false ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
FCKIndentCommand.prototype =
|
FCKIndentCommand.prototype =
|
||||||
{
|
{
|
||||||
Execute : function()
|
Execute : function()
|
||||||
{
|
{
|
||||||
// Save an undo snapshot before doing anything.
|
// Save an undo snapshot before doing anything.
|
||||||
FCKUndo.SaveUndoStep() ;
|
FCKUndo.SaveUndoStep() ;
|
||||||
|
|
||||||
var range = new FCKDomRange( FCK.EditorWindow ) ;
|
var range = new FCKDomRange( FCK.EditorWindow ) ;
|
||||||
range.MoveToSelection() ;
|
range.MoveToSelection() ;
|
||||||
var bookmark = range.CreateBookmark() ;
|
var bookmark = range.CreateBookmark() ;
|
||||||
|
|
||||||
// Two cases to handle here: either we're in a list, or not.
|
// Two cases to handle here: either we're in a list, or not.
|
||||||
// If we're in a list, then the indent/outdent operations would be done on the list nodes.
|
// If we're in a list, then the indent/outdent operations would be done on the list nodes.
|
||||||
// Otherwise, apply the operation on the nearest block nodes.
|
// Otherwise, apply the operation on the nearest block nodes.
|
||||||
var nearestListBlock = FCKDomTools.GetCommonParentNode( range.StartNode || range.StartContainer ,
|
var nearestListBlock = FCKDomTools.GetCommonParentNode( range.StartNode || range.StartContainer ,
|
||||||
range.EndNode || range.EndContainer,
|
range.EndNode || range.EndContainer,
|
||||||
['ul', 'ol'] ) ;
|
['ul', 'ol'] ) ;
|
||||||
if ( nearestListBlock )
|
if ( nearestListBlock )
|
||||||
this._IndentList( range, nearestListBlock ) ;
|
this._IndentList( range, nearestListBlock ) ;
|
||||||
else
|
else
|
||||||
this._IndentBlock( range ) ;
|
this._IndentBlock( range ) ;
|
||||||
|
|
||||||
range.MoveToBookmark( bookmark ) ;
|
range.MoveToBookmark( bookmark ) ;
|
||||||
range.Select() ;
|
range.Select() ;
|
||||||
|
|
||||||
FCK.Focus() ;
|
FCK.Focus() ;
|
||||||
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
GetState : function()
|
GetState : function()
|
||||||
{
|
{
|
||||||
// Disabled if not WYSIWYG.
|
// Disabled if not WYSIWYG.
|
||||||
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || ! FCK.EditorWindow )
|
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || ! FCK.EditorWindow )
|
||||||
return FCK_TRISTATE_DISABLED ;
|
return FCK_TRISTATE_DISABLED ;
|
||||||
|
|
||||||
// Initialize parameters if not already initialzed.
|
// Initialize parameters if not already initialzed.
|
||||||
if ( FCKIndentCommand._UseIndentClasses == undefined )
|
if ( FCKIndentCommand._UseIndentClasses == undefined )
|
||||||
FCKIndentCommand._InitIndentModeParameters() ;
|
FCKIndentCommand._InitIndentModeParameters() ;
|
||||||
|
|
||||||
// If we're not in a list, and the starting block's indentation is zero, and the current
|
// If we're not in a list, and the starting block's indentation is zero, and the current
|
||||||
// command is the outdent command, then we should return FCK_TRISTATE_DISABLED.
|
// command is the outdent command, then we should return FCK_TRISTATE_DISABLED.
|
||||||
var startContainer = FCKSelection.GetBoundaryParentElement( true ) ;
|
var startContainer = FCKSelection.GetBoundaryParentElement( true ) ;
|
||||||
var endContainer = FCKSelection.GetBoundaryParentElement( false ) ;
|
var endContainer = FCKSelection.GetBoundaryParentElement( false ) ;
|
||||||
var listNode = FCKDomTools.GetCommonParentNode( startContainer, endContainer, ['ul','ol'] ) ;
|
var listNode = FCKDomTools.GetCommonParentNode( startContainer, endContainer, ['ul','ol'] ) ;
|
||||||
|
|
||||||
if ( listNode )
|
if ( listNode )
|
||||||
{
|
{
|
||||||
if ( this.Name.IEquals( 'outdent' ) )
|
if ( this.Name.IEquals( 'outdent' ) )
|
||||||
return FCK_TRISTATE_OFF ;
|
return FCK_TRISTATE_OFF ;
|
||||||
var firstItem = FCKTools.GetElementAscensor( startContainer, 'li' ) ;
|
var firstItem = FCKTools.GetElementAscensor( startContainer, 'li' ) ;
|
||||||
if ( !firstItem || !firstItem.previousSibling )
|
if ( !firstItem || !firstItem.previousSibling )
|
||||||
return FCK_TRISTATE_DISABLED ;
|
return FCK_TRISTATE_DISABLED ;
|
||||||
return FCK_TRISTATE_OFF ;
|
return FCK_TRISTATE_OFF ;
|
||||||
}
|
}
|
||||||
if ( ! FCKIndentCommand._UseIndentClasses && this.Name.IEquals( 'indent' ) )
|
if ( ! FCKIndentCommand._UseIndentClasses && this.Name.IEquals( 'indent' ) )
|
||||||
return FCK_TRISTATE_OFF;
|
return FCK_TRISTATE_OFF;
|
||||||
|
|
||||||
var path = new FCKElementPath( startContainer ) ;
|
var path = new FCKElementPath( startContainer ) ;
|
||||||
var firstBlock = path.Block || path.BlockLimit ;
|
var firstBlock = path.Block || path.BlockLimit ;
|
||||||
if ( !firstBlock )
|
if ( !firstBlock )
|
||||||
return FCK_TRISTATE_DISABLED ;
|
return FCK_TRISTATE_DISABLED ;
|
||||||
|
|
||||||
if ( FCKIndentCommand._UseIndentClasses )
|
if ( FCKIndentCommand._UseIndentClasses )
|
||||||
{
|
{
|
||||||
var indentClass = firstBlock.className.match( FCKIndentCommand._ClassNameRegex ) ;
|
var indentClass = firstBlock.className.match( FCKIndentCommand._ClassNameRegex ) ;
|
||||||
var indentStep = 0 ;
|
var indentStep = 0 ;
|
||||||
if ( indentClass != null )
|
if ( indentClass != null )
|
||||||
{
|
{
|
||||||
indentClass = indentClass[1] ;
|
indentClass = indentClass[1] ;
|
||||||
indentStep = FCKIndentCommand._IndentClassMap[indentClass] ;
|
indentStep = FCKIndentCommand._IndentClassMap[indentClass] ;
|
||||||
}
|
}
|
||||||
if ( ( this.Name == 'outdent' && indentStep == 0 ) ||
|
if ( ( this.Name == 'outdent' && indentStep == 0 ) ||
|
||||||
( this.Name == 'indent' && indentStep == FCKConfig.IndentClasses.length ) )
|
( this.Name == 'indent' && indentStep == FCKConfig.IndentClasses.length ) )
|
||||||
return FCK_TRISTATE_DISABLED ;
|
return FCK_TRISTATE_DISABLED ;
|
||||||
return FCK_TRISTATE_OFF ;
|
return FCK_TRISTATE_OFF ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var indent = parseInt( firstBlock.style[this.IndentCSSProperty], 10 ) ;
|
var indent = parseInt( firstBlock.style[this.IndentCSSProperty], 10 ) ;
|
||||||
if ( isNaN( indent ) )
|
if ( isNaN( indent ) )
|
||||||
indent = 0 ;
|
indent = 0 ;
|
||||||
if ( indent <= 0 )
|
if ( indent <= 0 )
|
||||||
return FCK_TRISTATE_DISABLED ;
|
return FCK_TRISTATE_DISABLED ;
|
||||||
return FCK_TRISTATE_OFF ;
|
return FCK_TRISTATE_OFF ;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_IndentBlock : function( range )
|
_IndentBlock : function( range )
|
||||||
{
|
{
|
||||||
var iterator = new FCKDomRangeIterator( range ) ;
|
var iterator = new FCKDomRangeIterator( range ) ;
|
||||||
iterator.EnforceRealBlocks = true ;
|
iterator.EnforceRealBlocks = true ;
|
||||||
|
|
||||||
range.Expand( 'block_contents' ) ;
|
range.Expand( 'block_contents' ) ;
|
||||||
var commonParents = FCKDomTools.GetCommonParents( range.StartContainer, range.EndContainer ) ;
|
var commonParents = FCKDomTools.GetCommonParents( range.StartContainer, range.EndContainer ) ;
|
||||||
var nearestParent = commonParents[commonParents.length - 1] ;
|
var nearestParent = commonParents[commonParents.length - 1] ;
|
||||||
var block ;
|
var block ;
|
||||||
|
|
||||||
while ( ( block = iterator.GetNextParagraph() ) )
|
while ( ( block = iterator.GetNextParagraph() ) )
|
||||||
{
|
{
|
||||||
// We don't want to indent subtrees recursively, so only perform the indent operation
|
// We don't want to indent subtrees recursively, so only perform the indent operation
|
||||||
// if the block itself is the nearestParent, or the block's parent is the nearestParent.
|
// if the block itself is the nearestParent, or the block's parent is the nearestParent.
|
||||||
if ( ! ( block == nearestParent || block.parentNode == nearestParent ) )
|
if ( ! ( block == nearestParent || block.parentNode == nearestParent ) )
|
||||||
continue ;
|
continue ;
|
||||||
|
|
||||||
if ( FCKIndentCommand._UseIndentClasses )
|
if ( FCKIndentCommand._UseIndentClasses )
|
||||||
{
|
{
|
||||||
// Transform current class name to indent step index.
|
// Transform current class name to indent step index.
|
||||||
var indentClass = block.className.match( FCKIndentCommand._ClassNameRegex ) ;
|
var indentClass = block.className.match( FCKIndentCommand._ClassNameRegex ) ;
|
||||||
var indentStep = 0 ;
|
var indentStep = 0 ;
|
||||||
if ( indentClass != null )
|
if ( indentClass != null )
|
||||||
{
|
{
|
||||||
indentClass = indentClass[1] ;
|
indentClass = indentClass[1] ;
|
||||||
indentStep = FCKIndentCommand._IndentClassMap[indentClass] ;
|
indentStep = FCKIndentCommand._IndentClassMap[indentClass] ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Operate on indent step index, transform indent step index back to class name.
|
// Operate on indent step index, transform indent step index back to class name.
|
||||||
if ( this.Name.IEquals( 'outdent' ) )
|
if ( this.Name.IEquals( 'outdent' ) )
|
||||||
indentStep-- ;
|
indentStep-- ;
|
||||||
else if ( this.Name.IEquals( 'indent' ) )
|
else if ( this.Name.IEquals( 'indent' ) )
|
||||||
indentStep++ ;
|
indentStep++ ;
|
||||||
indentStep = Math.min( indentStep, FCKConfig.IndentClasses.length ) ;
|
indentStep = Math.min( indentStep, FCKConfig.IndentClasses.length ) ;
|
||||||
indentStep = Math.max( indentStep, 0 ) ;
|
indentStep = Math.max( indentStep, 0 ) ;
|
||||||
var className = block.className.replace( FCKIndentCommand._ClassNameRegex, '' ) ;
|
var className = block.className.replace( FCKIndentCommand._ClassNameRegex, '' ) ;
|
||||||
if ( indentStep < 1 )
|
if ( indentStep < 1 )
|
||||||
block.className = className ;
|
block.className = className ;
|
||||||
else
|
else
|
||||||
block.className = ( className.length > 0 ? className + ' ' : '' ) +
|
block.className = ( className.length > 0 ? className + ' ' : '' ) +
|
||||||
FCKConfig.IndentClasses[indentStep - 1] ;
|
FCKConfig.IndentClasses[indentStep - 1] ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Offset distance is assumed to be in pixels for now.
|
// Offset distance is assumed to be in pixels for now.
|
||||||
var currentOffset = parseInt( block.style[this.IndentCSSProperty], 10 ) ;
|
var currentOffset = parseInt( block.style[this.IndentCSSProperty], 10 ) ;
|
||||||
if ( isNaN( currentOffset ) )
|
if ( isNaN( currentOffset ) )
|
||||||
currentOffset = 0 ;
|
currentOffset = 0 ;
|
||||||
currentOffset += this.Offset ;
|
currentOffset += this.Offset ;
|
||||||
currentOffset = Math.max( currentOffset, 0 ) ;
|
currentOffset = Math.max( currentOffset, 0 ) ;
|
||||||
currentOffset = Math.ceil( currentOffset / this.Offset ) * this.Offset ;
|
currentOffset = Math.ceil( currentOffset / this.Offset ) * this.Offset ;
|
||||||
block.style[this.IndentCSSProperty] = currentOffset ? currentOffset + FCKConfig.IndentUnit : '' ;
|
block.style[this.IndentCSSProperty] = currentOffset ? currentOffset + FCKConfig.IndentUnit : '' ;
|
||||||
if ( block.getAttribute( 'style' ) == '' )
|
if ( block.getAttribute( 'style' ) == '' )
|
||||||
block.removeAttribute( 'style' ) ;
|
block.removeAttribute( 'style' ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_IndentList : function( range, listNode )
|
_IndentList : function( range, listNode )
|
||||||
{
|
{
|
||||||
// Our starting and ending points of the range might be inside some blocks under a list item...
|
// Our starting and ending points of the range might be inside some blocks under a list item...
|
||||||
// So before playing with the iterator, we need to expand the block to include the list items.
|
// So before playing with the iterator, we need to expand the block to include the list items.
|
||||||
var startContainer = range.StartContainer ;
|
var startContainer = range.StartContainer ;
|
||||||
var endContainer = range.EndContainer ;
|
var endContainer = range.EndContainer ;
|
||||||
while ( startContainer && startContainer.parentNode != listNode )
|
while ( startContainer && startContainer.parentNode != listNode )
|
||||||
startContainer = startContainer.parentNode ;
|
startContainer = startContainer.parentNode ;
|
||||||
while ( endContainer && endContainer.parentNode != listNode )
|
while ( endContainer && endContainer.parentNode != listNode )
|
||||||
endContainer = endContainer.parentNode ;
|
endContainer = endContainer.parentNode ;
|
||||||
|
|
||||||
if ( ! startContainer || ! endContainer )
|
if ( ! startContainer || ! endContainer )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
// Now we can iterate over the individual items on the same tree depth.
|
// Now we can iterate over the individual items on the same tree depth.
|
||||||
var block = startContainer ;
|
var block = startContainer ;
|
||||||
var itemsToMove = [] ;
|
var itemsToMove = [] ;
|
||||||
var stopFlag = false ;
|
var stopFlag = false ;
|
||||||
while ( stopFlag == false )
|
while ( stopFlag == false )
|
||||||
{
|
{
|
||||||
if ( block == endContainer )
|
if ( block == endContainer )
|
||||||
stopFlag = true ;
|
stopFlag = true ;
|
||||||
itemsToMove.push( block ) ;
|
itemsToMove.push( block ) ;
|
||||||
block = block.nextSibling ;
|
block = block.nextSibling ;
|
||||||
}
|
}
|
||||||
if ( itemsToMove.length < 1 )
|
if ( itemsToMove.length < 1 )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
// Do indent or outdent operations on the array model of the list, not the list's DOM tree itself.
|
// Do indent or outdent operations on the array model of the list, not the list's DOM tree itself.
|
||||||
// The array model demands that it knows as much as possible about the surrounding lists, we need
|
// The array model demands that it knows as much as possible about the surrounding lists, we need
|
||||||
// to feed it the further ancestor node that is still a list.
|
// to feed it the further ancestor node that is still a list.
|
||||||
var listParents = FCKDomTools.GetParents( listNode ) ;
|
var listParents = FCKDomTools.GetParents( listNode ) ;
|
||||||
for ( var i = 0 ; i < listParents.length ; i++ )
|
for ( var i = 0 ; i < listParents.length ; i++ )
|
||||||
{
|
{
|
||||||
if ( listParents[i].nodeName.IEquals( ['ul', 'ol'] ) )
|
if ( listParents[i].nodeName.IEquals( ['ul', 'ol'] ) )
|
||||||
{
|
{
|
||||||
listNode = listParents[i] ;
|
listNode = listParents[i] ;
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var indentOffset = this.Name.IEquals( 'indent' ) ? 1 : -1 ;
|
var indentOffset = this.Name.IEquals( 'indent' ) ? 1 : -1 ;
|
||||||
var startItem = itemsToMove[0] ;
|
var startItem = itemsToMove[0] ;
|
||||||
var lastItem = itemsToMove[ itemsToMove.length - 1 ] ;
|
var lastItem = itemsToMove[ itemsToMove.length - 1 ] ;
|
||||||
var markerObj = {} ;
|
var markerObj = {} ;
|
||||||
|
|
||||||
// Convert the list DOM tree into a one dimensional array.
|
// Convert the list DOM tree into a one dimensional array.
|
||||||
var listArray = FCKDomTools.ListToArray( listNode, markerObj ) ;
|
var listArray = FCKDomTools.ListToArray( listNode, markerObj ) ;
|
||||||
|
|
||||||
// Apply indenting or outdenting on the array.
|
// Apply indenting or outdenting on the array.
|
||||||
var baseIndent = listArray[lastItem._FCK_ListArray_Index].indent ;
|
var baseIndent = listArray[lastItem._FCK_ListArray_Index].indent ;
|
||||||
for ( var i = startItem._FCK_ListArray_Index ; i <= lastItem._FCK_ListArray_Index ; i++ )
|
for ( var i = startItem._FCK_ListArray_Index ; i <= lastItem._FCK_ListArray_Index ; i++ )
|
||||||
listArray[i].indent += indentOffset ;
|
listArray[i].indent += indentOffset ;
|
||||||
for ( var i = lastItem._FCK_ListArray_Index + 1 ; i < listArray.length && listArray[i].indent > baseIndent ; i++ )
|
for ( var i = lastItem._FCK_ListArray_Index + 1 ; i < listArray.length && listArray[i].indent > baseIndent ; i++ )
|
||||||
listArray[i].indent += indentOffset ;
|
listArray[i].indent += indentOffset ;
|
||||||
|
|
||||||
/* For debug use only
|
/* For debug use only
|
||||||
var PrintArray = function( listArray, doc )
|
var PrintArray = function( listArray, doc )
|
||||||
{
|
{
|
||||||
var s = [] ;
|
var s = [] ;
|
||||||
for ( var i = 0 ; i < listArray.length ; i++ )
|
for ( var i = 0 ; i < listArray.length ; i++ )
|
||||||
{
|
{
|
||||||
for ( var j in listArray[i] )
|
for ( var j in listArray[i] )
|
||||||
{
|
{
|
||||||
if ( j != 'contents' )
|
if ( j != 'contents' )
|
||||||
s.push( j + ":" + listArray[i][j] + "; " ) ;
|
s.push( j + ":" + listArray[i][j] + "; " ) ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var docFrag = doc.createDocumentFragment() ;
|
var docFrag = doc.createDocumentFragment() ;
|
||||||
var tmpNode = doc.createElement( 'span' ) ;
|
var tmpNode = doc.createElement( 'span' ) ;
|
||||||
for ( var k = 0 ; k < listArray[i][j].length ; k++ )
|
for ( var k = 0 ; k < listArray[i][j].length ; k++ )
|
||||||
docFrag.appendChild( listArray[i][j][k].cloneNode( true ) ) ;
|
docFrag.appendChild( listArray[i][j][k].cloneNode( true ) ) ;
|
||||||
tmpNode.appendChild( docFrag ) ;
|
tmpNode.appendChild( docFrag ) ;
|
||||||
s.push( j + ":" + tmpNode.innerHTML + "; ") ;
|
s.push( j + ":" + tmpNode.innerHTML + "; ") ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
s.push( '\n' ) ;
|
s.push( '\n' ) ;
|
||||||
}
|
}
|
||||||
alert( s.join('') ) ;
|
alert( s.join('') ) ;
|
||||||
}
|
}
|
||||||
PrintArray( listArray, FCK.EditorDocument ) ;
|
PrintArray( listArray, FCK.EditorDocument ) ;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Convert the array back to a DOM forest (yes we might have a few subtrees now).
|
// Convert the array back to a DOM forest (yes we might have a few subtrees now).
|
||||||
// And replace the old list with the new forest.
|
// And replace the old list with the new forest.
|
||||||
var newList = FCKDomTools.ArrayToList( listArray ) ;
|
var newList = FCKDomTools.ArrayToList( listArray ) ;
|
||||||
if ( newList )
|
if ( newList )
|
||||||
listNode.parentNode.replaceChild( newList.listNode, listNode ) ;
|
listNode.parentNode.replaceChild( newList.listNode, listNode ) ;
|
||||||
|
|
||||||
// Clean up the markers.
|
// Clean up the markers.
|
||||||
FCKDomTools.ClearAllMarkers( markerObj ) ;
|
FCKDomTools.ClearAllMarkers( markerObj ) ;
|
||||||
}
|
}
|
||||||
} ;
|
} ;
|
||||||
|
@ -1,173 +1,173 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKJustifyCommand Class: controls block justification.
|
* FCKJustifyCommand Class: controls block justification.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKJustifyCommand = function( alignValue )
|
var FCKJustifyCommand = function( alignValue )
|
||||||
{
|
{
|
||||||
this.AlignValue = alignValue ;
|
this.AlignValue = alignValue ;
|
||||||
|
|
||||||
// Detect whether this is the instance for the default alignment.
|
// Detect whether this is the instance for the default alignment.
|
||||||
var contentDir = FCKConfig.ContentLangDirection.toLowerCase() ;
|
var contentDir = FCKConfig.ContentLangDirection.toLowerCase() ;
|
||||||
this.IsDefaultAlign = ( alignValue == 'left' && contentDir == 'ltr' ) ||
|
this.IsDefaultAlign = ( alignValue == 'left' && contentDir == 'ltr' ) ||
|
||||||
( alignValue == 'right' && contentDir == 'rtl' ) ;
|
( alignValue == 'right' && contentDir == 'rtl' ) ;
|
||||||
|
|
||||||
// Get the class name to be used by this instance.
|
// Get the class name to be used by this instance.
|
||||||
var cssClassName = this._CssClassName = ( function()
|
var cssClassName = this._CssClassName = ( function()
|
||||||
{
|
{
|
||||||
var classes = FCKConfig.JustifyClasses ;
|
var classes = FCKConfig.JustifyClasses ;
|
||||||
if ( classes )
|
if ( classes )
|
||||||
{
|
{
|
||||||
switch ( alignValue )
|
switch ( alignValue )
|
||||||
{
|
{
|
||||||
case 'left' :
|
case 'left' :
|
||||||
return classes[0] || null ;
|
return classes[0] || null ;
|
||||||
case 'center' :
|
case 'center' :
|
||||||
return classes[1] || null ;
|
return classes[1] || null ;
|
||||||
case 'right' :
|
case 'right' :
|
||||||
return classes[2] || null ;
|
return classes[2] || null ;
|
||||||
case 'justify' :
|
case 'justify' :
|
||||||
return classes[3] || null ;
|
return classes[3] || null ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null ;
|
return null ;
|
||||||
} )() ;
|
} )() ;
|
||||||
|
|
||||||
if ( cssClassName && cssClassName.length > 0 )
|
if ( cssClassName && cssClassName.length > 0 )
|
||||||
this._CssClassRegex = new RegExp( '(?:^|\\s+)' + cssClassName + '(?=$|\\s)' ) ;
|
this._CssClassRegex = new RegExp( '(?:^|\\s+)' + cssClassName + '(?=$|\\s)' ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKJustifyCommand._GetClassNameRegex = function()
|
FCKJustifyCommand._GetClassNameRegex = function()
|
||||||
{
|
{
|
||||||
var regex = FCKJustifyCommand._ClassRegex ;
|
var regex = FCKJustifyCommand._ClassRegex ;
|
||||||
if ( regex != undefined )
|
if ( regex != undefined )
|
||||||
return regex ;
|
return regex ;
|
||||||
|
|
||||||
var names = [] ;
|
var names = [] ;
|
||||||
|
|
||||||
var classes = FCKConfig.JustifyClasses ;
|
var classes = FCKConfig.JustifyClasses ;
|
||||||
if ( classes )
|
if ( classes )
|
||||||
{
|
{
|
||||||
for ( var i = 0 ; i < 4 ; i++ )
|
for ( var i = 0 ; i < 4 ; i++ )
|
||||||
{
|
{
|
||||||
var className = classes[i] ;
|
var className = classes[i] ;
|
||||||
if ( className && className.length > 0 )
|
if ( className && className.length > 0 )
|
||||||
names.push( className ) ;
|
names.push( className ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( names.length > 0 )
|
if ( names.length > 0 )
|
||||||
regex = new RegExp( '(?:^|\\s+)(?:' + names.join( '|' ) + ')(?=$|\\s)' ) ;
|
regex = new RegExp( '(?:^|\\s+)(?:' + names.join( '|' ) + ')(?=$|\\s)' ) ;
|
||||||
else
|
else
|
||||||
regex = null ;
|
regex = null ;
|
||||||
|
|
||||||
return FCKJustifyCommand._ClassRegex = regex ;
|
return FCKJustifyCommand._ClassRegex = regex ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKJustifyCommand.prototype =
|
FCKJustifyCommand.prototype =
|
||||||
{
|
{
|
||||||
Execute : function()
|
Execute : function()
|
||||||
{
|
{
|
||||||
// Save an undo snapshot before doing anything.
|
// Save an undo snapshot before doing anything.
|
||||||
FCKUndo.SaveUndoStep() ;
|
FCKUndo.SaveUndoStep() ;
|
||||||
|
|
||||||
var range = new FCKDomRange( FCK.EditorWindow ) ;
|
var range = new FCKDomRange( FCK.EditorWindow ) ;
|
||||||
range.MoveToSelection() ;
|
range.MoveToSelection() ;
|
||||||
|
|
||||||
var currentState = this.GetState() ;
|
var currentState = this.GetState() ;
|
||||||
if ( currentState == FCK_TRISTATE_DISABLED )
|
if ( currentState == FCK_TRISTATE_DISABLED )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
// Store a bookmark of the selection since the paragraph iterator might
|
// Store a bookmark of the selection since the paragraph iterator might
|
||||||
// change the DOM tree and break selections.
|
// change the DOM tree and break selections.
|
||||||
var bookmark = range.CreateBookmark() ;
|
var bookmark = range.CreateBookmark() ;
|
||||||
|
|
||||||
var cssClassName = this._CssClassName ;
|
var cssClassName = this._CssClassName ;
|
||||||
|
|
||||||
// Apply alignment setting for each paragraph.
|
// Apply alignment setting for each paragraph.
|
||||||
var iterator = new FCKDomRangeIterator( range ) ;
|
var iterator = new FCKDomRangeIterator( range ) ;
|
||||||
var block ;
|
var block ;
|
||||||
while ( ( block = iterator.GetNextParagraph() ) )
|
while ( ( block = iterator.GetNextParagraph() ) )
|
||||||
{
|
{
|
||||||
block.removeAttribute( 'align' ) ;
|
block.removeAttribute( 'align' ) ;
|
||||||
|
|
||||||
if ( cssClassName )
|
if ( cssClassName )
|
||||||
{
|
{
|
||||||
// Remove the any of the alignment classes from the className.
|
// Remove the any of the alignment classes from the className.
|
||||||
var className = block.className.replace( FCKJustifyCommand._GetClassNameRegex(), '' ) ;
|
var className = block.className.replace( FCKJustifyCommand._GetClassNameRegex(), '' ) ;
|
||||||
|
|
||||||
// Append the desired class name.
|
// Append the desired class name.
|
||||||
if ( currentState == FCK_TRISTATE_OFF )
|
if ( currentState == FCK_TRISTATE_OFF )
|
||||||
{
|
{
|
||||||
if ( className.length > 0 )
|
if ( className.length > 0 )
|
||||||
className += ' ' ;
|
className += ' ' ;
|
||||||
block.className = className + cssClassName ;
|
block.className = className + cssClassName ;
|
||||||
}
|
}
|
||||||
else if ( className.length == 0 )
|
else if ( className.length == 0 )
|
||||||
FCKDomTools.RemoveAttribute( block, 'class' ) ;
|
FCKDomTools.RemoveAttribute( block, 'class' ) ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var style = block.style ;
|
var style = block.style ;
|
||||||
if ( currentState == FCK_TRISTATE_OFF )
|
if ( currentState == FCK_TRISTATE_OFF )
|
||||||
style.textAlign = this.AlignValue ;
|
style.textAlign = this.AlignValue ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
style.textAlign = '' ;
|
style.textAlign = '' ;
|
||||||
if ( style.cssText.length == 0 )
|
if ( style.cssText.length == 0 )
|
||||||
block.removeAttribute( 'style' ) ;
|
block.removeAttribute( 'style' ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Restore previous selection.
|
// Restore previous selection.
|
||||||
range.MoveToBookmark( bookmark ) ;
|
range.MoveToBookmark( bookmark ) ;
|
||||||
range.Select() ;
|
range.Select() ;
|
||||||
|
|
||||||
FCK.Focus() ;
|
FCK.Focus() ;
|
||||||
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
GetState : function()
|
GetState : function()
|
||||||
{
|
{
|
||||||
// Disabled if not WYSIWYG.
|
// Disabled if not WYSIWYG.
|
||||||
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || ! FCK.EditorWindow )
|
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || ! FCK.EditorWindow )
|
||||||
return FCK_TRISTATE_DISABLED ;
|
return FCK_TRISTATE_DISABLED ;
|
||||||
|
|
||||||
// Retrieve the first selected block.
|
// Retrieve the first selected block.
|
||||||
var path = new FCKElementPath( FCKSelection.GetBoundaryParentElement( true ) ) ;
|
var path = new FCKElementPath( FCKSelection.GetBoundaryParentElement( true ) ) ;
|
||||||
var firstBlock = path.Block || path.BlockLimit ;
|
var firstBlock = path.Block || path.BlockLimit ;
|
||||||
|
|
||||||
if ( !firstBlock || firstBlock.nodeName.toLowerCase() == 'body' )
|
if ( !firstBlock || firstBlock.nodeName.toLowerCase() == 'body' )
|
||||||
return FCK_TRISTATE_OFF ;
|
return FCK_TRISTATE_OFF ;
|
||||||
|
|
||||||
// Check if the desired style is already applied to the block.
|
// Check if the desired style is already applied to the block.
|
||||||
var currentAlign ;
|
var currentAlign ;
|
||||||
if ( FCKBrowserInfo.IsIE )
|
if ( FCKBrowserInfo.IsIE )
|
||||||
currentAlign = firstBlock.currentStyle.textAlign ;
|
currentAlign = firstBlock.currentStyle.textAlign ;
|
||||||
else
|
else
|
||||||
currentAlign = FCK.EditorWindow.getComputedStyle( firstBlock, '' ).getPropertyValue( 'text-align' );
|
currentAlign = FCK.EditorWindow.getComputedStyle( firstBlock, '' ).getPropertyValue( 'text-align' );
|
||||||
currentAlign = currentAlign.replace( /(-moz-|-webkit-|start|auto)/i, '' );
|
currentAlign = currentAlign.replace( /(-moz-|-webkit-|start|auto)/i, '' );
|
||||||
if ( ( !currentAlign && this.IsDefaultAlign ) || currentAlign == this.AlignValue )
|
if ( ( !currentAlign && this.IsDefaultAlign ) || currentAlign == this.AlignValue )
|
||||||
return FCK_TRISTATE_ON ;
|
return FCK_TRISTATE_ON ;
|
||||||
return FCK_TRISTATE_OFF ;
|
return FCK_TRISTATE_OFF ;
|
||||||
}
|
}
|
||||||
} ;
|
} ;
|
||||||
|
@ -1,382 +1,382 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Implementation for the "Insert/Remove Ordered/Unordered List" commands.
|
* Implementation for the "Insert/Remove Ordered/Unordered List" commands.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKListCommand = function( name, tagName )
|
var FCKListCommand = function( name, tagName )
|
||||||
{
|
{
|
||||||
this.Name = name ;
|
this.Name = name ;
|
||||||
this.TagName = tagName ;
|
this.TagName = tagName ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKListCommand.prototype =
|
FCKListCommand.prototype =
|
||||||
{
|
{
|
||||||
GetState : function()
|
GetState : function()
|
||||||
{
|
{
|
||||||
// Disabled if not WYSIWYG.
|
// Disabled if not WYSIWYG.
|
||||||
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || ! FCK.EditorWindow )
|
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || ! FCK.EditorWindow )
|
||||||
return FCK_TRISTATE_DISABLED ;
|
return FCK_TRISTATE_DISABLED ;
|
||||||
|
|
||||||
// We'll use the style system's convention to determine list state here...
|
// We'll use the style system's convention to determine list state here...
|
||||||
// If the starting block is a descendant of an <ol> or <ul> node, then we're in a list.
|
// If the starting block is a descendant of an <ol> or <ul> node, then we're in a list.
|
||||||
var startContainer = FCKSelection.GetBoundaryParentElement( true ) ;
|
var startContainer = FCKSelection.GetBoundaryParentElement( true ) ;
|
||||||
var listNode = startContainer ;
|
var listNode = startContainer ;
|
||||||
while ( listNode )
|
while ( listNode )
|
||||||
{
|
{
|
||||||
if ( listNode.nodeName.IEquals( [ 'ul', 'ol' ] ) )
|
if ( listNode.nodeName.IEquals( [ 'ul', 'ol' ] ) )
|
||||||
break ;
|
break ;
|
||||||
listNode = listNode.parentNode ;
|
listNode = listNode.parentNode ;
|
||||||
}
|
}
|
||||||
if ( listNode && listNode.nodeName.IEquals( this.TagName ) )
|
if ( listNode && listNode.nodeName.IEquals( this.TagName ) )
|
||||||
return FCK_TRISTATE_ON ;
|
return FCK_TRISTATE_ON ;
|
||||||
else
|
else
|
||||||
return FCK_TRISTATE_OFF ;
|
return FCK_TRISTATE_OFF ;
|
||||||
},
|
},
|
||||||
|
|
||||||
Execute : function()
|
Execute : function()
|
||||||
{
|
{
|
||||||
FCKUndo.SaveUndoStep() ;
|
FCKUndo.SaveUndoStep() ;
|
||||||
|
|
||||||
var doc = FCK.EditorDocument ;
|
var doc = FCK.EditorDocument ;
|
||||||
var range = new FCKDomRange( FCK.EditorWindow ) ;
|
var range = new FCKDomRange( FCK.EditorWindow ) ;
|
||||||
range.MoveToSelection() ;
|
range.MoveToSelection() ;
|
||||||
var state = this.GetState() ;
|
var state = this.GetState() ;
|
||||||
|
|
||||||
// Midas lists rule #1 says we can create a list even in an empty document.
|
// Midas lists rule #1 says we can create a list even in an empty document.
|
||||||
// But FCKDomRangeIterator wouldn't run if the document is really empty.
|
// But FCKDomRangeIterator wouldn't run if the document is really empty.
|
||||||
// So create a paragraph if the document is empty and we're going to create a list.
|
// So create a paragraph if the document is empty and we're going to create a list.
|
||||||
if ( state == FCK_TRISTATE_OFF )
|
if ( state == FCK_TRISTATE_OFF )
|
||||||
{
|
{
|
||||||
FCKDomTools.TrimNode( doc.body ) ;
|
FCKDomTools.TrimNode( doc.body ) ;
|
||||||
if ( ! doc.body.firstChild )
|
if ( ! doc.body.firstChild )
|
||||||
{
|
{
|
||||||
var paragraph = doc.createElement( 'p' ) ;
|
var paragraph = doc.createElement( 'p' ) ;
|
||||||
doc.body.appendChild( paragraph ) ;
|
doc.body.appendChild( paragraph ) ;
|
||||||
range.MoveToNodeContents( paragraph ) ;
|
range.MoveToNodeContents( paragraph ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var bookmark = range.CreateBookmark() ;
|
var bookmark = range.CreateBookmark() ;
|
||||||
|
|
||||||
// Group the blocks up because there are many cases where multiple lists have to be created,
|
// Group the blocks up because there are many cases where multiple lists have to be created,
|
||||||
// or multiple lists have to be cancelled.
|
// or multiple lists have to be cancelled.
|
||||||
var listGroups = [] ;
|
var listGroups = [] ;
|
||||||
var markerObj = {} ;
|
var markerObj = {} ;
|
||||||
var iterator = new FCKDomRangeIterator( range ) ;
|
var iterator = new FCKDomRangeIterator( range ) ;
|
||||||
var block ;
|
var block ;
|
||||||
|
|
||||||
iterator.ForceBrBreak = ( state == FCK_TRISTATE_OFF ) ;
|
iterator.ForceBrBreak = ( state == FCK_TRISTATE_OFF ) ;
|
||||||
var nextRangeExists = true ;
|
var nextRangeExists = true ;
|
||||||
var rangeQueue = null ;
|
var rangeQueue = null ;
|
||||||
while ( nextRangeExists )
|
while ( nextRangeExists )
|
||||||
{
|
{
|
||||||
while ( ( block = iterator.GetNextParagraph() ) )
|
while ( ( block = iterator.GetNextParagraph() ) )
|
||||||
{
|
{
|
||||||
var path = new FCKElementPath( block ) ;
|
var path = new FCKElementPath( block ) ;
|
||||||
var listNode = null ;
|
var listNode = null ;
|
||||||
var processedFlag = false ;
|
var processedFlag = false ;
|
||||||
var blockLimit = path.BlockLimit ;
|
var blockLimit = path.BlockLimit ;
|
||||||
|
|
||||||
// First, try to group by a list ancestor.
|
// First, try to group by a list ancestor.
|
||||||
for ( var i = path.Elements.length - 1 ; i >= 0 ; i-- )
|
for ( var i = path.Elements.length - 1 ; i >= 0 ; i-- )
|
||||||
{
|
{
|
||||||
var el = path.Elements[i] ;
|
var el = path.Elements[i] ;
|
||||||
if ( el.nodeName.IEquals( ['ol', 'ul'] ) )
|
if ( el.nodeName.IEquals( ['ol', 'ul'] ) )
|
||||||
{
|
{
|
||||||
// If we've encountered a list inside a block limit
|
// If we've encountered a list inside a block limit
|
||||||
// The last group object of the block limit element should
|
// The last group object of the block limit element should
|
||||||
// no longer be valid. Since paragraphs after the list
|
// no longer be valid. Since paragraphs after the list
|
||||||
// should belong to a different group of paragraphs before
|
// should belong to a different group of paragraphs before
|
||||||
// the list. (Bug #1309)
|
// the list. (Bug #1309)
|
||||||
if ( blockLimit._FCK_ListGroupObject )
|
if ( blockLimit._FCK_ListGroupObject )
|
||||||
blockLimit._FCK_ListGroupObject = null ;
|
blockLimit._FCK_ListGroupObject = null ;
|
||||||
|
|
||||||
var groupObj = el._FCK_ListGroupObject ;
|
var groupObj = el._FCK_ListGroupObject ;
|
||||||
if ( groupObj )
|
if ( groupObj )
|
||||||
groupObj.contents.push( block ) ;
|
groupObj.contents.push( block ) ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
groupObj = { 'root' : el, 'contents' : [ block ] } ;
|
groupObj = { 'root' : el, 'contents' : [ block ] } ;
|
||||||
listGroups.push( groupObj ) ;
|
listGroups.push( groupObj ) ;
|
||||||
FCKDomTools.SetElementMarker( markerObj, el, '_FCK_ListGroupObject', groupObj ) ;
|
FCKDomTools.SetElementMarker( markerObj, el, '_FCK_ListGroupObject', groupObj ) ;
|
||||||
}
|
}
|
||||||
processedFlag = true ;
|
processedFlag = true ;
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( processedFlag )
|
if ( processedFlag )
|
||||||
continue ;
|
continue ;
|
||||||
|
|
||||||
// No list ancestor? Group by block limit.
|
// No list ancestor? Group by block limit.
|
||||||
var root = blockLimit ;
|
var root = blockLimit ;
|
||||||
if ( root._FCK_ListGroupObject )
|
if ( root._FCK_ListGroupObject )
|
||||||
root._FCK_ListGroupObject.contents.push( block ) ;
|
root._FCK_ListGroupObject.contents.push( block ) ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var groupObj = { 'root' : root, 'contents' : [ block ] } ;
|
var groupObj = { 'root' : root, 'contents' : [ block ] } ;
|
||||||
FCKDomTools.SetElementMarker( markerObj, root, '_FCK_ListGroupObject', groupObj ) ;
|
FCKDomTools.SetElementMarker( markerObj, root, '_FCK_ListGroupObject', groupObj ) ;
|
||||||
listGroups.push( groupObj ) ;
|
listGroups.push( groupObj ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( FCKBrowserInfo.IsIE )
|
if ( FCKBrowserInfo.IsIE )
|
||||||
nextRangeExists = false ;
|
nextRangeExists = false ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ( rangeQueue == null )
|
if ( rangeQueue == null )
|
||||||
{
|
{
|
||||||
rangeQueue = [] ;
|
rangeQueue = [] ;
|
||||||
var selectionObject = FCKSelection.GetSelection() ;
|
var selectionObject = FCKSelection.GetSelection() ;
|
||||||
if ( selectionObject && listGroups.length == 0 )
|
if ( selectionObject && listGroups.length == 0 )
|
||||||
rangeQueue.push( selectionObject.getRangeAt( 0 ) ) ;
|
rangeQueue.push( selectionObject.getRangeAt( 0 ) ) ;
|
||||||
for ( var i = 1 ; selectionObject && i < selectionObject.rangeCount ; i++ )
|
for ( var i = 1 ; selectionObject && i < selectionObject.rangeCount ; i++ )
|
||||||
rangeQueue.push( selectionObject.getRangeAt( i ) ) ;
|
rangeQueue.push( selectionObject.getRangeAt( i ) ) ;
|
||||||
}
|
}
|
||||||
if ( rangeQueue.length < 1 )
|
if ( rangeQueue.length < 1 )
|
||||||
nextRangeExists = false ;
|
nextRangeExists = false ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var internalRange = FCKW3CRange.CreateFromRange( doc, rangeQueue.shift() ) ;
|
var internalRange = FCKW3CRange.CreateFromRange( doc, rangeQueue.shift() ) ;
|
||||||
range._Range = internalRange ;
|
range._Range = internalRange ;
|
||||||
range._UpdateElementInfo() ;
|
range._UpdateElementInfo() ;
|
||||||
if ( range.StartNode.nodeName.IEquals( 'td' ) )
|
if ( range.StartNode.nodeName.IEquals( 'td' ) )
|
||||||
range.SetStart( range.StartNode, 1 ) ;
|
range.SetStart( range.StartNode, 1 ) ;
|
||||||
if ( range.EndNode.nodeName.IEquals( 'td' ) )
|
if ( range.EndNode.nodeName.IEquals( 'td' ) )
|
||||||
range.SetEnd( range.EndNode, 2 ) ;
|
range.SetEnd( range.EndNode, 2 ) ;
|
||||||
iterator = new FCKDomRangeIterator( range ) ;
|
iterator = new FCKDomRangeIterator( range ) ;
|
||||||
iterator.ForceBrBreak = ( state == FCK_TRISTATE_OFF ) ;
|
iterator.ForceBrBreak = ( state == FCK_TRISTATE_OFF ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now we have two kinds of list groups, groups rooted at a list, and groups rooted at a block limit element.
|
// Now we have two kinds of list groups, groups rooted at a list, and groups rooted at a block limit element.
|
||||||
// We either have to build lists or remove lists, for removing a list does not makes sense when we are looking
|
// We either have to build lists or remove lists, for removing a list does not makes sense when we are looking
|
||||||
// at the group that's not rooted at lists. So we have three cases to handle.
|
// at the group that's not rooted at lists. So we have three cases to handle.
|
||||||
var listsCreated = [] ;
|
var listsCreated = [] ;
|
||||||
while ( listGroups.length > 0 )
|
while ( listGroups.length > 0 )
|
||||||
{
|
{
|
||||||
var groupObj = listGroups.shift() ;
|
var groupObj = listGroups.shift() ;
|
||||||
if ( state == FCK_TRISTATE_OFF )
|
if ( state == FCK_TRISTATE_OFF )
|
||||||
{
|
{
|
||||||
if ( groupObj.root.nodeName.IEquals( ['ul', 'ol'] ) )
|
if ( groupObj.root.nodeName.IEquals( ['ul', 'ol'] ) )
|
||||||
this._ChangeListType( groupObj, markerObj, listsCreated ) ;
|
this._ChangeListType( groupObj, markerObj, listsCreated ) ;
|
||||||
else
|
else
|
||||||
this._CreateList( groupObj, listsCreated ) ;
|
this._CreateList( groupObj, listsCreated ) ;
|
||||||
}
|
}
|
||||||
else if ( state == FCK_TRISTATE_ON && groupObj.root.nodeName.IEquals( ['ul', 'ol'] ) )
|
else if ( state == FCK_TRISTATE_ON && groupObj.root.nodeName.IEquals( ['ul', 'ol'] ) )
|
||||||
this._RemoveList( groupObj, markerObj ) ;
|
this._RemoveList( groupObj, markerObj ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// For all new lists created, merge adjacent, same type lists.
|
// For all new lists created, merge adjacent, same type lists.
|
||||||
for ( var i = 0 ; i < listsCreated.length ; i++ )
|
for ( var i = 0 ; i < listsCreated.length ; i++ )
|
||||||
{
|
{
|
||||||
var listNode = listsCreated[i] ;
|
var listNode = listsCreated[i] ;
|
||||||
var stopFlag = false ;
|
var stopFlag = false ;
|
||||||
var currentNode = listNode ;
|
var currentNode = listNode ;
|
||||||
while ( ! stopFlag )
|
while ( ! stopFlag )
|
||||||
{
|
{
|
||||||
currentNode = currentNode.nextSibling ;
|
currentNode = currentNode.nextSibling ;
|
||||||
if ( currentNode && currentNode.nodeType == 3 && currentNode.nodeValue.search( /^[\n\r\t ]*$/ ) == 0 )
|
if ( currentNode && currentNode.nodeType == 3 && currentNode.nodeValue.search( /^[\n\r\t ]*$/ ) == 0 )
|
||||||
continue ;
|
continue ;
|
||||||
stopFlag = true ;
|
stopFlag = true ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( currentNode && currentNode.nodeName.IEquals( this.TagName ) )
|
if ( currentNode && currentNode.nodeName.IEquals( this.TagName ) )
|
||||||
{
|
{
|
||||||
currentNode.parentNode.removeChild( currentNode ) ;
|
currentNode.parentNode.removeChild( currentNode ) ;
|
||||||
while ( currentNode.firstChild )
|
while ( currentNode.firstChild )
|
||||||
listNode.appendChild( currentNode.removeChild( currentNode.firstChild ) ) ;
|
listNode.appendChild( currentNode.removeChild( currentNode.firstChild ) ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
stopFlag = false ;
|
stopFlag = false ;
|
||||||
currentNode = listNode ;
|
currentNode = listNode ;
|
||||||
while ( ! stopFlag )
|
while ( ! stopFlag )
|
||||||
{
|
{
|
||||||
currentNode = currentNode.previousSibling ;
|
currentNode = currentNode.previousSibling ;
|
||||||
if ( currentNode && currentNode.nodeType == 3 && currentNode.nodeValue.search( /^[\n\r\t ]*$/ ) == 0 )
|
if ( currentNode && currentNode.nodeType == 3 && currentNode.nodeValue.search( /^[\n\r\t ]*$/ ) == 0 )
|
||||||
continue ;
|
continue ;
|
||||||
stopFlag = true ;
|
stopFlag = true ;
|
||||||
}
|
}
|
||||||
if ( currentNode && currentNode.nodeName.IEquals( this.TagName ) )
|
if ( currentNode && currentNode.nodeName.IEquals( this.TagName ) )
|
||||||
{
|
{
|
||||||
currentNode.parentNode.removeChild( currentNode ) ;
|
currentNode.parentNode.removeChild( currentNode ) ;
|
||||||
while ( currentNode.lastChild )
|
while ( currentNode.lastChild )
|
||||||
listNode.insertBefore( currentNode.removeChild( currentNode.lastChild ),
|
listNode.insertBefore( currentNode.removeChild( currentNode.lastChild ),
|
||||||
listNode.firstChild ) ;
|
listNode.firstChild ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clean up, restore selection and update toolbar button states.
|
// Clean up, restore selection and update toolbar button states.
|
||||||
FCKDomTools.ClearAllMarkers( markerObj ) ;
|
FCKDomTools.ClearAllMarkers( markerObj ) ;
|
||||||
range.MoveToBookmark( bookmark ) ;
|
range.MoveToBookmark( bookmark ) ;
|
||||||
range.Select() ;
|
range.Select() ;
|
||||||
|
|
||||||
FCK.Focus() ;
|
FCK.Focus() ;
|
||||||
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
_ChangeListType : function( groupObj, markerObj, listsCreated )
|
_ChangeListType : function( groupObj, markerObj, listsCreated )
|
||||||
{
|
{
|
||||||
// This case is easy...
|
// This case is easy...
|
||||||
// 1. Convert the whole list into a one-dimensional array.
|
// 1. Convert the whole list into a one-dimensional array.
|
||||||
// 2. Change the list type by modifying the array.
|
// 2. Change the list type by modifying the array.
|
||||||
// 3. Recreate the whole list by converting the array to a list.
|
// 3. Recreate the whole list by converting the array to a list.
|
||||||
// 4. Replace the original list with the recreated list.
|
// 4. Replace the original list with the recreated list.
|
||||||
var listArray = FCKDomTools.ListToArray( groupObj.root, markerObj ) ;
|
var listArray = FCKDomTools.ListToArray( groupObj.root, markerObj ) ;
|
||||||
var selectedListItems = [] ;
|
var selectedListItems = [] ;
|
||||||
for ( var i = 0 ; i < groupObj.contents.length ; i++ )
|
for ( var i = 0 ; i < groupObj.contents.length ; i++ )
|
||||||
{
|
{
|
||||||
var itemNode = groupObj.contents[i] ;
|
var itemNode = groupObj.contents[i] ;
|
||||||
itemNode = FCKTools.GetElementAscensor( itemNode, 'li' ) ;
|
itemNode = FCKTools.GetElementAscensor( itemNode, 'li' ) ;
|
||||||
if ( ! itemNode || itemNode._FCK_ListItem_Processed )
|
if ( ! itemNode || itemNode._FCK_ListItem_Processed )
|
||||||
continue ;
|
continue ;
|
||||||
selectedListItems.push( itemNode ) ;
|
selectedListItems.push( itemNode ) ;
|
||||||
FCKDomTools.SetElementMarker( markerObj, itemNode, '_FCK_ListItem_Processed', true ) ;
|
FCKDomTools.SetElementMarker( markerObj, itemNode, '_FCK_ListItem_Processed', true ) ;
|
||||||
}
|
}
|
||||||
var fakeParent = FCKTools.GetElementDocument( groupObj.root ).createElement( this.TagName ) ;
|
var fakeParent = FCKTools.GetElementDocument( groupObj.root ).createElement( this.TagName ) ;
|
||||||
for ( var i = 0 ; i < selectedListItems.length ; i++ )
|
for ( var i = 0 ; i < selectedListItems.length ; i++ )
|
||||||
{
|
{
|
||||||
var listIndex = selectedListItems[i]._FCK_ListArray_Index ;
|
var listIndex = selectedListItems[i]._FCK_ListArray_Index ;
|
||||||
listArray[listIndex].parent = fakeParent ;
|
listArray[listIndex].parent = fakeParent ;
|
||||||
}
|
}
|
||||||
var newList = FCKDomTools.ArrayToList( listArray, markerObj ) ;
|
var newList = FCKDomTools.ArrayToList( listArray, markerObj ) ;
|
||||||
for ( var i = 0 ; i < newList.listNode.childNodes.length ; i++ )
|
for ( var i = 0 ; i < newList.listNode.childNodes.length ; i++ )
|
||||||
{
|
{
|
||||||
if ( newList.listNode.childNodes[i].nodeName.IEquals( this.TagName ) )
|
if ( newList.listNode.childNodes[i].nodeName.IEquals( this.TagName ) )
|
||||||
listsCreated.push( newList.listNode.childNodes[i] ) ;
|
listsCreated.push( newList.listNode.childNodes[i] ) ;
|
||||||
}
|
}
|
||||||
groupObj.root.parentNode.replaceChild( newList.listNode, groupObj.root ) ;
|
groupObj.root.parentNode.replaceChild( newList.listNode, groupObj.root ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
_CreateList : function( groupObj, listsCreated )
|
_CreateList : function( groupObj, listsCreated )
|
||||||
{
|
{
|
||||||
var contents = groupObj.contents ;
|
var contents = groupObj.contents ;
|
||||||
var doc = FCKTools.GetElementDocument( groupObj.root ) ;
|
var doc = FCKTools.GetElementDocument( groupObj.root ) ;
|
||||||
var listContents = [] ;
|
var listContents = [] ;
|
||||||
|
|
||||||
// It is possible to have the contents returned by DomRangeIterator to be the same as the root.
|
// It is possible to have the contents returned by DomRangeIterator to be the same as the root.
|
||||||
// e.g. when we're running into table cells.
|
// e.g. when we're running into table cells.
|
||||||
// In such a case, enclose the childNodes of contents[0] into a <div>.
|
// In such a case, enclose the childNodes of contents[0] into a <div>.
|
||||||
if ( contents.length == 1 && contents[0] == groupObj.root )
|
if ( contents.length == 1 && contents[0] == groupObj.root )
|
||||||
{
|
{
|
||||||
var divBlock = doc.createElement( 'div' );
|
var divBlock = doc.createElement( 'div' );
|
||||||
while ( contents[0].firstChild )
|
while ( contents[0].firstChild )
|
||||||
divBlock.appendChild( contents[0].removeChild( contents[0].firstChild ) ) ;
|
divBlock.appendChild( contents[0].removeChild( contents[0].firstChild ) ) ;
|
||||||
contents[0].appendChild( divBlock ) ;
|
contents[0].appendChild( divBlock ) ;
|
||||||
contents[0] = divBlock ;
|
contents[0] = divBlock ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate the common parent node of all content blocks.
|
// Calculate the common parent node of all content blocks.
|
||||||
var commonParent = groupObj.contents[0].parentNode ;
|
var commonParent = groupObj.contents[0].parentNode ;
|
||||||
for ( var i = 0 ; i < contents.length ; i++ )
|
for ( var i = 0 ; i < contents.length ; i++ )
|
||||||
commonParent = FCKDomTools.GetCommonParents( commonParent, contents[i].parentNode ).pop() ;
|
commonParent = FCKDomTools.GetCommonParents( commonParent, contents[i].parentNode ).pop() ;
|
||||||
|
|
||||||
// We want to insert things that are in the same tree level only, so calculate the contents again
|
// We want to insert things that are in the same tree level only, so calculate the contents again
|
||||||
// by expanding the selected blocks to the same tree level.
|
// by expanding the selected blocks to the same tree level.
|
||||||
for ( var i = 0 ; i < contents.length ; i++ )
|
for ( var i = 0 ; i < contents.length ; i++ )
|
||||||
{
|
{
|
||||||
var contentNode = contents[i] ;
|
var contentNode = contents[i] ;
|
||||||
while ( contentNode.parentNode )
|
while ( contentNode.parentNode )
|
||||||
{
|
{
|
||||||
if ( contentNode.parentNode == commonParent )
|
if ( contentNode.parentNode == commonParent )
|
||||||
{
|
{
|
||||||
listContents.push( contentNode ) ;
|
listContents.push( contentNode ) ;
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
contentNode = contentNode.parentNode ;
|
contentNode = contentNode.parentNode ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( listContents.length < 1 )
|
if ( listContents.length < 1 )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
// Insert the list to the DOM tree.
|
// Insert the list to the DOM tree.
|
||||||
var insertAnchor = listContents[listContents.length - 1].nextSibling ;
|
var insertAnchor = listContents[listContents.length - 1].nextSibling ;
|
||||||
var listNode = doc.createElement( this.TagName ) ;
|
var listNode = doc.createElement( this.TagName ) ;
|
||||||
listsCreated.push( listNode ) ;
|
listsCreated.push( listNode ) ;
|
||||||
while ( listContents.length )
|
while ( listContents.length )
|
||||||
{
|
{
|
||||||
var contentBlock = listContents.shift() ;
|
var contentBlock = listContents.shift() ;
|
||||||
var docFrag = doc.createDocumentFragment() ;
|
var docFrag = doc.createDocumentFragment() ;
|
||||||
while ( contentBlock.firstChild )
|
while ( contentBlock.firstChild )
|
||||||
docFrag.appendChild( contentBlock.removeChild( contentBlock.firstChild ) ) ;
|
docFrag.appendChild( contentBlock.removeChild( contentBlock.firstChild ) ) ;
|
||||||
contentBlock.parentNode.removeChild( contentBlock ) ;
|
contentBlock.parentNode.removeChild( contentBlock ) ;
|
||||||
var listItem = doc.createElement( 'li' ) ;
|
var listItem = doc.createElement( 'li' ) ;
|
||||||
listItem.appendChild( docFrag ) ;
|
listItem.appendChild( docFrag ) ;
|
||||||
listNode.appendChild( listItem ) ;
|
listNode.appendChild( listItem ) ;
|
||||||
}
|
}
|
||||||
commonParent.insertBefore( listNode, insertAnchor ) ;
|
commonParent.insertBefore( listNode, insertAnchor ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
_RemoveList : function( groupObj, markerObj )
|
_RemoveList : function( groupObj, markerObj )
|
||||||
{
|
{
|
||||||
// This is very much like the change list type operation.
|
// This is very much like the change list type operation.
|
||||||
// Except that we're changing the selected items' indent to -1 in the list array.
|
// Except that we're changing the selected items' indent to -1 in the list array.
|
||||||
var listArray = FCKDomTools.ListToArray( groupObj.root, markerObj ) ;
|
var listArray = FCKDomTools.ListToArray( groupObj.root, markerObj ) ;
|
||||||
var selectedListItems = [] ;
|
var selectedListItems = [] ;
|
||||||
for ( var i = 0 ; i < groupObj.contents.length ; i++ )
|
for ( var i = 0 ; i < groupObj.contents.length ; i++ )
|
||||||
{
|
{
|
||||||
var itemNode = groupObj.contents[i] ;
|
var itemNode = groupObj.contents[i] ;
|
||||||
itemNode = FCKTools.GetElementAscensor( itemNode, 'li' ) ;
|
itemNode = FCKTools.GetElementAscensor( itemNode, 'li' ) ;
|
||||||
if ( ! itemNode || itemNode._FCK_ListItem_Processed )
|
if ( ! itemNode || itemNode._FCK_ListItem_Processed )
|
||||||
continue ;
|
continue ;
|
||||||
selectedListItems.push( itemNode ) ;
|
selectedListItems.push( itemNode ) ;
|
||||||
FCKDomTools.SetElementMarker( markerObj, itemNode, '_FCK_ListItem_Processed', true ) ;
|
FCKDomTools.SetElementMarker( markerObj, itemNode, '_FCK_ListItem_Processed', true ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
var lastListIndex = null ;
|
var lastListIndex = null ;
|
||||||
for ( var i = 0 ; i < selectedListItems.length ; i++ )
|
for ( var i = 0 ; i < selectedListItems.length ; i++ )
|
||||||
{
|
{
|
||||||
var listIndex = selectedListItems[i]._FCK_ListArray_Index ;
|
var listIndex = selectedListItems[i]._FCK_ListArray_Index ;
|
||||||
listArray[listIndex].indent = -1 ;
|
listArray[listIndex].indent = -1 ;
|
||||||
lastListIndex = listIndex ;
|
lastListIndex = listIndex ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// After cutting parts of the list out with indent=-1, we still have to maintain the array list
|
// After cutting parts of the list out with indent=-1, we still have to maintain the array list
|
||||||
// model's nextItem.indent <= currentItem.indent + 1 invariant. Otherwise the array model of the
|
// model's nextItem.indent <= currentItem.indent + 1 invariant. Otherwise the array model of the
|
||||||
// list cannot be converted back to a real DOM list.
|
// list cannot be converted back to a real DOM list.
|
||||||
for ( var i = lastListIndex + 1; i < listArray.length ; i++ )
|
for ( var i = lastListIndex + 1; i < listArray.length ; i++ )
|
||||||
{
|
{
|
||||||
if ( listArray[i].indent > listArray[i-1].indent + 1 )
|
if ( listArray[i].indent > listArray[i-1].indent + 1 )
|
||||||
{
|
{
|
||||||
var indentOffset = listArray[i-1].indent + 1 - listArray[i].indent ;
|
var indentOffset = listArray[i-1].indent + 1 - listArray[i].indent ;
|
||||||
var oldIndent = listArray[i].indent ;
|
var oldIndent = listArray[i].indent ;
|
||||||
while ( listArray[i] && listArray[i].indent >= oldIndent)
|
while ( listArray[i] && listArray[i].indent >= oldIndent)
|
||||||
{
|
{
|
||||||
listArray[i].indent += indentOffset ;
|
listArray[i].indent += indentOffset ;
|
||||||
i++ ;
|
i++ ;
|
||||||
}
|
}
|
||||||
i-- ;
|
i-- ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var newList = FCKDomTools.ArrayToList( listArray, markerObj ) ;
|
var newList = FCKDomTools.ArrayToList( listArray, markerObj ) ;
|
||||||
// If groupObj.root is the last element in its parent, or its nextSibling is a <br>, then we should
|
// If groupObj.root is the last element in its parent, or its nextSibling is a <br>, then we should
|
||||||
// not add a <br> after the final item. So, check for the cases and trim the <br>.
|
// not add a <br> after the final item. So, check for the cases and trim the <br>.
|
||||||
if ( groupObj.root.nextSibling == null || groupObj.root.nextSibling.nodeName.IEquals( 'br' ) )
|
if ( groupObj.root.nextSibling == null || groupObj.root.nextSibling.nodeName.IEquals( 'br' ) )
|
||||||
{
|
{
|
||||||
if ( newList.listNode.lastChild.nodeName.IEquals( 'br' ) )
|
if ( newList.listNode.lastChild.nodeName.IEquals( 'br' ) )
|
||||||
newList.listNode.removeChild( newList.listNode.lastChild ) ;
|
newList.listNode.removeChild( newList.listNode.lastChild ) ;
|
||||||
}
|
}
|
||||||
groupObj.root.parentNode.replaceChild( newList.listNode, groupObj.root ) ;
|
groupObj.root.parentNode.replaceChild( newList.listNode, groupObj.root ) ;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1,39 +1,39 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKNamedCommand Class: represents an internal browser command.
|
* FCKNamedCommand Class: represents an internal browser command.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKNamedCommand = function( commandName )
|
var FCKNamedCommand = function( commandName )
|
||||||
{
|
{
|
||||||
this.Name = commandName ;
|
this.Name = commandName ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKNamedCommand.prototype.Execute = function()
|
FCKNamedCommand.prototype.Execute = function()
|
||||||
{
|
{
|
||||||
FCK.ExecuteNamedCommand( this.Name ) ;
|
FCK.ExecuteNamedCommand( this.Name ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKNamedCommand.prototype.GetState = function()
|
FCKNamedCommand.prototype.GetState = function()
|
||||||
{
|
{
|
||||||
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
|
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
|
||||||
return FCK_TRISTATE_DISABLED ;
|
return FCK_TRISTATE_DISABLED ;
|
||||||
return FCK.GetNamedCommandState( this.Name ) ;
|
return FCK.GetNamedCommandState( this.Name ) ;
|
||||||
}
|
}
|
||||||
|
@ -1,40 +1,40 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKPastePlainTextCommand Class: represents the
|
* FCKPastePlainTextCommand Class: represents the
|
||||||
* "Paste as Plain Text" command.
|
* "Paste as Plain Text" command.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKPastePlainTextCommand = function()
|
var FCKPastePlainTextCommand = function()
|
||||||
{
|
{
|
||||||
this.Name = 'PasteText' ;
|
this.Name = 'PasteText' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKPastePlainTextCommand.prototype.Execute = function()
|
FCKPastePlainTextCommand.prototype.Execute = function()
|
||||||
{
|
{
|
||||||
FCK.PasteAsPlainText() ;
|
FCK.PasteAsPlainText() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKPastePlainTextCommand.prototype.GetState = function()
|
FCKPastePlainTextCommand.prototype.GetState = function()
|
||||||
{
|
{
|
||||||
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
|
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
|
||||||
return FCK_TRISTATE_DISABLED ;
|
return FCK_TRISTATE_DISABLED ;
|
||||||
return FCK.GetNamedCommandState( 'Paste' ) ;
|
return FCK.GetNamedCommandState( 'Paste' ) ;
|
||||||
}
|
}
|
||||||
|
@ -1,40 +1,40 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKPasteWordCommand Class: represents the "Paste from Word" command.
|
* FCKPasteWordCommand Class: represents the "Paste from Word" command.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKPasteWordCommand = function()
|
var FCKPasteWordCommand = function()
|
||||||
{
|
{
|
||||||
this.Name = 'PasteWord' ;
|
this.Name = 'PasteWord' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKPasteWordCommand.prototype.Execute = function()
|
FCKPasteWordCommand.prototype.Execute = function()
|
||||||
{
|
{
|
||||||
FCK.PasteFromWord() ;
|
FCK.PasteFromWord() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKPasteWordCommand.prototype.GetState = function()
|
FCKPasteWordCommand.prototype.GetState = function()
|
||||||
{
|
{
|
||||||
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || FCKConfig.ForcePasteAsPlainText )
|
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || FCKConfig.ForcePasteAsPlainText )
|
||||||
return FCK_TRISTATE_DISABLED ;
|
return FCK_TRISTATE_DISABLED ;
|
||||||
else
|
else
|
||||||
return FCK.GetNamedCommandState( 'Paste' ) ;
|
return FCK.GetNamedCommandState( 'Paste' ) ;
|
||||||
}
|
}
|
||||||
|
@ -1,45 +1,45 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKRemoveFormatCommand Class: controls the execution of a core style. Core
|
* FCKRemoveFormatCommand Class: controls the execution of a core style. Core
|
||||||
* styles are usually represented as buttons in the toolbar., like Bold and
|
* styles are usually represented as buttons in the toolbar., like Bold and
|
||||||
* Italic.
|
* Italic.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKRemoveFormatCommand = function()
|
var FCKRemoveFormatCommand = function()
|
||||||
{
|
{
|
||||||
this.Name = 'RemoveFormat' ;
|
this.Name = 'RemoveFormat' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKRemoveFormatCommand.prototype =
|
FCKRemoveFormatCommand.prototype =
|
||||||
{
|
{
|
||||||
Execute : function()
|
Execute : function()
|
||||||
{
|
{
|
||||||
FCKStyles.RemoveAll() ;
|
FCKStyles.RemoveAll() ;
|
||||||
|
|
||||||
FCK.Focus() ;
|
FCK.Focus() ;
|
||||||
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
GetState : function()
|
GetState : function()
|
||||||
{
|
{
|
||||||
return FCK.EditorWindow ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
|
return FCK.EditorWindow ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1,74 +1,91 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKShowBlockCommand Class: the "Show Blocks" command.
|
* FCKShowBlockCommand Class: the "Show Blocks" command.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKShowBlockCommand = function( name, defaultState )
|
var FCKShowBlockCommand = function( name, defaultState )
|
||||||
{
|
{
|
||||||
this.Name = name ;
|
this.Name = name ;
|
||||||
if ( defaultState != undefined )
|
if ( defaultState != undefined )
|
||||||
this._SavedState = defaultState ;
|
this._SavedState = defaultState ;
|
||||||
else
|
else
|
||||||
this._SavedState = null ;
|
this._SavedState = null ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKShowBlockCommand.prototype.Execute = function()
|
FCKShowBlockCommand.prototype.Execute = function()
|
||||||
{
|
{
|
||||||
var state = this.GetState() ;
|
var state = this.GetState() ;
|
||||||
|
|
||||||
if ( state == FCK_TRISTATE_DISABLED )
|
if ( state == FCK_TRISTATE_DISABLED )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
var body = FCK.EditorDocument.body ;
|
var body = FCK.EditorDocument.body ;
|
||||||
|
|
||||||
if ( state == FCK_TRISTATE_ON )
|
if ( state == FCK_TRISTATE_ON )
|
||||||
body.className = body.className.replace( /(^| )FCK__ShowBlocks/g, '' ) ;
|
body.className = body.className.replace( /(^| )FCK__ShowBlocks/g, '' ) ;
|
||||||
else
|
else
|
||||||
body.className += ' FCK__ShowBlocks' ;
|
body.className += ' FCK__ShowBlocks' ;
|
||||||
|
|
||||||
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
if ( FCKBrowserInfo.IsIE )
|
||||||
}
|
{
|
||||||
|
try
|
||||||
FCKShowBlockCommand.prototype.GetState = function()
|
{
|
||||||
{
|
FCK.EditorDocument.selection.createRange().select() ;
|
||||||
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
|
}
|
||||||
return FCK_TRISTATE_DISABLED ;
|
catch ( e )
|
||||||
|
{}
|
||||||
// On some cases FCK.EditorDocument.body is not yet available
|
}
|
||||||
if ( !FCK.EditorDocument )
|
else
|
||||||
return FCK_TRISTATE_OFF ;
|
{
|
||||||
|
var focus = FCK.EditorWindow.getSelection().focusNode ;
|
||||||
if ( /FCK__ShowBlocks(?:\s|$)/.test( FCK.EditorDocument.body.className ) )
|
if ( focus.nodeType != 1 )
|
||||||
return FCK_TRISTATE_ON ;
|
focus = focus.parentNode ;
|
||||||
|
FCKDomTools.ScrollIntoView( focus, false ) ;
|
||||||
return FCK_TRISTATE_OFF ;
|
}
|
||||||
}
|
|
||||||
|
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
||||||
FCKShowBlockCommand.prototype.SaveState = function()
|
}
|
||||||
{
|
|
||||||
this._SavedState = this.GetState() ;
|
FCKShowBlockCommand.prototype.GetState = function()
|
||||||
}
|
{
|
||||||
|
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
|
||||||
FCKShowBlockCommand.prototype.RestoreState = function()
|
return FCK_TRISTATE_DISABLED ;
|
||||||
{
|
|
||||||
if ( this._SavedState != null && this.GetState() != this._SavedState )
|
// On some cases FCK.EditorDocument.body is not yet available
|
||||||
this.Execute() ;
|
if ( !FCK.EditorDocument )
|
||||||
}
|
return FCK_TRISTATE_OFF ;
|
||||||
|
|
||||||
|
if ( /FCK__ShowBlocks(?:\s|$)/.test( FCK.EditorDocument.body.className ) )
|
||||||
|
return FCK_TRISTATE_ON ;
|
||||||
|
|
||||||
|
return FCK_TRISTATE_OFF ;
|
||||||
|
}
|
||||||
|
|
||||||
|
FCKShowBlockCommand.prototype.SaveState = function()
|
||||||
|
{
|
||||||
|
this._SavedState = this.GetState() ;
|
||||||
|
}
|
||||||
|
|
||||||
|
FCKShowBlockCommand.prototype.RestoreState = function()
|
||||||
|
{
|
||||||
|
if ( this._SavedState != null && this.GetState() != this._SavedState )
|
||||||
|
this.Execute() ;
|
||||||
|
}
|
||||||
|
@ -1,41 +1,41 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKStyleCommand Class: represents the "Spell Check" command.
|
* FCKStyleCommand Class: represents the "Spell Check" command.
|
||||||
* (Gecko specific implementation)
|
* (Gecko specific implementation)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKSpellCheckCommand = function()
|
var FCKSpellCheckCommand = function()
|
||||||
{
|
{
|
||||||
this.Name = 'SpellCheck' ;
|
this.Name = 'SpellCheck' ;
|
||||||
this.IsEnabled = ( FCKConfig.SpellChecker == 'SpellerPages' ) ;
|
this.IsEnabled = ( FCKConfig.SpellChecker == 'SpellerPages' ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKSpellCheckCommand.prototype.Execute = function()
|
FCKSpellCheckCommand.prototype.Execute = function()
|
||||||
{
|
{
|
||||||
FCKDialog.OpenDialog( 'FCKDialog_SpellCheck', 'Spell Check', 'dialog/fck_spellerpages.html', 440, 480 ) ;
|
FCKDialog.OpenDialog( 'FCKDialog_SpellCheck', 'Spell Check', 'dialog/fck_spellerpages.html', 440, 480 ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKSpellCheckCommand.prototype.GetState = function()
|
FCKSpellCheckCommand.prototype.GetState = function()
|
||||||
{
|
{
|
||||||
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
|
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
|
||||||
return FCK_TRISTATE_DISABLED ;
|
return FCK_TRISTATE_DISABLED ;
|
||||||
return this.IsEnabled ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
|
return this.IsEnabled ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
|
||||||
}
|
}
|
||||||
|
@ -1,69 +1,69 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKStyleCommand Class: represents the "Spell Check" command.
|
* FCKStyleCommand Class: represents the "Spell Check" command.
|
||||||
* (IE specific implementation)
|
* (IE specific implementation)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKSpellCheckCommand = function()
|
var FCKSpellCheckCommand = function()
|
||||||
{
|
{
|
||||||
this.Name = 'SpellCheck' ;
|
this.Name = 'SpellCheck' ;
|
||||||
this.IsEnabled = ( FCKConfig.SpellChecker == 'ieSpell' || FCKConfig.SpellChecker == 'SpellerPages' ) ;
|
this.IsEnabled = ( FCKConfig.SpellChecker == 'ieSpell' || FCKConfig.SpellChecker == 'SpellerPages' ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKSpellCheckCommand.prototype.Execute = function()
|
FCKSpellCheckCommand.prototype.Execute = function()
|
||||||
{
|
{
|
||||||
switch ( FCKConfig.SpellChecker )
|
switch ( FCKConfig.SpellChecker )
|
||||||
{
|
{
|
||||||
case 'ieSpell' :
|
case 'ieSpell' :
|
||||||
this._RunIeSpell() ;
|
this._RunIeSpell() ;
|
||||||
break ;
|
break ;
|
||||||
|
|
||||||
case 'SpellerPages' :
|
case 'SpellerPages' :
|
||||||
FCKDialog.OpenDialog( 'FCKDialog_SpellCheck', 'Spell Check', 'dialog/fck_spellerpages.html', 440, 480 ) ;
|
FCKDialog.OpenDialog( 'FCKDialog_SpellCheck', 'Spell Check', 'dialog/fck_spellerpages.html', 440, 480 ) ;
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKSpellCheckCommand.prototype._RunIeSpell = function()
|
FCKSpellCheckCommand.prototype._RunIeSpell = function()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var oIeSpell = new ActiveXObject( "ieSpell.ieSpellExtension" ) ;
|
var oIeSpell = new ActiveXObject( "ieSpell.ieSpellExtension" ) ;
|
||||||
oIeSpell.CheckAllLinkedDocuments( FCK.EditorDocument ) ;
|
oIeSpell.CheckAllLinkedDocuments( FCK.EditorDocument ) ;
|
||||||
}
|
}
|
||||||
catch( e )
|
catch( e )
|
||||||
{
|
{
|
||||||
if( e.number == -2146827859 )
|
if( e.number == -2146827859 )
|
||||||
{
|
{
|
||||||
if ( confirm( FCKLang.IeSpellDownload ) )
|
if ( confirm( FCKLang.IeSpellDownload ) )
|
||||||
window.open( FCKConfig.IeSpellDownloadUrl , 'IeSpellDownload' ) ;
|
window.open( FCKConfig.IeSpellDownloadUrl , 'IeSpellDownload' ) ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
alert( 'Error Loading ieSpell: ' + e.message + ' (' + e.number + ')' ) ;
|
alert( 'Error Loading ieSpell: ' + e.message + ' (' + e.number + ')' ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKSpellCheckCommand.prototype.GetState = function()
|
FCKSpellCheckCommand.prototype.GetState = function()
|
||||||
{
|
{
|
||||||
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
|
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
|
||||||
return FCK_TRISTATE_DISABLED ;
|
return FCK_TRISTATE_DISABLED ;
|
||||||
return this.IsEnabled ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
|
return this.IsEnabled ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
|
||||||
}
|
}
|
||||||
|
@ -1,60 +1,60 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKStyleCommand Class: represents the "Style" command.
|
* FCKStyleCommand Class: represents the "Style" command.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKStyleCommand = function()
|
var FCKStyleCommand = function()
|
||||||
{}
|
{}
|
||||||
|
|
||||||
FCKStyleCommand.prototype =
|
FCKStyleCommand.prototype =
|
||||||
{
|
{
|
||||||
Name : 'Style',
|
Name : 'Style',
|
||||||
|
|
||||||
Execute : function( styleName, styleComboItem )
|
Execute : function( styleName, styleComboItem )
|
||||||
{
|
{
|
||||||
FCKUndo.SaveUndoStep() ;
|
FCKUndo.SaveUndoStep() ;
|
||||||
|
|
||||||
if ( styleComboItem.Selected )
|
if ( styleComboItem.Selected )
|
||||||
FCK.Styles.RemoveStyle( styleComboItem.Style ) ;
|
FCK.Styles.RemoveStyle( styleComboItem.Style ) ;
|
||||||
else
|
else
|
||||||
FCK.Styles.ApplyStyle( styleComboItem.Style ) ;
|
FCK.Styles.ApplyStyle( styleComboItem.Style ) ;
|
||||||
|
|
||||||
FCKUndo.SaveUndoStep() ;
|
FCKUndo.SaveUndoStep() ;
|
||||||
|
|
||||||
FCK.Focus() ;
|
FCK.Focus() ;
|
||||||
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
||||||
},
|
},
|
||||||
|
|
||||||
GetState : function()
|
GetState : function()
|
||||||
{
|
{
|
||||||
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || !FCK.EditorDocument )
|
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || !FCK.EditorDocument )
|
||||||
return FCK_TRISTATE_DISABLED ;
|
return FCK_TRISTATE_DISABLED ;
|
||||||
|
|
||||||
if ( FCKSelection.GetType() == 'Control' )
|
if ( FCKSelection.GetType() == 'Control' )
|
||||||
{
|
{
|
||||||
var el = FCKSelection.GetSelectedElement() ;
|
var el = FCKSelection.GetSelectedElement() ;
|
||||||
if ( !el || !FCKStyles.CheckHasObjectStyle( el.nodeName.toLowerCase() ) )
|
if ( !el || !FCKStyles.CheckHasObjectStyle( el.nodeName.toLowerCase() ) )
|
||||||
return FCK_TRISTATE_DISABLED ;
|
return FCK_TRISTATE_DISABLED ;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FCK_TRISTATE_OFF ;
|
return FCK_TRISTATE_OFF ;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1,106 +1,106 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKPastePlainTextCommand Class: represents the
|
* FCKPastePlainTextCommand Class: represents the
|
||||||
* "Paste as Plain Text" command.
|
* "Paste as Plain Text" command.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKTableCommand = function( command )
|
var FCKTableCommand = function( command )
|
||||||
{
|
{
|
||||||
this.Name = command ;
|
this.Name = command ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKTableCommand.prototype.Execute = function()
|
FCKTableCommand.prototype.Execute = function()
|
||||||
{
|
{
|
||||||
FCKUndo.SaveUndoStep() ;
|
FCKUndo.SaveUndoStep() ;
|
||||||
|
|
||||||
if ( ! FCKBrowserInfo.IsGecko )
|
if ( ! FCKBrowserInfo.IsGecko )
|
||||||
{
|
{
|
||||||
switch ( this.Name )
|
switch ( this.Name )
|
||||||
{
|
{
|
||||||
case 'TableMergeRight' :
|
case 'TableMergeRight' :
|
||||||
return FCKTableHandler.MergeRight() ;
|
return FCKTableHandler.MergeRight() ;
|
||||||
case 'TableMergeDown' :
|
case 'TableMergeDown' :
|
||||||
return FCKTableHandler.MergeDown() ;
|
return FCKTableHandler.MergeDown() ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ( this.Name )
|
switch ( this.Name )
|
||||||
{
|
{
|
||||||
case 'TableInsertRowAfter' :
|
case 'TableInsertRowAfter' :
|
||||||
return FCKTableHandler.InsertRow( false ) ;
|
return FCKTableHandler.InsertRow( false ) ;
|
||||||
case 'TableInsertRowBefore' :
|
case 'TableInsertRowBefore' :
|
||||||
return FCKTableHandler.InsertRow( true ) ;
|
return FCKTableHandler.InsertRow( true ) ;
|
||||||
case 'TableDeleteRows' :
|
case 'TableDeleteRows' :
|
||||||
return FCKTableHandler.DeleteRows() ;
|
return FCKTableHandler.DeleteRows() ;
|
||||||
case 'TableInsertColumnAfter' :
|
case 'TableInsertColumnAfter' :
|
||||||
return FCKTableHandler.InsertColumn( false ) ;
|
return FCKTableHandler.InsertColumn( false ) ;
|
||||||
case 'TableInsertColumnBefore' :
|
case 'TableInsertColumnBefore' :
|
||||||
return FCKTableHandler.InsertColumn( true ) ;
|
return FCKTableHandler.InsertColumn( true ) ;
|
||||||
case 'TableDeleteColumns' :
|
case 'TableDeleteColumns' :
|
||||||
return FCKTableHandler.DeleteColumns() ;
|
return FCKTableHandler.DeleteColumns() ;
|
||||||
case 'TableInsertCellAfter' :
|
case 'TableInsertCellAfter' :
|
||||||
return FCKTableHandler.InsertCell( null, false ) ;
|
return FCKTableHandler.InsertCell( null, false ) ;
|
||||||
case 'TableInsertCellBefore' :
|
case 'TableInsertCellBefore' :
|
||||||
return FCKTableHandler.InsertCell( null, true ) ;
|
return FCKTableHandler.InsertCell( null, true ) ;
|
||||||
case 'TableDeleteCells' :
|
case 'TableDeleteCells' :
|
||||||
return FCKTableHandler.DeleteCells() ;
|
return FCKTableHandler.DeleteCells() ;
|
||||||
case 'TableMergeCells' :
|
case 'TableMergeCells' :
|
||||||
return FCKTableHandler.MergeCells() ;
|
return FCKTableHandler.MergeCells() ;
|
||||||
case 'TableHorizontalSplitCell' :
|
case 'TableHorizontalSplitCell' :
|
||||||
return FCKTableHandler.HorizontalSplitCell() ;
|
return FCKTableHandler.HorizontalSplitCell() ;
|
||||||
case 'TableVerticalSplitCell' :
|
case 'TableVerticalSplitCell' :
|
||||||
return FCKTableHandler.VerticalSplitCell() ;
|
return FCKTableHandler.VerticalSplitCell() ;
|
||||||
case 'TableDelete' :
|
case 'TableDelete' :
|
||||||
return FCKTableHandler.DeleteTable() ;
|
return FCKTableHandler.DeleteTable() ;
|
||||||
default :
|
default :
|
||||||
return alert( FCKLang.UnknownCommand.replace( /%1/g, this.Name ) ) ;
|
return alert( FCKLang.UnknownCommand.replace( /%1/g, this.Name ) ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKTableCommand.prototype.GetState = function()
|
FCKTableCommand.prototype.GetState = function()
|
||||||
{
|
{
|
||||||
if ( FCK.EditorDocument != null && FCKSelection.HasAncestorNode( 'TABLE' ) )
|
if ( FCK.EditorDocument != null && FCKSelection.HasAncestorNode( 'TABLE' ) )
|
||||||
{
|
{
|
||||||
switch ( this.Name )
|
switch ( this.Name )
|
||||||
{
|
{
|
||||||
case 'TableHorizontalSplitCell' :
|
case 'TableHorizontalSplitCell' :
|
||||||
case 'TableVerticalSplitCell' :
|
case 'TableVerticalSplitCell' :
|
||||||
if ( FCKTableHandler.GetSelectedCells().length == 1 )
|
if ( FCKTableHandler.GetSelectedCells().length == 1 )
|
||||||
return FCK_TRISTATE_OFF ;
|
return FCK_TRISTATE_OFF ;
|
||||||
else
|
else
|
||||||
return FCK_TRISTATE_DISABLED ;
|
return FCK_TRISTATE_DISABLED ;
|
||||||
case 'TableMergeCells' :
|
case 'TableMergeCells' :
|
||||||
if ( FCKTableHandler.CheckIsSelectionRectangular()
|
if ( FCKTableHandler.CheckIsSelectionRectangular()
|
||||||
&& FCKTableHandler.GetSelectedCells().length > 1 )
|
&& FCKTableHandler.GetSelectedCells().length > 1 )
|
||||||
return FCK_TRISTATE_OFF ;
|
return FCK_TRISTATE_OFF ;
|
||||||
else
|
else
|
||||||
return FCK_TRISTATE_DISABLED ;
|
return FCK_TRISTATE_DISABLED ;
|
||||||
case 'TableMergeRight' :
|
case 'TableMergeRight' :
|
||||||
return FCKTableHandler.GetMergeRightTarget() ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
|
return FCKTableHandler.GetMergeRightTarget() ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
|
||||||
case 'TableMergeDown' :
|
case 'TableMergeDown' :
|
||||||
return FCKTableHandler.GetMergeDownTarget() ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
|
return FCKTableHandler.GetMergeDownTarget() ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
|
||||||
default :
|
default :
|
||||||
return FCK_TRISTATE_OFF ;
|
return FCK_TRISTATE_OFF ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return FCK_TRISTATE_DISABLED;
|
return FCK_TRISTATE_DISABLED;
|
||||||
}
|
}
|
||||||
|
@ -1,201 +1,201 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* FCKTextColorCommand Class: represents the text color comand. It shows the
|
* FCKTextColorCommand Class: represents the text color comand. It shows the
|
||||||
* color selection panel.
|
* color selection panel.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// FCKTextColorCommand Constructor
|
// FCKTextColorCommand Constructor
|
||||||
// type: can be 'ForeColor' or 'BackColor'.
|
// type: can be 'ForeColor' or 'BackColor'.
|
||||||
var FCKTextColorCommand = function( type )
|
var FCKTextColorCommand = function( type )
|
||||||
{
|
{
|
||||||
this.Name = type == 'ForeColor' ? 'TextColor' : 'BGColor' ;
|
this.Name = type == 'ForeColor' ? 'TextColor' : 'BGColor' ;
|
||||||
this.Type = type ;
|
this.Type = type ;
|
||||||
|
|
||||||
var oWindow ;
|
var oWindow ;
|
||||||
|
|
||||||
if ( FCKBrowserInfo.IsIE )
|
if ( FCKBrowserInfo.IsIE )
|
||||||
oWindow = window ;
|
oWindow = window ;
|
||||||
else if ( FCK.ToolbarSet._IFrame )
|
else if ( FCK.ToolbarSet._IFrame )
|
||||||
oWindow = FCKTools.GetElementWindow( FCK.ToolbarSet._IFrame ) ;
|
oWindow = FCKTools.GetElementWindow( FCK.ToolbarSet._IFrame ) ;
|
||||||
else
|
else
|
||||||
oWindow = window.parent ;
|
oWindow = window.parent ;
|
||||||
|
|
||||||
this._Panel = new FCKPanel( oWindow ) ;
|
this._Panel = new FCKPanel( oWindow ) ;
|
||||||
this._Panel.AppendStyleSheet( FCKConfig.SkinEditorCSS ) ;
|
this._Panel.AppendStyleSheet( FCKConfig.SkinEditorCSS ) ;
|
||||||
this._Panel.MainNode.className = 'FCK_Panel' ;
|
this._Panel.MainNode.className = 'FCK_Panel' ;
|
||||||
this._CreatePanelBody( this._Panel.Document, this._Panel.MainNode ) ;
|
this._CreatePanelBody( this._Panel.Document, this._Panel.MainNode ) ;
|
||||||
FCK.ToolbarSet.ToolbarItems.GetItem( this.Name ).RegisterPanel( this._Panel ) ;
|
FCK.ToolbarSet.ToolbarItems.GetItem( this.Name ).RegisterPanel( this._Panel ) ;
|
||||||
|
|
||||||
FCKTools.DisableSelection( this._Panel.Document.body ) ;
|
FCKTools.DisableSelection( this._Panel.Document.body ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKTextColorCommand.prototype.Execute = function( panelX, panelY, relElement )
|
FCKTextColorCommand.prototype.Execute = function( panelX, panelY, relElement )
|
||||||
{
|
{
|
||||||
// Show the Color Panel at the desired position.
|
// Show the Color Panel at the desired position.
|
||||||
this._Panel.Show( panelX, panelY, relElement ) ;
|
this._Panel.Show( panelX, panelY, relElement ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKTextColorCommand.prototype.SetColor = function( color )
|
FCKTextColorCommand.prototype.SetColor = function( color )
|
||||||
{
|
{
|
||||||
FCKUndo.SaveUndoStep() ;
|
FCKUndo.SaveUndoStep() ;
|
||||||
|
|
||||||
var style = FCKStyles.GetStyle( '_FCK_' +
|
var style = FCKStyles.GetStyle( '_FCK_' +
|
||||||
( this.Type == 'ForeColor' ? 'Color' : 'BackColor' ) ) ;
|
( this.Type == 'ForeColor' ? 'Color' : 'BackColor' ) ) ;
|
||||||
|
|
||||||
if ( !color || color.length == 0 )
|
if ( !color || color.length == 0 )
|
||||||
FCK.Styles.RemoveStyle( style ) ;
|
FCK.Styles.RemoveStyle( style ) ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
style.SetVariable( 'Color', color ) ;
|
style.SetVariable( 'Color', color ) ;
|
||||||
FCKStyles.ApplyStyle( style ) ;
|
FCKStyles.ApplyStyle( style ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKUndo.SaveUndoStep() ;
|
FCKUndo.SaveUndoStep() ;
|
||||||
|
|
||||||
FCK.Focus() ;
|
FCK.Focus() ;
|
||||||
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKTextColorCommand.prototype.GetState = function()
|
FCKTextColorCommand.prototype.GetState = function()
|
||||||
{
|
{
|
||||||
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
|
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
|
||||||
return FCK_TRISTATE_DISABLED ;
|
return FCK_TRISTATE_DISABLED ;
|
||||||
return FCK_TRISTATE_OFF ;
|
return FCK_TRISTATE_OFF ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKTextColorCommand_OnMouseOver()
|
function FCKTextColorCommand_OnMouseOver()
|
||||||
{
|
{
|
||||||
this.className = 'ColorSelected' ;
|
this.className = 'ColorSelected' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKTextColorCommand_OnMouseOut()
|
function FCKTextColorCommand_OnMouseOut()
|
||||||
{
|
{
|
||||||
this.className = 'ColorDeselected' ;
|
this.className = 'ColorDeselected' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKTextColorCommand_OnClick( ev, command, color )
|
function FCKTextColorCommand_OnClick( ev, command, color )
|
||||||
{
|
{
|
||||||
this.className = 'ColorDeselected' ;
|
this.className = 'ColorDeselected' ;
|
||||||
command.SetColor( color ) ;
|
command.SetColor( color ) ;
|
||||||
command._Panel.Hide() ;
|
command._Panel.Hide() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKTextColorCommand_AutoOnClick( ev, command )
|
function FCKTextColorCommand_AutoOnClick( ev, command )
|
||||||
{
|
{
|
||||||
this.className = 'ColorDeselected' ;
|
this.className = 'ColorDeselected' ;
|
||||||
command.SetColor( '' ) ;
|
command.SetColor( '' ) ;
|
||||||
command._Panel.Hide() ;
|
command._Panel.Hide() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKTextColorCommand_MoreOnClick( ev, command )
|
function FCKTextColorCommand_MoreOnClick( ev, command )
|
||||||
{
|
{
|
||||||
this.className = 'ColorDeselected' ;
|
this.className = 'ColorDeselected' ;
|
||||||
command._Panel.Hide() ;
|
command._Panel.Hide() ;
|
||||||
FCKDialog.OpenDialog( 'FCKDialog_Color', FCKLang.DlgColorTitle, 'dialog/fck_colorselector.html', 410, 320,
|
FCKDialog.OpenDialog( 'FCKDialog_Color', FCKLang.DlgColorTitle, 'dialog/fck_colorselector.html', 410, 320,
|
||||||
FCKTools.Bind( command, command.SetColor ) ) ;
|
FCKTools.Bind( command, command.SetColor ) ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKTextColorCommand.prototype._CreatePanelBody = function( targetDocument, targetDiv )
|
FCKTextColorCommand.prototype._CreatePanelBody = function( targetDocument, targetDiv )
|
||||||
{
|
{
|
||||||
function CreateSelectionDiv()
|
function CreateSelectionDiv()
|
||||||
{
|
{
|
||||||
var oDiv = targetDocument.createElement( "DIV" ) ;
|
var oDiv = targetDocument.createElement( "DIV" ) ;
|
||||||
oDiv.className = 'ColorDeselected' ;
|
oDiv.className = 'ColorDeselected' ;
|
||||||
FCKTools.AddEventListenerEx( oDiv, 'mouseover', FCKTextColorCommand_OnMouseOver ) ;
|
FCKTools.AddEventListenerEx( oDiv, 'mouseover', FCKTextColorCommand_OnMouseOver ) ;
|
||||||
FCKTools.AddEventListenerEx( oDiv, 'mouseout', FCKTextColorCommand_OnMouseOut ) ;
|
FCKTools.AddEventListenerEx( oDiv, 'mouseout', FCKTextColorCommand_OnMouseOut ) ;
|
||||||
|
|
||||||
return oDiv ;
|
return oDiv ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the Table that will hold all colors.
|
// Create the Table that will hold all colors.
|
||||||
var oTable = targetDiv.appendChild( targetDocument.createElement( "TABLE" ) ) ;
|
var oTable = targetDiv.appendChild( targetDocument.createElement( "TABLE" ) ) ;
|
||||||
oTable.className = 'ForceBaseFont' ; // Firefox 1.5 Bug.
|
oTable.className = 'ForceBaseFont' ; // Firefox 1.5 Bug.
|
||||||
oTable.style.tableLayout = 'fixed' ;
|
oTable.style.tableLayout = 'fixed' ;
|
||||||
oTable.cellPadding = 0 ;
|
oTable.cellPadding = 0 ;
|
||||||
oTable.cellSpacing = 0 ;
|
oTable.cellSpacing = 0 ;
|
||||||
oTable.border = 0 ;
|
oTable.border = 0 ;
|
||||||
oTable.width = 150 ;
|
oTable.width = 150 ;
|
||||||
|
|
||||||
var oCell = oTable.insertRow(-1).insertCell(-1) ;
|
var oCell = oTable.insertRow(-1).insertCell(-1) ;
|
||||||
oCell.colSpan = 8 ;
|
oCell.colSpan = 8 ;
|
||||||
|
|
||||||
// Create the Button for the "Automatic" color selection.
|
// Create the Button for the "Automatic" color selection.
|
||||||
var oDiv = oCell.appendChild( CreateSelectionDiv() ) ;
|
var oDiv = oCell.appendChild( CreateSelectionDiv() ) ;
|
||||||
oDiv.innerHTML =
|
oDiv.innerHTML =
|
||||||
'<table cellspacing="0" cellpadding="0" width="100%" border="0">\
|
'<table cellspacing="0" cellpadding="0" width="100%" border="0">\
|
||||||
<tr>\
|
<tr>\
|
||||||
<td><div class="ColorBoxBorder"><div class="ColorBox" style="background-color: #000000"></div></div></td>\
|
<td><div class="ColorBoxBorder"><div class="ColorBox" style="background-color: #000000"></div></div></td>\
|
||||||
<td nowrap width="100%" align="center">' + FCKLang.ColorAutomatic + '</td>\
|
<td nowrap width="100%" align="center">' + FCKLang.ColorAutomatic + '</td>\
|
||||||
</tr>\
|
</tr>\
|
||||||
</table>' ;
|
</table>' ;
|
||||||
|
|
||||||
FCKTools.AddEventListenerEx( oDiv, 'click', FCKTextColorCommand_AutoOnClick, this ) ;
|
FCKTools.AddEventListenerEx( oDiv, 'click', FCKTextColorCommand_AutoOnClick, this ) ;
|
||||||
|
|
||||||
// Dirty hack for Opera, Safari and Firefox 3.
|
// Dirty hack for Opera, Safari and Firefox 3.
|
||||||
if ( !FCKBrowserInfo.IsIE )
|
if ( !FCKBrowserInfo.IsIE )
|
||||||
oDiv.style.width = '96%' ;
|
oDiv.style.width = '96%' ;
|
||||||
|
|
||||||
// Create an array of colors based on the configuration file.
|
// Create an array of colors based on the configuration file.
|
||||||
var aColors = FCKConfig.FontColors.toString().split(',') ;
|
var aColors = FCKConfig.FontColors.toString().split(',') ;
|
||||||
|
|
||||||
// Create the colors table based on the array.
|
// Create the colors table based on the array.
|
||||||
var iCounter = 0 ;
|
var iCounter = 0 ;
|
||||||
while ( iCounter < aColors.length )
|
while ( iCounter < aColors.length )
|
||||||
{
|
{
|
||||||
var oRow = oTable.insertRow(-1) ;
|
var oRow = oTable.insertRow(-1) ;
|
||||||
|
|
||||||
for ( var i = 0 ; i < 8 ; i++, iCounter++ )
|
for ( var i = 0 ; i < 8 ; i++, iCounter++ )
|
||||||
{
|
{
|
||||||
// The div will be created even if no more colors are available.
|
// The div will be created even if no more colors are available.
|
||||||
// Extra divs will be hidden later in the code. (#1597)
|
// Extra divs will be hidden later in the code. (#1597)
|
||||||
if ( iCounter < aColors.length )
|
if ( iCounter < aColors.length )
|
||||||
{
|
{
|
||||||
var colorParts = aColors[iCounter].split('/') ;
|
var colorParts = aColors[iCounter].split('/') ;
|
||||||
var colorValue = '#' + colorParts[0] ;
|
var colorValue = '#' + colorParts[0] ;
|
||||||
var colorName = colorParts[1] || colorValue ;
|
var colorName = colorParts[1] || colorValue ;
|
||||||
}
|
}
|
||||||
|
|
||||||
oDiv = oRow.insertCell(-1).appendChild( CreateSelectionDiv() ) ;
|
oDiv = oRow.insertCell(-1).appendChild( CreateSelectionDiv() ) ;
|
||||||
oDiv.innerHTML = '<div class="ColorBoxBorder"><div class="ColorBox" style="background-color: ' + colorValue + '"></div></div>' ;
|
oDiv.innerHTML = '<div class="ColorBoxBorder"><div class="ColorBox" style="background-color: ' + colorValue + '"></div></div>' ;
|
||||||
|
|
||||||
if ( iCounter >= aColors.length )
|
if ( iCounter >= aColors.length )
|
||||||
oDiv.style.visibility = 'hidden' ;
|
oDiv.style.visibility = 'hidden' ;
|
||||||
else
|
else
|
||||||
FCKTools.AddEventListenerEx( oDiv, 'click', FCKTextColorCommand_OnClick, [ this, colorName ] ) ;
|
FCKTools.AddEventListenerEx( oDiv, 'click', FCKTextColorCommand_OnClick, [ this, colorName ] ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the Row and the Cell for the "More Colors..." button.
|
// Create the Row and the Cell for the "More Colors..." button.
|
||||||
if ( FCKConfig.EnableMoreFontColors )
|
if ( FCKConfig.EnableMoreFontColors )
|
||||||
{
|
{
|
||||||
oCell = oTable.insertRow(-1).insertCell(-1) ;
|
oCell = oTable.insertRow(-1).insertCell(-1) ;
|
||||||
oCell.colSpan = 8 ;
|
oCell.colSpan = 8 ;
|
||||||
|
|
||||||
oDiv = oCell.appendChild( CreateSelectionDiv() ) ;
|
oDiv = oCell.appendChild( CreateSelectionDiv() ) ;
|
||||||
oDiv.innerHTML = '<table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td nowrap align="center">' + FCKLang.ColorMoreColors + '</td></tr></table>' ;
|
oDiv.innerHTML = '<table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td nowrap align="center">' + FCKLang.ColorMoreColors + '</td></tr></table>' ;
|
||||||
|
|
||||||
FCKTools.AddEventListenerEx( oDiv, 'click', FCKTextColorCommand_MoreOnClick, this ) ;
|
FCKTools.AddEventListenerEx( oDiv, 'click', FCKTextColorCommand_MoreOnClick, this ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dirty hack for Opera, Safari and Firefox 3.
|
// Dirty hack for Opera, Safari and Firefox 3.
|
||||||
if ( !FCKBrowserInfo.IsIE )
|
if ( !FCKBrowserInfo.IsIE )
|
||||||
oDiv.style.width = '96%' ;
|
oDiv.style.width = '96%' ;
|
||||||
}
|
}
|
||||||
|
@ -1,56 +1,56 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Defines some constants used by the editor. These constants are also
|
* Defines some constants used by the editor. These constants are also
|
||||||
* globally available in the page where the editor is placed.
|
* globally available in the page where the editor is placed.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Editor Instance Status.
|
// Editor Instance Status.
|
||||||
var FCK_STATUS_NOTLOADED = window.parent.FCK_STATUS_NOTLOADED = 0 ;
|
var FCK_STATUS_NOTLOADED = window.parent.FCK_STATUS_NOTLOADED = 0 ;
|
||||||
var FCK_STATUS_ACTIVE = window.parent.FCK_STATUS_ACTIVE = 1 ;
|
var FCK_STATUS_ACTIVE = window.parent.FCK_STATUS_ACTIVE = 1 ;
|
||||||
var FCK_STATUS_COMPLETE = window.parent.FCK_STATUS_COMPLETE = 2 ;
|
var FCK_STATUS_COMPLETE = window.parent.FCK_STATUS_COMPLETE = 2 ;
|
||||||
|
|
||||||
// Tristate Operations.
|
// Tristate Operations.
|
||||||
var FCK_TRISTATE_OFF = window.parent.FCK_TRISTATE_OFF = 0 ;
|
var FCK_TRISTATE_OFF = window.parent.FCK_TRISTATE_OFF = 0 ;
|
||||||
var FCK_TRISTATE_ON = window.parent.FCK_TRISTATE_ON = 1 ;
|
var FCK_TRISTATE_ON = window.parent.FCK_TRISTATE_ON = 1 ;
|
||||||
var FCK_TRISTATE_DISABLED = window.parent.FCK_TRISTATE_DISABLED = -1 ;
|
var FCK_TRISTATE_DISABLED = window.parent.FCK_TRISTATE_DISABLED = -1 ;
|
||||||
|
|
||||||
// For unknown values.
|
// For unknown values.
|
||||||
var FCK_UNKNOWN = window.parent.FCK_UNKNOWN = -9 ;
|
var FCK_UNKNOWN = window.parent.FCK_UNKNOWN = -9 ;
|
||||||
|
|
||||||
// Toolbar Items Style.
|
// Toolbar Items Style.
|
||||||
var FCK_TOOLBARITEM_ONLYICON = window.parent.FCK_TOOLBARITEM_ONLYICON = 0 ;
|
var FCK_TOOLBARITEM_ONLYICON = window.parent.FCK_TOOLBARITEM_ONLYICON = 0 ;
|
||||||
var FCK_TOOLBARITEM_ONLYTEXT = window.parent.FCK_TOOLBARITEM_ONLYTEXT = 1 ;
|
var FCK_TOOLBARITEM_ONLYTEXT = window.parent.FCK_TOOLBARITEM_ONLYTEXT = 1 ;
|
||||||
var FCK_TOOLBARITEM_ICONTEXT = window.parent.FCK_TOOLBARITEM_ICONTEXT = 2 ;
|
var FCK_TOOLBARITEM_ICONTEXT = window.parent.FCK_TOOLBARITEM_ICONTEXT = 2 ;
|
||||||
|
|
||||||
// Edit Mode
|
// Edit Mode
|
||||||
var FCK_EDITMODE_WYSIWYG = window.parent.FCK_EDITMODE_WYSIWYG = 0 ;
|
var FCK_EDITMODE_WYSIWYG = window.parent.FCK_EDITMODE_WYSIWYG = 0 ;
|
||||||
var FCK_EDITMODE_SOURCE = window.parent.FCK_EDITMODE_SOURCE = 1 ;
|
var FCK_EDITMODE_SOURCE = window.parent.FCK_EDITMODE_SOURCE = 1 ;
|
||||||
|
|
||||||
var FCK_IMAGES_PATH = 'images/' ; // Check usage.
|
var FCK_IMAGES_PATH = 'images/' ; // Check usage.
|
||||||
var FCK_SPACER_PATH = 'images/spacer.gif' ;
|
var FCK_SPACER_PATH = 'images/spacer.gif' ;
|
||||||
|
|
||||||
var CTRL = 1000 ;
|
var CTRL = 1000 ;
|
||||||
var SHIFT = 2000 ;
|
var SHIFT = 2000 ;
|
||||||
var ALT = 4000 ;
|
var ALT = 4000 ;
|
||||||
|
|
||||||
var FCK_STYLE_BLOCK = 0 ;
|
var FCK_STYLE_BLOCK = 0 ;
|
||||||
var FCK_STYLE_INLINE = 1 ;
|
var FCK_STYLE_INLINE = 1 ;
|
||||||
var FCK_STYLE_OBJECT = 2 ;
|
var FCK_STYLE_OBJECT = 2 ;
|
||||||
|
@ -1,176 +1,178 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Create the FCKeditorAPI object that is available as a global object in
|
* Create the FCKeditorAPI object that is available as a global object in
|
||||||
* the page where the editor is placed in.
|
* the page where the editor is placed in.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCKeditorAPI ;
|
var FCKeditorAPI ;
|
||||||
|
|
||||||
function InitializeAPI()
|
function InitializeAPI()
|
||||||
{
|
{
|
||||||
var oParentWindow = window.parent ;
|
var oParentWindow = window.parent ;
|
||||||
|
|
||||||
if ( !( FCKeditorAPI = oParentWindow.FCKeditorAPI ) )
|
if ( !( FCKeditorAPI = oParentWindow.FCKeditorAPI ) )
|
||||||
{
|
{
|
||||||
// Make the FCKeditorAPI object available in the parent window. Use
|
// Make the FCKeditorAPI object available in the parent window. Use
|
||||||
// eval so this core runs in the parent's scope and so it will still be
|
// eval so this core runs in the parent's scope and so it will still be
|
||||||
// available if the editor instance is removed ("Can't execute code
|
// available if the editor instance is removed ("Can't execute code
|
||||||
// from a freed script" error).
|
// from a freed script" error).
|
||||||
|
|
||||||
// Note: we check the existence of oEditor.GetParentForm because some external
|
// Note: we check the existence of oEditor.GetParentForm because some external
|
||||||
// code (like JSON) can extend the Object prototype and we get then extra oEditor
|
// code (like JSON) can extend the Object prototype and we get then extra oEditor
|
||||||
// objects that aren't really FCKeditor instances.
|
// objects that aren't really FCKeditor instances.
|
||||||
var sScript =
|
var sScript =
|
||||||
'window.FCKeditorAPI = {' +
|
'window.FCKeditorAPI = {' +
|
||||||
'Version : "2.6",' +
|
'Version : "2.6.3",' +
|
||||||
'VersionBuild : "18638",' +
|
'VersionBuild : "19836",' +
|
||||||
'Instances : new Object(),' +
|
'Instances : new Object(),' +
|
||||||
|
|
||||||
'GetInstance : function( name )' +
|
'GetInstance : function( name )' +
|
||||||
'{' +
|
'{' +
|
||||||
'return this.Instances[ name ];' +
|
'return this.Instances[ name ];' +
|
||||||
'},' +
|
'},' +
|
||||||
|
|
||||||
'_FormSubmit : function()' +
|
'_FormSubmit : function()' +
|
||||||
'{' +
|
'{' +
|
||||||
'for ( var name in FCKeditorAPI.Instances )' +
|
'for ( var name in FCKeditorAPI.Instances )' +
|
||||||
'{' +
|
'{' +
|
||||||
'var oEditor = FCKeditorAPI.Instances[ name ] ;' +
|
'var oEditor = FCKeditorAPI.Instances[ name ] ;' +
|
||||||
'if ( oEditor.GetParentForm && oEditor.GetParentForm() == this )' +
|
'if ( oEditor.GetParentForm && oEditor.GetParentForm() == this )' +
|
||||||
'oEditor.UpdateLinkedField() ;' +
|
'oEditor.UpdateLinkedField() ;' +
|
||||||
'}' +
|
'}' +
|
||||||
'this._FCKOriginalSubmit() ;' +
|
'this._FCKOriginalSubmit() ;' +
|
||||||
'},' +
|
'},' +
|
||||||
|
|
||||||
'_FunctionQueue : {' +
|
'_FunctionQueue : {' +
|
||||||
'Functions : new Array(),' +
|
'Functions : new Array(),' +
|
||||||
'IsRunning : false,' +
|
'IsRunning : false,' +
|
||||||
|
|
||||||
'Add : function( f )' +
|
'Add : function( f )' +
|
||||||
'{' +
|
'{' +
|
||||||
'this.Functions.push( f );' +
|
'this.Functions.push( f );' +
|
||||||
'if ( !this.IsRunning )' +
|
'if ( !this.IsRunning )' +
|
||||||
'this.StartNext();' +
|
'this.StartNext();' +
|
||||||
'},' +
|
'},' +
|
||||||
|
|
||||||
'StartNext : function()' +
|
'StartNext : function()' +
|
||||||
'{' +
|
'{' +
|
||||||
'var aQueue = this.Functions ;' +
|
'var aQueue = this.Functions ;' +
|
||||||
'if ( aQueue.length > 0 )' +
|
'if ( aQueue.length > 0 )' +
|
||||||
'{' +
|
'{' +
|
||||||
'this.IsRunning = true;' +
|
'this.IsRunning = true;' +
|
||||||
'aQueue[0].call();' +
|
'aQueue[0].call();' +
|
||||||
'}' +
|
'}' +
|
||||||
'else ' +
|
'else ' +
|
||||||
'this.IsRunning = false;' +
|
'this.IsRunning = false;' +
|
||||||
'},' +
|
'},' +
|
||||||
|
|
||||||
'Remove : function( f )' +
|
'Remove : function( f )' +
|
||||||
'{' +
|
'{' +
|
||||||
'var aQueue = this.Functions;' +
|
'var aQueue = this.Functions;' +
|
||||||
'var i = 0, fFunc;' +
|
'var i = 0, fFunc;' +
|
||||||
'while( (fFunc = aQueue[ i ]) )' +
|
'while( (fFunc = aQueue[ i ]) )' +
|
||||||
'{' +
|
'{' +
|
||||||
'if ( fFunc == f )' +
|
'if ( fFunc == f )' +
|
||||||
'aQueue.splice( i,1 );' +
|
'aQueue.splice( i,1 );' +
|
||||||
'i++ ;' +
|
'i++ ;' +
|
||||||
'}' +
|
'}' +
|
||||||
'this.StartNext();' +
|
'this.StartNext();' +
|
||||||
'}' +
|
'}' +
|
||||||
'}' +
|
'}' +
|
||||||
'}' ;
|
'}' ;
|
||||||
|
|
||||||
// In IE, the "eval" function is not always available (it works with
|
// In IE, the "eval" function is not always available (it works with
|
||||||
// the JavaScript samples, but not with the ASP ones, for example).
|
// the JavaScript samples, but not with the ASP ones, for example).
|
||||||
// So, let's use the execScript instead.
|
// So, let's use the execScript instead.
|
||||||
if ( oParentWindow.execScript )
|
if ( oParentWindow.execScript )
|
||||||
oParentWindow.execScript( sScript, 'JavaScript' ) ;
|
oParentWindow.execScript( sScript, 'JavaScript' ) ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ( FCKBrowserInfo.IsGecko10 )
|
if ( FCKBrowserInfo.IsGecko10 )
|
||||||
{
|
{
|
||||||
// FF 1.0.4 gives an error with the request bellow. The
|
// FF 1.0.4 gives an error with the request bellow. The
|
||||||
// following seams to work well.
|
// following seams to work well.
|
||||||
eval.call( oParentWindow, sScript ) ;
|
eval.call( oParentWindow, sScript ) ;
|
||||||
}
|
}
|
||||||
else if( FCKBrowserInfo.IsAIR )
|
else if( FCKBrowserInfo.IsAIR )
|
||||||
{
|
{
|
||||||
FCKAdobeAIR.FCKeditorAPI_Evaluate( oParentWindow, sScript ) ;
|
FCKAdobeAIR.FCKeditorAPI_Evaluate( oParentWindow, sScript ) ;
|
||||||
}
|
}
|
||||||
else if ( FCKBrowserInfo.IsSafari || FCKBrowserInfo.IsGecko19 )
|
else if ( FCKBrowserInfo.IsSafari )
|
||||||
{
|
{
|
||||||
// oParentWindow.eval in Safari and Gran Paradiso executes in the calling window
|
// oParentWindow.eval in Safari and Gran Paradiso executes in the calling window
|
||||||
// environment, instead of the parent one. The following should make it work.
|
// environment, instead of the parent one. The following should make it work.
|
||||||
var oParentDocument = oParentWindow.document ;
|
var oParentDocument = oParentWindow.document ;
|
||||||
var eScript = oParentDocument.createElement('script') ;
|
var eScript = oParentDocument.createElement('script') ;
|
||||||
eScript.appendChild( oParentDocument.createTextNode( sScript ) ) ;
|
eScript.appendChild( oParentDocument.createTextNode( sScript ) ) ;
|
||||||
oParentDocument.documentElement.appendChild( eScript ) ;
|
oParentDocument.documentElement.appendChild( eScript ) ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
oParentWindow.eval( sScript ) ;
|
oParentWindow.eval( sScript ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKeditorAPI = oParentWindow.FCKeditorAPI ;
|
FCKeditorAPI = oParentWindow.FCKeditorAPI ;
|
||||||
|
|
||||||
// The __Instances properly has been changed to the public Instances,
|
// The __Instances properly has been changed to the public Instances,
|
||||||
// but we should still have the "deprecated" version of it.
|
// but we should still have the "deprecated" version of it.
|
||||||
FCKeditorAPI.__Instances = FCKeditorAPI.Instances ;
|
FCKeditorAPI.__Instances = FCKeditorAPI.Instances ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the current instance to the FCKeditorAPI's instances collection.
|
// Add the current instance to the FCKeditorAPI's instances collection.
|
||||||
FCKeditorAPI.Instances[ FCK.Name ] = FCK ;
|
FCKeditorAPI.Instances[ FCK.Name ] = FCK ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Attach to the form onsubmit event and to the form.submit().
|
// Attach to the form onsubmit event and to the form.submit().
|
||||||
function _AttachFormSubmitToAPI()
|
function _AttachFormSubmitToAPI()
|
||||||
{
|
{
|
||||||
// Get the linked field form.
|
// Get the linked field form.
|
||||||
var oForm = FCK.GetParentForm() ;
|
var oForm = FCK.GetParentForm() ;
|
||||||
|
|
||||||
if ( oForm )
|
if ( oForm )
|
||||||
{
|
{
|
||||||
// Attach to the onsubmit event.
|
// Attach to the onsubmit event.
|
||||||
FCKTools.AddEventListener( oForm, 'submit', FCK.UpdateLinkedField ) ;
|
FCKTools.AddEventListener( oForm, 'submit', FCK.UpdateLinkedField ) ;
|
||||||
|
|
||||||
// IE sees oForm.submit function as an 'object'.
|
// IE sees oForm.submit function as an 'object'.
|
||||||
if ( !oForm._FCKOriginalSubmit && ( typeof( oForm.submit ) == 'function' || ( !oForm.submit.tagName && !oForm.submit.length ) ) )
|
if ( !oForm._FCKOriginalSubmit && ( typeof( oForm.submit ) == 'function' || ( !oForm.submit.tagName && !oForm.submit.length ) ) )
|
||||||
{
|
{
|
||||||
// Save the original submit.
|
// Save the original submit.
|
||||||
oForm._FCKOriginalSubmit = oForm.submit ;
|
oForm._FCKOriginalSubmit = oForm.submit ;
|
||||||
|
|
||||||
// Create our replacement for the submit.
|
// Create our replacement for the submit.
|
||||||
oForm.submit = FCKeditorAPI._FormSubmit ;
|
oForm.submit = FCKeditorAPI._FormSubmit ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCKeditorAPI_Cleanup()
|
function FCKeditorAPI_Cleanup()
|
||||||
{
|
{
|
||||||
if ( ! window.FCKUnloadFlag )
|
if ( window.FCKConfig && FCKConfig.MsWebBrowserControlCompat
|
||||||
return ;
|
&& !window.FCKUnloadFlag )
|
||||||
delete FCKeditorAPI.Instances[ FCK.Name ] ;
|
return ;
|
||||||
}
|
delete FCKeditorAPI.Instances[ FCK.Name ] ;
|
||||||
function FCKeditorAPI_ConfirmCleanup()
|
}
|
||||||
{
|
function FCKeditorAPI_ConfirmCleanup()
|
||||||
window.FCKUnloadFlag = true ;
|
{
|
||||||
}
|
if ( window.FCKConfig && FCKConfig.MsWebBrowserControlCompat )
|
||||||
FCKTools.AddEventListener( window, 'unload', FCKeditorAPI_Cleanup ) ;
|
window.FCKUnloadFlag = true ;
|
||||||
FCKTools.AddEventListener( window, 'beforeunload', FCKeditorAPI_ConfirmCleanup) ;
|
}
|
||||||
|
FCKTools.AddEventListener( window, 'unload', FCKeditorAPI_Cleanup ) ;
|
||||||
|
FCKTools.AddEventListener( window, 'beforeunload', FCKeditorAPI_ConfirmCleanup) ;
|
||||||
|
@ -1,166 +1,166 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Extensions to the JavaScript Core.
|
* Extensions to the JavaScript Core.
|
||||||
*
|
*
|
||||||
* All custom extensions functions are PascalCased to differ from the standard
|
* All custom extensions functions are PascalCased to differ from the standard
|
||||||
* camelCased ones.
|
* camelCased ones.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
String.prototype.Contains = function( textToCheck )
|
String.prototype.Contains = function( textToCheck )
|
||||||
{
|
{
|
||||||
return ( this.indexOf( textToCheck ) > -1 ) ;
|
return ( this.indexOf( textToCheck ) > -1 ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
String.prototype.Equals = function()
|
String.prototype.Equals = function()
|
||||||
{
|
{
|
||||||
var aArgs = arguments ;
|
var aArgs = arguments ;
|
||||||
|
|
||||||
// The arguments could also be a single array.
|
// The arguments could also be a single array.
|
||||||
if ( aArgs.length == 1 && aArgs[0].pop )
|
if ( aArgs.length == 1 && aArgs[0].pop )
|
||||||
aArgs = aArgs[0] ;
|
aArgs = aArgs[0] ;
|
||||||
|
|
||||||
for ( var i = 0 ; i < aArgs.length ; i++ )
|
for ( var i = 0 ; i < aArgs.length ; i++ )
|
||||||
{
|
{
|
||||||
if ( this == aArgs[i] )
|
if ( this == aArgs[i] )
|
||||||
return true ;
|
return true ;
|
||||||
}
|
}
|
||||||
return false ;
|
return false ;
|
||||||
}
|
}
|
||||||
|
|
||||||
String.prototype.IEquals = function()
|
String.prototype.IEquals = function()
|
||||||
{
|
{
|
||||||
var thisUpper = this.toUpperCase() ;
|
var thisUpper = this.toUpperCase() ;
|
||||||
|
|
||||||
var aArgs = arguments ;
|
var aArgs = arguments ;
|
||||||
|
|
||||||
// The arguments could also be a single array.
|
// The arguments could also be a single array.
|
||||||
if ( aArgs.length == 1 && aArgs[0].pop )
|
if ( aArgs.length == 1 && aArgs[0].pop )
|
||||||
aArgs = aArgs[0] ;
|
aArgs = aArgs[0] ;
|
||||||
|
|
||||||
for ( var i = 0 ; i < aArgs.length ; i++ )
|
for ( var i = 0 ; i < aArgs.length ; i++ )
|
||||||
{
|
{
|
||||||
if ( thisUpper == aArgs[i].toUpperCase() )
|
if ( thisUpper == aArgs[i].toUpperCase() )
|
||||||
return true ;
|
return true ;
|
||||||
}
|
}
|
||||||
return false ;
|
return false ;
|
||||||
}
|
}
|
||||||
|
|
||||||
String.prototype.ReplaceAll = function( searchArray, replaceArray )
|
String.prototype.ReplaceAll = function( searchArray, replaceArray )
|
||||||
{
|
{
|
||||||
var replaced = this ;
|
var replaced = this ;
|
||||||
|
|
||||||
for ( var i = 0 ; i < searchArray.length ; i++ )
|
for ( var i = 0 ; i < searchArray.length ; i++ )
|
||||||
{
|
{
|
||||||
replaced = replaced.replace( searchArray[i], replaceArray[i] ) ;
|
replaced = replaced.replace( searchArray[i], replaceArray[i] ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
return replaced ;
|
return replaced ;
|
||||||
}
|
}
|
||||||
|
|
||||||
String.prototype.StartsWith = function( value )
|
String.prototype.StartsWith = function( value )
|
||||||
{
|
{
|
||||||
return ( this.substr( 0, value.length ) == value ) ;
|
return ( this.substr( 0, value.length ) == value ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extends the String object, creating a "EndsWith" method on it.
|
// Extends the String object, creating a "EndsWith" method on it.
|
||||||
String.prototype.EndsWith = function( value, ignoreCase )
|
String.prototype.EndsWith = function( value, ignoreCase )
|
||||||
{
|
{
|
||||||
var L1 = this.length ;
|
var L1 = this.length ;
|
||||||
var L2 = value.length ;
|
var L2 = value.length ;
|
||||||
|
|
||||||
if ( L2 > L1 )
|
if ( L2 > L1 )
|
||||||
return false ;
|
return false ;
|
||||||
|
|
||||||
if ( ignoreCase )
|
if ( ignoreCase )
|
||||||
{
|
{
|
||||||
var oRegex = new RegExp( value + '$' , 'i' ) ;
|
var oRegex = new RegExp( value + '$' , 'i' ) ;
|
||||||
return oRegex.test( this ) ;
|
return oRegex.test( this ) ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return ( L2 == 0 || this.substr( L1 - L2, L2 ) == value ) ;
|
return ( L2 == 0 || this.substr( L1 - L2, L2 ) == value ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
String.prototype.Remove = function( start, length )
|
String.prototype.Remove = function( start, length )
|
||||||
{
|
{
|
||||||
var s = '' ;
|
var s = '' ;
|
||||||
|
|
||||||
if ( start > 0 )
|
if ( start > 0 )
|
||||||
s = this.substring( 0, start ) ;
|
s = this.substring( 0, start ) ;
|
||||||
|
|
||||||
if ( start + length < this.length )
|
if ( start + length < this.length )
|
||||||
s += this.substring( start + length , this.length ) ;
|
s += this.substring( start + length , this.length ) ;
|
||||||
|
|
||||||
return s ;
|
return s ;
|
||||||
}
|
}
|
||||||
|
|
||||||
String.prototype.Trim = function()
|
String.prototype.Trim = function()
|
||||||
{
|
{
|
||||||
// We are not using \s because we don't want "non-breaking spaces to be caught".
|
// We are not using \s because we don't want "non-breaking spaces to be caught".
|
||||||
return this.replace( /(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '' ) ;
|
return this.replace( /(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '' ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
String.prototype.LTrim = function()
|
String.prototype.LTrim = function()
|
||||||
{
|
{
|
||||||
// We are not using \s because we don't want "non-breaking spaces to be caught".
|
// We are not using \s because we don't want "non-breaking spaces to be caught".
|
||||||
return this.replace( /^[ \t\n\r]*/g, '' ) ;
|
return this.replace( /^[ \t\n\r]*/g, '' ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
String.prototype.RTrim = function()
|
String.prototype.RTrim = function()
|
||||||
{
|
{
|
||||||
// We are not using \s because we don't want "non-breaking spaces to be caught".
|
// We are not using \s because we don't want "non-breaking spaces to be caught".
|
||||||
return this.replace( /[ \t\n\r]*$/g, '' ) ;
|
return this.replace( /[ \t\n\r]*$/g, '' ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
String.prototype.ReplaceNewLineChars = function( replacement )
|
String.prototype.ReplaceNewLineChars = function( replacement )
|
||||||
{
|
{
|
||||||
return this.replace( /\n/g, replacement ) ;
|
return this.replace( /\n/g, replacement ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
String.prototype.Replace = function( regExp, replacement, thisObj )
|
String.prototype.Replace = function( regExp, replacement, thisObj )
|
||||||
{
|
{
|
||||||
if ( typeof replacement == 'function' )
|
if ( typeof replacement == 'function' )
|
||||||
{
|
{
|
||||||
return this.replace( regExp,
|
return this.replace( regExp,
|
||||||
function()
|
function()
|
||||||
{
|
{
|
||||||
return replacement.apply( thisObj || this, arguments ) ;
|
return replacement.apply( thisObj || this, arguments ) ;
|
||||||
} ) ;
|
} ) ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return this.replace( regExp, replacement ) ;
|
return this.replace( regExp, replacement ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
Array.prototype.AddItem = function( item )
|
Array.prototype.AddItem = function( item )
|
||||||
{
|
{
|
||||||
var i = this.length ;
|
var i = this.length ;
|
||||||
this[ i ] = item ;
|
this[ i ] = item ;
|
||||||
return i ;
|
return i ;
|
||||||
}
|
}
|
||||||
|
|
||||||
Array.prototype.IndexOf = function( value )
|
Array.prototype.IndexOf = function( value )
|
||||||
{
|
{
|
||||||
for ( var i = 0 ; i < this.length ; i++ )
|
for ( var i = 0 ; i < this.length ; i++ )
|
||||||
{
|
{
|
||||||
if ( this[i] == value )
|
if ( this[i] == value )
|
||||||
return i ;
|
return i ;
|
||||||
}
|
}
|
||||||
return -1 ;
|
return -1 ;
|
||||||
}
|
}
|
||||||
|
@ -1,122 +1,122 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* This is a utility object which can be used to load specific components of
|
* This is a utility object which can be used to load specific components of
|
||||||
* FCKeditor, including all dependencies.
|
* FCKeditor, including all dependencies.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var FCK_GENERIC = 1 ;
|
var FCK_GENERIC = 1 ;
|
||||||
var FCK_GENERIC_SPECIFIC = 2 ;
|
var FCK_GENERIC_SPECIFIC = 2 ;
|
||||||
var FCK_SPECIFIC = 3 ;
|
var FCK_SPECIFIC = 3 ;
|
||||||
|
|
||||||
var FCKScriptLoader = new Object() ;
|
var FCKScriptLoader = new Object() ;
|
||||||
FCKScriptLoader.FCKeditorPath = '/fckeditor/' ;
|
FCKScriptLoader.FCKeditorPath = '/fckeditor/' ;
|
||||||
|
|
||||||
FCKScriptLoader._Scripts = new Object() ;
|
FCKScriptLoader._Scripts = new Object() ;
|
||||||
FCKScriptLoader._LoadedScripts = new Object() ;
|
FCKScriptLoader._LoadedScripts = new Object() ;
|
||||||
|
|
||||||
FCKScriptLoader._IsIE = (/msie/).test( navigator.userAgent.toLowerCase() ) ;
|
FCKScriptLoader._IsIE = (/msie/).test( navigator.userAgent.toLowerCase() ) ;
|
||||||
|
|
||||||
FCKScriptLoader.Load = function( scriptName )
|
FCKScriptLoader.Load = function( scriptName )
|
||||||
{
|
{
|
||||||
// Check if the script has already been loaded.
|
// Check if the script has already been loaded.
|
||||||
if ( scriptName in FCKScriptLoader._LoadedScripts )
|
if ( scriptName in FCKScriptLoader._LoadedScripts )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
FCKScriptLoader._LoadedScripts[ scriptName ] = true ;
|
FCKScriptLoader._LoadedScripts[ scriptName ] = true ;
|
||||||
|
|
||||||
var oScriptInfo = this._Scripts[ scriptName ] ;
|
var oScriptInfo = this._Scripts[ scriptName ] ;
|
||||||
|
|
||||||
if ( !oScriptInfo )
|
if ( !oScriptInfo )
|
||||||
{
|
{
|
||||||
alert( 'FCKScriptLoader: The script "' + scriptName + '" could not be loaded' ) ;
|
alert( 'FCKScriptLoader: The script "' + scriptName + '" could not be loaded' ) ;
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( var i = 0 ; i < oScriptInfo.Dependency.length ; i++ )
|
for ( var i = 0 ; i < oScriptInfo.Dependency.length ; i++ )
|
||||||
{
|
{
|
||||||
this.Load( oScriptInfo.Dependency[i] ) ;
|
this.Load( oScriptInfo.Dependency[i] ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
var sBaseScriptName = oScriptInfo.BasePath + scriptName.toLowerCase() ;
|
var sBaseScriptName = oScriptInfo.BasePath + scriptName.toLowerCase() ;
|
||||||
|
|
||||||
if ( oScriptInfo.Compatibility == FCK_GENERIC || oScriptInfo.Compatibility == FCK_GENERIC_SPECIFIC )
|
if ( oScriptInfo.Compatibility == FCK_GENERIC || oScriptInfo.Compatibility == FCK_GENERIC_SPECIFIC )
|
||||||
this._LoadScript( sBaseScriptName + '.js' ) ;
|
this._LoadScript( sBaseScriptName + '.js' ) ;
|
||||||
|
|
||||||
if ( oScriptInfo.Compatibility == FCK_SPECIFIC || oScriptInfo.Compatibility == FCK_GENERIC_SPECIFIC )
|
if ( oScriptInfo.Compatibility == FCK_SPECIFIC || oScriptInfo.Compatibility == FCK_GENERIC_SPECIFIC )
|
||||||
{
|
{
|
||||||
if ( this._IsIE )
|
if ( this._IsIE )
|
||||||
this._LoadScript( sBaseScriptName + '_ie.js' ) ;
|
this._LoadScript( sBaseScriptName + '_ie.js' ) ;
|
||||||
else
|
else
|
||||||
this._LoadScript( sBaseScriptName + '_gecko.js' ) ;
|
this._LoadScript( sBaseScriptName + '_gecko.js' ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKScriptLoader._LoadScript = function( scriptPathFromSource )
|
FCKScriptLoader._LoadScript = function( scriptPathFromSource )
|
||||||
{
|
{
|
||||||
document.write( '<script type="text/javascript" src="' + this.FCKeditorPath + 'editor/_source/' + scriptPathFromSource + '"><\/script>' ) ;
|
document.write( '<script type="text/javascript" src="' + this.FCKeditorPath + 'editor/_source/' + scriptPathFromSource + '"><\/script>' ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCKScriptLoader.AddScript = function( scriptName, scriptBasePath, dependency, compatibility )
|
FCKScriptLoader.AddScript = function( scriptName, scriptBasePath, dependency, compatibility )
|
||||||
{
|
{
|
||||||
this._Scripts[ scriptName ] =
|
this._Scripts[ scriptName ] =
|
||||||
{
|
{
|
||||||
BasePath : scriptBasePath || '',
|
BasePath : scriptBasePath || '',
|
||||||
Dependency : dependency || [],
|
Dependency : dependency || [],
|
||||||
Compatibility : compatibility || FCK_GENERIC
|
Compatibility : compatibility || FCK_GENERIC
|
||||||
} ;
|
} ;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ####################################
|
* ####################################
|
||||||
* ### Scripts Definition List
|
* ### Scripts Definition List
|
||||||
*/
|
*/
|
||||||
|
|
||||||
FCKScriptLoader.AddScript( 'FCKConstants' ) ;
|
FCKScriptLoader.AddScript( 'FCKConstants' ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKJSCoreExtensions' ) ;
|
FCKScriptLoader.AddScript( 'FCKJSCoreExtensions' ) ;
|
||||||
|
|
||||||
FCKScriptLoader.AddScript( 'FCK_Xhtml10Transitional', '../dtd/' ) ;
|
FCKScriptLoader.AddScript( 'FCK_Xhtml10Transitional', '../dtd/' ) ;
|
||||||
|
|
||||||
FCKScriptLoader.AddScript( 'FCKDataProcessor' , 'classes/' , ['FCKConfig','FCKBrowserInfo','FCKRegexLib','FCKXHtml'] ) ;
|
FCKScriptLoader.AddScript( 'FCKDataProcessor' , 'classes/' , ['FCKConfig','FCKBrowserInfo','FCKRegexLib','FCKXHtml'] ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKDocumentFragment', 'classes/' , ['FCKDomTools'], FCK_SPECIFIC ) ;
|
FCKScriptLoader.AddScript( 'FCKDocumentFragment', 'classes/' , ['FCKDomTools'], FCK_SPECIFIC ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKDomRange' , 'classes/' , ['FCKBrowserInfo','FCKJSCoreExtensions','FCKW3CRange','FCKElementPath','FCKDomTools','FCKTools','FCKDocumentFragment'], FCK_GENERIC_SPECIFIC ) ;
|
FCKScriptLoader.AddScript( 'FCKDomRange' , 'classes/' , ['FCKBrowserInfo','FCKJSCoreExtensions','FCKW3CRange','FCKElementPath','FCKDomTools','FCKTools','FCKDocumentFragment'], FCK_GENERIC_SPECIFIC ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKDomRangeIterator', 'classes/' , ['FCKDomRange','FCKListsLib'], FCK_GENERIC ) ;
|
FCKScriptLoader.AddScript( 'FCKDomRangeIterator', 'classes/' , ['FCKDomRange','FCKListsLib'], FCK_GENERIC ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKElementPath' , 'classes/' , ['FCKListsLib'], FCK_GENERIC ) ;
|
FCKScriptLoader.AddScript( 'FCKElementPath' , 'classes/' , ['FCKListsLib'], FCK_GENERIC ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKEnterKey' , 'classes/' , ['FCKDomRange','FCKDomTools','FCKTools','FCKKeystrokeHandler','FCKListHandler'], FCK_GENERIC ) ;
|
FCKScriptLoader.AddScript( 'FCKEnterKey' , 'classes/' , ['FCKDomRange','FCKDomTools','FCKTools','FCKKeystrokeHandler','FCKListHandler'], FCK_GENERIC ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKPanel' , 'classes/' , ['FCKBrowserInfo','FCKConfig','FCKTools'], FCK_GENERIC ) ;
|
FCKScriptLoader.AddScript( 'FCKPanel' , 'classes/' , ['FCKBrowserInfo','FCKConfig','FCKTools'], FCK_GENERIC ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKImagePreloader' , 'classes/' ) ;
|
FCKScriptLoader.AddScript( 'FCKImagePreloader' , 'classes/' ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKKeystrokeHandler', 'classes/' , ['FCKConstants','FCKBrowserInfo','FCKTools'], FCK_GENERIC ) ;
|
FCKScriptLoader.AddScript( 'FCKKeystrokeHandler', 'classes/' , ['FCKConstants','FCKBrowserInfo','FCKTools'], FCK_GENERIC ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKStyle' , 'classes/' , ['FCKConstants','FCKDomRange','FCKDomRangeIterator','FCKDomTools','FCKListsLib','FCK_Xhtml10Transitional'], FCK_GENERIC ) ;
|
FCKScriptLoader.AddScript( 'FCKStyle' , 'classes/' , ['FCKConstants','FCKDomRange','FCKDomRangeIterator','FCKDomTools','FCKListsLib','FCK_Xhtml10Transitional'], FCK_GENERIC ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKW3CRange' , 'classes/' , ['FCKDomTools','FCKTools','FCKDocumentFragment'], FCK_GENERIC ) ;
|
FCKScriptLoader.AddScript( 'FCKW3CRange' , 'classes/' , ['FCKDomTools','FCKTools','FCKDocumentFragment'], FCK_GENERIC ) ;
|
||||||
|
|
||||||
FCKScriptLoader.AddScript( 'FCKBrowserInfo' , 'internals/' , ['FCKJSCoreExtensions'] ) ;
|
FCKScriptLoader.AddScript( 'FCKBrowserInfo' , 'internals/' , ['FCKJSCoreExtensions'] ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKCodeFormatter' , 'internals/' ) ;
|
FCKScriptLoader.AddScript( 'FCKCodeFormatter' , 'internals/' ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKConfig' , 'internals/' , ['FCKBrowserInfo','FCKConstants'] ) ;
|
FCKScriptLoader.AddScript( 'FCKConfig' , 'internals/' , ['FCKBrowserInfo','FCKConstants'] ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKDebug' , 'internals/' , ['FCKConfig'] ) ;
|
FCKScriptLoader.AddScript( 'FCKDebug' , 'internals/' , ['FCKConfig'] ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKDomTools' , 'internals/' , ['FCKJSCoreExtensions','FCKBrowserInfo','FCKTools','FCKDomRange'], FCK_GENERIC ) ;
|
FCKScriptLoader.AddScript( 'FCKDomTools' , 'internals/' , ['FCKJSCoreExtensions','FCKBrowserInfo','FCKTools','FCKDomRange'], FCK_GENERIC ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKListsLib' , 'internals/' ) ;
|
FCKScriptLoader.AddScript( 'FCKListsLib' , 'internals/' ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKListHandler' , 'internals/' , ['FCKConfig', 'FCKDocumentFragment', 'FCKJSCoreExtensions','FCKDomTools'], FCK_GENERIC ) ;
|
FCKScriptLoader.AddScript( 'FCKListHandler' , 'internals/' , ['FCKConfig', 'FCKDocumentFragment', 'FCKJSCoreExtensions','FCKDomTools'], FCK_GENERIC ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKRegexLib' , 'internals/' ) ;
|
FCKScriptLoader.AddScript( 'FCKRegexLib' , 'internals/' ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKStyles' , 'internals/' , ['FCKConfig', 'FCKDocumentFragment', 'FCKDomRange','FCKDomTools','FCKElementPath','FCKTools'], FCK_GENERIC ) ;
|
FCKScriptLoader.AddScript( 'FCKStyles' , 'internals/' , ['FCKConfig', 'FCKDocumentFragment', 'FCKDomRange','FCKDomTools','FCKElementPath','FCKTools'], FCK_GENERIC ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKTools' , 'internals/' , ['FCKJSCoreExtensions','FCKBrowserInfo'], FCK_GENERIC_SPECIFIC ) ;
|
FCKScriptLoader.AddScript( 'FCKTools' , 'internals/' , ['FCKJSCoreExtensions','FCKBrowserInfo'], FCK_GENERIC_SPECIFIC ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKXHtml' , 'internals/' , ['FCKBrowserInfo','FCKCodeFormatter','FCKConfig','FCKDomTools','FCKListsLib','FCKRegexLib','FCKTools','FCKXHtmlEntities'], FCK_GENERIC_SPECIFIC ) ;
|
FCKScriptLoader.AddScript( 'FCKXHtml' , 'internals/' , ['FCKBrowserInfo','FCKCodeFormatter','FCKConfig','FCKDomTools','FCKListsLib','FCKRegexLib','FCKTools','FCKXHtmlEntities'], FCK_GENERIC_SPECIFIC ) ;
|
||||||
FCKScriptLoader.AddScript( 'FCKXHtmlEntities' , 'internals/' , ['FCKConfig'] ) ;
|
FCKScriptLoader.AddScript( 'FCKXHtmlEntities' , 'internals/' , ['FCKConfig'] ) ;
|
||||||
|
|
||||||
// ####################################
|
// ####################################
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,325 +1,342 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Defines the FCK.ContextMenu object that is responsible for all
|
* Defines the FCK.ContextMenu object that is responsible for all
|
||||||
* Context Menu operations in the editing area.
|
* Context Menu operations in the editing area.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
FCK.ContextMenu = new Object() ;
|
FCK.ContextMenu = new Object() ;
|
||||||
FCK.ContextMenu.Listeners = new Array() ;
|
FCK.ContextMenu.Listeners = new Array() ;
|
||||||
|
|
||||||
FCK.ContextMenu.RegisterListener = function( listener )
|
FCK.ContextMenu.RegisterListener = function( listener )
|
||||||
{
|
{
|
||||||
if ( listener )
|
if ( listener )
|
||||||
this.Listeners.push( listener ) ;
|
this.Listeners.push( listener ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCK_ContextMenu_Init()
|
function FCK_ContextMenu_Init()
|
||||||
{
|
{
|
||||||
var oInnerContextMenu = FCK.ContextMenu._InnerContextMenu = new FCKContextMenu( FCKBrowserInfo.IsIE ? window : window.parent, FCKLang.Dir ) ;
|
var oInnerContextMenu = FCK.ContextMenu._InnerContextMenu = new FCKContextMenu( FCKBrowserInfo.IsIE ? window : window.parent, FCKLang.Dir ) ;
|
||||||
oInnerContextMenu.CtrlDisable = FCKConfig.BrowserContextMenuOnCtrl ;
|
oInnerContextMenu.CtrlDisable = FCKConfig.BrowserContextMenuOnCtrl ;
|
||||||
oInnerContextMenu.OnBeforeOpen = FCK_ContextMenu_OnBeforeOpen ;
|
oInnerContextMenu.OnBeforeOpen = FCK_ContextMenu_OnBeforeOpen ;
|
||||||
oInnerContextMenu.OnItemClick = FCK_ContextMenu_OnItemClick ;
|
oInnerContextMenu.OnItemClick = FCK_ContextMenu_OnItemClick ;
|
||||||
|
|
||||||
// Get the registering function.
|
// Get the registering function.
|
||||||
var oMenu = FCK.ContextMenu ;
|
var oMenu = FCK.ContextMenu ;
|
||||||
|
|
||||||
// Register all configured context menu listeners.
|
// Register all configured context menu listeners.
|
||||||
for ( var i = 0 ; i < FCKConfig.ContextMenu.length ; i++ )
|
for ( var i = 0 ; i < FCKConfig.ContextMenu.length ; i++ )
|
||||||
oMenu.RegisterListener( FCK_ContextMenu_GetListener( FCKConfig.ContextMenu[i] ) ) ;
|
oMenu.RegisterListener( FCK_ContextMenu_GetListener( FCKConfig.ContextMenu[i] ) ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function FCK_ContextMenu_GetListener( listenerName )
|
function FCK_ContextMenu_GetListener( listenerName )
|
||||||
{
|
{
|
||||||
switch ( listenerName )
|
switch ( listenerName )
|
||||||
{
|
{
|
||||||
case 'Generic' :
|
case 'Generic' :
|
||||||
return {
|
return {
|
||||||
AddItems : function( menu, tag, tagName )
|
AddItems : function( menu, tag, tagName )
|
||||||
{
|
{
|
||||||
menu.AddItem( 'Cut' , FCKLang.Cut , 7, FCKCommands.GetCommand( 'Cut' ).GetState() == FCK_TRISTATE_DISABLED ) ;
|
menu.AddItem( 'Cut' , FCKLang.Cut , 7, FCKCommands.GetCommand( 'Cut' ).GetState() == FCK_TRISTATE_DISABLED ) ;
|
||||||
menu.AddItem( 'Copy' , FCKLang.Copy , 8, FCKCommands.GetCommand( 'Copy' ).GetState() == FCK_TRISTATE_DISABLED ) ;
|
menu.AddItem( 'Copy' , FCKLang.Copy , 8, FCKCommands.GetCommand( 'Copy' ).GetState() == FCK_TRISTATE_DISABLED ) ;
|
||||||
menu.AddItem( 'Paste' , FCKLang.Paste , 9, FCKCommands.GetCommand( 'Paste' ).GetState() == FCK_TRISTATE_DISABLED ) ;
|
menu.AddItem( 'Paste' , FCKLang.Paste , 9, FCKCommands.GetCommand( 'Paste' ).GetState() == FCK_TRISTATE_DISABLED ) ;
|
||||||
}} ;
|
}} ;
|
||||||
|
|
||||||
case 'Table' :
|
case 'Table' :
|
||||||
return {
|
return {
|
||||||
AddItems : function( menu, tag, tagName )
|
AddItems : function( menu, tag, tagName )
|
||||||
{
|
{
|
||||||
var bIsTable = ( tagName == 'TABLE' ) ;
|
var bIsTable = ( tagName == 'TABLE' ) ;
|
||||||
var bIsCell = ( !bIsTable && FCKSelection.HasAncestorNode( 'TABLE' ) ) ;
|
var bIsCell = ( !bIsTable && FCKSelection.HasAncestorNode( 'TABLE' ) ) ;
|
||||||
|
|
||||||
if ( bIsCell )
|
if ( bIsCell )
|
||||||
{
|
{
|
||||||
menu.AddSeparator() ;
|
menu.AddSeparator() ;
|
||||||
var oItem = menu.AddItem( 'Cell' , FCKLang.CellCM ) ;
|
var oItem = menu.AddItem( 'Cell' , FCKLang.CellCM ) ;
|
||||||
oItem.AddItem( 'TableInsertCellBefore' , FCKLang.InsertCellBefore, 69 ) ;
|
oItem.AddItem( 'TableInsertCellBefore' , FCKLang.InsertCellBefore, 69 ) ;
|
||||||
oItem.AddItem( 'TableInsertCellAfter' , FCKLang.InsertCellAfter, 58 ) ;
|
oItem.AddItem( 'TableInsertCellAfter' , FCKLang.InsertCellAfter, 58 ) ;
|
||||||
oItem.AddItem( 'TableDeleteCells' , FCKLang.DeleteCells, 59 ) ;
|
oItem.AddItem( 'TableDeleteCells' , FCKLang.DeleteCells, 59 ) ;
|
||||||
if ( FCKBrowserInfo.IsGecko )
|
if ( FCKBrowserInfo.IsGecko )
|
||||||
oItem.AddItem( 'TableMergeCells' , FCKLang.MergeCells, 60,
|
oItem.AddItem( 'TableMergeCells' , FCKLang.MergeCells, 60,
|
||||||
FCKCommands.GetCommand( 'TableMergeCells' ).GetState() == FCK_TRISTATE_DISABLED ) ;
|
FCKCommands.GetCommand( 'TableMergeCells' ).GetState() == FCK_TRISTATE_DISABLED ) ;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
oItem.AddItem( 'TableMergeRight' , FCKLang.MergeRight, 60,
|
oItem.AddItem( 'TableMergeRight' , FCKLang.MergeRight, 60,
|
||||||
FCKCommands.GetCommand( 'TableMergeRight' ).GetState() == FCK_TRISTATE_DISABLED ) ;
|
FCKCommands.GetCommand( 'TableMergeRight' ).GetState() == FCK_TRISTATE_DISABLED ) ;
|
||||||
oItem.AddItem( 'TableMergeDown' , FCKLang.MergeDown, 60,
|
oItem.AddItem( 'TableMergeDown' , FCKLang.MergeDown, 60,
|
||||||
FCKCommands.GetCommand( 'TableMergeDown' ).GetState() == FCK_TRISTATE_DISABLED ) ;
|
FCKCommands.GetCommand( 'TableMergeDown' ).GetState() == FCK_TRISTATE_DISABLED ) ;
|
||||||
}
|
}
|
||||||
oItem.AddItem( 'TableHorizontalSplitCell' , FCKLang.HorizontalSplitCell, 61,
|
oItem.AddItem( 'TableHorizontalSplitCell' , FCKLang.HorizontalSplitCell, 61,
|
||||||
FCKCommands.GetCommand( 'TableHorizontalSplitCell' ).GetState() == FCK_TRISTATE_DISABLED ) ;
|
FCKCommands.GetCommand( 'TableHorizontalSplitCell' ).GetState() == FCK_TRISTATE_DISABLED ) ;
|
||||||
oItem.AddItem( 'TableVerticalSplitCell' , FCKLang.VerticalSplitCell, 61,
|
oItem.AddItem( 'TableVerticalSplitCell' , FCKLang.VerticalSplitCell, 61,
|
||||||
FCKCommands.GetCommand( 'TableVerticalSplitCell' ).GetState() == FCK_TRISTATE_DISABLED ) ;
|
FCKCommands.GetCommand( 'TableVerticalSplitCell' ).GetState() == FCK_TRISTATE_DISABLED ) ;
|
||||||
oItem.AddSeparator() ;
|
oItem.AddSeparator() ;
|
||||||
oItem.AddItem( 'TableCellProp' , FCKLang.CellProperties, 57,
|
oItem.AddItem( 'TableCellProp' , FCKLang.CellProperties, 57,
|
||||||
FCKCommands.GetCommand( 'TableCellProp' ).GetState() == FCK_TRISTATE_DISABLED ) ;
|
FCKCommands.GetCommand( 'TableCellProp' ).GetState() == FCK_TRISTATE_DISABLED ) ;
|
||||||
|
|
||||||
menu.AddSeparator() ;
|
menu.AddSeparator() ;
|
||||||
oItem = menu.AddItem( 'Row' , FCKLang.RowCM ) ;
|
oItem = menu.AddItem( 'Row' , FCKLang.RowCM ) ;
|
||||||
oItem.AddItem( 'TableInsertRowBefore' , FCKLang.InsertRowBefore, 70 ) ;
|
oItem.AddItem( 'TableInsertRowBefore' , FCKLang.InsertRowBefore, 70 ) ;
|
||||||
oItem.AddItem( 'TableInsertRowAfter' , FCKLang.InsertRowAfter, 62 ) ;
|
oItem.AddItem( 'TableInsertRowAfter' , FCKLang.InsertRowAfter, 62 ) ;
|
||||||
oItem.AddItem( 'TableDeleteRows' , FCKLang.DeleteRows, 63 ) ;
|
oItem.AddItem( 'TableDeleteRows' , FCKLang.DeleteRows, 63 ) ;
|
||||||
|
|
||||||
menu.AddSeparator() ;
|
menu.AddSeparator() ;
|
||||||
oItem = menu.AddItem( 'Column' , FCKLang.ColumnCM ) ;
|
oItem = menu.AddItem( 'Column' , FCKLang.ColumnCM ) ;
|
||||||
oItem.AddItem( 'TableInsertColumnBefore', FCKLang.InsertColumnBefore, 71 ) ;
|
oItem.AddItem( 'TableInsertColumnBefore', FCKLang.InsertColumnBefore, 71 ) ;
|
||||||
oItem.AddItem( 'TableInsertColumnAfter' , FCKLang.InsertColumnAfter, 64 ) ;
|
oItem.AddItem( 'TableInsertColumnAfter' , FCKLang.InsertColumnAfter, 64 ) ;
|
||||||
oItem.AddItem( 'TableDeleteColumns' , FCKLang.DeleteColumns, 65 ) ;
|
oItem.AddItem( 'TableDeleteColumns' , FCKLang.DeleteColumns, 65 ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( bIsTable || bIsCell )
|
if ( bIsTable || bIsCell )
|
||||||
{
|
{
|
||||||
menu.AddSeparator() ;
|
menu.AddSeparator() ;
|
||||||
menu.AddItem( 'TableDelete' , FCKLang.TableDelete ) ;
|
menu.AddItem( 'TableDelete' , FCKLang.TableDelete ) ;
|
||||||
menu.AddItem( 'TableProp' , FCKLang.TableProperties, 39 ) ;
|
menu.AddItem( 'TableProp' , FCKLang.TableProperties, 39 ) ;
|
||||||
}
|
}
|
||||||
}} ;
|
}} ;
|
||||||
|
|
||||||
case 'Link' :
|
case 'Link' :
|
||||||
return {
|
return {
|
||||||
AddItems : function( menu, tag, tagName )
|
AddItems : function( menu, tag, tagName )
|
||||||
{
|
{
|
||||||
var bInsideLink = ( tagName == 'A' || FCKSelection.HasAncestorNode( 'A' ) ) ;
|
var bInsideLink = ( tagName == 'A' || FCKSelection.HasAncestorNode( 'A' ) ) ;
|
||||||
|
|
||||||
if ( bInsideLink || FCK.GetNamedCommandState( 'Unlink' ) != FCK_TRISTATE_DISABLED )
|
if ( bInsideLink || FCK.GetNamedCommandState( 'Unlink' ) != FCK_TRISTATE_DISABLED )
|
||||||
{
|
{
|
||||||
// Go up to the anchor to test its properties
|
// Go up to the anchor to test its properties
|
||||||
var oLink = FCKSelection.MoveToAncestorNode( 'A' ) ;
|
var oLink = FCKSelection.MoveToAncestorNode( 'A' ) ;
|
||||||
var bIsAnchor = ( oLink && oLink.name.length > 0 && oLink.href.length == 0 ) ;
|
var bIsAnchor = ( oLink && oLink.name.length > 0 && oLink.href.length == 0 ) ;
|
||||||
// If it isn't a link then don't add the Link context menu
|
// If it isn't a link then don't add the Link context menu
|
||||||
if ( bIsAnchor )
|
if ( bIsAnchor )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
menu.AddSeparator() ;
|
menu.AddSeparator() ;
|
||||||
if ( bInsideLink )
|
menu.AddItem( 'VisitLink', FCKLang.VisitLink ) ;
|
||||||
menu.AddItem( 'Link', FCKLang.EditLink , 34 ) ;
|
menu.AddSeparator() ;
|
||||||
menu.AddItem( 'Unlink' , FCKLang.RemoveLink , 35 ) ;
|
if ( bInsideLink )
|
||||||
}
|
menu.AddItem( 'Link', FCKLang.EditLink , 34 ) ;
|
||||||
}} ;
|
menu.AddItem( 'Unlink' , FCKLang.RemoveLink , 35 ) ;
|
||||||
|
}
|
||||||
case 'Image' :
|
}} ;
|
||||||
return {
|
|
||||||
AddItems : function( menu, tag, tagName )
|
case 'Image' :
|
||||||
{
|
return {
|
||||||
if ( tagName == 'IMG' && !tag.getAttribute( '_fckfakelement' ) )
|
AddItems : function( menu, tag, tagName )
|
||||||
{
|
{
|
||||||
menu.AddSeparator() ;
|
if ( tagName == 'IMG' && !tag.getAttribute( '_fckfakelement' ) )
|
||||||
menu.AddItem( 'Image', FCKLang.ImageProperties, 37 ) ;
|
{
|
||||||
}
|
menu.AddSeparator() ;
|
||||||
}} ;
|
menu.AddItem( 'Image', FCKLang.ImageProperties, 37 ) ;
|
||||||
|
}
|
||||||
case 'Anchor' :
|
}} ;
|
||||||
return {
|
|
||||||
AddItems : function( menu, tag, tagName )
|
case 'Anchor' :
|
||||||
{
|
return {
|
||||||
// Go up to the anchor to test its properties
|
AddItems : function( menu, tag, tagName )
|
||||||
var oLink = FCKSelection.MoveToAncestorNode( 'A' ) ;
|
{
|
||||||
var bIsAnchor = ( oLink && oLink.name.length > 0 ) ;
|
// Go up to the anchor to test its properties
|
||||||
|
var oLink = FCKSelection.MoveToAncestorNode( 'A' ) ;
|
||||||
if ( bIsAnchor || ( tagName == 'IMG' && tag.getAttribute( '_fckanchor' ) ) )
|
var bIsAnchor = ( oLink && oLink.name.length > 0 ) ;
|
||||||
{
|
|
||||||
menu.AddSeparator() ;
|
if ( bIsAnchor || ( tagName == 'IMG' && tag.getAttribute( '_fckanchor' ) ) )
|
||||||
menu.AddItem( 'Anchor', FCKLang.AnchorProp, 36 ) ;
|
{
|
||||||
menu.AddItem( 'AnchorDelete', FCKLang.AnchorDelete ) ;
|
menu.AddSeparator() ;
|
||||||
}
|
menu.AddItem( 'Anchor', FCKLang.AnchorProp, 36 ) ;
|
||||||
}} ;
|
menu.AddItem( 'AnchorDelete', FCKLang.AnchorDelete ) ;
|
||||||
|
}
|
||||||
case 'Flash' :
|
}} ;
|
||||||
return {
|
|
||||||
AddItems : function( menu, tag, tagName )
|
case 'Flash' :
|
||||||
{
|
return {
|
||||||
if ( tagName == 'IMG' && tag.getAttribute( '_fckflash' ) )
|
AddItems : function( menu, tag, tagName )
|
||||||
{
|
{
|
||||||
menu.AddSeparator() ;
|
if ( tagName == 'IMG' && tag.getAttribute( '_fckflash' ) )
|
||||||
menu.AddItem( 'Flash', FCKLang.FlashProperties, 38 ) ;
|
{
|
||||||
}
|
menu.AddSeparator() ;
|
||||||
}} ;
|
menu.AddItem( 'Flash', FCKLang.FlashProperties, 38 ) ;
|
||||||
|
}
|
||||||
case 'Form' :
|
}} ;
|
||||||
return {
|
|
||||||
AddItems : function( menu, tag, tagName )
|
case 'Form' :
|
||||||
{
|
return {
|
||||||
if ( FCKSelection.HasAncestorNode('FORM') )
|
AddItems : function( menu, tag, tagName )
|
||||||
{
|
{
|
||||||
menu.AddSeparator() ;
|
if ( FCKSelection.HasAncestorNode('FORM') )
|
||||||
menu.AddItem( 'Form', FCKLang.FormProp, 48 ) ;
|
{
|
||||||
}
|
menu.AddSeparator() ;
|
||||||
}} ;
|
menu.AddItem( 'Form', FCKLang.FormProp, 48 ) ;
|
||||||
|
}
|
||||||
case 'Checkbox' :
|
}} ;
|
||||||
return {
|
|
||||||
AddItems : function( menu, tag, tagName )
|
case 'Checkbox' :
|
||||||
{
|
return {
|
||||||
if ( tagName == 'INPUT' && tag.type == 'checkbox' )
|
AddItems : function( menu, tag, tagName )
|
||||||
{
|
{
|
||||||
menu.AddSeparator() ;
|
if ( tagName == 'INPUT' && tag.type == 'checkbox' )
|
||||||
menu.AddItem( 'Checkbox', FCKLang.CheckboxProp, 49 ) ;
|
{
|
||||||
}
|
menu.AddSeparator() ;
|
||||||
}} ;
|
menu.AddItem( 'Checkbox', FCKLang.CheckboxProp, 49 ) ;
|
||||||
|
}
|
||||||
case 'Radio' :
|
}} ;
|
||||||
return {
|
|
||||||
AddItems : function( menu, tag, tagName )
|
case 'Radio' :
|
||||||
{
|
return {
|
||||||
if ( tagName == 'INPUT' && tag.type == 'radio' )
|
AddItems : function( menu, tag, tagName )
|
||||||
{
|
{
|
||||||
menu.AddSeparator() ;
|
if ( tagName == 'INPUT' && tag.type == 'radio' )
|
||||||
menu.AddItem( 'Radio', FCKLang.RadioButtonProp, 50 ) ;
|
{
|
||||||
}
|
menu.AddSeparator() ;
|
||||||
}} ;
|
menu.AddItem( 'Radio', FCKLang.RadioButtonProp, 50 ) ;
|
||||||
|
}
|
||||||
case 'TextField' :
|
}} ;
|
||||||
return {
|
|
||||||
AddItems : function( menu, tag, tagName )
|
case 'TextField' :
|
||||||
{
|
return {
|
||||||
if ( tagName == 'INPUT' && ( tag.type == 'text' || tag.type == 'password' ) )
|
AddItems : function( menu, tag, tagName )
|
||||||
{
|
{
|
||||||
menu.AddSeparator() ;
|
if ( tagName == 'INPUT' && ( tag.type == 'text' || tag.type == 'password' ) )
|
||||||
menu.AddItem( 'TextField', FCKLang.TextFieldProp, 51 ) ;
|
{
|
||||||
}
|
menu.AddSeparator() ;
|
||||||
}} ;
|
menu.AddItem( 'TextField', FCKLang.TextFieldProp, 51 ) ;
|
||||||
|
}
|
||||||
case 'HiddenField' :
|
}} ;
|
||||||
return {
|
|
||||||
AddItems : function( menu, tag, tagName )
|
case 'HiddenField' :
|
||||||
{
|
return {
|
||||||
if ( tagName == 'IMG' && tag.getAttribute( '_fckinputhidden' ) )
|
AddItems : function( menu, tag, tagName )
|
||||||
{
|
{
|
||||||
menu.AddSeparator() ;
|
if ( tagName == 'IMG' && tag.getAttribute( '_fckinputhidden' ) )
|
||||||
menu.AddItem( 'HiddenField', FCKLang.HiddenFieldProp, 56 ) ;
|
{
|
||||||
}
|
menu.AddSeparator() ;
|
||||||
}} ;
|
menu.AddItem( 'HiddenField', FCKLang.HiddenFieldProp, 56 ) ;
|
||||||
|
}
|
||||||
case 'ImageButton' :
|
}} ;
|
||||||
return {
|
|
||||||
AddItems : function( menu, tag, tagName )
|
case 'ImageButton' :
|
||||||
{
|
return {
|
||||||
if ( tagName == 'INPUT' && tag.type == 'image' )
|
AddItems : function( menu, tag, tagName )
|
||||||
{
|
{
|
||||||
menu.AddSeparator() ;
|
if ( tagName == 'INPUT' && tag.type == 'image' )
|
||||||
menu.AddItem( 'ImageButton', FCKLang.ImageButtonProp, 55 ) ;
|
{
|
||||||
}
|
menu.AddSeparator() ;
|
||||||
}} ;
|
menu.AddItem( 'ImageButton', FCKLang.ImageButtonProp, 55 ) ;
|
||||||
|
}
|
||||||
case 'Button' :
|
}} ;
|
||||||
return {
|
|
||||||
AddItems : function( menu, tag, tagName )
|
case 'Button' :
|
||||||
{
|
return {
|
||||||
if ( tagName == 'INPUT' && ( tag.type == 'button' || tag.type == 'submit' || tag.type == 'reset' ) )
|
AddItems : function( menu, tag, tagName )
|
||||||
{
|
{
|
||||||
menu.AddSeparator() ;
|
if ( tagName == 'INPUT' && ( tag.type == 'button' || tag.type == 'submit' || tag.type == 'reset' ) )
|
||||||
menu.AddItem( 'Button', FCKLang.ButtonProp, 54 ) ;
|
{
|
||||||
}
|
menu.AddSeparator() ;
|
||||||
}} ;
|
menu.AddItem( 'Button', FCKLang.ButtonProp, 54 ) ;
|
||||||
|
}
|
||||||
case 'Select' :
|
}} ;
|
||||||
return {
|
|
||||||
AddItems : function( menu, tag, tagName )
|
case 'Select' :
|
||||||
{
|
return {
|
||||||
if ( tagName == 'SELECT' )
|
AddItems : function( menu, tag, tagName )
|
||||||
{
|
{
|
||||||
menu.AddSeparator() ;
|
if ( tagName == 'SELECT' )
|
||||||
menu.AddItem( 'Select', FCKLang.SelectionFieldProp, 53 ) ;
|
{
|
||||||
}
|
menu.AddSeparator() ;
|
||||||
}} ;
|
menu.AddItem( 'Select', FCKLang.SelectionFieldProp, 53 ) ;
|
||||||
|
}
|
||||||
case 'Textarea' :
|
}} ;
|
||||||
return {
|
|
||||||
AddItems : function( menu, tag, tagName )
|
case 'Textarea' :
|
||||||
{
|
return {
|
||||||
if ( tagName == 'TEXTAREA' )
|
AddItems : function( menu, tag, tagName )
|
||||||
{
|
{
|
||||||
menu.AddSeparator() ;
|
if ( tagName == 'TEXTAREA' )
|
||||||
menu.AddItem( 'Textarea', FCKLang.TextareaProp, 52 ) ;
|
{
|
||||||
}
|
menu.AddSeparator() ;
|
||||||
}} ;
|
menu.AddItem( 'Textarea', FCKLang.TextareaProp, 52 ) ;
|
||||||
|
}
|
||||||
case 'BulletedList' :
|
}} ;
|
||||||
return {
|
|
||||||
AddItems : function( menu, tag, tagName )
|
case 'BulletedList' :
|
||||||
{
|
return {
|
||||||
if ( FCKSelection.HasAncestorNode('UL') )
|
AddItems : function( menu, tag, tagName )
|
||||||
{
|
{
|
||||||
menu.AddSeparator() ;
|
if ( FCKSelection.HasAncestorNode('UL') )
|
||||||
menu.AddItem( 'BulletedList', FCKLang.BulletedListProp, 27 ) ;
|
{
|
||||||
}
|
menu.AddSeparator() ;
|
||||||
}} ;
|
menu.AddItem( 'BulletedList', FCKLang.BulletedListProp, 27 ) ;
|
||||||
|
}
|
||||||
case 'NumberedList' :
|
}} ;
|
||||||
return {
|
|
||||||
AddItems : function( menu, tag, tagName )
|
case 'NumberedList' :
|
||||||
{
|
return {
|
||||||
if ( FCKSelection.HasAncestorNode('OL') )
|
AddItems : function( menu, tag, tagName )
|
||||||
{
|
{
|
||||||
menu.AddSeparator() ;
|
if ( FCKSelection.HasAncestorNode('OL') )
|
||||||
menu.AddItem( 'NumberedList', FCKLang.NumberedListProp, 26 ) ;
|
{
|
||||||
}
|
menu.AddSeparator() ;
|
||||||
}} ;
|
menu.AddItem( 'NumberedList', FCKLang.NumberedListProp, 26 ) ;
|
||||||
}
|
}
|
||||||
return null ;
|
}} ;
|
||||||
}
|
|
||||||
|
case 'DivContainer':
|
||||||
function FCK_ContextMenu_OnBeforeOpen()
|
return {
|
||||||
{
|
AddItems : function( menu, tag, tagName )
|
||||||
// Update the UI.
|
{
|
||||||
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
var currentBlocks = FCKDomTools.GetSelectedDivContainers() ;
|
||||||
|
|
||||||
// Get the actual selected tag (if any).
|
if ( currentBlocks.length > 0 )
|
||||||
var oTag, sTagName ;
|
{
|
||||||
|
menu.AddSeparator() ;
|
||||||
// The extra () is to avoid a warning with strict error checking. This is ok.
|
menu.AddItem( 'EditDiv', FCKLang.EditDiv, 75 ) ;
|
||||||
if ( (oTag = FCKSelection.GetSelectedElement()) )
|
menu.AddItem( 'DeleteDiv', FCKLang.DeleteDiv, 76 ) ;
|
||||||
sTagName = oTag.tagName ;
|
}
|
||||||
|
}} ;
|
||||||
// Cleanup the current menu items.
|
|
||||||
var oMenu = FCK.ContextMenu._InnerContextMenu ;
|
}
|
||||||
oMenu.RemoveAllItems() ;
|
return null ;
|
||||||
|
}
|
||||||
// Loop through the listeners.
|
|
||||||
var aListeners = FCK.ContextMenu.Listeners ;
|
function FCK_ContextMenu_OnBeforeOpen()
|
||||||
for ( var i = 0 ; i < aListeners.length ; i++ )
|
{
|
||||||
aListeners[i].AddItems( oMenu, oTag, sTagName ) ;
|
// Update the UI.
|
||||||
}
|
FCK.Events.FireEvent( 'OnSelectionChange' ) ;
|
||||||
|
|
||||||
function FCK_ContextMenu_OnItemClick( item )
|
// Get the actual selected tag (if any).
|
||||||
{
|
var oTag, sTagName ;
|
||||||
FCK.Focus() ;
|
|
||||||
FCKCommands.GetCommand( item.Name ).Execute( item.CustomData ) ;
|
// The extra () is to avoid a warning with strict error checking. This is ok.
|
||||||
}
|
if ( (oTag = FCKSelection.GetSelectedElement()) )
|
||||||
|
sTagName = oTag.tagName ;
|
||||||
|
|
||||||
|
// Cleanup the current menu items.
|
||||||
|
var oMenu = FCK.ContextMenu._InnerContextMenu ;
|
||||||
|
oMenu.RemoveAllItems() ;
|
||||||
|
|
||||||
|
// Loop through the listeners.
|
||||||
|
var aListeners = FCK.ContextMenu.Listeners ;
|
||||||
|
for ( var i = 0 ; i < aListeners.length ; i++ )
|
||||||
|
aListeners[i].AddItems( oMenu, oTag, sTagName ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
function FCK_ContextMenu_OnItemClick( item )
|
||||||
|
{
|
||||||
|
FCK.Focus() ;
|
||||||
|
FCKCommands.GetCommand( item.Name ).Execute( item.CustomData ) ;
|
||||||
|
}
|
||||||
|
@ -1,456 +1,493 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Creation and initialization of the "FCK" object. This is the main
|
* Creation and initialization of the "FCK" object. This is the main
|
||||||
* object that represents an editor instance.
|
* object that represents an editor instance.
|
||||||
* (Gecko specific implementations)
|
* (Gecko specific implementations)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
FCK.Description = "FCKeditor for Gecko Browsers" ;
|
FCK.Description = "FCKeditor for Gecko Browsers" ;
|
||||||
|
|
||||||
FCK.InitializeBehaviors = function()
|
FCK.InitializeBehaviors = function()
|
||||||
{
|
{
|
||||||
// When calling "SetData", the editing area IFRAME gets a fixed height. So we must recalculate it.
|
// When calling "SetData", the editing area IFRAME gets a fixed height. So we must recalculate it.
|
||||||
if ( window.onresize ) // Not for Safari/Opera.
|
if ( window.onresize ) // Not for Safari/Opera.
|
||||||
window.onresize() ;
|
window.onresize() ;
|
||||||
|
|
||||||
FCKFocusManager.AddWindow( this.EditorWindow ) ;
|
FCKFocusManager.AddWindow( this.EditorWindow ) ;
|
||||||
|
|
||||||
this.ExecOnSelectionChange = function()
|
this.ExecOnSelectionChange = function()
|
||||||
{
|
{
|
||||||
FCK.Events.FireEvent( "OnSelectionChange" ) ;
|
FCK.Events.FireEvent( "OnSelectionChange" ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._ExecDrop = function( evt )
|
this._ExecDrop = function( evt )
|
||||||
{
|
{
|
||||||
if ( FCK.MouseDownFlag )
|
if ( FCK.MouseDownFlag )
|
||||||
{
|
{
|
||||||
FCK.MouseDownFlag = false ;
|
FCK.MouseDownFlag = false ;
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( FCKConfig.ForcePasteAsPlainText )
|
if ( FCKConfig.ForcePasteAsPlainText )
|
||||||
{
|
{
|
||||||
if ( evt.dataTransfer )
|
if ( evt.dataTransfer )
|
||||||
{
|
{
|
||||||
var text = evt.dataTransfer.getData( 'Text' ) ;
|
var text = evt.dataTransfer.getData( 'Text' ) ;
|
||||||
text = FCKTools.HTMLEncode( text ) ;
|
text = FCKTools.HTMLEncode( text ) ;
|
||||||
text = FCKTools.ProcessLineBreaks( window, FCKConfig, text ) ;
|
text = FCKTools.ProcessLineBreaks( window, FCKConfig, text ) ;
|
||||||
FCK.InsertHtml( text ) ;
|
FCK.InsertHtml( text ) ;
|
||||||
}
|
}
|
||||||
else if ( FCKConfig.ShowDropDialog )
|
else if ( FCKConfig.ShowDropDialog )
|
||||||
FCK.PasteAsPlainText() ;
|
FCK.PasteAsPlainText() ;
|
||||||
|
|
||||||
evt.preventDefault() ;
|
evt.preventDefault() ;
|
||||||
evt.stopPropagation() ;
|
evt.stopPropagation() ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this._ExecCheckCaret = function( evt )
|
this._ExecCheckCaret = function( evt )
|
||||||
{
|
{
|
||||||
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
|
if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
if ( evt.type == 'keypress' )
|
if ( evt.type == 'keypress' )
|
||||||
{
|
{
|
||||||
var keyCode = evt.keyCode ;
|
var keyCode = evt.keyCode ;
|
||||||
// ignore if positioning key is not pressed.
|
// ignore if positioning key is not pressed.
|
||||||
// left or up arrow keys need to be processed as well, since <a> links can be expanded in Gecko's editor
|
// left or up arrow keys need to be processed as well, since <a> links can be expanded in Gecko's editor
|
||||||
// when the caret moved left or up from another block element below.
|
// when the caret moved left or up from another block element below.
|
||||||
if ( keyCode < 33 || keyCode > 40 )
|
if ( keyCode < 33 || keyCode > 40 )
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
var blockEmptyStop = function( node )
|
var blockEmptyStop = function( node )
|
||||||
{
|
{
|
||||||
if ( node.nodeType != 1 )
|
if ( node.nodeType != 1 )
|
||||||
return false ;
|
return false ;
|
||||||
var tag = node.tagName.toLowerCase() ;
|
var tag = node.tagName.toLowerCase() ;
|
||||||
return ( FCKListsLib.BlockElements[tag] || FCKListsLib.EmptyElements[tag] ) ;
|
return ( FCKListsLib.BlockElements[tag] || FCKListsLib.EmptyElements[tag] ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
var moveCursor = function()
|
var moveCursor = function()
|
||||||
{
|
{
|
||||||
var selection = FCKSelection.GetSelection() ;
|
var selection = FCKSelection.GetSelection() ;
|
||||||
var range = selection.getRangeAt(0) ;
|
var range = selection.getRangeAt(0) ;
|
||||||
if ( ! range || ! range.collapsed )
|
if ( ! range || ! range.collapsed )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
var node = range.endContainer ;
|
var node = range.endContainer ;
|
||||||
|
|
||||||
// only perform the patched behavior if we're at the end of a text node.
|
// only perform the patched behavior if we're at the end of a text node.
|
||||||
if ( node.nodeType != 3 )
|
if ( node.nodeType != 3 )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
if ( node.nodeValue.length != range.endOffset )
|
if ( node.nodeValue.length != range.endOffset )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
// only perform the patched behavior if we're in an <a> tag, or the End key is pressed.
|
// only perform the patched behavior if we're in an <a> tag, or the End key is pressed.
|
||||||
var parentTag = node.parentNode.tagName.toLowerCase() ;
|
var parentTag = node.parentNode.tagName.toLowerCase() ;
|
||||||
if ( ! ( parentTag == 'a' || String(node.parentNode.contentEditable) == 'false' ||
|
if ( ! ( parentTag == 'a' || ( !FCKBrowserInfo.IsOpera && String(node.parentNode.contentEditable) == 'false' ) ||
|
||||||
( ! ( FCKListsLib.BlockElements[parentTag] || FCKListsLib.NonEmptyBlockElements[parentTag] )
|
( ! ( FCKListsLib.BlockElements[parentTag] || FCKListsLib.NonEmptyBlockElements[parentTag] )
|
||||||
&& keyCode == 35 ) ) )
|
&& keyCode == 35 ) ) )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
// our caret has moved to just after the last character of a text node under an unknown tag, how to proceed?
|
// our caret has moved to just after the last character of a text node under an unknown tag, how to proceed?
|
||||||
// first, see if there are other text nodes by DFS walking from this text node.
|
// first, see if there are other text nodes by DFS walking from this text node.
|
||||||
// - if the DFS has scanned all nodes under my parent, then go the next step.
|
// - if the DFS has scanned all nodes under my parent, then go the next step.
|
||||||
// - if there is a text node after me but still under my parent, then do nothing and return.
|
// - if there is a text node after me but still under my parent, then do nothing and return.
|
||||||
var nextTextNode = FCKTools.GetNextTextNode( node, node.parentNode, blockEmptyStop ) ;
|
var nextTextNode = FCKTools.GetNextTextNode( node, node.parentNode, blockEmptyStop ) ;
|
||||||
if ( nextTextNode )
|
if ( nextTextNode )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
// we're pretty sure we need to move the caret forcefully from here.
|
// we're pretty sure we need to move the caret forcefully from here.
|
||||||
range = FCK.EditorDocument.createRange() ;
|
range = FCK.EditorDocument.createRange() ;
|
||||||
|
|
||||||
nextTextNode = FCKTools.GetNextTextNode( node, node.parentNode.parentNode, blockEmptyStop ) ;
|
nextTextNode = FCKTools.GetNextTextNode( node, node.parentNode.parentNode, blockEmptyStop ) ;
|
||||||
if ( nextTextNode )
|
if ( nextTextNode )
|
||||||
{
|
{
|
||||||
// Opera thinks the dummy empty text node we append beyond the end of <a> nodes occupies a caret
|
// Opera thinks the dummy empty text node we append beyond the end of <a> nodes occupies a caret
|
||||||
// position. So if the user presses the left key and we reset the caret position here, the user
|
// position. So if the user presses the left key and we reset the caret position here, the user
|
||||||
// wouldn't be able to go back.
|
// wouldn't be able to go back.
|
||||||
if ( FCKBrowserInfo.IsOpera && keyCode == 37 )
|
if ( FCKBrowserInfo.IsOpera && keyCode == 37 )
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
// now we want to get out of our current parent node, adopt the next parent, and move the caret to
|
// now we want to get out of our current parent node, adopt the next parent, and move the caret to
|
||||||
// the appropriate text node under our new parent.
|
// the appropriate text node under our new parent.
|
||||||
// our new parent might be our current parent's siblings if we are lucky.
|
// our new parent might be our current parent's siblings if we are lucky.
|
||||||
range.setStart( nextTextNode, 0 ) ;
|
range.setStart( nextTextNode, 0 ) ;
|
||||||
range.setEnd( nextTextNode, 0 ) ;
|
range.setEnd( nextTextNode, 0 ) ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// no suitable next siblings under our grandparent! what to do next?
|
// no suitable next siblings under our grandparent! what to do next?
|
||||||
while ( node.parentNode
|
while ( node.parentNode
|
||||||
&& node.parentNode != FCK.EditorDocument.body
|
&& node.parentNode != FCK.EditorDocument.body
|
||||||
&& node.parentNode != FCK.EditorDocument.documentElement
|
&& node.parentNode != FCK.EditorDocument.documentElement
|
||||||
&& node == node.parentNode.lastChild
|
&& node == node.parentNode.lastChild
|
||||||
&& ( ! FCKListsLib.BlockElements[node.parentNode.tagName.toLowerCase()]
|
&& ( ! FCKListsLib.BlockElements[node.parentNode.tagName.toLowerCase()]
|
||||||
&& ! FCKListsLib.NonEmptyBlockElements[node.parentNode.tagName.toLowerCase()] ) )
|
&& ! FCKListsLib.NonEmptyBlockElements[node.parentNode.tagName.toLowerCase()] ) )
|
||||||
node = node.parentNode ;
|
node = node.parentNode ;
|
||||||
|
|
||||||
|
|
||||||
if ( FCKListsLib.BlockElements[ parentTag ]
|
if ( FCKListsLib.BlockElements[ parentTag ]
|
||||||
|| FCKListsLib.EmptyElements[ parentTag ]
|
|| FCKListsLib.EmptyElements[ parentTag ]
|
||||||
|| node == FCK.EditorDocument.body )
|
|| node == FCK.EditorDocument.body )
|
||||||
{
|
{
|
||||||
// if our parent is a block node, move to the end of our parent.
|
// if our parent is a block node, move to the end of our parent.
|
||||||
range.setStart( node, node.childNodes.length ) ;
|
range.setStart( node, node.childNodes.length ) ;
|
||||||
range.setEnd( node, node.childNodes.length ) ;
|
range.setEnd( node, node.childNodes.length ) ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// things are a little bit more interesting if our parent is not a block node
|
// things are a little bit more interesting if our parent is not a block node
|
||||||
// due to the weired ways how Gecko's caret acts...
|
// due to the weired ways how Gecko's caret acts...
|
||||||
var stopNode = node.nextSibling ;
|
var stopNode = node.nextSibling ;
|
||||||
|
|
||||||
// find out the next block/empty element at our grandparent, we'll
|
// find out the next block/empty element at our grandparent, we'll
|
||||||
// move the caret just before it.
|
// move the caret just before it.
|
||||||
while ( stopNode )
|
while ( stopNode )
|
||||||
{
|
{
|
||||||
if ( stopNode.nodeType != 1 )
|
if ( stopNode.nodeType != 1 )
|
||||||
{
|
{
|
||||||
stopNode = stopNode.nextSibling ;
|
stopNode = stopNode.nextSibling ;
|
||||||
continue ;
|
continue ;
|
||||||
}
|
}
|
||||||
|
|
||||||
var stopTag = stopNode.tagName.toLowerCase() ;
|
var stopTag = stopNode.tagName.toLowerCase() ;
|
||||||
if ( FCKListsLib.BlockElements[stopTag] || FCKListsLib.EmptyElements[stopTag]
|
if ( FCKListsLib.BlockElements[stopTag] || FCKListsLib.EmptyElements[stopTag]
|
||||||
|| FCKListsLib.NonEmptyBlockElements[stopTag] )
|
|| FCKListsLib.NonEmptyBlockElements[stopTag] )
|
||||||
break ;
|
break ;
|
||||||
stopNode = stopNode.nextSibling ;
|
stopNode = stopNode.nextSibling ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// note that the dummy marker below is NEEDED, otherwise the caret's behavior will
|
// note that the dummy marker below is NEEDED, otherwise the caret's behavior will
|
||||||
// be broken in Gecko.
|
// be broken in Gecko.
|
||||||
var marker = FCK.EditorDocument.createTextNode( '' ) ;
|
var marker = FCK.EditorDocument.createTextNode( '' ) ;
|
||||||
if ( stopNode )
|
if ( stopNode )
|
||||||
node.parentNode.insertBefore( marker, stopNode ) ;
|
node.parentNode.insertBefore( marker, stopNode ) ;
|
||||||
else
|
else
|
||||||
node.parentNode.appendChild( marker ) ;
|
node.parentNode.appendChild( marker ) ;
|
||||||
range.setStart( marker, 0 ) ;
|
range.setStart( marker, 0 ) ;
|
||||||
range.setEnd( marker, 0 ) ;
|
range.setEnd( marker, 0 ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
selection.removeAllRanges() ;
|
selection.removeAllRanges() ;
|
||||||
selection.addRange( range ) ;
|
selection.addRange( range ) ;
|
||||||
FCK.Events.FireEvent( "OnSelectionChange" ) ;
|
FCK.Events.FireEvent( "OnSelectionChange" ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimeout( moveCursor, 1 ) ;
|
setTimeout( moveCursor, 1 ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.ExecOnSelectionChangeTimer = function()
|
this.ExecOnSelectionChangeTimer = function()
|
||||||
{
|
{
|
||||||
if ( FCK.LastOnChangeTimer )
|
if ( FCK.LastOnChangeTimer )
|
||||||
window.clearTimeout( FCK.LastOnChangeTimer ) ;
|
window.clearTimeout( FCK.LastOnChangeTimer ) ;
|
||||||
|
|
||||||
FCK.LastOnChangeTimer = window.setTimeout( FCK.ExecOnSelectionChange, 100 ) ;
|
FCK.LastOnChangeTimer = window.setTimeout( FCK.ExecOnSelectionChange, 100 ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.EditorDocument.addEventListener( 'mouseup', this.ExecOnSelectionChange, false ) ;
|
this.EditorDocument.addEventListener( 'mouseup', this.ExecOnSelectionChange, false ) ;
|
||||||
|
|
||||||
// On Gecko, firing the "OnSelectionChange" event on every key press started to be too much
|
// On Gecko, firing the "OnSelectionChange" event on every key press started to be too much
|
||||||
// slow. So, a timer has been implemented to solve performance issues when typing to quickly.
|
// slow. So, a timer has been implemented to solve performance issues when typing to quickly.
|
||||||
this.EditorDocument.addEventListener( 'keyup', this.ExecOnSelectionChangeTimer, false ) ;
|
this.EditorDocument.addEventListener( 'keyup', this.ExecOnSelectionChangeTimer, false ) ;
|
||||||
|
|
||||||
this._DblClickListener = function( e )
|
this._DblClickListener = function( e )
|
||||||
{
|
{
|
||||||
FCK.OnDoubleClick( e.target ) ;
|
FCK.OnDoubleClick( e.target ) ;
|
||||||
e.stopPropagation() ;
|
e.stopPropagation() ;
|
||||||
}
|
}
|
||||||
this.EditorDocument.addEventListener( 'dblclick', this._DblClickListener, true ) ;
|
this.EditorDocument.addEventListener( 'dblclick', this._DblClickListener, true ) ;
|
||||||
|
|
||||||
// Record changes for the undo system when there are key down events.
|
// Record changes for the undo system when there are key down events.
|
||||||
this.EditorDocument.addEventListener( 'keydown', this._KeyDownListener, false ) ;
|
this.EditorDocument.addEventListener( 'keydown', this._KeyDownListener, false ) ;
|
||||||
|
|
||||||
// Hooks for data object drops
|
// Hooks for data object drops
|
||||||
if ( FCKBrowserInfo.IsGecko )
|
if ( FCKBrowserInfo.IsGecko )
|
||||||
{
|
{
|
||||||
this.EditorWindow.addEventListener( 'dragdrop', this._ExecDrop, true ) ;
|
this.EditorWindow.addEventListener( 'dragdrop', this._ExecDrop, true ) ;
|
||||||
}
|
}
|
||||||
else if ( FCKBrowserInfo.IsSafari )
|
else if ( FCKBrowserInfo.IsSafari )
|
||||||
{
|
{
|
||||||
var cancelHandler = function( evt ){ if ( ! FCK.MouseDownFlag ) evt.returnValue = false ; }
|
var cancelHandler = function( evt ){ if ( ! FCK.MouseDownFlag ) evt.returnValue = false ; }
|
||||||
this.EditorDocument.addEventListener( 'dragenter', cancelHandler, true ) ;
|
this.EditorDocument.addEventListener( 'dragenter', cancelHandler, true ) ;
|
||||||
this.EditorDocument.addEventListener( 'dragover', cancelHandler, true ) ;
|
this.EditorDocument.addEventListener( 'dragover', cancelHandler, true ) ;
|
||||||
this.EditorDocument.addEventListener( 'drop', this._ExecDrop, true ) ;
|
this.EditorDocument.addEventListener( 'drop', this._ExecDrop, true ) ;
|
||||||
this.EditorDocument.addEventListener( 'mousedown',
|
this.EditorDocument.addEventListener( 'mousedown',
|
||||||
function( ev )
|
function( ev )
|
||||||
{
|
{
|
||||||
var element = ev.srcElement ;
|
var element = ev.srcElement ;
|
||||||
|
|
||||||
if ( element.nodeName.IEquals( 'IMG', 'HR', 'INPUT', 'TEXTAREA', 'SELECT' ) )
|
if ( element.nodeName.IEquals( 'IMG', 'HR', 'INPUT', 'TEXTAREA', 'SELECT' ) )
|
||||||
{
|
{
|
||||||
FCKSelection.SelectNode( element ) ;
|
FCKSelection.SelectNode( element ) ;
|
||||||
}
|
}
|
||||||
}, true ) ;
|
}, true ) ;
|
||||||
|
|
||||||
this.EditorDocument.addEventListener( 'mouseup',
|
this.EditorDocument.addEventListener( 'mouseup',
|
||||||
function( ev )
|
function( ev )
|
||||||
{
|
{
|
||||||
if ( ev.srcElement.nodeName.IEquals( 'INPUT', 'TEXTAREA', 'SELECT' ) )
|
if ( ev.srcElement.nodeName.IEquals( 'INPUT', 'TEXTAREA', 'SELECT' ) )
|
||||||
ev.preventDefault()
|
ev.preventDefault()
|
||||||
}, true ) ;
|
}, true ) ;
|
||||||
|
|
||||||
this.EditorDocument.addEventListener( 'click',
|
this.EditorDocument.addEventListener( 'click',
|
||||||
function( ev )
|
function( ev )
|
||||||
{
|
{
|
||||||
if ( ev.srcElement.nodeName.IEquals( 'INPUT', 'TEXTAREA', 'SELECT' ) )
|
if ( ev.srcElement.nodeName.IEquals( 'INPUT', 'TEXTAREA', 'SELECT' ) )
|
||||||
ev.preventDefault()
|
ev.preventDefault()
|
||||||
}, true ) ;
|
}, true ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Kludge for buggy Gecko caret positioning logic (Bug #393 and #1056)
|
// Kludge for buggy Gecko caret positioning logic (Bug #393 and #1056)
|
||||||
if ( FCKBrowserInfo.IsGecko || FCKBrowserInfo.IsOpera )
|
if ( FCKBrowserInfo.IsGecko || FCKBrowserInfo.IsOpera )
|
||||||
{
|
{
|
||||||
this.EditorDocument.addEventListener( 'keypress', this._ExecCheckCaret, false ) ;
|
this.EditorDocument.addEventListener( 'keypress', this._ExecCheckCaret, false ) ;
|
||||||
this.EditorDocument.addEventListener( 'click', this._ExecCheckCaret, false ) ;
|
this.EditorDocument.addEventListener( 'click', this._ExecCheckCaret, false ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset the context menu.
|
// Reset the context menu.
|
||||||
FCK.ContextMenu._InnerContextMenu.SetMouseClickWindow( FCK.EditorWindow ) ;
|
FCK.ContextMenu._InnerContextMenu.SetMouseClickWindow( FCK.EditorWindow ) ;
|
||||||
FCK.ContextMenu._InnerContextMenu.AttachToElement( FCK.EditorDocument ) ;
|
FCK.ContextMenu._InnerContextMenu.AttachToElement( FCK.EditorDocument ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCK.MakeEditable = function()
|
FCK.MakeEditable = function()
|
||||||
{
|
{
|
||||||
this.EditingArea.MakeEditable() ;
|
this.EditingArea.MakeEditable() ;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disable the context menu in the editor (outside the editing area).
|
// Disable the context menu in the editor (outside the editing area).
|
||||||
function Document_OnContextMenu( e )
|
function Document_OnContextMenu( e )
|
||||||
{
|
{
|
||||||
if ( !e.target._FCKShowContextMenu )
|
if ( !e.target._FCKShowContextMenu )
|
||||||
e.preventDefault() ;
|
e.preventDefault() ;
|
||||||
}
|
}
|
||||||
document.oncontextmenu = Document_OnContextMenu ;
|
document.oncontextmenu = Document_OnContextMenu ;
|
||||||
|
|
||||||
// GetNamedCommandState overload for Gecko.
|
// GetNamedCommandState overload for Gecko.
|
||||||
FCK._BaseGetNamedCommandState = FCK.GetNamedCommandState ;
|
FCK._BaseGetNamedCommandState = FCK.GetNamedCommandState ;
|
||||||
FCK.GetNamedCommandState = function( commandName )
|
FCK.GetNamedCommandState = function( commandName )
|
||||||
{
|
{
|
||||||
switch ( commandName )
|
switch ( commandName )
|
||||||
{
|
{
|
||||||
case 'Unlink' :
|
case 'Unlink' :
|
||||||
return FCKSelection.HasAncestorNode('A') ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
|
return FCKSelection.HasAncestorNode('A') ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
|
||||||
default :
|
default :
|
||||||
return FCK._BaseGetNamedCommandState( commandName ) ;
|
return FCK._BaseGetNamedCommandState( commandName ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Named commands to be handled by this browsers specific implementation.
|
// Named commands to be handled by this browsers specific implementation.
|
||||||
FCK.RedirectNamedCommands =
|
FCK.RedirectNamedCommands =
|
||||||
{
|
{
|
||||||
Print : true,
|
Print : true,
|
||||||
Paste : true
|
Paste : true
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
// ExecuteNamedCommand overload for Gecko.
|
// ExecuteNamedCommand overload for Gecko.
|
||||||
FCK.ExecuteRedirectedNamedCommand = function( commandName, commandParameter )
|
FCK.ExecuteRedirectedNamedCommand = function( commandName, commandParameter )
|
||||||
{
|
{
|
||||||
switch ( commandName )
|
switch ( commandName )
|
||||||
{
|
{
|
||||||
case 'Print' :
|
case 'Print' :
|
||||||
FCK.EditorWindow.print() ;
|
FCK.EditorWindow.print() ;
|
||||||
break ;
|
break ;
|
||||||
case 'Paste' :
|
case 'Paste' :
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Force the paste dialog for Safari (#50).
|
// Force the paste dialog for Safari (#50).
|
||||||
if ( FCKBrowserInfo.IsSafari )
|
if ( FCKBrowserInfo.IsSafari )
|
||||||
throw '' ;
|
throw '' ;
|
||||||
|
|
||||||
if ( FCK.Paste() )
|
if ( FCK.Paste() )
|
||||||
FCK.ExecuteNamedCommand( 'Paste', null, true ) ;
|
FCK.ExecuteNamedCommand( 'Paste', null, true ) ;
|
||||||
}
|
}
|
||||||
catch (e) { FCKDialog.OpenDialog( 'FCKDialog_Paste', FCKLang.Paste, 'dialog/fck_paste.html', 400, 330, 'Security' ) ; }
|
catch (e) { FCKDialog.OpenDialog( 'FCKDialog_Paste', FCKLang.Paste, 'dialog/fck_paste.html', 400, 330, 'Security' ) ; }
|
||||||
break ;
|
break ;
|
||||||
default :
|
default :
|
||||||
FCK.ExecuteNamedCommand( commandName, commandParameter ) ;
|
FCK.ExecuteNamedCommand( commandName, commandParameter ) ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FCK._ExecPaste = function()
|
FCK._ExecPaste = function()
|
||||||
{
|
{
|
||||||
// Save a snapshot for undo before actually paste the text
|
// Save a snapshot for undo before actually paste the text
|
||||||
FCKUndo.SaveUndoStep() ;
|
FCKUndo.SaveUndoStep() ;
|
||||||
|
|
||||||
if ( FCKConfig.ForcePasteAsPlainText )
|
if ( FCKConfig.ForcePasteAsPlainText )
|
||||||
{
|
{
|
||||||
FCK.PasteAsPlainText() ;
|
FCK.PasteAsPlainText() ;
|
||||||
return false ;
|
return false ;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For now, the AutoDetectPasteFromWord feature is IE only. */
|
/* For now, the AutoDetectPasteFromWord feature is IE only. */
|
||||||
return true ;
|
return true ;
|
||||||
}
|
}
|
||||||
|
|
||||||
//**
|
//**
|
||||||
// FCK.InsertHtml: Inserts HTML at the current cursor location. Deletes the
|
// FCK.InsertHtml: Inserts HTML at the current cursor location. Deletes the
|
||||||
// selected content if any.
|
// selected content if any.
|
||||||
FCK.InsertHtml = function( html )
|
FCK.InsertHtml = function( html )
|
||||||
{
|
{
|
||||||
html = FCKConfig.ProtectedSource.Protect( html ) ;
|
var doc = FCK.EditorDocument,
|
||||||
html = FCK.ProtectEvents( html ) ;
|
range;
|
||||||
html = FCK.ProtectUrls( html ) ;
|
|
||||||
html = FCK.ProtectTags( html ) ;
|
html = FCKConfig.ProtectedSource.Protect( html ) ;
|
||||||
|
html = FCK.ProtectEvents( html ) ;
|
||||||
// Save an undo snapshot first.
|
html = FCK.ProtectUrls( html ) ;
|
||||||
FCKUndo.SaveUndoStep() ;
|
html = FCK.ProtectTags( html ) ;
|
||||||
|
|
||||||
// Insert the HTML code.
|
// Save an undo snapshot first.
|
||||||
this.EditorDocument.execCommand( 'inserthtml', false, html ) ;
|
FCKUndo.SaveUndoStep() ;
|
||||||
this.Focus() ;
|
|
||||||
|
if ( FCKBrowserInfo.IsGecko )
|
||||||
FCKDocumentProcessor.Process( FCK.EditorDocument ) ;
|
{
|
||||||
|
html = html.replace( / $/, '$&<span _fcktemp="1"/>' ) ;
|
||||||
// For some strange reason the SaveUndoStep() call doesn't activate the undo button at the first InsertHtml() call.
|
|
||||||
this.Events.FireEvent( "OnSelectionChange" ) ;
|
var docFrag = new FCKDocumentFragment( this.EditorDocument ) ;
|
||||||
}
|
docFrag.AppendHtml( html ) ;
|
||||||
|
|
||||||
FCK.PasteAsPlainText = function()
|
var lastNode = docFrag.RootNode.lastChild ;
|
||||||
{
|
|
||||||
// TODO: Implement the "Paste as Plain Text" code.
|
range = new FCKDomRange( this.EditorWindow ) ;
|
||||||
|
range.MoveToSelection() ;
|
||||||
// If the function is called immediately Firefox 2 does automatically paste the contents as soon as the new dialog is created
|
range.DeleteContents() ;
|
||||||
// so we run it in a Timeout and the paste event can be cancelled
|
range.InsertNode( docFrag.RootNode ) ;
|
||||||
FCKTools.RunFunction( FCKDialog.OpenDialog, FCKDialog, ['FCKDialog_Paste', FCKLang.PasteAsText, 'dialog/fck_paste.html', 400, 330, 'PlainText'] ) ;
|
|
||||||
|
range.MoveToPosition( lastNode, 4 ) ;
|
||||||
/*
|
}
|
||||||
var sText = FCKTools.HTMLEncode( clipboardData.getData("Text") ) ;
|
else
|
||||||
sText = sText.replace( /\n/g, '<BR>' ) ;
|
doc.execCommand( 'inserthtml', false, html ) ;
|
||||||
this.InsertHtml( sText ) ;
|
|
||||||
*/
|
this.Focus() ;
|
||||||
}
|
|
||||||
/*
|
// Save the caret position before calling document processor.
|
||||||
FCK.PasteFromWord = function()
|
if ( !range )
|
||||||
{
|
{
|
||||||
// TODO: Implement the "Paste as Plain Text" code.
|
range = new FCKDomRange( this.EditorWindow ) ;
|
||||||
|
range.MoveToSelection() ;
|
||||||
FCKDialog.OpenDialog( 'FCKDialog_Paste', FCKLang.PasteFromWord, 'dialog/fck_paste.html', 400, 330, 'Word' ) ;
|
}
|
||||||
|
var bookmark = range.CreateBookmark() ;
|
||||||
// FCK.CleanAndPaste( FCK.GetClipboardHTML() ) ;
|
|
||||||
}
|
FCKDocumentProcessor.Process( doc ) ;
|
||||||
*/
|
|
||||||
FCK.GetClipboardHTML = function()
|
// Restore caret position, ignore any errors in case the document
|
||||||
{
|
// processor removed the bookmark <span>s for some reason.
|
||||||
return '' ;
|
try
|
||||||
}
|
{
|
||||||
|
range.MoveToBookmark( bookmark ) ;
|
||||||
FCK.CreateLink = function( url, noUndo )
|
range.Select() ;
|
||||||
{
|
}
|
||||||
// Creates the array that will be returned. It contains one or more created links (see #220).
|
catch ( e ) {}
|
||||||
var aCreatedLinks = new Array() ;
|
|
||||||
|
// For some strange reason the SaveUndoStep() call doesn't activate the undo button at the first InsertHtml() call.
|
||||||
FCK.ExecuteNamedCommand( 'Unlink', null, false, !!noUndo ) ;
|
this.Events.FireEvent( "OnSelectionChange" ) ;
|
||||||
|
}
|
||||||
if ( url.length > 0 )
|
|
||||||
{
|
FCK.PasteAsPlainText = function()
|
||||||
// Generate a temporary name for the link.
|
{
|
||||||
var sTempUrl = 'javascript:void(0);/*' + ( new Date().getTime() ) + '*/' ;
|
// TODO: Implement the "Paste as Plain Text" code.
|
||||||
|
|
||||||
// Use the internal "CreateLink" command to create the link.
|
// If the function is called immediately Firefox 2 does automatically paste the contents as soon as the new dialog is created
|
||||||
FCK.ExecuteNamedCommand( 'CreateLink', sTempUrl, false, !!noUndo ) ;
|
// so we run it in a Timeout and the paste event can be cancelled
|
||||||
|
FCKTools.RunFunction( FCKDialog.OpenDialog, FCKDialog, ['FCKDialog_Paste', FCKLang.PasteAsText, 'dialog/fck_paste.html', 400, 330, 'PlainText'] ) ;
|
||||||
// Retrieve the just created links using XPath.
|
|
||||||
var oLinksInteractor = this.EditorDocument.evaluate("//a[@href='" + sTempUrl + "']", this.EditorDocument.body, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null) ;
|
/*
|
||||||
|
var sText = FCKTools.HTMLEncode( clipboardData.getData("Text") ) ;
|
||||||
// Add all links to the returning array.
|
sText = sText.replace( /\n/g, '<BR>' ) ;
|
||||||
for ( var i = 0 ; i < oLinksInteractor.snapshotLength ; i++ )
|
this.InsertHtml( sText ) ;
|
||||||
{
|
*/
|
||||||
var oLink = oLinksInteractor.snapshotItem( i ) ;
|
}
|
||||||
oLink.href = url ;
|
/*
|
||||||
|
FCK.PasteFromWord = function()
|
||||||
// It may happen that the browser (aka Safari) decides to use the
|
{
|
||||||
// URL as the link content to not leave it empty. In this case,
|
// TODO: Implement the "Paste as Plain Text" code.
|
||||||
// let's reset it.
|
|
||||||
if ( sTempUrl == oLink.innerHTML )
|
FCKDialog.OpenDialog( 'FCKDialog_Paste', FCKLang.PasteFromWord, 'dialog/fck_paste.html', 400, 330, 'Word' ) ;
|
||||||
oLink.innerHTML = '' ;
|
|
||||||
|
// FCK.CleanAndPaste( FCK.GetClipboardHTML() ) ;
|
||||||
aCreatedLinks.push( oLink ) ;
|
}
|
||||||
}
|
*/
|
||||||
}
|
FCK.GetClipboardHTML = function()
|
||||||
|
{
|
||||||
return aCreatedLinks ;
|
return '' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCK._FillEmptyBlock = function( emptyBlockNode )
|
FCK.CreateLink = function( url, noUndo )
|
||||||
{
|
{
|
||||||
if ( ! emptyBlockNode || emptyBlockNode.nodeType != 1 )
|
// Creates the array that will be returned. It contains one or more created links (see #220).
|
||||||
return ;
|
var aCreatedLinks = new Array() ;
|
||||||
var nodeTag = emptyBlockNode.tagName.toLowerCase() ;
|
|
||||||
if ( nodeTag != 'p' && nodeTag != 'div' )
|
// Only for Safari, a collapsed selection may create a link. All other
|
||||||
return ;
|
// browser will have no links created. So, we check it here and return
|
||||||
if ( emptyBlockNode.firstChild )
|
// immediatelly, having the same cross browser behavior.
|
||||||
return ;
|
if ( FCKSelection.GetSelection().isCollapsed )
|
||||||
FCKTools.AppendBogusBr( emptyBlockNode ) ;
|
return aCreatedLinks ;
|
||||||
}
|
|
||||||
|
FCK.ExecuteNamedCommand( 'Unlink', null, false, !!noUndo ) ;
|
||||||
FCK._ExecCheckEmptyBlock = function()
|
|
||||||
{
|
if ( url.length > 0 )
|
||||||
FCK._FillEmptyBlock( FCK.EditorDocument.body.firstChild ) ;
|
{
|
||||||
var sel = FCKSelection.GetSelection() ;
|
// Generate a temporary name for the link.
|
||||||
if ( !sel || sel.rangeCount < 1 )
|
var sTempUrl = 'javascript:void(0);/*' + ( new Date().getTime() ) + '*/' ;
|
||||||
return ;
|
|
||||||
var range = sel.getRangeAt( 0 );
|
// Use the internal "CreateLink" command to create the link.
|
||||||
FCK._FillEmptyBlock( range.startContainer ) ;
|
FCK.ExecuteNamedCommand( 'CreateLink', sTempUrl, false, !!noUndo ) ;
|
||||||
}
|
|
||||||
|
// Retrieve the just created links using XPath.
|
||||||
|
var oLinksInteractor = this.EditorDocument.evaluate("//a[@href='" + sTempUrl + "']", this.EditorDocument.body, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null) ;
|
||||||
|
|
||||||
|
// Add all links to the returning array.
|
||||||
|
for ( var i = 0 ; i < oLinksInteractor.snapshotLength ; i++ )
|
||||||
|
{
|
||||||
|
var oLink = oLinksInteractor.snapshotItem( i ) ;
|
||||||
|
oLink.href = url ;
|
||||||
|
|
||||||
|
aCreatedLinks.push( oLink ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return aCreatedLinks ;
|
||||||
|
}
|
||||||
|
|
||||||
|
FCK._FillEmptyBlock = function( emptyBlockNode )
|
||||||
|
{
|
||||||
|
if ( ! emptyBlockNode || emptyBlockNode.nodeType != 1 )
|
||||||
|
return ;
|
||||||
|
var nodeTag = emptyBlockNode.tagName.toLowerCase() ;
|
||||||
|
if ( nodeTag != 'p' && nodeTag != 'div' )
|
||||||
|
return ;
|
||||||
|
if ( emptyBlockNode.firstChild )
|
||||||
|
return ;
|
||||||
|
FCKTools.AppendBogusBr( emptyBlockNode ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
FCK._ExecCheckEmptyBlock = function()
|
||||||
|
{
|
||||||
|
FCK._FillEmptyBlock( FCK.EditorDocument.body.firstChild ) ;
|
||||||
|
var sel = FCKSelection.GetSelection() ;
|
||||||
|
if ( !sel || sel.rangeCount < 1 )
|
||||||
|
return ;
|
||||||
|
var range = sel.getRangeAt( 0 );
|
||||||
|
FCK._FillEmptyBlock( range.startContainer ) ;
|
||||||
|
}
|
||||||
|
@ -1,453 +1,456 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Creation and initialization of the "FCK" object. This is the main
|
* Creation and initialization of the "FCK" object. This is the main
|
||||||
* object that represents an editor instance.
|
* object that represents an editor instance.
|
||||||
* (IE specific implementations)
|
* (IE specific implementations)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
FCK.Description = "FCKeditor for Internet Explorer 5.5+" ;
|
FCK.Description = "FCKeditor for Internet Explorer 5.5+" ;
|
||||||
|
|
||||||
FCK._GetBehaviorsStyle = function()
|
FCK._GetBehaviorsStyle = function()
|
||||||
{
|
{
|
||||||
if ( !FCK._BehaviorsStyle )
|
if ( !FCK._BehaviorsStyle )
|
||||||
{
|
{
|
||||||
var sBasePath = FCKConfig.FullBasePath ;
|
var sBasePath = FCKConfig.BasePath ;
|
||||||
var sTableBehavior = '' ;
|
var sTableBehavior = '' ;
|
||||||
var sStyle ;
|
var sStyle ;
|
||||||
|
|
||||||
// The behaviors should be pointed using the FullBasePath to avoid security
|
// The behaviors should be pointed using the BasePath to avoid security
|
||||||
// errors when using a different BaseHref.
|
// errors when using a different BaseHref.
|
||||||
sStyle = '<style type="text/css" _fcktemp="true">' ;
|
sStyle = '<style type="text/css" _fcktemp="true">' ;
|
||||||
|
|
||||||
if ( FCKConfig.ShowBorders )
|
if ( FCKConfig.ShowBorders )
|
||||||
sTableBehavior = 'url(' + sBasePath + 'css/behaviors/showtableborders.htc)' ;
|
sTableBehavior = 'url(' + sBasePath + 'css/behaviors/showtableborders.htc)' ;
|
||||||
|
|
||||||
// Disable resize handlers.
|
// Disable resize handlers.
|
||||||
sStyle += 'INPUT,TEXTAREA,SELECT,.FCK__Anchor,.FCK__PageBreak,.FCK__InputHidden' ;
|
sStyle += 'INPUT,TEXTAREA,SELECT,.FCK__Anchor,.FCK__PageBreak,.FCK__InputHidden' ;
|
||||||
|
|
||||||
if ( FCKConfig.DisableObjectResizing )
|
if ( FCKConfig.DisableObjectResizing )
|
||||||
{
|
{
|
||||||
sStyle += ',IMG' ;
|
sStyle += ',IMG' ;
|
||||||
sTableBehavior += ' url(' + sBasePath + 'css/behaviors/disablehandles.htc)' ;
|
sTableBehavior += ' url(' + sBasePath + 'css/behaviors/disablehandles.htc)' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
sStyle += ' { behavior: url(' + sBasePath + 'css/behaviors/disablehandles.htc) ; }' ;
|
sStyle += ' { behavior: url(' + sBasePath + 'css/behaviors/disablehandles.htc) ; }' ;
|
||||||
|
|
||||||
if ( sTableBehavior.length > 0 )
|
if ( sTableBehavior.length > 0 )
|
||||||
sStyle += 'TABLE { behavior: ' + sTableBehavior + ' ; }' ;
|
sStyle += 'TABLE { behavior: ' + sTableBehavior + ' ; }' ;
|
||||||
|
|
||||||
sStyle += '</style>' ;
|
sStyle += '</style>' ;
|
||||||
FCK._BehaviorsStyle = sStyle ;
|
FCK._BehaviorsStyle = sStyle ;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FCK._BehaviorsStyle ;
|
return FCK._BehaviorsStyle ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function Doc_OnMouseUp()
|
function Doc_OnMouseUp()
|
||||||
{
|
{
|
||||||
if ( FCK.EditorWindow.event.srcElement.tagName == 'HTML' )
|
if ( FCK.EditorWindow.event.srcElement.tagName == 'HTML' )
|
||||||
{
|
{
|
||||||
FCK.Focus() ;
|
FCK.Focus() ;
|
||||||
FCK.EditorWindow.event.cancelBubble = true ;
|
FCK.EditorWindow.event.cancelBubble = true ;
|
||||||
FCK.EditorWindow.event.returnValue = false ;
|
FCK.EditorWindow.event.returnValue = false ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function Doc_OnPaste()
|
function Doc_OnPaste()
|
||||||
{
|
{
|
||||||
var body = FCK.EditorDocument.body ;
|
var body = FCK.EditorDocument.body ;
|
||||||
|
|
||||||
body.detachEvent( 'onpaste', Doc_OnPaste ) ;
|
body.detachEvent( 'onpaste', Doc_OnPaste ) ;
|
||||||
|
|
||||||
var ret = FCK.Paste( !FCKConfig.ForcePasteAsPlainText && !FCKConfig.AutoDetectPasteFromWord ) ;
|
var ret = FCK.Paste( !FCKConfig.ForcePasteAsPlainText && !FCKConfig.AutoDetectPasteFromWord ) ;
|
||||||
|
|
||||||
body.attachEvent( 'onpaste', Doc_OnPaste ) ;
|
body.attachEvent( 'onpaste', Doc_OnPaste ) ;
|
||||||
|
|
||||||
return ret ;
|
return ret ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function Doc_OnDblClick()
|
function Doc_OnDblClick()
|
||||||
{
|
{
|
||||||
FCK.OnDoubleClick( FCK.EditorWindow.event.srcElement ) ;
|
FCK.OnDoubleClick( FCK.EditorWindow.event.srcElement ) ;
|
||||||
FCK.EditorWindow.event.cancelBubble = true ;
|
FCK.EditorWindow.event.cancelBubble = true ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function Doc_OnSelectionChange()
|
function Doc_OnSelectionChange()
|
||||||
{
|
{
|
||||||
// Don't fire the event if no document is loaded.
|
// Don't fire the event if no document is loaded.
|
||||||
if ( !FCK.IsSelectionChangeLocked && FCK.EditorDocument )
|
if ( !FCK.IsSelectionChangeLocked && FCK.EditorDocument )
|
||||||
FCK.Events.FireEvent( "OnSelectionChange" ) ;
|
FCK.Events.FireEvent( "OnSelectionChange" ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
function Doc_OnDrop()
|
function Doc_OnDrop()
|
||||||
{
|
{
|
||||||
if ( FCK.MouseDownFlag )
|
if ( FCK.MouseDownFlag )
|
||||||
{
|
{
|
||||||
FCK.MouseDownFlag = false ;
|
FCK.MouseDownFlag = false ;
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( FCKConfig.ForcePasteAsPlainText )
|
if ( FCKConfig.ForcePasteAsPlainText )
|
||||||
{
|
{
|
||||||
var evt = FCK.EditorWindow.event ;
|
var evt = FCK.EditorWindow.event ;
|
||||||
|
|
||||||
if ( FCK._CheckIsPastingEnabled() || FCKConfig.ShowDropDialog )
|
if ( FCK._CheckIsPastingEnabled() || FCKConfig.ShowDropDialog )
|
||||||
FCK.PasteAsPlainText( evt.dataTransfer.getData( 'Text' ) ) ;
|
FCK.PasteAsPlainText( evt.dataTransfer.getData( 'Text' ) ) ;
|
||||||
|
|
||||||
evt.returnValue = false ;
|
evt.returnValue = false ;
|
||||||
evt.cancelBubble = true ;
|
evt.cancelBubble = true ;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FCK.InitializeBehaviors = function( dontReturn )
|
FCK.InitializeBehaviors = function( dontReturn )
|
||||||
{
|
{
|
||||||
// Set the focus to the editable area when clicking in the document area.
|
// Set the focus to the editable area when clicking in the document area.
|
||||||
// TODO: The cursor must be positioned at the end.
|
// TODO: The cursor must be positioned at the end.
|
||||||
this.EditorDocument.attachEvent( 'onmouseup', Doc_OnMouseUp ) ;
|
this.EditorDocument.attachEvent( 'onmouseup', Doc_OnMouseUp ) ;
|
||||||
|
|
||||||
// Intercept pasting operations
|
// Intercept pasting operations
|
||||||
this.EditorDocument.body.attachEvent( 'onpaste', Doc_OnPaste ) ;
|
this.EditorDocument.body.attachEvent( 'onpaste', Doc_OnPaste ) ;
|
||||||
|
|
||||||
// Intercept drop operations
|
// Intercept drop operations
|
||||||
this.EditorDocument.body.attachEvent( 'ondrop', Doc_OnDrop ) ;
|
this.EditorDocument.body.attachEvent( 'ondrop', Doc_OnDrop ) ;
|
||||||
|
|
||||||
// Reset the context menu.
|
// Reset the context menu.
|
||||||
FCK.ContextMenu._InnerContextMenu.AttachToElement( FCK.EditorDocument.body ) ;
|
FCK.ContextMenu._InnerContextMenu.AttachToElement( FCK.EditorDocument.body ) ;
|
||||||
|
|
||||||
this.EditorDocument.attachEvent("onkeydown", FCK._KeyDownListener ) ;
|
this.EditorDocument.attachEvent("onkeydown", FCK._KeyDownListener ) ;
|
||||||
|
|
||||||
this.EditorDocument.attachEvent("ondblclick", Doc_OnDblClick ) ;
|
this.EditorDocument.attachEvent("ondblclick", Doc_OnDblClick ) ;
|
||||||
|
|
||||||
// Catch cursor selection changes.
|
this.EditorDocument.attachEvent("onbeforedeactivate", function(){ FCKSelection.Save( true ) ; } ) ;
|
||||||
this.EditorDocument.attachEvent("onselectionchange", Doc_OnSelectionChange ) ;
|
|
||||||
|
// Catch cursor selection changes.
|
||||||
FCKTools.AddEventListener( FCK.EditorDocument, 'mousedown', Doc_OnMouseDown ) ;
|
this.EditorDocument.attachEvent("onselectionchange", Doc_OnSelectionChange ) ;
|
||||||
}
|
|
||||||
|
FCKTools.AddEventListener( FCK.EditorDocument, 'mousedown', Doc_OnMouseDown ) ;
|
||||||
FCK.InsertHtml = function( html )
|
}
|
||||||
{
|
|
||||||
html = FCKConfig.ProtectedSource.Protect( html ) ;
|
FCK.InsertHtml = function( html )
|
||||||
html = FCK.ProtectEvents( html ) ;
|
{
|
||||||
html = FCK.ProtectUrls( html ) ;
|
html = FCKConfig.ProtectedSource.Protect( html ) ;
|
||||||
html = FCK.ProtectTags( html ) ;
|
html = FCK.ProtectEvents( html ) ;
|
||||||
|
html = FCK.ProtectUrls( html ) ;
|
||||||
// FCK.Focus() ;
|
html = FCK.ProtectTags( html ) ;
|
||||||
FCK.EditorWindow.focus() ;
|
|
||||||
|
// FCK.Focus() ;
|
||||||
FCKUndo.SaveUndoStep() ;
|
FCKSelection.Restore() ;
|
||||||
|
FCK.EditorWindow.focus() ;
|
||||||
// Gets the actual selection.
|
|
||||||
var oSel = FCKSelection.GetSelection() ;
|
FCKUndo.SaveUndoStep() ;
|
||||||
|
|
||||||
// Deletes the actual selection contents.
|
// Gets the actual selection.
|
||||||
if ( oSel.type.toLowerCase() == 'control' )
|
var oSel = FCKSelection.GetSelection() ;
|
||||||
oSel.clear() ;
|
|
||||||
|
// Deletes the actual selection contents.
|
||||||
// Using the following trick, any comment in the beginning of the HTML will
|
if ( oSel.type.toLowerCase() == 'control' )
|
||||||
// be preserved.
|
oSel.clear() ;
|
||||||
html = '<span id="__fakeFCKRemove__" style="display:none;">fakeFCKRemove</span>' + html ;
|
|
||||||
|
// Using the following trick, any comment in the beginning of the HTML will
|
||||||
// Insert the HTML.
|
// be preserved.
|
||||||
oSel.createRange().pasteHTML( html ) ;
|
html = '<span id="__fakeFCKRemove__" style="display:none;">fakeFCKRemove</span>' + html ;
|
||||||
|
|
||||||
// Remove the fake node
|
// Insert the HTML.
|
||||||
FCK.EditorDocument.getElementById('__fakeFCKRemove__').removeNode( true ) ;
|
oSel.createRange().pasteHTML( html ) ;
|
||||||
|
|
||||||
FCKDocumentProcessor.Process( FCK.EditorDocument ) ;
|
// Remove the fake node
|
||||||
|
FCK.EditorDocument.getElementById('__fakeFCKRemove__').removeNode( true ) ;
|
||||||
// For some strange reason the SaveUndoStep() call doesn't activate the undo button at the first InsertHtml() call.
|
|
||||||
this.Events.FireEvent( "OnSelectionChange" ) ;
|
FCKDocumentProcessor.Process( FCK.EditorDocument ) ;
|
||||||
}
|
|
||||||
|
// For some strange reason the SaveUndoStep() call doesn't activate the undo button at the first InsertHtml() call.
|
||||||
FCK.SetInnerHtml = function( html ) // IE Only
|
this.Events.FireEvent( "OnSelectionChange" ) ;
|
||||||
{
|
}
|
||||||
var oDoc = FCK.EditorDocument ;
|
|
||||||
// Using the following trick, any comment in the beginning of the HTML will
|
FCK.SetInnerHtml = function( html ) // IE Only
|
||||||
// be preserved.
|
{
|
||||||
oDoc.body.innerHTML = '<div id="__fakeFCKRemove__"> </div>' + html ;
|
var oDoc = FCK.EditorDocument ;
|
||||||
oDoc.getElementById('__fakeFCKRemove__').removeNode( true ) ;
|
// Using the following trick, any comment in the beginning of the HTML will
|
||||||
}
|
// be preserved.
|
||||||
|
oDoc.body.innerHTML = '<div id="__fakeFCKRemove__"> </div>' + html ;
|
||||||
function FCK_PreloadImages()
|
oDoc.getElementById('__fakeFCKRemove__').removeNode( true ) ;
|
||||||
{
|
}
|
||||||
var oPreloader = new FCKImagePreloader() ;
|
|
||||||
|
function FCK_PreloadImages()
|
||||||
// Add the configured images.
|
{
|
||||||
oPreloader.AddImages( FCKConfig.PreloadImages ) ;
|
var oPreloader = new FCKImagePreloader() ;
|
||||||
|
|
||||||
// Add the skin icons strip.
|
// Add the configured images.
|
||||||
oPreloader.AddImages( FCKConfig.SkinPath + 'fck_strip.gif' ) ;
|
oPreloader.AddImages( FCKConfig.PreloadImages ) ;
|
||||||
|
|
||||||
oPreloader.OnComplete = LoadToolbarSetup ;
|
// Add the skin icons strip.
|
||||||
oPreloader.Start() ;
|
oPreloader.AddImages( FCKConfig.SkinPath + 'fck_strip.gif' ) ;
|
||||||
}
|
|
||||||
|
oPreloader.OnComplete = LoadToolbarSetup ;
|
||||||
// Disable the context menu in the editor (outside the editing area).
|
oPreloader.Start() ;
|
||||||
function Document_OnContextMenu()
|
}
|
||||||
{
|
|
||||||
return ( event.srcElement._FCKShowContextMenu == true ) ;
|
// Disable the context menu in the editor (outside the editing area).
|
||||||
}
|
function Document_OnContextMenu()
|
||||||
document.oncontextmenu = Document_OnContextMenu ;
|
{
|
||||||
|
return ( event.srcElement._FCKShowContextMenu == true ) ;
|
||||||
function FCK_Cleanup()
|
}
|
||||||
{
|
document.oncontextmenu = Document_OnContextMenu ;
|
||||||
this.LinkedField = null ;
|
|
||||||
this.EditorWindow = null ;
|
function FCK_Cleanup()
|
||||||
this.EditorDocument = null ;
|
{
|
||||||
}
|
this.LinkedField = null ;
|
||||||
|
this.EditorWindow = null ;
|
||||||
FCK._ExecPaste = function()
|
this.EditorDocument = null ;
|
||||||
{
|
}
|
||||||
// As we call ExecuteNamedCommand('Paste'), it would enter in a loop. So, let's use a semaphore.
|
|
||||||
if ( FCK._PasteIsRunning )
|
FCK._ExecPaste = function()
|
||||||
return true ;
|
{
|
||||||
|
// As we call ExecuteNamedCommand('Paste'), it would enter in a loop. So, let's use a semaphore.
|
||||||
if ( FCKConfig.ForcePasteAsPlainText )
|
if ( FCK._PasteIsRunning )
|
||||||
{
|
return true ;
|
||||||
FCK.PasteAsPlainText() ;
|
|
||||||
return false ;
|
if ( FCKConfig.ForcePasteAsPlainText )
|
||||||
}
|
{
|
||||||
|
FCK.PasteAsPlainText() ;
|
||||||
var sHTML = FCK._CheckIsPastingEnabled( true ) ;
|
return false ;
|
||||||
|
}
|
||||||
if ( sHTML === false )
|
|
||||||
FCKTools.RunFunction( FCKDialog.OpenDialog, FCKDialog, ['FCKDialog_Paste', FCKLang.Paste, 'dialog/fck_paste.html', 400, 330, 'Security'] ) ;
|
var sHTML = FCK._CheckIsPastingEnabled( true ) ;
|
||||||
else
|
|
||||||
{
|
if ( sHTML === false )
|
||||||
if ( FCKConfig.AutoDetectPasteFromWord && sHTML.length > 0 )
|
FCKTools.RunFunction( FCKDialog.OpenDialog, FCKDialog, ['FCKDialog_Paste', FCKLang.Paste, 'dialog/fck_paste.html', 400, 330, 'Security'] ) ;
|
||||||
{
|
else
|
||||||
var re = /<\w[^>]*(( class="?MsoNormal"?)|(="mso-))/gi ;
|
{
|
||||||
if ( re.test( sHTML ) )
|
if ( FCKConfig.AutoDetectPasteFromWord && sHTML.length > 0 )
|
||||||
{
|
{
|
||||||
if ( confirm( FCKLang.PasteWordConfirm ) )
|
var re = /<\w[^>]*(( class="?MsoNormal"?)|(="mso-))/gi ;
|
||||||
{
|
if ( re.test( sHTML ) )
|
||||||
FCK.PasteFromWord() ;
|
{
|
||||||
return false ;
|
if ( confirm( FCKLang.PasteWordConfirm ) )
|
||||||
}
|
{
|
||||||
}
|
FCK.PasteFromWord() ;
|
||||||
}
|
return false ;
|
||||||
|
}
|
||||||
// Instead of inserting the retrieved HTML, let's leave the OS work for us,
|
}
|
||||||
// by calling FCK.ExecuteNamedCommand( 'Paste' ). It could give better results.
|
}
|
||||||
|
|
||||||
// Enable the semaphore to avoid a loop.
|
// Instead of inserting the retrieved HTML, let's leave the OS work for us,
|
||||||
FCK._PasteIsRunning = true ;
|
// by calling FCK.ExecuteNamedCommand( 'Paste' ). It could give better results.
|
||||||
|
|
||||||
FCK.ExecuteNamedCommand( 'Paste' ) ;
|
// Enable the semaphore to avoid a loop.
|
||||||
|
FCK._PasteIsRunning = true ;
|
||||||
// Removes the semaphore.
|
|
||||||
delete FCK._PasteIsRunning ;
|
FCK.ExecuteNamedCommand( 'Paste' ) ;
|
||||||
}
|
|
||||||
|
// Removes the semaphore.
|
||||||
// Let's always make a custom implementation (return false), otherwise
|
delete FCK._PasteIsRunning ;
|
||||||
// the new Keyboard Handler may conflict with this code, and the CTRL+V code
|
}
|
||||||
// could result in a simple "V" being pasted.
|
|
||||||
return false ;
|
// Let's always make a custom implementation (return false), otherwise
|
||||||
}
|
// the new Keyboard Handler may conflict with this code, and the CTRL+V code
|
||||||
|
// could result in a simple "V" being pasted.
|
||||||
FCK.PasteAsPlainText = function( forceText )
|
return false ;
|
||||||
{
|
}
|
||||||
if ( !FCK._CheckIsPastingEnabled() )
|
|
||||||
{
|
FCK.PasteAsPlainText = function( forceText )
|
||||||
FCKDialog.OpenDialog( 'FCKDialog_Paste', FCKLang.PasteAsText, 'dialog/fck_paste.html', 400, 330, 'PlainText' ) ;
|
{
|
||||||
return ;
|
if ( !FCK._CheckIsPastingEnabled() )
|
||||||
}
|
{
|
||||||
|
FCKDialog.OpenDialog( 'FCKDialog_Paste', FCKLang.PasteAsText, 'dialog/fck_paste.html', 400, 330, 'PlainText' ) ;
|
||||||
// Get the data available in the clipboard in text format.
|
return ;
|
||||||
var sText = null ;
|
}
|
||||||
if ( ! forceText )
|
|
||||||
sText = clipboardData.getData("Text") ;
|
// Get the data available in the clipboard in text format.
|
||||||
else
|
var sText = null ;
|
||||||
sText = forceText ;
|
if ( ! forceText )
|
||||||
|
sText = clipboardData.getData("Text") ;
|
||||||
if ( sText && sText.length > 0 )
|
else
|
||||||
{
|
sText = forceText ;
|
||||||
// Replace the carriage returns with <BR>
|
|
||||||
sText = FCKTools.HTMLEncode( sText ) ;
|
if ( sText && sText.length > 0 )
|
||||||
sText = FCKTools.ProcessLineBreaks( window, FCKConfig, sText ) ;
|
{
|
||||||
|
// Replace the carriage returns with <BR>
|
||||||
var closeTagIndex = sText.search( '</p>' ) ;
|
sText = FCKTools.HTMLEncode( sText ) ;
|
||||||
var startTagIndex = sText.search( '<p>' ) ;
|
sText = FCKTools.ProcessLineBreaks( window, FCKConfig, sText ) ;
|
||||||
|
|
||||||
if ( ( closeTagIndex != -1 && startTagIndex != -1 && closeTagIndex < startTagIndex )
|
var closeTagIndex = sText.search( '</p>' ) ;
|
||||||
|| ( closeTagIndex != -1 && startTagIndex == -1 ) )
|
var startTagIndex = sText.search( '<p>' ) ;
|
||||||
{
|
|
||||||
var prefix = sText.substr( 0, closeTagIndex ) ;
|
if ( ( closeTagIndex != -1 && startTagIndex != -1 && closeTagIndex < startTagIndex )
|
||||||
sText = sText.substr( closeTagIndex + 4 ) ;
|
|| ( closeTagIndex != -1 && startTagIndex == -1 ) )
|
||||||
this.InsertHtml( prefix ) ;
|
{
|
||||||
}
|
var prefix = sText.substr( 0, closeTagIndex ) ;
|
||||||
|
sText = sText.substr( closeTagIndex + 4 ) ;
|
||||||
// Insert the resulting data in the editor.
|
this.InsertHtml( prefix ) ;
|
||||||
FCKUndo.SaveLocked = true ;
|
}
|
||||||
this.InsertHtml( sText ) ;
|
|
||||||
FCKUndo.SaveLocked = false ;
|
// Insert the resulting data in the editor.
|
||||||
}
|
FCKUndo.SaveLocked = true ;
|
||||||
}
|
this.InsertHtml( sText ) ;
|
||||||
|
FCKUndo.SaveLocked = false ;
|
||||||
FCK._CheckIsPastingEnabled = function( returnContents )
|
}
|
||||||
{
|
}
|
||||||
// The following seams to be the only reliable way to check is script
|
|
||||||
// pasting operations are enabled in the security settings of IE6 and IE7.
|
FCK._CheckIsPastingEnabled = function( returnContents )
|
||||||
// It adds a little bit of overhead to the check, but so far that's the
|
{
|
||||||
// only way, mainly because of IE7.
|
// The following seams to be the only reliable way to check is script
|
||||||
|
// pasting operations are enabled in the security settings of IE6 and IE7.
|
||||||
FCK._PasteIsEnabled = false ;
|
// It adds a little bit of overhead to the check, but so far that's the
|
||||||
|
// only way, mainly because of IE7.
|
||||||
document.body.attachEvent( 'onpaste', FCK_CheckPasting_Listener ) ;
|
|
||||||
|
FCK._PasteIsEnabled = false ;
|
||||||
// The execCommand in GetClipboardHTML will fire the "onpaste", only if the
|
|
||||||
// security settings are enabled.
|
document.body.attachEvent( 'onpaste', FCK_CheckPasting_Listener ) ;
|
||||||
var oReturn = FCK.GetClipboardHTML() ;
|
|
||||||
|
// The execCommand in GetClipboardHTML will fire the "onpaste", only if the
|
||||||
document.body.detachEvent( 'onpaste', FCK_CheckPasting_Listener ) ;
|
// security settings are enabled.
|
||||||
|
var oReturn = FCK.GetClipboardHTML() ;
|
||||||
if ( FCK._PasteIsEnabled )
|
|
||||||
{
|
document.body.detachEvent( 'onpaste', FCK_CheckPasting_Listener ) ;
|
||||||
if ( !returnContents )
|
|
||||||
oReturn = true ;
|
if ( FCK._PasteIsEnabled )
|
||||||
}
|
{
|
||||||
else
|
if ( !returnContents )
|
||||||
oReturn = false ;
|
oReturn = true ;
|
||||||
|
}
|
||||||
delete FCK._PasteIsEnabled ;
|
else
|
||||||
|
oReturn = false ;
|
||||||
return oReturn ;
|
|
||||||
}
|
delete FCK._PasteIsEnabled ;
|
||||||
|
|
||||||
function FCK_CheckPasting_Listener()
|
return oReturn ;
|
||||||
{
|
}
|
||||||
FCK._PasteIsEnabled = true ;
|
|
||||||
}
|
function FCK_CheckPasting_Listener()
|
||||||
|
{
|
||||||
FCK.GetClipboardHTML = function()
|
FCK._PasteIsEnabled = true ;
|
||||||
{
|
}
|
||||||
var oDiv = document.getElementById( '___FCKHiddenDiv' ) ;
|
|
||||||
|
FCK.GetClipboardHTML = function()
|
||||||
if ( !oDiv )
|
{
|
||||||
{
|
var oDiv = document.getElementById( '___FCKHiddenDiv' ) ;
|
||||||
oDiv = document.createElement( 'DIV' ) ;
|
|
||||||
oDiv.id = '___FCKHiddenDiv' ;
|
if ( !oDiv )
|
||||||
|
{
|
||||||
var oDivStyle = oDiv.style ;
|
oDiv = document.createElement( 'DIV' ) ;
|
||||||
oDivStyle.position = 'absolute' ;
|
oDiv.id = '___FCKHiddenDiv' ;
|
||||||
oDivStyle.visibility = oDivStyle.overflow = 'hidden' ;
|
|
||||||
oDivStyle.width = oDivStyle.height = 1 ;
|
var oDivStyle = oDiv.style ;
|
||||||
|
oDivStyle.position = 'absolute' ;
|
||||||
document.body.appendChild( oDiv ) ;
|
oDivStyle.visibility = oDivStyle.overflow = 'hidden' ;
|
||||||
}
|
oDivStyle.width = oDivStyle.height = 1 ;
|
||||||
|
|
||||||
oDiv.innerHTML = '' ;
|
document.body.appendChild( oDiv ) ;
|
||||||
|
}
|
||||||
var oTextRange = document.body.createTextRange() ;
|
|
||||||
oTextRange.moveToElementText( oDiv ) ;
|
oDiv.innerHTML = '' ;
|
||||||
oTextRange.execCommand( 'Paste' ) ;
|
|
||||||
|
var oTextRange = document.body.createTextRange() ;
|
||||||
var sData = oDiv.innerHTML ;
|
oTextRange.moveToElementText( oDiv ) ;
|
||||||
oDiv.innerHTML = '' ;
|
oTextRange.execCommand( 'Paste' ) ;
|
||||||
|
|
||||||
return sData ;
|
var sData = oDiv.innerHTML ;
|
||||||
}
|
oDiv.innerHTML = '' ;
|
||||||
|
|
||||||
FCK.CreateLink = function( url, noUndo )
|
return sData ;
|
||||||
{
|
}
|
||||||
// Creates the array that will be returned. It contains one or more created links (see #220).
|
|
||||||
var aCreatedLinks = new Array() ;
|
FCK.CreateLink = function( url, noUndo )
|
||||||
|
{
|
||||||
// Remove any existing link in the selection.
|
// Creates the array that will be returned. It contains one or more created links (see #220).
|
||||||
FCK.ExecuteNamedCommand( 'Unlink', null, false, !!noUndo ) ;
|
var aCreatedLinks = new Array() ;
|
||||||
|
|
||||||
if ( url.length > 0 )
|
// Remove any existing link in the selection.
|
||||||
{
|
FCK.ExecuteNamedCommand( 'Unlink', null, false, !!noUndo ) ;
|
||||||
// If there are several images, and you try to link each one, all the images get inside the link:
|
|
||||||
// <img><img> -> <a><img></a><img> -> <a><img><img></a> due to the call to 'CreateLink' (bug in IE)
|
if ( url.length > 0 )
|
||||||
if (FCKSelection.GetType() == 'Control')
|
{
|
||||||
{
|
// If there are several images, and you try to link each one, all the images get inside the link:
|
||||||
// Create a link
|
// <img><img> -> <a><img></a><img> -> <a><img><img></a> due to the call to 'CreateLink' (bug in IE)
|
||||||
var oLink = this.EditorDocument.createElement( 'A' ) ;
|
if (FCKSelection.GetType() == 'Control')
|
||||||
oLink.href = url ;
|
{
|
||||||
|
// Create a link
|
||||||
// Get the selected object
|
var oLink = this.EditorDocument.createElement( 'A' ) ;
|
||||||
var oControl = FCKSelection.GetSelectedElement() ;
|
oLink.href = url ;
|
||||||
// Put the link just before the object
|
|
||||||
oControl.parentNode.insertBefore(oLink, oControl) ;
|
// Get the selected object
|
||||||
// Move the object inside the link
|
var oControl = FCKSelection.GetSelectedElement() ;
|
||||||
oControl.parentNode.removeChild( oControl ) ;
|
// Put the link just before the object
|
||||||
oLink.appendChild( oControl ) ;
|
oControl.parentNode.insertBefore(oLink, oControl) ;
|
||||||
|
// Move the object inside the link
|
||||||
return [ oLink ] ;
|
oControl.parentNode.removeChild( oControl ) ;
|
||||||
}
|
oLink.appendChild( oControl ) ;
|
||||||
|
|
||||||
// Generate a temporary name for the link.
|
return [ oLink ] ;
|
||||||
var sTempUrl = 'javascript:void(0);/*' + ( new Date().getTime() ) + '*/' ;
|
}
|
||||||
|
|
||||||
// Use the internal "CreateLink" command to create the link.
|
// Generate a temporary name for the link.
|
||||||
FCK.ExecuteNamedCommand( 'CreateLink', sTempUrl, false, !!noUndo ) ;
|
var sTempUrl = 'javascript:void(0);/*' + ( new Date().getTime() ) + '*/' ;
|
||||||
|
|
||||||
// Look for the just create link.
|
// Use the internal "CreateLink" command to create the link.
|
||||||
var oLinks = this.EditorDocument.links ;
|
FCK.ExecuteNamedCommand( 'CreateLink', sTempUrl, false, !!noUndo ) ;
|
||||||
|
|
||||||
for ( i = 0 ; i < oLinks.length ; i++ )
|
// Look for the just create link.
|
||||||
{
|
var oLinks = this.EditorDocument.links ;
|
||||||
var oLink = oLinks[i] ;
|
|
||||||
|
for ( i = 0 ; i < oLinks.length ; i++ )
|
||||||
// Check it this a newly created link.
|
{
|
||||||
// getAttribute must be used. oLink.url may cause problems with IE7 (#555).
|
var oLink = oLinks[i] ;
|
||||||
if ( oLink.getAttribute( 'href', 2 ) == sTempUrl )
|
|
||||||
{
|
// Check it this a newly created link.
|
||||||
var sInnerHtml = oLink.innerHTML ; // Save the innerHTML (IE changes it if it is like an URL).
|
// getAttribute must be used. oLink.url may cause problems with IE7 (#555).
|
||||||
oLink.href = url ;
|
if ( oLink.getAttribute( 'href', 2 ) == sTempUrl )
|
||||||
oLink.innerHTML = sInnerHtml ; // Restore the innerHTML.
|
{
|
||||||
|
var sInnerHtml = oLink.innerHTML ; // Save the innerHTML (IE changes it if it is like an URL).
|
||||||
// If the last child is a <br> move it outside the link or it
|
oLink.href = url ;
|
||||||
// will be too easy to select this link again #388.
|
oLink.innerHTML = sInnerHtml ; // Restore the innerHTML.
|
||||||
var oLastChild = oLink.lastChild ;
|
|
||||||
if ( oLastChild && oLastChild.nodeName == 'BR' )
|
// If the last child is a <br> move it outside the link or it
|
||||||
{
|
// will be too easy to select this link again #388.
|
||||||
// Move the BR after the link.
|
var oLastChild = oLink.lastChild ;
|
||||||
FCKDomTools.InsertAfterNode( oLink, oLink.removeChild( oLastChild ) ) ;
|
if ( oLastChild && oLastChild.nodeName == 'BR' )
|
||||||
}
|
{
|
||||||
|
// Move the BR after the link.
|
||||||
aCreatedLinks.push( oLink ) ;
|
FCKDomTools.InsertAfterNode( oLink, oLink.removeChild( oLastChild ) ) ;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
aCreatedLinks.push( oLink ) ;
|
||||||
|
}
|
||||||
return aCreatedLinks ;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function _FCK_RemoveDisabledAtt()
|
return aCreatedLinks ;
|
||||||
{
|
}
|
||||||
this.removeAttribute( 'disabled' ) ;
|
|
||||||
}
|
function _FCK_RemoveDisabledAtt()
|
||||||
|
{
|
||||||
function Doc_OnMouseDown( evt )
|
this.removeAttribute( 'disabled' ) ;
|
||||||
{
|
}
|
||||||
var e = evt.srcElement ;
|
|
||||||
|
function Doc_OnMouseDown( evt )
|
||||||
// Radio buttons and checkboxes should not be allowed to be triggered in IE
|
{
|
||||||
// in editable mode. Otherwise the whole browser window may be locked by
|
var e = evt.srcElement ;
|
||||||
// the buttons. (#1782)
|
|
||||||
if ( e.nodeName.IEquals( 'input' ) && e.type.IEquals( ['radio', 'checkbox'] ) && !e.disabled )
|
// Radio buttons and checkboxes should not be allowed to be triggered in IE
|
||||||
{
|
// in editable mode. Otherwise the whole browser window may be locked by
|
||||||
e.disabled = true ;
|
// the buttons. (#1782)
|
||||||
FCKTools.SetTimeout( _FCK_RemoveDisabledAtt, 1, e ) ;
|
if ( e.nodeName.IEquals( 'input' ) && e.type.IEquals( ['radio', 'checkbox'] ) && !e.disabled )
|
||||||
}
|
{
|
||||||
}
|
e.disabled = true ;
|
||||||
|
FCKTools.SetTimeout( _FCK_RemoveDisabledAtt, 1, e ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,61 +1,61 @@
|
|||||||
/*
|
/*
|
||||||
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
|
||||||
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
* Copyright (C) 2003-2008 Frederico Caldeira Knabben
|
||||||
*
|
*
|
||||||
* == BEGIN LICENSE ==
|
* == BEGIN LICENSE ==
|
||||||
*
|
*
|
||||||
* Licensed under the terms of any of the following licenses at your
|
* Licensed under the terms of any of the following licenses at your
|
||||||
* choice:
|
* choice:
|
||||||
*
|
*
|
||||||
* - GNU General Public License Version 2 or later (the "GPL")
|
* - GNU General Public License Version 2 or later (the "GPL")
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
* - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
|
||||||
* http://www.gnu.org/licenses/lgpl.html
|
* http://www.gnu.org/licenses/lgpl.html
|
||||||
*
|
*
|
||||||
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
* - Mozilla Public License Version 1.1 or later (the "MPL")
|
||||||
* http://www.mozilla.org/MPL/MPL-1.1.html
|
* http://www.mozilla.org/MPL/MPL-1.1.html
|
||||||
*
|
*
|
||||||
* == END LICENSE ==
|
* == END LICENSE ==
|
||||||
*
|
*
|
||||||
* Contains browser detection information.
|
* Contains browser detection information.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var s = navigator.userAgent.toLowerCase() ;
|
var s = navigator.userAgent.toLowerCase() ;
|
||||||
|
|
||||||
var FCKBrowserInfo =
|
var FCKBrowserInfo =
|
||||||
{
|
{
|
||||||
IsIE : /*@cc_on!@*/false,
|
IsIE : /*@cc_on!@*/false,
|
||||||
IsIE7 : /*@cc_on!@*/false && ( parseInt( s.match( /msie (\d+)/ )[1], 10 ) >= 7 ),
|
IsIE7 : /*@cc_on!@*/false && ( parseInt( s.match( /msie (\d+)/ )[1], 10 ) >= 7 ),
|
||||||
IsIE6 : /*@cc_on!@*/false && ( parseInt( s.match( /msie (\d+)/ )[1], 10 ) >= 6 ),
|
IsIE6 : /*@cc_on!@*/false && ( parseInt( s.match( /msie (\d+)/ )[1], 10 ) >= 6 ),
|
||||||
IsGecko : s.Contains('gecko/'),
|
IsSafari : s.Contains(' applewebkit/'), // Read "IsWebKit"
|
||||||
IsSafari : s.Contains(' applewebkit/'), // Read "IsWebKit"
|
IsOpera : !!window.opera,
|
||||||
IsOpera : !!window.opera,
|
IsAIR : s.Contains(' adobeair/'),
|
||||||
IsAIR : s.Contains(' adobeair/'),
|
IsMac : s.Contains('macintosh')
|
||||||
IsMac : s.Contains('macintosh')
|
} ;
|
||||||
} ;
|
|
||||||
|
// Completes the browser info with further Gecko information.
|
||||||
// Completes the browser info with further Gecko information.
|
(function( browserInfo )
|
||||||
(function( browserInfo )
|
{
|
||||||
{
|
browserInfo.IsGecko = ( navigator.product == 'Gecko' ) && !browserInfo.IsSafari && !browserInfo.IsOpera ;
|
||||||
browserInfo.IsGeckoLike = ( browserInfo.IsGecko || browserInfo.IsSafari || browserInfo.IsOpera ) ;
|
browserInfo.IsGeckoLike = ( browserInfo.IsGecko || browserInfo.IsSafari || browserInfo.IsOpera ) ;
|
||||||
|
|
||||||
if ( browserInfo.IsGecko )
|
if ( browserInfo.IsGecko )
|
||||||
{
|
{
|
||||||
var geckoVersion = s.match( /gecko\/(\d+)/ )[1] ;
|
var geckoMatch = s.match( /rv:(\d+\.\d+)/ ) ;
|
||||||
|
var geckoVersion = geckoMatch && parseFloat( geckoMatch[1] ) ;
|
||||||
// Actually "10" refers to Gecko versions before Firefox 1.5, when
|
|
||||||
// Gecko 1.8 (build 20051111) has been released.
|
// Actually "10" refers to Gecko versions before Firefox 1.5, when
|
||||||
|
// Gecko 1.8 (build 20051111) has been released.
|
||||||
// Some browser (like Mozilla 1.7.13) may have a Gecko build greater
|
|
||||||
// than 20051111, so we must also check for the revision number not to
|
// Some browser (like Mozilla 1.7.13) may have a Gecko build greater
|
||||||
// be 1.7 (we are assuming that rv < 1.7 will not have build > 20051111).
|
// than 20051111, so we must also check for the revision number not to
|
||||||
|
// be 1.7 (we are assuming that rv < 1.7 will not have build > 20051111).
|
||||||
// TODO: Future versions may consider the rv number only, but it is
|
|
||||||
// still to check that all Gecko based browser present the rv number.
|
if ( geckoVersion )
|
||||||
browserInfo.IsGecko10 = ( ( geckoVersion < 20051111 ) || ( /rv:1\.7/.test(s) ) ) ;
|
{
|
||||||
browserInfo.IsGecko19 = /rv:1\.9/.test(s) ;
|
browserInfo.IsGecko10 = ( geckoVersion < 1.8 ) ;
|
||||||
}
|
browserInfo.IsGecko19 = ( geckoVersion > 1.8 ) ;
|
||||||
else
|
}
|
||||||
browserInfo.IsGecko10 = false ;
|
}
|
||||||
})(FCKBrowserInfo) ;
|
})(FCKBrowserInfo) ;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user