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:
Klaus Leithoff 2008-10-08 10:16:30 +00:00
parent bad25ee249
commit 260ce05397
261 changed files with 59273 additions and 57462 deletions

View File

@ -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.

View File

@ -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' ;

View File

@ -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' ;

View File

@ -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' ;

View File

@ -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 ) ;

View File

@ -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&nbsp;&nbsp;</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,"<","&lt;") lcWert=STRTRAN(lcWert,"<","&lt;")
lcWert=STRTRAN(lcWert,">","&gt;") && ... if wanted remove/translate HTML Chars ... lcWert=STRTRAN(lcWert,">","&gt;") && ... 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
%> %>

View File

@ -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&nbsp;&nbsp;</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>

View File

@ -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>

View File

@ -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.

View File

@ -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">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://www.fckeditor.net/"&gt;FCKeditor&lt;/a&gt;.&lt;/p&gt;</textarea> <textarea name="FCKeditor1" rows="10" cols="80" style="width: 100%; height: 200px">&lt;p&gt;This is some &lt;strong&gt;sample text&lt;/strong&gt;. You are using &lt;a href="http://www.fckeditor.net/"&gt;FCKeditor&lt;/a&gt;.&lt;/p&gt;</textarea>
</div> </div>

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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 ) ;

View File

@ -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' ;

View File

@ -37,7 +37,7 @@
to &lt;/HTML&gt;). to &lt;/HTML&gt;).
</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.

View File

@ -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.

View File

@ -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 />

View File

@ -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 />

View File

@ -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>

View File

@ -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.

View File

@ -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 />

View File

@ -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' }
} ; } ;

View File

@ -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>' ;

View File

@ -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&nbsp;&nbsp;</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>

View File

@ -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&nbsp;&nbsp;</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_
} }

View File

@ -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>

View File

@ -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:&nbsp; Select a language:&nbsp;
</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>

View File

@ -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:&nbsp; Select the toolbar to load:&nbsp;
</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>

View File

@ -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:&nbsp; Select the skin to load:&nbsp;
</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>

View File

@ -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&nbsp;&nbsp;</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>

View File

@ -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&nbsp;&nbsp;</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:

View File

@ -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;
} }

View File

@ -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">

View File

@ -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 &lt;strong&gt;
and &lt;em&gt; instead of &lt;b&gt; and &lt;i&gt;.</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 &lt;style&gt; 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 &lt;OBJECT&gt; and &lt;EMBED&gt; tags.</li>
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1831">#1831</a>] Fixed
the issue where the placeholder icon for &lt;EMBED&gt; 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 &amp;nbsp;</strong> character.
SkinEditorCSS and SkinDialogCSS to string values in the format "/absolute/path/for/urls/|&lt;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
&lt;li&gt; elements now get properly enclosed in a &lt;ul&gt; 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 &lt;button&gt; 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 &lt;br&gt; 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 &lt;div&gt; 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 &lt;o:p&gt; 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: "?&gt;", 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 &amp;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 &lt;PRE&gt; multiple contiguous paragraphs to Formatted will now be merged into a single &lt;PRE&gt;
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 &lt;p&gt; 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>

View File

@ -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 &lt;img &gt; instead of &lt;img /&gt;).</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 &lt;span class=&quot;Apple-style-span&quot;&gt; 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 &lt;head&gt; (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 "&lt;?=" to "&lt;? 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 &lt;object&gt;
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 &lt;strong&gt;
and &lt;em&gt; instead of &lt;b&gt; and &lt;i&gt;.</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 &lt;style&gt; 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 &lt;OBJECT&gt; and &lt;EMBED&gt; tags.</li>
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/1831">#1831</a>] Fixed
the issue where the placeholder icon for &lt;EMBED&gt; 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/|&lt;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
&lt;li&gt; elements now get properly enclosed in a &lt;ul&gt; on output.</li>
<li>[<a target="_blank" href="http://dev.fckeditor.net/ticket/309">#309</a>] The ENTER
key will not any more break &lt;button&gt; 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 &lt;div&gt; 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 &lt;o:p&gt; 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: "?&gt;", 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 &amp;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 &lt;PRE&gt;
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>

View File

@ -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 ) ;
}

View File

@ -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 ;
} }
} ; } ;

View File

@ -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 ) ;
}
}

View File

@ -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

View File

@ -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 ) ;
} }

View File

@ -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>&#65279;</span> before the selection. // Append a temporary <span>&#65279;</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 = '&#65279;' ; // Zero Width No-Break Space (U+FEFF). See #1359. dummySpan.innerHTML = '&#65279;' ; // 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 &#65279;. // Move the selection start to include the temporary &#65279;.
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 ) ;
} }

View File

@ -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 &nbsp; or // Ignore normal whitespaces (i.e. not including &nbsp; 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 ;
} }
} ; } ;

View File

@ -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.
'&nbsp;' + '&nbsp;' +
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 ;
}
}

View File

@ -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

View File

@ -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 ;
} }

View File

@ -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 ;
} }

View File

@ -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() ;
} }

View File

@ -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() ;
} }

View File

@ -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 ;
} }

View File

@ -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' ;
} }

View File

@ -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() ;
} }

View File

@ -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 ;
} }

View File

@ -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 ;
}

View File

@ -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' ) ;
} }

View File

@ -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 = '&nbsp;' ; this.Label = '&nbsp;' ;
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 ) ? '&nbsp;' : text ; text = ( !text || text.length == 0 ) ? '&nbsp;' : 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>&nbsp;</label></td><td class="SC_FieldButton">&nbsp;</td></tr></tbody></table>' ; oField.innerHTML = '<table width="100%" cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldLabel"><label>&nbsp;</label></td><td class="SC_FieldButton">&nbsp;</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;">&nbsp;</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;">&nbsp;</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;">&nbsp;</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;">&nbsp;</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>&nbsp;</label></td> <td class="SC_FieldLabel"><label>&nbsp;</label></td>
<td class="SC_FieldButton">&nbsp;</td> <td class="SC_FieldButton">&nbsp;</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div>
*/ */

File diff suppressed because it is too large Load Diff

View File

@ -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' ;
} }

View File

@ -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 ) ;
} }

View File

@ -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 ) ;
} }

View File

@ -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 ) ;
} }

View File

@ -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">
*/ */

View File

@ -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 ;
} }
} }
} }
} }

View File

@ -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 ;
} }
} }
} }
} }

View File

@ -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 ;

View File

@ -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 ;

View File

@ -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 ) ;
} }

View File

@ -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( '' ) ;
} }

View File

@ -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 ) ;
} }
} ; } ;

View File

@ -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 ;
} }

View File

@ -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 ;
}
} ;

View File

@ -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 ) ;
}
} ;

View File

@ -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 ;
} }
} ; } ;

View File

@ -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 ;
} }
}; };

View File

@ -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' ;
}

View File

@ -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 ) ;
} }
} ; } ;

View File

@ -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 ;
} }
} ; } ;

View File

@ -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 ) ;
} }
}; };

View File

@ -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 ) ;
} }

View File

@ -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' ) ;
} }

View File

@ -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' ) ;
} }

View File

@ -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 ;
} }
}; };

View File

@ -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() ;
}

View File

@ -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 ;
} }

View File

@ -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 ;
} }

View File

@ -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 ;
} }
}; };

View File

@ -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;
} }

View File

@ -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%' ;
} }

View File

@ -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 ;

View File

@ -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) ;

View File

@ -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 ;
} }

View File

@ -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

View File

@ -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 ) ;
}

View File

@ -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( /&nbsp;$/, '$&<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 ) ;
}

View File

@ -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__">&nbsp;</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__">&nbsp;</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 ) ;
}
}

View File

@ -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