[Rt-commit] r15609 - in rt/3.8/branches/fckeditor-upgrade: . share/html/NoAuth/RichText/FCKeditor share/html/NoAuth/RichText/FCKeditor/editor share/html/NoAuth/RichText/FCKeditor/editor/_source share/html/NoAuth/RichText/FCKeditor/editor/_source/classes share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses share/html/NoAuth/RichText/FCKeditor/editor/_source/internals share/html/NoAuth/RichText/FCKeditor/editor/css share/html/NoAuth/RichText/FCKeditor/editor/css/images share/html/NoAuth/RichText/FCKeditor/editor/dialog share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_about/sponsors share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_link share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/lasso share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py share/html/NoAuth/RichText/FCKeditor/editor/js share/html/NoAuth/RichText/FCKeditor/editor/lang share/html/NoAuth/RichText/FCKeditor/editor/plugins/placeholder/lang share/html/NoAuth/RichText/FCKeditor/editor/skins/default share/html/NoAuth/RichText/FCKeditor/editor/skins/default/images share/html/NoAuth/RichText/FCKeditor/editor/skins/office2003 share/html/NoAuth/RichText/FCKeditor/editor/skins/office2003/images share/html/NoAuth/RichText/FCKeditor/editor/skins/silver share/html/NoAuth/RichText/FCKeditor/editor/skins/silver/images
falcone at bestpractical.com
falcone at bestpractical.com
Thu Aug 28 18:48:16 EDT 2008
Author: falcone
Date: Thu Aug 28 18:47:59 2008
New Revision: 15609
Added:
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckcontextmenu.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdataprocessor.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdocumentfragment_gecko.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdocumentfragment_ie.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdomrange.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdomrange_gecko.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdomrange_ie.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdomrangeiterator.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckeditingarea.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckelementpath.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckenterkey.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckevents.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckhtmliterator.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckicon.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckiecleanup.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckimagepreloader.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckkeystrokehandler.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckmenublock.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckmenublockpanel.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckmenuitem.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckpanel.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckplugin.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckspecialcombo.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckstyle.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbar.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarbreak_gecko.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarbreak_ie.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarbutton.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarbuttonui.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarfontformatcombo.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarfontscombo.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarfontsizecombo.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarpanelbutton.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarspecialcombo.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarstylecombo.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckw3crange.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckxml.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckxml_gecko.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckxml_ie.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fck_othercommands.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckblockquotecommand.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckcorestylecommand.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckfitwindow.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckindentcommands.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckjustifycommands.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fcklistcommands.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fcknamedcommand.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckpasteplaintextcommand.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckpastewordcommand.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckremoveformatcommand.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckshowblocks.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckspellcheckcommand_gecko.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckspellcheckcommand_ie.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckstylecommand.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fcktablecommand.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fcktextcolorcommand.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/fckconstants.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/fckeditorapi.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/fckjscoreextensions.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/fckscriptloader.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fck.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fck_contextmenu.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fck_gecko.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fck_ie.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckbrowserinfo.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckcodeformatter.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckcommands.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckconfig.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckdebug.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckdebug_empty.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckdialog.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckdocumentprocessor.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckdomtools.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcklanguagemanager.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcklisthandler.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcklistslib.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckplugins.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckregexlib.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckselection.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckselection_gecko.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckselection_ie.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckstyles.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktablehandler.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktablehandler_gecko.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktablehandler_ie.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktoolbaritems.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktoolbarset.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktools.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktools_gecko.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktools_ie.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckundo.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckurlparams.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckxhtml.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckxhtml_gecko.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckxhtml_ie.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckxhtmlentities.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/css/images/fck_plugin.gif (contents, props changed)
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_about/sponsors/
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_about/sponsors/spellchecker_net.gif (contents, props changed)
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_div.html
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.cfm
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.php
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.pl
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/basexml.asp
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/class_upload.asp
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/commands.asp
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/config.asp
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/connector.asp
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/io.asp
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/upload.asp
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/util.asp
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/aspx/
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/aspx/config.ascx
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/aspx/connector.aspx
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/aspx/upload.aspx
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/ImageObject.cfc
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf5_connector.cfm
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf5_upload.cfm
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf_basexml.cfm
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf_commands.cfm
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf_connector.cfm
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf_io.cfm
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf_upload.cfm
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf_util.cfm
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/config.cfm
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/connector.cfm
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/image.cfc
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/upload.cfm
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/lasso/
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/lasso/config.lasso
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/lasso/connector.lasso
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/lasso/upload.lasso
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/basexml.pl
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/commands.pl
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/connector.cgi
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/io.pl
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/upload.cgi
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/upload_fck.pl
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/util.pl
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/basexml.php
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/commands.php
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/config.php
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/connector.php
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/io.php
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/phpcompat.php
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/upload.php
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/util.php
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/config.py
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/connector.py
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/fckcommands.py
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/fckconnector.py
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/fckoutput.py
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/fckutil.py
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/htaccess.txt
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/upload.py
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/wsgi.py
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/zope.py
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/test.html
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/uploadtest.html
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/js/fckadobeair.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/fr-ca.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/gu.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/plugins/placeholder/lang/es.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/default/fck_dialog_ie6.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/default/images/dialog.sides.gif (contents, props changed)
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/default/images/dialog.sides.png (contents, props changed)
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/default/images/dialog.sides.rtl.png (contents, props changed)
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/default/images/sprites.gif (contents, props changed)
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/default/images/sprites.png (contents, props changed)
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/office2003/fck_dialog_ie6.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/office2003/images/dialog.sides.gif (contents, props changed)
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/office2003/images/dialog.sides.png (contents, props changed)
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/office2003/images/dialog.sides.rtl.png (contents, props changed)
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/office2003/images/sprites.gif (contents, props changed)
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/office2003/images/sprites.png (contents, props changed)
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/silver/fck_dialog_ie6.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/silver/images/dialog.sides.gif (contents, props changed)
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/silver/images/dialog.sides.png (contents, props changed)
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/silver/images/dialog.sides.rtl.png (contents, props changed)
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/silver/images/sprites.gif (contents, props changed)
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/silver/images/sprites.png (contents, props changed)
Modified:
rt/3.8/branches/fckeditor-upgrade/ (props changed)
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/css/fck_editorarea.css
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_about.html
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_anchor.html
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_link/fck_link.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_paste.html
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_replace.html
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_spellerpages.html
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/fckeditor.html
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/fckeditor.original.html
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/js/fckeditorcode_gecko.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/js/fckeditorcode_ie.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/_translationstatus.txt
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/af.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ar.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/bg.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/bn.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/bs.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ca.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/cs.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/da.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/de.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/el.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/en-au.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/en-ca.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/en-uk.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/en.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/eo.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/es.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/et.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/eu.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/fa.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/fi.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/fo.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/fr.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/gl.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/he.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/hi.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/hr.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/hu.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/it.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ja.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/km.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ko.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/lt.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/lv.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/mn.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ms.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/nb.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/nl.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/no.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/pl.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/pt-br.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/pt.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ro.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ru.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/sk.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/sl.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/sr-latn.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/sr.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/sv.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/th.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/tr.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/uk.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/vi.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/zh-cn.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/zh.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/default/fck_strip.gif
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/office2003/fck_strip.gif
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/silver/fck_strip.gif
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/fckconfig.js
rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/fckeditor.js
Log:
r39150 at ketch: falcone | 2008-08-28 18:40:29 -0400
* upgrade to 2.6.3
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckcontextmenu.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckcontextmenu.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,223 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKContextMenu Class: renders an control a context menu.
+ */
+
+var FCKContextMenu = function( parentWindow, langDir )
+{
+ this.CtrlDisable = false ;
+
+ var oPanel = this._Panel = new FCKPanel( parentWindow ) ;
+ oPanel.AppendStyleSheet( FCKConfig.SkinEditorCSS ) ;
+ oPanel.IsContextMenu = true ;
+
+ // The FCKTools.DisableSelection doesn't seems to work to avoid dragging of the icons in Mozilla
+ // so we stop the start of the dragging
+ if ( FCKBrowserInfo.IsGecko )
+ oPanel.Document.addEventListener( 'draggesture', function(e) {e.preventDefault(); return false;}, true ) ;
+
+ var oMenuBlock = this._MenuBlock = new FCKMenuBlock() ;
+ oMenuBlock.Panel = oPanel ;
+ oMenuBlock.OnClick = FCKTools.CreateEventListener( FCKContextMenu_MenuBlock_OnClick, this ) ;
+
+ this._Redraw = true ;
+}
+
+
+FCKContextMenu.prototype.SetMouseClickWindow = function( mouseClickWindow )
+{
+ if ( !FCKBrowserInfo.IsIE )
+ {
+ this._Document = mouseClickWindow.document ;
+ if ( FCKBrowserInfo.IsOpera && !( 'oncontextmenu' in document.createElement('foo') ) )
+ {
+ this._Document.addEventListener( 'mousedown', FCKContextMenu_Document_OnMouseDown, false ) ;
+ this._Document.addEventListener( 'mouseup', FCKContextMenu_Document_OnMouseUp, 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,
+ 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 )
+{
+ var oItem = this._MenuBlock.AddItem( name, label, iconPathOrStripInfoArrayOrIndex, isDisabled, customData ) ;
+ this._Redraw = true ;
+ return oItem ;
+}
+
+FCKContextMenu.prototype.AddSeparator = function()
+{
+ this._MenuBlock.AddSeparator() ;
+ this._Redraw = true ;
+}
+
+FCKContextMenu.prototype.RemoveAllItems = function()
+{
+ this._MenuBlock.RemoveAllItems() ;
+ this._Redraw = true ;
+}
+
+FCKContextMenu.prototype.AttachToElement = function( element )
+{
+ if ( FCKBrowserInfo.IsIE )
+ FCKTools.AddEventListenerEx( element, 'contextmenu', FCKContextMenu_AttachedElement_OnContextMenu, this ) ;
+ else
+ element._FCKContextMenu = this ;
+}
+
+function FCKContextMenu_Document_OnContextMenu( e )
+{
+ if ( FCKConfig.BrowserContextMenu )
+ return true ;
+
+ var el = e.target ;
+
+ while ( el )
+ {
+ if ( el._FCKContextMenu )
+ {
+ if ( el._FCKContextMenu.CtrlDisable && ( e.ctrlKey || e.metaKey ) )
+ return true ;
+
+ FCKTools.CancelEvent( e ) ;
+ FCKContextMenu_AttachedElement_OnContextMenu( e, el._FCKContextMenu, el ) ;
+ return false ;
+ }
+ el = el.parentNode ;
+ }
+ return true ;
+}
+
+var FCKContextMenu_OverrideButton ;
+
+function FCKContextMenu_Document_OnMouseDown( e )
+{
+ if( !e || e.button != 2 )
+ return false ;
+
+ if ( FCKConfig.BrowserContextMenu )
+ return true ;
+
+ var el = e.target ;
+
+ while ( el )
+ {
+ if ( el._FCKContextMenu )
+ {
+ if ( el._FCKContextMenu.CtrlDisable && ( e.ctrlKey || e.metaKey ) )
+ return true ;
+
+ var overrideButton = FCKContextMenu_OverrideButton ;
+ if( !overrideButton )
+ {
+ var doc = FCKTools.GetElementDocument( e.target ) ;
+ overrideButton = FCKContextMenu_OverrideButton = doc.createElement('input') ;
+ overrideButton.type = 'button' ;
+ var buttonHolder = doc.createElement('p') ;
+ doc.body.appendChild( buttonHolder ) ;
+ buttonHolder.appendChild( overrideButton ) ;
+ }
+
+ overrideButton.style.cssText = 'position:absolute;top:' + ( e.clientY - 2 ) +
+ 'px;left:' + ( e.clientX - 2 ) +
+ 'px;width:5px;height:5px;opacity:0.01' ;
+ }
+ el = el.parentNode ;
+ }
+ return false ;
+}
+
+function FCKContextMenu_Document_OnMouseUp( e )
+{
+ if ( FCKConfig.BrowserContextMenu )
+ return true ;
+
+ var overrideButton = FCKContextMenu_OverrideButton ;
+
+ if ( overrideButton )
+ {
+ var parent = overrideButton.parentNode ;
+ parent.parentNode.removeChild( parent ) ;
+ FCKContextMenu_OverrideButton = undefined ;
+
+ if( e && e.button == 2 )
+ {
+ FCKContextMenu_Document_OnContextMenu( e ) ;
+ return false ;
+ }
+ }
+ return true ;
+}
+
+function FCKContextMenu_AttachedElement_OnContextMenu( ev, fckContextMenu, el )
+{
+ if ( ( fckContextMenu.CtrlDisable && ( ev.ctrlKey || ev.metaKey ) ) || FCKConfig.BrowserContextMenu )
+ return true ;
+
+ var eTarget = el || this ;
+
+ if ( fckContextMenu.OnBeforeOpen )
+ fckContextMenu.OnBeforeOpen.call( fckContextMenu, eTarget ) ;
+
+ if ( fckContextMenu._MenuBlock.Count() == 0 )
+ return false ;
+
+ if ( fckContextMenu._Redraw )
+ {
+ fckContextMenu._MenuBlock.Create( fckContextMenu._Panel.MainNode ) ;
+ fckContextMenu._Redraw = false ;
+ }
+
+ // 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
+ FCKTools.DisableSelection( fckContextMenu._Panel.Document.body ) ;
+
+ var x = 0 ;
+ var y = 0 ;
+ if ( FCKBrowserInfo.IsIE )
+ {
+ x = ev.screenX ;
+ y = ev.screenY ;
+ }
+ else if ( FCKBrowserInfo.IsSafari )
+ {
+ x = ev.clientX ;
+ y = ev.clientY ;
+ }
+ else
+ {
+ x = ev.pageX ;
+ y = ev.pageY ;
+ }
+ 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 ) ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdataprocessor.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdataprocessor.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,119 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * The Data Processor is responsible for transforming the input and output data
+ * in the editor. For more info:
+ * http://dev.fckeditor.net/wiki/Components/DataProcessor
+ *
+ * The default implementation offers the base XHTML compatibility features of
+ * FCKeditor. Further Data Processors may be implemented for other purposes.
+ *
+ */
+
+var FCKDataProcessor = function()
+{}
+
+FCKDataProcessor.prototype =
+{
+ /*
+ * Returns a string representing the HTML format of "data". The returned
+ * value will be loaded in the editor.
+ * The HTML must be from <html> to </html>, including <head>, <body> and
+ * eventually the DOCTYPE.
+ * Note: HTML comments may already be part of the data because of the
+ * pre-processing made with ProtectedSource.
+ * @param {String} data The data to be converted in the
+ * DataProcessor specific format.
+ */
+ ConvertToHtml : function( data )
+ {
+ // The default data processor must handle two different cases depending
+ // on the FullPage setting. Custom Data Processors will not be
+ // compatible with FullPage, much probably.
+ if ( FCKConfig.FullPage )
+ {
+ // Save the DOCTYPE.
+ FCK.DocTypeDeclaration = data.match( FCKRegexLib.DocTypeTag ) ;
+
+ // Check if the <body> tag is available.
+ if ( !FCKRegexLib.HasBodyTag.test( data ) )
+ data = '<body>' + data + '</body>' ;
+
+ // Check if the <html> tag is available.
+ if ( !FCKRegexLib.HtmlOpener.test( data ) )
+ data = '<html dir="' + FCKConfig.ContentLangDirection + '">' + data + '</html>' ;
+
+ // Check if the <head> tag is available.
+ if ( !FCKRegexLib.HeadOpener.test( data ) )
+ data = data.replace( FCKRegexLib.HtmlOpener, '$&<head><title></title></head>' ) ;
+
+ return data ;
+ }
+ else
+ {
+ var html =
+ FCKConfig.DocType +
+ '<html dir="' + FCKConfig.ContentLangDirection + '"' ;
+
+ // On IE, if you are using a DOCTYPE different of HTML 4 (like
+ // XHTML), you must force the vertical scroll to show, otherwise
+ // 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.
+ if ( FCKBrowserInfo.IsIE && FCKConfig.DocType.length > 0 && !FCKRegexLib.Html4DocType.test( FCKConfig.DocType ) )
+ html += ' style="overflow-y: scroll"' ;
+
+ html += '><head><title></title></head>' +
+ '<body' + FCKConfig.GetBodyAttributes() + '>' +
+ data +
+ '</body></html>' ;
+
+ return html ;
+ }
+ },
+
+ /*
+ * Converts a DOM (sub-)tree to a string in the data format.
+ * @param {Object} rootNode The node that contains the DOM tree to be
+ * converted to the data format.
+ * @param {Boolean} excludeRoot Indicates that the root node must not
+ * be included in the conversion, only its children.
+ * @param {Boolean} format Indicates that the data must be formatted
+ * for human reading. Not all Data Processors may provide it.
+ */
+ ConvertToDataFormat : function( rootNode, excludeRoot, ignoreIfEmptyParagraph, format )
+ {
+ var data = FCKXHtml.GetXHTML( rootNode, !excludeRoot, format ) ;
+
+ if ( ignoreIfEmptyParagraph && FCKRegexLib.EmptyOutParagraph.test( data ) )
+ return '' ;
+
+ return data ;
+ },
+
+ /*
+ * Makes any necessary changes to a piece of HTML for insertion in the
+ * editor selection position.
+ * @param {String} html The HTML to be fixed.
+ */
+ FixHtml : function( html )
+ {
+ return html ;
+ }
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdocumentfragment_gecko.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdocumentfragment_gecko.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,53 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * 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
+ * Fragment in IE (where document.createDocumentFragment() returns a normal
+ * document instead), giving a standard interface for it.
+ * (IE Implementation)
+ */
+
+var FCKDocumentFragment = function( parentDocument, baseDocFrag )
+{
+ this.RootNode = baseDocFrag || parentDocument.createDocumentFragment() ;
+}
+
+FCKDocumentFragment.prototype =
+{
+
+ // Append the contents of this Document Fragment to another element.
+ AppendTo : function( targetNode )
+ {
+ targetNode.appendChild( this.RootNode ) ;
+ },
+
+ AppendHtml : function( html )
+ {
+ var eTmpDiv = this.RootNode.ownerDocument.createElement( 'div' ) ;
+ eTmpDiv.innerHTML = html ;
+ FCKDomTools.MoveChildren( eTmpDiv, this.RootNode ) ;
+ },
+
+ InsertAfterNode : function( existingNode )
+ {
+ FCKDomTools.InsertAfterNode( existingNode, this.RootNode ) ;
+ }
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdocumentfragment_ie.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdocumentfragment_ie.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,58 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * 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
+ * Fragment in IE (where document.createDocumentFragment() returns a normal
+ * document instead), giving a standard interface for it.
+ * (IE Implementation)
+ */
+
+var FCKDocumentFragment = function( parentDocument )
+{
+ this._Document = parentDocument ;
+ this.RootNode = parentDocument.createElement( 'div' ) ;
+}
+
+// Append the contents of this Document Fragment to another node.
+FCKDocumentFragment.prototype =
+{
+
+ AppendTo : function( targetNode )
+ {
+ FCKDomTools.MoveChildren( this.RootNode, targetNode ) ;
+ },
+
+ AppendHtml : function( html )
+ {
+ var eTmpDiv = this._Document.createElement( 'div' ) ;
+ eTmpDiv.innerHTML = html ;
+ FCKDomTools.MoveChildren( eTmpDiv, this.RootNode ) ;
+ },
+
+ InsertAfterNode : function( existingNode )
+ {
+ var eRoot = this.RootNode ;
+ var eLast ;
+
+ while( ( eLast = eRoot.lastChild ) )
+ FCKDomTools.InsertAfterNode( existingNode, eRoot.removeChild( eLast ) ) ;
+ }
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdomrange.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdomrange.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,935 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * 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.
+ */
+
+var FCKDomRange = function( sourceWindow )
+{
+ this.Window = sourceWindow ;
+ this._Cache = {} ;
+}
+
+FCKDomRange.prototype =
+{
+
+ _UpdateElementInfo : function()
+ {
+ var innerRange = this._Range ;
+
+ if ( !innerRange )
+ this.Release( true ) ;
+ else
+ {
+ // For text nodes, the node itself is the StartNode.
+ var eStart = innerRange.startContainer ;
+
+ var oElementPath = new FCKElementPath( eStart ) ;
+ this.StartNode = eStart.nodeType == 3 ? eStart : eStart.childNodes[ innerRange.startOffset ] ;
+ this.StartContainer = eStart ;
+ this.StartBlock = oElementPath.Block ;
+ this.StartBlockLimit = oElementPath.BlockLimit ;
+
+ if ( innerRange.collapsed )
+ {
+ this.EndNode = this.StartNode ;
+ this.EndContainer = this.StartContainer ;
+ this.EndBlock = this.StartBlock ;
+ this.EndBlockLimit = this.StartBlockLimit ;
+ }
+ else
+ {
+ var eEnd = innerRange.endContainer ;
+
+ if ( eStart != eEnd )
+ oElementPath = new FCKElementPath( eEnd ) ;
+
+ // The innerRange.endContainer[ innerRange.endOffset ] is not
+ // usually part of the range, but the marker for the range end. So,
+ // let's get the previous available node as the real end.
+ var eEndNode = eEnd ;
+ if ( innerRange.endOffset == 0 )
+ {
+ while ( eEndNode && !eEndNode.previousSibling )
+ eEndNode = eEndNode.parentNode ;
+
+ if ( eEndNode )
+ eEndNode = eEndNode.previousSibling ;
+ }
+ else if ( eEndNode.nodeType == 1 )
+ eEndNode = eEndNode.childNodes[ innerRange.endOffset - 1 ] ;
+
+ this.EndNode = eEndNode ;
+ this.EndContainer = eEnd ;
+ this.EndBlock = oElementPath.Block ;
+ this.EndBlockLimit = oElementPath.BlockLimit ;
+ }
+ }
+
+ this._Cache = {} ;
+ },
+
+ CreateRange : function()
+ {
+ return new FCKW3CRange( this.Window.document ) ;
+ },
+
+ DeleteContents : function()
+ {
+ if ( this._Range )
+ {
+ this._Range.deleteContents() ;
+ this._UpdateElementInfo() ;
+ }
+ },
+
+ ExtractContents : function()
+ {
+ if ( this._Range )
+ {
+ var docFrag = this._Range.extractContents() ;
+ this._UpdateElementInfo() ;
+ return docFrag ;
+ }
+ return null ;
+ },
+
+ CheckIsCollapsed : function()
+ {
+ if ( this._Range )
+ return this._Range.collapsed ;
+
+ return false ;
+ },
+
+ Collapse : function( toStart )
+ {
+ if ( this._Range )
+ this._Range.collapse( toStart ) ;
+
+ this._UpdateElementInfo() ;
+ },
+
+ Clone : function()
+ {
+ var oClone = FCKTools.CloneObject( this ) ;
+
+ if ( this._Range )
+ oClone._Range = this._Range.cloneRange() ;
+
+ return oClone ;
+ },
+
+ MoveToNodeContents : function( targetNode )
+ {
+ if ( !this._Range )
+ this._Range = this.CreateRange() ;
+
+ this._Range.selectNodeContents( targetNode ) ;
+
+ this._UpdateElementInfo() ;
+ },
+
+ MoveToElementStart : function( targetElement )
+ {
+ this.SetStart(targetElement,1) ;
+ this.SetEnd(targetElement,1) ;
+ },
+
+ // Moves to the first editing point inside a element. For example, in a
+ // element tree like "<p><b><i></i></b> Text</p>", the start editing point
+ // is "<p><b><i>^</i></b> Text</p>" (inside <i>).
+ MoveToElementEditStart : function( targetElement )
+ {
+ var editableElement ;
+
+ while ( targetElement && targetElement.nodeType == 1 )
+ {
+ if ( FCKDomTools.CheckIsEditable( targetElement ) )
+ editableElement = targetElement ;
+ else if ( editableElement )
+ break ; // If we already found an editable element, stop the loop.
+
+ targetElement = targetElement.firstChild ;
+ }
+
+ if ( editableElement )
+ this.MoveToElementStart( editableElement ) ;
+ },
+
+ InsertNode : function( node )
+ {
+ if ( this._Range )
+ this._Range.insertNode( node ) ;
+ },
+
+ CheckIsEmpty : function()
+ {
+ if ( this.CheckIsCollapsed() )
+ return true ;
+
+ // Inserts the contents of the range in a div tag.
+ var eToolDiv = this.Window.document.createElement( 'div' ) ;
+ this._Range.cloneContents().AppendTo( eToolDiv ) ;
+
+ FCKDomTools.TrimNode( eToolDiv ) ;
+
+ return ( eToolDiv.innerHTML.length == 0 ) ;
+ },
+
+ /**
+ * Checks if the start boundary of the current range is "visually" (like a
+ * selection caret) at the beginning of the block. It means that some
+ * things could be brefore the range, like spaces or empty inline elements,
+ * but it would still be considered at the beginning of the block.
+ */
+ CheckStartOfBlock : function()
+ {
+ var cache = this._Cache ;
+ var bIsStartOfBlock = cache.IsStartOfBlock ;
+
+ if ( bIsStartOfBlock != undefined )
+ return bIsStartOfBlock ;
+
+ // Take the block reference.
+ var block = this.StartBlock || this.StartBlockLimit ;
+
+ var container = this._Range.startContainer ;
+ var offset = this._Range.startOffset ;
+ var currentNode ;
+
+ if ( offset > 0 )
+ {
+ // First, check the start container. If it is a text node, get the
+ // substring of the node value before the range offset.
+ if ( container.nodeType == 3 )
+ {
+ var textValue = container.nodeValue.substr( 0, offset ).Trim() ;
+
+ // If we have some text left in the container, we are not at
+ // the end for the block.
+ if ( textValue.length != 0 )
+ return cache.IsStartOfBlock = false ;
+ }
+ else
+ currentNode = container.childNodes[ offset - 1 ] ;
+ }
+
+ // We'll not have a currentNode if the container was a text node, or
+ // the offset is zero.
+ if ( !currentNode )
+ currentNode = FCKDomTools.GetPreviousSourceNode( container, true, null, block ) ;
+
+ while ( currentNode )
+ {
+ switch ( currentNode.nodeType )
+ {
+ case 1 :
+ // It's not an inline element.
+ if ( !FCKListsLib.InlineChildReqElements[ currentNode.nodeName.toLowerCase() ] )
+ return cache.IsStartOfBlock = false ;
+
+ break ;
+
+ case 3 :
+ // It's a text node with real text.
+ if ( currentNode.nodeValue.Trim().length > 0 )
+ return cache.IsStartOfBlock = false ;
+ }
+
+ currentNode = FCKDomTools.GetPreviousSourceNode( currentNode, false, null, block ) ;
+ }
+
+ return cache.IsStartOfBlock = true ;
+ },
+
+ /**
+ * Checks if the end boundary of the current range is "visually" (like a
+ * selection caret) at the end of the block. It means that some things
+ * could be after the range, like spaces, empty inline elements, or a
+ * single <br>, but it would still be considered at the end of the block.
+ */
+ CheckEndOfBlock : function( refreshSelection )
+ {
+ var isEndOfBlock = this._Cache.IsEndOfBlock ;
+
+ if ( isEndOfBlock != undefined )
+ return isEndOfBlock ;
+
+ // Take the block reference.
+ var block = this.EndBlock || this.EndBlockLimit ;
+
+ var container = this._Range.endContainer ;
+ var offset = this._Range.endOffset ;
+ var currentNode ;
+
+ // First, check the end container. If it is a text node, get the
+ // substring of the node value after the range offset.
+ if ( container.nodeType == 3 )
+ {
+ var textValue = container.nodeValue ;
+ if ( offset < textValue.length )
+ {
+ textValue = textValue.substr( offset ) ;
+
+ // If we have some text left in the container, we are not at
+ // the end for the block.
+ if ( textValue.Trim().length != 0 )
+ return this._Cache.IsEndOfBlock = false ;
+ }
+ }
+ else
+ currentNode = container.childNodes[ offset ] ;
+
+ // We'll not have a currentNode if the container was a text node, of
+ // the offset is out the container children limits (after it probably).
+ if ( !currentNode )
+ currentNode = FCKDomTools.GetNextSourceNode( container, true, null, block ) ;
+
+ var hadBr = false ;
+
+ while ( currentNode )
+ {
+ switch ( currentNode.nodeType )
+ {
+ case 1 :
+ var nodeName = currentNode.nodeName.toLowerCase() ;
+
+ // It's an inline element.
+ if ( FCKListsLib.InlineChildReqElements[ nodeName ] )
+ break ;
+
+ // It is the first <br> found.
+ if ( nodeName == 'br' && !hadBr )
+ {
+ hadBr = true ;
+ break ;
+ }
+
+ return this._Cache.IsEndOfBlock = false ;
+
+ case 3 :
+ // It's a text node with real text.
+ if ( currentNode.nodeValue.Trim().length > 0 )
+ return this._Cache.IsEndOfBlock = false ;
+ }
+
+ currentNode = FCKDomTools.GetNextSourceNode( currentNode, false, null, block ) ;
+ }
+
+ if ( refreshSelection )
+ this.Select() ;
+
+ return this._Cache.IsEndOfBlock = true ;
+ },
+
+ // This is an "intrusive" way to create a bookmark. It includes <span> tags
+ // in the range boundaries. The advantage of it is that it is possible to
+ // handle DOM mutations when moving back to the bookmark.
+ // Attention: the inclusion of nodes in the DOM is a design choice and
+ // should not be changed as there are other points in the code that may be
+ // using those nodes to perform operations. See GetBookmarkNode.
+ // For performance, includeNodes=true if intended to SelectBookmark.
+ CreateBookmark : function( includeNodes )
+ {
+ // Create the bookmark info (random IDs).
+ var oBookmark =
+ {
+ StartId : (new Date()).valueOf() + Math.floor(Math.random()*1000) + 'S',
+ EndId : (new Date()).valueOf() + Math.floor(Math.random()*1000) + 'E'
+ } ;
+
+ var oDoc = this.Window.document ;
+ var eStartSpan ;
+ var eEndSpan ;
+ var oClone ;
+
+ // For collapsed ranges, add just the start marker.
+ if ( !this.CheckIsCollapsed() )
+ {
+ eEndSpan = oDoc.createElement( 'span' ) ;
+ eEndSpan.style.display = 'none' ;
+ eEndSpan.id = oBookmark.EndId ;
+ eEndSpan.setAttribute( '_fck_bookmark', true ) ;
+
+ // For IE, it must have something inside, otherwise it may be
+ // removed during DOM operations.
+// if ( FCKBrowserInfo.IsIE )
+ eEndSpan.innerHTML = ' ' ;
+
+ oClone = this.Clone() ;
+ oClone.Collapse( false ) ;
+ oClone.InsertNode( eEndSpan ) ;
+ }
+
+ eStartSpan = oDoc.createElement( 'span' ) ;
+ eStartSpan.style.display = 'none' ;
+ eStartSpan.id = oBookmark.StartId ;
+ eStartSpan.setAttribute( '_fck_bookmark', true ) ;
+
+ // For IE, it must have something inside, otherwise it may be removed
+ // during DOM operations.
+// if ( FCKBrowserInfo.IsIE )
+ eStartSpan.innerHTML = ' ' ;
+
+ oClone = this.Clone() ;
+ oClone.Collapse( true ) ;
+ oClone.InsertNode( eStartSpan ) ;
+
+ if ( includeNodes )
+ {
+ oBookmark.StartNode = eStartSpan ;
+ oBookmark.EndNode = eEndSpan ;
+ }
+
+ // Update the range position.
+ if ( eEndSpan )
+ {
+ this.SetStart( eStartSpan, 4 ) ;
+ this.SetEnd( eEndSpan, 3 ) ;
+ }
+ else
+ this.MoveToPosition( eStartSpan, 4 ) ;
+
+ return oBookmark ;
+ },
+
+ // This one should be a part of a hypothetic "bookmark" object.
+ GetBookmarkNode : function( bookmark, start )
+ {
+ var doc = this.Window.document ;
+
+ if ( start )
+ return bookmark.StartNode || doc.getElementById( bookmark.StartId ) ;
+ else
+ return bookmark.EndNode || doc.getElementById( bookmark.EndId ) ;
+ },
+
+ MoveToBookmark : function( bookmark, preserveBookmark )
+ {
+ var eStartSpan = this.GetBookmarkNode( bookmark, true ) ;
+ var eEndSpan = this.GetBookmarkNode( bookmark, false ) ;
+
+ this.SetStart( eStartSpan, 3 ) ;
+
+ if ( !preserveBookmark )
+ FCKDomTools.RemoveNode( eStartSpan ) ;
+
+ // If collapsed, the end span will not be available.
+ if ( eEndSpan )
+ {
+ this.SetEnd( eEndSpan, 3 ) ;
+
+ if ( !preserveBookmark )
+ FCKDomTools.RemoveNode( eEndSpan ) ;
+ }
+ else
+ this.Collapse( true ) ;
+
+ this._UpdateElementInfo() ;
+ },
+
+ // Non-intrusive bookmark algorithm
+ CreateBookmark2 : function()
+ {
+ // If there is no range then get out of here.
+ // It happens on initial load in Safari #962 and if the editor it's hidden also in Firefox
+ if ( ! this._Range )
+ return { "Start" : 0, "End" : 0 } ;
+
+ // First, we record down the offset values
+ var bookmark =
+ {
+ "Start" : [ this._Range.startOffset ],
+ "End" : [ this._Range.endOffset ]
+ } ;
+ // Since we're treating the document tree as normalized, we need to backtrack the text lengths
+ // of previous text nodes into the offset value.
+ var curStart = this._Range.startContainer.previousSibling ;
+ var curEnd = this._Range.endContainer.previousSibling ;
+
+ // Also note that the node that we use for "address base" would change during backtracking.
+ var addrStart = this._Range.startContainer ;
+ var addrEnd = this._Range.endContainer ;
+ while ( curStart && addrStart.nodeType == 3 )
+ {
+ bookmark.Start[0] += curStart.length ;
+ addrStart = curStart ;
+ curStart = curStart.previousSibling ;
+ }
+ while ( curEnd && addrEnd.nodeType == 3 )
+ {
+ bookmark.End[0] += curEnd.length ;
+ addrEnd = curEnd ;
+ curEnd = curEnd.previousSibling ;
+ }
+
+ // If the object pointed to by the startOffset and endOffset are text nodes, we need
+ // to backtrack and add in the text offset to the bookmark addresses.
+ if ( addrStart.nodeType == 1 && addrStart.childNodes[bookmark.Start[0]] && addrStart.childNodes[bookmark.Start[0]].nodeType == 3 )
+ {
+ var curNode = addrStart.childNodes[bookmark.Start[0]] ;
+ var offset = 0 ;
+ while ( curNode.previousSibling && curNode.previousSibling.nodeType == 3 )
+ {
+ curNode = curNode.previousSibling ;
+ offset += curNode.length ;
+ }
+ addrStart = curNode ;
+ bookmark.Start[0] = offset ;
+ }
+ if ( addrEnd.nodeType == 1 && addrEnd.childNodes[bookmark.End[0]] && addrEnd.childNodes[bookmark.End[0]].nodeType == 3 )
+ {
+ var curNode = addrEnd.childNodes[bookmark.End[0]] ;
+ var offset = 0 ;
+ while ( curNode.previousSibling && curNode.previousSibling.nodeType == 3 )
+ {
+ curNode = curNode.previousSibling ;
+ offset += curNode.length ;
+ }
+ addrEnd = curNode ;
+ bookmark.End[0] = offset ;
+ }
+
+ // Then, we record down the precise position of the container nodes
+ // by walking up the DOM tree and counting their childNode index
+ bookmark.Start = FCKDomTools.GetNodeAddress( addrStart, true ).concat( bookmark.Start ) ;
+ bookmark.End = FCKDomTools.GetNodeAddress( addrEnd, true ).concat( bookmark.End ) ;
+ return bookmark;
+ },
+
+ MoveToBookmark2 : function( bookmark )
+ {
+ // Reverse the childNode counting algorithm in CreateBookmark2()
+ var curStart = FCKDomTools.GetNodeFromAddress( this.Window.document, bookmark.Start.slice( 0, -1 ), true ) ;
+ var curEnd = FCKDomTools.GetNodeFromAddress( this.Window.document, bookmark.End.slice( 0, -1 ), true ) ;
+
+ // Generate the W3C Range object and update relevant data
+ this.Release( true ) ;
+ this._Range = new FCKW3CRange( this.Window.document ) ;
+ var startOffset = bookmark.Start[ bookmark.Start.length - 1 ] ;
+ var endOffset = bookmark.End[ bookmark.End.length - 1 ] ;
+ while ( curStart.nodeType == 3 && startOffset > curStart.length )
+ {
+ if ( ! curStart.nextSibling || curStart.nextSibling.nodeType != 3 )
+ break ;
+ startOffset -= curStart.length ;
+ curStart = curStart.nextSibling ;
+ }
+ while ( curEnd.nodeType == 3 && endOffset > curEnd.length )
+ {
+ if ( ! curEnd.nextSibling || curEnd.nextSibling.nodeType != 3 )
+ break ;
+ endOffset -= curEnd.length ;
+ curEnd = curEnd.nextSibling ;
+ }
+ this._Range.setStart( curStart, startOffset ) ;
+ this._Range.setEnd( curEnd, endOffset ) ;
+ this._UpdateElementInfo() ;
+ },
+
+ MoveToPosition : function( targetElement, position )
+ {
+ this.SetStart( targetElement, position ) ;
+ this.Collapse( true ) ;
+ },
+
+ /*
+ * Moves the position of the start boundary of the range to a specific position
+ * relatively to a element.
+ * @position:
+ * 1 = After Start <target>^contents</target>
+ * 2 = Before End <target>contents^</target>
+ * 3 = Before Start ^<target>contents</target>
+ * 4 = After End <target>contents</target>^
+ */
+ SetStart : function( targetElement, position, noInfoUpdate )
+ {
+ var oRange = this._Range ;
+ if ( !oRange )
+ oRange = this._Range = this.CreateRange() ;
+
+ switch( position )
+ {
+ case 1 : // After Start <target>^contents</target>
+ oRange.setStart( targetElement, 0 ) ;
+ break ;
+
+ case 2 : // Before End <target>contents^</target>
+ oRange.setStart( targetElement, targetElement.childNodes.length ) ;
+ break ;
+
+ case 3 : // Before Start ^<target>contents</target>
+ oRange.setStartBefore( targetElement ) ;
+ break ;
+
+ case 4 : // After End <target>contents</target>^
+ oRange.setStartAfter( targetElement ) ;
+ }
+
+ if ( !noInfoUpdate )
+ this._UpdateElementInfo() ;
+ },
+
+ /*
+ * Moves the position of the start boundary of the range to a specific position
+ * relatively to a element.
+ * @position:
+ * 1 = After Start <target>^contents</target>
+ * 2 = Before End <target>contents^</target>
+ * 3 = Before Start ^<target>contents</target>
+ * 4 = After End <target>contents</target>^
+ */
+ SetEnd : function( targetElement, position, noInfoUpdate )
+ {
+ var oRange = this._Range ;
+ if ( !oRange )
+ oRange = this._Range = this.CreateRange() ;
+
+ switch( position )
+ {
+ case 1 : // After Start <target>^contents</target>
+ oRange.setEnd( targetElement, 0 ) ;
+ break ;
+
+ case 2 : // Before End <target>contents^</target>
+ oRange.setEnd( targetElement, targetElement.childNodes.length ) ;
+ break ;
+
+ case 3 : // Before Start ^<target>contents</target>
+ oRange.setEndBefore( targetElement ) ;
+ break ;
+
+ case 4 : // After End <target>contents</target>^
+ oRange.setEndAfter( targetElement ) ;
+ }
+
+ if ( !noInfoUpdate )
+ this._UpdateElementInfo() ;
+ },
+
+ Expand : function( unit )
+ {
+ var oNode, oSibling ;
+
+ switch ( unit )
+ {
+ // Expand the range to include all inline parent elements if we are
+ // are in their boundary limits.
+ // For example (where [ ] are the range limits):
+ // Before => Some <b>[<i>Some sample text]</i></b>.
+ // After => Some [<b><i>Some sample text</i></b>].
+ case 'inline_elements' :
+ // Expand the start boundary.
+ if ( this._Range.startOffset == 0 )
+ {
+ oNode = this._Range.startContainer ;
+
+ if ( oNode.nodeType != 1 )
+ oNode = oNode.previousSibling ? null : oNode.parentNode ;
+
+ if ( oNode )
+ {
+ while ( FCKListsLib.InlineNonEmptyElements[ oNode.nodeName.toLowerCase() ] )
+ {
+ this._Range.setStartBefore( oNode ) ;
+
+ if ( oNode != oNode.parentNode.firstChild )
+ break ;
+
+ oNode = oNode.parentNode ;
+ }
+ }
+ }
+
+ // Expand the end boundary.
+ oNode = this._Range.endContainer ;
+ var offset = this._Range.endOffset ;
+
+ if ( ( oNode.nodeType == 3 && offset >= oNode.nodeValue.length ) || ( oNode.nodeType == 1 && offset >= oNode.childNodes.length ) || ( oNode.nodeType != 1 && oNode.nodeType != 3 ) )
+ {
+ if ( oNode.nodeType != 1 )
+ oNode = oNode.nextSibling ? null : oNode.parentNode ;
+
+ if ( oNode )
+ {
+ while ( FCKListsLib.InlineNonEmptyElements[ oNode.nodeName.toLowerCase() ] )
+ {
+ this._Range.setEndAfter( oNode ) ;
+
+ if ( oNode != oNode.parentNode.lastChild )
+ break ;
+
+ oNode = oNode.parentNode ;
+ }
+ }
+ }
+
+ break ;
+
+ case 'block_contents' :
+ case 'list_contents' :
+ var boundarySet = FCKListsLib.BlockBoundaries ;
+ if ( unit == 'list_contents' || FCKConfig.EnterMode == 'br' )
+ boundarySet = FCKListsLib.ListBoundaries ;
+
+ if ( this.StartBlock && FCKConfig.EnterMode != 'br' && unit == 'block_contents' )
+ this.SetStart( this.StartBlock, 1 ) ;
+ else
+ {
+ // Get the start node for the current range.
+ oNode = this._Range.startContainer ;
+
+ // If it is an element, get the node right before of it (in source order).
+ if ( oNode.nodeType == 1 )
+ {
+ var lastNode = oNode.childNodes[ this._Range.startOffset ] ;
+ if ( lastNode )
+ oNode = FCKDomTools.GetPreviousSourceNode( lastNode, true ) ;
+ else
+ oNode = oNode.lastChild || oNode ;
+ }
+
+ // We must look for the left boundary, relative to the range
+ // start, which is limited by a block element.
+ while ( oNode
+ && ( oNode.nodeType != 1
+ || ( oNode != this.StartBlockLimit
+ && !boundarySet[ oNode.nodeName.toLowerCase() ] ) ) )
+ {
+ this._Range.setStartBefore( oNode ) ;
+ oNode = oNode.previousSibling || oNode.parentNode ;
+ }
+ }
+
+ if ( this.EndBlock && FCKConfig.EnterMode != 'br' && unit == 'block_contents' && this.EndBlock.nodeName.toLowerCase() != 'li' )
+ this.SetEnd( this.EndBlock, 2 ) ;
+ else
+ {
+ oNode = this._Range.endContainer ;
+ if ( oNode.nodeType == 1 )
+ oNode = oNode.childNodes[ this._Range.endOffset ] || oNode.lastChild ;
+
+ // We must look for the right boundary, relative to the range
+ // end, which is limited by a block element.
+ while ( oNode
+ && ( oNode.nodeType != 1
+ || ( oNode != this.StartBlockLimit
+ && !boundarySet[ oNode.nodeName.toLowerCase() ] ) ) )
+ {
+ this._Range.setEndAfter( oNode ) ;
+ oNode = oNode.nextSibling || oNode.parentNode ;
+ }
+
+ // In EnterMode='br', the end <br> boundary element must
+ // be included in the expanded range.
+ if ( oNode && oNode.nodeName.toLowerCase() == 'br' )
+ this._Range.setEndAfter( oNode ) ;
+ }
+
+ this._UpdateElementInfo() ;
+ }
+ },
+
+ /**
+ * Split the block element for the current range. It deletes the contents
+ * of the range and splits the block in the collapsed position, resulting
+ * in two sucessive blocks. The range is then positioned in the middle of
+ * them.
+ *
+ * It returns and object with the following properties:
+ * - PreviousBlock : a reference to the block element that preceeds
+ * the range after the split.
+ * - NextBlock : a reference to the block element that follows the
+ * range after the split.
+ * - WasStartOfBlock : a boolean indicating that the range was
+ * originaly at the start of the block.
+ * - WasEndOfBlock : a boolean indicating that the range was originaly
+ * at the end of the block.
+ *
+ * If the range was originaly at the start of the block, no split will happen
+ * and the PreviousBlock value will be null. The same is valid for the
+ * NextBlock value if the range was at the end of the block.
+ */
+ SplitBlock : function( forceBlockTag )
+ {
+ var blockTag = forceBlockTag || FCKConfig.EnterMode ;
+
+ if ( !this._Range )
+ this.MoveToSelection() ;
+
+ // The range boundaries must be in the same "block limit" element.
+ if ( this.StartBlockLimit == this.EndBlockLimit )
+ {
+ // Get the current blocks.
+ var eStartBlock = this.StartBlock ;
+ var eEndBlock = this.EndBlock ;
+ var oElementPath = null ;
+
+ if ( blockTag != 'br' )
+ {
+ if ( !eStartBlock )
+ {
+ eStartBlock = this.FixBlock( true, blockTag ) ;
+ eEndBlock = this.EndBlock ; // FixBlock may have fixed the EndBlock too.
+ }
+
+ if ( !eEndBlock )
+ eEndBlock = this.FixBlock( false, blockTag ) ;
+ }
+
+ // Get the range position.
+ var bIsStartOfBlock = ( eStartBlock != null && this.CheckStartOfBlock() ) ;
+ var bIsEndOfBlock = ( eEndBlock != null && this.CheckEndOfBlock() ) ;
+
+ // Delete the current contents.
+ if ( !this.CheckIsEmpty() )
+ this.DeleteContents() ;
+
+ if ( eStartBlock && eEndBlock && eStartBlock == eEndBlock )
+ {
+ if ( bIsEndOfBlock )
+ {
+ oElementPath = new FCKElementPath( this.StartContainer ) ;
+ this.MoveToPosition( eEndBlock, 4 ) ;
+ eEndBlock = null ;
+ }
+ else if ( bIsStartOfBlock )
+ {
+ oElementPath = new FCKElementPath( this.StartContainer ) ;
+ this.MoveToPosition( eStartBlock, 3 ) ;
+ eStartBlock = null ;
+ }
+ else
+ {
+ // Extract the contents of the block from the selection point to the end of its contents.
+ this.SetEnd( eStartBlock, 2 ) ;
+ var eDocFrag = this.ExtractContents() ;
+
+ // Duplicate the block element after it.
+ eEndBlock = eStartBlock.cloneNode( false ) ;
+ eEndBlock.removeAttribute( 'id', false ) ;
+
+ // Place the extracted contents in the duplicated block.
+ eDocFrag.AppendTo( eEndBlock ) ;
+
+ FCKDomTools.InsertAfterNode( eStartBlock, eEndBlock ) ;
+
+ this.MoveToPosition( eStartBlock, 4 ) ;
+
+ // In Gecko, the last child node must be a bogus <br>.
+ // Note: bogus <br> added under <ul> or <ol> would cause lists to be incorrectly rendered.
+ if ( FCKBrowserInfo.IsGecko &&
+ ! eStartBlock.nodeName.IEquals( ['ul', 'ol'] ) )
+ FCKTools.AppendBogusBr( eStartBlock ) ;
+ }
+ }
+
+ return {
+ PreviousBlock : eStartBlock,
+ NextBlock : eEndBlock,
+ WasStartOfBlock : bIsStartOfBlock,
+ WasEndOfBlock : bIsEndOfBlock,
+ ElementPath : oElementPath
+ } ;
+ }
+
+ return null ;
+ },
+
+ // Transform a block without a block tag in a valid block (orphan text in the body or td, usually).
+ FixBlock : function( isStart, blockTag )
+ {
+ // Bookmark the range so we can restore it later.
+ var oBookmark = this.CreateBookmark() ;
+
+ // Collapse the range to the requested ending boundary.
+ this.Collapse( isStart ) ;
+
+ // Expands it to the block contents.
+ this.Expand( 'block_contents' ) ;
+
+ // Create the fixed block.
+ var oFixedBlock = this.Window.document.createElement( blockTag ) ;
+
+ // Move the contents of the temporary range to the fixed block.
+ this.ExtractContents().AppendTo( oFixedBlock ) ;
+ FCKDomTools.TrimNode( oFixedBlock ) ;
+
+ // If the fixed block is empty (not counting bookmark nodes)
+ // Add a <br /> inside to expand it.
+ if ( FCKDomTools.CheckIsEmptyElement(oFixedBlock, function( element ) { return element.getAttribute('_fck_bookmark') != 'true' ; } )
+ && FCKBrowserInfo.IsGeckoLike )
+ FCKTools.AppendBogusBr( oFixedBlock ) ;
+
+ // Insert the fixed block into the DOM.
+ this.InsertNode( oFixedBlock ) ;
+
+ // Move the range back to the bookmarked place.
+ this.MoveToBookmark( oBookmark ) ;
+
+ return oFixedBlock ;
+ },
+
+ Release : function( preserveWindow )
+ {
+ if ( !preserveWindow )
+ this.Window = null ;
+
+ this.StartNode = null ;
+ this.StartContainer = null ;
+ this.StartBlock = null ;
+ this.StartBlockLimit = null ;
+ this.EndNode = null ;
+ this.EndContainer = null ;
+ this.EndBlock = null ;
+ this.EndBlockLimit = null ;
+ this._Range = null ;
+ this._Cache = null ;
+ },
+
+ CheckHasRange : function()
+ {
+ return !!this._Range ;
+ },
+
+ GetTouchedStartNode : function()
+ {
+ var range = this._Range ;
+ var container = range.startContainer ;
+
+ if ( range.collapsed || container.nodeType != 1 )
+ return container ;
+
+ return container.childNodes[ range.startOffset ] || container ;
+ },
+
+ GetTouchedEndNode : function()
+ {
+ var range = this._Range ;
+ var container = range.endContainer ;
+
+ if ( range.collapsed || container.nodeType != 1 )
+ return container ;
+
+ return container.childNodes[ range.endOffset - 1 ] || container ;
+ }
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdomrange_gecko.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdomrange_gecko.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,104 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * 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.
+ * (Gecko Implementation)
+ */
+
+FCKDomRange.prototype.MoveToSelection = function()
+{
+ this.Release( true ) ;
+
+ var oSel = this.Window.getSelection() ;
+
+ if ( oSel && oSel.rangeCount > 0 )
+ {
+ this._Range = FCKW3CRange.CreateFromRange( this.Window.document, oSel.getRangeAt(0) ) ;
+ this._UpdateElementInfo() ;
+ }
+ else
+ if ( this.Window.document )
+ this.MoveToElementStart( this.Window.document.body ) ;
+}
+
+FCKDomRange.prototype.Select = function()
+{
+ var oRange = this._Range ;
+ if ( oRange )
+ {
+ var startContainer = oRange.startContainer ;
+
+ // If we have a collapsed range, inside an empty element, we must add
+ // something to it, otherwise the caret will not be visible.
+ if ( oRange.collapsed && startContainer.nodeType == 1 && startContainer.childNodes.length == 0 )
+ startContainer.appendChild( oRange._Document.createTextNode('') ) ;
+
+ var oDocRange = this.Window.document.createRange() ;
+ oDocRange.setStart( startContainer, oRange.startOffset ) ;
+
+ try
+ {
+ oDocRange.setEnd( oRange.endContainer, oRange.endOffset ) ;
+ }
+ catch ( e )
+ {
+ // 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).
+ // So, let's create a new range and collapse it to the desired point.
+ if ( e.toString().Contains( 'NS_ERROR_ILLEGAL_VALUE' ) )
+ {
+ oRange.collapse( true ) ;
+ oDocRange.setEnd( oRange.endContainer, oRange.endOffset ) ;
+ }
+ else
+ throw( e ) ;
+ }
+
+ var oSel = this.Window.getSelection() ;
+ oSel.removeAllRanges() ;
+
+ // We must add a clone otherwise Firefox will have rendering issues.
+ oSel.addRange( oDocRange ) ;
+ }
+}
+
+// Not compatible with bookmark created with CreateBookmark2.
+// The bookmark nodes will be deleted from the document.
+FCKDomRange.prototype.SelectBookmark = function( bookmark )
+{
+ var domRange = this.Window.document.createRange() ;
+
+ var startNode = this.GetBookmarkNode( bookmark, true ) ;
+ var endNode = this.GetBookmarkNode( bookmark, false ) ;
+
+ domRange.setStart( startNode.parentNode, FCKDomTools.GetIndexOf( startNode ) ) ;
+ FCKDomTools.RemoveNode( startNode ) ;
+
+ if ( endNode )
+ {
+ domRange.setEnd( endNode.parentNode, FCKDomTools.GetIndexOf( endNode ) ) ;
+ FCKDomTools.RemoveNode( endNode ) ;
+ }
+
+ var selection = this.Window.getSelection() ;
+ selection.removeAllRanges() ;
+ selection.addRange( domRange ) ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdomrange_ie.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdomrange_ie.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,199 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * 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.
+ * (IE Implementation)
+ */
+
+FCKDomRange.prototype.MoveToSelection = function()
+{
+ this.Release( true ) ;
+
+ this._Range = new FCKW3CRange( this.Window.document ) ;
+
+ var oSel = this.Window.document.selection ;
+
+ if ( oSel.type != 'Control' )
+ {
+ var eMarkerStart = this._GetSelectionMarkerTag( true ) ;
+ var eMarkerEnd = this._GetSelectionMarkerTag( false ) ;
+
+ if ( !eMarkerStart && !eMarkerEnd )
+ {
+ this._Range.setStart( this.Window.document.body, 0 ) ;
+ this._UpdateElementInfo() ;
+ return ;
+ }
+
+ // Set the start boundary.
+ this._Range.setStart( eMarkerStart.parentNode, FCKDomTools.GetIndexOf( eMarkerStart ) ) ;
+ eMarkerStart.parentNode.removeChild( eMarkerStart ) ;
+
+ // Set the end boundary.
+ this._Range.setEnd( eMarkerEnd.parentNode, FCKDomTools.GetIndexOf( eMarkerEnd ) ) ;
+ eMarkerEnd.parentNode.removeChild( eMarkerEnd ) ;
+
+ this._UpdateElementInfo() ;
+ }
+ else
+ {
+ var oControl = oSel.createRange().item(0) ;
+
+ if ( oControl )
+ {
+ this._Range.setStartBefore( oControl ) ;
+ this._Range.setEndAfter( oControl ) ;
+ this._UpdateElementInfo() ;
+ }
+ }
+}
+
+FCKDomRange.prototype.Select = function( forceExpand )
+{
+ if ( this._Range )
+ this.SelectBookmark( this.CreateBookmark( true ), forceExpand ) ;
+}
+
+// Not compatible with bookmark created with CreateBookmark2.
+// The bookmark nodes will be deleted from the document.
+FCKDomRange.prototype.SelectBookmark = function( bookmark, forceExpand )
+{
+ var bIsCollapsed = this.CheckIsCollapsed() ;
+ var bIsStartMakerAlone ;
+ var dummySpan ;
+
+ // Create marker tags for the start and end boundaries.
+ var eStartMarker = this.GetBookmarkNode( bookmark, true ) ;
+
+ if ( !eStartMarker )
+ return ;
+
+ var eEndMarker ;
+ if ( !bIsCollapsed )
+ eEndMarker = this.GetBookmarkNode( bookmark, false ) ;
+
+ // Create the main range which will be used for the selection.
+ var oIERange = this.Window.document.body.createTextRange() ;
+
+ // Position the range at the start boundary.
+ oIERange.moveToElementText( eStartMarker ) ;
+ oIERange.moveStart( 'character', 1 ) ;
+
+ if ( eEndMarker )
+ {
+ // Create a tool range for the end.
+ var oIERangeEnd = this.Window.document.body.createTextRange() ;
+
+ // Position the tool range at the end.
+ oIERangeEnd.moveToElementText( eEndMarker ) ;
+
+ // Move the end boundary of the main range to match the tool range.
+ oIERange.setEndPoint( 'EndToEnd', oIERangeEnd ) ;
+ oIERange.moveEnd( 'character', -1 ) ;
+ }
+ else
+ {
+ bIsStartMakerAlone = ( forceExpand || !eStartMarker.previousSibling || eStartMarker.previousSibling.nodeName.toLowerCase() == 'br' ) && !eStartMarker.nextSibing ;
+
+ // Append a temporary <span></span> before the selection.
+ // This is needed to avoid IE destroying selections inside empty
+ // inline elements, like <b></b> (#253).
+ // It is also needed when placing the selection right after an inline
+ // element to avoid the selection moving inside of it.
+ dummySpan = this.Window.document.createElement( 'span' ) ;
+ dummySpan.innerHTML = '' ; // Zero Width No-Break Space (U+FEFF). See #1359.
+ eStartMarker.parentNode.insertBefore( dummySpan, eStartMarker ) ;
+
+ if ( bIsStartMakerAlone )
+ {
+ // To expand empty blocks or line spaces after <br>, we need
+ // instead to have any char, which will be later deleted using the
+ // selection.
+ // \ufeff = Zero Width No-Break Space (U+FEFF). See #1359.
+ eStartMarker.parentNode.insertBefore( this.Window.document.createTextNode( '\ufeff' ), eStartMarker ) ;
+ }
+ }
+
+ if ( !this._Range )
+ this._Range = this.CreateRange() ;
+
+ // Remove the markers (reset the position, because of the changes in the DOM tree).
+ this._Range.setStartBefore( eStartMarker ) ;
+ eStartMarker.parentNode.removeChild( eStartMarker ) ;
+
+ if ( bIsCollapsed )
+ {
+ if ( bIsStartMakerAlone )
+ {
+ // Move the selection start to include the temporary .
+ oIERange.moveStart( 'character', -1 ) ;
+
+ oIERange.select() ;
+
+ // Remove our temporary stuff.
+ this.Window.document.selection.clear() ;
+ }
+ else
+ oIERange.select() ;
+
+ FCKDomTools.RemoveNode( dummySpan ) ;
+ }
+ else
+ {
+ this._Range.setEndBefore( eEndMarker ) ;
+ eEndMarker.parentNode.removeChild( eEndMarker ) ;
+ oIERange.select() ;
+ }
+}
+
+FCKDomRange.prototype._GetSelectionMarkerTag = function( toStart )
+{
+ var doc = this.Window.document ;
+ var selection = doc.selection ;
+
+ // Get a range for the start boundary.
+ var oRange ;
+
+ // IE may throw an "unspecified error" on some cases (it happened when
+ // loading _samples/default.html), so try/catch.
+ try
+ {
+ oRange = selection.createRange() ;
+ }
+ catch (e)
+ {
+ return null ;
+ }
+
+ // 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).
+ // We need to avoid that.
+ if ( oRange.parentElement().document != doc )
+ return null ;
+
+ oRange.collapse( toStart === true ) ;
+
+ // 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) ;
+ oRange.pasteHTML( '<span id="' + sMarkerId + '"></span>' ) ;
+
+ return doc.getElementById( sMarkerId ) ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdomrangeiterator.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckdomrangeiterator.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,327 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This class can be used to interate through nodes inside a range.
+ *
+ * During interation, the provided range can become invalid, due to document
+ * mutations, so CreateBookmark() used to restore it after processing, if
+ * needed.
+ */
+
+var FCKDomRangeIterator = function( range )
+{
+ /**
+ * The FCKDomRange object that marks the interation boundaries.
+ */
+ this.Range = range ;
+
+ /**
+ * Indicates that <br> elements must be used as paragraph boundaries.
+ */
+ this.ForceBrBreak = false ;
+
+ /**
+ * Guarantees that the iterator will always return "real" block elements.
+ * If "false", elements like <li>, <th> and <td> are returned. If "true", a
+ * dedicated block element block element will be created inside those
+ * elements to hold the selected content.
+ */
+ this.EnforceRealBlocks = false ;
+}
+
+FCKDomRangeIterator.CreateFromSelection = function( targetWindow )
+{
+ var range = new FCKDomRange( targetWindow ) ;
+ range.MoveToSelection() ;
+ return new FCKDomRangeIterator( range ) ;
+}
+
+FCKDomRangeIterator.prototype =
+{
+ /**
+ * Get the next paragraph element. It automatically breaks the document
+ * when necessary to generate block elements for the paragraphs.
+ */
+ GetNextParagraph : function()
+ {
+ // The block element to be returned.
+ var block ;
+
+ // The range object used to identify the paragraph contents.
+ var range ;
+
+ // Indicated that the current element in the loop is the last one.
+ var isLast ;
+
+ // Instructs to cleanup remaining BRs.
+ var removePreviousBr ;
+ var removeLastBr ;
+
+ var boundarySet = this.ForceBrBreak ? FCKListsLib.ListBoundaries : FCKListsLib.BlockBoundaries ;
+
+ // This is the first iteration. Let's initialize it.
+ if ( !this._LastNode )
+ {
+ var range = this.Range.Clone() ;
+ range.Expand( this.ForceBrBreak ? 'list_contents' : 'block_contents' ) ;
+
+ this._NextNode = range.GetTouchedStartNode() ;
+ this._LastNode = range.GetTouchedEndNode() ;
+
+ // Let's reuse this variable.
+ range = null ;
+ }
+
+ var currentNode = this._NextNode ;
+ var lastNode = this._LastNode ;
+
+ this._NextNode = null ;
+
+ while ( currentNode )
+ {
+ // closeRange indicates that a paragraph boundary has been found,
+ // so the range can be closed.
+ var closeRange = false ;
+
+ // includeNode indicates that the current node is good to be part
+ // of the range. By default, any non-element node is ok for it.
+ var includeNode = ( currentNode.nodeType != 1 ) ;
+
+ var continueFromSibling = false ;
+
+ // If it is an element node, let's check if it can be part of the
+ // range.
+ if ( !includeNode )
+ {
+ var nodeName = currentNode.nodeName.toLowerCase() ;
+
+ if ( boundarySet[ nodeName ] && ( !FCKBrowserInfo.IsIE || currentNode.scopeName == 'HTML' ) )
+ {
+ // <br> boundaries must be part of the range. It will
+ // happen only if ForceBrBreak.
+ if ( nodeName == 'br' )
+ includeNode = true ;
+ else if ( !range && currentNode.childNodes.length == 0 && nodeName != 'hr' )
+ {
+ // If we have found an empty block, and haven't started
+ // the range yet, it means we must return this block.
+ block = currentNode ;
+ isLast = currentNode == lastNode ;
+ break ;
+ }
+
+ // The range must finish right before the boundary,
+ // including possibly skipped empty spaces. (#1603)
+ if ( range )
+ {
+ range.SetEnd( currentNode, 3, true ) ;
+
+ // The found boundary must be set as the next one at this
+ // point. (#1717)
+ if ( nodeName != 'br' )
+ this._NextNode = FCKDomTools.GetNextSourceNode( currentNode, true, null, lastNode ) ;
+ }
+
+ closeRange = true ;
+ }
+ else
+ {
+ // If we have child nodes, let's check them.
+ if ( currentNode.firstChild )
+ {
+ // If we don't have a range yet, let's start it.
+ if ( !range )
+ {
+ range = new FCKDomRange( this.Range.Window ) ;
+ range.SetStart( currentNode, 3, true ) ;
+ }
+
+ currentNode = currentNode.firstChild ;
+ continue ;
+ }
+ includeNode = true ;
+ }
+ }
+ else if ( currentNode.nodeType == 3 )
+ {
+ // Ignore normal whitespaces (i.e. not including or
+ // other unicode whitespaces) before/after a block node.
+ if ( /^[\r\n\t ]+$/.test( currentNode.nodeValue ) )
+ includeNode = false ;
+ }
+
+ // The current node is good to be part of the range and we are
+ // starting a new range, initialize it first.
+ if ( includeNode && !range )
+ {
+ range = new FCKDomRange( this.Range.Window ) ;
+ range.SetStart( currentNode, 3, true ) ;
+ }
+
+ // The last node has been found.
+ isLast = ( ( !closeRange || includeNode ) && currentNode == lastNode ) ;
+// isLast = ( currentNode == lastNode && ( currentNode.nodeType != 1 || currentNode.childNodes.length == 0 ) ) ;
+
+ // 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.
+ if ( range && !closeRange )
+ {
+ while ( !currentNode.nextSibling && !isLast )
+ {
+ var parentNode = currentNode.parentNode ;
+
+ if ( boundarySet[ parentNode.nodeName.toLowerCase() ] )
+ {
+ closeRange = true ;
+ isLast = isLast || ( parentNode == lastNode ) ;
+ break ;
+ }
+
+ currentNode = parentNode ;
+ includeNode = true ;
+ isLast = ( currentNode == lastNode ) ;
+ continueFromSibling = true ;
+ }
+ }
+
+ // Now finally include the node.
+ if ( includeNode )
+ range.SetEnd( currentNode, 4, true ) ;
+
+ // We have found a block boundary. Let's close the range and move out of the
+ // loop.
+ if ( ( closeRange || isLast ) && range )
+ {
+ range._UpdateElementInfo() ;
+
+ if ( range.StartNode == range.EndNode
+ && range.StartNode.parentNode == range.StartBlockLimit
+ && range.StartNode.getAttribute && range.StartNode.getAttribute( '_fck_bookmark' ) )
+ range = null ;
+ else
+ break ;
+ }
+
+ if ( isLast )
+ break ;
+
+ currentNode = FCKDomTools.GetNextSourceNode( currentNode, continueFromSibling, null, lastNode ) ;
+ }
+
+ // Now, based on the processed range, look for (or create) the block to be returned.
+ if ( !block )
+ {
+ // If no range has been found, this is the end.
+ if ( !range )
+ {
+ this._NextNode = null ;
+ return null ;
+ }
+
+ block = range.StartBlock ;
+
+ if ( !block
+ && !this.EnforceRealBlocks
+ && range.StartBlockLimit.nodeName.IEquals( 'DIV', 'TH', 'TD' )
+ && range.CheckStartOfBlock()
+ && range.CheckEndOfBlock() )
+ {
+ block = range.StartBlockLimit ;
+ }
+ else if ( !block || ( this.EnforceRealBlocks && block.nodeName.toLowerCase() == 'li' ) )
+ {
+ // Create the fixed block.
+ block = this.Range.Window.document.createElement( FCKConfig.EnterMode == 'p' ? 'p' : 'div' ) ;
+
+ // Move the contents of the temporary range to the fixed block.
+ range.ExtractContents().AppendTo( block ) ;
+ FCKDomTools.TrimNode( block ) ;
+
+ // Insert the fixed block into the DOM.
+ range.InsertNode( block ) ;
+
+ removePreviousBr = true ;
+ removeLastBr = true ;
+ }
+ else if ( block.nodeName.toLowerCase() != 'li' )
+ {
+ // If the range doesn't includes the entire contents of the
+ // block, we must split it, isolating the range in a dedicated
+ // block.
+ if ( !range.CheckStartOfBlock() || !range.CheckEndOfBlock() )
+ {
+ // The resulting block will be a clone of the current one.
+ block = block.cloneNode( false ) ;
+
+ // Extract the range contents, moving it to the new block.
+ range.ExtractContents().AppendTo( block ) ;
+ FCKDomTools.TrimNode( block ) ;
+
+ // Split the block. At this point, the range will be in the
+ // right position for our intents.
+ var splitInfo = range.SplitBlock() ;
+
+ removePreviousBr = !splitInfo.WasStartOfBlock ;
+ removeLastBr = !splitInfo.WasEndOfBlock ;
+
+ // Insert the new block into the DOM.
+ range.InsertNode( block ) ;
+ }
+ }
+ else if ( !isLast )
+ {
+ // LIs are returned as is, with all their children (due to the
+ // nested lists). But, the next node is the node right after
+ // the current range, which could be an <li> child (nested
+ // lists) or the next sibling <li>.
+
+ this._NextNode = block == lastNode ? null : FCKDomTools.GetNextSourceNode( range.EndNode, true, null, lastNode ) ;
+ return block ;
+ }
+ }
+
+ if ( removePreviousBr )
+ {
+ var previousSibling = block.previousSibling ;
+ if ( previousSibling && previousSibling.nodeType == 1 )
+ {
+ if ( previousSibling.nodeName.toLowerCase() == 'br' )
+ previousSibling.parentNode.removeChild( previousSibling ) ;
+ else if ( previousSibling.lastChild && previousSibling.lastChild.nodeName.IEquals( 'br' ) )
+ previousSibling.removeChild( previousSibling.lastChild ) ;
+ }
+ }
+
+ if ( removeLastBr )
+ {
+ var lastChild = block.lastChild ;
+ if ( lastChild && lastChild.nodeType == 1 && lastChild.nodeName.toLowerCase() == 'br' )
+ block.removeChild( lastChild ) ;
+ }
+
+ // 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
+ // next interation.
+ if ( !this._NextNode )
+ this._NextNode = ( isLast || block == lastNode ) ? null : FCKDomTools.GetNextSourceNode( block, true, null, lastNode ) ;
+
+ return block ;
+ }
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckeditingarea.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckeditingarea.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,368 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKEditingArea Class: renders an editable area.
+ */
+
+/**
+ * @constructor
+ * @param {String} targetElement The element that will hold the editing area. Any child element present in the target will be deleted.
+ */
+var FCKEditingArea = function( targetElement )
+{
+ this.TargetElement = targetElement ;
+ this.Mode = FCK_EDITMODE_WYSIWYG ;
+
+ if ( FCK.IECleanup )
+ FCK.IECleanup.AddItem( this, FCKEditingArea_Cleanup ) ;
+}
+
+
+/**
+ * @param {String} html The complete HTML for the page, including DOCTYPE and the <html> tag.
+ */
+FCKEditingArea.prototype.Start = function( html, secondCall )
+{
+ var eTargetElement = this.TargetElement ;
+ var oTargetDocument = FCKTools.GetElementDocument( eTargetElement ) ;
+
+ // Remove all child nodes from the target.
+ while( eTargetElement.firstChild )
+ eTargetElement.removeChild( eTargetElement.firstChild ) ;
+
+ if ( this.Mode == FCK_EDITMODE_WYSIWYG )
+ {
+ // For FF, document.domain must be set only when different, otherwhise
+ // we'll strangely have "Permission denied" issues.
+ if ( FCK_IS_CUSTOM_DOMAIN )
+ html = '<script>document.domain="' + FCK_RUNTIME_DOMAIN + '";</script>' + html ;
+
+ // 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>.
+ if ( FCKBrowserInfo.IsIE )
+ html = html.replace( /(<base[^>]*?)\s*\/?>(?!\s*<\/base>)/gi, '$1></base>' ) ;
+ else if ( !secondCall )
+ {
+ // Gecko moves some tags out of the body to the head, so we must use
+ // innerHTML to set the body contents (SF BUG 1526154).
+
+ // Extract the BODY contents from the html.
+ var oMatchBefore = html.match( FCKRegexLib.BeforeBody ) ;
+ var oMatchAfter = html.match( FCKRegexLib.AfterBody ) ;
+
+ if ( oMatchBefore && oMatchAfter )
+ {
+ var sBody = html.substr( oMatchBefore[1].length,
+ html.length - oMatchBefore[1].length - oMatchAfter[1].length ) ; // This is the BODY tag contents.
+
+ html =
+ oMatchBefore[1] + // This is the HTML until 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 ( FCKBrowserInfo.IsGecko && ( sBody.length == 0 || FCKRegexLib.EmptyParagraph.test( sBody ) ) )
+ sBody = '<br type="_moz">' ;
+
+ this._BodyHTML = sBody ;
+
+ }
+ else
+ this._BodyHTML = html ; // Invalid HTML input.
+ }
+
+ // Create the editing area IFRAME.
+ var oIFrame = this.IFrame = oTargetDocument.createElement( 'iframe' ) ;
+
+ // IE: Avoid JavaScript errors thrown by the editing are source (like tags events).
+ // See #1055.
+ var sOverrideError = '<script type="text/javascript" _fcktemp="true">window.onerror=function(){return true;};</script>' ;
+
+ oIFrame.frameBorder = 0 ;
+ oIFrame.style.width = oIFrame.style.height = '100%' ;
+
+ if ( FCK_IS_CUSTOM_DOMAIN && FCKBrowserInfo.IsIE )
+ {
+ window._FCKHtmlToLoad = html.replace( /<head>/i, '<head>' + sOverrideError ) ;
+ oIFrame.src = 'javascript:void( (function(){' +
+ 'document.open() ;' +
+ 'document.domain="' + document.domain + '" ;' +
+ 'document.write( window.parent._FCKHtmlToLoad );' +
+ 'document.close() ;' +
+ 'window.parent._FCKHtmlToLoad = null ;' +
+ '})() )' ;
+ }
+ else if ( !FCKBrowserInfo.IsGecko )
+ {
+ // Firefox will render the tables inside the body in Quirks mode if the
+ // source of the iframe is set to javascript. see #515
+ oIFrame.src = 'javascript:void(0)' ;
+ }
+
+ // 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.
+ eTargetElement.appendChild( oIFrame ) ;
+
+ // Get the window and document objects used to interact with the newly created IFRAME.
+ this.Window = oIFrame.contentWindow ;
+
+ // IE: Avoid JavaScript errors thrown by the editing are source (like tags events).
+ // TODO: This error handler is not being fired.
+ // this.Window.onerror = function() { alert( 'Error!' ) ; return true ; }
+
+ if ( !FCK_IS_CUSTOM_DOMAIN || !FCKBrowserInfo.IsIE )
+ {
+ var oDoc = this.Window.document ;
+
+ oDoc.open() ;
+ oDoc.write( html.replace( /<head>/i, '<head>' + sOverrideError ) ) ;
+ oDoc.close() ;
+ }
+
+ if ( FCKBrowserInfo.IsAIR )
+ FCKAdobeAIR.EditingArea_Start( oDoc, html ) ;
+
+ // Firefox 1.0.x is buggy... ohh yes... so let's do it two times and it
+ // will magically work.
+ if ( FCKBrowserInfo.IsGecko10 && !secondCall )
+ {
+ this.Start( html, true ) ;
+ return ;
+ }
+
+ if ( oIFrame.readyState && oIFrame.readyState != 'completed' )
+ {
+ var editArea = this ;
+
+ // Using a IE alternative for DOMContentLoaded, similar to the
+ // solution proposed at http://javascript.nwbox.com/IEContentLoaded/
+ setTimeout( function()
+ {
+ try
+ {
+ editArea.Window.document.documentElement.doScroll("left") ;
+ }
+ catch(e)
+ {
+ setTimeout( arguments.callee, 0 ) ;
+ return ;
+ }
+ editArea.Window._FCKEditingArea = editArea ;
+ FCKEditingArea_CompleteStart.call( editArea.Window ) ;
+ }, 0 ) ;
+ }
+ else
+ {
+ this.Window._FCKEditingArea = this ;
+
+ // FF 1.0.x is buggy... we must wait a lot to enable editing because
+ // sometimes the content simply disappears, for example when pasting
+ // "bla1!<img src='some_url'>!bla2" in the source and then switching
+ // back to design.
+ if ( FCKBrowserInfo.IsGecko10 )
+ this.Window.setTimeout( FCKEditingArea_CompleteStart, 500 ) ;
+ else
+ FCKEditingArea_CompleteStart.call( this.Window ) ;
+ }
+ }
+ else
+ {
+ var eTextarea = this.Textarea = oTargetDocument.createElement( 'textarea' ) ;
+ eTextarea.className = 'SourceField' ;
+ eTextarea.dir = 'ltr' ;
+ FCKDomTools.SetElementStyles( eTextarea,
+ {
+ width : '100%',
+ height : '100%',
+ border : 'none',
+ resize : 'none',
+ outline : 'none'
+ } ) ;
+ eTargetElement.appendChild( eTextarea ) ;
+
+ eTextarea.value = html ;
+
+ // Fire the "OnLoad" event.
+ FCKTools.RunFunction( this.OnLoad ) ;
+ }
+}
+
+// "this" here is FCKEditingArea.Window
+function FCKEditingArea_CompleteStart()
+{
+ // On Firefox, the DOM takes a little to become available. So we must wait for it in a loop.
+ if ( !this.document.body )
+ {
+ this.setTimeout( FCKEditingArea_CompleteStart, 50 ) ;
+ return ;
+ }
+
+ var oEditorArea = this._FCKEditingArea ;
+
+ // Save this reference to be re-used later.
+ oEditorArea.Document = oEditorArea.Window.document ;
+
+ oEditorArea.MakeEditable() ;
+
+ // Fire the "OnLoad" event.
+ FCKTools.RunFunction( oEditorArea.OnLoad ) ;
+}
+
+FCKEditingArea.prototype.MakeEditable = function()
+{
+ var oDoc = this.Document ;
+
+ if ( FCKBrowserInfo.IsIE )
+ {
+ // Kludge for #141 and #523
+ oDoc.body.disabled = true ;
+ oDoc.body.contentEditable = true ;
+ oDoc.body.removeAttribute( "disabled" ) ;
+
+ /* The following commands don't throw errors, but have no effect.
+ oDoc.execCommand( 'AutoDetect', false, false ) ;
+ oDoc.execCommand( 'KeepSelection', false, true ) ;
+ */
+ }
+ else
+ {
+ try
+ {
+ // Disable Firefox 2 Spell Checker.
+ oDoc.body.spellcheck = ( this.FFSpellChecker !== false ) ;
+
+ if ( this._BodyHTML )
+ {
+ oDoc.body.innerHTML = this._BodyHTML ;
+ oDoc.body.offsetLeft ; // Don't remove, this is a hack to fix Opera 9.50, see #2264.
+ this._BodyHTML = null ;
+ }
+
+ oDoc.designMode = 'on' ;
+
+ // Tell Gecko (Firefox 1.5+) to enable or not live resizing of objects (by Alfonso Martinez)
+ oDoc.execCommand( 'enableObjectResizing', false, !FCKConfig.DisableObjectResizing ) ;
+
+ // Disable the standard table editing features of Firefox.
+ oDoc.execCommand( 'enableInlineTableEditing', false, !FCKConfig.DisableFFTableHandles ) ;
+ }
+ catch (e)
+ {
+ // 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
+ FCKTools.AddEventListener( this.Window.frameElement, 'DOMAttrModified', FCKEditingArea_Document_AttributeNodeModified ) ;
+ }
+
+ }
+}
+
+// This function processes the notifications of the DOM Mutation event on the document
+// 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
+ if ( editingArea._timer )
+ window.clearTimeout( editingArea._timer ) ;
+
+ editingArea._timer = FCKTools.SetTimeout( FCKEditingArea_MakeEditableByMutation, 1000, editingArea ) ;
+}
+
+// This function ideally should be called after the document is visible, it does clean up of the
+// mutation tracking and tries again to make the area editable.
+function FCKEditingArea_MakeEditableByMutation()
+{
+ // Clean up
+ delete this._timer ;
+ // Now we don't want to keep on getting this event
+ FCKTools.RemoveEventListener( this.Window.frameElement, 'DOMAttrModified', FCKEditingArea_Document_AttributeNodeModified ) ;
+ // Let's try now to set the editing area editable
+ // If it fails it will set up the Mutation Listener again automatically
+ this.MakeEditable() ;
+}
+
+FCKEditingArea.prototype.Focus = function()
+{
+ try
+ {
+ if ( this.Mode == FCK_EDITMODE_WYSIWYG )
+ {
+ if ( FCKBrowserInfo.IsIE )
+ this._FocusIE() ;
+ else
+ this.Window.focus() ;
+ }
+ else
+ {
+ var oDoc = FCKTools.GetElementDocument( this.Textarea ) ;
+ if ( (!oDoc.hasFocus || oDoc.hasFocus() ) && oDoc.activeElement == this.Textarea )
+ return ;
+
+ this.Textarea.focus() ;
+ }
+ }
+ catch(e) {}
+}
+
+FCKEditingArea.prototype._FocusIE = function()
+{
+ // In IE it can happen that the document is in theory focused but the
+ // active element is outside of it.
+ this.Document.body.setActive() ;
+
+ this.Window.focus() ;
+
+ // Kludge for #141... yet more code to workaround IE bugs
+ var range = this.Document.selection.createRange() ;
+
+ var parentNode = range.parentElement() ;
+ var parentTag = parentNode.nodeName.toLowerCase() ;
+
+ // Only apply the fix when in a block, and the block is empty.
+ if ( parentNode.childNodes.length > 0 ||
+ !( FCKListsLib.BlockElements[parentTag] ||
+ FCKListsLib.NonEmptyBlockElements[parentTag] ) )
+ {
+ return ;
+ }
+
+ // Force the selection to happen, in this way we guarantee the focus will
+ // be there.
+ range = new FCKDomRange( this.Window ) ;
+ range.MoveToElementEditStart( parentNode ) ;
+ range.Select() ;
+}
+
+function FCKEditingArea_Cleanup()
+{
+ if ( this.Document )
+ this.Document.body.innerHTML = "" ;
+ this.TargetElement = null ;
+ this.IFrame = null ;
+ this.Document = null ;
+ this.Textarea = null ;
+
+ if ( this.Window )
+ {
+ this.Window._FCKEditingArea = null ;
+ this.Window = null ;
+ }
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckelementpath.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckelementpath.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,89 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Manages the DOM ascensors element list of a specific DOM node
+ * (limited to body, inclusive).
+ */
+
+var FCKElementPath = function( lastNode )
+{
+ var eBlock = null ;
+ var eBlockLimit = null ;
+
+ var aElements = new Array() ;
+
+ var e = lastNode ;
+ while ( e )
+ {
+ if ( e.nodeType == 1 )
+ {
+ if ( !this.LastElement )
+ this.LastElement = e ;
+
+ var sElementName = e.nodeName.toLowerCase() ;
+ if ( FCKBrowserInfo.IsIE && e.scopeName != 'HTML' )
+ sElementName = e.scopeName.toLowerCase() + ':' + sElementName ;
+
+ if ( !eBlockLimit )
+ {
+ if ( !eBlock && FCKListsLib.PathBlockElements[ sElementName ] != null )
+ eBlock = e ;
+
+ if ( FCKListsLib.PathBlockLimitElements[ sElementName ] != null )
+ {
+ // DIV is considered the Block, if no block is available (#525)
+ // and if it doesn't contain other blocks.
+ if ( !eBlock && sElementName == 'div' && !FCKElementPath._CheckHasBlock( e ) )
+ eBlock = e ;
+ else
+ eBlockLimit = e ;
+ }
+ }
+
+ aElements.push( e ) ;
+
+ if ( sElementName == 'body' )
+ break ;
+ }
+ e = e.parentNode ;
+ }
+
+ this.Block = eBlock ;
+ this.BlockLimit = eBlockLimit ;
+ this.Elements = aElements ;
+}
+
+/**
+ * Check if an element contains any block element.
+ */
+FCKElementPath._CheckHasBlock = function( element )
+{
+ var childNodes = element.childNodes ;
+
+ for ( var i = 0, count = childNodes.length ; i < count ; i++ )
+ {
+ var child = childNodes[i] ;
+
+ if ( child.nodeType == 1 && FCKListsLib.BlockElements[ child.nodeName.toLowerCase() ] )
+ return true ;
+ }
+
+ return false ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckenterkey.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckenterkey.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,688 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Controls the [Enter] keystroke behavior in a document.
+ */
+
+/*
+ * Constructor.
+ * @targetDocument : the target document.
+ * @enterMode : the behavior for the <Enter> keystroke.
+ * May be "p", "div", "br". Default is "p".
+ * @shiftEnterMode : the behavior for the <Shift>+<Enter> keystroke.
+ * May be "p", "div", "br". Defaults to "br".
+ */
+var FCKEnterKey = function( targetWindow, enterMode, shiftEnterMode, tabSpaces )
+{
+ this.Window = targetWindow ;
+ this.EnterMode = enterMode || 'p' ;
+ this.ShiftEnterMode = shiftEnterMode || 'br' ;
+
+ // Setup the Keystroke Handler.
+ var oKeystrokeHandler = new FCKKeystrokeHandler( false ) ;
+ oKeystrokeHandler._EnterKey = this ;
+ oKeystrokeHandler.OnKeystroke = FCKEnterKey_OnKeystroke ;
+
+ oKeystrokeHandler.SetKeystrokes( [
+ [ 13 , 'Enter' ],
+ [ SHIFT + 13, 'ShiftEnter' ],
+ [ 8 , 'Backspace' ],
+ [ CTRL + 8 , 'CtrlBackspace' ],
+ [ 46 , 'Delete' ]
+ ] ) ;
+
+ this.TabText = '' ;
+
+ // Safari by default inserts 4 spaces on TAB, while others make the editor
+ // loose focus. So, we need to handle it here to not include those spaces.
+ if ( tabSpaces > 0 || FCKBrowserInfo.IsSafari )
+ {
+ while ( tabSpaces-- )
+ this.TabText += '\xa0' ;
+
+ oKeystrokeHandler.SetKeystrokes( [ 9, 'Tab' ] );
+ }
+
+ oKeystrokeHandler.AttachToElement( targetWindow.document ) ;
+}
+
+
+function FCKEnterKey_OnKeystroke( keyCombination, keystrokeValue )
+{
+ var oEnterKey = this._EnterKey ;
+
+ try
+ {
+ switch ( keystrokeValue )
+ {
+ case 'Enter' :
+ return oEnterKey.DoEnter() ;
+ break ;
+ case 'ShiftEnter' :
+ return oEnterKey.DoShiftEnter() ;
+ break ;
+ case 'Backspace' :
+ return oEnterKey.DoBackspace() ;
+ break ;
+ case 'Delete' :
+ return oEnterKey.DoDelete() ;
+ break ;
+ case 'Tab' :
+ return oEnterKey.DoTab() ;
+ break ;
+ case 'CtrlBackspace' :
+ return oEnterKey.DoCtrlBackspace() ;
+ break ;
+ }
+ }
+ catch (e)
+ {
+ // If for any reason we are not able to handle it, go
+ // ahead with the browser default behavior.
+ }
+
+ return false ;
+}
+
+/*
+ * Executes the <Enter> key behavior.
+ */
+FCKEnterKey.prototype.DoEnter = function( mode, hasShift )
+{
+ // Save an undo snapshot before doing anything
+ FCKUndo.SaveUndoStep() ;
+
+ this._HasShift = ( hasShift === true ) ;
+
+ var parentElement = FCKSelection.GetParentElement() ;
+ var parentPath = new FCKElementPath( parentElement ) ;
+ var sMode = mode || this.EnterMode ;
+
+ if ( sMode == 'br' || parentPath.Block && parentPath.Block.tagName.toLowerCase() == 'pre' )
+ return this._ExecuteEnterBr() ;
+ else
+ return this._ExecuteEnterBlock( sMode ) ;
+}
+
+/*
+ * Executes the <Shift>+<Enter> key behavior.
+ */
+FCKEnterKey.prototype.DoShiftEnter = function()
+{
+ return this.DoEnter( this.ShiftEnterMode, true ) ;
+}
+
+/*
+ * Executes the <Backspace> key behavior.
+ */
+FCKEnterKey.prototype.DoBackspace = function()
+{
+ var bCustom = false ;
+
+ // Get the current selection.
+ var oRange = new FCKDomRange( this.Window ) ;
+ oRange.MoveToSelection() ;
+
+ // Kludge for #247
+ if ( FCKBrowserInfo.IsIE && this._CheckIsAllContentsIncluded( oRange, this.Window.document.body ) )
+ {
+ this._FixIESelectAllBug( oRange ) ;
+ return true ;
+ }
+
+ var isCollapsed = oRange.CheckIsCollapsed() ;
+
+ if ( !isCollapsed )
+ {
+ // Bug #327, Backspace with an img selection would activate the default action in IE.
+ // Let's override that with our logic here.
+ if ( FCKBrowserInfo.IsIE && this.Window.document.selection.type.toLowerCase() == "control" )
+ {
+ var controls = this.Window.document.selection.createRange() ;
+ for ( var i = controls.length - 1 ; i >= 0 ; i-- )
+ {
+ var el = controls.item( i ) ;
+ el.parentNode.removeChild( el ) ;
+ }
+ return true ;
+ }
+
+ return false ;
+ }
+
+ // On IE, it is better for us handle the deletion if the caret is preceeded
+ // by a <br> (#1383).
+ if ( FCKBrowserInfo.IsIE )
+ {
+ var previousElement = FCKDomTools.GetPreviousSourceElement( oRange.StartNode, true ) ;
+
+ if ( previousElement && previousElement.nodeName.toLowerCase() == 'br' )
+ {
+ // Create a range that starts after the <br> and ends at the
+ // current range position.
+ var testRange = oRange.Clone() ;
+ testRange.SetStart( previousElement, 4 ) ;
+
+ // If that range is empty, we can proceed cleaning that <br> manually.
+ if ( testRange.CheckIsEmpty() )
+ {
+ previousElement.parentNode.removeChild( previousElement ) ;
+ return true ;
+ }
+ }
+ }
+
+ var oStartBlock = oRange.StartBlock ;
+ var oEndBlock = oRange.EndBlock ;
+
+ // The selection boundaries must be in the same "block limit" element
+ if ( oRange.StartBlockLimit == oRange.EndBlockLimit && oStartBlock && oEndBlock )
+ {
+ if ( !isCollapsed )
+ {
+ var bEndOfBlock = oRange.CheckEndOfBlock() ;
+
+ oRange.DeleteContents() ;
+
+ if ( oStartBlock != oEndBlock )
+ {
+ oRange.SetStart(oEndBlock,1) ;
+ oRange.SetEnd(oEndBlock,1) ;
+
+// if ( bEndOfBlock )
+// oEndBlock.parentNode.removeChild( oEndBlock ) ;
+ }
+
+ oRange.Select() ;
+
+ bCustom = ( oStartBlock == oEndBlock ) ;
+ }
+
+ if ( oRange.CheckStartOfBlock() )
+ {
+ var oCurrentBlock = oRange.StartBlock ;
+
+ var ePrevious = FCKDomTools.GetPreviousSourceElement( oCurrentBlock, true, [ 'BODY', oRange.StartBlockLimit.nodeName ], ['UL','OL'] ) ;
+
+ bCustom = this._ExecuteBackspace( oRange, ePrevious, oCurrentBlock ) ;
+ }
+ else if ( FCKBrowserInfo.IsGeckoLike )
+ {
+ // Firefox and Opera (#1095) loose the selection when executing
+ // CheckStartOfBlock, so we must reselect.
+ oRange.Select() ;
+ }
+ }
+
+ oRange.Release() ;
+ return bCustom ;
+}
+
+FCKEnterKey.prototype.DoCtrlBackspace = function()
+{
+ FCKUndo.SaveUndoStep() ;
+ var oRange = new FCKDomRange( this.Window ) ;
+ oRange.MoveToSelection() ;
+ if ( FCKBrowserInfo.IsIE && this._CheckIsAllContentsIncluded( oRange, this.Window.document.body ) )
+ {
+ this._FixIESelectAllBug( oRange ) ;
+ return true ;
+ }
+ return false ;
+}
+
+FCKEnterKey.prototype._ExecuteBackspace = function( range, previous, currentBlock )
+{
+ var bCustom = false ;
+
+ // We could be in a nested LI.
+ if ( !previous && currentBlock && currentBlock.nodeName.IEquals( 'LI' ) && currentBlock.parentNode.parentNode.nodeName.IEquals( 'LI' ) )
+ {
+ this._OutdentWithSelection( currentBlock, range ) ;
+ return true ;
+ }
+
+ if ( previous && previous.nodeName.IEquals( 'LI' ) )
+ {
+ var oNestedList = FCKDomTools.GetLastChild( previous, ['UL','OL'] ) ;
+
+ while ( oNestedList )
+ {
+ previous = FCKDomTools.GetLastChild( oNestedList, 'LI' ) ;
+ oNestedList = FCKDomTools.GetLastChild( previous, ['UL','OL'] ) ;
+ }
+ }
+
+ if ( previous && currentBlock )
+ {
+ // If we are in a LI, and the previous block is not an LI, we must outdent it.
+ if ( currentBlock.nodeName.IEquals( 'LI' ) && !previous.nodeName.IEquals( 'LI' ) )
+ {
+ this._OutdentWithSelection( currentBlock, range ) ;
+ return true ;
+ }
+
+ // Take a reference to the parent for post processing cleanup.
+ var oCurrentParent = currentBlock.parentNode ;
+
+ var sPreviousName = previous.nodeName.toLowerCase() ;
+ if ( FCKListsLib.EmptyElements[ sPreviousName ] != null || sPreviousName == 'table' )
+ {
+ FCKDomTools.RemoveNode( previous ) ;
+ bCustom = true ;
+ }
+ else
+ {
+ // Remove the current block.
+ FCKDomTools.RemoveNode( currentBlock ) ;
+
+ // Remove any empty tag left by the block removal.
+ while ( oCurrentParent.innerHTML.Trim().length == 0 )
+ {
+ var oParent = oCurrentParent.parentNode ;
+ oParent.removeChild( oCurrentParent ) ;
+ oCurrentParent = oParent ;
+ }
+
+ // Cleanup the previous and the current elements.
+ FCKDomTools.LTrimNode( currentBlock ) ;
+ FCKDomTools.RTrimNode( previous ) ;
+
+ // Append a space to the previous.
+ // Maybe it is not always desirable...
+ // previous.appendChild( this.Window.document.createTextNode( ' ' ) ) ;
+
+ // Set the range to the end of the previous element and bookmark it.
+ range.SetStart( previous, 2, true ) ;
+ range.Collapse( true ) ;
+ var oBookmark = range.CreateBookmark( true ) ;
+
+ // Move the contents of the block to the previous element and delete it.
+ // But for some block types (e.g. table), moving the children to the previous block makes no sense.
+ // So a check is needed. (See #1081)
+ if ( ! currentBlock.tagName.IEquals( [ 'TABLE' ] ) )
+ FCKDomTools.MoveChildren( currentBlock, previous ) ;
+
+ // Place the selection at the bookmark.
+ range.SelectBookmark( oBookmark ) ;
+
+ bCustom = true ;
+ }
+ }
+
+ return bCustom ;
+}
+
+/*
+ * Executes the <Delete> key behavior.
+ */
+FCKEnterKey.prototype.DoDelete = function()
+{
+ // Save an undo snapshot before doing anything
+ // This is to conform with the behavior seen in MS Word
+ FCKUndo.SaveUndoStep() ;
+
+ // The <Delete> has the same effect as the <Backspace>, so we have the same
+ // results if we just move to the next block and apply the same <Backspace> logic.
+
+ var bCustom = false ;
+
+ // Get the current selection.
+ var oRange = new FCKDomRange( this.Window ) ;
+ oRange.MoveToSelection() ;
+
+ // Kludge for #247
+ if ( FCKBrowserInfo.IsIE && this._CheckIsAllContentsIncluded( oRange, this.Window.document.body ) )
+ {
+ this._FixIESelectAllBug( oRange ) ;
+ return true ;
+ }
+
+ // There is just one special case for collapsed selections at the end of a block.
+ if ( oRange.CheckIsCollapsed() && oRange.CheckEndOfBlock( FCKBrowserInfo.IsGeckoLike ) )
+ {
+ var oCurrentBlock = oRange.StartBlock ;
+ var eCurrentCell = FCKTools.GetElementAscensor( oCurrentBlock, 'td' );
+
+ var eNext = FCKDomTools.GetNextSourceElement( oCurrentBlock, true, [ oRange.StartBlockLimit.nodeName ],
+ ['UL','OL','TR'], true ) ;
+
+ // Bug #1323 : if we're in a table cell, and the next node belongs to a different cell, then don't
+ // delete anything.
+ if ( eCurrentCell )
+ {
+ var eNextCell = FCKTools.GetElementAscensor( eNext, 'td' );
+ if ( eNextCell != eCurrentCell )
+ return true ;
+ }
+
+ bCustom = this._ExecuteBackspace( oRange, oCurrentBlock, eNext ) ;
+ }
+
+ oRange.Release() ;
+ return bCustom ;
+}
+
+/*
+ * Executes the <Tab> key behavior.
+ */
+FCKEnterKey.prototype.DoTab = function()
+{
+ var oRange = new FCKDomRange( this.Window );
+ oRange.MoveToSelection() ;
+
+ // If the user pressed <tab> inside a table, we should give him the default behavior ( moving between cells )
+ // instead of giving him more non-breaking spaces. (Bug #973)
+ var node = oRange._Range.startContainer ;
+ while ( node )
+ {
+ if ( node.nodeType == 1 )
+ {
+ var tagName = node.tagName.toLowerCase() ;
+ if ( tagName == "tr" || tagName == "td" || tagName == "th" || tagName == "tbody" || tagName == "table" )
+ return false ;
+ else
+ break ;
+ }
+ node = node.parentNode ;
+ }
+
+ if ( this.TabText )
+ {
+ oRange.DeleteContents() ;
+ oRange.InsertNode( this.Window.document.createTextNode( this.TabText ) ) ;
+ oRange.Collapse( false ) ;
+ oRange.Select() ;
+ }
+ return true ;
+}
+
+FCKEnterKey.prototype._ExecuteEnterBlock = function( blockTag, range )
+{
+ // Get the current selection.
+ var oRange = range || new FCKDomRange( this.Window ) ;
+
+ var oSplitInfo = oRange.SplitBlock( blockTag ) ;
+
+ if ( oSplitInfo )
+ {
+ // Get the current blocks.
+ var ePreviousBlock = oSplitInfo.PreviousBlock ;
+ var eNextBlock = oSplitInfo.NextBlock ;
+
+ var bIsStartOfBlock = oSplitInfo.WasStartOfBlock ;
+ var bIsEndOfBlock = oSplitInfo.WasEndOfBlock ;
+
+ // If there is one block under a list item, modify the split so that the list item gets split as well. (Bug #1647)
+ if ( eNextBlock )
+ {
+ if ( eNextBlock.parentNode.nodeName.IEquals( 'li' ) )
+ {
+ FCKDomTools.BreakParent( eNextBlock, eNextBlock.parentNode ) ;
+ FCKDomTools.MoveNode( eNextBlock, eNextBlock.nextSibling, true ) ;
+ }
+ }
+ else if ( ePreviousBlock && ePreviousBlock.parentNode.nodeName.IEquals( 'li' ) )
+ {
+ FCKDomTools.BreakParent( ePreviousBlock, ePreviousBlock.parentNode ) ;
+ oRange.MoveToElementEditStart( ePreviousBlock.nextSibling );
+ FCKDomTools.MoveNode( ePreviousBlock, ePreviousBlock.previousSibling ) ;
+ }
+
+ // If we have both the previous and next blocks, it means that the
+ // boundaries were on separated blocks, or none of them where on the
+ // block limits (start/end).
+ if ( !bIsStartOfBlock && !bIsEndOfBlock )
+ {
+ // If the next block is an <li> with another list tree as the first child
+ // We'll need to append a placeholder or the list item wouldn't be editable. (Bug #1420)
+ if ( eNextBlock.nodeName.IEquals( 'li' ) && eNextBlock.firstChild
+ && eNextBlock.firstChild.nodeName.IEquals( ['ul', 'ol'] ) )
+ eNextBlock.insertBefore( FCKTools.GetElementDocument( eNextBlock ).createTextNode( '\xa0' ), eNextBlock.firstChild ) ;
+ // Move the selection to the end block.
+ if ( eNextBlock )
+ oRange.MoveToElementEditStart( eNextBlock ) ;
+ }
+ else
+ {
+ if ( bIsStartOfBlock && bIsEndOfBlock && ePreviousBlock.tagName.toUpperCase() == 'LI' )
+ {
+ oRange.MoveToElementStart( ePreviousBlock ) ;
+ this._OutdentWithSelection( ePreviousBlock, oRange ) ;
+ oRange.Release() ;
+ return true ;
+ }
+
+ var eNewBlock ;
+
+ if ( ePreviousBlock )
+ {
+ var sPreviousBlockTag = ePreviousBlock.tagName.toUpperCase() ;
+
+ // If is a header tag, or we are in a Shift+Enter (#77),
+ // create a new block element (later in the code).
+ if ( !this._HasShift && !(/^H[1-6]$/).test( sPreviousBlockTag ) )
+ {
+ // Otherwise, duplicate the previous block.
+ eNewBlock = FCKDomTools.CloneElement( ePreviousBlock ) ;
+ }
+ }
+ else if ( eNextBlock )
+ eNewBlock = FCKDomTools.CloneElement( eNextBlock ) ;
+
+ if ( !eNewBlock )
+ eNewBlock = this.Window.document.createElement( blockTag ) ;
+
+ // Recreate the inline elements tree, which was available
+ // before the hitting enter, so the same styles will be
+ // available in the new block.
+ var elementPath = oSplitInfo.ElementPath ;
+ if ( elementPath )
+ {
+ for ( var i = 0, len = elementPath.Elements.length ; i < len ; i++ )
+ {
+ var element = elementPath.Elements[i] ;
+
+ if ( element == elementPath.Block || element == elementPath.BlockLimit )
+ break ;
+
+ if ( FCKListsLib.InlineChildReqElements[ element.nodeName.toLowerCase() ] )
+ {
+ element = FCKDomTools.CloneElement( element ) ;
+ FCKDomTools.MoveChildren( eNewBlock, element ) ;
+ eNewBlock.appendChild( element ) ;
+ }
+ }
+ }
+
+ if ( FCKBrowserInfo.IsGeckoLike )
+ FCKTools.AppendBogusBr( eNewBlock ) ;
+
+ oRange.InsertNode( eNewBlock ) ;
+
+ // This is tricky, but to make the new block visible correctly
+ // we must select it.
+ if ( FCKBrowserInfo.IsIE )
+ {
+ // Move the selection to the new block.
+ oRange.MoveToElementEditStart( eNewBlock ) ;
+ oRange.Select() ;
+ }
+
+ // Move the selection to the new block.
+ oRange.MoveToElementEditStart( bIsStartOfBlock && !bIsEndOfBlock ? eNextBlock : eNewBlock ) ;
+ }
+
+ if ( FCKBrowserInfo.IsGeckoLike )
+ FCKDomTools.ScrollIntoView( eNextBlock || eNewBlock, false ) ;
+
+ oRange.Select() ;
+ }
+
+ // Release the resources used by the range.
+ oRange.Release() ;
+
+ return true ;
+}
+
+FCKEnterKey.prototype._ExecuteEnterBr = function( blockTag )
+{
+ // Get the current selection.
+ var oRange = new FCKDomRange( this.Window ) ;
+ oRange.MoveToSelection() ;
+
+ // The selection boundaries must be in the same "block limit" element.
+ if ( oRange.StartBlockLimit == oRange.EndBlockLimit )
+ {
+ oRange.DeleteContents() ;
+
+ // Get the new selection (it is collapsed at this point).
+ oRange.MoveToSelection() ;
+
+ var bIsStartOfBlock = oRange.CheckStartOfBlock() ;
+ var bIsEndOfBlock = oRange.CheckEndOfBlock() ;
+
+ var sStartBlockTag = oRange.StartBlock ? oRange.StartBlock.tagName.toUpperCase() : '' ;
+
+ var bHasShift = this._HasShift ;
+ var bIsPre = false ;
+
+ if ( !bHasShift && sStartBlockTag == 'LI' )
+ return this._ExecuteEnterBlock( null, oRange ) ;
+
+ // If we are at the end of a header block.
+ if ( !bHasShift && bIsEndOfBlock && (/^H[1-6]$/).test( sStartBlockTag ) )
+ {
+ // Insert a BR after the current paragraph.
+ FCKDomTools.InsertAfterNode( oRange.StartBlock, this.Window.document.createElement( 'br' ) ) ;
+
+ // The space is required by Gecko only to make the cursor blink.
+ if ( FCKBrowserInfo.IsGecko )
+ FCKDomTools.InsertAfterNode( oRange.StartBlock, this.Window.document.createTextNode( '' ) ) ;
+
+ // IE and Gecko have different behaviors regarding the position.
+ oRange.SetStart( oRange.StartBlock.nextSibling, FCKBrowserInfo.IsIE ? 3 : 1 ) ;
+ }
+ else
+ {
+ var eLineBreak ;
+ bIsPre = sStartBlockTag.IEquals( 'pre' ) ;
+ if ( bIsPre )
+ eLineBreak = this.Window.document.createTextNode( FCKBrowserInfo.IsIE ? '\r' : '\n' ) ;
+ else
+ eLineBreak = this.Window.document.createElement( 'br' ) ;
+
+ oRange.InsertNode( eLineBreak ) ;
+
+ // The space is required by Gecko only to make the cursor blink.
+ if ( FCKBrowserInfo.IsGecko )
+ FCKDomTools.InsertAfterNode( eLineBreak, this.Window.document.createTextNode( '' ) ) ;
+
+ // If we are at the end of a block, we must be sure the bogus node is available in that block.
+ if ( bIsEndOfBlock && FCKBrowserInfo.IsGeckoLike )
+ FCKTools.AppendBogusBr( eLineBreak.parentNode ) ;
+
+ if ( FCKBrowserInfo.IsIE )
+ oRange.SetStart( eLineBreak, 4 ) ;
+ else
+ oRange.SetStart( eLineBreak.nextSibling, 1 ) ;
+
+ if ( ! FCKBrowserInfo.IsIE )
+ {
+ var dummy = null ;
+ if ( FCKBrowserInfo.IsOpera )
+ dummy = this.Window.document.createElement( 'span' ) ;
+ else
+ dummy = this.Window.document.createElement( 'br' ) ;
+
+ eLineBreak.parentNode.insertBefore( dummy, eLineBreak.nextSibling ) ;
+
+ FCKDomTools.ScrollIntoView( dummy, false ) ;
+
+ dummy.parentNode.removeChild( dummy ) ;
+ }
+ }
+
+ // This collapse guarantees the cursor will be blinking.
+ oRange.Collapse( true ) ;
+
+ oRange.Select( bIsPre ) ;
+ }
+
+ // Release the resources used by the range.
+ oRange.Release() ;
+
+ return true ;
+}
+
+// Outdents a LI, maintaining the selection defined on a range.
+FCKEnterKey.prototype._OutdentWithSelection = function( li, range )
+{
+ var oBookmark = range.CreateBookmark() ;
+
+ FCKListHandler.OutdentListItem( li ) ;
+
+ range.MoveToBookmark( oBookmark ) ;
+ range.Select() ;
+}
+
+// Is all the contents under a node included by a range?
+FCKEnterKey.prototype._CheckIsAllContentsIncluded = function( range, node )
+{
+ var startOk = false ;
+ var endOk = false ;
+
+ /*
+ FCKDebug.Output( 'sc='+range.StartContainer.nodeName+
+ ',so='+range._Range.startOffset+
+ ',ec='+range.EndContainer.nodeName+
+ ',eo='+range._Range.endOffset ) ;
+ */
+ if ( range.StartContainer == node || range.StartContainer == node.firstChild )
+ startOk = ( range._Range.startOffset == 0 ) ;
+
+ if ( range.EndContainer == node || range.EndContainer == node.lastChild )
+ {
+ var nodeLength = range.EndContainer.nodeType == 3 ? range.EndContainer.length : range.EndContainer.childNodes.length ;
+ endOk = ( range._Range.endOffset == nodeLength ) ;
+ }
+
+ return startOk && endOk ;
+}
+
+// Kludge for #247
+FCKEnterKey.prototype._FixIESelectAllBug = function( range )
+{
+ var doc = this.Window.document ;
+ doc.body.innerHTML = '' ;
+ var editBlock ;
+ if ( FCKConfig.EnterMode.IEquals( ['div', 'p'] ) )
+ {
+ editBlock = doc.createElement( FCKConfig.EnterMode ) ;
+ doc.body.appendChild( editBlock ) ;
+ }
+ else
+ editBlock = doc.body ;
+
+ range.MoveToNodeContents( editBlock ) ;
+ range.Collapse( true ) ;
+ range.Select() ;
+ range.Release() ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckevents.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckevents.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,71 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKEvents Class: used to handle events is a advanced way.
+ */
+
+var FCKEvents = function( eventsOwner )
+{
+ this.Owner = eventsOwner ;
+ this._RegisteredEvents = new Object() ;
+}
+
+FCKEvents.prototype.AttachEvent = function( eventName, functionPointer )
+{
+ var aTargets ;
+
+ if ( !( aTargets = this._RegisteredEvents[ eventName ] ) )
+ this._RegisteredEvents[ eventName ] = [ functionPointer ] ;
+ else
+ {
+ // 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)
+ if ( aTargets.IndexOf( functionPointer ) == -1 )
+ aTargets.push( functionPointer ) ;
+ }
+}
+
+FCKEvents.prototype.FireEvent = function( eventName, params )
+{
+ var bReturnValue = true ;
+
+ var oCalls = this._RegisteredEvents[ eventName ] ;
+
+ if ( oCalls )
+ {
+ for ( var i = 0 ; i < oCalls.length ; i++ )
+ {
+ try
+ {
+ bReturnValue = ( oCalls[ i ]( this.Owner, params ) && bReturnValue ) ;
+ }
+ catch(e)
+ {
+ // Ignore the following error. It may happen if pointing to a
+ // script not anymore available (#934):
+ // -2146823277 = Can't execute code from a freed script
+ if ( e.number != -2146823277 )
+ throw e ;
+ }
+ }
+ }
+
+ return bReturnValue ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckhtmliterator.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckhtmliterator.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,142 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This class can be used to interate through nodes inside a range.
+ *
+ * During interation, the provided range can become invalid, due to document
+ * mutations, so CreateBookmark() used to restore it after processing, if
+ * needed.
+ */
+
+var FCKHtmlIterator = function( source )
+{
+ this._sourceHtml = source ;
+}
+FCKHtmlIterator.prototype =
+{
+ Next : function()
+ {
+ var sourceHtml = this._sourceHtml ;
+ if ( sourceHtml == null )
+ return null ;
+
+ var match = FCKRegexLib.HtmlTag.exec( sourceHtml ) ;
+ var isTag = false ;
+ var value = "" ;
+ if ( match )
+ {
+ if ( match.index > 0 )
+ {
+ value = sourceHtml.substr( 0, match.index ) ;
+ this._sourceHtml = sourceHtml.substr( match.index ) ;
+ }
+ else
+ {
+ isTag = true ;
+ value = match[0] ;
+ this._sourceHtml = sourceHtml.substr( match[0].length ) ;
+ }
+ }
+ else
+ {
+ value = sourceHtml ;
+ this._sourceHtml = null ;
+ }
+ return { 'isTag' : isTag, 'value' : value } ;
+ },
+
+ Each : function( func )
+ {
+ var chunk ;
+ while ( ( chunk = this.Next() ) )
+ func( chunk.isTag, chunk.value ) ;
+ }
+} ;
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This class can be used to interate through nodes inside a range.
+ *
+ * During interation, the provided range can become invalid, due to document
+ * mutations, so CreateBookmark() used to restore it after processing, if
+ * needed.
+ */
+
+var FCKHtmlIterator = function( source )
+{
+ this._sourceHtml = source ;
+}
+FCKHtmlIterator.prototype =
+{
+ Next : function()
+ {
+ var sourceHtml = this._sourceHtml ;
+ if ( sourceHtml == null )
+ return null ;
+
+ var match = FCKRegexLib.HtmlTag.exec( sourceHtml ) ;
+ var isTag = false ;
+ var value = "" ;
+ if ( match )
+ {
+ if ( match.index > 0 )
+ {
+ value = sourceHtml.substr( 0, match.index ) ;
+ this._sourceHtml = sourceHtml.substr( match.index ) ;
+ }
+ else
+ {
+ isTag = true ;
+ value = match[0] ;
+ this._sourceHtml = sourceHtml.substr( match[0].length ) ;
+ }
+ }
+ else
+ {
+ value = sourceHtml ;
+ this._sourceHtml = null ;
+ }
+ return { 'isTag' : isTag, 'value' : value } ;
+ },
+
+ Each : function( func )
+ {
+ var chunk ;
+ while ( ( chunk = this.Next() ) )
+ func( chunk.isTag, chunk.value ) ;
+ }
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckicon.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckicon.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,103 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKIcon Class: renders an icon from a single image, a strip or even a
+ * spacer.
+ */
+
+var FCKIcon = function( iconPathOrStripInfoArray )
+{
+ var sTypeOf = iconPathOrStripInfoArray ? typeof( iconPathOrStripInfoArray ) : 'undefined' ;
+ switch ( sTypeOf )
+ {
+ case 'number' :
+ this.Path = FCKConfig.SkinPath + 'fck_strip.gif' ;
+ this.Size = 16 ;
+ this.Position = iconPathOrStripInfoArray ;
+ break ;
+
+ case 'undefined' :
+ this.Path = FCK_SPACER_PATH ;
+ break ;
+
+ case 'string' :
+ this.Path = iconPathOrStripInfoArray ;
+ break ;
+
+ default :
+ // It is an array in the format [ StripFilePath, IconSize, IconPosition ]
+ this.Path = iconPathOrStripInfoArray[0] ;
+ this.Size = iconPathOrStripInfoArray[1] ;
+ this.Position = iconPathOrStripInfoArray[2] ;
+ }
+}
+
+FCKIcon.prototype.CreateIconElement = function( document )
+{
+ var eIcon, eIconImage ;
+
+ if ( this.Position ) // It is using an icons strip image.
+ {
+ var sPos = '-' + ( ( this.Position - 1 ) * this.Size ) + 'px' ;
+
+ if ( FCKBrowserInfo.IsIE )
+ {
+ // <div class="TB_Button_Image"><img src="strip.gif" style="top:-16px"></div>
+
+ eIcon = document.createElement( 'DIV' ) ;
+
+ eIconImage = eIcon.appendChild( document.createElement( 'IMG' ) ) ;
+ eIconImage.src = this.Path ;
+ eIconImage.style.top = sPos ;
+ }
+ else
+ {
+ // <img class="TB_Button_Image" src="spacer.gif" style="background-position: 0px -16px;background-image: url(strip.gif);">
+
+ eIcon = document.createElement( 'IMG' ) ;
+ eIcon.src = FCK_SPACER_PATH ;
+ eIcon.style.backgroundPosition = '0px ' + sPos ;
+ eIcon.style.backgroundImage = 'url("' + this.Path + '")' ;
+ }
+ }
+ else // It is using a single icon image.
+ {
+ if ( FCKBrowserInfo.IsIE )
+ {
+ // IE makes the button 1px higher if using the <img> directly, so we
+ // are changing to the <div> system to clip the image correctly.
+ eIcon = document.createElement( 'DIV' ) ;
+
+ eIconImage = eIcon.appendChild( document.createElement( 'IMG' ) ) ;
+ eIconImage.src = this.Path ? this.Path : FCK_SPACER_PATH ;
+ }
+ else
+ {
+ // This is not working well with IE. See notes above.
+ // <img class="TB_Button_Image" src="smiley.gif">
+ eIcon = document.createElement( 'IMG' ) ;
+ eIcon.src = this.Path ? this.Path : FCK_SPACER_PATH ;
+ }
+ }
+
+ eIcon.className = 'TB_Button_Image' ;
+
+ return eIcon ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckiecleanup.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckiecleanup.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,68 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKIECleanup Class: a generic class used as a tool to remove IE leaks.
+ */
+
+var FCKIECleanup = function( attachWindow )
+{
+ // If the attachWindow already have a cleanup object, just use that one.
+ if ( attachWindow._FCKCleanupObj )
+ this.Items = attachWindow._FCKCleanupObj.Items ;
+ else
+ {
+ this.Items = new Array() ;
+
+ attachWindow._FCKCleanupObj = this ;
+ FCKTools.AddEventListenerEx( attachWindow, 'unload', FCKIECleanup_Cleanup ) ;
+// attachWindow.attachEvent( 'onunload', FCKIECleanup_Cleanup ) ;
+ }
+}
+
+FCKIECleanup.prototype.AddItem = function( dirtyItem, cleanupFunction )
+{
+ this.Items.push( [ dirtyItem, cleanupFunction ] ) ;
+}
+
+function FCKIECleanup_Cleanup()
+{
+ if ( !this._FCKCleanupObj || ( FCKConfig.MsWebBrowserControlCompat && !window.FCKUnloadFlag ) )
+ return ;
+
+ var aItems = this._FCKCleanupObj.Items ;
+
+ while ( aItems.length > 0 )
+ {
+
+ // 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,
+ // 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
+ // throw some crazy memory errors (IE bug).
+ var oItem = aItems.pop() ;
+ if ( oItem )
+ oItem[1].call( oItem[0] ) ;
+ }
+
+ this._FCKCleanupObj = null ;
+
+ if ( CollectGarbage )
+ CollectGarbage() ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckimagepreloader.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckimagepreloader.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,64 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Preload a list of images, firing an event when complete.
+ */
+
+var FCKImagePreloader = function()
+{
+ this._Images = new Array() ;
+}
+
+FCKImagePreloader.prototype =
+{
+ AddImages : function( images )
+ {
+ if ( typeof( images ) == 'string' )
+ images = images.split( ';' ) ;
+
+ this._Images = this._Images.concat( images ) ;
+ },
+
+ Start : function()
+ {
+ var aImages = this._Images ;
+ this._PreloadCount = aImages.length ;
+
+ for ( var i = 0 ; i < aImages.length ; i++ )
+ {
+ var eImg = document.createElement( 'img' ) ;
+ FCKTools.AddEventListenerEx( eImg, 'load', _FCKImagePreloader_OnImage, this ) ;
+ FCKTools.AddEventListenerEx( eImg, 'error', _FCKImagePreloader_OnImage, this ) ;
+ eImg.src = aImages[i] ;
+
+ _FCKImagePreloader_ImageCache.push( eImg ) ;
+ }
+ }
+};
+
+// All preloaded images must be placed in a global array, otherwise the preload
+// magic will not happen.
+var _FCKImagePreloader_ImageCache = new Array() ;
+
+function _FCKImagePreloader_OnImage( ev, imagePreloader )
+{
+ if ( (--imagePreloader._PreloadCount) == 0 && imagePreloader.OnComplete )
+ imagePreloader.OnComplete() ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckkeystrokehandler.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckkeystrokehandler.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,141 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Control keyboard keystroke combinations.
+ */
+
+var FCKKeystrokeHandler = function( cancelCtrlDefaults )
+{
+ this.Keystrokes = new Object() ;
+ this.CancelCtrlDefaults = ( cancelCtrlDefaults !== false ) ;
+}
+
+/*
+ * Listen to keystroke events in an element or DOM document object.
+ * @target: The element or document to listen to keystroke events.
+ */
+FCKKeystrokeHandler.prototype.AttachToElement = function( target )
+{
+ // 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
+ // keypress. So we must do a longer trip in those cases.
+ FCKTools.AddEventListenerEx( target, 'keydown', _FCKKeystrokeHandler_OnKeyDown, this ) ;
+ if ( FCKBrowserInfo.IsGecko10 || FCKBrowserInfo.IsOpera || ( FCKBrowserInfo.IsGecko && FCKBrowserInfo.IsMac ) )
+ FCKTools.AddEventListenerEx( target, 'keypress', _FCKKeystrokeHandler_OnKeyPress, this ) ;
+}
+
+/*
+ * 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
+ * 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.
+ */
+FCKKeystrokeHandler.prototype.SetKeystrokes = function()
+{
+ // Look through the arguments.
+ for ( var i = 0 ; i < arguments.length ; i++ )
+ {
+ var keyDef = arguments[i] ;
+
+ // 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.
+ if ( !keyDef )
+ continue ;
+
+ if ( typeof( keyDef[0] ) == 'object' ) // It is an array with arrays defining the keystrokes.
+ this.SetKeystrokes.apply( this, keyDef ) ;
+ else
+ {
+ if ( keyDef.length == 1 ) // If it has only one element, remove the keystroke.
+ delete this.Keystrokes[ keyDef[0] ] ;
+ else // Otherwise add it.
+ this.Keystrokes[ keyDef[0] ] = keyDef[1] === true ? true : keyDef ;
+ }
+ }
+}
+
+function _FCKKeystrokeHandler_OnKeyDown( ev, keystrokeHandler )
+{
+ // Get the key code.
+ var keystroke = ev.keyCode || ev.which ;
+
+ // Combine it with the CTRL, SHIFT and ALT states.
+ var keyModifiers = 0 ;
+
+ if ( ev.ctrlKey || ev.metaKey )
+ keyModifiers += CTRL ;
+
+ if ( ev.shiftKey )
+ keyModifiers += SHIFT ;
+
+ if ( ev.altKey )
+ keyModifiers += ALT ;
+
+ var keyCombination = keystroke + keyModifiers ;
+
+ var cancelIt = keystrokeHandler._CancelIt = false ;
+
+ // Look for its definition availability.
+ var keystrokeValue = keystrokeHandler.Keystrokes[ keyCombination ] ;
+
+// FCKDebug.Output( 'KeyDown: ' + keyCombination + ' - Value: ' + keystrokeValue ) ;
+
+ // If the keystroke is defined
+ if ( keystrokeValue )
+ {
+ // If the keystroke has been explicitly set to "true" OR calling the
+ // "OnKeystroke" event, it doesn't return "true", the default behavior
+ // must be preserved.
+ if ( keystrokeValue === true || !( keystrokeHandler.OnKeystroke && keystrokeHandler.OnKeystroke.apply( keystrokeHandler, keystrokeValue ) ) )
+ return true ;
+
+ cancelIt = true ;
+ }
+
+ // 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 ) ) )
+ {
+ keystrokeHandler._CancelIt = true ;
+
+ if ( ev.preventDefault )
+ return ev.preventDefault() ;
+
+ ev.returnValue = false ;
+ ev.cancelBubble = true ;
+ return false ;
+ }
+
+ return true ;
+}
+
+function _FCKKeystrokeHandler_OnKeyPress( ev, keystrokeHandler )
+{
+ if ( keystrokeHandler._CancelIt )
+ {
+// FCKDebug.Output( 'KeyPress Cancel', 'Red') ;
+
+ if ( ev.preventDefault )
+ return ev.preventDefault() ;
+
+ return false ;
+ }
+
+ return true ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckmenublock.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckmenublock.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,153 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Renders a list of menu items.
+ */
+
+var FCKMenuBlock = function()
+{
+ this._Items = new Array() ;
+}
+
+
+FCKMenuBlock.prototype.Count = function()
+{
+ return this._Items.length ;
+}
+
+FCKMenuBlock.prototype.AddItem = function( name, label, iconPathOrStripInfoArrayOrIndex, isDisabled, customData )
+{
+ var oItem = new FCKMenuItem( this, name, label, iconPathOrStripInfoArrayOrIndex, isDisabled, customData ) ;
+
+ oItem.OnClick = FCKTools.CreateEventListener( FCKMenuBlock_Item_OnClick, this ) ;
+ oItem.OnActivate = FCKTools.CreateEventListener( FCKMenuBlock_Item_OnActivate, this ) ;
+
+ this._Items.push( oItem ) ;
+
+ return oItem ;
+}
+
+FCKMenuBlock.prototype.AddSeparator = function()
+{
+ this._Items.push( new FCKMenuSeparator() ) ;
+}
+
+FCKMenuBlock.prototype.RemoveAllItems = function()
+{
+ this._Items = new Array() ;
+
+ var eItemsTable = this._ItemsTable ;
+ if ( eItemsTable )
+ {
+ while ( eItemsTable.rows.length > 0 )
+ eItemsTable.deleteRow( 0 ) ;
+ }
+}
+
+FCKMenuBlock.prototype.Create = function( parentElement )
+{
+ if ( !this._ItemsTable )
+ {
+ if ( FCK.IECleanup )
+ FCK.IECleanup.AddItem( this, FCKMenuBlock_Cleanup ) ;
+
+ this._Window = FCKTools.GetElementWindow( parentElement ) ;
+
+ var oDoc = FCKTools.GetElementDocument( parentElement ) ;
+
+ var eTable = parentElement.appendChild( oDoc.createElement( 'table' ) ) ;
+ eTable.cellPadding = 0 ;
+ eTable.cellSpacing = 0 ;
+
+ FCKTools.DisableSelection( eTable ) ;
+
+ var oMainElement = eTable.insertRow(-1).insertCell(-1) ;
+ oMainElement.className = 'MN_Menu' ;
+
+ var eItemsTable = this._ItemsTable = oMainElement.appendChild( oDoc.createElement( 'table' ) ) ;
+ eItemsTable.cellPadding = 0 ;
+ eItemsTable.cellSpacing = 0 ;
+ }
+
+ for ( var i = 0 ; i < this._Items.length ; i++ )
+ this._Items[i].Create( this._ItemsTable ) ;
+}
+
+/* Events */
+
+function FCKMenuBlock_Item_OnClick( clickedItem, menuBlock )
+{
+ if ( menuBlock.Hide )
+ menuBlock.Hide() ;
+
+ FCKTools.RunFunction( menuBlock.OnClick, menuBlock, [ clickedItem ] ) ;
+}
+
+function FCKMenuBlock_Item_OnActivate( menuBlock )
+{
+ var oActiveItem = menuBlock._ActiveItem ;
+
+ if ( oActiveItem && oActiveItem != this )
+ {
+ // Set the focus to this menu block window (to fire OnBlur on opened panels).
+ if ( !FCKBrowserInfo.IsIE && oActiveItem.HasSubMenu && !this.HasSubMenu )
+ {
+ menuBlock._Window.focus() ;
+
+ // Due to the event model provided by Opera, we need to set
+ // HasFocus here as the above focus() call will not fire the focus
+ // event in the panel immediately (#1200).
+ menuBlock.Panel.HasFocus = true ;
+ }
+
+ oActiveItem.Deactivate() ;
+ }
+
+ menuBlock._ActiveItem = this ;
+}
+
+function FCKMenuBlock_Cleanup()
+{
+ this._Window = null ;
+ this._ItemsTable = null ;
+}
+
+// ################# //
+
+var FCKMenuSeparator = function()
+{}
+
+FCKMenuSeparator.prototype.Create = function( parentTable )
+{
+ var oDoc = FCKTools.GetElementDocument( parentTable ) ;
+
+ var r = parentTable.insertRow(-1) ;
+
+ var eCell = r.insertCell(-1) ;
+ eCell.className = 'MN_Separator MN_Icon' ;
+
+ eCell = r.insertCell(-1) ;
+ eCell.className = 'MN_Separator' ;
+ eCell.appendChild( oDoc.createElement( 'DIV' ) ).className = 'MN_Separator_Line' ;
+
+ eCell = r.insertCell(-1) ;
+ eCell.className = 'MN_Separator' ;
+ eCell.appendChild( oDoc.createElement( 'DIV' ) ).className = 'MN_Separator_Line' ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckmenublockpanel.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckmenublockpanel.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,54 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This class is a menu block that behaves like a panel. It's a mix of the
+ * FCKMenuBlock and FCKPanel classes.
+ */
+
+var FCKMenuBlockPanel = function()
+{
+ // Call the "base" constructor.
+ FCKMenuBlock.call( this ) ;
+}
+
+FCKMenuBlockPanel.prototype = new FCKMenuBlock() ;
+
+
+// Override the create method.
+FCKMenuBlockPanel.prototype.Create = function()
+{
+ var oPanel = this.Panel = ( this.Parent && this.Parent.Panel ? this.Parent.Panel.CreateChildPanel() : new FCKPanel() ) ;
+ oPanel.AppendStyleSheet( FCKConfig.SkinEditorCSS ) ;
+
+ // Call the "base" implementation.
+ FCKMenuBlock.prototype.Create.call( this, oPanel.MainNode ) ;
+}
+
+FCKMenuBlockPanel.prototype.Show = function( x, y, relElement )
+{
+ if ( !this.Panel.CheckIsOpened() )
+ this.Panel.Show( x, y, relElement ) ;
+}
+
+FCKMenuBlockPanel.prototype.Hide = function()
+{
+ if ( this.Panel.CheckIsOpened() )
+ this.Panel.Hide() ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckmenuitem.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckmenuitem.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,161 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Defines and renders a menu items in a menu block.
+ */
+
+var FCKMenuItem = function( parentMenuBlock, name, label, iconPathOrStripInfoArray, isDisabled, customData )
+{
+ this.Name = name ;
+ this.Label = label || name ;
+ this.IsDisabled = isDisabled ;
+
+ this.Icon = new FCKIcon( iconPathOrStripInfoArray ) ;
+
+ this.SubMenu = new FCKMenuBlockPanel() ;
+ this.SubMenu.Parent = parentMenuBlock ;
+ this.SubMenu.OnClick = FCKTools.CreateEventListener( FCKMenuItem_SubMenu_OnClick, this ) ;
+ this.CustomData = customData ;
+
+ if ( FCK.IECleanup )
+ FCK.IECleanup.AddItem( this, FCKMenuItem_Cleanup ) ;
+}
+
+
+FCKMenuItem.prototype.AddItem = function( name, label, iconPathOrStripInfoArrayOrIndex, isDisabled, customData )
+{
+ this.HasSubMenu = true ;
+ return this.SubMenu.AddItem( name, label, iconPathOrStripInfoArrayOrIndex, isDisabled, customData ) ;
+}
+
+FCKMenuItem.prototype.AddSeparator = function()
+{
+ this.SubMenu.AddSeparator() ;
+}
+
+FCKMenuItem.prototype.Create = function( parentTable )
+{
+ var bHasSubMenu = this.HasSubMenu ;
+
+ var oDoc = FCKTools.GetElementDocument( parentTable ) ;
+
+ // Add a row in the table to hold the menu item.
+ var r = this.MainElement = parentTable.insertRow(-1) ;
+ r.className = this.IsDisabled ? 'MN_Item_Disabled' : 'MN_Item' ;
+
+ // Set the row behavior.
+ if ( !this.IsDisabled )
+ {
+ FCKTools.AddEventListenerEx( r, 'mouseover', FCKMenuItem_OnMouseOver, [ this ] ) ;
+ FCKTools.AddEventListenerEx( r, 'click', FCKMenuItem_OnClick, [ this ] ) ;
+
+ if ( !bHasSubMenu )
+ FCKTools.AddEventListenerEx( r, 'mouseout', FCKMenuItem_OnMouseOut, [ this ] ) ;
+ }
+
+ // Create the icon cell.
+ var eCell = r.insertCell(-1) ;
+ eCell.className = 'MN_Icon' ;
+ eCell.appendChild( this.Icon.CreateIconElement( oDoc ) ) ;
+
+ // Create the label cell.
+ eCell = r.insertCell(-1) ;
+ eCell.className = 'MN_Label' ;
+ eCell.noWrap = true ;
+ eCell.appendChild( oDoc.createTextNode( this.Label ) ) ;
+
+ // Create the arrow cell and setup the sub menu panel (if needed).
+ eCell = r.insertCell(-1) ;
+ if ( bHasSubMenu )
+ {
+ eCell.className = 'MN_Arrow' ;
+
+ // The arrow is a fixed size image.
+ var eArrowImg = eCell.appendChild( oDoc.createElement( 'IMG' ) ) ;
+ eArrowImg.src = FCK_IMAGES_PATH + 'arrow_' + FCKLang.Dir + '.gif' ;
+ eArrowImg.width = 4 ;
+ eArrowImg.height = 7 ;
+
+ this.SubMenu.Create() ;
+ this.SubMenu.Panel.OnHide = FCKTools.CreateEventListener( FCKMenuItem_SubMenu_OnHide, this ) ;
+ }
+}
+
+FCKMenuItem.prototype.Activate = function()
+{
+ this.MainElement.className = 'MN_Item_Over' ;
+
+ if ( this.HasSubMenu )
+ {
+ // 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
+ // could change the skin and so the final result would not be accurate.
+ // For now it is ok because we are controlling the skin.
+ this.SubMenu.Show( this.MainElement.offsetWidth + 2, -2, this.MainElement ) ;
+ }
+
+ FCKTools.RunFunction( this.OnActivate, this ) ;
+}
+
+FCKMenuItem.prototype.Deactivate = function()
+{
+ this.MainElement.className = 'MN_Item' ;
+
+ if ( this.HasSubMenu )
+ this.SubMenu.Hide() ;
+}
+
+/* Events */
+
+function FCKMenuItem_SubMenu_OnClick( clickedItem, listeningItem )
+{
+ FCKTools.RunFunction( listeningItem.OnClick, listeningItem, [ clickedItem ] ) ;
+}
+
+function FCKMenuItem_SubMenu_OnHide( menuItem )
+{
+ menuItem.Deactivate() ;
+}
+
+function FCKMenuItem_OnClick( ev, menuItem )
+{
+ if ( menuItem.HasSubMenu )
+ menuItem.Activate() ;
+ else
+ {
+ menuItem.Deactivate() ;
+ FCKTools.RunFunction( menuItem.OnClick, menuItem, [ menuItem ] ) ;
+ }
+}
+
+function FCKMenuItem_OnMouseOver( ev, menuItem )
+{
+ menuItem.Activate() ;
+}
+
+function FCKMenuItem_OnMouseOut( ev, menuItem )
+{
+ menuItem.Deactivate() ;
+}
+
+function FCKMenuItem_Cleanup()
+{
+ this.MainElement = null ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckpanel.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckpanel.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,386 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Component that creates floating panels. It is used by many
+ * other components, like the toolbar items, context menu, etc...
+ */
+
+var FCKPanel = function( parentWindow )
+{
+ this.IsRTL = ( FCKLang.Dir == 'rtl' ) ;
+ this.IsContextMenu = false ;
+ this._LockCounter = 0 ;
+
+ this._Window = parentWindow || window ;
+
+ var oDocument ;
+
+ if ( FCKBrowserInfo.IsIE )
+ {
+ // Create the Popup that will hold the panel.
+ // The popup has to be created before playing with domain hacks, see #1666.
+ this._Popup = this._Window.createPopup() ;
+
+ // this._Window cannot be accessed while playing with domain hacks, but local variable is ok.
+ // See #1666.
+ var pDoc = this._Window.document ;
+
+ // 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
+ // document inside of it, and the set the proper domain for it. (#123)
+ if ( FCK_IS_CUSTOM_DOMAIN && !FCKBrowserInfo.IsIE7 )
+ {
+ pDoc.domain = FCK_ORIGINAL_DOMAIN ;
+ document.domain = FCK_ORIGINAL_DOMAIN ;
+ }
+
+ oDocument = this.Document = this._Popup.document ;
+
+ // Set the proper domain inside the popup.
+ if ( FCK_IS_CUSTOM_DOMAIN )
+ {
+ oDocument.domain = FCK_RUNTIME_DOMAIN ;
+ pDoc.domain = FCK_RUNTIME_DOMAIN ;
+ document.domain = FCK_RUNTIME_DOMAIN ;
+ }
+
+ FCK.IECleanup.AddItem( this, FCKPanel_Cleanup ) ;
+ }
+ else
+ {
+ var oIFrame = this._IFrame = this._Window.document.createElement('iframe') ;
+ FCKTools.ResetStyles( oIFrame );
+ oIFrame.src = 'javascript:void(0)' ;
+ oIFrame.allowTransparency = true ;
+ oIFrame.frameBorder = '0' ;
+ oIFrame.scrolling = 'no' ;
+ oIFrame.style.width = oIFrame.style.height = '0px' ;
+ FCKDomTools.SetElementStyles( oIFrame,
+ {
+ position : 'absolute',
+ zIndex : FCKConfig.FloatingPanelsZIndex
+ } ) ;
+
+ this._Window.document.body.appendChild( oIFrame ) ;
+
+ var oIFrameWindow = oIFrame.contentWindow ;
+
+ oDocument = this.Document = oIFrameWindow.document ;
+
+ // Workaround for Safari 12256. Ticket #63
+ var sBase = '' ;
+ if ( FCKBrowserInfo.IsSafari )
+ sBase = '<base href="' + window.document.location + '">' ;
+
+ // Initialize the IFRAME document body.
+ oDocument.open() ;
+ 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 ) ;
+
+ FCKTools.AddEventListenerEx( oIFrameWindow, 'focus', FCKPanel_Window_OnFocus, this ) ;
+ FCKTools.AddEventListenerEx( oIFrameWindow, 'blur', FCKPanel_Window_OnBlur, this ) ;
+ }
+
+ oDocument.dir = FCKLang.Dir ;
+
+ 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') ) ;
+
+ // 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 )
+{
+ FCKTools.AppendStyleSheet( this.Document, styleSheet ) ;
+}
+
+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
+ // be able to use that values in the second call (IE only).
+ if ( this._Popup )
+ this._Popup.show( x, y, 0, 0, relElement ) ;
+}
+
+FCKPanel.prototype.Show = function( x, y, relElement, width, height )
+{
+ var iMainWidth ;
+ var eMainNode = this.MainNode ;
+
+ 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
+ // 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.
+ FCKDomTools.SetElementStyles( eMainNode,
+ {
+ width : width ? width + 'px' : '',
+ height : height ? height + 'px' : ''
+ } ) ;
+
+ iMainWidth = eMainNode.offsetWidth ;
+
+ if ( this.IsRTL )
+ {
+ if ( this.IsContextMenu )
+ x = x - iMainWidth + 1 ;
+ 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 ) ;
+
+ if ( this.OnHide )
+ {
+ if ( this._Timer )
+ CheckPopupOnHide.call( this, true ) ;
+
+ this._Timer = FCKTools.SetInterval( CheckPopupOnHide, 100, this ) ;
+ }
+ }
+ else
+ {
+ // Do not fire OnBlur while the panel is opened.
+ if ( typeof( FCK.ToolbarSet.CurrentInstance.FocusManager ) != 'undefined' )
+ FCK.ToolbarSet.CurrentInstance.FocusManager.Lock() ;
+
+ if ( this.ParentPanel )
+ {
+ this.ParentPanel.Lock() ;
+
+ // Due to a bug on FF3, we must ensure that the parent panel will
+ // blur (#1584).
+ FCKPanel_Window_OnBlur( null, this.ParentPanel ) ;
+ }
+
+ // Toggle the iframe scrolling attribute to prevent the panel
+ // scrollbars from disappearing in FF Mac. (#191)
+ if ( FCKBrowserInfo.IsGecko && FCKBrowserInfo.IsMac )
+ {
+ 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
+ // instead of returning the editor to a "no panel" state (Bug #1514).
+ if ( FCK.ToolbarSet.CurrentInstance.GetInstanceObject( 'FCKPanel' )._OpenedPanel &&
+ FCK.ToolbarSet.CurrentInstance.GetInstanceObject( 'FCKPanel' )._OpenedPanel != this )
+ FCK.ToolbarSet.CurrentInstance.GetInstanceObject( 'FCKPanel' )._OpenedPanel.Hide( false, true ) ;
+
+ FCKDomTools.SetElementStyles( eMainNode,
+ {
+ width : width ? width + 'px' : '',
+ height : height ? height + 'px' : ''
+ } ) ;
+
+ iMainWidth = eMainNode.offsetWidth ;
+
+ 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,
+ // 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).
+ iMainWidth = eMainNode.offsetWidth || eMainNode.firstChild.offsetWidth ;
+
+ // Base the popup coordinates upon the coordinates of relElement.
+ var oPos = FCKTools.GetDocumentPosition( this._Window,
+ relElement.nodeType == 9 ?
+ ( 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 ) ;
+ if ( positionedAncestor )
+ {
+ var nPos = FCKTools.GetDocumentPosition( FCKTools.GetElementWindow( positionedAncestor ), positionedAncestor ) ;
+ oPos.x -= nPos.x ;
+ oPos.y -= nPos.y ;
+ }
+
+ if ( this.IsRTL && !this.IsContextMenu )
+ x = ( x * -1 ) ;
+
+ x += oPos.x ;
+ y += oPos.y ;
+
+ if ( this.IsRTL )
+ {
+ if ( this.IsContextMenu )
+ x = x - iMainWidth + 1 ;
+ else if ( relElement )
+ x = x + relElement.offsetWidth - iMainWidth ;
+ }
+ else
+ {
+ var oViewPaneSize = FCKTools.GetViewPaneSize( this._Window ) ;
+ var oScrollPosition = FCKTools.GetScrollPosition( this._Window ) ;
+
+ var iViewPaneHeight = oViewPaneSize.Height + oScrollPosition.Y ;
+ var iViewPaneWidth = oViewPaneSize.Width + oScrollPosition.X ;
+
+ if ( ( x + iMainWidth ) > iViewPaneWidth )
+ x -= x + iMainWidth - iViewPaneWidth ;
+
+ if ( ( y + eMainNode.offsetHeight ) > iViewPaneHeight )
+ y -= y + eMainNode.offsetHeight - iViewPaneHeight ;
+ }
+
+ // Set the context menu DIV in the specified location.
+ FCKDomTools.SetElementStyles( this._IFrame,
+ {
+ left : x + 'px',
+ top : y + 'px'
+ } ) ;
+
+ // Move the focus to the IFRAME so we catch the "onblur".
+ this._IFrame.contentWindow.focus() ;
+ this._IsOpened = true ;
+
+ var me = this ;
+ this._resizeTimer = setTimeout( function()
+ {
+ var iWidth = eMainNode.offsetWidth || eMainNode.firstChild.offsetWidth ;
+ var iHeight = eMainNode.offsetHeight ;
+ me._IFrame.style.width = iWidth + 'px' ;
+ me._IFrame.style.height = iHeight + 'px' ;
+
+ }, 0 ) ;
+
+ FCK.ToolbarSet.CurrentInstance.GetInstanceObject( 'FCKPanel' )._OpenedPanel = this ;
+ }
+
+ FCKTools.RunFunction( this.OnShow, this ) ;
+}
+
+FCKPanel.prototype.Hide = function( ignoreOnHide, ignoreFocusManagerUnlock )
+{
+ if ( this._Popup )
+ this._Popup.hide() ;
+ else
+ {
+ if ( !this._IsOpened || this._LockCounter > 0 )
+ return ;
+
+ // Enable the editor to fire the "OnBlur".
+ if ( typeof( FCKFocusManager ) != 'undefined' && !ignoreFocusManagerUnlock )
+ FCKFocusManager.Unlock() ;
+
+ // It is better to set the sizes to 0, otherwise Firefox would have
+ // rendering problems.
+ this._IFrame.style.width = this._IFrame.style.height = '0px' ;
+
+ this._IsOpened = false ;
+
+ if ( this._resizeTimer )
+ {
+ clearTimeout( this._resizeTimer ) ;
+ this._resizeTimer = null ;
+ }
+
+ if ( this.ParentPanel )
+ this.ParentPanel.Unlock() ;
+
+ if ( !ignoreOnHide )
+ FCKTools.RunFunction( this.OnHide, this ) ;
+ }
+}
+
+FCKPanel.prototype.CheckIsOpened = function()
+{
+ if ( this._Popup )
+ return this._Popup.isOpen ;
+ else
+ return this._IsOpened ;
+}
+
+FCKPanel.prototype.CreateChildPanel = function()
+{
+ var oWindow = this._Popup ? FCKTools.GetDocumentWindow( this.Document ) : this._Window ;
+
+ var oChildPanel = new FCKPanel( oWindow ) ;
+ oChildPanel.ParentPanel = this ;
+
+ return oChildPanel ;
+}
+
+FCKPanel.prototype.Lock = function()
+{
+ this._LockCounter++ ;
+}
+
+FCKPanel.prototype.Unlock = function()
+{
+ if ( --this._LockCounter == 0 && !this.HasFocus )
+ this.Hide() ;
+}
+
+/* Events */
+
+function FCKPanel_Window_OnFocus( e, panel )
+{
+ panel.HasFocus = true ;
+}
+
+function FCKPanel_Window_OnBlur( e, panel )
+{
+ panel.HasFocus = false ;
+
+ if ( panel._LockCounter == 0 )
+ FCKTools.RunFunction( panel.Hide, panel ) ;
+}
+
+function CheckPopupOnHide( forceHide )
+{
+ if ( forceHide || !this._Popup.isOpen )
+ {
+ window.clearInterval( this._Timer ) ;
+ this._Timer = null ;
+
+ FCKTools.RunFunction( this.OnHide, this ) ;
+ }
+}
+
+function FCKPanel_Cleanup()
+{
+ this._Popup = null ;
+ this._Window = null ;
+ this.Document = null ;
+ this.MainNode = null ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckplugin.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckplugin.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,56 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKPlugin Class: Represents a single plugin.
+ */
+
+var FCKPlugin = function( name, availableLangs, basePath )
+{
+ this.Name = name ;
+ this.BasePath = basePath ? basePath : FCKConfig.PluginsPath ;
+ this.Path = this.BasePath + name + '/' ;
+
+ if ( !availableLangs || availableLangs.length == 0 )
+ this.AvailableLangs = new Array() ;
+ else
+ this.AvailableLangs = availableLangs.split(',') ;
+}
+
+FCKPlugin.prototype.Load = function()
+{
+ // Load the language file, if defined.
+ if ( this.AvailableLangs.length > 0 )
+ {
+ var sLang ;
+
+ // Check if the plugin has the language file for the active language.
+ if ( this.AvailableLangs.IndexOf( FCKLanguageManager.ActiveLanguage.Code ) >= 0 )
+ sLang = FCKLanguageManager.ActiveLanguage.Code ;
+ else
+ // Load the default language file (first one) if the current one is not available.
+ sLang = this.AvailableLangs[0] ;
+
+ // Add the main plugin script.
+ LoadScript( this.Path + 'lang/' + sLang + '.js' ) ;
+ }
+
+ // Add the main plugin script.
+ LoadScript( this.Path + 'fckplugin.js' ) ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckspecialcombo.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckspecialcombo.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,376 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKSpecialCombo Class: represents a special combo.
+ */
+
+var FCKSpecialCombo = function( caption, fieldWidth, panelWidth, panelMaxHeight, parentWindow )
+{
+ // Default properties values.
+ this.FieldWidth = fieldWidth || 100 ;
+ this.PanelWidth = panelWidth || 150 ;
+ this.PanelMaxHeight = panelMaxHeight || 150 ;
+ this.Label = ' ' ;
+ this.Caption = caption ;
+ this.Tooltip = caption ;
+ this.Style = FCK_TOOLBARITEM_ICONTEXT ;
+
+ this.Enabled = true ;
+
+ this.Items = new Object() ;
+
+ this._Panel = new FCKPanel( parentWindow || window ) ;
+ this._Panel.AppendStyleSheet( FCKConfig.SkinEditorCSS ) ;
+ this._PanelBox = this._Panel.MainNode.appendChild( this._Panel.Document.createElement( 'DIV' ) ) ;
+ this._PanelBox.className = 'SC_Panel' ;
+ 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._ItemsHolderEl = this._PanelBox.getElementsByTagName('TD')[0] ;
+
+ if ( FCK.IECleanup )
+ FCK.IECleanup.AddItem( this, FCKSpecialCombo_Cleanup ) ;
+
+// this._Panel.StyleSheet = FCKConfig.SkinPath + 'fck_contextmenu.css' ;
+// this._Panel.Create() ;
+// 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._ItemsHolderEl = this._Panel.PanelDiv.getElementsByTagName('TD')[0] ;
+}
+
+function FCKSpecialCombo_ItemOnMouseOver()
+{
+ this.className += ' SC_ItemOver' ;
+}
+
+function FCKSpecialCombo_ItemOnMouseOut()
+{
+ this.className = this.originalClass ;
+}
+
+function FCKSpecialCombo_ItemOnClick( ev, specialCombo, itemId )
+{
+ this.className = this.originalClass ;
+
+ specialCombo._Panel.Hide() ;
+
+ specialCombo.SetLabel( this.FCKItemLabel ) ;
+
+ if ( typeof( specialCombo.OnSelect ) == 'function' )
+ specialCombo.OnSelect( itemId, this ) ;
+}
+
+FCKSpecialCombo.prototype.ClearItems = function ()
+{
+ if ( this.Items )
+ this.Items = {} ;
+
+ var itemsholder = this._ItemsHolderEl ;
+ while ( itemsholder.firstChild )
+ itemsholder.removeChild( itemsholder.firstChild ) ;
+}
+
+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>
+ var oDiv = this._ItemsHolderEl.appendChild( this._Panel.Document.createElement( 'DIV' ) ) ;
+ oDiv.className = oDiv.originalClass = 'SC_Item' ;
+ oDiv.innerHTML = html ;
+ oDiv.FCKItemLabel = label || id ;
+ oDiv.Selected = false ;
+
+ // In IE, the width must be set so the borders are shown correctly when the content overflows.
+ if ( FCKBrowserInfo.IsIE )
+ oDiv.style.width = '100%' ;
+
+ if ( bgColor )
+ oDiv.style.backgroundColor = bgColor ;
+
+ FCKTools.AddEventListenerEx( oDiv, 'mouseover', FCKSpecialCombo_ItemOnMouseOver ) ;
+ FCKTools.AddEventListenerEx( oDiv, 'mouseout', FCKSpecialCombo_ItemOnMouseOut ) ;
+ FCKTools.AddEventListenerEx( oDiv, 'click', FCKSpecialCombo_ItemOnClick, [ this, id ] ) ;
+
+ this.Items[ id.toString().toLowerCase() ] = oDiv ;
+
+ return oDiv ;
+}
+
+FCKSpecialCombo.prototype.SelectItem = function( item )
+{
+ if ( typeof item == 'string' )
+ item = this.Items[ item.toString().toLowerCase() ] ;
+
+ if ( item )
+ {
+ item.className = item.originalClass = 'SC_ItemSelected' ;
+ item.Selected = true ;
+ }
+}
+
+FCKSpecialCombo.prototype.SelectItemByLabel = function( itemLabel, setLabel )
+{
+ for ( var id in this.Items )
+ {
+ var oDiv = this.Items[id] ;
+
+ if ( oDiv.FCKItemLabel == itemLabel )
+ {
+ oDiv.className = oDiv.originalClass = 'SC_ItemSelected' ;
+ oDiv.Selected = true ;
+
+ if ( setLabel )
+ this.SetLabel( itemLabel ) ;
+ }
+ }
+}
+
+FCKSpecialCombo.prototype.DeselectAll = function( clearLabel )
+{
+ for ( var i in this.Items )
+ {
+ if ( !this.Items[i] ) continue;
+ this.Items[i].className = this.Items[i].originalClass = 'SC_Item' ;
+ this.Items[i].Selected = false ;
+ }
+
+ if ( clearLabel )
+ this.SetLabel( '' ) ;
+}
+
+FCKSpecialCombo.prototype.SetLabelById = function( id )
+{
+ id = id ? id.toString().toLowerCase() : '' ;
+
+ var oDiv = this.Items[ id ] ;
+ this.SetLabel( oDiv ? oDiv.FCKItemLabel : '' ) ;
+}
+
+FCKSpecialCombo.prototype.SetLabel = function( text )
+{
+ text = ( !text || text.length == 0 ) ? ' ' : text ;
+
+ if ( text == this.Label )
+ return ;
+
+ this.Label = text ;
+
+ var labelEl = this._LabelEl ;
+ if ( labelEl )
+ {
+ labelEl.innerHTML = text ;
+
+ // 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
+ // combo will get the selection from the editing area. So we must
+ // disable any kind of selection here.
+ FCKTools.DisableSelection( labelEl ) ;
+ }
+}
+
+FCKSpecialCombo.prototype.SetEnabled = function( isEnabled )
+{
+ this.Enabled = isEnabled ;
+
+ // In IE it can happen when the page is reloaded that _OuterTable is null, so check its existence
+ if ( this._OuterTable )
+ this._OuterTable.className = isEnabled ? '' : 'SC_FieldDisabled' ;
+}
+
+FCKSpecialCombo.prototype.Create = function( targetElement )
+{
+ var oDoc = FCKTools.GetElementDocument( targetElement ) ;
+ var eOuterTable = this._OuterTable = targetElement.appendChild( oDoc.createElement( 'TABLE' ) ) ;
+ eOuterTable.cellPadding = 0 ;
+ eOuterTable.cellSpacing = 0 ;
+
+ eOuterTable.insertRow(-1) ;
+
+ var sClass ;
+ var bShowLabel ;
+
+ switch ( this.Style )
+ {
+ case FCK_TOOLBARITEM_ONLYICON :
+ sClass = 'TB_ButtonType_Icon' ;
+ bShowLabel = false;
+ break ;
+ case FCK_TOOLBARITEM_ONLYTEXT :
+ sClass = 'TB_ButtonType_Text' ;
+ bShowLabel = false;
+ break ;
+ case FCK_TOOLBARITEM_ICONTEXT :
+ bShowLabel = true;
+ break ;
+ }
+
+ if ( this.Caption && this.Caption.length > 0 && bShowLabel )
+ {
+ var oCaptionCell = eOuterTable.rows[0].insertCell(-1) ;
+ oCaptionCell.innerHTML = this.Caption ;
+ oCaptionCell.className = 'SC_FieldCaption' ;
+ }
+
+ // Create the main DIV element.
+ var oField = FCKTools.AppendElement( eOuterTable.rows[0].insertCell(-1), 'div' ) ;
+ if ( bShowLabel )
+ {
+ oField.className = 'SC_Field' ;
+ oField.style.width = this.FieldWidth + 'px' ;
+ oField.innerHTML = '<table width="100%" cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldLabel"><label> </label></td><td class="SC_FieldButton"> </td></tr></tbody></table>' ;
+
+ this._LabelEl = oField.getElementsByTagName('label')[0] ; // Memory Leak
+ this._LabelEl.innerHTML = this.Label ;
+ }
+ else
+ {
+ oField.className = 'TB_Button_Off' ;
+ //oField.innerHTML = '<span className="SC_FieldCaption">' + this.Caption + '<table cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldButton" style="border-left: none;"> </td></tr></tbody></table>' ;
+ //oField.innerHTML = '<table cellpadding="0" cellspacing="0" style="TABLE-LAYOUT: fixed;"><tbody><tr><td class="SC_FieldButton" style="border-left: none;"> </td></tr></tbody></table>' ;
+
+ // Gets the correct CSS class to use for the specified style (param).
+ oField.innerHTML = '<table title="' + this.Tooltip + '" class="' + sClass + '" cellspacing="0" cellpadding="0" border="0">' +
+ '<tr>' +
+ //'<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 class="TB_Text">' + this.Caption + '</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><img class="TB_Button_Padding" src="' + FCK_SPACER_PATH + '" /></td>' +
+ '</tr>' +
+ '</table>' ;
+ }
+
+
+ // Events Handlers
+
+ FCKTools.AddEventListenerEx( oField, 'mouseover', FCKSpecialCombo_OnMouseOver, this ) ;
+ FCKTools.AddEventListenerEx( oField, 'mouseout', FCKSpecialCombo_OnMouseOut, this ) ;
+ FCKTools.AddEventListenerEx( oField, 'click', FCKSpecialCombo_OnClick, this ) ;
+
+ FCKTools.DisableSelection( this._Panel.Document.body ) ;
+}
+
+function FCKSpecialCombo_Cleanup()
+{
+ this._LabelEl = null ;
+ this._OuterTable = null ;
+ this._ItemsHolderEl = null ;
+ this._PanelBox = null ;
+
+ if ( this.Items )
+ {
+ for ( var key in this.Items )
+ this.Items[key] = null ;
+ }
+}
+
+function FCKSpecialCombo_OnMouseOver( ev, specialCombo )
+{
+ if ( specialCombo.Enabled )
+ {
+ switch ( specialCombo.Style )
+ {
+ case FCK_TOOLBARITEM_ONLYICON :
+ this.className = 'TB_Button_On_Over';
+ break ;
+ case FCK_TOOLBARITEM_ONLYTEXT :
+ this.className = 'TB_Button_On_Over';
+ break ;
+ case FCK_TOOLBARITEM_ICONTEXT :
+ this.className = 'SC_Field SC_FieldOver' ;
+ break ;
+ }
+ }
+}
+
+function FCKSpecialCombo_OnMouseOut( ev, specialCombo )
+{
+ switch ( specialCombo.Style )
+ {
+ case FCK_TOOLBARITEM_ONLYICON :
+ this.className = 'TB_Button_Off';
+ break ;
+ case FCK_TOOLBARITEM_ONLYTEXT :
+ this.className = 'TB_Button_Off';
+ break ;
+ case FCK_TOOLBARITEM_ICONTEXT :
+ this.className='SC_Field' ;
+ break ;
+ }
+}
+
+function FCKSpecialCombo_OnClick( e, specialCombo )
+{
+ // For Mozilla we must stop the event propagation to avoid it hiding
+ // the panel because of a click outside of it.
+// if ( e )
+// {
+// e.stopPropagation() ;
+// FCKPanelEventHandlers.OnDocumentClick( e ) ;
+// }
+
+ if ( specialCombo.Enabled )
+ {
+ var oPanel = specialCombo._Panel ;
+ var oPanelBox = specialCombo._PanelBox ;
+ var oItemsHolder = specialCombo._ItemsHolderEl ;
+ var iMaxHeight = specialCombo.PanelMaxHeight ;
+
+ if ( specialCombo.OnBeforeClick )
+ specialCombo.OnBeforeClick( specialCombo ) ;
+
+ // This is a tricky thing. We must call the "Load" function, otherwise
+ // it will not be possible to retrieve "oItemsHolder.offsetHeight" (IE only).
+ if ( FCKBrowserInfo.IsIE )
+ oPanel.Preload( 0, this.offsetHeight, this ) ;
+
+ if ( oItemsHolder.offsetHeight > iMaxHeight )
+// {
+ oPanelBox.style.height = iMaxHeight + 'px' ;
+
+// if ( FCKBrowserInfo.IsGecko )
+// oPanelBox.style.overflow = '-moz-scrollbars-vertical' ;
+// }
+ else
+ oPanelBox.style.height = '' ;
+
+// oPanel.PanelDiv.style.width = specialCombo.PanelWidth + 'px' ;
+
+ oPanel.Show( 0, this.offsetHeight, this ) ;
+ }
+
+// return false ;
+}
+
+/*
+Sample Combo Field HTML output:
+
+<div class="SC_Field" style="width: 80px;">
+ <table width="100%" cellpadding="0" cellspacing="0" style="table-layout: fixed;">
+ <tbody>
+ <tr>
+ <td class="SC_FieldLabel"><label> </label></td>
+ <td class="SC_FieldButton"> </td>
+ </tr>
+ </tbody>
+ </table>
+</div>
+*/
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckstyle.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckstyle.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,1500 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKStyle Class: contains a style definition, and all methods to work with
+ * the style in a document.
+ */
+
+/**
+ * @param {Object} styleDesc A "style descriptor" object, containing the raw
+ * style definition in the following format:
+ * '<style name>' : {
+ * Element : '<element name>',
+ * Attributes : {
+ * '<att name>' : '<att value>',
+ * ...
+ * },
+ * Styles : {
+ * '<style name>' : '<style value>',
+ * ...
+ * },
+ * Overrides : '<element name>'|{
+ * Element : '<element name>',
+ * Attributes : {
+ * '<att name>' : '<att value>'|/<att regex>/
+ * },
+ * Styles : {
+ * '<style name>' : '<style value>'|/<style regex>/
+ * },
+ * }
+ * }
+ */
+var FCKStyle = function( styleDesc )
+{
+ this.Element = ( styleDesc.Element || 'span' ).toLowerCase() ;
+ this._StyleDesc = styleDesc ;
+}
+
+FCKStyle.prototype =
+{
+ /**
+ * Get the style type, based on its element name:
+ * - FCK_STYLE_BLOCK (0): Block Style
+ * - FCK_STYLE_INLINE (1): Inline Style
+ * - FCK_STYLE_OBJECT (2): Object Style
+ */
+ GetType : function()
+ {
+ var type = this.GetType_$ ;
+
+ if ( type != undefined )
+ return type ;
+
+ var elementName = this.Element ;
+
+ if ( elementName == '#' || FCKListsLib.StyleBlockElements[ elementName ] )
+ type = FCK_STYLE_BLOCK ;
+ else if ( FCKListsLib.StyleObjectElements[ elementName ] )
+ type = FCK_STYLE_OBJECT ;
+ else
+ type = FCK_STYLE_INLINE ;
+
+ return ( this.GetType_$ = type ) ;
+ },
+
+ /**
+ * Apply the style to the current selection.
+ */
+ ApplyToSelection : function( targetWindow )
+ {
+ // Create a range for the current selection.
+ var range = new FCKDomRange( targetWindow ) ;
+ range.MoveToSelection() ;
+
+ this.ApplyToRange( range, true ) ;
+ },
+
+ /**
+ * Apply the style to a FCKDomRange.
+ */
+ ApplyToRange : function( range, selectIt, updateRange )
+ {
+ // ApplyToRange is not valid for FCK_STYLE_OBJECT types.
+ // Use ApplyToObject instead.
+
+ switch ( this.GetType() )
+ {
+ case FCK_STYLE_BLOCK :
+ this.ApplyToRange = this._ApplyBlockStyle ;
+ break ;
+ case FCK_STYLE_INLINE :
+ this.ApplyToRange = this._ApplyInlineStyle ;
+ break ;
+ default :
+ return ;
+ }
+
+ this.ApplyToRange( range, selectIt, updateRange ) ;
+ },
+
+ /**
+ * Apply the style to an object. Valid for FCK_STYLE_BLOCK types only.
+ */
+ ApplyToObject : function( objectElement )
+ {
+ if ( !objectElement )
+ return ;
+
+ this.BuildElement( null, objectElement ) ;
+ },
+
+ /**
+ * Remove the style from the current selection.
+ */
+ RemoveFromSelection : function( targetWindow )
+ {
+ // Create a range for the current selection.
+ var range = new FCKDomRange( targetWindow ) ;
+ range.MoveToSelection() ;
+
+ this.RemoveFromRange( range, true ) ;
+ },
+
+ /**
+ * Remove the style from a FCKDomRange. Block type styles will have no
+ * effect.
+ */
+ RemoveFromRange : function( range, selectIt, updateRange )
+ {
+ var bookmark ;
+
+ // Create the attribute list to be used later for element comparisons.
+ var styleAttribs = this._GetAttribsForComparison() ;
+ var styleOverrides = this._GetOverridesForComparison() ;
+
+ // If collapsed, we are removing all conflicting styles from the range
+ // parent tree.
+ if ( range.CheckIsCollapsed() )
+ {
+ // Bookmark the range so we can re-select it after processing.
+ var bookmark = range.CreateBookmark( true ) ;
+
+ // Let's start from the bookmark <span> parent.
+ var bookmarkStart = range.GetBookmarkNode( bookmark, true ) ;
+
+ var path = new FCKElementPath( bookmarkStart.parentNode ) ;
+
+ // While looping through the path, we'll be saving references to
+ // parent elements if the range is in one of their boundaries. In
+ // this way, we are able to create a copy of those elements when
+ // removing a style if the range is in a boundary limit (see #1270).
+ var boundaryElements = [] ;
+
+ // Check if the range is in the boundary limits of an element
+ // (related to #1270).
+ var isBoundaryRight = !FCKDomTools.GetNextSibling( bookmarkStart ) ;
+ var isBoundary = isBoundaryRight || !FCKDomTools.GetPreviousSibling( bookmarkStart ) ;
+
+ // This is the last element to be removed in the boundary situation
+ // described at #1270.
+ var lastBoundaryElement ;
+ var boundaryLimitIndex = -1 ;
+
+ for ( var i = 0 ; i < path.Elements.length ; i++ )
+ {
+ var pathElement = path.Elements[i] ;
+ if ( this.CheckElementRemovable( pathElement ) )
+ {
+ if ( isBoundary
+ && !FCKDomTools.CheckIsEmptyElement( pathElement,
+ function( el )
+ {
+ return ( el != bookmarkStart ) ;
+ } )
+ )
+ {
+ lastBoundaryElement = pathElement ;
+
+ // We'll be continuously including elements in the
+ // boundaryElements array, but only those added before
+ // setting lastBoundaryElement must be used later, so
+ // let's mark the current index here.
+ boundaryLimitIndex = boundaryElements.length - 1 ;
+ }
+ else
+ {
+ var pathElementName = pathElement.nodeName.toLowerCase() ;
+
+ if ( pathElementName == this.Element )
+ {
+ // Remove any attribute that conflict with this style, no
+ // matter their values.
+ for ( var att in styleAttribs )
+ {
+ if ( FCKDomTools.HasAttribute( pathElement, att ) )
+ {
+ switch ( att )
+ {
+ case 'style' :
+ this._RemoveStylesFromElement( pathElement ) ;
+ break ;
+
+ case 'class' :
+ // The 'class' element value must match (#1318).
+ if ( FCKDomTools.GetAttributeValue( pathElement, att ) != this.GetFinalAttributeValue( att ) )
+ continue ;
+
+ /*jsl:fallthru*/
+
+ default :
+ FCKDomTools.RemoveAttribute( pathElement, att ) ;
+ }
+ }
+ }
+ }
+
+ // Remove overrides defined to the same element name.
+ this._RemoveOverrides( pathElement, styleOverrides[ pathElementName ] ) ;
+
+ // Remove the element if no more attributes are available and it's an inline style element
+ if ( this.GetType() == FCK_STYLE_INLINE)
+ this._RemoveNoAttribElement( pathElement ) ;
+ }
+ }
+ else if ( isBoundary )
+ boundaryElements.push( pathElement ) ;
+
+ // Check if we are still in a boundary (at the same side).
+ isBoundary = isBoundary && ( ( isBoundaryRight && !FCKDomTools.GetNextSibling( pathElement ) ) || ( !isBoundaryRight && !FCKDomTools.GetPreviousSibling( pathElement ) ) ) ;
+
+ // If we are in an element that is not anymore a boundary, or
+ // we are at the last element, let's move things outside the
+ // boundary (if available).
+ if ( lastBoundaryElement && ( !isBoundary || ( i == path.Elements.length - 1 ) ) )
+ {
+ // Remove the bookmark node from the DOM.
+ var currentElement = FCKDomTools.RemoveNode( bookmarkStart ) ;
+
+ // Build the collapsed group of elements that are not
+ // removed by this style, but share the boundary.
+ // (see comment 1 and 2 at #1270)
+ for ( var j = 0 ; j <= boundaryLimitIndex ; j++ )
+ {
+ var newElement = FCKDomTools.CloneElement( boundaryElements[j] ) ;
+ newElement.appendChild( currentElement ) ;
+ currentElement = newElement ;
+ }
+
+ // Re-insert the bookmark node (and the collapsed elements)
+ // in the DOM, in the new position next to the styled element.
+ if ( isBoundaryRight )
+ FCKDomTools.InsertAfterNode( lastBoundaryElement, currentElement ) ;
+ else
+ lastBoundaryElement.parentNode.insertBefore( currentElement, lastBoundaryElement ) ;
+
+ isBoundary = false ;
+ lastBoundaryElement = null ;
+ }
+ }
+
+ // Re-select the original range.
+ if ( selectIt )
+ range.SelectBookmark( bookmark ) ;
+
+ if ( updateRange )
+ range.MoveToBookmark( bookmark ) ;
+
+ return ;
+ }
+
+ // Expand the range, if inside inline element boundaries.
+ range.Expand( 'inline_elements' ) ;
+
+ // Bookmark the range so we can re-select it after processing.
+ bookmark = range.CreateBookmark( true ) ;
+
+ // The style will be applied within the bookmark boundaries.
+ var startNode = range.GetBookmarkNode( bookmark, true ) ;
+ var endNode = range.GetBookmarkNode( bookmark, false ) ;
+
+ range.Release( true ) ;
+
+ // We need to check the selection boundaries (bookmark spans) to break
+ // the code in a way that we can properly remove partially selected nodes.
+ // For example, removing a <b> style from
+ // <b>This is [some text</b> to show <b>the] problem</b>
+ // ... where [ and ] represent the selection, must result:
+ // <b>This is </b>[some text to show the]<b> problem</b>
+ // The strategy is simple, we just break the partial nodes before the
+ // removal logic, having something that could be represented this way:
+ // <b>This is </b>[<b>some text</b> to show <b>the</b>]<b> problem</b>
+
+ // Let's start checking the start boundary.
+ var path = new FCKElementPath( startNode ) ;
+ var pathElements = path.Elements ;
+ var pathElement ;
+
+ for ( var i = 1 ; i < pathElements.length ; i++ )
+ {
+ pathElement = pathElements[i] ;
+
+ if ( pathElement == path.Block || pathElement == path.BlockLimit )
+ break ;
+
+ // If this element can be removed (even partially).
+ if ( this.CheckElementRemovable( pathElement ) )
+ FCKDomTools.BreakParent( startNode, pathElement, range ) ;
+ }
+
+ // Now the end boundary.
+ path = new FCKElementPath( endNode ) ;
+ pathElements = path.Elements ;
+
+ for ( var i = 1 ; i < pathElements.length ; i++ )
+ {
+ pathElement = pathElements[i] ;
+
+ if ( pathElement == path.Block || pathElement == path.BlockLimit )
+ break ;
+
+ elementName = pathElement.nodeName.toLowerCase() ;
+
+ // If this element can be removed (even partially).
+ if ( this.CheckElementRemovable( pathElement ) )
+ FCKDomTools.BreakParent( endNode, pathElement, range ) ;
+ }
+
+ // Navigate through all nodes between the bookmarks.
+ var currentNode = FCKDomTools.GetNextSourceNode( startNode, true ) ;
+
+ while ( currentNode )
+ {
+ // Cache the next node to be processed. Do it now, because
+ // currentNode may be removed.
+ var nextNode = FCKDomTools.GetNextSourceNode( currentNode ) ;
+
+ // Remove elements nodes that match with this style rules.
+ if ( currentNode.nodeType == 1 )
+ {
+ var elementName = currentNode.nodeName.toLowerCase() ;
+
+ var mayRemove = ( elementName == this.Element ) ;
+ if ( mayRemove )
+ {
+ // Remove any attribute that conflict with this style, no matter
+ // their values.
+ for ( var att in styleAttribs )
+ {
+ if ( FCKDomTools.HasAttribute( currentNode, att ) )
+ {
+ switch ( att )
+ {
+ case 'style' :
+ this._RemoveStylesFromElement( currentNode ) ;
+ break ;
+
+ case 'class' :
+ // The 'class' element value must match (#1318).
+ if ( FCKDomTools.GetAttributeValue( currentNode, att ) != this.GetFinalAttributeValue( att ) )
+ continue ;
+
+ /*jsl:fallthru*/
+
+ default :
+ FCKDomTools.RemoveAttribute( currentNode, att ) ;
+ }
+ }
+ }
+ }
+ else
+ mayRemove = !!styleOverrides[ elementName ] ;
+
+ if ( mayRemove )
+ {
+ // Remove overrides defined to the same element name.
+ this._RemoveOverrides( currentNode, styleOverrides[ elementName ] ) ;
+
+ // Remove the element if no more attributes are available.
+ this._RemoveNoAttribElement( currentNode ) ;
+ }
+ }
+
+ // If we have reached the end of the selection, stop looping.
+ if ( nextNode == endNode )
+ break ;
+
+ currentNode = nextNode ;
+ }
+
+ this._FixBookmarkStart( startNode ) ;
+
+ // Re-select the original range.
+ if ( selectIt )
+ range.SelectBookmark( bookmark ) ;
+
+ if ( updateRange )
+ range.MoveToBookmark( bookmark ) ;
+ },
+
+ /**
+ * Checks if an element, or any of its attributes, is removable by the
+ * current style definition.
+ */
+ CheckElementRemovable : function( element, fullMatch )
+ {
+ if ( !element )
+ return false ;
+
+ var elementName = element.nodeName.toLowerCase() ;
+
+ // If the element name is the same as the style name.
+ if ( elementName == this.Element )
+ {
+ // If no attributes are defined in the element.
+ if ( !fullMatch && !FCKDomTools.HasAttributes( element ) )
+ return true ;
+
+ // If any attribute conflicts with the style attributes.
+ var attribs = this._GetAttribsForComparison() ;
+ var allMatched = ( attribs._length == 0 ) ;
+ for ( var att in attribs )
+ {
+ if ( att == '_length' )
+ continue ;
+
+ if ( this._CompareAttributeValues( att, FCKDomTools.GetAttributeValue( element, att ), ( this.GetFinalAttributeValue( att ) || '' ) ) )
+ {
+ allMatched = true ;
+ if ( !fullMatch )
+ break ;
+ }
+ else
+ {
+ allMatched = false ;
+ if ( fullMatch )
+ return false ;
+ }
+ }
+ if ( allMatched )
+ return true ;
+ }
+
+ // Check if the element can be somehow overriden.
+ var override = this._GetOverridesForComparison()[ elementName ] ;
+ if ( override )
+ {
+ // If no attributes have been defined, remove the element.
+ if ( !( attribs = override.Attributes ) ) // Only one "="
+ return true ;
+
+ for ( var i = 0 ; i < attribs.length ; i++ )
+ {
+ var attName = attribs[i][0] ;
+ if ( FCKDomTools.HasAttribute( element, attName ) )
+ {
+ var attValue = attribs[i][1] ;
+
+ // Remove the attribute if:
+ // - The override definition value is null ;
+ // - The override definition valie is a string that
+ // matches the attribute value exactly.
+ // - The override definition value is a regex that
+ // has matches in the attribute value.
+ if ( attValue == null ||
+ ( typeof attValue == 'string' && FCKDomTools.GetAttributeValue( element, attName ) == attValue ) ||
+ attValue.test( FCKDomTools.GetAttributeValue( element, attName ) ) )
+ return true ;
+ }
+ }
+ }
+
+ return false ;
+ },
+
+ /**
+ * Get the style state for an element path. Returns "true" if the element
+ * is active in the path.
+ */
+ CheckActive : function( elementPath )
+ {
+ switch ( this.GetType() )
+ {
+ case FCK_STYLE_BLOCK :
+ return this.CheckElementRemovable( elementPath.Block || elementPath.BlockLimit, true ) ;
+
+ case FCK_STYLE_INLINE :
+
+ var elements = elementPath.Elements ;
+
+ for ( var i = 0 ; i < elements.length ; i++ )
+ {
+ var element = elements[i] ;
+
+ if ( element == elementPath.Block || element == elementPath.BlockLimit )
+ continue ;
+
+ if ( this.CheckElementRemovable( element, true ) )
+ return true ;
+ }
+ }
+ return false ;
+ },
+
+ /**
+ * Removes an inline style from inside an element tree. The element node
+ * itself is not checked or removed, only the child tree inside of it.
+ */
+ RemoveFromElement : function( element )
+ {
+ var attribs = this._GetAttribsForComparison() ;
+ var overrides = this._GetOverridesForComparison() ;
+
+ // Get all elements with the same name.
+ var innerElements = element.getElementsByTagName( this.Element ) ;
+
+ for ( var i = innerElements.length - 1 ; i >= 0 ; i-- )
+ {
+ var innerElement = innerElements[i] ;
+
+ // Remove any attribute that conflict with this style, no matter
+ // their values.
+ for ( var att in attribs )
+ {
+ if ( FCKDomTools.HasAttribute( innerElement, att ) )
+ {
+ switch ( att )
+ {
+ case 'style' :
+ this._RemoveStylesFromElement( innerElement ) ;
+ break ;
+
+ case 'class' :
+ // The 'class' element value must match (#1318).
+ if ( FCKDomTools.GetAttributeValue( innerElement, att ) != this.GetFinalAttributeValue( att ) )
+ continue ;
+
+ /*jsl:fallthru*/
+
+ default :
+ FCKDomTools.RemoveAttribute( innerElement, att ) ;
+ }
+ }
+ }
+
+ // Remove overrides defined to the same element name.
+ this._RemoveOverrides( innerElement, overrides[ this.Element ] ) ;
+
+ // Remove the element if no more attributes are available.
+ this._RemoveNoAttribElement( innerElement ) ;
+ }
+
+ // Now remove any other element with different name that is
+ // defined to be overriden.
+ for ( var overrideElement in overrides )
+ {
+ if ( overrideElement != this.Element )
+ {
+ // Get all elements.
+ innerElements = element.getElementsByTagName( overrideElement ) ;
+
+ for ( var i = innerElements.length - 1 ; i >= 0 ; i-- )
+ {
+ var innerElement = innerElements[i] ;
+ this._RemoveOverrides( innerElement, overrides[ overrideElement ] ) ;
+ this._RemoveNoAttribElement( innerElement ) ;
+ }
+ }
+ }
+ },
+
+ _RemoveStylesFromElement : function( element )
+ {
+ var elementStyle = element.style.cssText ;
+ var pattern = this.GetFinalStyleValue() ;
+
+ if ( elementStyle.length > 0 && pattern.length == 0 )
+ return ;
+
+ pattern = '(^|;)\\s*(' +
+ pattern.replace( /\s*([^ ]+):.*?(;|$)/g, '$1|' ).replace( /\|$/, '' ) +
+ '):[^;]+' ;
+
+ var regex = new RegExp( pattern, 'gi' ) ;
+
+ elementStyle = elementStyle.replace( regex, '' ).Trim() ;
+
+ if ( elementStyle.length == 0 || elementStyle == ';' )
+ FCKDomTools.RemoveAttribute( element, 'style' ) ;
+ else
+ element.style.cssText = elementStyle.replace( regex, '' ) ;
+ },
+
+ /**
+ * Remove all attributes that are defined to be overriden,
+ */
+ _RemoveOverrides : function( element, override )
+ {
+ var attributes = override && override.Attributes ;
+
+ if ( attributes )
+ {
+ for ( var i = 0 ; i < attributes.length ; i++ )
+ {
+ var attName = attributes[i][0] ;
+
+ if ( FCKDomTools.HasAttribute( element, attName ) )
+ {
+ var attValue = attributes[i][1] ;
+
+ // Remove the attribute if:
+ // - The override definition value is null ;
+ // - The override definition valie is a string that
+ // matches the attribute value exactly.
+ // - The override definition value is a regex that
+ // has matches in the attribute value.
+ if ( attValue == null ||
+ ( attValue.test && attValue.test( FCKDomTools.GetAttributeValue( element, attName ) ) ) ||
+ ( typeof attValue == 'string' && FCKDomTools.GetAttributeValue( element, attName ) == attValue ) )
+ FCKDomTools.RemoveAttribute( element, attName ) ;
+ }
+ }
+ }
+ },
+
+ /**
+ * If the element has no more attributes, remove it.
+ */
+ _RemoveNoAttribElement : function( element )
+ {
+ // If no more attributes remained in the element, remove it,
+ // leaving its children.
+ if ( !FCKDomTools.HasAttributes( element ) )
+ {
+ // Removing elements may open points where merging is possible,
+ // so let's cache the first and last nodes for later checking.
+ var firstChild = element.firstChild ;
+ var lastChild = element.lastChild ;
+
+ FCKDomTools.RemoveNode( element, true ) ;
+
+ // Check the cached nodes for merging.
+ this._MergeSiblings( firstChild ) ;
+
+ if ( firstChild != lastChild )
+ this._MergeSiblings( lastChild ) ;
+ }
+ },
+
+ /**
+ * Creates a DOM element for this style object.
+ */
+ BuildElement : function( targetDoc, element )
+ {
+ // Create the element.
+ var el = element || targetDoc.createElement( this.Element ) ;
+
+ // Assign all defined attributes.
+ var attribs = this._StyleDesc.Attributes ;
+ var attValue ;
+ if ( attribs )
+ {
+ for ( var att in attribs )
+ {
+ attValue = this.GetFinalAttributeValue( att ) ;
+
+ if ( att.toLowerCase() == 'class' )
+ el.className = attValue ;
+ else
+ el.setAttribute( att, attValue ) ;
+ }
+ }
+
+ // Assign the style attribute.
+ if ( this._GetStyleText().length > 0 )
+ el.style.cssText = this.GetFinalStyleValue() ;
+
+ return el ;
+ },
+
+ _CompareAttributeValues : function( attName, valueA, valueB )
+ {
+ if ( attName == 'style' && valueA && valueB )
+ {
+ valueA = valueA.replace( /;$/, '' ).toLowerCase() ;
+ valueB = valueB.replace( /;$/, '' ).toLowerCase() ;
+ }
+
+ // Return true if they match or if valueA is null and valueB is an empty string
+ return ( valueA == valueB || ( ( valueA === null || valueA === '' ) && ( valueB === null || valueB === '' ) ) )
+ },
+
+ GetFinalAttributeValue : function( attName )
+ {
+ var attValue = this._StyleDesc.Attributes ;
+ var attValue = attValue ? attValue[ attName ] : null ;
+
+ if ( !attValue && attName == 'style' )
+ return this.GetFinalStyleValue() ;
+
+ if ( attValue && this._Variables )
+ // Using custom Replace() to guarantee the correct scope.
+ attValue = attValue.Replace( FCKRegexLib.StyleVariableAttName, this._GetVariableReplace, this ) ;
+
+ return attValue ;
+ },
+
+ GetFinalStyleValue : function()
+ {
+ var attValue = this._GetStyleText() ;
+
+ if ( attValue.length > 0 && this._Variables )
+ {
+ // Using custom Replace() to guarantee the correct scope.
+ attValue = attValue.Replace( FCKRegexLib.StyleVariableAttName, this._GetVariableReplace, this ) ;
+ attValue = FCKTools.NormalizeCssText( attValue ) ;
+ }
+
+ return attValue ;
+ },
+
+ _GetVariableReplace : function()
+ {
+ // The second group in the regex is the variable name.
+ return this._Variables[ arguments[2] ] || arguments[0] ;
+ },
+
+ /**
+ * Set the value of a variable attribute or style, to be used when
+ * appliying the style.
+ */
+ SetVariable : function( name, value )
+ {
+ var variables = this._Variables ;
+
+ if ( !variables )
+ variables = this._Variables = {} ;
+
+ this._Variables[ name ] = value ;
+ },
+
+ /**
+ * Converting from a PRE block to a non-PRE block in formatting operations.
+ */
+ _FromPre : function( doc, block, newBlock )
+ {
+ var innerHTML = block.innerHTML ;
+
+ // Trim the first and last linebreaks immediately after and before <pre>, </pre>,
+ // if they exist.
+ // This is done because the linebreaks are not rendered.
+ innerHTML = innerHTML.replace( /(\r\n|\r)/g, '\n' ) ;
+ innerHTML = innerHTML.replace( /^[ \t]*\n/, '' ) ;
+ innerHTML = innerHTML.replace( /\n$/, '' ) ;
+
+ // 1. Convert spaces or tabs at the beginning or at the end to
+ innerHTML = innerHTML.replace( /^[ \t]+|[ \t]+$/g, function( match, offset, s )
+ {
+ if ( match.length == 1 ) // one space, preserve it
+ return ' ' ;
+ else if ( offset == 0 ) // beginning of block
+ return new Array( match.length ).join( ' ' ) + ' ' ;
+ else // end of block
+ return ' ' + new Array( match.length ).join( ' ' ) ;
+ } ) ;
+
+ // 2. Convert \n to <BR>.
+ // 3. Convert contiguous (i.e. non-singular) spaces or tabs to
+ var htmlIterator = new FCKHtmlIterator( innerHTML ) ;
+ var results = [] ;
+ htmlIterator.Each( function( isTag, value )
+ {
+ if ( !isTag )
+ {
+ value = value.replace( /\n/g, '<br>' ) ;
+ value = value.replace( /[ \t]{2,}/g,
+ function ( match )
+ {
+ return new Array( match.length ).join( ' ' ) + ' ' ;
+ } ) ;
+ }
+ results.push( value ) ;
+ } ) ;
+ newBlock.innerHTML = results.join( '' ) ;
+ return newBlock ;
+ },
+
+ /**
+ * Converting from a non-PRE block to a PRE block in formatting operations.
+ */
+ _ToPre : function( doc, block, newBlock )
+ {
+ // Handle converting from a regular block to a <pre> block.
+ var innerHTML = block.innerHTML.Trim() ;
+
+ // 1. Delete ANSI whitespaces immediately before and after <BR> because
+ // they are not visible.
+ // 2. Mark down any <BR /> nodes here so they can be turned into \n in
+ // the next step and avoid being compressed.
+ innerHTML = innerHTML.replace( /[ \t\r\n]*(<br[^>]*>)[ \t\r\n]*/gi, '<br />' ) ;
+
+ // 3. Compress other ANSI whitespaces since they're only visible as one
+ // single space previously.
+ // 4. Convert to spaces since is no longer needed in <PRE>.
+ // 5. Convert any <BR /> to \n. This must not be done earlier because
+ // the \n would then get compressed.
+ var htmlIterator = new FCKHtmlIterator( innerHTML ) ;
+ var results = [] ;
+ htmlIterator.Each( function( isTag, value )
+ {
+ if ( !isTag )
+ value = value.replace( /([ \t\n\r]+| )/g, ' ' ) ;
+ else if ( isTag && value == '<br />' )
+ value = '\n' ;
+ results.push( value ) ;
+ } ) ;
+
+ // Assigning innerHTML to <PRE> in IE causes all linebreaks to be
+ // reduced to spaces.
+ // Assigning outerHTML to <PRE> in IE doesn't work if the <PRE> isn't
+ // contained in another node since the node reference is changed after
+ // outerHTML assignment.
+ // So, we need some hacks to workaround IE bugs here.
+ if ( FCKBrowserInfo.IsIE )
+ {
+ var temp = doc.createElement( 'div' ) ;
+ temp.appendChild( newBlock ) ;
+ newBlock.outerHTML = '<pre>\n' + results.join( '' ) + '</pre>' ;
+ newBlock = temp.removeChild( temp.firstChild ) ;
+ }
+ else
+ newBlock.innerHTML = results.join( '' ) ;
+
+ return newBlock ;
+ },
+
+ /**
+ * Merge a <pre> block with a previous <pre> block, if available.
+ */
+ _CheckAndMergePre : function( previousBlock, preBlock )
+ {
+ // Check if the previous block and the current block are next
+ // to each other.
+ if ( previousBlock != FCKDomTools.GetPreviousSourceElement( preBlock, true ) )
+ return ;
+
+ // Merge the previous <pre> block contents into the current <pre>
+ // block.
+ //
+ // Another thing to be careful here is that currentBlock might contain
+ // a '\n' at the beginning, and previousBlock might contain a '\n'
+ // towards the end. These new lines are not normally displayed but they
+ // become visible after merging.
+ var innerHTML = previousBlock.innerHTML.replace( /\n$/, '' ) + '\n\n' +
+ preBlock.innerHTML.replace( /^\n/, '' ) ;
+
+ // Buggy IE normalizes innerHTML from <pre>, breaking whitespaces.
+ if ( FCKBrowserInfo.IsIE )
+ preBlock.outerHTML = '<pre>' + innerHTML + '</pre>' ;
+ else
+ preBlock.innerHTML = innerHTML ;
+
+ // Remove the previous <pre> block.
+ //
+ // The preBlock must not be moved or deleted from the DOM tree. This
+ // guarantees the FCKDomRangeIterator in _ApplyBlockStyle would not
+ // get lost at the next iteration.
+ FCKDomTools.RemoveNode( previousBlock ) ;
+ },
+
+ _CheckAndSplitPre : function( newBlock )
+ {
+ var lastNewBlock ;
+
+ var cursor = newBlock.firstChild ;
+
+ // We are not splitting <br><br> at the beginning of the block, so
+ // we'll start from the second child.
+ cursor = cursor && cursor.nextSibling ;
+
+ while ( cursor )
+ {
+ var next = cursor.nextSibling ;
+
+ // If we have two <BR>s, and they're not at the beginning or the end,
+ // then we'll split up the contents following them into another block.
+ // Stop processing if we are at the last child couple.
+ if ( next && next.nextSibling && cursor.nodeName.IEquals( 'br' ) && next.nodeName.IEquals( 'br' ) )
+ {
+ // Remove the first <br>.
+ FCKDomTools.RemoveNode( cursor ) ;
+
+ // Move to the node after the second <br>.
+ cursor = next.nextSibling ;
+
+ // Remove the second <br>.
+ FCKDomTools.RemoveNode( next ) ;
+
+ // Create the block that will hold the child nodes from now on.
+ lastNewBlock = FCKDomTools.InsertAfterNode( lastNewBlock || newBlock, FCKDomTools.CloneElement( newBlock ) ) ;
+
+ continue ;
+ }
+
+ // If we split it, then start moving the nodes to the new block.
+ if ( lastNewBlock )
+ {
+ cursor = cursor.previousSibling ;
+ FCKDomTools.MoveNode(cursor.nextSibling, lastNewBlock ) ;
+ }
+
+ cursor = cursor.nextSibling ;
+ }
+ },
+
+ /**
+ * Apply an inline style to a FCKDomRange.
+ *
+ * TODO
+ * - Implement the "#" style handling.
+ * - Properly handle block containers like <div> and <blockquote>.
+ */
+ _ApplyBlockStyle : function( range, selectIt, updateRange )
+ {
+ // Bookmark the range so we can re-select it after processing.
+ var bookmark ;
+
+ if ( selectIt )
+ bookmark = range.CreateBookmark() ;
+
+ var iterator = new FCKDomRangeIterator( range ) ;
+ iterator.EnforceRealBlocks = true ;
+
+ var block ;
+ var doc = range.Window.document ;
+ var previousPreBlock ;
+
+ while( ( block = iterator.GetNextParagraph() ) ) // Only one =
+ {
+ // Create the new node right before the current one.
+ var newBlock = this.BuildElement( doc ) ;
+
+ // Check if we are changing from/to <pre>.
+ var newBlockIsPre = newBlock.nodeName.IEquals( 'pre' ) ;
+ var blockIsPre = block.nodeName.IEquals( 'pre' ) ;
+
+ var toPre = newBlockIsPre && !blockIsPre ;
+ var fromPre = !newBlockIsPre && blockIsPre ;
+
+ // Move everything from the current node to the new one.
+ if ( toPre )
+ newBlock = this._ToPre( doc, block, newBlock ) ;
+ else if ( fromPre )
+ newBlock = this._FromPre( doc, block, newBlock ) ;
+ else // Convering from a regular block to another regular block.
+ FCKDomTools.MoveChildren( block, newBlock ) ;
+
+ // Replace the current block.
+ block.parentNode.insertBefore( newBlock, block ) ;
+ FCKDomTools.RemoveNode( block ) ;
+
+ // Complete other tasks after inserting the node in the DOM.
+ if ( newBlockIsPre )
+ {
+ if ( previousPreBlock )
+ this._CheckAndMergePre( previousPreBlock, newBlock ) ; // Merge successive <pre> blocks.
+ previousPreBlock = newBlock ;
+ }
+ else if ( fromPre )
+ this._CheckAndSplitPre( newBlock ) ; // Split <br><br> in successive <pre>s.
+ }
+
+ // Re-select the original range.
+ if ( selectIt )
+ range.SelectBookmark( bookmark ) ;
+
+ if ( updateRange )
+ range.MoveToBookmark( bookmark ) ;
+ },
+
+ /**
+ * Apply an inline style to a FCKDomRange.
+ *
+ * TODO
+ * - Merge elements, when applying styles to similar elements that enclose
+ * the entire selection, outputing:
+ * <span style="color: #ff0000; background-color: #ffffff">XYZ</span>
+ * instead of:
+ * <span style="color: #ff0000;"><span style="background-color: #ffffff">XYZ</span></span>
+ */
+ _ApplyInlineStyle : function( range, selectIt, updateRange )
+ {
+ var doc = range.Window.document ;
+
+ if ( range.CheckIsCollapsed() )
+ {
+ // Create the element to be inserted in the DOM.
+ var collapsedElement = this.BuildElement( doc ) ;
+ range.InsertNode( collapsedElement ) ;
+ range.MoveToPosition( collapsedElement, 2 ) ;
+ range.Select() ;
+
+ return ;
+ }
+
+ // The general idea here is navigating through all nodes inside the
+ // current selection, working on distinct range blocks, defined by the
+ // DTD compatibility between the style element and the nodes inside the
+ // ranges.
+ //
+ // For example, suppose we have the following selection (where [ and ]
+ // are the boundaries), and we apply a <b> style there:
+ //
+ // <p>Here we [have <b>some</b> text.<p>
+ // <p>And some here] here.</p>
+ //
+ // Two different ranges will be detected:
+ //
+ // "have <b>some</b> text."
+ // "And some here"
+ //
+ // Both ranges will be extracted, moved to a <b> element, and
+ // re-inserted, resulting in the following output:
+ //
+ // <p>Here we [<b>have some text.</b><p>
+ // <p><b>And some here</b>] here.</p>
+ //
+ // Note that the <b> element at <b>some</b> is also removed because it
+ // is not needed anymore.
+
+ var elementName = this.Element ;
+
+ // Get the DTD definition for the element. Defaults to "span".
+ var elementDTD = FCK.DTD[ elementName ] || FCK.DTD.span ;
+
+ // Create the attribute list to be used later for element comparisons.
+ var styleAttribs = this._GetAttribsForComparison() ;
+ var styleNode ;
+
+ // Expand the range, if inside inline element boundaries.
+ range.Expand( 'inline_elements' ) ;
+
+ // Bookmark the range so we can re-select it after processing.
+ var bookmark = range.CreateBookmark( true ) ;
+
+ // The style will be applied within the bookmark boundaries.
+ var startNode = range.GetBookmarkNode( bookmark, true ) ;
+ var endNode = range.GetBookmarkNode( bookmark, false ) ;
+
+ // We'll be reusing the range to apply the styles. So, release it here
+ // to indicate that it has not been initialized.
+ range.Release( true ) ;
+
+ // Let's start the nodes lookup from the node right after the bookmark
+ // span.
+ var currentNode = FCKDomTools.GetNextSourceNode( startNode, true ) ;
+
+ while ( currentNode )
+ {
+ var applyStyle = false ;
+
+ var nodeType = currentNode.nodeType ;
+ var nodeName = nodeType == 1 ? currentNode.nodeName.toLowerCase() : null ;
+
+ // Check if the current node can be a child of the style element.
+ if ( !nodeName || elementDTD[ nodeName ] )
+ {
+ // Check if the style element can be a child of the current
+ // node parent or if the element is not defined in the DTD.
+ if ( ( FCK.DTD[ currentNode.parentNode.nodeName.toLowerCase() ] || FCK.DTD.span )[ elementName ] || !FCK.DTD[ elementName ] )
+ {
+ // This node will be part of our range, so if it has not
+ // been started, place its start right before the node.
+ if ( !range.CheckHasRange() )
+ range.SetStart( currentNode, 3 ) ;
+
+ // Non element nodes, or empty elements can be added
+ // completely to the range.
+ if ( nodeType != 1 || currentNode.childNodes.length == 0 )
+ {
+ var includedNode = currentNode ;
+ var parentNode = includedNode.parentNode ;
+
+ // This node is about to be included completelly, but,
+ // if this is the last node in its parent, we must also
+ // check if the parent itself can be added completelly
+ // to the range.
+ while ( includedNode == parentNode.lastChild
+ && elementDTD[ parentNode.nodeName.toLowerCase() ] )
+ {
+ includedNode = parentNode ;
+ }
+
+ range.SetEnd( includedNode, 4 ) ;
+
+ // If the included node is the last node in its parent
+ // and its parent can't be inside the style node, apply
+ // the style immediately.
+ if ( includedNode == includedNode.parentNode.lastChild && !elementDTD[ includedNode.parentNode.nodeName.toLowerCase() ] )
+ applyStyle = true ;
+ }
+ else
+ {
+ // Element nodes will not be added directly. We need to
+ // check their children because the selection could end
+ // inside the node, so let's place the range end right
+ // before the element.
+ range.SetEnd( currentNode, 3 ) ;
+ }
+ }
+ else
+ applyStyle = true ;
+ }
+ else
+ applyStyle = true ;
+
+ // Get the next node to be processed.
+ currentNode = FCKDomTools.GetNextSourceNode( currentNode ) ;
+
+ // If we have reached the end of the selection, just apply the
+ // style ot the range, and stop looping.
+ if ( currentNode == endNode )
+ {
+ currentNode = null ;
+ applyStyle = true ;
+ }
+
+ // Apply the style if we have something to which apply it.
+ if ( applyStyle && range.CheckHasRange() && !range.CheckIsCollapsed() )
+ {
+ // Build the style element, based on the style object definition.
+ styleNode = this.BuildElement( doc ) ;
+
+ // Move the contents of the range to the style element.
+ range.ExtractContents().AppendTo( styleNode ) ;
+
+ // If it is not empty.
+ if ( styleNode.innerHTML.RTrim().length > 0 )
+ {
+ // Insert it in the range position (it is collapsed after
+ // ExtractContents.
+ range.InsertNode( styleNode ) ;
+
+ // Here we do some cleanup, removing all duplicated
+ // elements from the style element.
+ this.RemoveFromElement( styleNode ) ;
+
+ // Let's merge our new style with its neighbors, if possible.
+ this._MergeSiblings( styleNode, this._GetAttribsForComparison() ) ;
+
+ // As the style system breaks text nodes constantly, let's normalize
+ // things for performance.
+ // With IE, some paragraphs get broken when calling normalize()
+ // repeatedly. Also, for IE, we must normalize body, not documentElement.
+ // IE is also known for having a "crash effect" with normalize().
+ // We should try to normalize with IE too in some way, somewhere.
+ if ( !FCKBrowserInfo.IsIE )
+ styleNode.normalize() ;
+ }
+
+ // Style applied, let's release the range, so it gets marked to
+ // re-initialization in the next loop.
+ range.Release( true ) ;
+ }
+ }
+
+ this._FixBookmarkStart( startNode ) ;
+
+ // Re-select the original range.
+ if ( selectIt )
+ range.SelectBookmark( bookmark ) ;
+
+ if ( updateRange )
+ range.MoveToBookmark( bookmark ) ;
+ },
+
+ _FixBookmarkStart : function( startNode )
+ {
+ // After appliying or removing an inline style, the start boundary of
+ // the selection must be placed inside all inline elements it is
+ // bordering.
+ var startSibling ;
+ while ( ( startSibling = startNode.nextSibling ) ) // Only one "=".
+ {
+ if ( startSibling.nodeType == 1
+ && FCKListsLib.InlineNonEmptyElements[ startSibling.nodeName.toLowerCase() ] )
+ {
+ // If it is an empty inline element, we can safely remove it.
+ if ( !startSibling.firstChild )
+ FCKDomTools.RemoveNode( startSibling ) ;
+ else
+ FCKDomTools.MoveNode( startNode, startSibling, true ) ;
+ continue ;
+ }
+
+ // Empty text nodes can be safely removed to not disturb.
+ if ( startSibling.nodeType == 3 && startSibling.length == 0 )
+ {
+ FCKDomTools.RemoveNode( startSibling ) ;
+ continue ;
+ }
+
+ break ;
+ }
+ },
+
+ /**
+ * Merge an element with its similar siblings.
+ * "attribs" is and object computed with _CreateAttribsForComparison.
+ */
+ _MergeSiblings : function( element, attribs )
+ {
+ if ( !element || element.nodeType != 1 || !FCKListsLib.InlineNonEmptyElements[ element.nodeName.toLowerCase() ] )
+ return ;
+
+ this._MergeNextSibling( element, attribs ) ;
+ this._MergePreviousSibling( element, attribs ) ;
+ },
+
+ /**
+ * Merge an element with its similar siblings after it.
+ * "attribs" is and object computed with _CreateAttribsForComparison.
+ */
+ _MergeNextSibling : function( element, attribs )
+ {
+ // Check the next sibling.
+ var sibling = element.nextSibling ;
+
+ // Check if the next sibling is a bookmark element. In this case, jump it.
+ var hasBookmark = ( sibling && sibling.nodeType == 1 && sibling.getAttribute( '_fck_bookmark' ) ) ;
+ if ( hasBookmark )
+ sibling = sibling.nextSibling ;
+
+ if ( sibling && sibling.nodeType == 1 && sibling.nodeName == element.nodeName )
+ {
+ if ( !attribs )
+ attribs = this._CreateElementAttribsForComparison( element ) ;
+
+ if ( this._CheckAttributesMatch( sibling, attribs ) )
+ {
+ // Save the last child to be checked too (to merge things like <b><i></i></b><b><i></i></b>).
+ var innerSibling = element.lastChild ;
+
+ if ( hasBookmark )
+ FCKDomTools.MoveNode( element.nextSibling, element ) ;
+
+ // Move contents from the sibling.
+ FCKDomTools.MoveChildren( sibling, element ) ;
+ FCKDomTools.RemoveNode( sibling ) ;
+
+ // Now check the last inner child (see two comments above).
+ if ( innerSibling )
+ this._MergeNextSibling( innerSibling ) ;
+ }
+ }
+ },
+
+ /**
+ * Merge an element with its similar siblings before it.
+ * "attribs" is and object computed with _CreateAttribsForComparison.
+ */
+ _MergePreviousSibling : function( element, attribs )
+ {
+ // Check the previous sibling.
+ var sibling = element.previousSibling ;
+
+ // Check if the previous sibling is a bookmark element. In this case, jump it.
+ var hasBookmark = ( sibling && sibling.nodeType == 1 && sibling.getAttribute( '_fck_bookmark' ) ) ;
+ if ( hasBookmark )
+ sibling = sibling.previousSibling ;
+
+ if ( sibling && sibling.nodeType == 1 && sibling.nodeName == element.nodeName )
+ {
+ if ( !attribs )
+ attribs = this._CreateElementAttribsForComparison( element ) ;
+
+ if ( this._CheckAttributesMatch( sibling, attribs ) )
+ {
+ // Save the first child to be checked too (to merge things like <b><i></i></b><b><i></i></b>).
+ var innerSibling = element.firstChild ;
+
+ if ( hasBookmark )
+ FCKDomTools.MoveNode( element.previousSibling, element, true ) ;
+
+ // Move contents to the sibling.
+ FCKDomTools.MoveChildren( sibling, element, true ) ;
+ FCKDomTools.RemoveNode( sibling ) ;
+
+ // Now check the first inner child (see two comments above).
+ if ( innerSibling )
+ this._MergePreviousSibling( innerSibling ) ;
+ }
+ }
+ },
+
+ /**
+ * Build the cssText based on the styles definition.
+ */
+ _GetStyleText : function()
+ {
+ var stylesDef = this._StyleDesc.Styles ;
+
+ // Builds the StyleText.
+ var stylesText = ( this._StyleDesc.Attributes ? this._StyleDesc.Attributes['style'] || '' : '' ) ;
+
+ if ( stylesText.length > 0 )
+ stylesText += ';' ;
+
+ for ( var style in stylesDef )
+ stylesText += style + ':' + stylesDef[style] + ';' ;
+
+ // Browsers make some changes to the style when applying them. So, here
+ // we normalize it to the browser format. We'll not do that if there
+ // are variables inside the style.
+ if ( stylesText.length > 0 && !( /#\(/.test( stylesText ) ) )
+ {
+ stylesText = FCKTools.NormalizeCssText( stylesText ) ;
+ }
+
+ return (this._GetStyleText = function() { return stylesText ; })() ;
+ },
+
+ /**
+ * Get the the collection used to compare the attributes defined in this
+ * style with attributes in an element. All information in it is lowercased.
+ */
+ _GetAttribsForComparison : function()
+ {
+ // If we have already computed it, just return it.
+ var attribs = this._GetAttribsForComparison_$ ;
+ if ( attribs )
+ return attribs ;
+
+ attribs = new Object() ;
+
+ // Loop through all defined attributes.
+ var styleAttribs = this._StyleDesc.Attributes ;
+ if ( styleAttribs )
+ {
+ for ( var styleAtt in styleAttribs )
+ {
+ attribs[ styleAtt.toLowerCase() ] = styleAttribs[ styleAtt ].toLowerCase() ;
+ }
+ }
+
+ // Includes the style definitions.
+ if ( this._GetStyleText().length > 0 )
+ {
+ attribs['style'] = this._GetStyleText().toLowerCase() ;
+ }
+
+ // Appends the "length" information to the object.
+ FCKTools.AppendLengthProperty( attribs, '_length' ) ;
+
+ // Return it, saving it to the next request.
+ return ( this._GetAttribsForComparison_$ = attribs ) ;
+ },
+
+ /**
+ * Get the the collection used to compare the elements and attributes,
+ * defined in this style overrides, with other element. All information in
+ * it is lowercased.
+ */
+ _GetOverridesForComparison : function()
+ {
+ // If we have already computed it, just return it.
+ var overrides = this._GetOverridesForComparison_$ ;
+ if ( overrides )
+ return overrides ;
+
+ overrides = new Object() ;
+
+ var overridesDesc = this._StyleDesc.Overrides ;
+
+ if ( overridesDesc )
+ {
+ // The override description can be a string, object or array.
+ // Internally, well handle arrays only, so transform it if needed.
+ if ( !FCKTools.IsArray( overridesDesc ) )
+ overridesDesc = [ overridesDesc ] ;
+
+ // Loop through all override definitions.
+ for ( var i = 0 ; i < overridesDesc.length ; i++ )
+ {
+ var override = overridesDesc[i] ;
+ var elementName ;
+ var overrideEl ;
+ var attrs ;
+
+ // If can be a string with the element name.
+ if ( typeof override == 'string' )
+ elementName = override.toLowerCase() ;
+ // Or an object.
+ else
+ {
+ elementName = override.Element ? override.Element.toLowerCase() : this.Element ;
+ attrs = override.Attributes ;
+ }
+
+ // We can have more than one override definition for the same
+ // element name, so we attempt to simply append information to
+ // it if it already exists.
+ overrideEl = overrides[ elementName ] || ( overrides[ elementName ] = {} ) ;
+
+ if ( attrs )
+ {
+ // The returning attributes list is an array, because we
+ // could have different override definitions for the same
+ // attribute name.
+ var overrideAttrs = ( overrideEl.Attributes = overrideEl.Attributes || new Array() ) ;
+ for ( var attName in attrs )
+ {
+ // Each item in the attributes array is also an array,
+ // where [0] is the attribute name and [1] is the
+ // override value.
+ overrideAttrs.push( [ attName.toLowerCase(), attrs[ attName ] ] ) ;
+ }
+ }
+ }
+ }
+
+ return ( this._GetOverridesForComparison_$ = overrides ) ;
+ },
+
+ /*
+ * Create and object containing all attributes specified in an element,
+ * added by a "_length" property. All values are lowercased.
+ */
+ _CreateElementAttribsForComparison : function( element )
+ {
+ var attribs = new Object() ;
+ var attribsCount = 0 ;
+
+ for ( var i = 0 ; i < element.attributes.length ; i++ )
+ {
+ var att = element.attributes[i] ;
+
+ if ( att.specified )
+ {
+ attribs[ att.nodeName.toLowerCase() ] = FCKDomTools.GetAttributeValue( element, att ).toLowerCase() ;
+ attribsCount++ ;
+ }
+ }
+
+ attribs._length = attribsCount ;
+
+ return attribs ;
+ },
+
+ /**
+ * Checks is the element attributes have a perfect match with the style
+ * attributes.
+ */
+ _CheckAttributesMatch : function( element, styleAttribs )
+ {
+ // Loop through all specified attributes. The same number of
+ // attributes must be found and their values must match to
+ // declare them as equal.
+
+ var elementAttrbs = element.attributes ;
+ var matchCount = 0 ;
+
+ for ( var i = 0 ; i < elementAttrbs.length ; i++ )
+ {
+ var att = elementAttrbs[i] ;
+ if ( att.specified )
+ {
+ var attName = att.nodeName.toLowerCase() ;
+ var styleAtt = styleAttribs[ attName ] ;
+
+ // The attribute is not defined in the style.
+ if ( !styleAtt )
+ break ;
+
+ // The values are different.
+ if ( styleAtt != FCKDomTools.GetAttributeValue( element, att ).toLowerCase() )
+ break ;
+
+ matchCount++ ;
+ }
+ }
+
+ return ( matchCount == styleAttribs._length ) ;
+ }
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbar.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbar.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,103 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKToolbar Class: represents a toolbar in the toolbarset. It is a group of
+ * toolbar items.
+ */
+
+var FCKToolbar = function()
+{
+ this.Items = new Array() ;
+}
+
+FCKToolbar.prototype.AddItem = function( item )
+{
+ return this.Items[ this.Items.length ] = item ;
+}
+
+FCKToolbar.prototype.AddButton = function( name, label, tooltip, iconPathOrStripInfoArrayOrIndex, style, state )
+{
+ if ( typeof( iconPathOrStripInfoArrayOrIndex ) == 'number' )
+ iconPathOrStripInfoArrayOrIndex = [ this.DefaultIconsStrip, this.DefaultIconSize, iconPathOrStripInfoArrayOrIndex ] ;
+
+ var oButton = new FCKToolbarButtonUI( name, label, tooltip, iconPathOrStripInfoArrayOrIndex, style, state ) ;
+ oButton._FCKToolbar = this ;
+ oButton.OnClick = FCKToolbar_OnItemClick ;
+
+ return this.AddItem( oButton ) ;
+}
+
+function FCKToolbar_OnItemClick( item )
+{
+ var oToolbar = item._FCKToolbar ;
+
+ if ( oToolbar.OnItemClick )
+ oToolbar.OnItemClick( oToolbar, item ) ;
+}
+
+FCKToolbar.prototype.AddSeparator = function()
+{
+ this.AddItem( new FCKToolbarSeparator() ) ;
+}
+
+FCKToolbar.prototype.Create = function( parentElement )
+{
+ var oDoc = FCKTools.GetElementDocument( parentElement ) ;
+
+ var e = oDoc.createElement( 'table' ) ;
+ e.className = 'TB_Toolbar' ;
+ e.style.styleFloat = e.style.cssFloat = ( FCKLang.Dir == 'ltr' ? 'left' : 'right' ) ;
+ e.dir = FCKLang.Dir ;
+ e.cellPadding = 0 ;
+ e.cellSpacing = 0 ;
+
+ var targetRow = e.insertRow(-1) ;
+
+ // Insert the start cell.
+ var eCell ;
+
+ if ( !this.HideStart )
+ {
+ eCell = targetRow.insertCell(-1) ;
+ eCell.appendChild( oDoc.createElement( 'div' ) ).className = 'TB_Start' ;
+ }
+
+ for ( var i = 0 ; i < this.Items.length ; i++ )
+ {
+ this.Items[i].Create( targetRow.insertCell(-1) ) ;
+ }
+
+ // Insert the ending cell.
+ if ( !this.HideEnd )
+ {
+ eCell = targetRow.insertCell(-1) ;
+ eCell.appendChild( oDoc.createElement( 'div' ) ).className = 'TB_End' ;
+ }
+
+ parentElement.appendChild( e ) ;
+}
+
+var FCKToolbarSeparator = function()
+{}
+
+FCKToolbarSeparator.prototype.Create = function( parentElement )
+{
+ FCKTools.AppendElement( parentElement, 'div' ).className = 'TB_Separator' ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarbreak_gecko.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarbreak_gecko.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,36 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKToolbarBreak Class: breaks the toolbars.
+ * It makes it possible to force the toolbar to break to a new line.
+ * This is the Gecko specific implementation.
+ */
+
+var FCKToolbarBreak = function()
+{}
+
+FCKToolbarBreak.prototype.Create = function( targetElement )
+{
+ var oBreakDiv = targetElement.ownerDocument.createElement( 'div' ) ;
+
+ oBreakDiv.style.clear = oBreakDiv.style.cssFloat = FCKLang.Dir == 'rtl' ? 'right' : 'left' ;
+
+ targetElement.appendChild( oBreakDiv ) ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarbreak_ie.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarbreak_ie.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,38 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKToolbarBreak Class: breaks the toolbars.
+ * It makes it possible to force the toolbar to break to a new line.
+ * This is the IE specific implementation.
+ */
+
+var FCKToolbarBreak = function()
+{}
+
+FCKToolbarBreak.prototype.Create = function( targetElement )
+{
+ var oBreakDiv = FCKTools.GetElementDocument( targetElement ).createElement( 'div' ) ;
+
+ oBreakDiv.className = 'TB_Break' ;
+
+ oBreakDiv.style.clear = FCKLang.Dir == 'rtl' ? 'left' : 'right' ;
+
+ targetElement.appendChild( oBreakDiv ) ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarbutton.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarbutton.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,81 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKToolbarButton Class: represents a button in the toolbar.
+ */
+
+var FCKToolbarButton = function( commandName, label, tooltip, style, sourceView, contextSensitive, icon )
+{
+ this.CommandName = commandName ;
+ this.Label = label ;
+ this.Tooltip = tooltip ;
+ this.Style = style ;
+ this.SourceView = sourceView ? true : false ;
+ this.ContextSensitive = contextSensitive ? true : false ;
+
+ if ( icon == null )
+ this.IconPath = FCKConfig.SkinPath + 'toolbar/' + commandName.toLowerCase() + '.gif' ;
+ else if ( typeof( icon ) == 'number' )
+ this.IconPath = [ FCKConfig.SkinPath + 'fck_strip.gif', 16, icon ] ;
+ else
+ this.IconPath = icon ;
+}
+
+FCKToolbarButton.prototype.Create = function( targetElement )
+{
+ this._UIButton = new FCKToolbarButtonUI( this.CommandName, this.Label, this.Tooltip, this.IconPath, this.Style ) ;
+ this._UIButton.OnClick = this.Click ;
+ this._UIButton._ToolbarButton = this ;
+ this._UIButton.Create( targetElement ) ;
+}
+
+FCKToolbarButton.prototype.RefreshState = function()
+{
+ var uiButton = this._UIButton ;
+
+ if ( !uiButton )
+ return ;
+
+ // Gets the actual state.
+ var eState = FCK.ToolbarSet.CurrentInstance.Commands.GetCommand( this.CommandName ).GetState() ;
+
+ // If there are no state changes than do nothing and return.
+ if ( eState == uiButton.State ) return ;
+
+ // Sets the actual state.
+ uiButton.ChangeState( eState ) ;
+}
+
+FCKToolbarButton.prototype.Click = function()
+{
+ var oToolbarButton = this._ToolbarButton || this ;
+ FCK.ToolbarSet.CurrentInstance.Commands.GetCommand( oToolbarButton.CommandName ).Execute() ;
+}
+
+FCKToolbarButton.prototype.Enable = function()
+{
+ this.RefreshState() ;
+}
+
+FCKToolbarButton.prototype.Disable = function()
+{
+ // Sets the actual state.
+ this._UIButton.ChangeState( FCK_TRISTATE_DISABLED ) ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarbuttonui.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarbuttonui.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,198 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKToolbarButtonUI Class: interface representation of a toolbar button.
+ */
+
+var FCKToolbarButtonUI = function( name, label, tooltip, iconPathOrStripInfoArray, style, state )
+{
+ this.Name = name ;
+ this.Label = label || name ;
+ this.Tooltip = tooltip || this.Label ;
+ this.Style = style || FCK_TOOLBARITEM_ONLYICON ;
+ this.State = state || FCK_TRISTATE_OFF ;
+
+ this.Icon = new FCKIcon( iconPathOrStripInfoArray ) ;
+
+ if ( FCK.IECleanup )
+ FCK.IECleanup.AddItem( this, FCKToolbarButtonUI_Cleanup ) ;
+}
+
+
+FCKToolbarButtonUI.prototype._CreatePaddingElement = function( document )
+{
+ var oImg = document.createElement( 'IMG' ) ;
+ oImg.className = 'TB_Button_Padding' ;
+ oImg.src = FCK_SPACER_PATH ;
+ return oImg ;
+}
+
+FCKToolbarButtonUI.prototype.Create = function( parentElement )
+{
+ var oDoc = FCKTools.GetElementDocument( parentElement ) ;
+
+ // Create the Main Element.
+ var oMainElement = this.MainElement = oDoc.createElement( 'DIV' ) ;
+ oMainElement.title = this.Tooltip ;
+
+ // The following will prevent the button from catching the focus.
+ if ( FCKBrowserInfo.IsGecko )
+ oMainElement.onmousedown = FCKTools.CancelEvent ;
+
+ FCKTools.AddEventListenerEx( oMainElement, 'mouseover', FCKToolbarButtonUI_OnMouseOver, this ) ;
+ FCKTools.AddEventListenerEx( oMainElement, 'mouseout', FCKToolbarButtonUI_OnMouseOut, this ) ;
+ FCKTools.AddEventListenerEx( oMainElement, 'click', FCKToolbarButtonUI_OnClick, this ) ;
+
+ this.ChangeState( this.State, true ) ;
+
+ if ( this.Style == FCK_TOOLBARITEM_ONLYICON && !this.ShowArrow )
+ {
+ // <td><div class="TB_Button_On" title="Smiley">{Image}</div></td>
+
+ oMainElement.appendChild( this.Icon.CreateIconElement( oDoc ) ) ;
+ }
+ 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><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' ) ) ;
+ oTable.cellPadding = 0 ;
+ oTable.cellSpacing = 0 ;
+
+ var oRow = oTable.insertRow(-1) ;
+
+ // The Image cell (icon or padding).
+ var oCell = oRow.insertCell(-1) ;
+
+ if ( this.Style == FCK_TOOLBARITEM_ONLYICON || this.Style == FCK_TOOLBARITEM_ICONTEXT )
+ oCell.appendChild( this.Icon.CreateIconElement( oDoc ) ) ;
+ else
+ oCell.appendChild( this._CreatePaddingElement( oDoc ) ) ;
+
+ if ( this.Style == FCK_TOOLBARITEM_ONLYTEXT || this.Style == FCK_TOOLBARITEM_ICONTEXT )
+ {
+ // The Text cell.
+ oCell = oRow.insertCell(-1) ;
+ oCell.className = 'TB_Button_Text' ;
+ oCell.noWrap = true ;
+ oCell.appendChild( oDoc.createTextNode( this.Label ) ) ;
+ }
+
+ if ( this.ShowArrow )
+ {
+ if ( this.Style != FCK_TOOLBARITEM_ONLYICON )
+ {
+ // A padding cell.
+ oRow.insertCell(-1).appendChild( this._CreatePaddingElement( oDoc ) ) ;
+ }
+
+ oCell = oRow.insertCell(-1) ;
+ var eImg = oCell.appendChild( oDoc.createElement( 'IMG' ) ) ;
+ eImg.src = FCKConfig.SkinPath + 'images/toolbar.buttonarrow.gif' ;
+ eImg.width = 5 ;
+ eImg.height = 3 ;
+ }
+
+ // The last padding cell.
+ oCell = oRow.insertCell(-1) ;
+ oCell.appendChild( this._CreatePaddingElement( oDoc ) ) ;
+ }
+
+ parentElement.appendChild( oMainElement ) ;
+}
+
+FCKToolbarButtonUI.prototype.ChangeState = function( newState, force )
+{
+ if ( !force && this.State == newState )
+ return ;
+
+ var e = this.MainElement ;
+
+ // In IE it can happen when the page is reloaded that MainElement is null, so exit here
+ if ( !e )
+ return ;
+
+ switch ( parseInt( newState, 10 ) )
+ {
+ case FCK_TRISTATE_OFF :
+ e.className = 'TB_Button_Off' ;
+ break ;
+
+ case FCK_TRISTATE_ON :
+ e.className = 'TB_Button_On' ;
+ break ;
+
+ case FCK_TRISTATE_DISABLED :
+ e.className = 'TB_Button_Disabled' ;
+ break ;
+ }
+
+ this.State = newState ;
+}
+
+function FCKToolbarButtonUI_OnMouseOver( ev, button )
+{
+ if ( button.State == FCK_TRISTATE_OFF )
+ this.className = 'TB_Button_Off_Over' ;
+ else if ( button.State == FCK_TRISTATE_ON )
+ this.className = 'TB_Button_On_Over' ;
+}
+
+function FCKToolbarButtonUI_OnMouseOut( ev, button )
+{
+ if ( button.State == FCK_TRISTATE_OFF )
+ this.className = 'TB_Button_Off' ;
+ else if ( button.State == FCK_TRISTATE_ON )
+ this.className = 'TB_Button_On' ;
+}
+
+function FCKToolbarButtonUI_OnClick( ev, button )
+{
+ if ( button.OnClick && button.State != FCK_TRISTATE_DISABLED )
+ button.OnClick( button ) ;
+}
+
+function FCKToolbarButtonUI_Cleanup()
+{
+ // This one should not cause memory leak, but just for safety, let's clean
+ // it up.
+ this.MainElement = null ;
+}
+
+/*
+ Sample outputs:
+
+ 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"><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>
+
+ These are samples of possible {Image} values:
+
+ Strip - IE version:
+ <div class="TB_Button_Image"><img src="strip.gif" style="top:-16px"></div>
+
+ Strip : Firefox, Safari and Opera version
+ <img class="TB_Button_Image" style="background-position: 0px -16px;background-image: url(strip.gif);">
+
+ No-Strip : Browser independent:
+ <img class="TB_Button_Image" src="smiley.gif">
+*/
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarfontformatcombo.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarfontformatcombo.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,139 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKToolbarPanelButton Class: Handles the Fonts combo selector.
+ */
+
+var FCKToolbarFontFormatCombo = function( tooltip, style )
+{
+ if ( tooltip === false )
+ return ;
+
+ this.CommandName = 'FontFormat' ;
+ this.Label = this.GetLabel() ;
+ this.Tooltip = tooltip ? tooltip : this.Label ;
+ this.Style = style ? style : FCK_TOOLBARITEM_ICONTEXT ;
+
+ this.NormalLabel = 'Normal' ;
+
+ this.PanelWidth = 190 ;
+
+ this.DefaultLabel = FCKConfig.DefaultFontFormatLabel || '' ;
+}
+
+// Inherit from FCKToolbarSpecialCombo.
+FCKToolbarFontFormatCombo.prototype = new FCKToolbarStyleCombo( false ) ;
+
+FCKToolbarFontFormatCombo.prototype.GetLabel = function()
+{
+ return FCKLang.FontFormat ;
+}
+
+FCKToolbarFontFormatCombo.prototype.GetStyles = function()
+{
+ var styles = {} ;
+
+ // Get the format names from the language file.
+ var aNames = FCKLang['FontFormats'].split(';') ;
+ var oNames = {
+ p : aNames[0],
+ pre : aNames[1],
+ address : aNames[2],
+ h1 : aNames[3],
+ h2 : aNames[4],
+ h3 : aNames[5],
+ h4 : aNames[6],
+ h5 : aNames[7],
+ h6 : aNames[8],
+ div : aNames[9] || ( aNames[0] + ' (DIV)')
+ } ;
+
+ // Get the available formats from the configuration file.
+ var elements = FCKConfig.FontFormats.split(';') ;
+
+ for ( var i = 0 ; i < elements.length ; i++ )
+ {
+ var elementName = elements[ i ] ;
+ var style = FCKStyles.GetStyle( '_FCK_' + elementName ) ;
+ if ( style )
+ {
+ style.Label = oNames[ elementName ] ;
+ styles[ '_FCK_' + elementName ] = style ;
+ }
+ else
+ alert( "The FCKConfig.CoreStyles['" + elementName + "'] setting was not found. Please check the fckconfig.js file" ) ;
+ }
+
+ return styles ;
+}
+
+FCKToolbarFontFormatCombo.prototype.RefreshActiveItems = function( targetSpecialCombo )
+{
+ var startElement = FCK.ToolbarSet.CurrentInstance.Selection.GetBoundaryParentElement( true ) ;
+
+ if ( startElement )
+ {
+ var path = new FCKElementPath( startElement ) ;
+ var blockElement = path.Block ;
+
+ if ( blockElement )
+ {
+ for ( var i in targetSpecialCombo.Items )
+ {
+ var item = targetSpecialCombo.Items[i] ;
+ var style = item.Style ;
+
+ if ( style.CheckElementRemovable( blockElement ) )
+ {
+ targetSpecialCombo.SetLabel( style.Label ) ;
+ return ;
+ }
+ }
+ }
+ }
+
+ targetSpecialCombo.SetLabel( this.DefaultLabel ) ;
+}
+
+FCKToolbarFontFormatCombo.prototype.StyleCombo_OnBeforeClick = function( targetSpecialCombo )
+{
+ // Clear the current selection.
+ targetSpecialCombo.DeselectAll() ;
+
+ var startElement = FCK.ToolbarSet.CurrentInstance.Selection.GetBoundaryParentElement( true ) ;
+
+ if ( startElement )
+ {
+ var path = new FCKElementPath( startElement ) ;
+ var blockElement = path.Block ;
+
+ for ( var i in targetSpecialCombo.Items )
+ {
+ var item = targetSpecialCombo.Items[i] ;
+ var style = item.Style ;
+
+ if ( style.CheckElementRemovable( blockElement ) )
+ {
+ targetSpecialCombo.SelectItem( item ) ;
+ return ;
+ }
+ }
+ }
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarfontscombo.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarfontscombo.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,98 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKToolbarPanelButton Class: Handles the Fonts combo selector.
+ */
+
+var FCKToolbarFontsCombo = function( tooltip, style )
+{
+ this.CommandName = 'FontName' ;
+ this.Label = this.GetLabel() ;
+ this.Tooltip = tooltip ? tooltip : this.Label ;
+ this.Style = style ? style : FCK_TOOLBARITEM_ICONTEXT ;
+
+ this.DefaultLabel = FCKConfig.DefaultFontLabel || '' ;
+}
+
+// Inherit from FCKToolbarSpecialCombo.
+FCKToolbarFontsCombo.prototype = new FCKToolbarFontFormatCombo( false ) ;
+
+FCKToolbarFontsCombo.prototype.GetLabel = function()
+{
+ return FCKLang.Font ;
+}
+
+FCKToolbarFontsCombo.prototype.GetStyles = function()
+{
+ var baseStyle = FCKStyles.GetStyle( '_FCK_FontFace' ) ;
+
+ if ( !baseStyle )
+ {
+ alert( "The FCKConfig.CoreStyles['Size'] setting was not found. Please check the fckconfig.js file" ) ;
+ return {} ;
+ }
+
+ var styles = {} ;
+
+ var fonts = FCKConfig.FontNames.split(';') ;
+
+ for ( var i = 0 ; i < fonts.length ; i++ )
+ {
+ var fontParts = fonts[i].split('/') ;
+ var font = fontParts[0] ;
+ var caption = fontParts[1] || font ;
+
+ var style = FCKTools.CloneObject( baseStyle ) ;
+
+ style.SetVariable( 'Font', font ) ;
+ style.Label = caption ;
+
+ styles[ caption ] = style ;
+ }
+
+ return styles ;
+}
+
+FCKToolbarFontsCombo.prototype.RefreshActiveItems = FCKToolbarStyleCombo.prototype.RefreshActiveItems ;
+
+FCKToolbarFontsCombo.prototype.StyleCombo_OnBeforeClick = function( targetSpecialCombo )
+{
+ // Clear the current selection.
+ targetSpecialCombo.DeselectAll() ;
+
+ var startElement = FCKSelection.GetBoundaryParentElement( true ) ;
+
+ if ( startElement )
+ {
+ var path = new FCKElementPath( startElement ) ;
+
+ for ( var i in targetSpecialCombo.Items )
+ {
+ var item = targetSpecialCombo.Items[i] ;
+ var style = item.Style ;
+
+ if ( style.CheckActive( path ) )
+ {
+ targetSpecialCombo.SelectItem( item ) ;
+ return ;
+ }
+ }
+ }
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarfontsizecombo.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarfontsizecombo.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,76 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKToolbarPanelButton Class: Handles the Fonts combo selector.
+ */
+
+var FCKToolbarFontSizeCombo = function( tooltip, style )
+{
+ this.CommandName = 'FontSize' ;
+ this.Label = this.GetLabel() ;
+ this.Tooltip = tooltip ? tooltip : this.Label ;
+ this.Style = style ? style : FCK_TOOLBARITEM_ICONTEXT ;
+
+ this.DefaultLabel = FCKConfig.DefaultFontSizeLabel || '' ;
+
+ this.FieldWidth = 70 ;
+}
+
+// Inherit from FCKToolbarSpecialCombo.
+FCKToolbarFontSizeCombo.prototype = new FCKToolbarFontFormatCombo( false ) ;
+
+FCKToolbarFontSizeCombo.prototype.GetLabel = function()
+{
+ return FCKLang.FontSize ;
+}
+
+FCKToolbarFontSizeCombo.prototype.GetStyles = function()
+{
+ var baseStyle = FCKStyles.GetStyle( '_FCK_Size' ) ;
+
+ if ( !baseStyle )
+ {
+ alert( "The FCKConfig.CoreStyles['FontFace'] setting was not found. Please check the fckconfig.js file" ) ;
+ return {} ;
+ }
+
+ var styles = {} ;
+
+ var fonts = FCKConfig.FontSizes.split(';') ;
+
+ for ( var i = 0 ; i < fonts.length ; i++ )
+ {
+ var fontParts = fonts[i].split('/') ;
+ var font = fontParts[0] ;
+ var caption = fontParts[1] || font ;
+
+ var style = FCKTools.CloneObject( baseStyle ) ;
+ style.SetVariable( 'Size', font ) ;
+ style.Label = caption ;
+
+ styles[ caption ] = style ;
+ }
+
+ return styles ;
+}
+
+FCKToolbarFontSizeCombo.prototype.RefreshActiveItems = FCKToolbarStyleCombo.prototype.RefreshActiveItems ;
+
+FCKToolbarFontSizeCombo.prototype.StyleCombo_OnBeforeClick = FCKToolbarFontsCombo.prototype.StyleCombo_OnBeforeClick ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarpanelbutton.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarpanelbutton.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,103 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKToolbarPanelButton Class: represents a special button in the toolbar
+ * that shows a panel when pressed.
+ */
+
+var FCKToolbarPanelButton = function( commandName, label, tooltip, style, icon )
+{
+ this.CommandName = commandName ;
+
+ var oIcon ;
+
+ if ( icon == null )
+ oIcon = FCKConfig.SkinPath + 'toolbar/' + commandName.toLowerCase() + '.gif' ;
+ else if ( typeof( icon ) == 'number' )
+ oIcon = [ FCKConfig.SkinPath + 'fck_strip.gif', 16, icon ] ;
+
+ var oUIButton = this._UIButton = new FCKToolbarButtonUI( commandName, label, tooltip, oIcon, style ) ;
+ oUIButton._FCKToolbarPanelButton = this ;
+ oUIButton.ShowArrow = true ;
+ oUIButton.OnClick = FCKToolbarPanelButton_OnButtonClick ;
+}
+
+FCKToolbarPanelButton.prototype.TypeName = 'FCKToolbarPanelButton' ;
+
+FCKToolbarPanelButton.prototype.Create = function( parentElement )
+{
+ parentElement.className += 'Menu' ;
+
+ this._UIButton.Create( parentElement ) ;
+
+ var oPanel = FCK.ToolbarSet.CurrentInstance.Commands.GetCommand( this.CommandName )._Panel ;
+ this.RegisterPanel( oPanel ) ;
+}
+
+FCKToolbarPanelButton.prototype.RegisterPanel = function( oPanel )
+{
+ if ( oPanel._FCKToolbarPanelButton )
+ return ;
+
+ oPanel._FCKToolbarPanelButton = this ;
+
+ var eLineDiv = oPanel.Document.body.appendChild( oPanel.Document.createElement( 'div' ) ) ;
+ eLineDiv.style.position = 'absolute' ;
+ eLineDiv.style.top = '0px' ;
+
+ var eLine = oPanel._FCKToolbarPanelButtonLineDiv = eLineDiv.appendChild( oPanel.Document.createElement( 'IMG' ) ) ;
+ eLine.className = 'TB_ConnectionLine' ;
+ eLine.style.position = 'absolute' ;
+// eLine.style.backgroundColor = 'Red' ;
+ eLine.src = FCK_SPACER_PATH ;
+
+ oPanel.OnHide = FCKToolbarPanelButton_OnPanelHide ;
+}
+
+/*
+ Events
+*/
+
+function FCKToolbarPanelButton_OnButtonClick( toolbarButton )
+{
+ var oButton = this._FCKToolbarPanelButton ;
+ var e = oButton._UIButton.MainElement ;
+
+ oButton._UIButton.ChangeState( FCK_TRISTATE_ON ) ;
+
+ // oButton.LineImg.style.width = ( e.offsetWidth - 2 ) + 'px' ;
+
+ var oCommand = FCK.ToolbarSet.CurrentInstance.Commands.GetCommand( oButton.CommandName ) ;
+ var oPanel = oCommand._Panel ;
+ oPanel._FCKToolbarPanelButtonLineDiv.style.width = ( e.offsetWidth - 2 ) + 'px' ;
+ oCommand.Execute( 0, e.offsetHeight - 1, e ) ; // -1 to be over the border
+}
+
+function FCKToolbarPanelButton_OnPanelHide()
+{
+ var oMenuButton = this._FCKToolbarPanelButton ;
+ oMenuButton._UIButton.ChangeState( FCK_TRISTATE_OFF ) ;
+}
+
+// The Panel Button works like a normal button so the refresh state functions
+// defined for the normal button can be reused here.
+FCKToolbarPanelButton.prototype.RefreshState = FCKToolbarButton.prototype.RefreshState ;
+FCKToolbarPanelButton.prototype.Enable = FCKToolbarButton.prototype.Enable ;
+FCKToolbarPanelButton.prototype.Disable = FCKToolbarButton.prototype.Disable ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarspecialcombo.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarspecialcombo.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,146 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * 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...
+ *
+ * The following properties and methods must be implemented when inheriting from
+ * this class:
+ * - Property: CommandName [ The command name to be executed ]
+ * - Method: GetLabel() [ Returns the label ]
+ * - CreateItems( targetSpecialCombo ) [ Add all items in the special combo ]
+ */
+
+var FCKToolbarSpecialCombo = function()
+{
+ this.SourceView = false ;
+ this.ContextSensitive = true ;
+ this.FieldWidth = null ;
+ this.PanelWidth = null ;
+ this.PanelMaxHeight = null ;
+ //this._LastValue = null ;
+}
+
+
+FCKToolbarSpecialCombo.prototype.DefaultLabel = '' ;
+
+function FCKToolbarSpecialCombo_OnSelect( itemId, item )
+{
+ FCK.ToolbarSet.CurrentInstance.Commands.GetCommand( this.CommandName ).Execute( itemId, item ) ;
+}
+
+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.FieldWidth = this.FieldWidth != null ? this.FieldWidth : 100 ;
+ this._Combo.PanelWidth = this.PanelWidth != null ? this.PanelWidth : 150 ;
+ this._Combo.PanelMaxHeight = this.PanelMaxHeight != null ? this.PanelMaxHeight : 150 ;
+ */
+
+ //this._Combo.Command.Name = this.Command.Name;
+// this._Combo.Label = this.Label ;
+ this._Combo.Tooltip = this.Tooltip ;
+ this._Combo.Style = this.Style ;
+
+ this.CreateItems( this._Combo ) ;
+
+ this._Combo.Create( targetElement ) ;
+
+ this._Combo.CommandName = this.CommandName ;
+
+ this._Combo.OnSelect = FCKToolbarSpecialCombo_OnSelect ;
+}
+
+function FCKToolbarSpecialCombo_RefreshActiveItems( combo, value )
+{
+ combo.DeselectAll() ;
+ combo.SelectItem( value ) ;
+ combo.SetLabelById( value ) ;
+}
+
+FCKToolbarSpecialCombo.prototype.RefreshState = function()
+{
+ // Gets the actual state.
+ var eState ;
+
+// if ( FCK.EditMode == FCK_EDITMODE_SOURCE && ! this.SourceView )
+// eState = FCK_TRISTATE_DISABLED ;
+// else
+// {
+ var sValue = FCK.ToolbarSet.CurrentInstance.Commands.GetCommand( this.CommandName ).GetState() ;
+
+// FCKDebug.Output( 'RefreshState of Special Combo "' + this.TypeOf + '" - State: ' + sValue ) ;
+
+ if ( sValue != FCK_TRISTATE_DISABLED )
+ {
+ eState = FCK_TRISTATE_ON ;
+
+ if ( this.RefreshActiveItems )
+ this.RefreshActiveItems( this._Combo, sValue ) ;
+ else
+ {
+ if ( this._LastValue !== sValue)
+ {
+ this._LastValue = sValue ;
+
+ if ( !sValue || sValue.length == 0 )
+ {
+ this._Combo.DeselectAll() ;
+ this._Combo.SetLabel( this.DefaultLabel ) ;
+ }
+ else
+ FCKToolbarSpecialCombo_RefreshActiveItems( this._Combo, sValue ) ;
+ }
+ }
+ }
+ else
+ eState = FCK_TRISTATE_DISABLED ;
+// }
+
+ // If there are no state changes then do nothing and return.
+ if ( eState == this.State ) return ;
+
+ if ( eState == FCK_TRISTATE_DISABLED )
+ {
+ this._Combo.DeselectAll() ;
+ this._Combo.SetLabel( '' ) ;
+ }
+
+ // Sets the actual state.
+ this.State = eState ;
+
+ // Updates the graphical state.
+ this._Combo.SetEnabled( eState != FCK_TRISTATE_DISABLED ) ;
+}
+
+FCKToolbarSpecialCombo.prototype.Enable = function()
+{
+ this.RefreshState() ;
+}
+
+FCKToolbarSpecialCombo.prototype.Disable = function()
+{
+ this.State = FCK_TRISTATE_DISABLED ;
+ this._Combo.DeselectAll() ;
+ this._Combo.SetLabel( '' ) ;
+ this._Combo.SetEnabled( false ) ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarstylecombo.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fcktoolbarstylecombo.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,200 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKToolbarPanelButton Class: Handles the Fonts combo selector.
+ */
+
+var FCKToolbarStyleCombo = function( tooltip, style )
+{
+ if ( tooltip === false )
+ return ;
+
+ this.CommandName = 'Style' ;
+ this.Label = this.GetLabel() ;
+ this.Tooltip = tooltip ? tooltip : this.Label ;
+ this.Style = style ? style : FCK_TOOLBARITEM_ICONTEXT ;
+
+ this.DefaultLabel = FCKConfig.DefaultStyleLabel || '' ;
+}
+
+// Inherit from FCKToolbarSpecialCombo.
+FCKToolbarStyleCombo.prototype = new FCKToolbarSpecialCombo ;
+
+FCKToolbarStyleCombo.prototype.GetLabel = function()
+{
+ return FCKLang.Style ;
+}
+
+FCKToolbarStyleCombo.prototype.GetStyles = function()
+{
+ var styles = {} ;
+ var allStyles = FCK.ToolbarSet.CurrentInstance.Styles.GetStyles() ;
+
+ for ( var styleName in allStyles )
+ {
+ var style = allStyles[ styleName ] ;
+ if ( !style.IsCore )
+ styles[ styleName ] = style ;
+ }
+ return styles ;
+}
+
+FCKToolbarStyleCombo.prototype.CreateItems = function( targetSpecialCombo )
+{
+ var targetDoc = targetSpecialCombo._Panel.Document ;
+
+ // Add the Editor Area CSS to the panel so the style classes are previewed correctly.
+ FCKTools.AppendStyleSheet( targetDoc, FCKConfig.ToolbarComboPreviewCSS ) ;
+ FCKTools.AppendStyleString( targetDoc, FCKConfig.EditorAreaStyles ) ;
+ targetDoc.body.className += ' ForceBaseFont' ;
+
+ // Add ID and Class to the body.
+ FCKConfig.ApplyBodyAttributes( targetDoc.body ) ;
+
+ // Get the styles list.
+ var styles = this.GetStyles() ;
+
+ for ( var styleName in styles )
+ {
+ var style = styles[ styleName ] ;
+
+ // Object type styles have no preview.
+ var caption = style.GetType() == FCK_STYLE_OBJECT ?
+ styleName :
+ FCKToolbarStyleCombo_BuildPreview( style, style.Label || styleName ) ;
+
+ var item = targetSpecialCombo.AddItem( styleName, caption ) ;
+
+ item.Style = style ;
+ }
+
+ // We must prepare the list before showing it.
+ targetSpecialCombo.OnBeforeClick = this.StyleCombo_OnBeforeClick ;
+}
+
+FCKToolbarStyleCombo.prototype.RefreshActiveItems = function( targetSpecialCombo )
+{
+ var startElement = FCK.ToolbarSet.CurrentInstance.Selection.GetBoundaryParentElement( true ) ;
+
+ if ( startElement )
+ {
+ var path = new FCKElementPath( startElement ) ;
+ var elements = path.Elements ;
+
+ for ( var e = 0 ; e < elements.length ; e++ )
+ {
+ for ( var i in targetSpecialCombo.Items )
+ {
+ var item = targetSpecialCombo.Items[i] ;
+ var style = item.Style ;
+
+ if ( style.CheckElementRemovable( elements[ e ], true ) )
+ {
+ targetSpecialCombo.SetLabel( style.Label || style.Name ) ;
+ return ;
+ }
+ }
+ }
+ }
+
+ targetSpecialCombo.SetLabel( this.DefaultLabel ) ;
+}
+
+FCKToolbarStyleCombo.prototype.StyleCombo_OnBeforeClick = function( targetSpecialCombo )
+{
+ // Two things are done here:
+ // - In a control selection, get the element name, so we'll display styles
+ // for that element only.
+ // - Select the styles that are active for the current selection.
+
+ // Clear the current selection.
+ targetSpecialCombo.DeselectAll() ;
+
+ var startElement ;
+ var path ;
+ var tagName ;
+
+ var selection = FCK.ToolbarSet.CurrentInstance.Selection ;
+
+ if ( selection.GetType() == 'Control' )
+ {
+ startElement = selection.GetSelectedElement() ;
+ tagName = startElement.nodeName.toLowerCase() ;
+ }
+ else
+ {
+ startElement = selection.GetBoundaryParentElement( true ) ;
+ path = new FCKElementPath( startElement ) ;
+ }
+
+ for ( var i in targetSpecialCombo.Items )
+ {
+ var item = targetSpecialCombo.Items[i] ;
+ var style = item.Style ;
+
+ if ( ( tagName && style.Element == tagName ) || ( !tagName && style.GetType() != FCK_STYLE_OBJECT ) )
+ {
+ item.style.display = '' ;
+
+ if ( ( path && style.CheckActive( path ) ) || ( !path && style.CheckElementRemovable( startElement, true ) ) )
+ targetSpecialCombo.SelectItem( style.Name ) ;
+ }
+ else
+ item.style.display = 'none' ;
+ }
+}
+
+function FCKToolbarStyleCombo_BuildPreview( style, caption )
+{
+ var styleType = style.GetType() ;
+ var html = [] ;
+
+ if ( styleType == FCK_STYLE_BLOCK )
+ html.push( '<div class="BaseFont">' ) ;
+
+ var elementName = style.Element ;
+
+ // Avoid <bdo> in the preview.
+ if ( elementName == 'bdo' )
+ elementName = 'span' ;
+
+ html = [ '<', elementName ] ;
+
+ // Assign all defined attributes.
+ var attribs = style._StyleDesc.Attributes ;
+ if ( attribs )
+ {
+ for ( var att in attribs )
+ {
+ html.push( ' ', att, '="', style.GetFinalAttributeValue( att ), '"' ) ;
+ }
+ }
+
+ // Assign the style attribute.
+ if ( style._GetStyleText().length > 0 )
+ html.push( ' style="', style.GetFinalStyleValue(), '"' ) ;
+
+ html.push( '>', caption, '</', elementName, '>' ) ;
+
+ if ( styleType == FCK_STYLE_BLOCK )
+ html.push( '</div>' ) ;
+
+ return html.join( '' ) ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckw3crange.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckw3crange.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,451 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This class partially implements the W3C DOM Range for browser that don't
+ * support the standards (like IE):
+ * http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html
+ */
+
+var FCKW3CRange = function( parentDocument )
+{
+ this._Document = parentDocument ;
+
+ this.startContainer = null ;
+ this.startOffset = null ;
+ this.endContainer = null ;
+ this.endOffset = null ;
+ this.collapsed = true ;
+}
+
+FCKW3CRange.CreateRange = function( parentDocument )
+{
+ // We could opt to use the Range implementation of the browsers. The problem
+ // is that every browser have different bugs on their implementations,
+ // mostly related to different interpretations of the W3C specifications.
+ // So, for now, let's use our implementation and pray for browsers fixings
+ // soon. Otherwise will go crazy on trying to find out workarounds.
+ /*
+ // Get the browser implementation of the range, if available.
+ if ( parentDocument.createRange )
+ {
+ var range = parentDocument.createRange() ;
+ if ( typeof( range.startContainer ) != 'undefined' )
+ return range ;
+ }
+ */
+ return new FCKW3CRange( parentDocument ) ;
+}
+
+FCKW3CRange.CreateFromRange = function( parentDocument, sourceRange )
+{
+ var range = FCKW3CRange.CreateRange( parentDocument ) ;
+ range.setStart( sourceRange.startContainer, sourceRange.startOffset ) ;
+ range.setEnd( sourceRange.endContainer, sourceRange.endOffset ) ;
+ return range ;
+}
+
+FCKW3CRange.prototype =
+{
+
+ _UpdateCollapsed : function()
+ {
+ this.collapsed = ( this.startContainer == this.endContainer && this.startOffset == this.endOffset ) ;
+ },
+
+ // 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
+ // will not need this check for our use of this class so we can ignore it for now.
+ setStart : function( refNode, offset )
+ {
+ this.startContainer = refNode ;
+ this.startOffset = offset ;
+
+ if ( !this.endContainer )
+ {
+ this.endContainer = refNode ;
+ this.endOffset = offset ;
+ }
+
+ this._UpdateCollapsed() ;
+ },
+
+ // 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
+ // will not need this check for our use of this class so we can ignore it for now.
+ setEnd : function( refNode, offset )
+ {
+ this.endContainer = refNode ;
+ this.endOffset = offset ;
+
+ if ( !this.startContainer )
+ {
+ this.startContainer = refNode ;
+ this.startOffset = offset ;
+ }
+
+ this._UpdateCollapsed() ;
+ },
+
+ setStartAfter : function( refNode )
+ {
+ this.setStart( refNode.parentNode, FCKDomTools.GetIndexOf( refNode ) + 1 ) ;
+ },
+
+ setStartBefore : function( refNode )
+ {
+ this.setStart( refNode.parentNode, FCKDomTools.GetIndexOf( refNode ) ) ;
+ },
+
+ setEndAfter : function( refNode )
+ {
+ this.setEnd( refNode.parentNode, FCKDomTools.GetIndexOf( refNode ) + 1 ) ;
+ },
+
+ setEndBefore : function( refNode )
+ {
+ this.setEnd( refNode.parentNode, FCKDomTools.GetIndexOf( refNode ) ) ;
+ },
+
+ collapse : function( toStart )
+ {
+ if ( toStart )
+ {
+ this.endContainer = this.startContainer ;
+ this.endOffset = this.startOffset ;
+ }
+ else
+ {
+ this.startContainer = this.endContainer ;
+ this.startOffset = this.endOffset ;
+ }
+
+ this.collapsed = true ;
+ },
+
+ selectNodeContents : function( refNode )
+ {
+ this.setStart( refNode, 0 ) ;
+ this.setEnd( refNode, refNode.nodeType == 3 ? refNode.data.length : refNode.childNodes.length ) ;
+ },
+
+ insertNode : function( newNode )
+ {
+ var startContainer = this.startContainer ;
+ var startOffset = this.startOffset ;
+
+ // If we are in a text node.
+ if ( startContainer.nodeType == 3 )
+ {
+ startContainer.splitText( startOffset ) ;
+
+ // Check if it is necessary to update the end boundary.
+ if ( startContainer == this.endContainer )
+ this.setEnd( startContainer.nextSibling, this.endOffset - this.startOffset ) ;
+
+ // Insert the new node it after the text node.
+ FCKDomTools.InsertAfterNode( startContainer, newNode ) ;
+
+ return ;
+ }
+ else
+ {
+ // Simply insert the new node before the current start node.
+ startContainer.insertBefore( newNode, startContainer.childNodes[ startOffset ] || null ) ;
+
+ // Check if it is necessary to update the end boundary.
+ if ( startContainer == this.endContainer )
+ {
+ this.endOffset++ ;
+ this.collapsed = false ;
+ }
+ }
+ },
+
+ deleteContents : function()
+ {
+ if ( this.collapsed )
+ return ;
+
+ this._ExecContentsAction( 0 ) ;
+ },
+
+ extractContents : function()
+ {
+ var docFrag = new FCKDocumentFragment( this._Document ) ;
+
+ if ( !this.collapsed )
+ this._ExecContentsAction( 1, docFrag ) ;
+
+ return docFrag ;
+ },
+
+ // The selection may be lost when cloning (due to the splitText() call).
+ cloneContents : function()
+ {
+ var docFrag = new FCKDocumentFragment( this._Document ) ;
+
+ if ( !this.collapsed )
+ this._ExecContentsAction( 2, docFrag ) ;
+
+ return docFrag ;
+ },
+
+ _ExecContentsAction : function( action, docFrag )
+ {
+ var startNode = this.startContainer ;
+ var endNode = this.endContainer ;
+
+ var startOffset = this.startOffset ;
+ var endOffset = this.endOffset ;
+
+ var removeStartNode = false ;
+ var removeEndNode = false ;
+
+ // 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 boundary may interfere on the results here.
+
+ // 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 .
+ if ( endNode.nodeType == 3 )
+ endNode = endNode.splitText( endOffset ) ;
+ else
+ {
+ // If the end container has children and the offset is pointing
+ // to a child, then we should start from it.
+ if ( endNode.childNodes.length > 0 )
+ {
+ // If the offset points after the last node.
+ if ( endOffset > endNode.childNodes.length - 1 )
+ {
+ // Let's create a temporary node and mark it for removal.
+ endNode = FCKDomTools.InsertAfterNode( endNode.lastChild, this._Document.createTextNode('') ) ;
+ removeEndNode = true ;
+ }
+ else
+ endNode = endNode.childNodes[ endOffset ] ;
+ }
+ }
+
+ // For text containers, we must simply split the node. The removal will
+ // be handled by the rest of the code .
+ if ( startNode.nodeType == 3 )
+ {
+ startNode.splitText( startOffset ) ;
+
+ // 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
+ // the second part of the split.
+ if ( startNode == endNode )
+ endNode = startNode.nextSibling ;
+ }
+ else
+ {
+ // If the start container has children and the offset is pointing
+ // to a child, then we should start from its previous sibling.
+
+ // 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.
+ if ( startOffset == 0 )
+ {
+ // Let's create a temporary node and mark it for removal.
+ startNode = startNode.insertBefore( this._Document.createTextNode(''), startNode.firstChild ) ;
+ removeStartNode = true ;
+ }
+ else if ( startOffset > startNode.childNodes.length - 1 )
+ {
+ // Let's create a temporary node and mark it for removal.
+ startNode = startNode.appendChild( this._Document.createTextNode('') ) ;
+ removeStartNode = true ;
+ }
+ else
+ startNode = startNode.childNodes[ startOffset ].previousSibling ;
+ }
+
+ // Get the parent nodes tree for the start and end boundaries.
+ var startParents = FCKDomTools.GetParents( startNode ) ;
+ var endParents = FCKDomTools.GetParents( endNode ) ;
+
+ // Compare them, to find the top most siblings.
+ var i, topStart, topEnd ;
+
+ for ( i = 0 ; i < startParents.length ; i++ )
+ {
+ topStart = startParents[i] ;
+ topEnd = endParents[i] ;
+
+ // The compared nodes will match until we find the top most
+ // siblings (different nodes that have the same parent).
+ // "i" will hold the index in the parents array for the top
+ // most element.
+ if ( topStart != topEnd )
+ break ;
+ }
+
+ var clone, levelStartNode, levelClone, currentNode, currentSibling ;
+
+ if ( docFrag )
+ clone = docFrag.RootNode ;
+
+ // Remove all successive sibling nodes for every node in the
+ // startParents tree.
+ for ( var j = i ; j < startParents.length ; j++ )
+ {
+ levelStartNode = startParents[j] ;
+
+ // For Extract and Clone, we must clone this level.
+ if ( clone && levelStartNode != startNode ) // action = 0 = Delete
+ levelClone = clone.appendChild( levelStartNode.cloneNode( levelStartNode == startNode ) ) ;
+
+ currentNode = levelStartNode.nextSibling ;
+
+ while( currentNode )
+ {
+ // Stop processing when the current node matches a node in the
+ // endParents tree or if it is the endNode.
+ if ( currentNode == endParents[j] || currentNode == endNode )
+ break ;
+
+ // Cache the next sibling.
+ currentSibling = currentNode.nextSibling ;
+
+ // If cloning, just clone it.
+ if ( action == 2 ) // 2 = Clone
+ clone.appendChild( currentNode.cloneNode( true ) ) ;
+ else
+ {
+ // Both Delete and Extract will remove the node.
+ currentNode.parentNode.removeChild( currentNode ) ;
+
+ // When Extracting, move the removed node to the docFrag.
+ if ( action == 1 ) // 1 = Extract
+ clone.appendChild( currentNode ) ;
+ }
+
+ currentNode = currentSibling ;
+ }
+
+ if ( clone )
+ clone = levelClone ;
+ }
+
+ if ( docFrag )
+ clone = docFrag.RootNode ;
+
+ // Remove all previous sibling nodes for every node in the
+ // endParents tree.
+ for ( var k = i ; k < endParents.length ; k++ )
+ {
+ levelStartNode = endParents[k] ;
+
+ // For Extract and Clone, we must clone this level.
+ if ( action > 0 && levelStartNode != endNode ) // action = 0 = Delete
+ levelClone = clone.appendChild( levelStartNode.cloneNode( levelStartNode == endNode ) ) ;
+
+ // The processing of siblings may have already been done by the parent.
+ if ( !startParents[k] || levelStartNode.parentNode != startParents[k].parentNode )
+ {
+ currentNode = levelStartNode.previousSibling ;
+
+ while( currentNode )
+ {
+ // Stop processing when the current node matches a node in the
+ // startParents tree or if it is the startNode.
+ if ( currentNode == startParents[k] || currentNode == startNode )
+ break ;
+
+ // Cache the next sibling.
+ currentSibling = currentNode.previousSibling ;
+
+ // If cloning, just clone it.
+ if ( action == 2 ) // 2 = Clone
+ clone.insertBefore( currentNode.cloneNode( true ), clone.firstChild ) ;
+ else
+ {
+ // Both Delete and Extract will remove the node.
+ currentNode.parentNode.removeChild( currentNode ) ;
+
+ // When Extracting, mode the removed node to the docFrag.
+ if ( action == 1 ) // 1 = Extract
+ clone.insertBefore( currentNode, clone.firstChild ) ;
+ }
+
+ currentNode = currentSibling ;
+ }
+ }
+
+ if ( clone )
+ clone = levelClone ;
+ }
+
+ if ( action == 2 ) // 2 = Clone.
+ {
+ // No changes in the DOM should be done, so fix the split text (if any).
+
+ var startTextNode = this.startContainer ;
+ if ( startTextNode.nodeType == 3 )
+ {
+ startTextNode.data += startTextNode.nextSibling.data ;
+ startTextNode.parentNode.removeChild( startTextNode.nextSibling ) ;
+ }
+
+ var endTextNode = this.endContainer ;
+ if ( endTextNode.nodeType == 3 && endTextNode.nextSibling )
+ {
+ endTextNode.data += endTextNode.nextSibling.data ;
+ endTextNode.parentNode.removeChild( endTextNode.nextSibling ) ;
+ }
+ }
+ else
+ {
+ // Collapse the range.
+
+ // If a node has been partially selected, collapse the range between
+ // topStart and topEnd. Otherwise, simply collapse it to the start. (W3C specs).
+ if ( topStart && topEnd && ( startNode.parentNode != topStart.parentNode || endNode.parentNode != topEnd.parentNode ) )
+ {
+ var endIndex = FCKDomTools.GetIndexOf( topEnd ) ;
+
+ // If the start node is to be removed, we must correct the
+ // index to reflect the removal.
+ if ( removeStartNode && topEnd.parentNode == startNode.parentNode )
+ endIndex-- ;
+
+ this.setStart( topEnd.parentNode, endIndex ) ;
+ }
+
+ // Collapse it to the start.
+ this.collapse( true ) ;
+ }
+
+ // Cleanup any marked node.
+ if( removeStartNode )
+ startNode.parentNode.removeChild( startNode ) ;
+
+ if( removeEndNode && endNode.parentNode )
+ endNode.parentNode.removeChild( endNode ) ;
+ },
+
+ cloneRange : function()
+ {
+ return FCKW3CRange.CreateFromRange( this._Document, this ) ;
+ }
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckxml.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckxml.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,108 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKXml Class: class to load and manipulate XML files.
+ * (IE specific implementation)
+ */
+
+var FCKXml = function()
+{
+ this.Error = false ;
+}
+
+FCKXml.GetAttribute = function( node, attName, defaultValue )
+{
+ var attNode = node.attributes.getNamedItem( attName ) ;
+ return attNode ? attNode.value : defaultValue ;
+}
+
+/**
+ * Transforms a XML element node in a JavaScript object. Attributes defined for
+ * the element will be available as properties, as long as child element
+ * nodes, but the later will generate arrays with property names prefixed with "$".
+ *
+ * For example, the following XML element:
+ *
+ * <SomeNode name="Test" key="2">
+ * <MyChild id="10">
+ * <OtherLevel name="Level 3" />
+ * </MyChild>
+ * <MyChild id="25" />
+ * <AnotherChild price="499" />
+ * </SomeNode>
+ *
+ * ... results in the following object:
+ *
+ * {
+ * name : "Test",
+ * key : "2",
+ * $MyChild :
+ * [
+ * {
+ * id : "10",
+ * $OtherLevel :
+ * {
+ * name : "Level 3"
+ * }
+ * },
+ * {
+ * id : "25"
+ * }
+ * ],
+ * $AnotherChild :
+ * [
+ * {
+ * price : "499"
+ * }
+ * ]
+ * }
+ */
+FCKXml.TransformToObject = function( element )
+{
+ if ( !element )
+ return null ;
+
+ var obj = {} ;
+
+ var attributes = element.attributes ;
+ for ( var i = 0 ; i < attributes.length ; i++ )
+ {
+ var att = attributes[i] ;
+ obj[ att.name ] = att.value ;
+ }
+
+ var childNodes = element.childNodes ;
+ for ( i = 0 ; i < childNodes.length ; i++ )
+ {
+ var child = childNodes[i] ;
+
+ if ( child.nodeType == 1 )
+ {
+ var childName = '$' + child.nodeName ;
+ var childList = obj[ childName ] ;
+ if ( !childList )
+ childList = obj[ childName ] = [] ;
+
+ childList.push( this.TransformToObject( child ) ) ;
+ }
+ }
+
+ return obj ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckxml_gecko.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckxml_gecko.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,106 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKXml Class: class to load and manipulate XML files.
+ */
+
+FCKXml.prototype =
+{
+ LoadUrl : function( urlToCall )
+ {
+ this.Error = false ;
+
+ var oXml ;
+ var oXmlHttp = FCKTools.CreateXmlObject( 'XmlHttp' ) ;
+ oXmlHttp.open( 'GET', urlToCall, false ) ;
+ oXmlHttp.send( null ) ;
+
+ if ( oXmlHttp.status == 200 || oXmlHttp.status == 304 || ( oXmlHttp.status == 0 && oXmlHttp.readyState == 4 ) )
+ {
+ oXml = oXmlHttp.responseXML ;
+ // #1426: Fallback if responseXML isn't set for some
+ // reason (e.g. improperly configured web server)
+ if ( !oXml )
+ oXml = (new DOMParser()).parseFromString( oXmlHttp.responseText, 'text/xml' ) ;
+ }
+ else
+ oXml = null ;
+
+ if ( oXml )
+ {
+ // Try to access something on it.
+ try
+ {
+ var test = oXml.firstChild ;
+ }
+ catch (e)
+ {
+ // 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/
+ oXml = (new DOMParser()).parseFromString( oXmlHttp.responseText, 'text/xml' ) ;
+ }
+ }
+
+ if ( !oXml || !oXml.firstChild )
+ {
+ 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 ) ;
+ }
+
+ this.DOMDocument = oXml ;
+ },
+
+ SelectNodes : function( xpath, contextNode )
+ {
+ if ( this.Error )
+ return new Array() ;
+
+ var aNodeArray = new Array();
+
+ var xPathResult = this.DOMDocument.evaluate( xpath, contextNode ? contextNode : this.DOMDocument,
+ this.DOMDocument.createNSResolver(this.DOMDocument.documentElement), XPathResult.ORDERED_NODE_ITERATOR_TYPE, null) ;
+ if ( xPathResult )
+ {
+ var oNode = xPathResult.iterateNext() ;
+ while( oNode )
+ {
+ aNodeArray[aNodeArray.length] = oNode ;
+ oNode = xPathResult.iterateNext();
+ }
+ }
+ return aNodeArray ;
+ },
+
+ SelectSingleNode : function( xpath, contextNode )
+ {
+ if ( this.Error )
+ return null ;
+
+ var xPathResult = this.DOMDocument.evaluate( xpath, contextNode ? contextNode : this.DOMDocument,
+ this.DOMDocument.createNSResolver(this.DOMDocument.documentElement), 9, null);
+
+ if ( xPathResult && xPathResult.singleNodeValue )
+ return xPathResult.singleNodeValue ;
+ else
+ return null ;
+ }
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckxml_ie.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/classes/fckxml_ie.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,93 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKXml Class: class to load and manipulate XML files.
+ * (IE specific implementation)
+ */
+
+FCKXml.prototype =
+{
+ LoadUrl : function( urlToCall )
+ {
+ this.Error = false ;
+
+ var oXmlHttp = FCKTools.CreateXmlObject( 'XmlHttp' ) ;
+
+ if ( !oXmlHttp )
+ {
+ this.Error = true ;
+ return ;
+ }
+
+ oXmlHttp.open( "GET", urlToCall, false ) ;
+
+ oXmlHttp.send( null ) ;
+
+ if ( oXmlHttp.status == 200 || oXmlHttp.status == 304 || ( oXmlHttp.status == 0 && oXmlHttp.readyState == 4 ) )
+ {
+ this.DOMDocument = oXmlHttp.responseXML ;
+
+ // #1426: Fallback if responseXML isn't set for some
+ // reason (e.g. improperly configured web server)
+ if ( !this.DOMDocument || this.DOMDocument.firstChild == null )
+ {
+ this.DOMDocument = FCKTools.CreateXmlObject( 'DOMDocument' ) ;
+ this.DOMDocument.async = false ;
+ this.DOMDocument.resolveExternals = false ;
+ this.DOMDocument.loadXML( oXmlHttp.responseText ) ;
+ }
+ }
+ else
+ {
+ this.DOMDocument = null ;
+ }
+
+ if ( this.DOMDocument == null || this.DOMDocument.firstChild == null )
+ {
+ this.Error = true ;
+ 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' +
+ 'Response text:\r\n' + oXmlHttp.responseText ) ;
+ }
+ },
+
+ SelectNodes : function( xpath, contextNode )
+ {
+ if ( this.Error )
+ return new Array() ;
+
+ if ( contextNode )
+ return contextNode.selectNodes( xpath ) ;
+ else
+ return this.DOMDocument.selectNodes( xpath ) ;
+ },
+
+ SelectSingleNode : function( xpath, contextNode )
+ {
+ if ( this.Error )
+ return null ;
+
+ if ( contextNode )
+ return contextNode.selectSingleNode( xpath ) ;
+ else
+ return this.DOMDocument.selectSingleNode( xpath ) ;
+ }
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fck_othercommands.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fck_othercommands.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,634 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Definition of other commands that are not available internaly in the
+ * browser (see FCKNamedCommand).
+ */
+
+// ### General Dialog Box Commands.
+var FCKDialogCommand = function( name, title, url, width, height, getStateFunction, getStateParam, customValue )
+{
+ this.Name = name ;
+ this.Title = title ;
+ this.Url = url ;
+ this.Width = width ;
+ this.Height = height ;
+ this.CustomValue = customValue ;
+
+ this.GetStateFunction = getStateFunction ;
+ this.GetStateParam = getStateParam ;
+
+ this.Resizable = false ;
+}
+
+FCKDialogCommand.prototype.Execute = function()
+{
+ FCKDialog.OpenDialog( 'FCKDialog_' + this.Name , this.Title, this.Url, this.Width, this.Height, this.CustomValue, null, this.Resizable ) ;
+}
+
+FCKDialogCommand.prototype.GetState = function()
+{
+ if ( this.GetStateFunction )
+ return this.GetStateFunction( this.GetStateParam ) ;
+ else
+ return FCK.EditMode == FCK_EDITMODE_WYSIWYG ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
+}
+
+// Generic Undefined command (usually used when a command is under development).
+var FCKUndefinedCommand = function()
+{
+ this.Name = 'Undefined' ;
+}
+
+FCKUndefinedCommand.prototype.Execute = function()
+{
+ alert( FCKLang.NotImplemented ) ;
+}
+
+FCKUndefinedCommand.prototype.GetState = function()
+{
+ return FCK_TRISTATE_OFF ;
+}
+
+
+// ### FormatBlock
+var FCKFormatBlockCommand = function()
+{}
+
+FCKFormatBlockCommand.prototype =
+{
+ Name : 'FormatBlock',
+
+ Execute : FCKStyleCommand.prototype.Execute,
+
+ GetState : function()
+ {
+ return FCK.EditorDocument ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
+ }
+};
+
+// ### FontName
+
+var FCKFontNameCommand = function()
+{}
+
+FCKFontNameCommand.prototype =
+{
+ Name : 'FontName',
+ Execute : FCKStyleCommand.prototype.Execute,
+ GetState : FCKFormatBlockCommand.prototype.GetState
+};
+
+// ### FontSize
+var FCKFontSizeCommand = function()
+{}
+
+FCKFontSizeCommand.prototype =
+{
+ Name : 'FontSize',
+ Execute : FCKStyleCommand.prototype.Execute,
+ GetState : FCKFormatBlockCommand.prototype.GetState
+};
+
+// ### Preview
+var FCKPreviewCommand = function()
+{
+ this.Name = 'Preview' ;
+}
+
+FCKPreviewCommand.prototype.Execute = function()
+{
+ FCK.Preview() ;
+}
+
+FCKPreviewCommand.prototype.GetState = function()
+{
+ return FCK_TRISTATE_OFF ;
+}
+
+// ### Save
+var FCKSaveCommand = function()
+{
+ this.Name = 'Save' ;
+}
+
+FCKSaveCommand.prototype.Execute = function()
+{
+ // Get the linked field form.
+ var oForm = FCK.GetParentForm() ;
+
+ if ( typeof( oForm.onsubmit ) == 'function' )
+ {
+ var bRet = oForm.onsubmit() ;
+ if ( bRet != null && bRet === false )
+ return ;
+ }
+
+ // Submit the form.
+ // If there's a button named "submit" then the form.submit() function is masked and
+ // can't be called in Mozilla, so we call the click() method of that button.
+ if ( typeof( oForm.submit ) == 'function' )
+ oForm.submit() ;
+ else
+ oForm.submit.click() ;
+}
+
+FCKSaveCommand.prototype.GetState = function()
+{
+ return FCK_TRISTATE_OFF ;
+}
+
+// ### NewPage
+var FCKNewPageCommand = function()
+{
+ this.Name = 'NewPage' ;
+}
+
+FCKNewPageCommand.prototype.Execute = function()
+{
+ FCKUndo.SaveUndoStep() ;
+ FCK.SetData( '' ) ;
+ FCKUndo.Typing = true ;
+ FCK.Focus() ;
+}
+
+FCKNewPageCommand.prototype.GetState = function()
+{
+ return FCK_TRISTATE_OFF ;
+}
+
+// ### Source button
+var FCKSourceCommand = function()
+{
+ this.Name = 'Source' ;
+}
+
+FCKSourceCommand.prototype.Execute = function()
+{
+ if ( FCKConfig.SourcePopup ) // Until v2.2, it was mandatory for FCKBrowserInfo.IsGecko.
+ {
+ var iWidth = FCKConfig.ScreenWidth * 0.65 ;
+ var iHeight = FCKConfig.ScreenHeight * 0.65 ;
+ FCKDialog.OpenDialog( 'FCKDialog_Source', FCKLang.Source, 'dialog/fck_source.html', iWidth, iHeight, null, null, true ) ;
+ }
+ else
+ FCK.SwitchEditMode() ;
+}
+
+FCKSourceCommand.prototype.GetState = function()
+{
+ return ( FCK.EditMode == FCK_EDITMODE_WYSIWYG ? FCK_TRISTATE_OFF : FCK_TRISTATE_ON ) ;
+}
+
+// ### Undo
+var FCKUndoCommand = function()
+{
+ this.Name = 'Undo' ;
+}
+
+FCKUndoCommand.prototype.Execute = function()
+{
+ FCKUndo.Undo() ;
+}
+
+FCKUndoCommand.prototype.GetState = function()
+{
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
+ return FCK_TRISTATE_DISABLED ;
+ return ( FCKUndo.CheckUndoState() ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ) ;
+}
+
+// ### Redo
+var FCKRedoCommand = function()
+{
+ this.Name = 'Redo' ;
+}
+
+FCKRedoCommand.prototype.Execute = function()
+{
+ FCKUndo.Redo() ;
+}
+
+FCKRedoCommand.prototype.GetState = function()
+{
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
+ return FCK_TRISTATE_DISABLED ;
+ return ( FCKUndo.CheckRedoState() ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ) ;
+}
+
+// ### Page Break
+var FCKPageBreakCommand = function()
+{
+ this.Name = 'PageBreak' ;
+}
+
+FCKPageBreakCommand.prototype.Execute = function()
+{
+ // Take an undo snapshot before changing the document
+ FCKUndo.SaveUndoStep() ;
+
+// var e = FCK.EditorDocument.createElement( 'CENTER' ) ;
+// e.style.pageBreakAfter = 'always' ;
+
+ // Tidy was removing the empty CENTER tags, so the following solution has
+ // been found. It also validates correctly as XHTML 1.0 Strict.
+ var e = FCK.EditorDocument.createElement( 'DIV' ) ;
+ e.style.pageBreakAfter = 'always' ;
+ e.innerHTML = '<span style="DISPLAY:none"> </span>' ;
+
+ var oFakeImage = FCKDocumentProcessor_CreateFakeImage( 'FCK__PageBreak', e ) ;
+ var oRange = new FCKDomRange( FCK.EditorWindow ) ;
+ oRange.MoveToSelection() ;
+ var oSplitInfo = oRange.SplitBlock() ;
+ oRange.InsertNode( oFakeImage ) ;
+
+ FCK.Events.FireEvent( 'OnSelectionChange' ) ;
+}
+
+FCKPageBreakCommand.prototype.GetState = function()
+{
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
+ return FCK_TRISTATE_DISABLED ;
+ return 0 ; // FCK_TRISTATE_OFF
+}
+
+// FCKUnlinkCommand - by Johnny Egeland (johnny at coretrek.com)
+var FCKUnlinkCommand = function()
+{
+ this.Name = 'Unlink' ;
+}
+
+FCKUnlinkCommand.prototype.Execute = function()
+{
+ // Take an undo snapshot before changing the document
+ FCKUndo.SaveUndoStep() ;
+
+ if ( FCKBrowserInfo.IsGeckoLike )
+ {
+ var oLink = FCK.Selection.MoveToAncestorNode( 'A' ) ;
+ // The unlink command can generate a span in Firefox, so let's do it our way. See #430
+ if ( oLink )
+ FCKTools.RemoveOuterTags( oLink ) ;
+
+ return ;
+ }
+
+ FCK.ExecuteNamedCommand( this.Name ) ;
+}
+
+FCKUnlinkCommand.prototype.GetState = function()
+{
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
+ return FCK_TRISTATE_DISABLED ;
+ var state = FCK.GetNamedCommandState( this.Name ) ;
+
+ // Check that it isn't an anchor
+ if ( state == FCK_TRISTATE_OFF && FCK.EditMode == FCK_EDITMODE_WYSIWYG )
+ {
+ var oLink = FCKSelection.MoveToAncestorNode( 'A' ) ;
+ var bIsAnchor = ( oLink && oLink.name.length > 0 && oLink.href.length == 0 ) ;
+ if ( bIsAnchor )
+ state = FCK_TRISTATE_DISABLED ;
+ }
+
+ return state ;
+}
+
+FCKVisitLinkCommand = function()
+{
+ this.Name = 'VisitLink';
+}
+FCKVisitLinkCommand.prototype =
+{
+ GetState : function()
+ {
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
+ return FCK_TRISTATE_DISABLED ;
+ var state = FCK.GetNamedCommandState( 'Unlink' ) ;
+
+ if ( state == FCK_TRISTATE_OFF )
+ {
+ var el = FCKSelection.MoveToAncestorNode( 'A' ) ;
+ if ( !el.href )
+ state = FCK_TRISTATE_DISABLED ;
+ }
+
+ return state ;
+ },
+
+ Execute : function()
+ {
+ var el = FCKSelection.MoveToAncestorNode( 'A' ) ;
+ var url = el.getAttribute( '_fcksavedurl' ) || el.getAttribute( 'href', 2 ) ;
+
+ // Check if it's a full URL.
+ // If not full URL, we'll need to apply the BaseHref setting.
+ if ( ! /:\/\//.test( url ) )
+ {
+ var baseHref = FCKConfig.BaseHref ;
+ var parentWindow = FCK.GetInstanceObject( 'parent' ) ;
+ if ( !baseHref )
+ {
+ baseHref = parentWindow.document.location.href ;
+ baseHref = baseHref.substring( 0, baseHref.lastIndexOf( '/' ) + 1 ) ;
+ }
+
+ if ( /^\//.test( url ) )
+ {
+ try
+ {
+ baseHref = baseHref.match( /^.*:\/\/+[^\/]+/ )[0] ;
+ }
+ catch ( e )
+ {
+ baseHref = parentWindow.document.location.protocol + '://' + parentWindow.parent.document.location.host ;
+ }
+ }
+
+ url = baseHref + url ;
+ }
+
+ if ( !window.open( url, '_blank' ) )
+ alert( FCKLang.VisitLinkBlocked ) ;
+ }
+} ;
+
+// FCKSelectAllCommand
+var FCKSelectAllCommand = function()
+{
+ this.Name = 'SelectAll' ;
+}
+
+FCKSelectAllCommand.prototype.Execute = function()
+{
+ if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
+ {
+ FCK.ExecuteNamedCommand( 'SelectAll' ) ;
+ }
+ else
+ {
+ // Select the contents of the textarea
+ var textarea = FCK.EditingArea.Textarea ;
+ if ( FCKBrowserInfo.IsIE )
+ {
+ textarea.createTextRange().execCommand( 'SelectAll' ) ;
+ }
+ else
+ {
+ textarea.selectionStart = 0 ;
+ textarea.selectionEnd = textarea.value.length ;
+ }
+ textarea.focus() ;
+ }
+}
+
+FCKSelectAllCommand.prototype.GetState = function()
+{
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
+ return FCK_TRISTATE_DISABLED ;
+ return FCK_TRISTATE_OFF ;
+}
+
+// FCKPasteCommand
+var FCKPasteCommand = function()
+{
+ this.Name = 'Paste' ;
+}
+
+FCKPasteCommand.prototype =
+{
+ Execute : function()
+ {
+ if ( FCKBrowserInfo.IsIE )
+ FCK.Paste() ;
+ else
+ FCK.ExecuteNamedCommand( 'Paste' ) ;
+ },
+
+ GetState : function()
+ {
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
+ return FCK_TRISTATE_DISABLED ;
+ return FCK.GetNamedCommandState( 'Paste' ) ;
+ }
+} ;
+
+// FCKRuleCommand
+var FCKRuleCommand = function()
+{
+ this.Name = 'Rule' ;
+}
+
+FCKRuleCommand.prototype =
+{
+ Execute : function()
+ {
+ FCKUndo.SaveUndoStep() ;
+ FCK.InsertElement( 'hr' ) ;
+ },
+
+ GetState : function()
+ {
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
+ return FCK_TRISTATE_DISABLED ;
+ return FCK.GetNamedCommandState( 'InsertHorizontalRule' ) ;
+ }
+} ;
+
+// FCKCutCopyCommand
+var FCKCutCopyCommand = function( isCut )
+{
+ this.Name = isCut ? 'Cut' : 'Copy' ;
+}
+
+FCKCutCopyCommand.prototype =
+{
+ Execute : function()
+ {
+ var enabled = false ;
+
+ if ( FCKBrowserInfo.IsIE )
+ {
+ // The following seems to be the only reliable way to detect that
+ // cut/copy is enabled in IE. It will fire the oncut/oncopy event
+ // only if the security settings enabled the command to execute.
+
+ var onEvent = function()
+ {
+ enabled = true ;
+ } ;
+
+ var eventName = 'on' + this.Name.toLowerCase() ;
+
+ FCK.EditorDocument.body.attachEvent( eventName, onEvent ) ;
+ FCK.ExecuteNamedCommand( this.Name ) ;
+ FCK.EditorDocument.body.detachEvent( eventName, onEvent ) ;
+ }
+ else
+ {
+ try
+ {
+ // Other browsers throw an error if the command is disabled.
+ FCK.ExecuteNamedCommand( this.Name ) ;
+ enabled = true ;
+ }
+ catch(e){}
+ }
+
+ if ( !enabled )
+ alert( FCKLang[ 'PasteError' + this.Name ] ) ;
+ },
+
+ GetState : function()
+ {
+ // Strangely, the Cut command happens to have the correct states for
+ // both Copy and Cut in all browsers.
+ return FCK.EditMode != FCK_EDITMODE_WYSIWYG ?
+ FCK_TRISTATE_DISABLED :
+ FCK.GetNamedCommandState( 'Cut' ) ;
+ }
+};
+
+var FCKAnchorDeleteCommand = function()
+{
+ this.Name = 'AnchorDelete' ;
+}
+
+FCKAnchorDeleteCommand.prototype =
+{
+ Execute : function()
+ {
+ if (FCK.Selection.GetType() == 'Control')
+ {
+ FCK.Selection.Delete();
+ }
+ else
+ {
+ var oFakeImage = FCK.Selection.GetSelectedElement() ;
+ if ( oFakeImage )
+ {
+ if ( oFakeImage.tagName == 'IMG' && oFakeImage.getAttribute('_fckanchor') )
+ oAnchor = FCK.GetRealElement( oFakeImage ) ;
+ else
+ oFakeImage = null ;
+ }
+
+ //Search for a real anchor
+ if ( !oFakeImage )
+ {
+ oAnchor = FCK.Selection.MoveToAncestorNode( 'A' ) ;
+ if ( oAnchor )
+ FCK.Selection.SelectNode( oAnchor ) ;
+ }
+
+ // If it's also a link, then just remove the name and exit
+ if ( oAnchor.href.length != 0 )
+ {
+ oAnchor.removeAttribute( 'name' ) ;
+ // Remove temporary class for IE
+ if ( FCKBrowserInfo.IsIE )
+ oAnchor.className = oAnchor.className.replace( FCKRegexLib.FCK_Class, '' ) ;
+ return ;
+ }
+
+ // We need to remove the anchor
+ // If we got a fake image, then just remove it and we're done
+ if ( oFakeImage )
+ {
+ oFakeImage.parentNode.removeChild( oFakeImage ) ;
+ return ;
+ }
+ // Empty anchor, so just remove it
+ if ( oAnchor.innerHTML.length == 0 )
+ {
+ oAnchor.parentNode.removeChild( oAnchor ) ;
+ return ;
+ }
+ // Anchor with content, leave the content
+ FCKTools.RemoveOuterTags( oAnchor ) ;
+ }
+ if ( FCKBrowserInfo.IsGecko )
+ FCK.Selection.Collapse( true ) ;
+ },
+
+ GetState : function()
+ {
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
+ return FCK_TRISTATE_DISABLED ;
+ return FCK.GetNamedCommandState( 'Unlink') ;
+ }
+};
+
+var FCKDeleteDivCommand = function()
+{
+}
+FCKDeleteDivCommand.prototype =
+{
+ GetState : function()
+ {
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
+ return FCK_TRISTATE_DISABLED ;
+
+ var node = FCKSelection.GetParentElement() ;
+ var path = new FCKElementPath( node ) ;
+ return path.BlockLimit && path.BlockLimit.nodeName.IEquals( 'div' ) ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
+ },
+
+ Execute : function()
+ {
+ // Create an undo snapshot before doing anything.
+ FCKUndo.SaveUndoStep() ;
+
+ // Find out the nodes to delete.
+ var nodes = FCKDomTools.GetSelectedDivContainers() ;
+
+ // Remember the current selection position.
+ var range = new FCKDomRange( FCK.EditorWindow ) ;
+ range.MoveToSelection() ;
+ var bookmark = range.CreateBookmark() ;
+
+ // Delete the container DIV node.
+ for ( var i = 0 ; i < nodes.length ; i++)
+ FCKDomTools.RemoveNode( nodes[i], true ) ;
+
+ // Restore selection.
+ range.MoveToBookmark( bookmark ) ;
+ range.Select() ;
+ }
+} ;
+
+// FCKRuleCommand
+var FCKNbsp = function()
+{
+ this.Name = 'Non Breaking Space' ;
+}
+
+FCKNbsp.prototype =
+{
+ Execute : function()
+ {
+ FCK.InsertHtml( ' ' ) ;
+ },
+
+ GetState : function()
+ {
+ return ( FCK.EditMode != FCK_EDITMODE_WYSIWYG ? FCK_TRISTATE_DISABLED : FCK_TRISTATE_OFF ) ;
+ }
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckblockquotecommand.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckblockquotecommand.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,250 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKBlockQuoteCommand Class: adds or removes blockquote tags.
+ */
+
+var FCKBlockQuoteCommand = function()
+{
+}
+
+FCKBlockQuoteCommand.prototype =
+{
+ Execute : function()
+ {
+ FCKUndo.SaveUndoStep() ;
+
+ var state = this.GetState() ;
+
+ var range = new FCKDomRange( FCK.EditorWindow ) ;
+ range.MoveToSelection() ;
+
+ var bookmark = range.CreateBookmark() ;
+
+ // Kludge for #1592: if the bookmark nodes are in the beginning of
+ // blockquote, then move them to the nearest block element in the
+ // blockquote.
+ if ( FCKBrowserInfo.IsIE )
+ {
+ var bStart = range.GetBookmarkNode( bookmark, true ) ;
+ var bEnd = range.GetBookmarkNode( bookmark, false ) ;
+
+ var cursor ;
+
+ if ( bStart
+ && bStart.parentNode.nodeName.IEquals( 'blockquote' )
+ && !bStart.previousSibling )
+ {
+ cursor = bStart ;
+ while ( ( cursor = cursor.nextSibling ) )
+ {
+ if ( FCKListsLib.BlockElements[ cursor.nodeName.toLowerCase() ] )
+ FCKDomTools.MoveNode( bStart, cursor, true ) ;
+ }
+ }
+
+ if ( bEnd
+ && bEnd.parentNode.nodeName.IEquals( 'blockquote' )
+ && !bEnd.previousSibling )
+ {
+ cursor = bEnd ;
+ while ( ( cursor = cursor.nextSibling ) )
+ {
+ if ( FCKListsLib.BlockElements[ cursor.nodeName.toLowerCase() ] )
+ {
+ if ( cursor.firstChild == bStart )
+ FCKDomTools.InsertAfterNode( bStart, bEnd ) ;
+ else
+ FCKDomTools.MoveNode( bEnd, cursor, true ) ;
+ }
+ }
+ }
+ }
+
+ var iterator = new FCKDomRangeIterator( range ) ;
+ var block ;
+
+ if ( state == FCK_TRISTATE_OFF )
+ {
+ iterator.EnforceRealBlocks = true ;
+ var paragraphs = [] ;
+ while ( ( block = iterator.GetNextParagraph() ) )
+ paragraphs.push( block ) ;
+
+ // If no paragraphs, create one from the current selection position.
+ if ( paragraphs.length < 1 )
+ {
+ para = range.Window.document.createElement( FCKConfig.EnterMode.IEquals( 'p' ) ? 'p' : 'div' ) ;
+ range.InsertNode( para ) ;
+ para.appendChild( range.Window.document.createTextNode( '\ufeff' ) ) ;
+ range.MoveToBookmark( bookmark ) ;
+ range.MoveToNodeContents( para ) ;
+ range.Collapse( true ) ;
+ bookmark = range.CreateBookmark() ;
+ paragraphs.push( para ) ;
+ }
+
+ // Make sure all paragraphs have the same parent.
+ var commonParent = paragraphs[0].parentNode ;
+ var tmp = [] ;
+ for ( var i = 0 ; i < paragraphs.length ; i++ )
+ {
+ block = paragraphs[i] ;
+ commonParent = FCKDomTools.GetCommonParents( block.parentNode, commonParent ).pop() ;
+ }
+ var lastBlock = null ;
+ while ( paragraphs.length > 0 )
+ {
+ block = paragraphs.shift() ;
+ while ( block.parentNode != commonParent )
+ block = block.parentNode ;
+ if ( block != lastBlock )
+ tmp.push( block ) ;
+ lastBlock = block ;
+ }
+
+ // If any of the selected blocks is a blockquote, remove it to prevent nested blockquotes.
+ while ( tmp.length > 0 )
+ {
+ block = tmp.shift() ;
+ if ( block.nodeName.IEquals( 'blockquote' ) )
+ {
+ var docFrag = FCKTools.GetElementDocument( block ).createDocumentFragment() ;
+ while ( block.firstChild )
+ {
+ docFrag.appendChild( block.removeChild( block.firstChild ) ) ;
+ paragraphs.push( docFrag.lastChild ) ;
+ }
+ block.parentNode.replaceChild( docFrag, block ) ;
+ }
+ else
+ paragraphs.push( block ) ;
+ }
+
+ // Now we have all the blocks to be included in a new blockquote node.
+ var bqBlock = range.Window.document.createElement( 'blockquote' ) ;
+ commonParent.insertBefore( bqBlock, paragraphs[0] ) ;
+ while ( paragraphs.length > 0 )
+ {
+ block = paragraphs.shift() ;
+ bqBlock.appendChild( block ) ;
+ }
+ }
+ else if ( state == FCK_TRISTATE_ON )
+ {
+ var moveOutNodes = [] ;
+ while ( ( block = iterator.GetNextParagraph() ) )
+ {
+ var bqParent = null ;
+ var bqChild = null ;
+ while ( block.parentNode )
+ {
+ if ( block.parentNode.nodeName.IEquals( 'blockquote' ) )
+ {
+ bqParent = block.parentNode ;
+ bqChild = block ;
+ break ;
+ }
+ block = block.parentNode ;
+ }
+
+ if ( bqParent && bqChild )
+ moveOutNodes.push( bqChild ) ;
+ }
+
+ var movedNodes = [] ;
+ while ( moveOutNodes.length > 0 )
+ {
+ var node = moveOutNodes.shift() ;
+ var bqBlock = node.parentNode ;
+
+ // 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.
+ if ( node == node.parentNode.firstChild )
+ {
+ bqBlock.parentNode.insertBefore( bqBlock.removeChild( node ), bqBlock ) ;
+ if ( ! bqBlock.firstChild )
+ bqBlock.parentNode.removeChild( bqBlock ) ;
+ }
+ else if ( node == node.parentNode.lastChild )
+ {
+ bqBlock.parentNode.insertBefore( bqBlock.removeChild( node ), bqBlock.nextSibling ) ;
+ if ( ! bqBlock.firstChild )
+ bqBlock.parentNode.removeChild( bqBlock ) ;
+ }
+ else
+ FCKDomTools.BreakParent( node, node.parentNode, range ) ;
+
+ movedNodes.push( node ) ;
+ }
+
+ if ( FCKConfig.EnterMode.IEquals( 'br' ) )
+ {
+ while ( movedNodes.length )
+ {
+ var node = movedNodes.shift() ;
+ var firstTime = true ;
+ if ( node.nodeName.IEquals( 'div' ) )
+ {
+ var docFrag = FCKTools.GetElementDocument( node ).createDocumentFragment() ;
+ var needBeginBr = firstTime && node.previousSibling &&
+ !FCKListsLib.BlockBoundaries[node.previousSibling.nodeName.toLowerCase()] ;
+ if ( firstTime && needBeginBr )
+ docFrag.appendChild( FCKTools.GetElementDocument( node ).createElement( 'br' ) ) ;
+ var needEndBr = node.nextSibling &&
+ !FCKListsLib.BlockBoundaries[node.nextSibling.nodeName.toLowerCase()] ;
+ while ( node.firstChild )
+ docFrag.appendChild( node.removeChild( node.firstChild ) ) ;
+ if ( needEndBr )
+ docFrag.appendChild( FCKTools.GetElementDocument( node ).createElement( 'br' ) ) ;
+ node.parentNode.replaceChild( docFrag, node ) ;
+ firstTime = false ;
+ }
+ }
+ }
+ }
+ range.MoveToBookmark( bookmark ) ;
+ range.Select() ;
+
+ FCK.Focus() ;
+ FCK.Events.FireEvent( 'OnSelectionChange' ) ;
+ },
+
+ GetState : function()
+ {
+ // Disabled if not WYSIWYG.
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || ! FCK.EditorWindow )
+ return FCK_TRISTATE_DISABLED ;
+
+ var path = new FCKElementPath( FCKSelection.GetBoundaryParentElement( true ) ) ;
+ var firstBlock = path.Block || path.BlockLimit ;
+
+ if ( !firstBlock || firstBlock.nodeName.toLowerCase() == 'body' )
+ return FCK_TRISTATE_OFF ;
+
+ // See if the first block has a blockquote parent.
+ for ( var i = 0 ; i < path.Elements.length ; i++ )
+ {
+ if ( path.Elements[i].nodeName.IEquals( 'blockquote' ) )
+ return FCK_TRISTATE_ON ;
+ }
+ return FCK_TRISTATE_OFF ;
+ }
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckcorestylecommand.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckcorestylecommand.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,61 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKCoreStyleCommand Class: controls the execution of a core style. Core
+ * styles are usually represented as buttons in the toolbar., like Bold and
+ * Italic.
+ */
+
+ var FCKCoreStyleCommand = function( coreStyleName )
+ {
+ this.Name = 'CoreStyle' ;
+ this.StyleName = '_FCK_' + coreStyleName ;
+ this.IsActive = false ;
+
+ FCKStyles.AttachStyleStateChange( this.StyleName, this._OnStyleStateChange, this ) ;
+ }
+
+ FCKCoreStyleCommand.prototype =
+ {
+ Execute : function()
+ {
+ FCKUndo.SaveUndoStep() ;
+
+ if ( this.IsActive )
+ FCKStyles.RemoveStyle( this.StyleName ) ;
+ else
+ FCKStyles.ApplyStyle( this.StyleName ) ;
+
+ FCK.Focus() ;
+ FCK.Events.FireEvent( 'OnSelectionChange' ) ;
+ },
+
+ GetState : function()
+ {
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
+ return FCK_TRISTATE_DISABLED ;
+ return this.IsActive ? FCK_TRISTATE_ON : FCK_TRISTATE_OFF ;
+ },
+
+ _OnStyleStateChange : function( styleName, isActive )
+ {
+ this.IsActive = isActive ;
+ }
+ };
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckfitwindow.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckfitwindow.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,190 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Stretch the editor to full window size and back.
+ */
+
+var FCKFitWindow = function()
+{
+ this.Name = 'FitWindow' ;
+}
+
+FCKFitWindow.prototype.Execute = function()
+{
+ var eEditorFrame = window.frameElement ;
+ var eEditorFrameStyle = eEditorFrame.style ;
+
+ var eMainWindow = parent ;
+ var eDocEl = eMainWindow.document.documentElement ;
+ var eBody = eMainWindow.document.body ;
+ var eBodyStyle = eBody.style ;
+ var eParent ;
+
+ // Save the current selection and scroll position.
+ var oRange = new FCKDomRange( FCK.EditorWindow ) ;
+ oRange.MoveToSelection() ;
+ var oEditorScrollPos = FCKTools.GetScrollPosition( FCK.EditorWindow ) ;
+
+ // No original style properties known? Go fullscreen.
+ if ( !this.IsMaximized )
+ {
+ // Registering an event handler when the window gets resized.
+ if( FCKBrowserInfo.IsIE )
+ eMainWindow.attachEvent( 'onresize', FCKFitWindow_Resize ) ;
+ else
+ eMainWindow.addEventListener( 'resize', FCKFitWindow_Resize, true ) ;
+
+ // Save the scrollbars position.
+ this._ScrollPos = FCKTools.GetScrollPosition( eMainWindow ) ;
+
+ // Save and reset the styles for the entire node tree. They could interfere in the result.
+ eParent = eEditorFrame ;
+ // The extra () is to avoid a warning with strict error checking. This is ok.
+ while( (eParent = eParent.parentNode) )
+ {
+ if ( eParent.nodeType == 1 )
+ {
+ eParent._fckSavedStyles = FCKTools.SaveStyles( eParent ) ;
+ eParent.style.zIndex = FCKConfig.FloatingPanelsZIndex - 1 ;
+ }
+ }
+
+ // Hide IE scrollbars (in strict mode).
+ if ( FCKBrowserInfo.IsIE )
+ {
+ this.documentElementOverflow = eDocEl.style.overflow ;
+ eDocEl.style.overflow = 'hidden' ;
+ eBodyStyle.overflow = 'hidden' ;
+ }
+ else
+ {
+ // Hide the scroolbars in Firefox.
+ eBodyStyle.overflow = 'hidden' ;
+ eBodyStyle.width = '0px' ;
+ eBodyStyle.height = '0px' ;
+ }
+
+ // Save the IFRAME styles.
+ this._EditorFrameStyles = FCKTools.SaveStyles( eEditorFrame ) ;
+
+ // Resize.
+ var oViewPaneSize = FCKTools.GetViewPaneSize( eMainWindow ) ;
+
+ eEditorFrameStyle.position = "absolute";
+ eEditorFrame.offsetLeft ; // Kludge for Safari 3.1 browser bug, do not remove. See #2066.
+ eEditorFrameStyle.zIndex = FCKConfig.FloatingPanelsZIndex - 1;
+ eEditorFrameStyle.left = "0px";
+ eEditorFrameStyle.top = "0px";
+ eEditorFrameStyle.width = oViewPaneSize.Width + "px";
+ eEditorFrameStyle.height = oViewPaneSize.Height + "px";
+
+ // Giving the frame some (huge) borders on his right and bottom
+ // side to hide the background that would otherwise show when the
+ // editor is in fullsize mode and the window is increased in size
+ // not for IE, because IE immediately adapts the editor on resize,
+ // 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.
+ if ( !FCKBrowserInfo.IsIE )
+ {
+ eEditorFrameStyle.borderRight = eEditorFrameStyle.borderBottom = "9999px solid white" ;
+ eEditorFrameStyle.backgroundColor = "white";
+ }
+
+ // Scroll to top left.
+ eMainWindow.scrollTo(0, 0);
+
+ // Is the editor still not on the top left? Let's find out and fix that as well. (Bug #174)
+ var editorPos = FCKTools.GetWindowPosition( eMainWindow, eEditorFrame ) ;
+ if ( editorPos.x != 0 )
+ eEditorFrameStyle.left = ( -1 * editorPos.x ) + "px" ;
+ if ( editorPos.y != 0 )
+ eEditorFrameStyle.top = ( -1 * editorPos.y ) + "px" ;
+
+ this.IsMaximized = true ;
+ }
+ else // Resize to original size.
+ {
+ // Remove the event handler of window resizing.
+ if( FCKBrowserInfo.IsIE )
+ eMainWindow.detachEvent( "onresize", FCKFitWindow_Resize ) ;
+ else
+ eMainWindow.removeEventListener( "resize", FCKFitWindow_Resize, true ) ;
+
+ // Restore the CSS position for the entire node tree.
+ eParent = eEditorFrame ;
+ // The extra () is to avoid a warning with strict error checking. This is ok.
+ while( (eParent = eParent.parentNode) )
+ {
+ if ( eParent._fckSavedStyles )
+ {
+ FCKTools.RestoreStyles( eParent, eParent._fckSavedStyles ) ;
+ eParent._fckSavedStyles = null ;
+ }
+ }
+
+ // Restore IE scrollbars
+ if ( FCKBrowserInfo.IsIE )
+ eDocEl.style.overflow = this.documentElementOverflow ;
+
+ // Restore original size
+ FCKTools.RestoreStyles( eEditorFrame, this._EditorFrameStyles ) ;
+
+ // Restore the window scroll position.
+ eMainWindow.scrollTo( this._ScrollPos.X, this._ScrollPos.Y ) ;
+
+ this.IsMaximized = false ;
+ }
+
+ FCKToolbarItems.GetItem('FitWindow').RefreshState() ;
+
+ // 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
+ //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).
+ // if ( FCKBrowserInfo.IsGecko10 ) // Initially I thought it was a FF 1.0 only problem.
+ if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
+ FCK.EditingArea.MakeEditable() ;
+
+ FCK.Focus() ;
+
+ // Restore the selection and scroll position of inside the document.
+ oRange.Select() ;
+ FCK.EditorWindow.scrollTo( oEditorScrollPos.X, oEditorScrollPos.Y ) ;
+}
+
+FCKFitWindow.prototype.GetState = function()
+{
+ if ( FCKConfig.ToolbarLocation != 'In' )
+ return FCK_TRISTATE_DISABLED ;
+ else
+ 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' ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckindentcommands.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckindentcommands.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,282 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKIndentCommand Class: controls block indentation.
+ */
+
+var FCKIndentCommand = function( name, offset )
+{
+ this.Name = name ;
+ this.Offset = offset ;
+ this.IndentCSSProperty = FCKConfig.ContentLangDirection.IEquals( 'ltr' ) ? 'marginLeft' : 'marginRight' ;
+}
+
+FCKIndentCommand._InitIndentModeParameters = function()
+{
+ if ( FCKConfig.IndentClasses && FCKConfig.IndentClasses.length > 0 )
+ {
+ this._UseIndentClasses = true ;
+ this._IndentClassMap = {} ;
+ for ( var i = 0 ; i < FCKConfig.IndentClasses.length ;i++ )
+ this._IndentClassMap[FCKConfig.IndentClasses[i]] = i + 1 ;
+ this._ClassNameRegex = new RegExp( '(?:^|\\s+)(' + FCKConfig.IndentClasses.join( '|' ) + ')(?=$|\\s)' ) ;
+ }
+ else
+ this._UseIndentClasses = false ;
+}
+
+
+FCKIndentCommand.prototype =
+{
+ Execute : function()
+ {
+ // Save an undo snapshot before doing anything.
+ FCKUndo.SaveUndoStep() ;
+
+ var range = new FCKDomRange( FCK.EditorWindow ) ;
+ range.MoveToSelection() ;
+ var bookmark = range.CreateBookmark() ;
+
+ // 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.
+ // Otherwise, apply the operation on the nearest block nodes.
+ var nearestListBlock = FCKDomTools.GetCommonParentNode( range.StartNode || range.StartContainer ,
+ range.EndNode || range.EndContainer,
+ ['ul', 'ol'] ) ;
+ if ( nearestListBlock )
+ this._IndentList( range, nearestListBlock ) ;
+ else
+ this._IndentBlock( range ) ;
+
+ range.MoveToBookmark( bookmark ) ;
+ range.Select() ;
+
+ FCK.Focus() ;
+ FCK.Events.FireEvent( 'OnSelectionChange' ) ;
+ },
+
+ GetState : function()
+ {
+ // Disabled if not WYSIWYG.
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || ! FCK.EditorWindow )
+ return FCK_TRISTATE_DISABLED ;
+
+ // Initialize parameters if not already initialzed.
+ if ( FCKIndentCommand._UseIndentClasses == undefined )
+ FCKIndentCommand._InitIndentModeParameters() ;
+
+ // 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.
+ var startContainer = FCKSelection.GetBoundaryParentElement( true ) ;
+ var endContainer = FCKSelection.GetBoundaryParentElement( false ) ;
+ var listNode = FCKDomTools.GetCommonParentNode( startContainer, endContainer, ['ul','ol'] ) ;
+
+ if ( listNode )
+ {
+ if ( this.Name.IEquals( 'outdent' ) )
+ return FCK_TRISTATE_OFF ;
+ var firstItem = FCKTools.GetElementAscensor( startContainer, 'li' ) ;
+ if ( !firstItem || !firstItem.previousSibling )
+ return FCK_TRISTATE_DISABLED ;
+ return FCK_TRISTATE_OFF ;
+ }
+ if ( ! FCKIndentCommand._UseIndentClasses && this.Name.IEquals( 'indent' ) )
+ return FCK_TRISTATE_OFF;
+
+ var path = new FCKElementPath( startContainer ) ;
+ var firstBlock = path.Block || path.BlockLimit ;
+ if ( !firstBlock )
+ return FCK_TRISTATE_DISABLED ;
+
+ if ( FCKIndentCommand._UseIndentClasses )
+ {
+ var indentClass = firstBlock.className.match( FCKIndentCommand._ClassNameRegex ) ;
+ var indentStep = 0 ;
+ if ( indentClass != null )
+ {
+ indentClass = indentClass[1] ;
+ indentStep = FCKIndentCommand._IndentClassMap[indentClass] ;
+ }
+ if ( ( this.Name == 'outdent' && indentStep == 0 ) ||
+ ( this.Name == 'indent' && indentStep == FCKConfig.IndentClasses.length ) )
+ return FCK_TRISTATE_DISABLED ;
+ return FCK_TRISTATE_OFF ;
+ }
+ else
+ {
+ var indent = parseInt( firstBlock.style[this.IndentCSSProperty], 10 ) ;
+ if ( isNaN( indent ) )
+ indent = 0 ;
+ if ( indent <= 0 )
+ return FCK_TRISTATE_DISABLED ;
+ return FCK_TRISTATE_OFF ;
+ }
+ },
+
+ _IndentBlock : function( range )
+ {
+ var iterator = new FCKDomRangeIterator( range ) ;
+ iterator.EnforceRealBlocks = true ;
+
+ range.Expand( 'block_contents' ) ;
+ var commonParents = FCKDomTools.GetCommonParents( range.StartContainer, range.EndContainer ) ;
+ var nearestParent = commonParents[commonParents.length - 1] ;
+ var block ;
+
+ while ( ( block = iterator.GetNextParagraph() ) )
+ {
+ // 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 ( ! ( block == nearestParent || block.parentNode == nearestParent ) )
+ continue ;
+
+ if ( FCKIndentCommand._UseIndentClasses )
+ {
+ // Transform current class name to indent step index.
+ var indentClass = block.className.match( FCKIndentCommand._ClassNameRegex ) ;
+ var indentStep = 0 ;
+ if ( indentClass != null )
+ {
+ indentClass = indentClass[1] ;
+ indentStep = FCKIndentCommand._IndentClassMap[indentClass] ;
+ }
+
+ // Operate on indent step index, transform indent step index back to class name.
+ if ( this.Name.IEquals( 'outdent' ) )
+ indentStep-- ;
+ else if ( this.Name.IEquals( 'indent' ) )
+ indentStep++ ;
+ indentStep = Math.min( indentStep, FCKConfig.IndentClasses.length ) ;
+ indentStep = Math.max( indentStep, 0 ) ;
+ var className = block.className.replace( FCKIndentCommand._ClassNameRegex, '' ) ;
+ if ( indentStep < 1 )
+ block.className = className ;
+ else
+ block.className = ( className.length > 0 ? className + ' ' : '' ) +
+ FCKConfig.IndentClasses[indentStep - 1] ;
+ }
+ else
+ {
+ // Offset distance is assumed to be in pixels for now.
+ var currentOffset = parseInt( block.style[this.IndentCSSProperty], 10 ) ;
+ if ( isNaN( currentOffset ) )
+ currentOffset = 0 ;
+ currentOffset += this.Offset ;
+ currentOffset = Math.max( currentOffset, 0 ) ;
+ currentOffset = Math.ceil( currentOffset / this.Offset ) * this.Offset ;
+ block.style[this.IndentCSSProperty] = currentOffset ? currentOffset + FCKConfig.IndentUnit : '' ;
+ if ( block.getAttribute( 'style' ) == '' )
+ block.removeAttribute( 'style' ) ;
+ }
+ }
+ },
+
+ _IndentList : function( range, listNode )
+ {
+ // 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.
+ var startContainer = range.StartContainer ;
+ var endContainer = range.EndContainer ;
+ while ( startContainer && startContainer.parentNode != listNode )
+ startContainer = startContainer.parentNode ;
+ while ( endContainer && endContainer.parentNode != listNode )
+ endContainer = endContainer.parentNode ;
+
+ if ( ! startContainer || ! endContainer )
+ return ;
+
+ // Now we can iterate over the individual items on the same tree depth.
+ var block = startContainer ;
+ var itemsToMove = [] ;
+ var stopFlag = false ;
+ while ( stopFlag == false )
+ {
+ if ( block == endContainer )
+ stopFlag = true ;
+ itemsToMove.push( block ) ;
+ block = block.nextSibling ;
+ }
+ if ( itemsToMove.length < 1 )
+ return ;
+
+ // 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
+ // to feed it the further ancestor node that is still a list.
+ var listParents = FCKDomTools.GetParents( listNode ) ;
+ for ( var i = 0 ; i < listParents.length ; i++ )
+ {
+ if ( listParents[i].nodeName.IEquals( ['ul', 'ol'] ) )
+ {
+ listNode = listParents[i] ;
+ break ;
+ }
+ }
+ var indentOffset = this.Name.IEquals( 'indent' ) ? 1 : -1 ;
+ var startItem = itemsToMove[0] ;
+ var lastItem = itemsToMove[ itemsToMove.length - 1 ] ;
+ var markerObj = {} ;
+
+ // Convert the list DOM tree into a one dimensional array.
+ var listArray = FCKDomTools.ListToArray( listNode, markerObj ) ;
+
+ // Apply indenting or outdenting on the array.
+ var baseIndent = listArray[lastItem._FCK_ListArray_Index].indent ;
+ for ( var i = startItem._FCK_ListArray_Index ; i <= lastItem._FCK_ListArray_Index ; i++ )
+ listArray[i].indent += indentOffset ;
+ for ( var i = lastItem._FCK_ListArray_Index + 1 ; i < listArray.length && listArray[i].indent > baseIndent ; i++ )
+ listArray[i].indent += indentOffset ;
+
+ /* For debug use only
+ var PrintArray = function( listArray, doc )
+ {
+ var s = [] ;
+ for ( var i = 0 ; i < listArray.length ; i++ )
+ {
+ for ( var j in listArray[i] )
+ {
+ if ( j != 'contents' )
+ s.push( j + ":" + listArray[i][j] + "; " ) ;
+ else
+ {
+ var docFrag = doc.createDocumentFragment() ;
+ var tmpNode = doc.createElement( 'span' ) ;
+ for ( var k = 0 ; k < listArray[i][j].length ; k++ )
+ docFrag.appendChild( listArray[i][j][k].cloneNode( true ) ) ;
+ tmpNode.appendChild( docFrag ) ;
+ s.push( j + ":" + tmpNode.innerHTML + "; ") ;
+ }
+ }
+ s.push( '\n' ) ;
+ }
+ alert( s.join('') ) ;
+ }
+ PrintArray( listArray, FCK.EditorDocument ) ;
+ */
+
+ // 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.
+ var newList = FCKDomTools.ArrayToList( listArray ) ;
+ if ( newList )
+ listNode.parentNode.replaceChild( newList.listNode, listNode ) ;
+
+ // Clean up the markers.
+ FCKDomTools.ClearAllMarkers( markerObj ) ;
+ }
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckjustifycommands.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckjustifycommands.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,173 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKJustifyCommand Class: controls block justification.
+ */
+
+var FCKJustifyCommand = function( alignValue )
+{
+ this.AlignValue = alignValue ;
+
+ // Detect whether this is the instance for the default alignment.
+ var contentDir = FCKConfig.ContentLangDirection.toLowerCase() ;
+ this.IsDefaultAlign = ( alignValue == 'left' && contentDir == 'ltr' ) ||
+ ( alignValue == 'right' && contentDir == 'rtl' ) ;
+
+ // Get the class name to be used by this instance.
+ var cssClassName = this._CssClassName = ( function()
+ {
+ var classes = FCKConfig.JustifyClasses ;
+ if ( classes )
+ {
+ switch ( alignValue )
+ {
+ case 'left' :
+ return classes[0] || null ;
+ case 'center' :
+ return classes[1] || null ;
+ case 'right' :
+ return classes[2] || null ;
+ case 'justify' :
+ return classes[3] || null ;
+ }
+ }
+ return null ;
+ } )() ;
+
+ if ( cssClassName && cssClassName.length > 0 )
+ this._CssClassRegex = new RegExp( '(?:^|\\s+)' + cssClassName + '(?=$|\\s)' ) ;
+}
+
+FCKJustifyCommand._GetClassNameRegex = function()
+{
+ var regex = FCKJustifyCommand._ClassRegex ;
+ if ( regex != undefined )
+ return regex ;
+
+ var names = [] ;
+
+ var classes = FCKConfig.JustifyClasses ;
+ if ( classes )
+ {
+ for ( var i = 0 ; i < 4 ; i++ )
+ {
+ var className = classes[i] ;
+ if ( className && className.length > 0 )
+ names.push( className ) ;
+ }
+ }
+
+ if ( names.length > 0 )
+ regex = new RegExp( '(?:^|\\s+)(?:' + names.join( '|' ) + ')(?=$|\\s)' ) ;
+ else
+ regex = null ;
+
+ return FCKJustifyCommand._ClassRegex = regex ;
+}
+
+FCKJustifyCommand.prototype =
+{
+ Execute : function()
+ {
+ // Save an undo snapshot before doing anything.
+ FCKUndo.SaveUndoStep() ;
+
+ var range = new FCKDomRange( FCK.EditorWindow ) ;
+ range.MoveToSelection() ;
+
+ var currentState = this.GetState() ;
+ if ( currentState == FCK_TRISTATE_DISABLED )
+ return ;
+
+ // Store a bookmark of the selection since the paragraph iterator might
+ // change the DOM tree and break selections.
+ var bookmark = range.CreateBookmark() ;
+
+ var cssClassName = this._CssClassName ;
+
+ // Apply alignment setting for each paragraph.
+ var iterator = new FCKDomRangeIterator( range ) ;
+ var block ;
+ while ( ( block = iterator.GetNextParagraph() ) )
+ {
+ block.removeAttribute( 'align' ) ;
+
+ if ( cssClassName )
+ {
+ // Remove the any of the alignment classes from the className.
+ var className = block.className.replace( FCKJustifyCommand._GetClassNameRegex(), '' ) ;
+
+ // Append the desired class name.
+ if ( currentState == FCK_TRISTATE_OFF )
+ {
+ if ( className.length > 0 )
+ className += ' ' ;
+ block.className = className + cssClassName ;
+ }
+ else if ( className.length == 0 )
+ FCKDomTools.RemoveAttribute( block, 'class' ) ;
+ }
+ else
+ {
+ var style = block.style ;
+ if ( currentState == FCK_TRISTATE_OFF )
+ style.textAlign = this.AlignValue ;
+ else
+ {
+ style.textAlign = '' ;
+ if ( style.cssText.length == 0 )
+ block.removeAttribute( 'style' ) ;
+ }
+ }
+ }
+
+ // Restore previous selection.
+ range.MoveToBookmark( bookmark ) ;
+ range.Select() ;
+
+ FCK.Focus() ;
+ FCK.Events.FireEvent( 'OnSelectionChange' ) ;
+ },
+
+ GetState : function()
+ {
+ // Disabled if not WYSIWYG.
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || ! FCK.EditorWindow )
+ return FCK_TRISTATE_DISABLED ;
+
+ // Retrieve the first selected block.
+ var path = new FCKElementPath( FCKSelection.GetBoundaryParentElement( true ) ) ;
+ var firstBlock = path.Block || path.BlockLimit ;
+
+ if ( !firstBlock || firstBlock.nodeName.toLowerCase() == 'body' )
+ return FCK_TRISTATE_OFF ;
+
+ // Check if the desired style is already applied to the block.
+ var currentAlign ;
+ if ( FCKBrowserInfo.IsIE )
+ currentAlign = firstBlock.currentStyle.textAlign ;
+ else
+ currentAlign = FCK.EditorWindow.getComputedStyle( firstBlock, '' ).getPropertyValue( 'text-align' );
+ currentAlign = currentAlign.replace( /(-moz-|-webkit-|start|auto)/i, '' );
+ if ( ( !currentAlign && this.IsDefaultAlign ) || currentAlign == this.AlignValue )
+ return FCK_TRISTATE_ON ;
+ return FCK_TRISTATE_OFF ;
+ }
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fcklistcommands.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fcklistcommands.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,382 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Implementation for the "Insert/Remove Ordered/Unordered List" commands.
+ */
+
+var FCKListCommand = function( name, tagName )
+{
+ this.Name = name ;
+ this.TagName = tagName ;
+}
+
+FCKListCommand.prototype =
+{
+ GetState : function()
+ {
+ // Disabled if not WYSIWYG.
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || ! FCK.EditorWindow )
+ return FCK_TRISTATE_DISABLED ;
+
+ // 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.
+ var startContainer = FCKSelection.GetBoundaryParentElement( true ) ;
+ var listNode = startContainer ;
+ while ( listNode )
+ {
+ if ( listNode.nodeName.IEquals( [ 'ul', 'ol' ] ) )
+ break ;
+ listNode = listNode.parentNode ;
+ }
+ if ( listNode && listNode.nodeName.IEquals( this.TagName ) )
+ return FCK_TRISTATE_ON ;
+ else
+ return FCK_TRISTATE_OFF ;
+ },
+
+ Execute : function()
+ {
+ FCKUndo.SaveUndoStep() ;
+
+ var doc = FCK.EditorDocument ;
+ var range = new FCKDomRange( FCK.EditorWindow ) ;
+ range.MoveToSelection() ;
+ var state = this.GetState() ;
+
+ // 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.
+ // So create a paragraph if the document is empty and we're going to create a list.
+ if ( state == FCK_TRISTATE_OFF )
+ {
+ FCKDomTools.TrimNode( doc.body ) ;
+ if ( ! doc.body.firstChild )
+ {
+ var paragraph = doc.createElement( 'p' ) ;
+ doc.body.appendChild( paragraph ) ;
+ range.MoveToNodeContents( paragraph ) ;
+ }
+ }
+
+ var bookmark = range.CreateBookmark() ;
+
+ // Group the blocks up because there are many cases where multiple lists have to be created,
+ // or multiple lists have to be cancelled.
+ var listGroups = [] ;
+ var markerObj = {} ;
+ var iterator = new FCKDomRangeIterator( range ) ;
+ var block ;
+
+ iterator.ForceBrBreak = ( state == FCK_TRISTATE_OFF ) ;
+ var nextRangeExists = true ;
+ var rangeQueue = null ;
+ while ( nextRangeExists )
+ {
+ while ( ( block = iterator.GetNextParagraph() ) )
+ {
+ var path = new FCKElementPath( block ) ;
+ var listNode = null ;
+ var processedFlag = false ;
+ var blockLimit = path.BlockLimit ;
+
+ // First, try to group by a list ancestor.
+ for ( var i = path.Elements.length - 1 ; i >= 0 ; i-- )
+ {
+ var el = path.Elements[i] ;
+ if ( el.nodeName.IEquals( ['ol', 'ul'] ) )
+ {
+ // If we've encountered a list inside a block limit
+ // The last group object of the block limit element should
+ // no longer be valid. Since paragraphs after the list
+ // should belong to a different group of paragraphs before
+ // the list. (Bug #1309)
+ if ( blockLimit._FCK_ListGroupObject )
+ blockLimit._FCK_ListGroupObject = null ;
+
+ var groupObj = el._FCK_ListGroupObject ;
+ if ( groupObj )
+ groupObj.contents.push( block ) ;
+ else
+ {
+ groupObj = { 'root' : el, 'contents' : [ block ] } ;
+ listGroups.push( groupObj ) ;
+ FCKDomTools.SetElementMarker( markerObj, el, '_FCK_ListGroupObject', groupObj ) ;
+ }
+ processedFlag = true ;
+ break ;
+ }
+ }
+
+ if ( processedFlag )
+ continue ;
+
+ // No list ancestor? Group by block limit.
+ var root = blockLimit ;
+ if ( root._FCK_ListGroupObject )
+ root._FCK_ListGroupObject.contents.push( block ) ;
+ else
+ {
+ var groupObj = { 'root' : root, 'contents' : [ block ] } ;
+ FCKDomTools.SetElementMarker( markerObj, root, '_FCK_ListGroupObject', groupObj ) ;
+ listGroups.push( groupObj ) ;
+ }
+ }
+
+ if ( FCKBrowserInfo.IsIE )
+ nextRangeExists = false ;
+ else
+ {
+ if ( rangeQueue == null )
+ {
+ rangeQueue = [] ;
+ var selectionObject = FCKSelection.GetSelection() ;
+ if ( selectionObject && listGroups.length == 0 )
+ rangeQueue.push( selectionObject.getRangeAt( 0 ) ) ;
+ for ( var i = 1 ; selectionObject && i < selectionObject.rangeCount ; i++ )
+ rangeQueue.push( selectionObject.getRangeAt( i ) ) ;
+ }
+ if ( rangeQueue.length < 1 )
+ nextRangeExists = false ;
+ else
+ {
+ var internalRange = FCKW3CRange.CreateFromRange( doc, rangeQueue.shift() ) ;
+ range._Range = internalRange ;
+ range._UpdateElementInfo() ;
+ if ( range.StartNode.nodeName.IEquals( 'td' ) )
+ range.SetStart( range.StartNode, 1 ) ;
+ if ( range.EndNode.nodeName.IEquals( 'td' ) )
+ range.SetEnd( range.EndNode, 2 ) ;
+ iterator = new FCKDomRangeIterator( range ) ;
+ 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.
+ // 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.
+ var listsCreated = [] ;
+ while ( listGroups.length > 0 )
+ {
+ var groupObj = listGroups.shift() ;
+ if ( state == FCK_TRISTATE_OFF )
+ {
+ if ( groupObj.root.nodeName.IEquals( ['ul', 'ol'] ) )
+ this._ChangeListType( groupObj, markerObj, listsCreated ) ;
+ else
+ this._CreateList( groupObj, listsCreated ) ;
+ }
+ else if ( state == FCK_TRISTATE_ON && groupObj.root.nodeName.IEquals( ['ul', 'ol'] ) )
+ this._RemoveList( groupObj, markerObj ) ;
+ }
+
+ // For all new lists created, merge adjacent, same type lists.
+ for ( var i = 0 ; i < listsCreated.length ; i++ )
+ {
+ var listNode = listsCreated[i] ;
+ var stopFlag = false ;
+ var currentNode = listNode ;
+ while ( ! stopFlag )
+ {
+ currentNode = currentNode.nextSibling ;
+ if ( currentNode && currentNode.nodeType == 3 && currentNode.nodeValue.search( /^[\n\r\t ]*$/ ) == 0 )
+ continue ;
+ stopFlag = true ;
+ }
+
+ if ( currentNode && currentNode.nodeName.IEquals( this.TagName ) )
+ {
+ currentNode.parentNode.removeChild( currentNode ) ;
+ while ( currentNode.firstChild )
+ listNode.appendChild( currentNode.removeChild( currentNode.firstChild ) ) ;
+ }
+
+ stopFlag = false ;
+ currentNode = listNode ;
+ while ( ! stopFlag )
+ {
+ currentNode = currentNode.previousSibling ;
+ if ( currentNode && currentNode.nodeType == 3 && currentNode.nodeValue.search( /^[\n\r\t ]*$/ ) == 0 )
+ continue ;
+ stopFlag = true ;
+ }
+ if ( currentNode && currentNode.nodeName.IEquals( this.TagName ) )
+ {
+ currentNode.parentNode.removeChild( currentNode ) ;
+ while ( currentNode.lastChild )
+ listNode.insertBefore( currentNode.removeChild( currentNode.lastChild ),
+ listNode.firstChild ) ;
+ }
+ }
+
+ // Clean up, restore selection and update toolbar button states.
+ FCKDomTools.ClearAllMarkers( markerObj ) ;
+ range.MoveToBookmark( bookmark ) ;
+ range.Select() ;
+
+ FCK.Focus() ;
+ FCK.Events.FireEvent( 'OnSelectionChange' ) ;
+ },
+
+ _ChangeListType : function( groupObj, markerObj, listsCreated )
+ {
+ // This case is easy...
+ // 1. Convert the whole list into a one-dimensional array.
+ // 2. Change the list type by modifying the array.
+ // 3. Recreate the whole list by converting the array to a list.
+ // 4. Replace the original list with the recreated list.
+ var listArray = FCKDomTools.ListToArray( groupObj.root, markerObj ) ;
+ var selectedListItems = [] ;
+ for ( var i = 0 ; i < groupObj.contents.length ; i++ )
+ {
+ var itemNode = groupObj.contents[i] ;
+ itemNode = FCKTools.GetElementAscensor( itemNode, 'li' ) ;
+ if ( ! itemNode || itemNode._FCK_ListItem_Processed )
+ continue ;
+ selectedListItems.push( itemNode ) ;
+ FCKDomTools.SetElementMarker( markerObj, itemNode, '_FCK_ListItem_Processed', true ) ;
+ }
+ var fakeParent = FCKTools.GetElementDocument( groupObj.root ).createElement( this.TagName ) ;
+ for ( var i = 0 ; i < selectedListItems.length ; i++ )
+ {
+ var listIndex = selectedListItems[i]._FCK_ListArray_Index ;
+ listArray[listIndex].parent = fakeParent ;
+ }
+ var newList = FCKDomTools.ArrayToList( listArray, markerObj ) ;
+ for ( var i = 0 ; i < newList.listNode.childNodes.length ; i++ )
+ {
+ if ( newList.listNode.childNodes[i].nodeName.IEquals( this.TagName ) )
+ listsCreated.push( newList.listNode.childNodes[i] ) ;
+ }
+ groupObj.root.parentNode.replaceChild( newList.listNode, groupObj.root ) ;
+ },
+
+ _CreateList : function( groupObj, listsCreated )
+ {
+ var contents = groupObj.contents ;
+ var doc = FCKTools.GetElementDocument( groupObj.root ) ;
+ var listContents = [] ;
+
+ // 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.
+ // In such a case, enclose the childNodes of contents[0] into a <div>.
+ if ( contents.length == 1 && contents[0] == groupObj.root )
+ {
+ var divBlock = doc.createElement( 'div' );
+ while ( contents[0].firstChild )
+ divBlock.appendChild( contents[0].removeChild( contents[0].firstChild ) ) ;
+ contents[0].appendChild( divBlock ) ;
+ contents[0] = divBlock ;
+ }
+
+ // Calculate the common parent node of all content blocks.
+ var commonParent = groupObj.contents[0].parentNode ;
+ for ( var i = 0 ; i < contents.length ; i++ )
+ 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
+ // by expanding the selected blocks to the same tree level.
+ for ( var i = 0 ; i < contents.length ; i++ )
+ {
+ var contentNode = contents[i] ;
+ while ( contentNode.parentNode )
+ {
+ if ( contentNode.parentNode == commonParent )
+ {
+ listContents.push( contentNode ) ;
+ break ;
+ }
+ contentNode = contentNode.parentNode ;
+ }
+ }
+
+ if ( listContents.length < 1 )
+ return ;
+
+ // Insert the list to the DOM tree.
+ var insertAnchor = listContents[listContents.length - 1].nextSibling ;
+ var listNode = doc.createElement( this.TagName ) ;
+ listsCreated.push( listNode ) ;
+ while ( listContents.length )
+ {
+ var contentBlock = listContents.shift() ;
+ var docFrag = doc.createDocumentFragment() ;
+ while ( contentBlock.firstChild )
+ docFrag.appendChild( contentBlock.removeChild( contentBlock.firstChild ) ) ;
+ contentBlock.parentNode.removeChild( contentBlock ) ;
+ var listItem = doc.createElement( 'li' ) ;
+ listItem.appendChild( docFrag ) ;
+ listNode.appendChild( listItem ) ;
+ }
+ commonParent.insertBefore( listNode, insertAnchor ) ;
+ },
+
+ _RemoveList : function( groupObj, markerObj )
+ {
+ // 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.
+ var listArray = FCKDomTools.ListToArray( groupObj.root, markerObj ) ;
+ var selectedListItems = [] ;
+ for ( var i = 0 ; i < groupObj.contents.length ; i++ )
+ {
+ var itemNode = groupObj.contents[i] ;
+ itemNode = FCKTools.GetElementAscensor( itemNode, 'li' ) ;
+ if ( ! itemNode || itemNode._FCK_ListItem_Processed )
+ continue ;
+ selectedListItems.push( itemNode ) ;
+ FCKDomTools.SetElementMarker( markerObj, itemNode, '_FCK_ListItem_Processed', true ) ;
+ }
+
+ var lastListIndex = null ;
+ for ( var i = 0 ; i < selectedListItems.length ; i++ )
+ {
+ var listIndex = selectedListItems[i]._FCK_ListArray_Index ;
+ listArray[listIndex].indent = -1 ;
+ lastListIndex = listIndex ;
+ }
+
+ // 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
+ // list cannot be converted back to a real DOM list.
+ for ( var i = lastListIndex + 1; i < listArray.length ; i++ )
+ {
+ if ( listArray[i].indent > listArray[i-1].indent + 1 )
+ {
+ var indentOffset = listArray[i-1].indent + 1 - listArray[i].indent ;
+ var oldIndent = listArray[i].indent ;
+ while ( listArray[i] && listArray[i].indent >= oldIndent)
+ {
+ listArray[i].indent += indentOffset ;
+ i++ ;
+ }
+ i-- ;
+ }
+ }
+
+ 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
+ // 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 ( newList.listNode.lastChild.nodeName.IEquals( 'br' ) )
+ newList.listNode.removeChild( newList.listNode.lastChild ) ;
+ }
+ groupObj.root.parentNode.replaceChild( newList.listNode, groupObj.root ) ;
+ }
+};
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fcknamedcommand.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fcknamedcommand.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,39 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKNamedCommand Class: represents an internal browser command.
+ */
+
+var FCKNamedCommand = function( commandName )
+{
+ this.Name = commandName ;
+}
+
+FCKNamedCommand.prototype.Execute = function()
+{
+ FCK.ExecuteNamedCommand( this.Name ) ;
+}
+
+FCKNamedCommand.prototype.GetState = function()
+{
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
+ return FCK_TRISTATE_DISABLED ;
+ return FCK.GetNamedCommandState( this.Name ) ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckpasteplaintextcommand.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckpasteplaintextcommand.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,40 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKPastePlainTextCommand Class: represents the
+ * "Paste as Plain Text" command.
+ */
+
+var FCKPastePlainTextCommand = function()
+{
+ this.Name = 'PasteText' ;
+}
+
+FCKPastePlainTextCommand.prototype.Execute = function()
+{
+ FCK.PasteAsPlainText() ;
+}
+
+FCKPastePlainTextCommand.prototype.GetState = function()
+{
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
+ return FCK_TRISTATE_DISABLED ;
+ return FCK.GetNamedCommandState( 'Paste' ) ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckpastewordcommand.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckpastewordcommand.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,40 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKPasteWordCommand Class: represents the "Paste from Word" command.
+ */
+
+var FCKPasteWordCommand = function()
+{
+ this.Name = 'PasteWord' ;
+}
+
+FCKPasteWordCommand.prototype.Execute = function()
+{
+ FCK.PasteFromWord() ;
+}
+
+FCKPasteWordCommand.prototype.GetState = function()
+{
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || FCKConfig.ForcePasteAsPlainText )
+ return FCK_TRISTATE_DISABLED ;
+ else
+ return FCK.GetNamedCommandState( 'Paste' ) ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckremoveformatcommand.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckremoveformatcommand.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,45 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKRemoveFormatCommand Class: controls the execution of a core style. Core
+ * styles are usually represented as buttons in the toolbar., like Bold and
+ * Italic.
+ */
+
+ var FCKRemoveFormatCommand = function()
+ {
+ this.Name = 'RemoveFormat' ;
+ }
+
+ FCKRemoveFormatCommand.prototype =
+ {
+ Execute : function()
+ {
+ FCKStyles.RemoveAll() ;
+
+ FCK.Focus() ;
+ FCK.Events.FireEvent( 'OnSelectionChange' ) ;
+ },
+
+ GetState : function()
+ {
+ return FCK.EditorWindow ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
+ }
+ };
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckshowblocks.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckshowblocks.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,91 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKShowBlockCommand Class: the "Show Blocks" command.
+ */
+
+var FCKShowBlockCommand = function( name, defaultState )
+{
+ this.Name = name ;
+ if ( defaultState != undefined )
+ this._SavedState = defaultState ;
+ else
+ this._SavedState = null ;
+}
+
+FCKShowBlockCommand.prototype.Execute = function()
+{
+ var state = this.GetState() ;
+
+ if ( state == FCK_TRISTATE_DISABLED )
+ return ;
+
+ var body = FCK.EditorDocument.body ;
+
+ if ( state == FCK_TRISTATE_ON )
+ body.className = body.className.replace( /(^| )FCK__ShowBlocks/g, '' ) ;
+ else
+ body.className += ' FCK__ShowBlocks' ;
+
+ if ( FCKBrowserInfo.IsIE )
+ {
+ try
+ {
+ FCK.EditorDocument.selection.createRange().select() ;
+ }
+ catch ( e )
+ {}
+ }
+ else
+ {
+ var focus = FCK.EditorWindow.getSelection().focusNode ;
+ if ( focus.nodeType != 1 )
+ focus = focus.parentNode ;
+ FCKDomTools.ScrollIntoView( focus, false ) ;
+ }
+
+ FCK.Events.FireEvent( 'OnSelectionChange' ) ;
+}
+
+FCKShowBlockCommand.prototype.GetState = function()
+{
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
+ return FCK_TRISTATE_DISABLED ;
+
+ // On some cases FCK.EditorDocument.body is not yet available
+ 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() ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckspellcheckcommand_gecko.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckspellcheckcommand_gecko.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,41 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKStyleCommand Class: represents the "Spell Check" command.
+ * (Gecko specific implementation)
+ */
+
+var FCKSpellCheckCommand = function()
+{
+ this.Name = 'SpellCheck' ;
+ this.IsEnabled = ( FCKConfig.SpellChecker == 'SpellerPages' ) ;
+}
+
+FCKSpellCheckCommand.prototype.Execute = function()
+{
+ FCKDialog.OpenDialog( 'FCKDialog_SpellCheck', 'Spell Check', 'dialog/fck_spellerpages.html', 440, 480 ) ;
+}
+
+FCKSpellCheckCommand.prototype.GetState = function()
+{
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
+ return FCK_TRISTATE_DISABLED ;
+ return this.IsEnabled ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckspellcheckcommand_ie.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckspellcheckcommand_ie.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,69 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKStyleCommand Class: represents the "Spell Check" command.
+ * (IE specific implementation)
+ */
+
+var FCKSpellCheckCommand = function()
+{
+ this.Name = 'SpellCheck' ;
+ this.IsEnabled = ( FCKConfig.SpellChecker == 'ieSpell' || FCKConfig.SpellChecker == 'SpellerPages' ) ;
+}
+
+FCKSpellCheckCommand.prototype.Execute = function()
+{
+ switch ( FCKConfig.SpellChecker )
+ {
+ case 'ieSpell' :
+ this._RunIeSpell() ;
+ break ;
+
+ case 'SpellerPages' :
+ FCKDialog.OpenDialog( 'FCKDialog_SpellCheck', 'Spell Check', 'dialog/fck_spellerpages.html', 440, 480 ) ;
+ break ;
+ }
+}
+
+FCKSpellCheckCommand.prototype._RunIeSpell = function()
+{
+ try
+ {
+ var oIeSpell = new ActiveXObject( "ieSpell.ieSpellExtension" ) ;
+ oIeSpell.CheckAllLinkedDocuments( FCK.EditorDocument ) ;
+ }
+ catch( e )
+ {
+ if( e.number == -2146827859 )
+ {
+ if ( confirm( FCKLang.IeSpellDownload ) )
+ window.open( FCKConfig.IeSpellDownloadUrl , 'IeSpellDownload' ) ;
+ }
+ else
+ alert( 'Error Loading ieSpell: ' + e.message + ' (' + e.number + ')' ) ;
+ }
+}
+
+FCKSpellCheckCommand.prototype.GetState = function()
+{
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
+ return FCK_TRISTATE_DISABLED ;
+ return this.IsEnabled ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckstylecommand.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fckstylecommand.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,60 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKStyleCommand Class: represents the "Style" command.
+ */
+
+var FCKStyleCommand = function()
+{}
+
+FCKStyleCommand.prototype =
+{
+ Name : 'Style',
+
+ Execute : function( styleName, styleComboItem )
+ {
+ FCKUndo.SaveUndoStep() ;
+
+ if ( styleComboItem.Selected )
+ FCK.Styles.RemoveStyle( styleComboItem.Style ) ;
+ else
+ FCK.Styles.ApplyStyle( styleComboItem.Style ) ;
+
+ FCKUndo.SaveUndoStep() ;
+
+ FCK.Focus() ;
+ FCK.Events.FireEvent( 'OnSelectionChange' ) ;
+ },
+
+ GetState : function()
+ {
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || !FCK.EditorDocument )
+ return FCK_TRISTATE_DISABLED ;
+
+ if ( FCKSelection.GetType() == 'Control' )
+ {
+ var el = FCKSelection.GetSelectedElement() ;
+ if ( !el || !FCKStyles.CheckHasObjectStyle( el.nodeName.toLowerCase() ) )
+ return FCK_TRISTATE_DISABLED ;
+ }
+
+ return FCK_TRISTATE_OFF ;
+ }
+};
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fcktablecommand.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fcktablecommand.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,106 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKPastePlainTextCommand Class: represents the
+ * "Paste as Plain Text" command.
+ */
+
+var FCKTableCommand = function( command )
+{
+ this.Name = command ;
+}
+
+FCKTableCommand.prototype.Execute = function()
+{
+ FCKUndo.SaveUndoStep() ;
+
+ if ( ! FCKBrowserInfo.IsGecko )
+ {
+ switch ( this.Name )
+ {
+ case 'TableMergeRight' :
+ return FCKTableHandler.MergeRight() ;
+ case 'TableMergeDown' :
+ return FCKTableHandler.MergeDown() ;
+ }
+ }
+
+ switch ( this.Name )
+ {
+ case 'TableInsertRowAfter' :
+ return FCKTableHandler.InsertRow( false ) ;
+ case 'TableInsertRowBefore' :
+ return FCKTableHandler.InsertRow( true ) ;
+ case 'TableDeleteRows' :
+ return FCKTableHandler.DeleteRows() ;
+ case 'TableInsertColumnAfter' :
+ return FCKTableHandler.InsertColumn( false ) ;
+ case 'TableInsertColumnBefore' :
+ return FCKTableHandler.InsertColumn( true ) ;
+ case 'TableDeleteColumns' :
+ return FCKTableHandler.DeleteColumns() ;
+ case 'TableInsertCellAfter' :
+ return FCKTableHandler.InsertCell( null, false ) ;
+ case 'TableInsertCellBefore' :
+ return FCKTableHandler.InsertCell( null, true ) ;
+ case 'TableDeleteCells' :
+ return FCKTableHandler.DeleteCells() ;
+ case 'TableMergeCells' :
+ return FCKTableHandler.MergeCells() ;
+ case 'TableHorizontalSplitCell' :
+ return FCKTableHandler.HorizontalSplitCell() ;
+ case 'TableVerticalSplitCell' :
+ return FCKTableHandler.VerticalSplitCell() ;
+ case 'TableDelete' :
+ return FCKTableHandler.DeleteTable() ;
+ default :
+ return alert( FCKLang.UnknownCommand.replace( /%1/g, this.Name ) ) ;
+ }
+}
+
+FCKTableCommand.prototype.GetState = function()
+{
+ if ( FCK.EditorDocument != null && FCKSelection.HasAncestorNode( 'TABLE' ) )
+ {
+ switch ( this.Name )
+ {
+ case 'TableHorizontalSplitCell' :
+ case 'TableVerticalSplitCell' :
+ if ( FCKTableHandler.GetSelectedCells().length == 1 )
+ return FCK_TRISTATE_OFF ;
+ else
+ return FCK_TRISTATE_DISABLED ;
+ case 'TableMergeCells' :
+ if ( FCKTableHandler.CheckIsSelectionRectangular()
+ && FCKTableHandler.GetSelectedCells().length > 1 )
+ return FCK_TRISTATE_OFF ;
+ else
+ return FCK_TRISTATE_DISABLED ;
+ case 'TableMergeRight' :
+ return FCKTableHandler.GetMergeRightTarget() ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
+ case 'TableMergeDown' :
+ return FCKTableHandler.GetMergeDownTarget() ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
+ default :
+ return FCK_TRISTATE_OFF ;
+ }
+ }
+ else
+ return FCK_TRISTATE_DISABLED;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fcktextcolorcommand.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/commandclasses/fcktextcolorcommand.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,201 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * FCKTextColorCommand Class: represents the text color comand. It shows the
+ * color selection panel.
+ */
+
+// FCKTextColorCommand Constructor
+// type: can be 'ForeColor' or 'BackColor'.
+var FCKTextColorCommand = function( type )
+{
+ this.Name = type == 'ForeColor' ? 'TextColor' : 'BGColor' ;
+ this.Type = type ;
+
+ var oWindow ;
+
+ if ( FCKBrowserInfo.IsIE )
+ oWindow = window ;
+ else if ( FCK.ToolbarSet._IFrame )
+ oWindow = FCKTools.GetElementWindow( FCK.ToolbarSet._IFrame ) ;
+ else
+ oWindow = window.parent ;
+
+ this._Panel = new FCKPanel( oWindow ) ;
+ this._Panel.AppendStyleSheet( FCKConfig.SkinEditorCSS ) ;
+ this._Panel.MainNode.className = 'FCK_Panel' ;
+ this._CreatePanelBody( this._Panel.Document, this._Panel.MainNode ) ;
+ FCK.ToolbarSet.ToolbarItems.GetItem( this.Name ).RegisterPanel( this._Panel ) ;
+
+ FCKTools.DisableSelection( this._Panel.Document.body ) ;
+}
+
+FCKTextColorCommand.prototype.Execute = function( panelX, panelY, relElement )
+{
+ // Show the Color Panel at the desired position.
+ this._Panel.Show( panelX, panelY, relElement ) ;
+}
+
+FCKTextColorCommand.prototype.SetColor = function( color )
+{
+ FCKUndo.SaveUndoStep() ;
+
+ var style = FCKStyles.GetStyle( '_FCK_' +
+ ( this.Type == 'ForeColor' ? 'Color' : 'BackColor' ) ) ;
+
+ if ( !color || color.length == 0 )
+ FCK.Styles.RemoveStyle( style ) ;
+ else
+ {
+ style.SetVariable( 'Color', color ) ;
+ FCKStyles.ApplyStyle( style ) ;
+ }
+
+ FCKUndo.SaveUndoStep() ;
+
+ FCK.Focus() ;
+ FCK.Events.FireEvent( 'OnSelectionChange' ) ;
+}
+
+FCKTextColorCommand.prototype.GetState = function()
+{
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
+ return FCK_TRISTATE_DISABLED ;
+ return FCK_TRISTATE_OFF ;
+}
+
+function FCKTextColorCommand_OnMouseOver()
+{
+ this.className = 'ColorSelected' ;
+}
+
+function FCKTextColorCommand_OnMouseOut()
+{
+ this.className = 'ColorDeselected' ;
+}
+
+function FCKTextColorCommand_OnClick( ev, command, color )
+{
+ this.className = 'ColorDeselected' ;
+ command.SetColor( color ) ;
+ command._Panel.Hide() ;
+}
+
+function FCKTextColorCommand_AutoOnClick( ev, command )
+{
+ this.className = 'ColorDeselected' ;
+ command.SetColor( '' ) ;
+ command._Panel.Hide() ;
+}
+
+function FCKTextColorCommand_MoreOnClick( ev, command )
+{
+ this.className = 'ColorDeselected' ;
+ command._Panel.Hide() ;
+ FCKDialog.OpenDialog( 'FCKDialog_Color', FCKLang.DlgColorTitle, 'dialog/fck_colorselector.html', 410, 320,
+ FCKTools.Bind( command, command.SetColor ) ) ;
+}
+
+FCKTextColorCommand.prototype._CreatePanelBody = function( targetDocument, targetDiv )
+{
+ function CreateSelectionDiv()
+ {
+ var oDiv = targetDocument.createElement( "DIV" ) ;
+ oDiv.className = 'ColorDeselected' ;
+ FCKTools.AddEventListenerEx( oDiv, 'mouseover', FCKTextColorCommand_OnMouseOver ) ;
+ FCKTools.AddEventListenerEx( oDiv, 'mouseout', FCKTextColorCommand_OnMouseOut ) ;
+
+ return oDiv ;
+ }
+
+ // Create the Table that will hold all colors.
+ var oTable = targetDiv.appendChild( targetDocument.createElement( "TABLE" ) ) ;
+ oTable.className = 'ForceBaseFont' ; // Firefox 1.5 Bug.
+ oTable.style.tableLayout = 'fixed' ;
+ oTable.cellPadding = 0 ;
+ oTable.cellSpacing = 0 ;
+ oTable.border = 0 ;
+ oTable.width = 150 ;
+
+ var oCell = oTable.insertRow(-1).insertCell(-1) ;
+ oCell.colSpan = 8 ;
+
+ // Create the Button for the "Automatic" color selection.
+ var oDiv = oCell.appendChild( CreateSelectionDiv() ) ;
+ oDiv.innerHTML =
+ '<table cellspacing="0" cellpadding="0" width="100%" border="0">\
+ <tr>\
+ <td><div class="ColorBoxBorder"><div class="ColorBox" style="background-color: #000000"></div></div></td>\
+ <td nowrap width="100%" align="center">' + FCKLang.ColorAutomatic + '</td>\
+ </tr>\
+ </table>' ;
+
+ FCKTools.AddEventListenerEx( oDiv, 'click', FCKTextColorCommand_AutoOnClick, this ) ;
+
+ // Dirty hack for Opera, Safari and Firefox 3.
+ if ( !FCKBrowserInfo.IsIE )
+ oDiv.style.width = '96%' ;
+
+ // Create an array of colors based on the configuration file.
+ var aColors = FCKConfig.FontColors.toString().split(',') ;
+
+ // Create the colors table based on the array.
+ var iCounter = 0 ;
+ while ( iCounter < aColors.length )
+ {
+ var oRow = oTable.insertRow(-1) ;
+
+ for ( var i = 0 ; i < 8 ; i++, iCounter++ )
+ {
+ // The div will be created even if no more colors are available.
+ // Extra divs will be hidden later in the code. (#1597)
+ if ( iCounter < aColors.length )
+ {
+ var colorParts = aColors[iCounter].split('/') ;
+ var colorValue = '#' + colorParts[0] ;
+ var colorName = colorParts[1] || colorValue ;
+ }
+
+ oDiv = oRow.insertCell(-1).appendChild( CreateSelectionDiv() ) ;
+ oDiv.innerHTML = '<div class="ColorBoxBorder"><div class="ColorBox" style="background-color: ' + colorValue + '"></div></div>' ;
+
+ if ( iCounter >= aColors.length )
+ oDiv.style.visibility = 'hidden' ;
+ else
+ FCKTools.AddEventListenerEx( oDiv, 'click', FCKTextColorCommand_OnClick, [ this, colorName ] ) ;
+ }
+ }
+
+ // Create the Row and the Cell for the "More Colors..." button.
+ if ( FCKConfig.EnableMoreFontColors )
+ {
+ oCell = oTable.insertRow(-1).insertCell(-1) ;
+ oCell.colSpan = 8 ;
+
+ 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>' ;
+
+ FCKTools.AddEventListenerEx( oDiv, 'click', FCKTextColorCommand_MoreOnClick, this ) ;
+ }
+
+ // Dirty hack for Opera, Safari and Firefox 3.
+ if ( !FCKBrowserInfo.IsIE )
+ oDiv.style.width = '96%' ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/fckconstants.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/fckconstants.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,56 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Defines some constants used by the editor. These constants are also
+ * globally available in the page where the editor is placed.
+ */
+
+// Editor Instance Status.
+var FCK_STATUS_NOTLOADED = window.parent.FCK_STATUS_NOTLOADED = 0 ;
+var FCK_STATUS_ACTIVE = window.parent.FCK_STATUS_ACTIVE = 1 ;
+var FCK_STATUS_COMPLETE = window.parent.FCK_STATUS_COMPLETE = 2 ;
+
+// Tristate Operations.
+var FCK_TRISTATE_OFF = window.parent.FCK_TRISTATE_OFF = 0 ;
+var FCK_TRISTATE_ON = window.parent.FCK_TRISTATE_ON = 1 ;
+var FCK_TRISTATE_DISABLED = window.parent.FCK_TRISTATE_DISABLED = -1 ;
+
+// For unknown values.
+var FCK_UNKNOWN = window.parent.FCK_UNKNOWN = -9 ;
+
+// Toolbar Items Style.
+var FCK_TOOLBARITEM_ONLYICON = window.parent.FCK_TOOLBARITEM_ONLYICON = 0 ;
+var FCK_TOOLBARITEM_ONLYTEXT = window.parent.FCK_TOOLBARITEM_ONLYTEXT = 1 ;
+var FCK_TOOLBARITEM_ICONTEXT = window.parent.FCK_TOOLBARITEM_ICONTEXT = 2 ;
+
+// Edit Mode
+var FCK_EDITMODE_WYSIWYG = window.parent.FCK_EDITMODE_WYSIWYG = 0 ;
+var FCK_EDITMODE_SOURCE = window.parent.FCK_EDITMODE_SOURCE = 1 ;
+
+var FCK_IMAGES_PATH = 'images/' ; // Check usage.
+var FCK_SPACER_PATH = 'images/spacer.gif' ;
+
+var CTRL = 1000 ;
+var SHIFT = 2000 ;
+var ALT = 4000 ;
+
+var FCK_STYLE_BLOCK = 0 ;
+var FCK_STYLE_INLINE = 1 ;
+var FCK_STYLE_OBJECT = 2 ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/fckeditorapi.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/fckeditorapi.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,178 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Create the FCKeditorAPI object that is available as a global object in
+ * the page where the editor is placed in.
+ */
+
+var FCKeditorAPI ;
+
+function InitializeAPI()
+{
+ var oParentWindow = window.parent ;
+
+ if ( !( FCKeditorAPI = oParentWindow.FCKeditorAPI ) )
+ {
+ // 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
+ // available if the editor instance is removed ("Can't execute code
+ // from a freed script" error).
+
+ // 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
+ // objects that aren't really FCKeditor instances.
+ var sScript =
+ 'window.FCKeditorAPI = {' +
+ 'Version : "2.6.3",' +
+ 'VersionBuild : "19836",' +
+ 'Instances : new Object(),' +
+
+ 'GetInstance : function( name )' +
+ '{' +
+ 'return this.Instances[ name ];' +
+ '},' +
+
+ '_FormSubmit : function()' +
+ '{' +
+ 'for ( var name in FCKeditorAPI.Instances )' +
+ '{' +
+ 'var oEditor = FCKeditorAPI.Instances[ name ] ;' +
+ 'if ( oEditor.GetParentForm && oEditor.GetParentForm() == this )' +
+ 'oEditor.UpdateLinkedField() ;' +
+ '}' +
+ 'this._FCKOriginalSubmit() ;' +
+ '},' +
+
+ '_FunctionQueue : {' +
+ 'Functions : new Array(),' +
+ 'IsRunning : false,' +
+
+ 'Add : function( f )' +
+ '{' +
+ 'this.Functions.push( f );' +
+ 'if ( !this.IsRunning )' +
+ 'this.StartNext();' +
+ '},' +
+
+ 'StartNext : function()' +
+ '{' +
+ 'var aQueue = this.Functions ;' +
+ 'if ( aQueue.length > 0 )' +
+ '{' +
+ 'this.IsRunning = true;' +
+ 'aQueue[0].call();' +
+ '}' +
+ 'else ' +
+ 'this.IsRunning = false;' +
+ '},' +
+
+ 'Remove : function( f )' +
+ '{' +
+ 'var aQueue = this.Functions;' +
+ 'var i = 0, fFunc;' +
+ 'while( (fFunc = aQueue[ i ]) )' +
+ '{' +
+ 'if ( fFunc == f )' +
+ 'aQueue.splice( i,1 );' +
+ 'i++ ;' +
+ '}' +
+ 'this.StartNext();' +
+ '}' +
+ '}' +
+ '}' ;
+
+ // In IE, the "eval" function is not always available (it works with
+ // the JavaScript samples, but not with the ASP ones, for example).
+ // So, let's use the execScript instead.
+ if ( oParentWindow.execScript )
+ oParentWindow.execScript( sScript, 'JavaScript' ) ;
+ else
+ {
+ if ( FCKBrowserInfo.IsGecko10 )
+ {
+ // FF 1.0.4 gives an error with the request bellow. The
+ // following seams to work well.
+ eval.call( oParentWindow, sScript ) ;
+ }
+ else if( FCKBrowserInfo.IsAIR )
+ {
+ FCKAdobeAIR.FCKeditorAPI_Evaluate( oParentWindow, sScript ) ;
+ }
+ else if ( FCKBrowserInfo.IsSafari )
+ {
+ // oParentWindow.eval in Safari and Gran Paradiso executes in the calling window
+ // environment, instead of the parent one. The following should make it work.
+ var oParentDocument = oParentWindow.document ;
+ var eScript = oParentDocument.createElement('script') ;
+ eScript.appendChild( oParentDocument.createTextNode( sScript ) ) ;
+ oParentDocument.documentElement.appendChild( eScript ) ;
+ }
+ else
+ oParentWindow.eval( sScript ) ;
+ }
+
+ FCKeditorAPI = oParentWindow.FCKeditorAPI ;
+
+ // The __Instances properly has been changed to the public Instances,
+ // but we should still have the "deprecated" version of it.
+ FCKeditorAPI.__Instances = FCKeditorAPI.Instances ;
+ }
+
+ // Add the current instance to the FCKeditorAPI's instances collection.
+ FCKeditorAPI.Instances[ FCK.Name ] = FCK ;
+}
+
+// Attach to the form onsubmit event and to the form.submit().
+function _AttachFormSubmitToAPI()
+{
+ // Get the linked field form.
+ var oForm = FCK.GetParentForm() ;
+
+ if ( oForm )
+ {
+ // Attach to the onsubmit event.
+ FCKTools.AddEventListener( oForm, 'submit', FCK.UpdateLinkedField ) ;
+
+ // IE sees oForm.submit function as an 'object'.
+ if ( !oForm._FCKOriginalSubmit && ( typeof( oForm.submit ) == 'function' || ( !oForm.submit.tagName && !oForm.submit.length ) ) )
+ {
+ // Save the original submit.
+ oForm._FCKOriginalSubmit = oForm.submit ;
+
+ // Create our replacement for the submit.
+ oForm.submit = FCKeditorAPI._FormSubmit ;
+ }
+ }
+}
+
+function FCKeditorAPI_Cleanup()
+{
+ if ( window.FCKConfig && FCKConfig.MsWebBrowserControlCompat
+ && !window.FCKUnloadFlag )
+ return ;
+ delete FCKeditorAPI.Instances[ FCK.Name ] ;
+}
+function FCKeditorAPI_ConfirmCleanup()
+{
+ if ( window.FCKConfig && FCKConfig.MsWebBrowserControlCompat )
+ window.FCKUnloadFlag = true ;
+}
+FCKTools.AddEventListener( window, 'unload', FCKeditorAPI_Cleanup ) ;
+FCKTools.AddEventListener( window, 'beforeunload', FCKeditorAPI_ConfirmCleanup) ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/fckjscoreextensions.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/fckjscoreextensions.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,166 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Extensions to the JavaScript Core.
+ *
+ * All custom extensions functions are PascalCased to differ from the standard
+ * camelCased ones.
+ */
+
+String.prototype.Contains = function( textToCheck )
+{
+ return ( this.indexOf( textToCheck ) > -1 ) ;
+}
+
+String.prototype.Equals = function()
+{
+ var aArgs = arguments ;
+
+ // The arguments could also be a single array.
+ if ( aArgs.length == 1 && aArgs[0].pop )
+ aArgs = aArgs[0] ;
+
+ for ( var i = 0 ; i < aArgs.length ; i++ )
+ {
+ if ( this == aArgs[i] )
+ return true ;
+ }
+ return false ;
+}
+
+String.prototype.IEquals = function()
+{
+ var thisUpper = this.toUpperCase() ;
+
+ var aArgs = arguments ;
+
+ // The arguments could also be a single array.
+ if ( aArgs.length == 1 && aArgs[0].pop )
+ aArgs = aArgs[0] ;
+
+ for ( var i = 0 ; i < aArgs.length ; i++ )
+ {
+ if ( thisUpper == aArgs[i].toUpperCase() )
+ return true ;
+ }
+ return false ;
+}
+
+String.prototype.ReplaceAll = function( searchArray, replaceArray )
+{
+ var replaced = this ;
+
+ for ( var i = 0 ; i < searchArray.length ; i++ )
+ {
+ replaced = replaced.replace( searchArray[i], replaceArray[i] ) ;
+ }
+
+ return replaced ;
+}
+
+String.prototype.StartsWith = function( value )
+{
+ return ( this.substr( 0, value.length ) == value ) ;
+}
+
+// Extends the String object, creating a "EndsWith" method on it.
+String.prototype.EndsWith = function( value, ignoreCase )
+{
+ var L1 = this.length ;
+ var L2 = value.length ;
+
+ if ( L2 > L1 )
+ return false ;
+
+ if ( ignoreCase )
+ {
+ var oRegex = new RegExp( value + '$' , 'i' ) ;
+ return oRegex.test( this ) ;
+ }
+ else
+ return ( L2 == 0 || this.substr( L1 - L2, L2 ) == value ) ;
+}
+
+String.prototype.Remove = function( start, length )
+{
+ var s = '' ;
+
+ if ( start > 0 )
+ s = this.substring( 0, start ) ;
+
+ if ( start + length < this.length )
+ s += this.substring( start + length , this.length ) ;
+
+ return s ;
+}
+
+String.prototype.Trim = function()
+{
+ // 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, '' ) ;
+}
+
+String.prototype.LTrim = function()
+{
+ // We are not using \s because we don't want "non-breaking spaces to be caught".
+ return this.replace( /^[ \t\n\r]*/g, '' ) ;
+}
+
+String.prototype.RTrim = function()
+{
+ // We are not using \s because we don't want "non-breaking spaces to be caught".
+ return this.replace( /[ \t\n\r]*$/g, '' ) ;
+}
+
+String.prototype.ReplaceNewLineChars = function( replacement )
+{
+ return this.replace( /\n/g, replacement ) ;
+}
+
+String.prototype.Replace = function( regExp, replacement, thisObj )
+{
+ if ( typeof replacement == 'function' )
+ {
+ return this.replace( regExp,
+ function()
+ {
+ return replacement.apply( thisObj || this, arguments ) ;
+ } ) ;
+ }
+ else
+ return this.replace( regExp, replacement ) ;
+}
+
+Array.prototype.AddItem = function( item )
+{
+ var i = this.length ;
+ this[ i ] = item ;
+ return i ;
+}
+
+Array.prototype.IndexOf = function( value )
+{
+ for ( var i = 0 ; i < this.length ; i++ )
+ {
+ if ( this[i] == value )
+ return i ;
+ }
+ return -1 ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/fckscriptloader.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/fckscriptloader.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,122 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This is a utility object which can be used to load specific components of
+ * FCKeditor, including all dependencies.
+ */
+
+var FCK_GENERIC = 1 ;
+var FCK_GENERIC_SPECIFIC = 2 ;
+var FCK_SPECIFIC = 3 ;
+
+var FCKScriptLoader = new Object() ;
+FCKScriptLoader.FCKeditorPath = '/fckeditor/' ;
+
+FCKScriptLoader._Scripts = new Object() ;
+FCKScriptLoader._LoadedScripts = new Object() ;
+
+FCKScriptLoader._IsIE = (/msie/).test( navigator.userAgent.toLowerCase() ) ;
+
+FCKScriptLoader.Load = function( scriptName )
+{
+ // Check if the script has already been loaded.
+ if ( scriptName in FCKScriptLoader._LoadedScripts )
+ return ;
+
+ FCKScriptLoader._LoadedScripts[ scriptName ] = true ;
+
+ var oScriptInfo = this._Scripts[ scriptName ] ;
+
+ if ( !oScriptInfo )
+ {
+ alert( 'FCKScriptLoader: The script "' + scriptName + '" could not be loaded' ) ;
+ return ;
+ }
+
+ for ( var i = 0 ; i < oScriptInfo.Dependency.length ; i++ )
+ {
+ this.Load( oScriptInfo.Dependency[i] ) ;
+ }
+
+ var sBaseScriptName = oScriptInfo.BasePath + scriptName.toLowerCase() ;
+
+ if ( oScriptInfo.Compatibility == FCK_GENERIC || oScriptInfo.Compatibility == FCK_GENERIC_SPECIFIC )
+ this._LoadScript( sBaseScriptName + '.js' ) ;
+
+ if ( oScriptInfo.Compatibility == FCK_SPECIFIC || oScriptInfo.Compatibility == FCK_GENERIC_SPECIFIC )
+ {
+ if ( this._IsIE )
+ this._LoadScript( sBaseScriptName + '_ie.js' ) ;
+ else
+ this._LoadScript( sBaseScriptName + '_gecko.js' ) ;
+ }
+}
+
+FCKScriptLoader._LoadScript = function( scriptPathFromSource )
+{
+ document.write( '<script type="text/javascript" src="' + this.FCKeditorPath + 'editor/_source/' + scriptPathFromSource + '"><\/script>' ) ;
+}
+
+FCKScriptLoader.AddScript = function( scriptName, scriptBasePath, dependency, compatibility )
+{
+ this._Scripts[ scriptName ] =
+ {
+ BasePath : scriptBasePath || '',
+ Dependency : dependency || [],
+ Compatibility : compatibility || FCK_GENERIC
+ } ;
+}
+
+/*
+ * ####################################
+ * ### Scripts Definition List
+ */
+
+FCKScriptLoader.AddScript( 'FCKConstants' ) ;
+FCKScriptLoader.AddScript( 'FCKJSCoreExtensions' ) ;
+
+FCKScriptLoader.AddScript( 'FCK_Xhtml10Transitional', '../dtd/' ) ;
+
+FCKScriptLoader.AddScript( 'FCKDataProcessor' , 'classes/' , ['FCKConfig','FCKBrowserInfo','FCKRegexLib','FCKXHtml'] ) ;
+FCKScriptLoader.AddScript( 'FCKDocumentFragment', 'classes/' , ['FCKDomTools'], FCK_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( 'FCKElementPath' , 'classes/' , ['FCKListsLib'], FCK_GENERIC ) ;
+FCKScriptLoader.AddScript( 'FCKEnterKey' , 'classes/' , ['FCKDomRange','FCKDomTools','FCKTools','FCKKeystrokeHandler','FCKListHandler'], FCK_GENERIC ) ;
+FCKScriptLoader.AddScript( 'FCKPanel' , 'classes/' , ['FCKBrowserInfo','FCKConfig','FCKTools'], FCK_GENERIC ) ;
+FCKScriptLoader.AddScript( 'FCKImagePreloader' , 'classes/' ) ;
+FCKScriptLoader.AddScript( 'FCKKeystrokeHandler', 'classes/' , ['FCKConstants','FCKBrowserInfo','FCKTools'], 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( 'FCKBrowserInfo' , 'internals/' , ['FCKJSCoreExtensions'] ) ;
+FCKScriptLoader.AddScript( 'FCKCodeFormatter' , 'internals/' ) ;
+FCKScriptLoader.AddScript( 'FCKConfig' , 'internals/' , ['FCKBrowserInfo','FCKConstants'] ) ;
+FCKScriptLoader.AddScript( 'FCKDebug' , 'internals/' , ['FCKConfig'] ) ;
+FCKScriptLoader.AddScript( 'FCKDomTools' , 'internals/' , ['FCKJSCoreExtensions','FCKBrowserInfo','FCKTools','FCKDomRange'], FCK_GENERIC ) ;
+FCKScriptLoader.AddScript( 'FCKListsLib' , 'internals/' ) ;
+FCKScriptLoader.AddScript( 'FCKListHandler' , 'internals/' , ['FCKConfig', 'FCKDocumentFragment', 'FCKJSCoreExtensions','FCKDomTools'], FCK_GENERIC ) ;
+FCKScriptLoader.AddScript( 'FCKRegexLib' , 'internals/' ) ;
+FCKScriptLoader.AddScript( 'FCKStyles' , 'internals/' , ['FCKConfig', 'FCKDocumentFragment', 'FCKDomRange','FCKDomTools','FCKElementPath','FCKTools'], FCK_GENERIC ) ;
+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( 'FCKXHtmlEntities' , 'internals/' , ['FCKConfig'] ) ;
+
+// ####################################
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fck.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fck.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,1252 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Creation and initialization of the "FCK" object. This is the main object
+ * that represents an editor instance.
+ */
+
+// FCK represents the active editor instance.
+var FCK =
+{
+ Name : FCKURLParams[ 'InstanceName' ],
+ Status : FCK_STATUS_NOTLOADED,
+ EditMode : FCK_EDITMODE_WYSIWYG,
+ Toolbar : null,
+ HasFocus : false,
+ DataProcessor : new FCKDataProcessor(),
+
+ GetInstanceObject : (function()
+ {
+ var w = window ;
+ return function( name )
+ {
+ return w[name] ;
+ }
+ })(),
+
+ AttachToOnSelectionChange : function( functionPointer )
+ {
+ this.Events.AttachEvent( 'OnSelectionChange', functionPointer ) ;
+ },
+
+ GetLinkedFieldValue : function()
+ {
+ return this.LinkedField.value ;
+ },
+
+ GetParentForm : function()
+ {
+ return this.LinkedField.form ;
+ } ,
+
+ // # START : IsDirty implementation
+
+ StartupValue : '',
+
+ IsDirty : function()
+ {
+ if ( this.EditMode == FCK_EDITMODE_SOURCE )
+ return ( this.StartupValue != this.EditingArea.Textarea.value ) ;
+ else
+ {
+ // It can happen switching between design and source mode in Gecko
+ if ( ! this.EditorDocument )
+ return false ;
+
+ return ( this.StartupValue != this.EditorDocument.body.innerHTML ) ;
+ }
+ },
+
+ ResetIsDirty : function()
+ {
+ if ( this.EditMode == FCK_EDITMODE_SOURCE )
+ this.StartupValue = this.EditingArea.Textarea.value ;
+ else if ( this.EditorDocument.body )
+ this.StartupValue = this.EditorDocument.body.innerHTML ;
+ },
+
+ // # END : IsDirty implementation
+
+ StartEditor : function()
+ {
+ this.TempBaseTag = FCKConfig.BaseHref.length > 0 ? '<base href="' + FCKConfig.BaseHref + '" _fcktemp="true"></base>' : '' ;
+
+ // Setup the keystroke handler.
+ var oKeystrokeHandler = FCK.KeystrokeHandler = new FCKKeystrokeHandler() ;
+ oKeystrokeHandler.OnKeystroke = _FCK_KeystrokeHandler_OnKeystroke ;
+
+ // Set the config keystrokes.
+ oKeystrokeHandler.SetKeystrokes( FCKConfig.Keystrokes ) ;
+
+ // In IE7, if the editor tries to access the clipboard by code, a dialog is
+ // shown to the user asking if the application is allowed to access or not.
+ // Due to the IE implementation of it, the KeystrokeHandler will not work
+ //well in this case, so we must leave the pasting keys to have their default behavior.
+ if ( FCKBrowserInfo.IsIE7 )
+ {
+ if ( ( CTRL + 86 /*V*/ ) in oKeystrokeHandler.Keystrokes )
+ oKeystrokeHandler.SetKeystrokes( [ CTRL + 86, true ] ) ;
+
+ if ( ( SHIFT + 45 /*INS*/ ) in oKeystrokeHandler.Keystrokes )
+ oKeystrokeHandler.SetKeystrokes( [ SHIFT + 45, true ] ) ;
+ }
+
+ // Retain default behavior for Ctrl-Backspace. (Bug #362)
+ oKeystrokeHandler.SetKeystrokes( [ CTRL + 8, true ] ) ;
+
+ this.EditingArea = new FCKEditingArea( document.getElementById( 'xEditingArea' ) ) ;
+ this.EditingArea.FFSpellChecker = FCKConfig.FirefoxSpellChecker ;
+
+ // Set the editor's startup contents.
+ this.SetData( this.GetLinkedFieldValue(), true ) ;
+
+ // Tab key handling for source mode.
+ FCKTools.AddEventListener( document, "keydown", this._TabKeyHandler ) ;
+
+ // Add selection change listeners. They must be attached only once.
+ this.AttachToOnSelectionChange( _FCK_PaddingNodeListener ) ;
+ if ( FCKBrowserInfo.IsGecko )
+ this.AttachToOnSelectionChange( this._ExecCheckEmptyBlock ) ;
+
+ },
+
+ Focus : function()
+ {
+ FCK.EditingArea.Focus() ;
+ },
+
+ SetStatus : function( newStatus )
+ {
+ this.Status = newStatus ;
+
+ if ( newStatus == FCK_STATUS_ACTIVE )
+ {
+ FCKFocusManager.AddWindow( window, true ) ;
+
+ if ( FCKBrowserInfo.IsIE )
+ FCKFocusManager.AddWindow( window.frameElement, true ) ;
+
+ // Force the focus in the editor.
+ if ( FCKConfig.StartupFocus )
+ FCK.Focus() ;
+ }
+
+ this.Events.FireEvent( 'OnStatusChange', newStatus ) ;
+
+ },
+
+ // Fixes the body by moving all inline and text nodes to appropriate block
+ // elements.
+ FixBody : function()
+ {
+ var sBlockTag = FCKConfig.EnterMode ;
+
+ // In 'br' mode, no fix must be done.
+ if ( sBlockTag != 'p' && sBlockTag != 'div' )
+ return ;
+
+ var oDocument = this.EditorDocument ;
+
+ if ( !oDocument )
+ return ;
+
+ var oBody = oDocument.body ;
+
+ if ( !oBody )
+ return ;
+
+ FCKDomTools.TrimNode( oBody ) ;
+
+ var oNode = oBody.firstChild ;
+ var oNewBlock ;
+
+ while ( oNode )
+ {
+ var bMoveNode = false ;
+
+ switch ( oNode.nodeType )
+ {
+ // Element Node.
+ case 1 :
+ var nodeName = oNode.nodeName.toLowerCase() ;
+ if ( !FCKListsLib.BlockElements[ nodeName ] &&
+ nodeName != 'li' &&
+ !oNode.getAttribute('_fckfakelement') &&
+ oNode.getAttribute('_moz_dirty') == null )
+ bMoveNode = true ;
+ break ;
+
+ // Text Node.
+ case 3 :
+ // Ignore space only or empty text.
+ if ( oNewBlock || oNode.nodeValue.Trim().length > 0 )
+ bMoveNode = true ;
+ break;
+
+ // Comment Node
+ case 8 :
+ if ( oNewBlock )
+ bMoveNode = true ;
+ break;
+ }
+
+ if ( bMoveNode )
+ {
+ var oParent = oNode.parentNode ;
+
+ if ( !oNewBlock )
+ oNewBlock = oParent.insertBefore( oDocument.createElement( sBlockTag ), oNode ) ;
+
+ oNewBlock.appendChild( oParent.removeChild( oNode ) ) ;
+
+ oNode = oNewBlock.nextSibling ;
+ }
+ else
+ {
+ if ( oNewBlock )
+ {
+ FCKDomTools.TrimNode( oNewBlock ) ;
+ oNewBlock = null ;
+ }
+ oNode = oNode.nextSibling ;
+ }
+ }
+
+ if ( oNewBlock )
+ FCKDomTools.TrimNode( oNewBlock ) ;
+ },
+
+ GetData : function( format )
+ {
+ // We assume that if the user is in source editing, the editor value must
+ // represent the exact contents of the source, as the user wanted it to be.
+ if ( FCK.EditMode == FCK_EDITMODE_SOURCE )
+ return FCK.EditingArea.Textarea.value ;
+
+ this.FixBody() ;
+
+ var oDoc = FCK.EditorDocument ;
+ if ( !oDoc )
+ return null ;
+
+ var isFullPage = FCKConfig.FullPage ;
+
+ // Call the Data Processor to generate the output data.
+ var data = FCK.DataProcessor.ConvertToDataFormat(
+ isFullPage ? oDoc.documentElement : oDoc.body,
+ !isFullPage,
+ FCKConfig.IgnoreEmptyParagraphValue,
+ format ) ;
+
+ // Restore protected attributes.
+ data = FCK.ProtectEventsRestore( data ) ;
+
+ if ( FCKBrowserInfo.IsIE )
+ data = data.replace( FCKRegexLib.ToReplace, '$1' ) ;
+
+ if ( isFullPage )
+ {
+ if ( FCK.DocTypeDeclaration && FCK.DocTypeDeclaration.length > 0 )
+ data = FCK.DocTypeDeclaration + '\n' + data ;
+
+ if ( FCK.XmlDeclaration && FCK.XmlDeclaration.length > 0 )
+ data = FCK.XmlDeclaration + '\n' + data ;
+ }
+
+ return FCKConfig.ProtectedSource.Revert( data ) ;
+ },
+
+ UpdateLinkedField : function()
+ {
+ var value = FCK.GetXHTML( FCKConfig.FormatOutput ) ;
+
+ if ( FCKConfig.HtmlEncodeOutput )
+ value = FCKTools.HTMLEncode( value ) ;
+
+ FCK.LinkedField.value = value ;
+ FCK.Events.FireEvent( 'OnAfterLinkedFieldUpdate' ) ;
+ },
+
+ RegisteredDoubleClickHandlers : new Object(),
+
+ OnDoubleClick : function( element )
+ {
+ var oCalls = FCK.RegisteredDoubleClickHandlers[ element.tagName.toUpperCase() ] ;
+
+ if ( oCalls )
+ {
+ for ( var i = 0 ; i < oCalls.length ; i++ )
+ oCalls[ i ]( element ) ;
+ }
+
+ // Generic handler for any element
+ oCalls = FCK.RegisteredDoubleClickHandlers[ '*' ] ;
+
+ if ( oCalls )
+ {
+ for ( var i = 0 ; i < oCalls.length ; i++ )
+ oCalls[ i ]( element ) ;
+ }
+
+ },
+
+ // Register objects that can handle double click operations.
+ RegisterDoubleClickHandler : function( handlerFunction, tag )
+ {
+ var nodeName = tag || '*' ;
+ nodeName = nodeName.toUpperCase() ;
+
+ var aTargets ;
+
+ if ( !( aTargets = FCK.RegisteredDoubleClickHandlers[ nodeName ] ) )
+ FCK.RegisteredDoubleClickHandlers[ nodeName ] = [ handlerFunction ] ;
+ else
+ {
+ // 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)
+ if ( aTargets.IndexOf( handlerFunction ) == -1 )
+ aTargets.push( handlerFunction ) ;
+ }
+
+ },
+
+ OnAfterSetHTML : function()
+ {
+ FCKDocumentProcessor.Process( FCK.EditorDocument ) ;
+ FCKUndo.SaveUndoStep() ;
+
+ FCK.Events.FireEvent( 'OnSelectionChange' ) ;
+ FCK.Events.FireEvent( 'OnAfterSetHTML' ) ;
+ },
+
+ // Saves URLs on links and images on special attributes, so they don't change when
+ // moving around.
+ ProtectUrls : function( html )
+ {
+ // <A> href
+ html = html.replace( FCKRegexLib.ProtectUrlsA , '$& _fcksavedurl=$1' ) ;
+
+ // <IMG> src
+ html = html.replace( FCKRegexLib.ProtectUrlsImg , '$& _fcksavedurl=$1' ) ;
+
+ // <AREA> href
+ html = html.replace( FCKRegexLib.ProtectUrlsArea , '$& _fcksavedurl=$1' ) ;
+
+ return html ;
+ },
+
+ // Saves event attributes (like onclick) so they don't get executed while
+ // editing.
+ ProtectEvents : function( html )
+ {
+ return html.replace( FCKRegexLib.TagsWithEvent, _FCK_ProtectEvents_ReplaceTags ) ;
+ },
+
+ ProtectEventsRestore : function( html )
+ {
+ return html.replace( FCKRegexLib.ProtectedEvents, _FCK_ProtectEvents_RestoreEvents ) ;
+ },
+
+ ProtectTags : function( html )
+ {
+ var sTags = FCKConfig.ProtectedTags ;
+
+ // IE doesn't support <abbr> and it breaks it. Let's protect it.
+ if ( FCKBrowserInfo.IsIE )
+ sTags += sTags.length > 0 ? '|ABBR|XML|EMBED|OBJECT' : 'ABBR|XML|EMBED|OBJECT' ;
+
+ var oRegex ;
+ if ( sTags.length > 0 )
+ {
+ oRegex = new RegExp( '<(' + sTags + ')(?!\w|:)', 'gi' ) ;
+ html = html.replace( oRegex, '<FCK:$1' ) ;
+
+ oRegex = new RegExp( '<\/(' + sTags + ')>', 'gi' ) ;
+ html = html.replace( oRegex, '<\/FCK:$1>' ) ;
+ }
+
+ // Protect some empty elements. We must do it separately because the
+ // original tag may not contain the closing slash, like <hr>:
+ // - <meta> tags get executed, so if you have a redirect meta, the
+ // content will move to the target page.
+ // - <hr> may destroy the document structure if not well
+ // positioned. The trick is protect it here and restore them in
+ // the FCKDocumentProcessor.
+ sTags = 'META' ;
+ if ( FCKBrowserInfo.IsIE )
+ sTags += '|HR' ;
+
+ oRegex = new RegExp( '<((' + sTags + ')(?=\\s|>|/)[\\s\\S]*?)/?>', 'gi' ) ;
+ html = html.replace( oRegex, '<FCK:$1 />' ) ;
+
+ return html ;
+ },
+
+ SetData : function( data, resetIsDirty )
+ {
+ this.EditingArea.Mode = FCK.EditMode ;
+
+ // If there was an onSelectionChange listener in IE we must remove it to avoid crashes #1498
+ if ( FCKBrowserInfo.IsIE && FCK.EditorDocument )
+ {
+ FCK.EditorDocument.detachEvent("onselectionchange", Doc_OnSelectionChange ) ;
+ }
+
+ FCKTempBin.Reset();
+
+ if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
+ {
+ // Save the resetIsDirty for later use (async)
+ this._ForceResetIsDirty = ( resetIsDirty === true ) ;
+
+ // Protect parts of the code that must remain untouched (and invisible)
+ // during editing.
+ data = FCKConfig.ProtectedSource.Protect( data ) ;
+
+ // Call the Data Processor to transform the data.
+ data = FCK.DataProcessor.ConvertToHtml( data ) ;
+
+ // Fix for invalid self-closing tags (see #152).
+ data = data.replace( FCKRegexLib.InvalidSelfCloseTags, '$1></$2>' ) ;
+
+ // Protect event attributes (they could get fired in the editing area).
+ data = FCK.ProtectEvents( data ) ;
+
+ // Protect some things from the browser itself.
+ data = FCK.ProtectUrls( data ) ;
+ data = FCK.ProtectTags( data ) ;
+
+ // Insert the base tag (FCKConfig.BaseHref), if not exists in the source.
+ // The base must be the first tag in the HEAD, to get relative
+ // links on styles, for example.
+ if ( FCK.TempBaseTag.length > 0 && !FCKRegexLib.HasBaseTag.test( data ) )
+ data = data.replace( FCKRegexLib.HeadOpener, '$&' + FCK.TempBaseTag ) ;
+
+ // Build the HTML for the additional things we need on <head>.
+ var sHeadExtra = '' ;
+
+ if ( !FCKConfig.FullPage )
+ sHeadExtra += _FCK_GetEditorAreaStyleTags() ;
+
+ if ( FCKBrowserInfo.IsIE )
+ sHeadExtra += FCK._GetBehaviorsStyle() ;
+ else if ( FCKConfig.ShowBorders )
+ sHeadExtra += FCKTools.GetStyleHtml( FCK_ShowTableBordersCSS, true ) ;
+
+ sHeadExtra += FCKTools.GetStyleHtml( FCK_InternalCSS, true ) ;
+
+ // Attention: do not change it before testing it well (sample07)!
+ // This is tricky... if the head ends with <meta ... content type>,
+ // Firefox will break. But, it works if we place our extra stuff as
+ // the last elements in the HEAD.
+ data = data.replace( FCKRegexLib.HeadCloser, sHeadExtra + '$&' ) ;
+
+ // Load the HTML in the editing area.
+ this.EditingArea.OnLoad = _FCK_EditingArea_OnLoad ;
+ this.EditingArea.Start( data ) ;
+ }
+ else
+ {
+ // Remove the references to the following elements, as the editing area
+ // IFRAME will be removed.
+ FCK.EditorWindow = null ;
+ FCK.EditorDocument = null ;
+ FCKDomTools.PaddingNode = null ;
+
+ this.EditingArea.OnLoad = null ;
+ this.EditingArea.Start( data ) ;
+
+ // Enables the context menu in the textarea.
+ this.EditingArea.Textarea._FCKShowContextMenu = true ;
+
+ // Removes the enter key handler.
+ FCK.EnterKeyHandler = null ;
+
+ if ( resetIsDirty )
+ this.ResetIsDirty() ;
+
+ // Listen for keystroke events.
+ FCK.KeystrokeHandler.AttachToElement( this.EditingArea.Textarea ) ;
+
+ this.EditingArea.Textarea.focus() ;
+
+ FCK.Events.FireEvent( 'OnAfterSetHTML' ) ;
+ }
+
+ if ( FCKBrowserInfo.IsGecko )
+ window.onresize() ;
+ },
+
+ // This collection is used by the browser specific implementations to tell
+ // which named commands must be handled separately.
+ RedirectNamedCommands : new Object(),
+
+ ExecuteNamedCommand : function( commandName, commandParameter, noRedirect, noSaveUndo )
+ {
+ if ( !noSaveUndo )
+ FCKUndo.SaveUndoStep() ;
+
+ if ( !noRedirect && FCK.RedirectNamedCommands[ commandName ] != null )
+ FCK.ExecuteRedirectedNamedCommand( commandName, commandParameter ) ;
+ else
+ {
+ FCK.Focus() ;
+ FCK.EditorDocument.execCommand( commandName, false, commandParameter ) ;
+ FCK.Events.FireEvent( 'OnSelectionChange' ) ;
+ }
+
+ if ( !noSaveUndo )
+ FCKUndo.SaveUndoStep() ;
+ },
+
+ GetNamedCommandState : function( commandName )
+ {
+ try
+ {
+
+ // Bug #50 : Safari never returns positive state for the Paste command, override that.
+ if ( FCKBrowserInfo.IsSafari && FCK.EditorWindow && commandName.IEquals( 'Paste' ) )
+ return FCK_TRISTATE_OFF ;
+
+ if ( !FCK.EditorDocument.queryCommandEnabled( commandName ) )
+ return FCK_TRISTATE_DISABLED ;
+ else
+ {
+ return FCK.EditorDocument.queryCommandState( commandName ) ? FCK_TRISTATE_ON : FCK_TRISTATE_OFF ;
+ }
+ }
+ catch ( e )
+ {
+ return FCK_TRISTATE_OFF ;
+ }
+ },
+
+ GetNamedCommandValue : function( commandName )
+ {
+ var sValue = '' ;
+ var eState = FCK.GetNamedCommandState( commandName ) ;
+
+ if ( eState == FCK_TRISTATE_DISABLED )
+ return null ;
+
+ try
+ {
+ sValue = this.EditorDocument.queryCommandValue( commandName ) ;
+ }
+ catch(e) {}
+
+ return sValue ? sValue : '' ;
+ },
+
+ Paste : function( _callListenersOnly )
+ {
+ // First call 'OnPaste' listeners.
+ if ( FCK.Status != FCK_STATUS_COMPLETE || !FCK.Events.FireEvent( 'OnPaste' ) )
+ return false ;
+
+ // Then call the default implementation.
+ return _callListenersOnly || FCK._ExecPaste() ;
+ },
+
+ PasteFromWord : function()
+ {
+ FCKDialog.OpenDialog( 'FCKDialog_Paste', FCKLang.PasteFromWord, 'dialog/fck_paste.html', 400, 330, 'Word' ) ;
+ },
+
+ Preview : function()
+ {
+ var sHTML ;
+
+ if ( FCKConfig.FullPage )
+ {
+ if ( FCK.TempBaseTag.length > 0 )
+ sHTML = FCK.TempBaseTag + FCK.GetXHTML() ;
+ else
+ sHTML = FCK.GetXHTML() ;
+ }
+ else
+ {
+ sHTML =
+ FCKConfig.DocType +
+ '<html dir="' + FCKConfig.ContentLangDirection + '">' +
+ '<head>' +
+ FCK.TempBaseTag +
+ '<title>' + FCKLang.Preview + '</title>' +
+ _FCK_GetEditorAreaStyleTags() +
+ '</head><body' + FCKConfig.GetBodyAttributes() + '>' +
+ FCK.GetXHTML() +
+ '</body></html>' ;
+ }
+
+ var iWidth = FCKConfig.ScreenWidth * 0.8 ;
+ var iHeight = FCKConfig.ScreenHeight * 0.7 ;
+ var iLeft = ( FCKConfig.ScreenWidth - iWidth ) / 2 ;
+
+ var sOpenUrl = '' ;
+ if ( FCK_IS_CUSTOM_DOMAIN && FCKBrowserInfo.IsIE)
+ {
+ window._FCKHtmlToLoad = sHTML ;
+ sOpenUrl = 'javascript:void( (function(){' +
+ 'document.open() ;' +
+ 'document.domain="' + document.domain + '" ;' +
+ 'document.write( window.opener._FCKHtmlToLoad );' +
+ 'document.close() ;' +
+ 'window.opener._FCKHtmlToLoad = null ;' +
+ '})() )' ;
+ }
+
+ var oWindow = window.open( sOpenUrl, null, 'toolbar=yes,location=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width=' + iWidth + ',height=' + iHeight + ',left=' + iLeft ) ;
+
+ if ( !FCK_IS_CUSTOM_DOMAIN || !FCKBrowserInfo.IsIE)
+ {
+ oWindow.document.write( sHTML );
+ oWindow.document.close();
+ }
+
+ },
+
+ SwitchEditMode : function( noUndo )
+ {
+ var bIsWysiwyg = ( FCK.EditMode == FCK_EDITMODE_WYSIWYG ) ;
+
+ // Save the current IsDirty state, so we may restore it after the switch.
+ var bIsDirty = FCK.IsDirty() ;
+
+ var sHtml ;
+
+ // Update the HTML in the view output to show, also update
+ // FCKTempBin for IE to avoid #2263.
+ if ( bIsWysiwyg )
+ {
+ FCKCommands.GetCommand( 'ShowBlocks' ).SaveState() ;
+ if ( !noUndo && FCKBrowserInfo.IsIE )
+ FCKUndo.SaveUndoStep() ;
+
+ sHtml = FCK.GetXHTML( FCKConfig.FormatSource ) ;
+
+ if ( FCKBrowserInfo.IsIE )
+ FCKTempBin.ToHtml() ;
+
+ if ( sHtml == null )
+ return false ;
+ }
+ else
+ sHtml = this.EditingArea.Textarea.value ;
+
+ FCK.EditMode = bIsWysiwyg ? FCK_EDITMODE_SOURCE : FCK_EDITMODE_WYSIWYG ;
+
+ FCK.SetData( sHtml, !bIsDirty ) ;
+
+ // Set the Focus.
+ FCK.Focus() ;
+
+ // Update the toolbar (Running it directly causes IE to fail).
+ FCKTools.RunFunction( FCK.ToolbarSet.RefreshModeState, FCK.ToolbarSet ) ;
+
+ return true ;
+ },
+
+ InsertElement : function( element )
+ {
+ // The parameter may be a string (element name), so transform it in an element.
+ if ( typeof element == 'string' )
+ element = this.EditorDocument.createElement( element ) ;
+
+ var elementName = element.nodeName.toLowerCase() ;
+
+ FCKSelection.Restore() ;
+
+ // Create a range for the selection. V3 will have a new selection
+ // object that may internally supply this feature.
+ var range = new FCKDomRange( this.EditorWindow ) ;
+
+ // Move to the selection and delete it.
+ range.MoveToSelection() ;
+ range.DeleteContents() ;
+
+ if ( FCKListsLib.BlockElements[ elementName ] != null )
+ {
+ if ( range.StartBlock )
+ {
+ if ( range.CheckStartOfBlock() )
+ range.MoveToPosition( range.StartBlock, 3 ) ;
+ else if ( range.CheckEndOfBlock() )
+ range.MoveToPosition( range.StartBlock, 4 ) ;
+ else
+ range.SplitBlock() ;
+ }
+
+ range.InsertNode( element ) ;
+
+ var next = FCKDomTools.GetNextSourceElement( element, false, null, [ 'hr','br','param','img','area','input' ], true ) ;
+
+ // Be sure that we have something after the new element, so we can move the cursor there.
+ if ( !next && FCKConfig.EnterMode != 'br')
+ {
+ next = this.EditorDocument.body.appendChild( this.EditorDocument.createElement( FCKConfig.EnterMode ) ) ;
+
+ if ( FCKBrowserInfo.IsGeckoLike )
+ FCKTools.AppendBogusBr( next ) ;
+ }
+
+ if ( FCKListsLib.EmptyElements[ elementName ] == null )
+ range.MoveToElementEditStart( element ) ;
+ else if ( next )
+ range.MoveToElementEditStart( next ) ;
+ else
+ range.MoveToPosition( element, 4 ) ;
+
+ if ( FCKBrowserInfo.IsGeckoLike )
+ {
+ if ( next )
+ FCKDomTools.ScrollIntoView( next, false );
+ FCKDomTools.ScrollIntoView( element, false );
+ }
+ }
+ else
+ {
+ // Insert the node.
+ range.InsertNode( element ) ;
+
+ // Move the selection right after the new element.
+ // DISCUSSION: Should we select the element instead?
+ range.SetStart( element, 4 ) ;
+ range.SetEnd( element, 4 ) ;
+ }
+
+ range.Select() ;
+ range.Release() ;
+
+ // REMOVE IT: The focus should not really be set here. It is up to the
+ // calling code to reset the focus if needed.
+ this.Focus() ;
+
+ return element ;
+ },
+
+ _InsertBlockElement : function( blockElement )
+ {
+ },
+
+ _IsFunctionKey : function( keyCode )
+ {
+ // keys that are captured but do not change editor contents
+ if ( keyCode >= 16 && keyCode <= 20 )
+ // shift, ctrl, alt, pause, capslock
+ return true ;
+ if ( keyCode == 27 || ( keyCode >= 33 && keyCode <= 40 ) )
+ // esc, page up, page down, end, home, left, up, right, down
+ return true ;
+ if ( keyCode == 45 )
+ // insert, no effect on FCKeditor, yet
+ return true ;
+ return false ;
+ },
+
+ _KeyDownListener : function( evt )
+ {
+ if (! evt)
+ evt = FCK.EditorWindow.event ;
+ if ( FCK.EditorWindow )
+ {
+ if ( !FCK._IsFunctionKey(evt.keyCode) // do not capture function key presses, like arrow keys or shift/alt/ctrl
+ && !(evt.ctrlKey || evt.metaKey) // do not capture Ctrl hotkeys, as they have their snapshot capture logic
+ && !(evt.keyCode == 46) ) // do not capture Del, it has its own capture logic in fckenterkey.js
+ FCK._KeyDownUndo() ;
+ }
+ return true ;
+ },
+
+ _KeyDownUndo : function()
+ {
+ if ( !FCKUndo.Typing )
+ {
+ FCKUndo.SaveUndoStep() ;
+ FCKUndo.Typing = true ;
+ FCK.Events.FireEvent( "OnSelectionChange" ) ;
+ }
+
+ FCKUndo.TypesCount++ ;
+ FCKUndo.Changed = 1 ;
+
+ if ( FCKUndo.TypesCount > FCKUndo.MaxTypes )
+ {
+ FCKUndo.TypesCount = 0 ;
+ FCKUndo.SaveUndoStep() ;
+ }
+ },
+
+ _TabKeyHandler : function( evt )
+ {
+ if ( ! evt )
+ evt = window.event ;
+
+ var keystrokeValue = evt.keyCode ;
+
+ // Pressing <Tab> in source mode should produce a tab space in the text area, not
+ // changing the focus to something else.
+ if ( keystrokeValue == 9 && FCK.EditMode != FCK_EDITMODE_WYSIWYG )
+ {
+ if ( FCKBrowserInfo.IsIE )
+ {
+ var range = document.selection.createRange() ;
+ if ( range.parentElement() != FCK.EditingArea.Textarea )
+ return true ;
+ range.text = '\t' ;
+ range.select() ;
+ }
+ else
+ {
+ var a = [] ;
+ var el = FCK.EditingArea.Textarea ;
+ var selStart = el.selectionStart ;
+ var selEnd = el.selectionEnd ;
+ a.push( el.value.substr(0, selStart ) ) ;
+ a.push( '\t' ) ;
+ a.push( el.value.substr( selEnd ) ) ;
+ el.value = a.join( '' ) ;
+ el.setSelectionRange( selStart + 1, selStart + 1 ) ;
+ }
+
+ if ( evt.preventDefault )
+ return evt.preventDefault() ;
+
+ return evt.returnValue = false ;
+ }
+
+ return true ;
+ }
+} ;
+
+FCK.Events = new FCKEvents( FCK ) ;
+
+// DEPRECATED in favor or "GetData".
+FCK.GetHTML = FCK.GetXHTML = FCK.GetData ;
+
+// DEPRECATED in favor of "SetData".
+FCK.SetHTML = FCK.SetData ;
+
+// InsertElementAndGetIt and CreateElement are Deprecated : returns the same value as InsertElement.
+FCK.InsertElementAndGetIt = FCK.CreateElement = FCK.InsertElement ;
+
+// Replace all events attributes (like onclick).
+function _FCK_ProtectEvents_ReplaceTags( tagMatch )
+{
+ return tagMatch.replace( FCKRegexLib.EventAttributes, _FCK_ProtectEvents_ReplaceEvents ) ;
+}
+
+// Replace an event attribute with its respective __fckprotectedatt attribute.
+// The original event markup will be encoded and saved as the value of the new
+// attribute.
+function _FCK_ProtectEvents_ReplaceEvents( eventMatch, attName )
+{
+ return ' ' + attName + '_fckprotectedatt="' + encodeURIComponent( eventMatch ) + '"' ;
+}
+
+function _FCK_ProtectEvents_RestoreEvents( match, encodedOriginal )
+{
+ return decodeURIComponent( encodedOriginal ) ;
+}
+
+function _FCK_MouseEventsListener( evt )
+{
+ if ( ! evt )
+ evt = window.event ;
+ if ( evt.type == 'mousedown' )
+ FCK.MouseDownFlag = true ;
+ else if ( evt.type == 'mouseup' )
+ FCK.MouseDownFlag = false ;
+ else if ( evt.type == 'mousemove' )
+ FCK.Events.FireEvent( 'OnMouseMove', evt ) ;
+}
+
+function _FCK_PaddingNodeListener()
+{
+ if ( FCKConfig.EnterMode.IEquals( 'br' ) )
+ return ;
+ FCKDomTools.EnforcePaddingNode( FCK.EditorDocument, FCKConfig.EnterMode ) ;
+
+ if ( ! FCKBrowserInfo.IsIE && FCKDomTools.PaddingNode )
+ {
+ // Prevent the caret from going between the body and the padding node in Firefox.
+ // i.e. <body>|<p></p></body>
+ var sel = FCKSelection.GetSelection() ;
+ if ( sel && sel.rangeCount == 1 )
+ {
+ var range = sel.getRangeAt( 0 ) ;
+ if ( range.collapsed && range.startContainer == FCK.EditorDocument.body && range.startOffset == 0 )
+ {
+ range.selectNodeContents( FCKDomTools.PaddingNode ) ;
+ range.collapse( true ) ;
+ sel.removeAllRanges() ;
+ sel.addRange( range ) ;
+ }
+ }
+ }
+ else if ( FCKDomTools.PaddingNode )
+ {
+ // Prevent the caret from going into an empty body but not into the padding node in IE.
+ // i.e. <body><p></p>|</body>
+ var parentElement = FCKSelection.GetParentElement() ;
+ var paddingNode = FCKDomTools.PaddingNode ;
+ if ( parentElement && parentElement.nodeName.IEquals( 'body' ) )
+ {
+ if ( FCK.EditorDocument.body.childNodes.length == 1
+ && FCK.EditorDocument.body.firstChild == paddingNode )
+ {
+ /*
+ * Bug #1764: Don't move the selection if the
+ * current selection isn't in the editor
+ * document.
+ */
+ if ( FCKSelection._GetSelectionDocument( FCK.EditorDocument.selection ) != FCK.EditorDocument )
+ return ;
+
+ var range = FCK.EditorDocument.body.createTextRange() ;
+ var clearContents = false ;
+ if ( !paddingNode.childNodes.firstChild )
+ {
+ paddingNode.appendChild( FCKTools.GetElementDocument( paddingNode ).createTextNode( '\ufeff' ) ) ;
+ clearContents = true ;
+ }
+ range.moveToElementText( paddingNode ) ;
+ range.select() ;
+ if ( clearContents )
+ range.pasteHTML( '' ) ;
+ }
+ }
+ }
+}
+
+function _FCK_EditingArea_OnLoad()
+{
+ // Get the editor's window and document (DOM)
+ FCK.EditorWindow = FCK.EditingArea.Window ;
+ FCK.EditorDocument = FCK.EditingArea.Document ;
+
+ if ( FCKBrowserInfo.IsIE )
+ FCKTempBin.ToElements() ;
+
+ FCK.InitializeBehaviors() ;
+
+ // Listen for mousedown and mouseup events for tracking drag and drops.
+ FCK.MouseDownFlag = false ;
+ FCKTools.AddEventListener( FCK.EditorDocument, 'mousemove', _FCK_MouseEventsListener ) ;
+ FCKTools.AddEventListener( FCK.EditorDocument, 'mousedown', _FCK_MouseEventsListener ) ;
+ FCKTools.AddEventListener( FCK.EditorDocument, 'mouseup', _FCK_MouseEventsListener ) ;
+
+ // Most of the CTRL key combos do not work under Safari for onkeydown and onkeypress (See #1119)
+ // But we can use the keyup event to override some of these...
+ if ( FCKBrowserInfo.IsSafari )
+ {
+ var undoFunc = function( evt )
+ {
+ if ( ! ( evt.ctrlKey || evt.metaKey ) )
+ return ;
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
+ return ;
+ switch ( evt.keyCode )
+ {
+ case 89:
+ FCKUndo.Redo() ;
+ break ;
+ case 90:
+ FCKUndo.Undo() ;
+ break ;
+ }
+ }
+
+ FCKTools.AddEventListener( FCK.EditorDocument, 'keyup', undoFunc ) ;
+ }
+
+ // Create the enter key handler
+ FCK.EnterKeyHandler = new FCKEnterKey( FCK.EditorWindow, FCKConfig.EnterMode, FCKConfig.ShiftEnterMode, FCKConfig.TabSpaces ) ;
+
+ // Listen for keystroke events.
+ FCK.KeystrokeHandler.AttachToElement( FCK.EditorDocument ) ;
+
+ if ( FCK._ForceResetIsDirty )
+ FCK.ResetIsDirty() ;
+
+ // This is a tricky thing for IE. In some cases, even if the cursor is
+ // blinking in the editing, the keystroke handler doesn't catch keyboard
+ // events. We must activate the editing area to make it work. (#142).
+ if ( FCKBrowserInfo.IsIE && FCK.HasFocus )
+ FCK.EditorDocument.body.setActive() ;
+
+ FCK.OnAfterSetHTML() ;
+
+ // Restore show blocks status.
+ FCKCommands.GetCommand( 'ShowBlocks' ).RestoreState() ;
+
+ // Check if it is not a startup call, otherwise complete the startup.
+ if ( FCK.Status != FCK_STATUS_NOTLOADED )
+ return ;
+
+ FCK.SetStatus( FCK_STATUS_ACTIVE ) ;
+}
+
+function _FCK_GetEditorAreaStyleTags()
+{
+ return FCKTools.GetStyleHtml( FCKConfig.EditorAreaCSS ) +
+ FCKTools.GetStyleHtml( FCKConfig.EditorAreaStyles ) ;
+}
+
+function _FCK_KeystrokeHandler_OnKeystroke( keystroke, keystrokeValue )
+{
+ if ( FCK.Status != FCK_STATUS_COMPLETE )
+ return false ;
+
+ if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
+ {
+ switch ( keystrokeValue )
+ {
+ case 'Paste' :
+ return !FCK.Paste() ;
+
+ case 'Cut' :
+ FCKUndo.SaveUndoStep() ;
+ return false ;
+ }
+ }
+ else
+ {
+ // In source mode, some actions must have their default behavior.
+ if ( keystrokeValue.Equals( 'Paste', 'Undo', 'Redo', 'SelectAll', 'Cut' ) )
+ return false ;
+ }
+
+ // The return value indicates if the default behavior of the keystroke must
+ // be cancelled. Let's do that only if the Execute() call explicitly returns "false".
+ var oCommand = FCK.Commands.GetCommand( keystrokeValue ) ;
+
+ // If the command is disabled then ignore the keystroke
+ if ( oCommand.GetState() == FCK_TRISTATE_DISABLED )
+ return false ;
+
+ return ( oCommand.Execute.apply( oCommand, FCKTools.ArgumentsToArray( arguments, 2 ) ) !== false ) ;
+}
+
+// Set the FCK.LinkedField reference to the field that will be used to post the
+// editor data.
+(function()
+{
+ // There is a bug on IE... getElementById returns any META tag that has the
+ // name set to the ID you are looking for. So the best way in to get the array
+ // by names and look for the correct one.
+ // As ASP.Net generates a ID that is different from the Name, we must also
+ // look for the field based on the ID (the first one is the ID).
+
+ var oDocument = window.parent.document ;
+
+ // Try to get the field using the ID.
+ var eLinkedField = oDocument.getElementById( FCK.Name ) ;
+
+ var i = 0;
+ while ( eLinkedField || i == 0 )
+ {
+ if ( eLinkedField && eLinkedField.tagName.toLowerCase().Equals( 'input', 'textarea' ) )
+ {
+ FCK.LinkedField = eLinkedField ;
+ break ;
+ }
+
+ eLinkedField = oDocument.getElementsByName( FCK.Name )[i++] ;
+ }
+})() ;
+
+var FCKTempBin =
+{
+ Elements : new Array(),
+
+ AddElement : function( element )
+ {
+ var iIndex = this.Elements.length ;
+ this.Elements[ iIndex ] = element ;
+ return iIndex ;
+ },
+
+ RemoveElement : function( index )
+ {
+ var e = this.Elements[ index ] ;
+ this.Elements[ index ] = null ;
+ return e ;
+ },
+
+ Reset : function()
+ {
+ var i = 0 ;
+ while ( i < this.Elements.length )
+ this.Elements[ i++ ] = null ;
+ this.Elements.length = 0 ;
+ },
+
+ ToHtml : function()
+ {
+ for ( var i = 0 ; i < this.Elements.length ; i++ )
+ {
+ this.Elements[i] = '<div> ' + this.Elements[i].outerHTML + '</div>' ;
+ this.Elements[i].isHtml = true ;
+ }
+ },
+
+ ToElements : function()
+ {
+ var node = FCK.EditorDocument.createElement( 'div' ) ;
+ for ( var i = 0 ; i < this.Elements.length ; i++ )
+ {
+ if ( this.Elements[i].isHtml )
+ {
+ node.innerHTML = this.Elements[i] ;
+ this.Elements[i] = node.firstChild.removeChild( node.firstChild.lastChild ) ;
+ }
+ }
+ }
+} ;
+
+
+
+// # Focus Manager: Manages the focus in the editor.
+var FCKFocusManager = FCK.FocusManager =
+{
+ IsLocked : false,
+
+ AddWindow : function( win, sendToEditingArea )
+ {
+ var oTarget ;
+
+ if ( FCKBrowserInfo.IsIE )
+ oTarget = win.nodeType == 1 ? win : win.frameElement ? win.frameElement : win.document ;
+ else if ( FCKBrowserInfo.IsSafari )
+ oTarget = win ;
+ else
+ oTarget = win.document ;
+
+ FCKTools.AddEventListener( oTarget, 'blur', FCKFocusManager_Win_OnBlur ) ;
+ FCKTools.AddEventListener( oTarget, 'focus', sendToEditingArea ? FCKFocusManager_Win_OnFocus_Area : FCKFocusManager_Win_OnFocus ) ;
+ },
+
+ RemoveWindow : function( win )
+ {
+ if ( FCKBrowserInfo.IsIE )
+ oTarget = win.nodeType == 1 ? win : win.frameElement ? win.frameElement : win.document ;
+ else
+ oTarget = win.document ;
+
+ FCKTools.RemoveEventListener( oTarget, 'blur', FCKFocusManager_Win_OnBlur ) ;
+ FCKTools.RemoveEventListener( oTarget, 'focus', FCKFocusManager_Win_OnFocus_Area ) ;
+ FCKTools.RemoveEventListener( oTarget, 'focus', FCKFocusManager_Win_OnFocus ) ;
+ },
+
+ Lock : function()
+ {
+ this.IsLocked = true ;
+ },
+
+ Unlock : function()
+ {
+ if ( this._HasPendingBlur )
+ FCKFocusManager._Timer = window.setTimeout( FCKFocusManager_FireOnBlur, 100 ) ;
+
+ this.IsLocked = false ;
+ },
+
+ _ResetTimer : function()
+ {
+ this._HasPendingBlur = false ;
+
+ if ( this._Timer )
+ {
+ window.clearTimeout( this._Timer ) ;
+ delete this._Timer ;
+ }
+ }
+} ;
+
+function FCKFocusManager_Win_OnBlur()
+{
+ if ( typeof(FCK) != 'undefined' && FCK.HasFocus )
+ {
+ FCKFocusManager._ResetTimer() ;
+ FCKFocusManager._Timer = window.setTimeout( FCKFocusManager_FireOnBlur, 100 ) ;
+ }
+}
+
+function FCKFocusManager_FireOnBlur()
+{
+ if ( FCKFocusManager.IsLocked )
+ FCKFocusManager._HasPendingBlur = true ;
+ else
+ {
+ FCK.HasFocus = false ;
+ FCK.Events.FireEvent( "OnBlur" ) ;
+ }
+}
+
+function FCKFocusManager_Win_OnFocus_Area()
+{
+ // Check if we are already focusing the editor (to avoid loops).
+ if ( FCKFocusManager._IsFocusing )
+ return ;
+
+ FCKFocusManager._IsFocusing = true ;
+
+ FCK.Focus() ;
+ FCKFocusManager_Win_OnFocus() ;
+
+ // The above FCK.Focus() call may trigger other focus related functions.
+ // So, to avoid a loop, we delay the focusing mark removal, so it get
+ // executed after all othre functions have been run.
+ FCKTools.RunFunction( function()
+ {
+ delete FCKFocusManager._IsFocusing ;
+ } ) ;
+}
+
+function FCKFocusManager_Win_OnFocus()
+{
+ FCKFocusManager._ResetTimer() ;
+
+ if ( !FCK.HasFocus && !FCKFocusManager.IsLocked )
+ {
+ FCK.HasFocus = true ;
+ FCK.Events.FireEvent( "OnFocus" ) ;
+ }
+}
+
+/*
+ * #1633 : Protect the editor iframe from external styles.
+ * Notice that we can't use FCKTools.ResetStyles here since FCKTools isn't
+ * loaded yet.
+ */
+(function()
+{
+ var el = window.frameElement ;
+ var width = el.width ;
+ var height = el.height ;
+ if ( /^\d+$/.test( width ) ) width += 'px' ;
+ if ( /^\d+$/.test( height ) ) height += 'px' ;
+ var style = el.style ;
+ style.border = style.padding = style.margin = 0 ;
+ style.backgroundColor = 'transparent';
+ style.backgroundImage = 'none';
+ style.width = width ;
+ style.height = height ;
+})() ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fck_contextmenu.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fck_contextmenu.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,342 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Defines the FCK.ContextMenu object that is responsible for all
+ * Context Menu operations in the editing area.
+ */
+
+FCK.ContextMenu = new Object() ;
+FCK.ContextMenu.Listeners = new Array() ;
+
+FCK.ContextMenu.RegisterListener = function( listener )
+{
+ if ( listener )
+ this.Listeners.push( listener ) ;
+}
+
+function FCK_ContextMenu_Init()
+{
+ var oInnerContextMenu = FCK.ContextMenu._InnerContextMenu = new FCKContextMenu( FCKBrowserInfo.IsIE ? window : window.parent, FCKLang.Dir ) ;
+ oInnerContextMenu.CtrlDisable = FCKConfig.BrowserContextMenuOnCtrl ;
+ oInnerContextMenu.OnBeforeOpen = FCK_ContextMenu_OnBeforeOpen ;
+ oInnerContextMenu.OnItemClick = FCK_ContextMenu_OnItemClick ;
+
+ // Get the registering function.
+ var oMenu = FCK.ContextMenu ;
+
+ // Register all configured context menu listeners.
+ for ( var i = 0 ; i < FCKConfig.ContextMenu.length ; i++ )
+ oMenu.RegisterListener( FCK_ContextMenu_GetListener( FCKConfig.ContextMenu[i] ) ) ;
+}
+
+function FCK_ContextMenu_GetListener( listenerName )
+{
+ switch ( listenerName )
+ {
+ case 'Generic' :
+ return {
+ AddItems : function( menu, tag, tagName )
+ {
+ 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( 'Paste' , FCKLang.Paste , 9, FCKCommands.GetCommand( 'Paste' ).GetState() == FCK_TRISTATE_DISABLED ) ;
+ }} ;
+
+ case 'Table' :
+ return {
+ AddItems : function( menu, tag, tagName )
+ {
+ var bIsTable = ( tagName == 'TABLE' ) ;
+ var bIsCell = ( !bIsTable && FCKSelection.HasAncestorNode( 'TABLE' ) ) ;
+
+ if ( bIsCell )
+ {
+ menu.AddSeparator() ;
+ var oItem = menu.AddItem( 'Cell' , FCKLang.CellCM ) ;
+ oItem.AddItem( 'TableInsertCellBefore' , FCKLang.InsertCellBefore, 69 ) ;
+ oItem.AddItem( 'TableInsertCellAfter' , FCKLang.InsertCellAfter, 58 ) ;
+ oItem.AddItem( 'TableDeleteCells' , FCKLang.DeleteCells, 59 ) ;
+ if ( FCKBrowserInfo.IsGecko )
+ oItem.AddItem( 'TableMergeCells' , FCKLang.MergeCells, 60,
+ FCKCommands.GetCommand( 'TableMergeCells' ).GetState() == FCK_TRISTATE_DISABLED ) ;
+ else
+ {
+ oItem.AddItem( 'TableMergeRight' , FCKLang.MergeRight, 60,
+ FCKCommands.GetCommand( 'TableMergeRight' ).GetState() == FCK_TRISTATE_DISABLED ) ;
+ oItem.AddItem( 'TableMergeDown' , FCKLang.MergeDown, 60,
+ FCKCommands.GetCommand( 'TableMergeDown' ).GetState() == FCK_TRISTATE_DISABLED ) ;
+ }
+ oItem.AddItem( 'TableHorizontalSplitCell' , FCKLang.HorizontalSplitCell, 61,
+ FCKCommands.GetCommand( 'TableHorizontalSplitCell' ).GetState() == FCK_TRISTATE_DISABLED ) ;
+ oItem.AddItem( 'TableVerticalSplitCell' , FCKLang.VerticalSplitCell, 61,
+ FCKCommands.GetCommand( 'TableVerticalSplitCell' ).GetState() == FCK_TRISTATE_DISABLED ) ;
+ oItem.AddSeparator() ;
+ oItem.AddItem( 'TableCellProp' , FCKLang.CellProperties, 57,
+ FCKCommands.GetCommand( 'TableCellProp' ).GetState() == FCK_TRISTATE_DISABLED ) ;
+
+ menu.AddSeparator() ;
+ oItem = menu.AddItem( 'Row' , FCKLang.RowCM ) ;
+ oItem.AddItem( 'TableInsertRowBefore' , FCKLang.InsertRowBefore, 70 ) ;
+ oItem.AddItem( 'TableInsertRowAfter' , FCKLang.InsertRowAfter, 62 ) ;
+ oItem.AddItem( 'TableDeleteRows' , FCKLang.DeleteRows, 63 ) ;
+
+ menu.AddSeparator() ;
+ oItem = menu.AddItem( 'Column' , FCKLang.ColumnCM ) ;
+ oItem.AddItem( 'TableInsertColumnBefore', FCKLang.InsertColumnBefore, 71 ) ;
+ oItem.AddItem( 'TableInsertColumnAfter' , FCKLang.InsertColumnAfter, 64 ) ;
+ oItem.AddItem( 'TableDeleteColumns' , FCKLang.DeleteColumns, 65 ) ;
+ }
+
+ if ( bIsTable || bIsCell )
+ {
+ menu.AddSeparator() ;
+ menu.AddItem( 'TableDelete' , FCKLang.TableDelete ) ;
+ menu.AddItem( 'TableProp' , FCKLang.TableProperties, 39 ) ;
+ }
+ }} ;
+
+ case 'Link' :
+ return {
+ AddItems : function( menu, tag, tagName )
+ {
+ var bInsideLink = ( tagName == 'A' || FCKSelection.HasAncestorNode( 'A' ) ) ;
+
+ if ( bInsideLink || FCK.GetNamedCommandState( 'Unlink' ) != FCK_TRISTATE_DISABLED )
+ {
+ // Go up to the anchor to test its properties
+ var oLink = FCKSelection.MoveToAncestorNode( 'A' ) ;
+ 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 ( bIsAnchor )
+ return ;
+
+ menu.AddSeparator() ;
+ menu.AddItem( 'VisitLink', FCKLang.VisitLink ) ;
+ menu.AddSeparator() ;
+ if ( bInsideLink )
+ menu.AddItem( 'Link', FCKLang.EditLink , 34 ) ;
+ menu.AddItem( 'Unlink' , FCKLang.RemoveLink , 35 ) ;
+ }
+ }} ;
+
+ case 'Image' :
+ return {
+ AddItems : function( menu, tag, tagName )
+ {
+ if ( tagName == 'IMG' && !tag.getAttribute( '_fckfakelement' ) )
+ {
+ menu.AddSeparator() ;
+ menu.AddItem( 'Image', FCKLang.ImageProperties, 37 ) ;
+ }
+ }} ;
+
+ case 'Anchor' :
+ return {
+ AddItems : function( menu, tag, tagName )
+ {
+ // Go up to the anchor to test its properties
+ var oLink = FCKSelection.MoveToAncestorNode( 'A' ) ;
+ var bIsAnchor = ( oLink && oLink.name.length > 0 ) ;
+
+ if ( bIsAnchor || ( tagName == 'IMG' && tag.getAttribute( '_fckanchor' ) ) )
+ {
+ menu.AddSeparator() ;
+ menu.AddItem( 'Anchor', FCKLang.AnchorProp, 36 ) ;
+ menu.AddItem( 'AnchorDelete', FCKLang.AnchorDelete ) ;
+ }
+ }} ;
+
+ case 'Flash' :
+ return {
+ AddItems : function( menu, tag, tagName )
+ {
+ if ( tagName == 'IMG' && tag.getAttribute( '_fckflash' ) )
+ {
+ menu.AddSeparator() ;
+ menu.AddItem( 'Flash', FCKLang.FlashProperties, 38 ) ;
+ }
+ }} ;
+
+ case 'Form' :
+ return {
+ AddItems : function( menu, tag, tagName )
+ {
+ if ( FCKSelection.HasAncestorNode('FORM') )
+ {
+ menu.AddSeparator() ;
+ menu.AddItem( 'Form', FCKLang.FormProp, 48 ) ;
+ }
+ }} ;
+
+ case 'Checkbox' :
+ return {
+ AddItems : function( menu, tag, tagName )
+ {
+ if ( tagName == 'INPUT' && tag.type == 'checkbox' )
+ {
+ menu.AddSeparator() ;
+ menu.AddItem( 'Checkbox', FCKLang.CheckboxProp, 49 ) ;
+ }
+ }} ;
+
+ case 'Radio' :
+ return {
+ AddItems : function( menu, tag, tagName )
+ {
+ if ( tagName == 'INPUT' && tag.type == 'radio' )
+ {
+ menu.AddSeparator() ;
+ menu.AddItem( 'Radio', FCKLang.RadioButtonProp, 50 ) ;
+ }
+ }} ;
+
+ case 'TextField' :
+ return {
+ AddItems : function( menu, tag, tagName )
+ {
+ if ( tagName == 'INPUT' && ( tag.type == 'text' || tag.type == 'password' ) )
+ {
+ menu.AddSeparator() ;
+ menu.AddItem( 'TextField', FCKLang.TextFieldProp, 51 ) ;
+ }
+ }} ;
+
+ case 'HiddenField' :
+ return {
+ AddItems : function( menu, tag, tagName )
+ {
+ if ( tagName == 'IMG' && tag.getAttribute( '_fckinputhidden' ) )
+ {
+ menu.AddSeparator() ;
+ menu.AddItem( 'HiddenField', FCKLang.HiddenFieldProp, 56 ) ;
+ }
+ }} ;
+
+ case 'ImageButton' :
+ return {
+ AddItems : function( menu, tag, tagName )
+ {
+ if ( tagName == 'INPUT' && tag.type == 'image' )
+ {
+ menu.AddSeparator() ;
+ menu.AddItem( 'ImageButton', FCKLang.ImageButtonProp, 55 ) ;
+ }
+ }} ;
+
+ case 'Button' :
+ return {
+ AddItems : function( menu, tag, tagName )
+ {
+ if ( tagName == 'INPUT' && ( tag.type == 'button' || tag.type == 'submit' || tag.type == 'reset' ) )
+ {
+ menu.AddSeparator() ;
+ menu.AddItem( 'Button', FCKLang.ButtonProp, 54 ) ;
+ }
+ }} ;
+
+ case 'Select' :
+ return {
+ AddItems : function( menu, tag, tagName )
+ {
+ if ( tagName == 'SELECT' )
+ {
+ menu.AddSeparator() ;
+ menu.AddItem( 'Select', FCKLang.SelectionFieldProp, 53 ) ;
+ }
+ }} ;
+
+ case 'Textarea' :
+ return {
+ AddItems : function( menu, tag, tagName )
+ {
+ if ( tagName == 'TEXTAREA' )
+ {
+ menu.AddSeparator() ;
+ menu.AddItem( 'Textarea', FCKLang.TextareaProp, 52 ) ;
+ }
+ }} ;
+
+ case 'BulletedList' :
+ return {
+ AddItems : function( menu, tag, tagName )
+ {
+ if ( FCKSelection.HasAncestorNode('UL') )
+ {
+ menu.AddSeparator() ;
+ menu.AddItem( 'BulletedList', FCKLang.BulletedListProp, 27 ) ;
+ }
+ }} ;
+
+ case 'NumberedList' :
+ return {
+ AddItems : function( menu, tag, tagName )
+ {
+ if ( FCKSelection.HasAncestorNode('OL') )
+ {
+ menu.AddSeparator() ;
+ menu.AddItem( 'NumberedList', FCKLang.NumberedListProp, 26 ) ;
+ }
+ }} ;
+
+ case 'DivContainer':
+ return {
+ AddItems : function( menu, tag, tagName )
+ {
+ var currentBlocks = FCKDomTools.GetSelectedDivContainers() ;
+
+ if ( currentBlocks.length > 0 )
+ {
+ menu.AddSeparator() ;
+ menu.AddItem( 'EditDiv', FCKLang.EditDiv, 75 ) ;
+ menu.AddItem( 'DeleteDiv', FCKLang.DeleteDiv, 76 ) ;
+ }
+ }} ;
+
+ }
+ return null ;
+}
+
+function FCK_ContextMenu_OnBeforeOpen()
+{
+ // Update the UI.
+ FCK.Events.FireEvent( 'OnSelectionChange' ) ;
+
+ // Get the actual selected tag (if any).
+ var oTag, sTagName ;
+
+ // 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 ) ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fck_gecko.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fck_gecko.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,493 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Creation and initialization of the "FCK" object. This is the main
+ * object that represents an editor instance.
+ * (Gecko specific implementations)
+ */
+
+FCK.Description = "FCKeditor for Gecko Browsers" ;
+
+FCK.InitializeBehaviors = function()
+{
+ // When calling "SetData", the editing area IFRAME gets a fixed height. So we must recalculate it.
+ if ( window.onresize ) // Not for Safari/Opera.
+ window.onresize() ;
+
+ FCKFocusManager.AddWindow( this.EditorWindow ) ;
+
+ this.ExecOnSelectionChange = function()
+ {
+ FCK.Events.FireEvent( "OnSelectionChange" ) ;
+ }
+
+ this._ExecDrop = function( evt )
+ {
+ if ( FCK.MouseDownFlag )
+ {
+ FCK.MouseDownFlag = false ;
+ return ;
+ }
+
+ if ( FCKConfig.ForcePasteAsPlainText )
+ {
+ if ( evt.dataTransfer )
+ {
+ var text = evt.dataTransfer.getData( 'Text' ) ;
+ text = FCKTools.HTMLEncode( text ) ;
+ text = FCKTools.ProcessLineBreaks( window, FCKConfig, text ) ;
+ FCK.InsertHtml( text ) ;
+ }
+ else if ( FCKConfig.ShowDropDialog )
+ FCK.PasteAsPlainText() ;
+
+ evt.preventDefault() ;
+ evt.stopPropagation() ;
+ }
+ }
+
+ this._ExecCheckCaret = function( evt )
+ {
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG )
+ return ;
+
+ if ( evt.type == 'keypress' )
+ {
+ var keyCode = evt.keyCode ;
+ // 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
+ // when the caret moved left or up from another block element below.
+ if ( keyCode < 33 || keyCode > 40 )
+ return ;
+ }
+
+ var blockEmptyStop = function( node )
+ {
+ if ( node.nodeType != 1 )
+ return false ;
+ var tag = node.tagName.toLowerCase() ;
+ return ( FCKListsLib.BlockElements[tag] || FCKListsLib.EmptyElements[tag] ) ;
+ }
+
+ var moveCursor = function()
+ {
+ var selection = FCKSelection.GetSelection() ;
+ var range = selection.getRangeAt(0) ;
+ if ( ! range || ! range.collapsed )
+ return ;
+
+ var node = range.endContainer ;
+
+ // only perform the patched behavior if we're at the end of a text node.
+ if ( node.nodeType != 3 )
+ return ;
+
+ if ( node.nodeValue.length != range.endOffset )
+ return ;
+
+ // only perform the patched behavior if we're in an <a> tag, or the End key is pressed.
+ var parentTag = node.parentNode.tagName.toLowerCase() ;
+ if ( ! ( parentTag == 'a' || ( !FCKBrowserInfo.IsOpera && String(node.parentNode.contentEditable) == 'false' ) ||
+ ( ! ( FCKListsLib.BlockElements[parentTag] || FCKListsLib.NonEmptyBlockElements[parentTag] )
+ && keyCode == 35 ) ) )
+ return ;
+
+ // 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.
+ // - 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.
+ var nextTextNode = FCKTools.GetNextTextNode( node, node.parentNode, blockEmptyStop ) ;
+ if ( nextTextNode )
+ return ;
+
+ // we're pretty sure we need to move the caret forcefully from here.
+ range = FCK.EditorDocument.createRange() ;
+
+ nextTextNode = FCKTools.GetNextTextNode( node, node.parentNode.parentNode, blockEmptyStop ) ;
+ if ( nextTextNode )
+ {
+ // 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
+ // wouldn't be able to go back.
+ if ( FCKBrowserInfo.IsOpera && keyCode == 37 )
+ return ;
+
+ // 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.
+ // our new parent might be our current parent's siblings if we are lucky.
+ range.setStart( nextTextNode, 0 ) ;
+ range.setEnd( nextTextNode, 0 ) ;
+ }
+ else
+ {
+ // no suitable next siblings under our grandparent! what to do next?
+ while ( node.parentNode
+ && node.parentNode != FCK.EditorDocument.body
+ && node.parentNode != FCK.EditorDocument.documentElement
+ && node == node.parentNode.lastChild
+ && ( ! FCKListsLib.BlockElements[node.parentNode.tagName.toLowerCase()]
+ && ! FCKListsLib.NonEmptyBlockElements[node.parentNode.tagName.toLowerCase()] ) )
+ node = node.parentNode ;
+
+
+ if ( FCKListsLib.BlockElements[ parentTag ]
+ || FCKListsLib.EmptyElements[ parentTag ]
+ || node == FCK.EditorDocument.body )
+ {
+ // if our parent is a block node, move to the end of our parent.
+ range.setStart( node, node.childNodes.length ) ;
+ range.setEnd( node, node.childNodes.length ) ;
+ }
+ else
+ {
+ // 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...
+ var stopNode = node.nextSibling ;
+
+ // find out the next block/empty element at our grandparent, we'll
+ // move the caret just before it.
+ while ( stopNode )
+ {
+ if ( stopNode.nodeType != 1 )
+ {
+ stopNode = stopNode.nextSibling ;
+ continue ;
+ }
+
+ var stopTag = stopNode.tagName.toLowerCase() ;
+ if ( FCKListsLib.BlockElements[stopTag] || FCKListsLib.EmptyElements[stopTag]
+ || FCKListsLib.NonEmptyBlockElements[stopTag] )
+ break ;
+ stopNode = stopNode.nextSibling ;
+ }
+
+ // note that the dummy marker below is NEEDED, otherwise the caret's behavior will
+ // be broken in Gecko.
+ var marker = FCK.EditorDocument.createTextNode( '' ) ;
+ if ( stopNode )
+ node.parentNode.insertBefore( marker, stopNode ) ;
+ else
+ node.parentNode.appendChild( marker ) ;
+ range.setStart( marker, 0 ) ;
+ range.setEnd( marker, 0 ) ;
+ }
+ }
+
+ selection.removeAllRanges() ;
+ selection.addRange( range ) ;
+ FCK.Events.FireEvent( "OnSelectionChange" ) ;
+ }
+
+ setTimeout( moveCursor, 1 ) ;
+ }
+
+ this.ExecOnSelectionChangeTimer = function()
+ {
+ if ( FCK.LastOnChangeTimer )
+ window.clearTimeout( FCK.LastOnChangeTimer ) ;
+
+ FCK.LastOnChangeTimer = window.setTimeout( FCK.ExecOnSelectionChange, 100 ) ;
+ }
+
+ this.EditorDocument.addEventListener( 'mouseup', this.ExecOnSelectionChange, false ) ;
+
+ // 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.
+ this.EditorDocument.addEventListener( 'keyup', this.ExecOnSelectionChangeTimer, false ) ;
+
+ this._DblClickListener = function( e )
+ {
+ FCK.OnDoubleClick( e.target ) ;
+ e.stopPropagation() ;
+ }
+ this.EditorDocument.addEventListener( 'dblclick', this._DblClickListener, true ) ;
+
+ // Record changes for the undo system when there are key down events.
+ this.EditorDocument.addEventListener( 'keydown', this._KeyDownListener, false ) ;
+
+ // Hooks for data object drops
+ if ( FCKBrowserInfo.IsGecko )
+ {
+ this.EditorWindow.addEventListener( 'dragdrop', this._ExecDrop, true ) ;
+ }
+ else if ( FCKBrowserInfo.IsSafari )
+ {
+ var cancelHandler = function( evt ){ if ( ! FCK.MouseDownFlag ) evt.returnValue = false ; }
+ this.EditorDocument.addEventListener( 'dragenter', cancelHandler, true ) ;
+ this.EditorDocument.addEventListener( 'dragover', cancelHandler, true ) ;
+ this.EditorDocument.addEventListener( 'drop', this._ExecDrop, true ) ;
+ this.EditorDocument.addEventListener( 'mousedown',
+ function( ev )
+ {
+ var element = ev.srcElement ;
+
+ if ( element.nodeName.IEquals( 'IMG', 'HR', 'INPUT', 'TEXTAREA', 'SELECT' ) )
+ {
+ FCKSelection.SelectNode( element ) ;
+ }
+ }, true ) ;
+
+ this.EditorDocument.addEventListener( 'mouseup',
+ function( ev )
+ {
+ if ( ev.srcElement.nodeName.IEquals( 'INPUT', 'TEXTAREA', 'SELECT' ) )
+ ev.preventDefault()
+ }, true ) ;
+
+ this.EditorDocument.addEventListener( 'click',
+ function( ev )
+ {
+ if ( ev.srcElement.nodeName.IEquals( 'INPUT', 'TEXTAREA', 'SELECT' ) )
+ ev.preventDefault()
+ }, true ) ;
+ }
+
+ // Kludge for buggy Gecko caret positioning logic (Bug #393 and #1056)
+ if ( FCKBrowserInfo.IsGecko || FCKBrowserInfo.IsOpera )
+ {
+ this.EditorDocument.addEventListener( 'keypress', this._ExecCheckCaret, false ) ;
+ this.EditorDocument.addEventListener( 'click', this._ExecCheckCaret, false ) ;
+ }
+
+ // Reset the context menu.
+ FCK.ContextMenu._InnerContextMenu.SetMouseClickWindow( FCK.EditorWindow ) ;
+ FCK.ContextMenu._InnerContextMenu.AttachToElement( FCK.EditorDocument ) ;
+}
+
+FCK.MakeEditable = function()
+{
+ this.EditingArea.MakeEditable() ;
+}
+
+// Disable the context menu in the editor (outside the editing area).
+function Document_OnContextMenu( e )
+{
+ if ( !e.target._FCKShowContextMenu )
+ e.preventDefault() ;
+}
+document.oncontextmenu = Document_OnContextMenu ;
+
+// GetNamedCommandState overload for Gecko.
+FCK._BaseGetNamedCommandState = FCK.GetNamedCommandState ;
+FCK.GetNamedCommandState = function( commandName )
+{
+ switch ( commandName )
+ {
+ case 'Unlink' :
+ return FCKSelection.HasAncestorNode('A') ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
+ default :
+ return FCK._BaseGetNamedCommandState( commandName ) ;
+ }
+}
+
+// Named commands to be handled by this browsers specific implementation.
+FCK.RedirectNamedCommands =
+{
+ Print : true,
+ Paste : true
+} ;
+
+// ExecuteNamedCommand overload for Gecko.
+FCK.ExecuteRedirectedNamedCommand = function( commandName, commandParameter )
+{
+ switch ( commandName )
+ {
+ case 'Print' :
+ FCK.EditorWindow.print() ;
+ break ;
+ case 'Paste' :
+ try
+ {
+ // Force the paste dialog for Safari (#50).
+ if ( FCKBrowserInfo.IsSafari )
+ throw '' ;
+
+ if ( FCK.Paste() )
+ FCK.ExecuteNamedCommand( 'Paste', null, true ) ;
+ }
+ catch (e) { FCKDialog.OpenDialog( 'FCKDialog_Paste', FCKLang.Paste, 'dialog/fck_paste.html', 400, 330, 'Security' ) ; }
+ break ;
+ default :
+ FCK.ExecuteNamedCommand( commandName, commandParameter ) ;
+ }
+}
+
+FCK._ExecPaste = function()
+{
+ // Save a snapshot for undo before actually paste the text
+ FCKUndo.SaveUndoStep() ;
+
+ if ( FCKConfig.ForcePasteAsPlainText )
+ {
+ FCK.PasteAsPlainText() ;
+ return false ;
+ }
+
+ /* For now, the AutoDetectPasteFromWord feature is IE only. */
+ return true ;
+}
+
+//**
+// FCK.InsertHtml: Inserts HTML at the current cursor location. Deletes the
+// selected content if any.
+FCK.InsertHtml = function( html )
+{
+ var doc = FCK.EditorDocument,
+ range;
+
+ html = FCKConfig.ProtectedSource.Protect( html ) ;
+ html = FCK.ProtectEvents( html ) ;
+ html = FCK.ProtectUrls( html ) ;
+ html = FCK.ProtectTags( html ) ;
+
+ // Save an undo snapshot first.
+ FCKUndo.SaveUndoStep() ;
+
+ if ( FCKBrowserInfo.IsGecko )
+ {
+ html = html.replace( / $/, '$&<span _fcktemp="1"/>' ) ;
+
+ var docFrag = new FCKDocumentFragment( this.EditorDocument ) ;
+ docFrag.AppendHtml( html ) ;
+
+ var lastNode = docFrag.RootNode.lastChild ;
+
+ range = new FCKDomRange( this.EditorWindow ) ;
+ range.MoveToSelection() ;
+ range.DeleteContents() ;
+ range.InsertNode( docFrag.RootNode ) ;
+
+ range.MoveToPosition( lastNode, 4 ) ;
+ }
+ else
+ doc.execCommand( 'inserthtml', false, html ) ;
+
+ this.Focus() ;
+
+ // Save the caret position before calling document processor.
+ if ( !range )
+ {
+ range = new FCKDomRange( this.EditorWindow ) ;
+ range.MoveToSelection() ;
+ }
+ var bookmark = range.CreateBookmark() ;
+
+ FCKDocumentProcessor.Process( doc ) ;
+
+ // Restore caret position, ignore any errors in case the document
+ // processor removed the bookmark <span>s for some reason.
+ try
+ {
+ range.MoveToBookmark( bookmark ) ;
+ range.Select() ;
+ }
+ catch ( e ) {}
+
+ // For some strange reason the SaveUndoStep() call doesn't activate the undo button at the first InsertHtml() call.
+ this.Events.FireEvent( "OnSelectionChange" ) ;
+}
+
+FCK.PasteAsPlainText = function()
+{
+ // TODO: Implement the "Paste as Plain Text" code.
+
+ // If the function is called immediately Firefox 2 does automatically paste the contents as soon as the new dialog is created
+ // 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'] ) ;
+
+/*
+ var sText = FCKTools.HTMLEncode( clipboardData.getData("Text") ) ;
+ sText = sText.replace( /\n/g, '<BR>' ) ;
+ this.InsertHtml( sText ) ;
+*/
+}
+/*
+FCK.PasteFromWord = function()
+{
+ // TODO: Implement the "Paste as Plain Text" code.
+
+ FCKDialog.OpenDialog( 'FCKDialog_Paste', FCKLang.PasteFromWord, 'dialog/fck_paste.html', 400, 330, 'Word' ) ;
+
+// FCK.CleanAndPaste( FCK.GetClipboardHTML() ) ;
+}
+*/
+FCK.GetClipboardHTML = function()
+{
+ return '' ;
+}
+
+FCK.CreateLink = function( url, noUndo )
+{
+ // Creates the array that will be returned. It contains one or more created links (see #220).
+ var aCreatedLinks = new Array() ;
+
+ // Only for Safari, a collapsed selection may create a link. All other
+ // browser will have no links created. So, we check it here and return
+ // immediatelly, having the same cross browser behavior.
+ if ( FCKSelection.GetSelection().isCollapsed )
+ return aCreatedLinks ;
+
+ FCK.ExecuteNamedCommand( 'Unlink', null, false, !!noUndo ) ;
+
+ if ( url.length > 0 )
+ {
+ // Generate a temporary name for the link.
+ var sTempUrl = 'javascript:void(0);/*' + ( new Date().getTime() ) + '*/' ;
+
+ // Use the internal "CreateLink" command to create the link.
+ FCK.ExecuteNamedCommand( 'CreateLink', sTempUrl, 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 ) ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fck_ie.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fck_ie.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,456 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Creation and initialization of the "FCK" object. This is the main
+ * object that represents an editor instance.
+ * (IE specific implementations)
+ */
+
+FCK.Description = "FCKeditor for Internet Explorer 5.5+" ;
+
+FCK._GetBehaviorsStyle = function()
+{
+ if ( !FCK._BehaviorsStyle )
+ {
+ var sBasePath = FCKConfig.BasePath ;
+ var sTableBehavior = '' ;
+ var sStyle ;
+
+ // The behaviors should be pointed using the BasePath to avoid security
+ // errors when using a different BaseHref.
+ sStyle = '<style type="text/css" _fcktemp="true">' ;
+
+ if ( FCKConfig.ShowBorders )
+ sTableBehavior = 'url(' + sBasePath + 'css/behaviors/showtableborders.htc)' ;
+
+ // Disable resize handlers.
+ sStyle += 'INPUT,TEXTAREA,SELECT,.FCK__Anchor,.FCK__PageBreak,.FCK__InputHidden' ;
+
+ if ( FCKConfig.DisableObjectResizing )
+ {
+ sStyle += ',IMG' ;
+ sTableBehavior += ' url(' + sBasePath + 'css/behaviors/disablehandles.htc)' ;
+ }
+
+ sStyle += ' { behavior: url(' + sBasePath + 'css/behaviors/disablehandles.htc) ; }' ;
+
+ if ( sTableBehavior.length > 0 )
+ sStyle += 'TABLE { behavior: ' + sTableBehavior + ' ; }' ;
+
+ sStyle += '</style>' ;
+ FCK._BehaviorsStyle = sStyle ;
+ }
+
+ return FCK._BehaviorsStyle ;
+}
+
+function Doc_OnMouseUp()
+{
+ if ( FCK.EditorWindow.event.srcElement.tagName == 'HTML' )
+ {
+ FCK.Focus() ;
+ FCK.EditorWindow.event.cancelBubble = true ;
+ FCK.EditorWindow.event.returnValue = false ;
+ }
+}
+
+function Doc_OnPaste()
+{
+ var body = FCK.EditorDocument.body ;
+
+ body.detachEvent( 'onpaste', Doc_OnPaste ) ;
+
+ var ret = FCK.Paste( !FCKConfig.ForcePasteAsPlainText && !FCKConfig.AutoDetectPasteFromWord ) ;
+
+ body.attachEvent( 'onpaste', Doc_OnPaste ) ;
+
+ return ret ;
+}
+
+function Doc_OnDblClick()
+{
+ FCK.OnDoubleClick( FCK.EditorWindow.event.srcElement ) ;
+ FCK.EditorWindow.event.cancelBubble = true ;
+}
+
+function Doc_OnSelectionChange()
+{
+ // Don't fire the event if no document is loaded.
+ if ( !FCK.IsSelectionChangeLocked && FCK.EditorDocument )
+ FCK.Events.FireEvent( "OnSelectionChange" ) ;
+}
+
+function Doc_OnDrop()
+{
+ if ( FCK.MouseDownFlag )
+ {
+ FCK.MouseDownFlag = false ;
+ return ;
+ }
+
+ if ( FCKConfig.ForcePasteAsPlainText )
+ {
+ var evt = FCK.EditorWindow.event ;
+
+ if ( FCK._CheckIsPastingEnabled() || FCKConfig.ShowDropDialog )
+ FCK.PasteAsPlainText( evt.dataTransfer.getData( 'Text' ) ) ;
+
+ evt.returnValue = false ;
+ evt.cancelBubble = true ;
+ }
+}
+
+FCK.InitializeBehaviors = function( dontReturn )
+{
+ // Set the focus to the editable area when clicking in the document area.
+ // TODO: The cursor must be positioned at the end.
+ this.EditorDocument.attachEvent( 'onmouseup', Doc_OnMouseUp ) ;
+
+ // Intercept pasting operations
+ this.EditorDocument.body.attachEvent( 'onpaste', Doc_OnPaste ) ;
+
+ // Intercept drop operations
+ this.EditorDocument.body.attachEvent( 'ondrop', Doc_OnDrop ) ;
+
+ // Reset the context menu.
+ FCK.ContextMenu._InnerContextMenu.AttachToElement( FCK.EditorDocument.body ) ;
+
+ this.EditorDocument.attachEvent("onkeydown", FCK._KeyDownListener ) ;
+
+ this.EditorDocument.attachEvent("ondblclick", Doc_OnDblClick ) ;
+
+ this.EditorDocument.attachEvent("onbeforedeactivate", function(){ FCKSelection.Save( true ) ; } ) ;
+
+ // Catch cursor selection changes.
+ this.EditorDocument.attachEvent("onselectionchange", Doc_OnSelectionChange ) ;
+
+ FCKTools.AddEventListener( FCK.EditorDocument, 'mousedown', Doc_OnMouseDown ) ;
+}
+
+FCK.InsertHtml = function( html )
+{
+ html = FCKConfig.ProtectedSource.Protect( html ) ;
+ html = FCK.ProtectEvents( html ) ;
+ html = FCK.ProtectUrls( html ) ;
+ html = FCK.ProtectTags( html ) ;
+
+// FCK.Focus() ;
+ FCKSelection.Restore() ;
+ FCK.EditorWindow.focus() ;
+
+ FCKUndo.SaveUndoStep() ;
+
+ // Gets the actual selection.
+ var oSel = FCKSelection.GetSelection() ;
+
+ // Deletes the actual selection contents.
+ if ( oSel.type.toLowerCase() == 'control' )
+ oSel.clear() ;
+
+ // Using the following trick, any comment in the beginning of the HTML will
+ // be preserved.
+ html = '<span id="__fakeFCKRemove__" style="display:none;">fakeFCKRemove</span>' + html ;
+
+ // Insert the HTML.
+ oSel.createRange().pasteHTML( html ) ;
+
+ // Remove the fake node
+ FCK.EditorDocument.getElementById('__fakeFCKRemove__').removeNode( true ) ;
+
+ FCKDocumentProcessor.Process( FCK.EditorDocument ) ;
+
+ // For some strange reason the SaveUndoStep() call doesn't activate the undo button at the first InsertHtml() call.
+ this.Events.FireEvent( "OnSelectionChange" ) ;
+}
+
+FCK.SetInnerHtml = function( html ) // IE Only
+{
+ var oDoc = FCK.EditorDocument ;
+ // Using the following trick, any comment in the beginning of the HTML will
+ // be preserved.
+ oDoc.body.innerHTML = '<div id="__fakeFCKRemove__"> </div>' + html ;
+ oDoc.getElementById('__fakeFCKRemove__').removeNode( true ) ;
+}
+
+function FCK_PreloadImages()
+{
+ var oPreloader = new FCKImagePreloader() ;
+
+ // Add the configured images.
+ oPreloader.AddImages( FCKConfig.PreloadImages ) ;
+
+ // Add the skin icons strip.
+ oPreloader.AddImages( FCKConfig.SkinPath + 'fck_strip.gif' ) ;
+
+ oPreloader.OnComplete = LoadToolbarSetup ;
+ oPreloader.Start() ;
+}
+
+// Disable the context menu in the editor (outside the editing area).
+function Document_OnContextMenu()
+{
+ return ( event.srcElement._FCKShowContextMenu == true ) ;
+}
+document.oncontextmenu = Document_OnContextMenu ;
+
+function FCK_Cleanup()
+{
+ this.LinkedField = null ;
+ this.EditorWindow = null ;
+ this.EditorDocument = null ;
+}
+
+FCK._ExecPaste = function()
+{
+ // As we call ExecuteNamedCommand('Paste'), it would enter in a loop. So, let's use a semaphore.
+ if ( FCK._PasteIsRunning )
+ return true ;
+
+ if ( FCKConfig.ForcePasteAsPlainText )
+ {
+ FCK.PasteAsPlainText() ;
+ return false ;
+ }
+
+ var sHTML = FCK._CheckIsPastingEnabled( true ) ;
+
+ if ( sHTML === false )
+ FCKTools.RunFunction( FCKDialog.OpenDialog, FCKDialog, ['FCKDialog_Paste', FCKLang.Paste, 'dialog/fck_paste.html', 400, 330, 'Security'] ) ;
+ else
+ {
+ if ( FCKConfig.AutoDetectPasteFromWord && sHTML.length > 0 )
+ {
+ var re = /<\w[^>]*(( class="?MsoNormal"?)|(="mso-))/gi ;
+ if ( re.test( sHTML ) )
+ {
+ 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.
+ FCK._PasteIsRunning = true ;
+
+ FCK.ExecuteNamedCommand( 'Paste' ) ;
+
+ // Removes the semaphore.
+ delete FCK._PasteIsRunning ;
+ }
+
+ // 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.
+ return false ;
+}
+
+FCK.PasteAsPlainText = function( forceText )
+{
+ if ( !FCK._CheckIsPastingEnabled() )
+ {
+ FCKDialog.OpenDialog( 'FCKDialog_Paste', FCKLang.PasteAsText, 'dialog/fck_paste.html', 400, 330, 'PlainText' ) ;
+ return ;
+ }
+
+ // Get the data available in the clipboard in text format.
+ var sText = null ;
+ if ( ! forceText )
+ sText = clipboardData.getData("Text") ;
+ else
+ sText = forceText ;
+
+ if ( sText && sText.length > 0 )
+ {
+ // Replace the carriage returns with <BR>
+ sText = FCKTools.HTMLEncode( sText ) ;
+ sText = FCKTools.ProcessLineBreaks( window, FCKConfig, sText ) ;
+
+ var closeTagIndex = sText.search( '</p>' ) ;
+ var startTagIndex = sText.search( '<p>' ) ;
+
+ if ( ( closeTagIndex != -1 && startTagIndex != -1 && closeTagIndex < startTagIndex )
+ || ( closeTagIndex != -1 && startTagIndex == -1 ) )
+ {
+ var prefix = sText.substr( 0, closeTagIndex ) ;
+ sText = sText.substr( closeTagIndex + 4 ) ;
+ this.InsertHtml( prefix ) ;
+ }
+
+ // 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.
+ // It adds a little bit of overhead to the check, but so far that's the
+ // only way, mainly because of IE7.
+
+ FCK._PasteIsEnabled = false ;
+
+ document.body.attachEvent( 'onpaste', FCK_CheckPasting_Listener ) ;
+
+ // The execCommand in GetClipboardHTML will fire the "onpaste", only if the
+ // security settings are enabled.
+ var oReturn = FCK.GetClipboardHTML() ;
+
+ document.body.detachEvent( 'onpaste', FCK_CheckPasting_Listener ) ;
+
+ if ( FCK._PasteIsEnabled )
+ {
+ if ( !returnContents )
+ oReturn = true ;
+ }
+ else
+ oReturn = false ;
+
+ delete FCK._PasteIsEnabled ;
+
+ return oReturn ;
+}
+
+function FCK_CheckPasting_Listener()
+{
+ FCK._PasteIsEnabled = true ;
+}
+
+FCK.GetClipboardHTML = function()
+{
+ var oDiv = document.getElementById( '___FCKHiddenDiv' ) ;
+
+ if ( !oDiv )
+ {
+ oDiv = document.createElement( 'DIV' ) ;
+ oDiv.id = '___FCKHiddenDiv' ;
+
+ var oDivStyle = oDiv.style ;
+ oDivStyle.position = 'absolute' ;
+ oDivStyle.visibility = oDivStyle.overflow = 'hidden' ;
+ oDivStyle.width = oDivStyle.height = 1 ;
+
+ document.body.appendChild( oDiv ) ;
+ }
+
+ oDiv.innerHTML = '' ;
+
+ var oTextRange = document.body.createTextRange() ;
+ oTextRange.moveToElementText( oDiv ) ;
+ oTextRange.execCommand( 'Paste' ) ;
+
+ var sData = oDiv.innerHTML ;
+ oDiv.innerHTML = '' ;
+
+ return sData ;
+}
+
+FCK.CreateLink = function( url, noUndo )
+{
+ // Creates the array that will be returned. It contains one or more created links (see #220).
+ var aCreatedLinks = new Array() ;
+
+ // Remove any existing link in the selection.
+ FCK.ExecuteNamedCommand( 'Unlink', null, false, !!noUndo ) ;
+
+ if ( url.length > 0 )
+ {
+ // 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 (FCKSelection.GetType() == 'Control')
+ {
+ // Create a link
+ var oLink = this.EditorDocument.createElement( 'A' ) ;
+ oLink.href = url ;
+
+ // Get the selected object
+ var oControl = FCKSelection.GetSelectedElement() ;
+ // Put the link just before the object
+ oControl.parentNode.insertBefore(oLink, oControl) ;
+ // Move the object inside the link
+ oControl.parentNode.removeChild( oControl ) ;
+ oLink.appendChild( oControl ) ;
+
+ return [ oLink ] ;
+ }
+
+ // Generate a temporary name for the link.
+ var sTempUrl = 'javascript:void(0);/*' + ( new Date().getTime() ) + '*/' ;
+
+ // Use the internal "CreateLink" command to create the link.
+ FCK.ExecuteNamedCommand( 'CreateLink', sTempUrl, false, !!noUndo ) ;
+
+ // Look for the just create link.
+ var oLinks = this.EditorDocument.links ;
+
+ for ( i = 0 ; i < oLinks.length ; i++ )
+ {
+ var oLink = oLinks[i] ;
+
+ // Check it this a newly created link.
+ // getAttribute must be used. oLink.url may cause problems with IE7 (#555).
+ if ( oLink.getAttribute( 'href', 2 ) == sTempUrl )
+ {
+ var sInnerHtml = oLink.innerHTML ; // Save the innerHTML (IE changes it if it is like an URL).
+ oLink.href = url ;
+ oLink.innerHTML = sInnerHtml ; // Restore the innerHTML.
+
+ // If the last child is a <br> move it outside the link or it
+ // will be too easy to select this link again #388.
+ var oLastChild = oLink.lastChild ;
+ if ( oLastChild && oLastChild.nodeName == 'BR' )
+ {
+ // Move the BR after the link.
+ FCKDomTools.InsertAfterNode( oLink, oLink.removeChild( oLastChild ) ) ;
+ }
+
+ aCreatedLinks.push( oLink ) ;
+ }
+ }
+ }
+
+ return aCreatedLinks ;
+}
+
+function _FCK_RemoveDisabledAtt()
+{
+ this.removeAttribute( 'disabled' ) ;
+}
+
+function Doc_OnMouseDown( evt )
+{
+ var e = evt.srcElement ;
+
+ // 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
+ // the buttons. (#1782)
+ if ( e.nodeName.IEquals( 'input' ) && e.type.IEquals( ['radio', 'checkbox'] ) && !e.disabled )
+ {
+ e.disabled = true ;
+ FCKTools.SetTimeout( _FCK_RemoveDisabledAtt, 1, e ) ;
+ }
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckbrowserinfo.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckbrowserinfo.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,61 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Contains browser detection information.
+ */
+
+var s = navigator.userAgent.toLowerCase() ;
+
+var FCKBrowserInfo =
+{
+ IsIE : /*@cc_on!@*/false,
+ IsIE7 : /*@cc_on!@*/false && ( parseInt( s.match( /msie (\d+)/ )[1], 10 ) >= 7 ),
+ IsIE6 : /*@cc_on!@*/false && ( parseInt( s.match( /msie (\d+)/ )[1], 10 ) >= 6 ),
+ IsSafari : s.Contains(' applewebkit/'), // Read "IsWebKit"
+ IsOpera : !!window.opera,
+ IsAIR : s.Contains(' adobeair/'),
+ IsMac : s.Contains('macintosh')
+} ;
+
+// Completes the browser info with further Gecko information.
+(function( browserInfo )
+{
+ browserInfo.IsGecko = ( navigator.product == 'Gecko' ) && !browserInfo.IsSafari && !browserInfo.IsOpera ;
+ browserInfo.IsGeckoLike = ( browserInfo.IsGecko || browserInfo.IsSafari || browserInfo.IsOpera ) ;
+
+ if ( browserInfo.IsGecko )
+ {
+ 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.
+
+ // 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
+ // be 1.7 (we are assuming that rv < 1.7 will not have build > 20051111).
+
+ if ( geckoVersion )
+ {
+ browserInfo.IsGecko10 = ( geckoVersion < 1.8 ) ;
+ browserInfo.IsGecko19 = ( geckoVersion > 1.8 ) ;
+ }
+ }
+})(FCKBrowserInfo) ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckcodeformatter.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckcodeformatter.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,100 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Format the HTML.
+ */
+
+var FCKCodeFormatter = new Object() ;
+
+FCKCodeFormatter.Init = function()
+{
+ var oRegex = this.Regex = new Object() ;
+
+ // Regex for line breaks.
+ oRegex.BlocksOpener = /\<(P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|TITLE|META|LINK|BASE|SCRIPT|LINK|TD|TH|AREA|OPTION)[^\>]*\>/gi ;
+ oRegex.BlocksCloser = /\<\/(P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|TITLE|META|LINK|BASE|SCRIPT|LINK|TD|TH|AREA|OPTION)[^\>]*\>/gi ;
+
+ oRegex.NewLineTags = /\<(BR|HR)[^\>]*\>/gi ;
+
+ oRegex.MainTags = /\<\/?(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR)[^\>]*\>/gi ;
+
+ oRegex.LineSplitter = /\s*\n+\s*/g ;
+
+ // Regex for indentation.
+ oRegex.IncreaseIndent = /^\<(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR|UL|OL)[ \/\>]/i ;
+ oRegex.DecreaseIndent = /^\<\/(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR|UL|OL)[ \>]/i ;
+ oRegex.FormatIndentatorRemove = new RegExp( '^' + FCKConfig.FormatIndentator ) ;
+
+ oRegex.ProtectedTags = /(<PRE[^>]*>)([\s\S]*?)(<\/PRE>)/gi ;
+}
+
+FCKCodeFormatter._ProtectData = function( outer, opener, data, closer )
+{
+ return opener + '___FCKpd___' + FCKCodeFormatter.ProtectedData.AddItem( data ) + closer ;
+}
+
+FCKCodeFormatter.Format = function( html )
+{
+ if ( !this.Regex )
+ this.Init() ;
+
+ // Protected content that remain untouched during the
+ // process go in the following array.
+ FCKCodeFormatter.ProtectedData = new Array() ;
+
+ var sFormatted = html.replace( this.Regex.ProtectedTags, FCKCodeFormatter._ProtectData ) ;
+
+ // Line breaks.
+ sFormatted = sFormatted.replace( this.Regex.BlocksOpener, '\n$&' ) ;
+ sFormatted = sFormatted.replace( this.Regex.BlocksCloser, '$&\n' ) ;
+ sFormatted = sFormatted.replace( this.Regex.NewLineTags, '$&\n' ) ;
+ sFormatted = sFormatted.replace( this.Regex.MainTags, '\n$&\n' ) ;
+
+ // Indentation.
+ var sIndentation = '' ;
+
+ var asLines = sFormatted.split( this.Regex.LineSplitter ) ;
+ sFormatted = '' ;
+
+ for ( var i = 0 ; i < asLines.length ; i++ )
+ {
+ var sLine = asLines[i] ;
+
+ if ( sLine.length == 0 )
+ continue ;
+
+ if ( this.Regex.DecreaseIndent.test( sLine ) )
+ sIndentation = sIndentation.replace( this.Regex.FormatIndentatorRemove, '' ) ;
+
+ sFormatted += sIndentation + sLine + '\n' ;
+
+ if ( this.Regex.IncreaseIndent.test( sLine ) )
+ sIndentation += FCKConfig.FormatIndentator ;
+ }
+
+ // Now we put back the protected data.
+ for ( var j = 0 ; j < FCKCodeFormatter.ProtectedData.length ; j++ )
+ {
+ var oRegex = new RegExp( '___FCKpd___' + j ) ;
+ sFormatted = sFormatted.replace( oRegex, FCKCodeFormatter.ProtectedData[j].replace( /\$/g, '$$$$' ) ) ;
+ }
+
+ return sFormatted.Trim() ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckcommands.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckcommands.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,172 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Define all commands available in the editor.
+ */
+
+var FCKCommands = FCK.Commands = new Object() ;
+FCKCommands.LoadedCommands = new Object() ;
+
+FCKCommands.RegisterCommand = function( commandName, command )
+{
+ this.LoadedCommands[ commandName ] = command ;
+}
+
+FCKCommands.GetCommand = function( commandName )
+{
+ var oCommand = FCKCommands.LoadedCommands[ commandName ] ;
+
+ if ( oCommand )
+ return oCommand ;
+
+ switch ( commandName )
+ {
+ case 'Bold' :
+ case 'Italic' :
+ case 'Underline' :
+ case 'StrikeThrough':
+ case 'Subscript' :
+ case 'Superscript' : oCommand = new FCKCoreStyleCommand( commandName ) ; break ;
+
+ case 'RemoveFormat' : oCommand = new FCKRemoveFormatCommand() ; break ;
+
+ case 'DocProps' : oCommand = new FCKDialogCommand( 'DocProps' , FCKLang.DocProps , 'dialog/fck_docprops.html' , 400, 380, FCKCommands.GetFullPageState ) ; break ;
+ case 'Templates' : oCommand = new FCKDialogCommand( 'Templates' , FCKLang.DlgTemplatesTitle , 'dialog/fck_template.html' , 380, 450 ) ; break ;
+ case 'Link' : oCommand = new FCKDialogCommand( 'Link' , FCKLang.DlgLnkWindowTitle , 'dialog/fck_link.html' , 400, 300 ) ; break ;
+ case 'Unlink' : oCommand = new FCKUnlinkCommand() ; break ;
+ case 'VisitLink' : oCommand = new FCKVisitLinkCommand() ; break ;
+ case 'Anchor' : oCommand = new FCKDialogCommand( 'Anchor' , FCKLang.DlgAnchorTitle , 'dialog/fck_anchor.html' , 370, 160 ) ; break ;
+ case 'AnchorDelete' : oCommand = new FCKAnchorDeleteCommand() ; break ;
+ case 'BulletedList' : oCommand = new FCKDialogCommand( 'BulletedList', FCKLang.BulletedListProp , 'dialog/fck_listprop.html?UL' , 370, 160 ) ; break ;
+ case 'NumberedList' : oCommand = new FCKDialogCommand( 'NumberedList', FCKLang.NumberedListProp , 'dialog/fck_listprop.html?OL' , 370, 160 ) ; break ;
+ case 'About' : oCommand = new FCKDialogCommand( 'About' , FCKLang.About , 'dialog/fck_about.html' , 420, 330, function(){ return FCK_TRISTATE_OFF ; } ) ; break ;
+ case 'Find' : oCommand = new FCKDialogCommand( 'Find' , FCKLang.DlgFindAndReplaceTitle, 'dialog/fck_replace.html' , 340, 230, null, null, 'Find' ) ; break ;
+ case 'Replace' : oCommand = new FCKDialogCommand( 'Replace' , FCKLang.DlgFindAndReplaceTitle, 'dialog/fck_replace.html' , 340, 230, null, null, 'Replace' ) ; break ;
+
+ case 'Image' : oCommand = new FCKDialogCommand( 'Image' , FCKLang.DlgImgTitle , 'dialog/fck_image.html' , 450, 390 ) ; break ;
+ case 'Flash' : oCommand = new FCKDialogCommand( 'Flash' , FCKLang.DlgFlashTitle , 'dialog/fck_flash.html' , 450, 390 ) ; break ;
+ case 'SpecialChar' : oCommand = new FCKDialogCommand( 'SpecialChar', FCKLang.DlgSpecialCharTitle , 'dialog/fck_specialchar.html' , 400, 290 ) ; break ;
+ case 'Smiley' : oCommand = new FCKDialogCommand( 'Smiley' , FCKLang.DlgSmileyTitle , 'dialog/fck_smiley.html' , FCKConfig.SmileyWindowWidth, FCKConfig.SmileyWindowHeight ) ; break ;
+ case 'Table' : oCommand = new FCKDialogCommand( 'Table' , FCKLang.DlgTableTitle , 'dialog/fck_table.html' , 480, 250 ) ; break ;
+ case 'TableProp' : oCommand = new FCKDialogCommand( 'Table' , FCKLang.DlgTableTitle , 'dialog/fck_table.html?Parent', 480, 250 ) ; break ;
+ case 'TableCellProp': oCommand = new FCKDialogCommand( 'TableCell' , FCKLang.DlgCellTitle , 'dialog/fck_tablecell.html' , 550, 240 ) ; break ;
+
+ case 'Style' : oCommand = new FCKStyleCommand() ; break ;
+
+ case 'FontName' : oCommand = new FCKFontNameCommand() ; break ;
+ case 'FontSize' : oCommand = new FCKFontSizeCommand() ; break ;
+ case 'FontFormat' : oCommand = new FCKFormatBlockCommand() ; break ;
+
+ case 'Source' : oCommand = new FCKSourceCommand() ; break ;
+ case 'Preview' : oCommand = new FCKPreviewCommand() ; break ;
+ case 'Save' : oCommand = new FCKSaveCommand() ; break ;
+ case 'NewPage' : oCommand = new FCKNewPageCommand() ; break ;
+ case 'PageBreak' : oCommand = new FCKPageBreakCommand() ; break ;
+ case 'Rule' : oCommand = new FCKRuleCommand() ; break ;
+ case 'Nbsp' : oCommand = new FCKNbsp() ; break ;
+
+ case 'TextColor' : oCommand = new FCKTextColorCommand('ForeColor') ; break ;
+ case 'BGColor' : oCommand = new FCKTextColorCommand('BackColor') ; break ;
+
+ case 'Paste' : oCommand = new FCKPasteCommand() ; break ;
+ case 'PasteText' : oCommand = new FCKPastePlainTextCommand() ; break ;
+ case 'PasteWord' : oCommand = new FCKPasteWordCommand() ; break ;
+
+ case 'JustifyLeft' : oCommand = new FCKJustifyCommand( 'left' ) ; break ;
+ case 'JustifyCenter' : oCommand = new FCKJustifyCommand( 'center' ) ; break ;
+ case 'JustifyRight' : oCommand = new FCKJustifyCommand( 'right' ) ; break ;
+ case 'JustifyFull' : oCommand = new FCKJustifyCommand( 'justify' ) ; break ;
+ case 'Indent' : oCommand = new FCKIndentCommand( 'indent', FCKConfig.IndentLength ) ; break ;
+ case 'Outdent' : oCommand = new FCKIndentCommand( 'outdent', FCKConfig.IndentLength * -1 ) ; break ;
+ case 'Blockquote' : oCommand = new FCKBlockQuoteCommand() ; break ;
+ case 'CreateDiv' : oCommand = new FCKDialogCommand( 'CreateDiv', FCKLang.CreateDiv, 'dialog/fck_div.html', 380, 210, null, null, true ) ; break ;
+ case 'EditDiv' : oCommand = new FCKDialogCommand( 'EditDiv', FCKLang.EditDiv, 'dialog/fck_div.html', 380, 210, null, null, false ) ; break ;
+ case 'DeleteDiv' : oCommand = new FCKDeleteDivCommand() ; break ;
+
+ case 'TableInsertRowAfter' : oCommand = new FCKTableCommand('TableInsertRowAfter') ; break ;
+ case 'TableInsertRowBefore' : oCommand = new FCKTableCommand('TableInsertRowBefore') ; break ;
+ case 'TableDeleteRows' : oCommand = new FCKTableCommand('TableDeleteRows') ; break ;
+ case 'TableInsertColumnAfter' : oCommand = new FCKTableCommand('TableInsertColumnAfter') ; break ;
+ case 'TableInsertColumnBefore' : oCommand = new FCKTableCommand('TableInsertColumnBefore') ; break ;
+ case 'TableDeleteColumns' : oCommand = new FCKTableCommand('TableDeleteColumns') ; break ;
+ case 'TableInsertCellAfter' : oCommand = new FCKTableCommand('TableInsertCellAfter') ; break ;
+ case 'TableInsertCellBefore' : oCommand = new FCKTableCommand('TableInsertCellBefore') ; break ;
+ case 'TableDeleteCells' : oCommand = new FCKTableCommand('TableDeleteCells') ; break ;
+ case 'TableMergeCells' : oCommand = new FCKTableCommand('TableMergeCells') ; break ;
+ case 'TableMergeRight' : oCommand = new FCKTableCommand('TableMergeRight') ; break ;
+ case 'TableMergeDown' : oCommand = new FCKTableCommand('TableMergeDown') ; break ;
+ case 'TableHorizontalSplitCell' : oCommand = new FCKTableCommand('TableHorizontalSplitCell') ; break ;
+ case 'TableVerticalSplitCell' : oCommand = new FCKTableCommand('TableVerticalSplitCell') ; break ;
+ case 'TableDelete' : oCommand = new FCKTableCommand('TableDelete') ; break ;
+
+ case 'Form' : oCommand = new FCKDialogCommand( 'Form' , FCKLang.Form , 'dialog/fck_form.html' , 380, 210 ) ; break ;
+ case 'Checkbox' : oCommand = new FCKDialogCommand( 'Checkbox' , FCKLang.Checkbox , 'dialog/fck_checkbox.html' , 380, 200 ) ; break ;
+ case 'Radio' : oCommand = new FCKDialogCommand( 'Radio' , FCKLang.RadioButton , 'dialog/fck_radiobutton.html' , 380, 200 ) ; break ;
+ case 'TextField' : oCommand = new FCKDialogCommand( 'TextField' , FCKLang.TextField , 'dialog/fck_textfield.html' , 380, 210 ) ; break ;
+ case 'Textarea' : oCommand = new FCKDialogCommand( 'Textarea' , FCKLang.Textarea , 'dialog/fck_textarea.html' , 380, 210 ) ; break ;
+ case 'HiddenField' : oCommand = new FCKDialogCommand( 'HiddenField', FCKLang.HiddenField , 'dialog/fck_hiddenfield.html' , 380, 190 ) ; break ;
+ case 'Button' : oCommand = new FCKDialogCommand( 'Button' , FCKLang.Button , 'dialog/fck_button.html' , 380, 210 ) ; break ;
+ case 'Select' : oCommand = new FCKDialogCommand( 'Select' , FCKLang.SelectionField, 'dialog/fck_select.html' , 400, 340 ) ; break ;
+ case 'ImageButton' : oCommand = new FCKDialogCommand( 'ImageButton', FCKLang.ImageButton , 'dialog/fck_image.html?ImageButton', 450, 390 ) ; break ;
+
+ case 'SpellCheck' : oCommand = new FCKSpellCheckCommand() ; break ;
+ case 'FitWindow' : oCommand = new FCKFitWindow() ; break ;
+
+ case 'Undo' : oCommand = new FCKUndoCommand() ; break ;
+ case 'Redo' : oCommand = new FCKRedoCommand() ; break ;
+ case 'Copy' : oCommand = new FCKCutCopyCommand( false ) ; break ;
+ case 'Cut' : oCommand = new FCKCutCopyCommand( true ) ; break ;
+
+ case 'SelectAll' : oCommand = new FCKSelectAllCommand() ; break ;
+ case 'InsertOrderedList' : oCommand = new FCKListCommand( 'insertorderedlist', 'ol' ) ; break ;
+ case 'InsertUnorderedList' : oCommand = new FCKListCommand( 'insertunorderedlist', 'ul' ) ; break ;
+ case 'ShowBlocks' : oCommand = new FCKShowBlockCommand( 'ShowBlocks', FCKConfig.StartupShowBlocks ? FCK_TRISTATE_ON : FCK_TRISTATE_OFF ) ; break ;
+
+ // Generic Undefined command (usually used when a command is under development).
+ case 'Undefined' : oCommand = new FCKUndefinedCommand() ; break ;
+
+ // By default we assume that it is a named command.
+ default:
+ if ( FCKRegexLib.NamedCommands.test( commandName ) )
+ oCommand = new FCKNamedCommand( commandName ) ;
+ else
+ {
+ alert( FCKLang.UnknownCommand.replace( /%1/g, commandName ) ) ;
+ return null ;
+ }
+ }
+
+ FCKCommands.LoadedCommands[ commandName ] = oCommand ;
+
+ return oCommand ;
+}
+
+// Gets the state of the "Document Properties" button. It must be enabled only
+// when "Full Page" editing is available.
+FCKCommands.GetFullPageState = function()
+{
+ return FCKConfig.FullPage ? FCK_TRISTATE_OFF : FCK_TRISTATE_DISABLED ;
+}
+
+
+FCKCommands.GetBooleanState = function( isDisabled )
+{
+ return isDisabled ? FCK_TRISTATE_DISABLED : FCK_TRISTATE_OFF ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckconfig.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckconfig.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,237 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Creates and initializes the FCKConfig object.
+ */
+
+var FCKConfig = FCK.Config = new Object() ;
+
+/*
+ For the next major version (probably 3.0) we should move all this stuff to
+ another dedicated object and leave FCKConfig as a holder object for settings only).
+*/
+
+// Editor Base Path
+if ( document.location.protocol == 'file:' )
+{
+ FCKConfig.BasePath = decodeURIComponent( document.location.pathname.substr(1) ) ;
+ FCKConfig.BasePath = FCKConfig.BasePath.replace( /\\/gi, '/' ) ;
+
+ // The way to address local files is different according to the OS.
+ // In Windows it is file:// but in MacOs it is file:/// so let's get it automatically
+ var sFullProtocol = document.location.href.match( /^(file\:\/{2,3})/ )[1] ;
+ // #945 Opera does strange things with files loaded from the disk, and it fails in Mac to load xml files
+ if ( FCKBrowserInfo.IsOpera )
+ sFullProtocol += 'localhost/' ;
+
+ FCKConfig.BasePath = sFullProtocol + FCKConfig.BasePath.substring( 0, FCKConfig.BasePath.lastIndexOf( '/' ) + 1) ;
+}
+else
+ FCKConfig.BasePath = document.location.protocol + '//' + document.location.host +
+ document.location.pathname.substring( 0, document.location.pathname.lastIndexOf( '/' ) + 1) ;
+
+FCKConfig.FullBasePath = FCKConfig.BasePath ;
+
+FCKConfig.EditorPath = FCKConfig.BasePath.replace( /editor\/$/, '' ) ;
+
+// There is a bug in Gecko. If the editor is hidden on startup, an error is
+// thrown when trying to get the screen dimensions.
+try
+{
+ FCKConfig.ScreenWidth = screen.width ;
+ FCKConfig.ScreenHeight = screen.height ;
+}
+catch (e)
+{
+ FCKConfig.ScreenWidth = 800 ;
+ FCKConfig.ScreenHeight = 600 ;
+}
+
+// Override the actual configuration values with the values passed throw the
+// hidden field "<InstanceName>___Config".
+FCKConfig.ProcessHiddenField = function()
+{
+ this.PageConfig = new Object() ;
+
+ // Get the hidden field.
+ var oConfigField = window.parent.document.getElementById( FCK.Name + '___Config' ) ;
+
+ // Do nothing if the config field was not defined.
+ if ( ! oConfigField ) return ;
+
+ var aCouples = oConfigField.value.split('&') ;
+
+ for ( var i = 0 ; i < aCouples.length ; i++ )
+ {
+ if ( aCouples[i].length == 0 )
+ continue ;
+
+ var aConfig = aCouples[i].split( '=' ) ;
+ var sKey = decodeURIComponent( aConfig[0] ) ;
+ var sVal = decodeURIComponent( aConfig[1] ) ;
+
+ if ( sKey == 'CustomConfigurationsPath' ) // The Custom Config File path must be loaded immediately.
+ FCKConfig[ sKey ] = sVal ;
+
+ else if ( sVal.toLowerCase() == "true" ) // If it is a boolean TRUE.
+ this.PageConfig[ sKey ] = true ;
+
+ else if ( sVal.toLowerCase() == "false" ) // If it is a boolean FALSE.
+ this.PageConfig[ sKey ] = false ;
+
+ else if ( sVal.length > 0 && !isNaN( sVal ) ) // If it is a number.
+ this.PageConfig[ sKey ] = parseInt( sVal, 10 ) ;
+
+ else // In any other case it is a string.
+ this.PageConfig[ sKey ] = sVal ;
+ }
+}
+
+function FCKConfig_LoadPageConfig()
+{
+ var oPageConfig = FCKConfig.PageConfig ;
+ for ( var sKey in oPageConfig )
+ FCKConfig[ sKey ] = oPageConfig[ sKey ] ;
+}
+
+function FCKConfig_PreProcess()
+{
+ var oConfig = FCKConfig ;
+
+ // Force debug mode if fckdebug=true in the QueryString (main page).
+ if ( oConfig.AllowQueryStringDebug )
+ {
+ try
+ {
+ if ( (/fckdebug=true/i).test( window.top.location.search ) )
+ oConfig.Debug = true ;
+ }
+ catch (e) { /* Ignore it. Much probably we are inside a FRAME where the "top" is in another domain (security error). */ }
+ }
+
+ // Certifies that the "PluginsPath" configuration ends with a slash.
+ if ( !oConfig.PluginsPath.EndsWith('/') )
+ oConfig.PluginsPath += '/' ;
+
+ // If no ToolbarComboPreviewCSS, point it to EditorAreaCSS.
+ var sComboPreviewCSS = oConfig.ToolbarComboPreviewCSS ;
+ if ( !sComboPreviewCSS || sComboPreviewCSS.length == 0 )
+ oConfig.ToolbarComboPreviewCSS = oConfig.EditorAreaCSS ;
+
+ // Turn the attributes that will be removed in the RemoveFormat from a string to an array
+ oConfig.RemoveAttributesArray = (oConfig.RemoveAttributes || '').split( ',' );
+
+ if ( !FCKConfig.SkinEditorCSS || FCKConfig.SkinEditorCSS.length == 0 )
+ FCKConfig.SkinEditorCSS = FCKConfig.SkinPath + 'fck_editor.css' ;
+
+ if ( !FCKConfig.SkinDialogCSS || FCKConfig.SkinDialogCSS.length == 0 )
+ FCKConfig.SkinDialogCSS = FCKConfig.SkinPath + 'fck_dialog.css' ;
+}
+
+// Define toolbar sets collection.
+FCKConfig.ToolbarSets = new Object() ;
+
+// Defines the plugins collection.
+FCKConfig.Plugins = new Object() ;
+FCKConfig.Plugins.Items = new Array() ;
+
+FCKConfig.Plugins.Add = function( name, langs, path )
+{
+ FCKConfig.Plugins.Items.AddItem( [name, langs, path] ) ;
+}
+
+// FCKConfig.ProtectedSource: object that holds a collection of Regular
+// Expressions that defined parts of the raw HTML that must remain untouched
+// like custom tags, scripts, server side code, etc...
+FCKConfig.ProtectedSource = new Object() ;
+
+// Generates a string used to identify and locate the Protected Tags comments.
+FCKConfig.ProtectedSource._CodeTag = (new Date()).valueOf() ;
+
+// Initialize the regex array with the default ones.
+FCKConfig.ProtectedSource.RegexEntries = [
+ // First of any other protection, we must protect all comments to avoid
+ // loosing them (of course, IE related).
+ /<!--[\s\S]*?-->/g ,
+
+ // Script tags will also be forced to be protected, otherwise IE will execute them.
+ /<script[\s\S]*?<\/script>/gi,
+
+ // <noscript> tags (get lost in IE and messed up in FF).
+ /<noscript[\s\S]*?<\/noscript>/gi
+] ;
+
+FCKConfig.ProtectedSource.Add = function( regexPattern )
+{
+ this.RegexEntries.AddItem( regexPattern ) ;
+}
+
+FCKConfig.ProtectedSource.Protect = function( html )
+{
+ var codeTag = this._CodeTag ;
+ function _Replace( protectedSource )
+ {
+ var index = FCKTempBin.AddElement( protectedSource ) ;
+ return '<!--{' + codeTag + index + '}-->' ;
+ }
+
+ for ( var i = 0 ; i < this.RegexEntries.length ; i++ )
+ {
+ html = html.replace( this.RegexEntries[i], _Replace ) ;
+ }
+
+ return html ;
+}
+
+FCKConfig.ProtectedSource.Revert = function( html, clearBin )
+{
+ function _Replace( m, opener, index )
+ {
+ var protectedValue = clearBin ? FCKTempBin.RemoveElement( index ) : FCKTempBin.Elements[ index ] ;
+ // There could be protected source inside another one.
+ return FCKConfig.ProtectedSource.Revert( protectedValue, clearBin ) ;
+ }
+
+ var regex = new RegExp( "(<|<)!--\\{" + this._CodeTag + "(\\d+)\\}--(>|>)", "g" ) ;
+ return html.replace( regex, _Replace ) ;
+}
+
+// Returns a string with the attributes that must be appended to the body
+FCKConfig.GetBodyAttributes = function()
+{
+ var bodyAttributes = '' ;
+ // Add id and class to the body.
+ if ( this.BodyId && this.BodyId.length > 0 )
+ bodyAttributes += ' id="' + this.BodyId + '"' ;
+ if ( this.BodyClass && this.BodyClass.length > 0 )
+ bodyAttributes += ' class="' + this.BodyClass + '"' ;
+
+ return bodyAttributes ;
+}
+
+// Sets the body attributes directly on the node
+FCKConfig.ApplyBodyAttributes = function( oBody )
+{
+ // Add ID and Class to the body
+ if ( this.BodyId && this.BodyId.length > 0 )
+ oBody.id = FCKConfig.BodyId ;
+ if ( this.BodyClass && this.BodyClass.length > 0 )
+ oBody.className += ' ' + FCKConfig.BodyClass ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckdebug.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckdebug.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,59 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Debug window control and operations.
+ */
+
+// Public function defined here must be declared in fckdebug_empty.js.
+
+var FCKDebug =
+{
+ Output : function( message, color, noParse )
+ {
+ if ( ! FCKConfig.Debug )
+ return ;
+
+ try
+ {
+ this._GetWindow().Output( message, color ) ;
+ }
+ catch ( e ) {} // Ignore errors
+ },
+
+ OutputObject : function( anyObject, color )
+ {
+ if ( ! FCKConfig.Debug )
+ return ;
+
+ try
+ {
+ this._GetWindow().OutputObject( anyObject, color ) ;
+ }
+ catch ( e ) {} // Ignore errors
+ },
+
+ _GetWindow : function()
+ {
+ if ( !this.DebugWindow || this.DebugWindow.closed )
+ this.DebugWindow = window.open( FCKConfig.BasePath + 'fckdebug.html', 'FCKeditorDebug', 'menubar=no,scrollbars=yes,resizable=yes,location=no,toolbar=no,width=600,height=500', true ) ;
+
+ return this.DebugWindow ;
+ }
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckdebug_empty.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckdebug_empty.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,31 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Debug window control and operations (empty for the compressed files - #2043).
+ */
+
+var FCKDebug =
+{
+ Output : function()
+ {},
+
+ OutputObject : function()
+ {}
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckdialog.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckdialog.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,239 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Dialog windows operations.
+ */
+
+var FCKDialog = ( function()
+{
+ var topDialog ;
+ var baseZIndex ;
+ var cover ;
+
+ // The document that holds the dialog.
+ var topWindow = window.parent ;
+
+ while ( topWindow.parent && topWindow.parent != topWindow )
+ {
+ try
+ {
+ if ( topWindow.parent.document.domain != document.domain )
+ break ;
+ if ( topWindow.parent.document.getElementsByTagName( 'frameset' ).length > 0 )
+ break ;
+ }
+ catch ( e )
+ {
+ break ;
+ }
+ topWindow = topWindow.parent ;
+ }
+
+ var topDocument = topWindow.document ;
+
+ var getZIndex = function()
+ {
+ if ( !baseZIndex )
+ baseZIndex = FCKConfig.FloatingPanelsZIndex + 999 ;
+ return ++baseZIndex ;
+ }
+
+ // TODO : This logic is not actually working when reducing the window, only
+ // when enlarging it.
+ var resizeHandler = function()
+ {
+ if ( !cover )
+ return ;
+
+ var relElement = FCKTools.IsStrictMode( topDocument ) ? topDocument.documentElement : topDocument.body ;
+
+ FCKDomTools.SetElementStyles( cover,
+ {
+ 'width' : Math.max( relElement.scrollWidth,
+ relElement.clientWidth,
+ topDocument.scrollWidth || 0 ) - 1 + 'px',
+ 'height' : Math.max( relElement.scrollHeight,
+ relElement.clientHeight,
+ topDocument.scrollHeight || 0 ) - 1 + 'px'
+ } ) ;
+ }
+
+ return {
+ /**
+ * Opens a dialog window using the standard dialog template.
+ */
+ OpenDialog : function( dialogName, dialogTitle, dialogPage, width, height, customValue, parentWindow, resizable )
+ {
+ if ( !topDialog )
+ this.DisplayMainCover() ;
+
+ // Setup the dialog info to be passed to the dialog.
+ var dialogInfo =
+ {
+ Title : dialogTitle,
+ Page : dialogPage,
+ Editor : window,
+ CustomValue : customValue, // Optional
+ TopWindow : topWindow
+ }
+
+ FCK.ToolbarSet.CurrentInstance.Selection.Save() ;
+
+ // Calculate the dialog position, centering it on the screen.
+ var viewSize = FCKTools.GetViewPaneSize( topWindow ) ;
+ var scrollPosition = { 'X' : 0, 'Y' : 0 } ;
+ var useAbsolutePosition = FCKBrowserInfo.IsIE && ( !FCKBrowserInfo.IsIE7 || !FCKTools.IsStrictMode( topWindow.document ) ) ;
+ if ( useAbsolutePosition )
+ scrollPosition = FCKTools.GetScrollPosition( topWindow ) ;
+ var iTop = Math.max( scrollPosition.Y + ( viewSize.Height - height - 20 ) / 2, 0 ) ;
+ var iLeft = Math.max( scrollPosition.X + ( viewSize.Width - width - 20 ) / 2, 0 ) ;
+
+ // Setup the IFRAME that will hold the dialog.
+ var dialog = topDocument.createElement( 'iframe' ) ;
+ FCKTools.ResetStyles( dialog ) ;
+ dialog.src = FCKConfig.BasePath + 'fckdialog.html' ;
+
+ // Dummy URL for testing whether the code in fckdialog.js alone leaks memory.
+ // dialog.src = 'about:blank';
+
+ dialog.frameBorder = 0 ;
+ dialog.allowTransparency = true ;
+ FCKDomTools.SetElementStyles( dialog,
+ {
+ 'position' : ( useAbsolutePosition ) ? 'absolute' : 'fixed',
+ 'top' : iTop + 'px',
+ 'left' : iLeft + 'px',
+ 'width' : width + 'px',
+ 'height' : height + 'px',
+ 'zIndex' : getZIndex()
+ } ) ;
+
+ // Save the dialog info to be used by the dialog page once loaded.
+ dialog._DialogArguments = dialogInfo ;
+
+ // Append the IFRAME to the target document.
+ topDocument.body.appendChild( dialog ) ;
+
+ // Keep record of the dialog's parent/child relationships.
+ dialog._ParentDialog = topDialog ;
+ topDialog = dialog ;
+ },
+
+ /**
+ * (For internal use)
+ * Called when the top dialog is closed.
+ */
+ OnDialogClose : function( dialogWindow )
+ {
+ var dialog = dialogWindow.frameElement ;
+ FCKDomTools.RemoveNode( dialog ) ;
+
+ if ( dialog._ParentDialog ) // Nested Dialog.
+ {
+ topDialog = dialog._ParentDialog ;
+ dialog._ParentDialog.contentWindow.SetEnabled( true ) ;
+ }
+ else // First Dialog.
+ {
+ // Set the Focus in the browser, so the "OnBlur" event is not
+ // fired. In IE, there is no need to do that because the dialog
+ // already moved the selection to the editing area before
+ // closing (EnsureSelection). Also, the Focus() call here
+ // causes memory leak on IE7 (weird).
+ if ( !FCKBrowserInfo.IsIE )
+ FCK.Focus() ;
+
+ this.HideMainCover() ;
+ // Bug #1918: Assigning topDialog = null directly causes IE6 to crash.
+ setTimeout( function(){ topDialog = null ; }, 0 ) ;
+
+ // Release the previously saved selection.
+ FCK.ToolbarSet.CurrentInstance.Selection.Release() ;
+ }
+ },
+
+ DisplayMainCover : function()
+ {
+ // Setup the DIV that will be used to cover.
+ cover = topDocument.createElement( 'div' ) ;
+ FCKTools.ResetStyles( cover ) ;
+ FCKDomTools.SetElementStyles( cover,
+ {
+ 'position' : 'absolute',
+ 'zIndex' : getZIndex(),
+ 'top' : '0px',
+ 'left' : '0px',
+ 'backgroundColor' : FCKConfig.BackgroundBlockerColor
+ } ) ;
+ FCKDomTools.SetOpacity( cover, FCKConfig.BackgroundBlockerOpacity ) ;
+
+ // For IE6-, we need to fill the cover with a transparent IFRAME,
+ // to properly block <select> fields.
+ if ( FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsIE7 )
+ {
+ var iframe = topDocument.createElement( 'iframe' ) ;
+ FCKTools.ResetStyles( iframe ) ;
+ iframe.hideFocus = true ;
+ iframe.frameBorder = 0 ;
+ iframe.src = FCKTools.GetVoidUrl() ;
+ FCKDomTools.SetElementStyles( iframe,
+ {
+ 'width' : '100%',
+ 'height' : '100%',
+ 'position' : 'absolute',
+ 'left' : '0px',
+ 'top' : '0px',
+ 'filter' : 'progid:DXImageTransform.Microsoft.Alpha(opacity=0)'
+ } ) ;
+ cover.appendChild( iframe ) ;
+ }
+
+ // We need to manually adjust the cover size on resize.
+ FCKTools.AddEventListener( topWindow, 'resize', resizeHandler ) ;
+ resizeHandler() ;
+
+ topDocument.body.appendChild( cover ) ;
+
+ FCKFocusManager.Lock() ;
+
+ // Prevent the user from refocusing the disabled
+ // editing window by pressing Tab. (Bug #2065)
+ var el = FCK.ToolbarSet.CurrentInstance.GetInstanceObject( 'frameElement' ) ;
+ el._fck_originalTabIndex = el.tabIndex ;
+ el.tabIndex = -1 ;
+ },
+
+ HideMainCover : function()
+ {
+ FCKDomTools.RemoveNode( cover ) ;
+ FCKFocusManager.Unlock() ;
+
+ // Revert the tab index hack. (Bug #2065)
+ var el = FCK.ToolbarSet.CurrentInstance.GetInstanceObject( 'frameElement' ) ;
+ el.tabIndex = el._fck_originalTabIndex ;
+ FCKDomTools.ClearElementJSProperty( el, '_fck_originalTabIndex' ) ;
+ },
+
+ GetCover : function()
+ {
+ return cover ;
+ }
+ } ;
+} )() ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckdocumentprocessor.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckdocumentprocessor.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,270 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Advanced document processors.
+ */
+
+var FCKDocumentProcessor = new Object() ;
+FCKDocumentProcessor._Items = new Array() ;
+
+FCKDocumentProcessor.AppendNew = function()
+{
+ var oNewItem = new Object() ;
+ this._Items.AddItem( oNewItem ) ;
+ return oNewItem ;
+}
+
+FCKDocumentProcessor.Process = function( document )
+{
+ var bIsDirty = FCK.IsDirty() ;
+ var oProcessor, i = 0 ;
+ while( ( oProcessor = this._Items[i++] ) )
+ oProcessor.ProcessDocument( document ) ;
+ if ( !bIsDirty )
+ FCK.ResetIsDirty() ;
+}
+
+var FCKDocumentProcessor_CreateFakeImage = function( fakeClass, realElement )
+{
+ var oImg = FCKTools.GetElementDocument( realElement ).createElement( 'IMG' ) ;
+ oImg.className = fakeClass ;
+ oImg.src = FCKConfig.BasePath + 'images/spacer.gif' ;
+ oImg.setAttribute( '_fckfakelement', 'true', 0 ) ;
+ oImg.setAttribute( '_fckrealelement', FCKTempBin.AddElement( realElement ), 0 ) ;
+ return oImg ;
+}
+
+// Link Anchors
+if ( FCKBrowserInfo.IsIE || FCKBrowserInfo.IsOpera )
+{
+ var FCKAnchorsProcessor = FCKDocumentProcessor.AppendNew() ;
+ FCKAnchorsProcessor.ProcessDocument = function( document )
+ {
+ var aLinks = document.getElementsByTagName( 'A' ) ;
+
+ var oLink ;
+ var i = aLinks.length - 1 ;
+ while ( i >= 0 && ( oLink = aLinks[i--] ) )
+ {
+ // If it is anchor. Doesn't matter if it's also a link (even better: we show that it's both a link and an anchor)
+ if ( oLink.name.length > 0 )
+ {
+ //if the anchor has some content then we just add a temporary class
+ if ( oLink.innerHTML !== '' )
+ {
+ if ( FCKBrowserInfo.IsIE )
+ oLink.className += ' FCK__AnchorC' ;
+ }
+ else
+ {
+ var oImg = FCKDocumentProcessor_CreateFakeImage( 'FCK__Anchor', oLink.cloneNode(true) ) ;
+ oImg.setAttribute( '_fckanchor', 'true', 0 ) ;
+
+ oLink.parentNode.insertBefore( oImg, oLink ) ;
+ oLink.parentNode.removeChild( oLink ) ;
+ }
+ }
+ }
+ }
+}
+
+// Page Breaks
+var FCKPageBreaksProcessor = FCKDocumentProcessor.AppendNew() ;
+FCKPageBreaksProcessor.ProcessDocument = function( document )
+{
+ var aDIVs = document.getElementsByTagName( 'DIV' ) ;
+
+ var eDIV ;
+ var i = aDIVs.length - 1 ;
+ while ( i >= 0 && ( eDIV = aDIVs[i--] ) )
+ {
+ if ( eDIV.style.pageBreakAfter == 'always' && eDIV.childNodes.length == 1 && eDIV.childNodes[0].style && eDIV.childNodes[0].style.display == 'none' )
+ {
+ var oFakeImage = FCKDocumentProcessor_CreateFakeImage( 'FCK__PageBreak', eDIV.cloneNode(true) ) ;
+
+ eDIV.parentNode.insertBefore( oFakeImage, eDIV ) ;
+ eDIV.parentNode.removeChild( eDIV ) ;
+ }
+ }
+/*
+ var aCenters = document.getElementsByTagName( 'CENTER' ) ;
+
+ var oCenter ;
+ var i = aCenters.length - 1 ;
+ while ( i >= 0 && ( oCenter = aCenters[i--] ) )
+ {
+ if ( oCenter.style.pageBreakAfter == 'always' && oCenter.innerHTML.Trim().length == 0 )
+ {
+ var oFakeImage = FCKDocumentProcessor_CreateFakeImage( 'FCK__PageBreak', oCenter.cloneNode(true) ) ;
+
+ oCenter.parentNode.insertBefore( oFakeImage, oCenter ) ;
+ oCenter.parentNode.removeChild( oCenter ) ;
+ }
+ }
+*/
+}
+
+// EMBED and OBJECT tags.
+FCKEmbedAndObjectProcessor = (function()
+{
+ var customProcessors = [] ;
+
+ var processElement = function( el )
+ {
+ var clone = el.cloneNode( true ) ;
+ var replaceElement ;
+ var fakeImg = replaceElement = FCKDocumentProcessor_CreateFakeImage( 'FCK__UnknownObject', clone ) ;
+ FCKEmbedAndObjectProcessor.RefreshView( fakeImg, el ) ;
+
+ for ( var i = 0 ; i < customProcessors.length ; i++ )
+ replaceElement = customProcessors[i]( el, replaceElement ) || replaceElement ;
+
+ if ( replaceElement != fakeImg )
+ FCKTempBin.RemoveElement( fakeImg.getAttribute( '_fckrealelement' ) ) ;
+
+ el.parentNode.replaceChild( replaceElement, el ) ;
+ }
+
+ var processElementsByName = function( elementName, doc )
+ {
+ var aObjects = doc.getElementsByTagName( elementName );
+ for ( var i = aObjects.length - 1 ; i >= 0 ; i-- )
+ processElement( aObjects[i] ) ;
+ }
+
+ var processObjectAndEmbed = function( doc )
+ {
+ processElementsByName( 'object', doc );
+ processElementsByName( 'embed', doc );
+ }
+
+ return FCKTools.Merge( FCKDocumentProcessor.AppendNew(),
+ {
+ ProcessDocument : function( doc )
+ {
+ // Firefox 3 would sometimes throw an unknown exception while accessing EMBEDs and OBJECTs
+ // without the setTimeout().
+ if ( FCKBrowserInfo.IsGecko )
+ FCKTools.RunFunction( processObjectAndEmbed, this, [ doc ] ) ;
+ else
+ processObjectAndEmbed( doc ) ;
+ },
+
+ RefreshView : function( placeHolder, original )
+ {
+ if ( original.getAttribute( 'width' ) > 0 )
+ placeHolder.style.width = FCKTools.ConvertHtmlSizeToStyle( original.getAttribute( 'width' ) ) ;
+
+ if ( original.getAttribute( 'height' ) > 0 )
+ placeHolder.style.height = FCKTools.ConvertHtmlSizeToStyle( original.getAttribute( 'height' ) ) ;
+ },
+
+ AddCustomHandler : function( func )
+ {
+ customProcessors.push( func ) ;
+ }
+ } ) ;
+} )() ;
+
+FCK.GetRealElement = function( fakeElement )
+{
+ var e = FCKTempBin.Elements[ fakeElement.getAttribute('_fckrealelement') ] ;
+
+ if ( fakeElement.getAttribute('_fckflash') )
+ {
+ if ( fakeElement.style.width.length > 0 )
+ e.width = FCKTools.ConvertStyleSizeToHtml( fakeElement.style.width ) ;
+
+ if ( fakeElement.style.height.length > 0 )
+ e.height = FCKTools.ConvertStyleSizeToHtml( fakeElement.style.height ) ;
+ }
+
+ return e ;
+}
+
+// HR Processor.
+// This is a IE only (tricky) thing. We protect all HR tags before loading them
+// (see FCK.ProtectTags). Here we put the HRs back.
+if ( FCKBrowserInfo.IsIE )
+{
+ FCKDocumentProcessor.AppendNew().ProcessDocument = function( document )
+ {
+ var aHRs = document.getElementsByTagName( 'HR' ) ;
+
+ var eHR ;
+ var i = aHRs.length - 1 ;
+ while ( i >= 0 && ( eHR = aHRs[i--] ) )
+ {
+ // Create the replacement HR.
+ var newHR = document.createElement( 'hr' ) ;
+ newHR.mergeAttributes( eHR, true ) ;
+
+ // We must insert the new one after it. insertBefore will not work in all cases.
+ FCKDomTools.InsertAfterNode( eHR, newHR ) ;
+
+ eHR.parentNode.removeChild( eHR ) ;
+ }
+ }
+}
+
+// INPUT:hidden Processor.
+FCKDocumentProcessor.AppendNew().ProcessDocument = function( document )
+{
+ var aInputs = document.getElementsByTagName( 'INPUT' ) ;
+
+ var oInput ;
+ var i = aInputs.length - 1 ;
+ while ( i >= 0 && ( oInput = aInputs[i--] ) )
+ {
+ if ( oInput.type == 'hidden' )
+ {
+ var oImg = FCKDocumentProcessor_CreateFakeImage( 'FCK__InputHidden', oInput.cloneNode(true) ) ;
+ oImg.setAttribute( '_fckinputhidden', 'true', 0 ) ;
+
+ oInput.parentNode.insertBefore( oImg, oInput ) ;
+ oInput.parentNode.removeChild( oInput ) ;
+ }
+ }
+}
+
+// Flash handler.
+FCKEmbedAndObjectProcessor.AddCustomHandler( function( el, fakeImg )
+ {
+ if ( ! ( el.nodeName.IEquals( 'embed' ) && ( el.type == 'application/x-shockwave-flash' || /\.swf($|#|\?)/i.test( el.src ) ) ) )
+ return ;
+ fakeImg.className = 'FCK__Flash' ;
+ fakeImg.setAttribute( '_fckflash', 'true', 0 );
+ } ) ;
+
+// Buggy <span class="Apple-style-span"> tags added by Safari.
+if ( FCKBrowserInfo.IsSafari )
+{
+ FCKDocumentProcessor.AppendNew().ProcessDocument = function( doc )
+ {
+ var spans = doc.getElementsByClassName ?
+ doc.getElementsByClassName( 'Apple-style-span' ) :
+ Array.prototype.filter.call(
+ doc.getElementsByTagName( 'span' ),
+ function( item ){ return item.className == 'Apple-style-span' ; }
+ ) ;
+ for ( var i = spans.length - 1 ; i >= 0 ; i-- )
+ FCKDomTools.RemoveNode( spans[i], true ) ;
+ }
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckdomtools.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckdomtools.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,1057 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Utility functions to work with the DOM.
+ */
+
+var FCKDomTools =
+{
+ /**
+ * Move all child nodes from one node to another.
+ */
+ MoveChildren : function( source, target, toTargetStart )
+ {
+ if ( source == target )
+ return ;
+
+ var eChild ;
+
+ if ( toTargetStart )
+ {
+ while ( (eChild = source.lastChild) )
+ target.insertBefore( source.removeChild( eChild ), target.firstChild ) ;
+ }
+ else
+ {
+ while ( (eChild = source.firstChild) )
+ target.appendChild( source.removeChild( eChild ) ) ;
+ }
+ },
+
+ MoveNode : function( source, target, toTargetStart )
+ {
+ if ( toTargetStart )
+ target.insertBefore( FCKDomTools.RemoveNode( source ), target.firstChild ) ;
+ else
+ target.appendChild( FCKDomTools.RemoveNode( source ) ) ;
+ },
+
+ // Remove blank spaces from the beginning and the end of the contents of a node.
+ TrimNode : function( node )
+ {
+ this.LTrimNode( node ) ;
+ this.RTrimNode( node ) ;
+ },
+
+ LTrimNode : function( node )
+ {
+ var eChildNode ;
+
+ while ( (eChildNode = node.firstChild) )
+ {
+ if ( eChildNode.nodeType == 3 )
+ {
+ var sTrimmed = eChildNode.nodeValue.LTrim() ;
+ var iOriginalLength = eChildNode.nodeValue.length ;
+
+ if ( sTrimmed.length == 0 )
+ {
+ node.removeChild( eChildNode ) ;
+ continue ;
+ }
+ else if ( sTrimmed.length < iOriginalLength )
+ {
+ eChildNode.splitText( iOriginalLength - sTrimmed.length ) ;
+ node.removeChild( node.firstChild ) ;
+ }
+ }
+ break ;
+ }
+ },
+
+ RTrimNode : function( node )
+ {
+ var eChildNode ;
+
+ while ( (eChildNode = node.lastChild) )
+ {
+ if ( eChildNode.nodeType == 3 )
+ {
+ var sTrimmed = eChildNode.nodeValue.RTrim() ;
+ var iOriginalLength = eChildNode.nodeValue.length ;
+
+ if ( sTrimmed.length == 0 )
+ {
+ // If the trimmed text node is empty, just remove it.
+
+ // Use "eChildNode.parentNode" instead of "node" to avoid IE bug (#81).
+ eChildNode.parentNode.removeChild( eChildNode ) ;
+ continue ;
+ }
+ else if ( sTrimmed.length < iOriginalLength )
+ {
+ // If the trimmed text length is less than the original
+ // length, strip all spaces from the end by splitting
+ // the text and removing the resulting useless node.
+
+ eChildNode.splitText( sTrimmed.length ) ;
+ // Use "node.lastChild.parentNode" instead of "node" to avoid IE bug (#81).
+ node.lastChild.parentNode.removeChild( node.lastChild ) ;
+ }
+ }
+ break ;
+ }
+
+ if ( !FCKBrowserInfo.IsIE && !FCKBrowserInfo.IsOpera )
+ {
+ eChildNode = node.lastChild ;
+
+ if ( eChildNode && eChildNode.nodeType == 1 && eChildNode.nodeName.toLowerCase() == 'br' )
+ {
+ // Use "eChildNode.parentNode" instead of "node" to avoid IE bug (#324).
+ eChildNode.parentNode.removeChild( eChildNode ) ;
+ }
+ }
+ },
+
+ RemoveNode : function( node, excludeChildren )
+ {
+ if ( excludeChildren )
+ {
+ // Move all children before the node.
+ var eChild ;
+ while ( (eChild = node.firstChild) )
+ node.parentNode.insertBefore( node.removeChild( eChild ), node ) ;
+ }
+
+ return node.parentNode.removeChild( node ) ;
+ },
+
+ GetFirstChild : function( node, childNames )
+ {
+ // If childNames is a string, transform it in a Array.
+ if ( typeof ( childNames ) == 'string' )
+ childNames = [ childNames ] ;
+
+ var eChild = node.firstChild ;
+ while( eChild )
+ {
+ if ( eChild.nodeType == 1 && eChild.tagName.Equals.apply( eChild.tagName, childNames ) )
+ return eChild ;
+
+ eChild = eChild.nextSibling ;
+ }
+
+ return null ;
+ },
+
+ GetLastChild : function( node, childNames )
+ {
+ // If childNames is a string, transform it in a Array.
+ if ( typeof ( childNames ) == 'string' )
+ childNames = [ childNames ] ;
+
+ var eChild = node.lastChild ;
+ while( eChild )
+ {
+ if ( eChild.nodeType == 1 && ( !childNames || eChild.tagName.Equals( childNames ) ) )
+ return eChild ;
+
+ eChild = eChild.previousSibling ;
+ }
+
+ return null ;
+ },
+
+ /*
+ * Gets the previous element (nodeType=1) in the source order. Returns
+ * "null" If no element is found.
+ * @param {Object} currentNode The node to start searching from.
+ * @param {Boolean} ignoreSpaceTextOnly Sets how text nodes will be
+ * handled. If set to "true", only white spaces text nodes
+ * will be ignored, while non white space text nodes will stop
+ * the search, returning null. If "false" or omitted, all
+ * text nodes are ignored.
+ * @param {string[]} stopSearchElements An array of element names that
+ * will cause the search to stop when found, returning null.
+ * May be omitted (or null).
+ * @param {string[]} ignoreElements An array of element names that
+ * must be ignored during the search.
+ */
+ GetPreviousSourceElement : function( currentNode, ignoreSpaceTextOnly, stopSearchElements, ignoreElements )
+ {
+ if ( !currentNode )
+ return null ;
+
+ if ( stopSearchElements && currentNode.nodeType == 1 && currentNode.nodeName.IEquals( stopSearchElements ) )
+ return null ;
+
+ if ( currentNode.previousSibling )
+ currentNode = currentNode.previousSibling ;
+ else
+ return this.GetPreviousSourceElement( currentNode.parentNode, ignoreSpaceTextOnly, stopSearchElements, ignoreElements ) ;
+
+ while ( currentNode )
+ {
+ if ( currentNode.nodeType == 1 )
+ {
+ if ( stopSearchElements && currentNode.nodeName.IEquals( stopSearchElements ) )
+ break ;
+
+ if ( !ignoreElements || !currentNode.nodeName.IEquals( ignoreElements ) )
+ return currentNode ;
+ }
+ else if ( ignoreSpaceTextOnly && currentNode.nodeType == 3 && currentNode.nodeValue.RTrim().length > 0 )
+ break ;
+
+ if ( currentNode.lastChild )
+ currentNode = currentNode.lastChild ;
+ else
+ return this.GetPreviousSourceElement( currentNode, ignoreSpaceTextOnly, stopSearchElements, ignoreElements ) ;
+ }
+
+ return null ;
+ },
+
+ /*
+ * Gets the next element (nodeType=1) in the source order. Returns
+ * "null" If no element is found.
+ * @param {Object} currentNode The node to start searching from.
+ * @param {Boolean} ignoreSpaceTextOnly Sets how text nodes will be
+ * handled. If set to "true", only white spaces text nodes
+ * will be ignored, while non white space text nodes will stop
+ * the search, returning null. If "false" or omitted, all
+ * text nodes are ignored.
+ * @param {string[]} stopSearchElements An array of element names that
+ * will cause the search to stop when found, returning null.
+ * May be omitted (or null).
+ * @param {string[]} ignoreElements An array of element names that
+ * must be ignored during the search.
+ */
+ GetNextSourceElement : function( currentNode, ignoreSpaceTextOnly, stopSearchElements, ignoreElements, startFromSibling )
+ {
+ while( ( currentNode = this.GetNextSourceNode( currentNode, startFromSibling ) ) ) // Only one "=".
+ {
+ if ( currentNode.nodeType == 1 )
+ {
+ if ( stopSearchElements && currentNode.nodeName.IEquals( stopSearchElements ) )
+ break ;
+
+ if ( ignoreElements && currentNode.nodeName.IEquals( ignoreElements ) )
+ return this.GetNextSourceElement( currentNode, ignoreSpaceTextOnly, stopSearchElements, ignoreElements ) ;
+
+ return currentNode ;
+ }
+ else if ( ignoreSpaceTextOnly && currentNode.nodeType == 3 && currentNode.nodeValue.RTrim().length > 0 )
+ break ;
+ }
+
+ return null ;
+ },
+
+ /*
+ * Get the next DOM node available in source order.
+ */
+ GetNextSourceNode : function( currentNode, startFromSibling, nodeType, stopSearchNode )
+ {
+ if ( !currentNode )
+ return null ;
+
+ var node ;
+
+ if ( !startFromSibling && currentNode.firstChild )
+ node = currentNode.firstChild ;
+ else
+ {
+ if ( stopSearchNode && currentNode == stopSearchNode )
+ return null ;
+
+ node = currentNode.nextSibling ;
+
+ if ( !node && ( !stopSearchNode || stopSearchNode != currentNode.parentNode ) )
+ return this.GetNextSourceNode( currentNode.parentNode, true, nodeType, stopSearchNode ) ;
+ }
+
+ if ( nodeType && node && node.nodeType != nodeType )
+ return this.GetNextSourceNode( node, false, nodeType, stopSearchNode ) ;
+
+ return node ;
+ },
+
+ /*
+ * Get the next DOM node available in source order.
+ */
+ GetPreviousSourceNode : function( currentNode, startFromSibling, nodeType, stopSearchNode )
+ {
+ if ( !currentNode )
+ return null ;
+
+ var node ;
+
+ if ( !startFromSibling && currentNode.lastChild )
+ node = currentNode.lastChild ;
+ else
+ {
+ if ( stopSearchNode && currentNode == stopSearchNode )
+ return null ;
+
+ node = currentNode.previousSibling ;
+
+ if ( !node && ( !stopSearchNode || stopSearchNode != currentNode.parentNode ) )
+ return this.GetPreviousSourceNode( currentNode.parentNode, true, nodeType, stopSearchNode ) ;
+ }
+
+ if ( nodeType && node && node.nodeType != nodeType )
+ return this.GetPreviousSourceNode( node, false, nodeType, stopSearchNode ) ;
+
+ return node ;
+ },
+
+ // Inserts a element after a existing one.
+ InsertAfterNode : function( existingNode, newNode )
+ {
+ return existingNode.parentNode.insertBefore( newNode, existingNode.nextSibling ) ;
+ },
+
+ GetParents : function( node )
+ {
+ var parents = new Array() ;
+
+ while ( node )
+ {
+ parents.unshift( node ) ;
+ node = node.parentNode ;
+ }
+
+ return parents ;
+ },
+
+ GetCommonParents : function( node1, node2 )
+ {
+ var p1 = this.GetParents( node1 ) ;
+ var p2 = this.GetParents( node2 ) ;
+ var retval = [] ;
+ for ( var i = 0 ; i < p1.length ; i++ )
+ {
+ if ( p1[i] == p2[i] )
+ retval.push( p1[i] ) ;
+ }
+ return retval ;
+ },
+
+ GetCommonParentNode : function( node1, node2, tagList )
+ {
+ var tagMap = {} ;
+ if ( ! tagList.pop )
+ tagList = [ tagList ] ;
+ while ( tagList.length > 0 )
+ tagMap[tagList.pop().toLowerCase()] = 1 ;
+
+ var commonParents = this.GetCommonParents( node1, node2 ) ;
+ var currentParent = null ;
+ while ( ( currentParent = commonParents.pop() ) )
+ {
+ if ( tagMap[currentParent.nodeName.toLowerCase()] )
+ return currentParent ;
+ }
+ return null ;
+ },
+
+ GetIndexOf : function( node )
+ {
+ var currentNode = node.parentNode ? node.parentNode.firstChild : null ;
+ var currentIndex = -1 ;
+
+ while ( currentNode )
+ {
+ currentIndex++ ;
+
+ if ( currentNode == node )
+ return currentIndex ;
+
+ currentNode = currentNode.nextSibling ;
+ }
+
+ return -1 ;
+ },
+
+ PaddingNode : null,
+
+ EnforcePaddingNode : function( doc, tagName )
+ {
+ // In IE it can happen when the page is reloaded that doc or doc.body is null, so exit here
+ try
+ {
+ if ( !doc || !doc.body )
+ return ;
+ }
+ catch (e)
+ {
+ return ;
+ }
+
+ this.CheckAndRemovePaddingNode( doc, tagName, true ) ;
+ try
+ {
+ if ( doc.body.lastChild && ( doc.body.lastChild.nodeType != 1
+ || doc.body.lastChild.tagName.toLowerCase() == tagName.toLowerCase() ) )
+ return ;
+ }
+ catch (e)
+ {
+ return ;
+ }
+
+ var node = doc.createElement( tagName ) ;
+ if ( FCKBrowserInfo.IsGecko && FCKListsLib.NonEmptyBlockElements[ tagName ] )
+ FCKTools.AppendBogusBr( node ) ;
+ this.PaddingNode = node ;
+ if ( doc.body.childNodes.length == 1
+ && doc.body.firstChild.nodeType == 1
+ && doc.body.firstChild.tagName.toLowerCase() == 'br'
+ && ( doc.body.firstChild.getAttribute( '_moz_dirty' ) != null
+ || doc.body.firstChild.getAttribute( 'type' ) == '_moz' ) )
+ doc.body.replaceChild( node, doc.body.firstChild ) ;
+ else
+ doc.body.appendChild( node ) ;
+ },
+
+ CheckAndRemovePaddingNode : function( doc, tagName, dontRemove )
+ {
+ var paddingNode = this.PaddingNode ;
+ if ( ! paddingNode )
+ return ;
+
+ // If the padding node is changed, remove its status as a padding node.
+ try
+ {
+ if ( paddingNode.parentNode != doc.body
+ || paddingNode.tagName.toLowerCase() != tagName
+ || ( paddingNode.childNodes.length > 1 )
+ || ( paddingNode.firstChild && paddingNode.firstChild.nodeValue != '\xa0'
+ && String(paddingNode.firstChild.tagName).toLowerCase() != 'br' ) )
+ {
+ this.PaddingNode = null ;
+ return ;
+ }
+ }
+ catch (e)
+ {
+ this.PaddingNode = null ;
+ return ;
+ }
+
+ // Now we're sure the padding node exists, and it is unchanged, and it
+ // isn't the only node in doc.body, remove it.
+ if ( !dontRemove )
+ {
+ if ( paddingNode.parentNode.childNodes.length > 1 )
+ paddingNode.parentNode.removeChild( paddingNode ) ;
+ this.PaddingNode = null ;
+ }
+ },
+
+ HasAttribute : function( element, attributeName )
+ {
+ if ( element.hasAttribute )
+ return element.hasAttribute( attributeName ) ;
+ else
+ {
+ var att = element.attributes[ attributeName ] ;
+ return ( att != undefined && att.specified ) ;
+ }
+ },
+
+ /**
+ * Checks if an element has "specified" attributes.
+ */
+ HasAttributes : function( element )
+ {
+ var attributes = element.attributes ;
+
+ for ( var i = 0 ; i < attributes.length ; i++ )
+ {
+ if ( FCKBrowserInfo.IsIE && attributes[i].nodeName == 'class' )
+ {
+ // IE has a strange bug. If calling removeAttribute('className'),
+ // the attributes collection will still contain the "class"
+ // attribute, which will be marked as "specified", even if the
+ // outerHTML of the element is not displaying the class attribute.
+ // Note : I was not able to reproduce it outside the editor,
+ // but I've faced it while working on the TC of #1391.
+ if ( element.className.length > 0 )
+ return true ;
+ }
+ else if ( attributes[i].specified )
+ return true ;
+ }
+
+ return false ;
+ },
+
+ /**
+ * Remove an attribute from an element.
+ */
+ RemoveAttribute : function( element, attributeName )
+ {
+ if ( FCKBrowserInfo.IsIE && attributeName.toLowerCase() == 'class' )
+ attributeName = 'className' ;
+
+ return element.removeAttribute( attributeName, 0 ) ;
+ },
+
+ /**
+ * Removes an array of attributes from an element
+ */
+ RemoveAttributes : function (element, aAttributes )
+ {
+ for ( var i = 0 ; i < aAttributes.length ; i++ )
+ this.RemoveAttribute( element, aAttributes[i] );
+ },
+
+ GetAttributeValue : function( element, att )
+ {
+ var attName = att ;
+
+ if ( typeof att == 'string' )
+ att = element.attributes[ att ] ;
+ else
+ attName = att.nodeName ;
+
+ if ( att && att.specified )
+ {
+ // IE returns "null" for the nodeValue of a "style" attribute.
+ if ( attName == 'style' )
+ return element.style.cssText ;
+ // There are two cases when the nodeValue must be used:
+ // - for the "class" attribute (all browsers).
+ // - for events attributes (IE only).
+ else if ( attName == 'class' || attName.indexOf('on') == 0 )
+ return att.nodeValue ;
+ else
+ {
+ // Use getAttribute to get its value exactly as it is
+ // defined.
+ return element.getAttribute( attName, 2 ) ;
+ }
+ }
+ return null ;
+ },
+
+ /**
+ * Checks whether one element contains the other.
+ */
+ Contains : function( mainElement, otherElement )
+ {
+ // IE supports contains, but only for element nodes.
+ if ( mainElement.contains && otherElement.nodeType == 1 )
+ return mainElement.contains( otherElement ) ;
+
+ while ( ( otherElement = otherElement.parentNode ) ) // Only one "="
+ {
+ if ( otherElement == mainElement )
+ return true ;
+ }
+ return false ;
+ },
+
+ /**
+ * Breaks a parent element in the position of one of its contained elements.
+ * For example, in the following case:
+ * <b>This <i>is some<span /> sample</i> test text</b>
+ * If element = <span />, we have these results:
+ * <b>This <i>is some</i><span /><i> sample</i> test text</b> (If parent = <i>)
+ * <b>This <i>is some</i></b><span /><b><i> sample</i> test text</b> (If parent = <b>)
+ */
+ BreakParent : function( element, parent, reusableRange )
+ {
+ var range = reusableRange || new FCKDomRange( FCKTools.GetElementWindow( element ) ) ;
+
+ // We'll be extracting part of this element, so let's use our
+ // range to get the correct piece.
+ range.SetStart( element, 4 ) ;
+ range.SetEnd( parent, 4 ) ;
+
+ // Extract it.
+ var docFrag = range.ExtractContents() ;
+
+ // Move the element outside the broken element.
+ range.InsertNode( element.parentNode.removeChild( element ) ) ;
+
+ // Re-insert the extracted piece after the element.
+ docFrag.InsertAfterNode( element ) ;
+
+ range.Release( !!reusableRange ) ;
+ },
+
+ /**
+ * Retrieves a uniquely identifiable tree address of a DOM tree node.
+ * The tree address returns is an array of integers, with each integer
+ * indicating a child index from a DOM tree node, starting from
+ * document.documentElement.
+ *
+ * For example, assuming <body> is the second child from <html> (<head>
+ * being the first), and we'd like to address the third child under the
+ * fourth child of body, the tree address returned would be:
+ * [1, 3, 2]
+ *
+ * The tree address cannot be used for finding back the DOM tree node once
+ * the DOM tree structure has been modified.
+ */
+ GetNodeAddress : function( node, normalized )
+ {
+ var retval = [] ;
+ while ( node && node != FCKTools.GetElementDocument( node ).documentElement )
+ {
+ var parentNode = node.parentNode ;
+ var currentIndex = -1 ;
+ for( var i = 0 ; i < parentNode.childNodes.length ; i++ )
+ {
+ var candidate = parentNode.childNodes[i] ;
+ if ( normalized === true &&
+ candidate.nodeType == 3 &&
+ candidate.previousSibling &&
+ candidate.previousSibling.nodeType == 3 )
+ continue;
+ currentIndex++ ;
+ if ( parentNode.childNodes[i] == node )
+ break ;
+ }
+ retval.unshift( currentIndex ) ;
+ node = node.parentNode ;
+ }
+ return retval ;
+ },
+
+ /**
+ * The reverse transformation of FCKDomTools.GetNodeAddress(). This
+ * function returns the DOM node pointed to by its index address.
+ */
+ GetNodeFromAddress : function( doc, addr, normalized )
+ {
+ var cursor = doc.documentElement ;
+ for ( var i = 0 ; i < addr.length ; i++ )
+ {
+ var target = addr[i] ;
+ if ( ! normalized )
+ {
+ cursor = cursor.childNodes[target] ;
+ continue ;
+ }
+
+ var currentIndex = -1 ;
+ for (var j = 0 ; j < cursor.childNodes.length ; j++ )
+ {
+ var candidate = cursor.childNodes[j] ;
+ if ( normalized === true &&
+ candidate.nodeType == 3 &&
+ candidate.previousSibling &&
+ candidate.previousSibling.nodeType == 3 )
+ continue ;
+ currentIndex++ ;
+ if ( currentIndex == target )
+ {
+ cursor = candidate ;
+ break ;
+ }
+ }
+ }
+ return cursor ;
+ },
+
+ CloneElement : function( element )
+ {
+ element = element.cloneNode( false ) ;
+
+ // The "id" attribute should never be cloned to avoid duplication.
+ element.removeAttribute( 'id', false ) ;
+
+ return element ;
+ },
+
+ ClearElementJSProperty : function( element, attrName )
+ {
+ if ( FCKBrowserInfo.IsIE )
+ element.removeAttribute( attrName ) ;
+ else
+ delete element[attrName] ;
+ },
+
+ SetElementMarker : function ( markerObj, element, attrName, value)
+ {
+ var id = String( parseInt( Math.random() * 0xffffffff, 10 ) ) ;
+ element._FCKMarkerId = id ;
+ element[attrName] = value ;
+ if ( ! markerObj[id] )
+ markerObj[id] = { 'element' : element, 'markers' : {} } ;
+ markerObj[id]['markers'][attrName] = value ;
+ },
+
+ ClearElementMarkers : function( markerObj, element, clearMarkerObj )
+ {
+ var id = element._FCKMarkerId ;
+ if ( ! id )
+ return ;
+ this.ClearElementJSProperty( element, '_FCKMarkerId' ) ;
+ for ( var j in markerObj[id]['markers'] )
+ this.ClearElementJSProperty( element, j ) ;
+ if ( clearMarkerObj )
+ delete markerObj[id] ;
+ },
+
+ ClearAllMarkers : function( markerObj )
+ {
+ for ( var i in markerObj )
+ this.ClearElementMarkers( markerObj, markerObj[i]['element'], true ) ;
+ },
+
+ /**
+ * Convert a DOM list tree into a data structure that is easier to
+ * manipulate. This operation should be non-intrusive in the sense that it
+ * does not change the DOM tree, with the exception that it may add some
+ * markers to the list item nodes when markerObj is specified.
+ */
+ ListToArray : function( listNode, markerObj, baseArray, baseIndentLevel, grandparentNode )
+ {
+ if ( ! listNode.nodeName.IEquals( ['ul', 'ol'] ) )
+ return [] ;
+
+ if ( ! baseIndentLevel )
+ baseIndentLevel = 0 ;
+ if ( ! baseArray )
+ baseArray = [] ;
+ // Iterate over all list items to get their contents and look for inner lists.
+ for ( var i = 0 ; i < listNode.childNodes.length ; i++ )
+ {
+ var listItem = listNode.childNodes[i] ;
+ if ( ! listItem.nodeName.IEquals( 'li' ) )
+ continue ;
+ var itemObj = { 'parent' : listNode, 'indent' : baseIndentLevel, 'contents' : [] } ;
+ if ( ! grandparentNode )
+ {
+ itemObj.grandparent = listNode.parentNode ;
+ if ( itemObj.grandparent && itemObj.grandparent.nodeName.IEquals( 'li' ) )
+ itemObj.grandparent = itemObj.grandparent.parentNode ;
+ }
+ else
+ itemObj.grandparent = grandparentNode ;
+ if ( markerObj )
+ this.SetElementMarker( markerObj, listItem, '_FCK_ListArray_Index', baseArray.length ) ;
+ baseArray.push( itemObj ) ;
+ for ( var j = 0 ; j < listItem.childNodes.length ; j++ )
+ {
+ var child = listItem.childNodes[j] ;
+ if ( child.nodeName.IEquals( ['ul', 'ol'] ) )
+ // Note the recursion here, it pushes inner list items with
+ // +1 indentation in the correct order.
+ this.ListToArray( child, markerObj, baseArray, baseIndentLevel + 1, itemObj.grandparent ) ;
+ else
+ itemObj.contents.push( child ) ;
+ }
+ }
+ return baseArray ;
+ },
+
+ // Convert our internal representation of a list back to a DOM forest.
+ ArrayToList : function( listArray, markerObj, baseIndex )
+ {
+ if ( baseIndex == undefined )
+ baseIndex = 0 ;
+ if ( ! listArray || listArray.length < baseIndex + 1 )
+ return null ;
+ var doc = FCKTools.GetElementDocument( listArray[baseIndex].parent ) ;
+ var retval = doc.createDocumentFragment() ;
+ var rootNode = null ;
+ var currentIndex = baseIndex ;
+ var indentLevel = Math.max( listArray[baseIndex].indent, 0 ) ;
+ var currentListItem = null ;
+ while ( true )
+ {
+ var item = listArray[currentIndex] ;
+ if ( item.indent == indentLevel )
+ {
+ if ( ! rootNode || listArray[currentIndex].parent.nodeName != rootNode.nodeName )
+ {
+ rootNode = listArray[currentIndex].parent.cloneNode( false ) ;
+ retval.appendChild( rootNode ) ;
+ }
+ currentListItem = doc.createElement( 'li' ) ;
+ rootNode.appendChild( currentListItem ) ;
+ for ( var i = 0 ; i < item.contents.length ; i++ )
+ currentListItem.appendChild( item.contents[i].cloneNode( true ) ) ;
+ currentIndex++ ;
+ }
+ else if ( item.indent == Math.max( indentLevel, 0 ) + 1 )
+ {
+ var listData = this.ArrayToList( listArray, null, currentIndex ) ;
+ currentListItem.appendChild( listData.listNode ) ;
+ currentIndex = listData.nextIndex ;
+ }
+ else if ( item.indent == -1 && baseIndex == 0 && item.grandparent )
+ {
+ var currentListItem ;
+ if ( item.grandparent.nodeName.IEquals( ['ul', 'ol'] ) )
+ currentListItem = doc.createElement( 'li' ) ;
+ else
+ {
+ if ( FCKConfig.EnterMode.IEquals( ['div', 'p'] ) && ! item.grandparent.nodeName.IEquals( 'td' ) )
+ currentListItem = doc.createElement( FCKConfig.EnterMode ) ;
+ else
+ currentListItem = doc.createDocumentFragment() ;
+ }
+ for ( var i = 0 ; i < item.contents.length ; i++ )
+ currentListItem.appendChild( item.contents[i].cloneNode( true ) ) ;
+ if ( currentListItem.nodeType == 11 )
+ {
+ if ( currentListItem.lastChild &&
+ currentListItem.lastChild.getAttribute &&
+ currentListItem.lastChild.getAttribute( 'type' ) == '_moz' )
+ currentListItem.removeChild( currentListItem.lastChild );
+ currentListItem.appendChild( doc.createElement( 'br' ) ) ;
+ }
+ if ( currentListItem.nodeName.IEquals( FCKConfig.EnterMode ) && currentListItem.firstChild )
+ {
+ this.TrimNode( currentListItem ) ;
+ if ( FCKListsLib.BlockBoundaries[currentListItem.firstChild.nodeName.toLowerCase()] )
+ {
+ var tmp = doc.createDocumentFragment() ;
+ while ( currentListItem.firstChild )
+ tmp.appendChild( currentListItem.removeChild( currentListItem.firstChild ) ) ;
+ currentListItem = tmp ;
+ }
+ }
+ if ( FCKBrowserInfo.IsGeckoLike && currentListItem.nodeName.IEquals( ['div', 'p'] ) )
+ FCKTools.AppendBogusBr( currentListItem ) ;
+ retval.appendChild( currentListItem ) ;
+ rootNode = null ;
+ currentIndex++ ;
+ }
+ else
+ return null ;
+
+ if ( listArray.length <= currentIndex || Math.max( listArray[currentIndex].indent, 0 ) < indentLevel )
+ {
+ break ;
+ }
+ }
+
+ // Clear marker attributes for the new list tree made of cloned nodes, if any.
+ if ( markerObj )
+ {
+ var currentNode = retval.firstChild ;
+ while ( currentNode )
+ {
+ if ( currentNode.nodeType == 1 )
+ this.ClearElementMarkers( markerObj, currentNode ) ;
+ currentNode = this.GetNextSourceNode( currentNode ) ;
+ }
+ }
+
+ return { 'listNode' : retval, 'nextIndex' : currentIndex } ;
+ },
+
+ /**
+ * Get the next sibling node for a node. If "includeEmpties" is false,
+ * only element or non empty text nodes are returned.
+ */
+ GetNextSibling : function( node, includeEmpties )
+ {
+ node = node.nextSibling ;
+
+ while ( node && !includeEmpties && node.nodeType != 1 && ( node.nodeType != 3 || node.nodeValue.length == 0 ) )
+ node = node.nextSibling ;
+
+ return node ;
+ },
+
+ /**
+ * Get the previous sibling node for a node. If "includeEmpties" is false,
+ * only element or non empty text nodes are returned.
+ */
+ GetPreviousSibling : function( node, includeEmpties )
+ {
+ node = node.previousSibling ;
+
+ while ( node && !includeEmpties && node.nodeType != 1 && ( node.nodeType != 3 || node.nodeValue.length == 0 ) )
+ node = node.previousSibling ;
+
+ return node ;
+ },
+
+ /**
+ * Checks if an element has no "useful" content inside of it
+ * node tree. No "useful" content means empty text node or a signle empty
+ * inline node.
+ * elementCheckCallback may point to a function that returns a boolean
+ * indicating that a child element must be considered in the element check.
+ */
+ CheckIsEmptyElement : function( element, elementCheckCallback )
+ {
+ var child = element.firstChild ;
+ var elementChild ;
+
+ while ( child )
+ {
+ if ( child.nodeType == 1 )
+ {
+ if ( elementChild || !FCKListsLib.InlineNonEmptyElements[ child.nodeName.toLowerCase() ] )
+ return false ;
+
+ if ( !elementCheckCallback || elementCheckCallback( child ) === true )
+ elementChild = child ;
+ }
+ else if ( child.nodeType == 3 && child.nodeValue.length > 0 )
+ return false ;
+
+ child = child.nextSibling ;
+ }
+
+ return elementChild ? this.CheckIsEmptyElement( elementChild, elementCheckCallback ) : true ;
+ },
+
+ SetElementStyles : function( element, styleDict )
+ {
+ var style = element.style ;
+ for ( var styleName in styleDict )
+ style[ styleName ] = styleDict[ styleName ] ;
+ },
+
+ SetOpacity : function( element, opacity )
+ {
+ if ( FCKBrowserInfo.IsIE )
+ {
+ opacity = Math.round( opacity * 100 ) ;
+ element.style.filter = ( opacity > 100 ? '' : 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + opacity + ')' ) ;
+ }
+ else
+ element.style.opacity = opacity ;
+ },
+
+ GetCurrentElementStyle : function( element, propertyName )
+ {
+ if ( FCKBrowserInfo.IsIE )
+ return element.currentStyle[ propertyName ] ;
+ else
+ return element.ownerDocument.defaultView.getComputedStyle( element, '' ).getPropertyValue( propertyName ) ;
+ },
+
+ GetPositionedAncestor : function( element )
+ {
+ var currentElement = element ;
+
+ while ( currentElement != FCKTools.GetElementDocument( currentElement ).documentElement )
+ {
+ if ( this.GetCurrentElementStyle( currentElement, 'position' ) != 'static' )
+ return currentElement ;
+
+ if ( currentElement == FCKTools.GetElementDocument( currentElement ).documentElement
+ && currentWindow != w )
+ currentElement = currentWindow.frameElement ;
+ else
+ currentElement = currentElement.parentNode ;
+ }
+
+ return null ;
+ },
+
+ /**
+ * Current implementation for ScrollIntoView (due to #1462 and #2279). We
+ * don't have a complete implementation here, just the things that fit our
+ * needs.
+ */
+ ScrollIntoView : function( element, alignTop )
+ {
+ // Get the element window.
+ var window = FCKTools.GetElementWindow( element ) ;
+ var windowHeight = FCKTools.GetViewPaneSize( window ).Height ;
+
+ // Starts the offset that will be scrolled with the negative value of
+ // the visible window height.
+ var offset = windowHeight * -1 ;
+
+ // Appends the height it we are about to align the bottoms.
+ if ( alignTop === false )
+ {
+ offset += element.offsetHeight || 0 ;
+
+ // Consider the margin in the scroll, which is ok for our current
+ // needs, but needs investigation if we will be using this function
+ // in other places.
+ offset += parseInt( this.GetCurrentElementStyle( element, 'marginBottom' ) || 0, 10 ) || 0 ;
+ }
+
+ // Appends the offsets for the entire element hierarchy.
+ var elementPosition = FCKTools.GetDocumentPosition( window, element ) ;
+ offset += elementPosition.y ;
+
+ // Scroll the window to the desired position, if not already visible.
+ var currentScroll = FCKTools.GetScrollPosition( window ).Y ;
+ if ( offset > 0 && ( offset > currentScroll || offset < currentScroll - windowHeight ) )
+ window.scrollTo( 0, offset ) ;
+ },
+
+ /**
+ * Check if the element can be edited inside the browser.
+ */
+ CheckIsEditable : function( element )
+ {
+ // Get the element name.
+ var nodeName = element.nodeName.toLowerCase() ;
+
+ // Get the element DTD (defaults to span for unknown elements).
+ var childDTD = FCK.DTD[ nodeName ] || FCK.DTD.span ;
+
+ // In the DTD # == text node.
+ return ( childDTD['#'] && !FCKListsLib.NonEditableElements[ nodeName ] ) ;
+ },
+
+ GetSelectedDivContainers : function()
+ {
+ var currentBlocks = [] ;
+ var range = new FCKDomRange( FCK.EditorWindow ) ;
+ range.MoveToSelection() ;
+
+ var startNode = range.GetTouchedStartNode() ;
+ var endNode = range.GetTouchedEndNode() ;
+ var currentNode = startNode ;
+
+ if ( startNode == endNode )
+ {
+ while ( endNode.nodeType == 1 && endNode.lastChild )
+ endNode = endNode.lastChild ;
+ endNode = FCKDomTools.GetNextSourceNode( endNode ) ;
+ }
+
+ while ( currentNode && currentNode != endNode )
+ {
+ if ( currentNode.nodeType != 3 || !/^[ \t\n]*$/.test( currentNode.nodeValue ) )
+ {
+ var path = new FCKElementPath( currentNode ) ;
+ var blockLimit = path.BlockLimit ;
+ if ( blockLimit && blockLimit.nodeName.IEquals( 'div' ) && currentBlocks.IndexOf( blockLimit ) == -1 )
+ currentBlocks.push( blockLimit ) ;
+ }
+
+ currentNode = FCKDomTools.GetNextSourceNode( currentNode ) ;
+ }
+
+ return currentBlocks ;
+ }
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcklanguagemanager.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcklanguagemanager.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,164 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Defines the FCKLanguageManager object that is used for language
+ * operations.
+ */
+
+var FCKLanguageManager = FCK.Language =
+{
+ AvailableLanguages :
+ {
+ af : 'Afrikaans',
+ ar : 'Arabic',
+ bg : 'Bulgarian',
+ bn : 'Bengali/Bangla',
+ bs : 'Bosnian',
+ ca : 'Catalan',
+ cs : 'Czech',
+ da : 'Danish',
+ de : 'German',
+ el : 'Greek',
+ en : 'English',
+ 'en-au' : 'English (Australia)',
+ 'en-ca' : 'English (Canadian)',
+ 'en-uk' : 'English (United Kingdom)',
+ eo : 'Esperanto',
+ es : 'Spanish',
+ et : 'Estonian',
+ eu : 'Basque',
+ fa : 'Persian',
+ fi : 'Finnish',
+ fo : 'Faroese',
+ fr : 'French',
+ 'fr-ca' : 'French (Canada)',
+ gl : 'Galician',
+ gu : 'Gujarati',
+ he : 'Hebrew',
+ hi : 'Hindi',
+ hr : 'Croatian',
+ hu : 'Hungarian',
+ it : 'Italian',
+ ja : 'Japanese',
+ km : 'Khmer',
+ ko : 'Korean',
+ lt : 'Lithuanian',
+ lv : 'Latvian',
+ mn : 'Mongolian',
+ ms : 'Malay',
+ nb : 'Norwegian Bokmal',
+ nl : 'Dutch',
+ no : 'Norwegian',
+ pl : 'Polish',
+ pt : 'Portuguese (Portugal)',
+ 'pt-br' : 'Portuguese (Brazil)',
+ ro : 'Romanian',
+ ru : 'Russian',
+ sk : 'Slovak',
+ sl : 'Slovenian',
+ sr : 'Serbian (Cyrillic)',
+ 'sr-latn' : 'Serbian (Latin)',
+ sv : 'Swedish',
+ th : 'Thai',
+ tr : 'Turkish',
+ uk : 'Ukrainian',
+ vi : 'Vietnamese',
+ zh : 'Chinese Traditional',
+ 'zh-cn' : 'Chinese Simplified'
+ },
+
+ GetActiveLanguage : function()
+ {
+ if ( FCKConfig.AutoDetectLanguage )
+ {
+ var sUserLang ;
+
+ // IE accepts "navigator.userLanguage" while Gecko "navigator.language".
+ if ( navigator.userLanguage )
+ sUserLang = navigator.userLanguage.toLowerCase() ;
+ else if ( navigator.language )
+ sUserLang = navigator.language.toLowerCase() ;
+ else
+ {
+ // Firefox 1.0 PR has a bug: it doens't support the "language" property.
+ return FCKConfig.DefaultLanguage ;
+ }
+
+ // Some language codes are set in 5 characters,
+ // like "pt-br" for Brazilian Portuguese.
+ if ( sUserLang.length >= 5 )
+ {
+ sUserLang = sUserLang.substr(0,5) ;
+ if ( this.AvailableLanguages[sUserLang] ) return sUserLang ;
+ }
+
+ // If the user's browser is set to, for example, "pt-br" but only the
+ // "pt" language file is available then get that file.
+ if ( sUserLang.length >= 2 )
+ {
+ sUserLang = sUserLang.substr(0,2) ;
+ if ( this.AvailableLanguages[sUserLang] ) return sUserLang ;
+ }
+ }
+
+ return this.DefaultLanguage ;
+ },
+
+ TranslateElements : function( targetDocument, tag, propertyToSet, encode )
+ {
+ var e = targetDocument.getElementsByTagName(tag) ;
+ var sKey, s ;
+ for ( var i = 0 ; i < e.length ; i++ )
+ {
+ // The extra () is to avoid a warning with strict error checking. This is ok.
+ if ( (sKey = e[i].getAttribute( 'fckLang' )) )
+ {
+ // The extra () is to avoid a warning with strict error checking. This is ok.
+ if ( (s = FCKLang[ sKey ]) )
+ {
+ if ( encode )
+ s = FCKTools.HTMLEncode( s ) ;
+ e[i][ propertyToSet ] = s ;
+ }
+ }
+ }
+ },
+
+ TranslatePage : function( targetDocument )
+ {
+ this.TranslateElements( targetDocument, 'INPUT', 'value' ) ;
+ this.TranslateElements( targetDocument, 'SPAN', 'innerHTML' ) ;
+ this.TranslateElements( targetDocument, 'LABEL', 'innerHTML' ) ;
+ this.TranslateElements( targetDocument, 'OPTION', 'innerHTML', true ) ;
+ this.TranslateElements( targetDocument, 'LEGEND', 'innerHTML' ) ;
+ },
+
+ Initialize : function()
+ {
+ if ( this.AvailableLanguages[ FCKConfig.DefaultLanguage ] )
+ this.DefaultLanguage = FCKConfig.DefaultLanguage ;
+ else
+ this.DefaultLanguage = 'en' ;
+
+ this.ActiveLanguage = new Object() ;
+ this.ActiveLanguage.Code = this.GetActiveLanguage() ;
+ this.ActiveLanguage.Name = this.AvailableLanguages[ this.ActiveLanguage.Code ] ;
+ }
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcklisthandler.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcklisthandler.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,152 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Tool object to manage HTML lists items (UL, OL and LI).
+ */
+
+var FCKListHandler =
+{
+ OutdentListItem : function( listItem )
+ {
+ var eParent = listItem.parentNode ;
+
+ // It may happen that a LI is not in a UL or OL (Orphan).
+ if ( eParent.tagName.toUpperCase().Equals( 'UL','OL' ) )
+ {
+ var oDocument = FCKTools.GetElementDocument( listItem ) ;
+ var oDogFrag = new FCKDocumentFragment( oDocument ) ;
+
+ // All children and successive siblings will be moved to a a DocFrag.
+ var eNextSiblings = oDogFrag.RootNode ;
+ var eHasLiSibling = false ;
+
+ // If we have nested lists inside it, let's move it to the list of siblings.
+ var eChildList = FCKDomTools.GetFirstChild( listItem, ['UL','OL'] ) ;
+ if ( eChildList )
+ {
+ eHasLiSibling = true ;
+
+ var eChild ;
+ // The extra () is to avoid a warning with strict error checking. This is ok.
+ while ( (eChild = eChildList.firstChild) )
+ eNextSiblings.appendChild( eChildList.removeChild( eChild ) ) ;
+
+ FCKDomTools.RemoveNode( eChildList ) ;
+ }
+
+ // Move all successive siblings.
+ var eSibling ;
+ var eHasSuccessiveLiSibling = false ;
+ // The extra () is to avoid a warning with strict error checking. This is ok.
+ while ( (eSibling = listItem.nextSibling) )
+ {
+ if ( !eHasLiSibling && eSibling.nodeType == 1 && eSibling.nodeName.toUpperCase() == 'LI' )
+ eHasSuccessiveLiSibling = eHasLiSibling = true ;
+
+ eNextSiblings.appendChild( eSibling.parentNode.removeChild( eSibling ) ) ;
+
+ // If a sibling is a incorrectly nested UL or OL, consider only its children.
+ if ( !eHasSuccessiveLiSibling && eSibling.nodeType == 1 && eSibling.nodeName.toUpperCase().Equals( 'UL','OL' ) )
+ FCKDomTools.RemoveNode( eSibling, true ) ;
+ }
+
+ // If we are in a list chain.
+ var sParentParentTag = eParent.parentNode.tagName.toUpperCase() ;
+ var bWellNested = ( sParentParentTag == 'LI' ) ;
+ if ( bWellNested || sParentParentTag.Equals( 'UL','OL' ) )
+ {
+ if ( eHasLiSibling )
+ {
+ var eChildList = eParent.cloneNode( false ) ;
+ oDogFrag.AppendTo( eChildList ) ;
+ listItem.appendChild( eChildList ) ;
+ }
+ else if ( bWellNested )
+ oDogFrag.InsertAfterNode( eParent.parentNode ) ;
+ else
+ oDogFrag.InsertAfterNode( eParent ) ;
+
+ // Move the LI after its parent.parentNode (the upper LI in the hierarchy).
+ if ( bWellNested )
+ FCKDomTools.InsertAfterNode( eParent.parentNode, eParent.removeChild( listItem ) ) ;
+ else
+ FCKDomTools.InsertAfterNode( eParent, eParent.removeChild( listItem ) ) ;
+ }
+ else
+ {
+ if ( eHasLiSibling )
+ {
+ var eNextList = eParent.cloneNode( false ) ;
+ oDogFrag.AppendTo( eNextList ) ;
+ FCKDomTools.InsertAfterNode( eParent, eNextList ) ;
+ }
+
+ var eBlock = oDocument.createElement( FCKConfig.EnterMode == 'p' ? 'p' : 'div' ) ;
+ FCKDomTools.MoveChildren( eParent.removeChild( listItem ), eBlock ) ;
+ FCKDomTools.InsertAfterNode( eParent, eBlock ) ;
+
+ if ( FCKConfig.EnterMode == 'br' )
+ {
+ // We need the bogus to make it work properly. In Gecko, we
+ // need it before the new block, on IE, after it.
+ if ( FCKBrowserInfo.IsGecko )
+ eBlock.parentNode.insertBefore( FCKTools.CreateBogusBR( oDocument ), eBlock ) ;
+ else
+ FCKDomTools.InsertAfterNode( eBlock, FCKTools.CreateBogusBR( oDocument ) ) ;
+
+ FCKDomTools.RemoveNode( eBlock, true ) ;
+ }
+ }
+
+ if ( this.CheckEmptyList( eParent ) )
+ FCKDomTools.RemoveNode( eParent, true ) ;
+ }
+ },
+
+ CheckEmptyList : function( listElement )
+ {
+ return ( FCKDomTools.GetFirstChild( listElement, 'LI' ) == null ) ;
+ },
+
+ // Check if the list has contents (excluding nested lists).
+ CheckListHasContents : function( listElement )
+ {
+ var eChildNode = listElement.firstChild ;
+
+ while ( eChildNode )
+ {
+ switch ( eChildNode.nodeType )
+ {
+ case 1 :
+ if ( !eChildNode.nodeName.IEquals( 'UL','LI' ) )
+ return true ;
+ break ;
+
+ case 3 :
+ if ( eChildNode.nodeValue.Trim().length > 0 )
+ return true ;
+ }
+
+ eChildNode = eChildNode.nextSibling ;
+ }
+
+ return false ;
+ }
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcklistslib.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcklistslib.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,63 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Library of keys collections.
+ *
+ * Test have shown that check for the existence of a key in an object is the
+ * most efficient list entry check (10x faster that regex). Example:
+ * if ( FCKListsLib.<ListName>[key] != null )
+ */
+
+var FCKListsLib =
+{
+ // We are not handling <ins> and <del> as block elements, for now.
+ BlockElements : { address:1,blockquote:1,center:1,div:1,dl:1,fieldset:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,marquee:1,noscript:1,ol:1,p:1,pre:1,script:1,table:1,ul:1 },
+
+ // Block elements that may be filled with if empty.
+ NonEmptyBlockElements : { p:1,div:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,address:1,pre:1,ol:1,ul:1,li:1,td:1,th:1 },
+
+ // Inline elements which MUST have child nodes.
+ InlineChildReqElements : { abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1 },
+
+ // Inline elements which are not marked as empty "Empty" in the XHTML DTD.
+ InlineNonEmptyElements : { a:1,abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1 },
+
+ // Elements marked as empty "Empty" in the XHTML DTD.
+ EmptyElements : { base:1,col:1,meta:1,link:1,hr:1,br:1,param:1,img:1,area:1,input:1 },
+
+ // Elements that may be considered the "Block boundary" in an element path.
+ PathBlockElements : { address:1,blockquote:1,dl:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,li:1,dt:1,de:1 },
+
+ // Elements that may be considered the "Block limit" in an element path.
+ PathBlockLimitElements : { body:1,div:1,td:1,th:1,caption:1,form:1 },
+
+ // Block elements for the Styles System.
+ StyleBlockElements : { address:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1 },
+
+ // Object elements for the Styles System.
+ StyleObjectElements : { img:1,hr:1,li:1,table:1,tr:1,td:1,embed:1,object:1,ol:1,ul:1 },
+
+ // Elements that accept text nodes, but are not possible to edit in the browser.
+ NonEditableElements : { button:1,option:1,script:1,iframe:1,textarea:1,object:1,embed:1,map:1,applet:1 },
+
+ // Elements used to separate block contents.
+ BlockBoundaries : { p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,address:1,pre:1,ol:1,ul:1,li:1,dt:1,de:1,table:1,thead:1,tbody:1,tfoot:1,tr:1,th:1,td:1,caption:1,col:1,colgroup:1,blockquote:1,body:1 },
+ ListBoundaries : { p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,address:1,pre:1,ol:1,ul:1,li:1,dt:1,de:1,table:1,thead:1,tbody:1,tfoot:1,tr:1,th:1,td:1,caption:1,col:1,colgroup:1,blockquote:1,body:1,br:1 }
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckplugins.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckplugins.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,46 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Defines the FCKPlugins object that is responsible for loading the Plugins.
+ */
+
+var FCKPlugins = FCK.Plugins = new Object() ;
+FCKPlugins.ItemsCount = 0 ;
+FCKPlugins.Items = new Object() ;
+
+FCKPlugins.Load = function()
+{
+ var oItems = FCKPlugins.Items ;
+
+ // build the plugins collection.
+ for ( var i = 0 ; i < FCKConfig.Plugins.Items.length ; i++ )
+ {
+ var oItem = FCKConfig.Plugins.Items[i] ;
+ var oPlugin = oItems[ oItem[0] ] = new FCKPlugin( oItem[0], oItem[1], oItem[2] ) ;
+ FCKPlugins.ItemsCount++ ;
+ }
+
+ // Load all items in the plugins collection.
+ for ( var s in oItems )
+ oItems[s].Load() ;
+
+ // This is a self destroyable function (must be called once).
+ FCKPlugins.Load = null ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckregexlib.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckregexlib.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,100 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * These are some Regular Expressions used by the editor.
+ */
+
+var FCKRegexLib =
+{
+// This is the Regular expression used by the SetData method for the "'" entity.
+AposEntity : /'/gi ,
+
+// Used by the Styles combo to identify styles that can't be applied to text.
+ObjectElements : /^(?:IMG|TABLE|TR|TD|TH|INPUT|SELECT|TEXTAREA|HR|OBJECT|A|UL|OL|LI)$/i ,
+
+// List all named commands (commands that can be interpreted by the browser "execCommand" method.
+NamedCommands : /^(?:Cut|Copy|Paste|Print|SelectAll|RemoveFormat|Unlink|Undo|Redo|Bold|Italic|Underline|StrikeThrough|Subscript|Superscript|JustifyLeft|JustifyCenter|JustifyRight|JustifyFull|Outdent|Indent|InsertOrderedList|InsertUnorderedList|InsertHorizontalRule)$/i ,
+
+BeforeBody : /(^[\s\S]*\<body[^\>]*\>)/i,
+AfterBody : /(\<\/body\>[\s\S]*$)/i,
+
+// Temporary text used to solve some browser specific limitations.
+ToReplace : /___fcktoreplace:([\w]+)/ig ,
+
+// Get the META http-equiv attribute from the tag.
+MetaHttpEquiv : /http-equiv\s*=\s*["']?([^"' ]+)/i ,
+
+HasBaseTag : /<base /i ,
+HasBodyTag : /<body[\s|>]/i ,
+
+HtmlOpener : /<html\s?[^>]*>/i ,
+HeadOpener : /<head\s?[^>]*>/i ,
+HeadCloser : /<\/head\s*>/i ,
+
+// Temporary classes (Tables without border, Anchors with content) used in IE
+FCK_Class : /\s*FCK__[^ ]*(?=\s+|$)/ ,
+
+// Validate element names (it must be in lowercase).
+ElementName : /(^[a-z_:][\w.\-:]*\w$)|(^[a-z_]$)/ ,
+
+// Used in conjunction with the FCKConfig.ForceSimpleAmpersand configuration option.
+ForceSimpleAmpersand : /___FCKAmp___/g ,
+
+// Get the closing parts of the tags with no closing tags, like <br/>... gets the "/>" part.
+SpaceNoClose : /\/>/g ,
+
+// Empty elements may be <p></p> or even a simple opening <p> (see #211).
+EmptyParagraph : /^<(p|div|address|h\d|center)(?=[ >])[^>]*>\s*(<\/\1>)?$/ ,
+
+EmptyOutParagraph : /^<(p|div|address|h\d|center)(?=[ >])[^>]*>(?:\s*| )(<\/\1>)?$/ ,
+
+TagBody : /></ ,
+
+GeckoEntitiesMarker : /#\?-\:/g ,
+
+// We look for the "src" and href attribute with the " or ' or without one of
+// them. We have to do all in one, otherwise we will have problems with URLs
+// like "thumbnail.php?src=someimage.jpg" (SF-BUG 1554141).
+ProtectUrlsImg : /<img(?=\s).*?\ssrc=((?:(?:\s*)("|').*?\2)|(?:[^"'][^ >]+))/gi ,
+ProtectUrlsA : /<a(?=\s).*?\shref=((?:(?:\s*)("|').*?\2)|(?:[^"'][^ >]+))/gi ,
+ProtectUrlsArea : /<area(?=\s).*?\shref=((?:(?:\s*)("|').*?\2)|(?:[^"'][^ >]+))/gi ,
+
+Html4DocType : /HTML 4\.0 Transitional/i ,
+DocTypeTag : /<!DOCTYPE[^>]*>/i ,
+HtmlDocType : /DTD HTML/ ,
+
+// These regex are used to save the original event attributes in the HTML.
+TagsWithEvent : /<[^\>]+ on\w+[\s\r\n]*=[\s\r\n]*?('|")[\s\S]+?\>/g ,
+EventAttributes : /\s(on\w+)[\s\r\n]*=[\s\r\n]*?('|")([\s\S]*?)\2/g,
+ProtectedEvents : /\s\w+_fckprotectedatt="([^"]+)"/g,
+
+StyleProperties : /\S+\s*:/g,
+
+// [a-zA-Z0-9:]+ seams to be more efficient than [\w:]+
+InvalidSelfCloseTags : /(<(?!base|meta|link|hr|br|param|img|area|input)([a-zA-Z0-9:]+)[^>]*)\/>/gi,
+
+// All variables defined in a style attribute or style definition. The variable
+// name is returned with $2.
+StyleVariableAttName : /#\(\s*("|')(.+?)\1[^\)]*\s*\)/g,
+
+RegExp : /^\/(.*)\/([gim]*)$/,
+
+HtmlTag : /<[^\s<>](?:"[^"]*"|'[^']*'|[^<])*>/
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckselection.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckselection.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,42 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Active selection functions.
+ */
+
+var FCKSelection = FCK.Selection =
+{
+ GetParentBlock : function()
+ {
+ var retval = this.GetParentElement() ;
+ while ( retval )
+ {
+ if ( FCKListsLib.BlockBoundaries[retval.nodeName.toLowerCase()] )
+ break ;
+ retval = retval.parentNode ;
+ }
+ return retval ;
+ },
+
+ ApplyStyle : function( styleDefinition )
+ {
+ FCKStyles.ApplyStyle( new FCKStyle( styleDefinition ) ) ;
+ }
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckselection_gecko.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckselection_gecko.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,228 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Active selection functions. (Gecko specific implementation)
+ */
+
+// Get the selection type (like document.select.type in IE).
+FCKSelection.GetType = function()
+{
+ // By default set the type to "Text".
+ var type = 'Text' ;
+
+ // Check if the actual selection is a Control (IMG, TABLE, HR, etc...).
+
+ var sel ;
+ try { sel = this.GetSelection() ; } catch (e) {}
+
+ if ( sel && sel.rangeCount == 1 )
+ {
+ var range = sel.getRangeAt(0) ;
+ if ( range.startContainer == range.endContainer
+ && ( range.endOffset - range.startOffset ) == 1
+ && range.startContainer.nodeType == 1
+ && FCKListsLib.StyleObjectElements[ range.startContainer.childNodes[ range.startOffset ].nodeName.toLowerCase() ] )
+ {
+ type = 'Control' ;
+ }
+ }
+
+ return type ;
+}
+
+// Retrieves the selected element (if any), just in the case that a single
+// element (object like and image or a table) is selected.
+FCKSelection.GetSelectedElement = function()
+{
+ var selection = !!FCK.EditorWindow && this.GetSelection() ;
+ if ( !selection || selection.rangeCount < 1 )
+ return null ;
+
+ var range = selection.getRangeAt( 0 ) ;
+ if ( range.startContainer != range.endContainer || range.startContainer.nodeType != 1 || range.startOffset != range.endOffset - 1 )
+ return null ;
+
+ var node = range.startContainer.childNodes[ range.startOffset ] ;
+ if ( node.nodeType != 1 )
+ return null ;
+
+ return node ;
+}
+
+FCKSelection.GetParentElement = function()
+{
+ if ( this.GetType() == 'Control' )
+ return FCKSelection.GetSelectedElement().parentNode ;
+ else
+ {
+ var oSel = this.GetSelection() ;
+ if ( oSel )
+ {
+ // if anchorNode == focusNode, see if the selection is text only or including nodes.
+ // if text only, return the parent node.
+ // if the selection includes DOM nodes, then the anchorNode is the nearest container.
+ if ( oSel.anchorNode && oSel.anchorNode == oSel.focusNode )
+ {
+ var oRange = oSel.getRangeAt( 0 ) ;
+ if ( oRange.collapsed || oRange.startContainer.nodeType == 3 )
+ return oSel.anchorNode.parentNode ;
+ else
+ return oSel.anchorNode ;
+ }
+
+ // looks like we're having a large selection here. To make the behavior same as IE's TextRange.parentElement(),
+ // we need to find the nearest ancestor node which encapsulates both the beginning and the end of the selection.
+ // TODO: A simpler logic can be found.
+ var anchorPath = new FCKElementPath( oSel.anchorNode ) ;
+ var focusPath = new FCKElementPath( oSel.focusNode ) ;
+ var deepPath = null ;
+ var shallowPath = null ;
+ if ( anchorPath.Elements.length > focusPath.Elements.length )
+ {
+ deepPath = anchorPath.Elements ;
+ shallowPath = focusPath.Elements ;
+ }
+ else
+ {
+ deepPath = focusPath.Elements ;
+ shallowPath = anchorPath.Elements ;
+ }
+
+ var deepPathBase = deepPath.length - shallowPath.length ;
+ for( var i = 0 ; i < shallowPath.length ; i++)
+ {
+ if ( deepPath[deepPathBase + i] == shallowPath[i])
+ return shallowPath[i];
+ }
+ return null ;
+ }
+ }
+ return null ;
+}
+
+FCKSelection.GetBoundaryParentElement = function( startBoundary )
+{
+ if ( ! FCK.EditorWindow )
+ return null ;
+ if ( this.GetType() == 'Control' )
+ return FCKSelection.GetSelectedElement().parentNode ;
+ else
+ {
+ var oSel = this.GetSelection() ;
+ if ( oSel && oSel.rangeCount > 0 )
+ {
+ var range = oSel.getRangeAt( startBoundary ? 0 : ( oSel.rangeCount - 1 ) ) ;
+
+ var element = startBoundary ? range.startContainer : range.endContainer ;
+
+ return ( element.nodeType == 1 ? element : element.parentNode ) ;
+ }
+ }
+ return null ;
+}
+
+FCKSelection.SelectNode = function( element )
+{
+ var oRange = FCK.EditorDocument.createRange() ;
+ oRange.selectNode( element ) ;
+
+ var oSel = this.GetSelection() ;
+ oSel.removeAllRanges() ;
+ oSel.addRange( oRange ) ;
+}
+
+FCKSelection.Collapse = function( toStart )
+{
+ var oSel = this.GetSelection() ;
+
+ if ( toStart == null || toStart === true )
+ oSel.collapseToStart() ;
+ else
+ oSel.collapseToEnd() ;
+}
+
+// The "nodeTagName" parameter must be Upper Case.
+FCKSelection.HasAncestorNode = function( nodeTagName )
+{
+ var oContainer = this.GetSelectedElement() ;
+ if ( ! oContainer && FCK.EditorWindow )
+ {
+ try { oContainer = this.GetSelection().getRangeAt(0).startContainer ; }
+ catch(e){}
+ }
+
+ while ( oContainer )
+ {
+ if ( oContainer.nodeType == 1 && oContainer.nodeName.IEquals( nodeTagName ) ) return true ;
+ oContainer = oContainer.parentNode ;
+ }
+
+ return false ;
+}
+
+// The "nodeTagName" parameter must be Upper Case.
+FCKSelection.MoveToAncestorNode = function( nodeTagName )
+{
+ var oNode ;
+
+ var oContainer = this.GetSelectedElement() ;
+ if ( ! oContainer )
+ oContainer = this.GetSelection().getRangeAt(0).startContainer ;
+
+ while ( oContainer )
+ {
+ if ( oContainer.nodeName.IEquals( nodeTagName ) )
+ return oContainer ;
+
+ oContainer = oContainer.parentNode ;
+ }
+ return null ;
+}
+
+FCKSelection.Delete = function()
+{
+ // Gets the actual selection.
+ var oSel = this.GetSelection() ;
+
+ // Deletes the actual selection contents.
+ for ( var i = 0 ; i < oSel.rangeCount ; i++ )
+ {
+ oSel.getRangeAt(i).deleteContents() ;
+ }
+
+ return oSel ;
+}
+
+/**
+ * Returns the native selection object.
+ */
+FCKSelection.GetSelection = function()
+{
+ return FCK.EditorWindow.getSelection() ;
+}
+
+// The following are IE only features (we don't need then in other browsers
+// currently).
+FCKSelection.Save = function()
+{}
+FCKSelection.Restore = function()
+{}
+FCKSelection.Release = function()
+{}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckselection_ie.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckselection_ie.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,279 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Active selection functions. (IE specific implementation)
+ */
+
+// Get the selection type.
+FCKSelection.GetType = function()
+{
+ // It is possible that we can still get a text range object even when type=='None' is returned by IE.
+ // So we'd better check the object returned by createRange() rather than by looking at the type.
+ try
+ {
+ var ieType = FCKSelection.GetSelection().type ;
+ if ( ieType == 'Control' || ieType == 'Text' )
+ return ieType ;
+
+ if ( this.GetSelection().createRange().parentElement )
+ return 'Text' ;
+ }
+ catch(e)
+ {
+ // Nothing to do, it will return None properly.
+ }
+
+ return 'None' ;
+} ;
+
+// Retrieves the selected element (if any), just in the case that a single
+// element (object like and image or a table) is selected.
+FCKSelection.GetSelectedElement = function()
+{
+ if ( this.GetType() == 'Control' )
+ {
+ var oRange = this.GetSelection().createRange() ;
+
+ if ( oRange && oRange.item )
+ return this.GetSelection().createRange().item(0) ;
+ }
+ return null ;
+} ;
+
+FCKSelection.GetParentElement = function()
+{
+ switch ( this.GetType() )
+ {
+ case 'Control' :
+ var el = FCKSelection.GetSelectedElement() ;
+ return el ? el.parentElement : null ;
+
+ case 'None' :
+ return null ;
+
+ default :
+ return this.GetSelection().createRange().parentElement() ;
+ }
+} ;
+
+FCKSelection.GetBoundaryParentElement = function( startBoundary )
+{
+ switch ( this.GetType() )
+ {
+ case 'Control' :
+ var el = FCKSelection.GetSelectedElement() ;
+ return el ? el.parentElement : null ;
+
+ case 'None' :
+ return null ;
+
+ default :
+ var doc = FCK.EditorDocument ;
+
+ var range = doc.selection.createRange() ;
+ range.collapse( startBoundary !== false ) ;
+
+ var el = range.parentElement() ;
+
+ // It may happen that range is comming from outside "doc", so we
+ // must check it (#1204).
+ return FCKTools.GetElementDocument( el ) == doc ? el : null ;
+ }
+} ;
+
+FCKSelection.SelectNode = function( node )
+{
+ FCK.Focus() ;
+ this.GetSelection().empty() ;
+ var oRange ;
+ try
+ {
+ // Try to select the node as a control.
+ oRange = FCK.EditorDocument.body.createControlRange() ;
+ oRange.addElement( node ) ;
+ }
+ catch(e)
+ {
+ // If failed, select it as a text range.
+ oRange = FCK.EditorDocument.body.createTextRange() ;
+ oRange.moveToElementText( node ) ;
+ }
+
+ oRange.select() ;
+} ;
+
+FCKSelection.Collapse = function( toStart )
+{
+ FCK.Focus() ;
+ if ( this.GetType() == 'Text' )
+ {
+ var oRange = this.GetSelection().createRange() ;
+ oRange.collapse( toStart == null || toStart === true ) ;
+ oRange.select() ;
+ }
+} ;
+
+// The "nodeTagName" parameter must be Upper Case.
+FCKSelection.HasAncestorNode = function( nodeTagName )
+{
+ var oContainer ;
+
+ if ( this.GetSelection().type == "Control" )
+ {
+ oContainer = this.GetSelectedElement() ;
+ }
+ else
+ {
+ var oRange = this.GetSelection().createRange() ;
+ oContainer = oRange.parentElement() ;
+ }
+
+ while ( oContainer )
+ {
+ if ( oContainer.nodeName.IEquals( nodeTagName ) ) return true ;
+ oContainer = oContainer.parentNode ;
+ }
+
+ return false ;
+} ;
+
+// The "nodeTagName" parameter must be UPPER CASE.
+FCKSelection.MoveToAncestorNode = function( nodeTagName )
+{
+ var oNode, oRange ;
+
+ if ( ! FCK.EditorDocument )
+ return null ;
+
+ if ( this.GetSelection().type == "Control" )
+ {
+ oRange = this.GetSelection().createRange() ;
+ for ( i = 0 ; i < oRange.length ; i++ )
+ {
+ if (oRange(i).parentNode)
+ {
+ oNode = oRange(i).parentNode ;
+ break ;
+ }
+ }
+ }
+ else
+ {
+ oRange = this.GetSelection().createRange() ;
+ oNode = oRange.parentElement() ;
+ }
+
+ while ( oNode && oNode.nodeName != nodeTagName )
+ oNode = oNode.parentNode ;
+
+ return oNode ;
+} ;
+
+FCKSelection.Delete = function()
+{
+ // Gets the actual selection.
+ var oSel = this.GetSelection() ;
+
+ // Deletes the actual selection contents.
+ if ( oSel.type.toLowerCase() != "none" )
+ {
+ oSel.clear() ;
+ }
+
+ return oSel ;
+} ;
+
+/**
+ * Returns the native selection object.
+ */
+FCKSelection.GetSelection = function()
+{
+ this.Restore() ;
+ return FCK.EditorDocument.selection ;
+}
+
+FCKSelection.Save = function( noFocus )
+{
+ // Ensures the editor has the selection focus. (#1801)
+ if ( !noFocus )
+ FCK.Focus() ;
+
+ var editorDocument = FCK.EditorDocument ;
+
+ if ( !editorDocument )
+ return ;
+
+ var selection = editorDocument.selection ;
+ var range ;
+
+ if ( selection )
+ {
+ range = selection.createRange() ;
+
+ // Ensure that the range comes from the editor document.
+ if ( range )
+ {
+ if ( range.parentElement && FCKTools.GetElementDocument( range.parentElement() ) != editorDocument )
+ range = null ;
+ else if ( range.item && FCKTools.GetElementDocument( range.item(0) )!= editorDocument )
+ range = null ;
+ }
+ }
+
+ this.SelectionData = range ;
+}
+
+FCKSelection._GetSelectionDocument = function( selection )
+{
+ var range = selection.createRange() ;
+ if ( !range )
+ return null;
+ else if ( range.item )
+ return FCKTools.GetElementDocument( range.item( 0 ) ) ;
+ else
+ return FCKTools.GetElementDocument( range.parentElement() ) ;
+}
+
+FCKSelection.Restore = function()
+{
+ if ( this.SelectionData )
+ {
+ FCK.IsSelectionChangeLocked = true ;
+
+ try
+ {
+ // Don't repeat the restore process if the editor document is already selected.
+ if ( String( this._GetSelectionDocument( FCK.EditorDocument.selection ).body.contentEditable ) == 'true' )
+ {
+ FCK.IsSelectionChangeLocked = false ;
+ return ;
+ }
+ this.SelectionData.select() ;
+ }
+ catch ( e ) {}
+
+ FCK.IsSelectionChangeLocked = false ;
+ }
+}
+
+FCKSelection.Release = function()
+{
+ delete this.SelectionData ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckstyles.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckstyles.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,381 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Handles styles in a give document.
+ */
+
+var FCKStyles = FCK.Styles =
+{
+ _Callbacks : {},
+ _ObjectStyles : {},
+
+ ApplyStyle : function( style )
+ {
+ if ( typeof style == 'string' )
+ style = this.GetStyles()[ style ] ;
+
+ if ( style )
+ {
+ if ( style.GetType() == FCK_STYLE_OBJECT )
+ style.ApplyToObject( FCKSelection.GetSelectedElement() ) ;
+ else
+ style.ApplyToSelection( FCK.EditorWindow ) ;
+
+ FCK.Events.FireEvent( 'OnSelectionChange' ) ;
+ }
+ },
+
+ RemoveStyle : function( style )
+ {
+ if ( typeof style == 'string' )
+ style = this.GetStyles()[ style ] ;
+
+ if ( style )
+ {
+ style.RemoveFromSelection( FCK.EditorWindow ) ;
+ FCK.Events.FireEvent( 'OnSelectionChange' ) ;
+ }
+ },
+
+ /**
+ * Defines a callback function to be called when the current state of a
+ * specific style changes.
+ */
+ AttachStyleStateChange : function( styleName, callback, callbackOwner )
+ {
+ var callbacks = this._Callbacks[ styleName ] ;
+
+ if ( !callbacks )
+ callbacks = this._Callbacks[ styleName ] = [] ;
+
+ callbacks.push( [ callback, callbackOwner ] ) ;
+ },
+
+ CheckSelectionChanges : function()
+ {
+ var startElement = FCKSelection.GetBoundaryParentElement( true ) ;
+
+ if ( !startElement )
+ return ;
+
+ // Walks the start node parents path, checking all styles that are being listened.
+ var path = new FCKElementPath( startElement ) ;
+ var styles = this.GetStyles() ;
+
+ for ( var styleName in styles )
+ {
+ var callbacks = this._Callbacks[ styleName ] ;
+
+ if ( callbacks )
+ {
+ var style = styles[ styleName ] ;
+ var state = style.CheckActive( path ) ;
+
+ if ( state != ( style._LastState || null ) )
+ {
+ style._LastState = state ;
+
+ for ( var i = 0 ; i < callbacks.length ; i++ )
+ {
+ var callback = callbacks[i][0] ;
+ var callbackOwner = callbacks[i][1] ;
+
+ callback.call( callbackOwner || window, styleName, state ) ;
+ }
+ }
+ }
+ }
+ },
+
+ CheckStyleInSelection : function( styleName )
+ {
+ return false ;
+ },
+
+ _GetRemoveFormatTagsRegex : function ()
+ {
+ var regex = new RegExp( '^(?:' + FCKConfig.RemoveFormatTags.replace( /,/g,'|' ) + ')$', 'i' ) ;
+
+ return (this._GetRemoveFormatTagsRegex = function()
+ {
+ return regex ;
+ })
+ && regex ;
+ },
+
+ /**
+ * Remove all styles from the current selection.
+ * TODO:
+ * - This is almost a duplication of FCKStyle.RemoveFromRange. We should
+ * try to merge things.
+ */
+ RemoveAll : function()
+ {
+ var range = new FCKDomRange( FCK.EditorWindow ) ;
+ range.MoveToSelection() ;
+
+ if ( range.CheckIsCollapsed() )
+ return ;
+
+ // Expand the range, if inside inline element boundaries.
+ range.Expand( 'inline_elements' ) ;
+
+ // Get the bookmark nodes.
+ // Bookmark the range so we can re-select it after processing.
+ var bookmark = range.CreateBookmark( true ) ;
+
+ // The style will be applied within the bookmark boundaries.
+ var startNode = range.GetBookmarkNode( bookmark, true ) ;
+ var endNode = range.GetBookmarkNode( bookmark, false ) ;
+
+ range.Release( true ) ;
+
+ var tagsRegex = this._GetRemoveFormatTagsRegex() ;
+
+ // We need to check the selection boundaries (bookmark spans) to break
+ // the code in a way that we can properly remove partially selected nodes.
+ // For example, removing a <b> style from
+ // <b>This is [some text</b> to show <b>the] problem</b>
+ // ... where [ and ] represent the selection, must result:
+ // <b>This is </b>[some text to show the]<b> problem</b>
+ // The strategy is simple, we just break the partial nodes before the
+ // removal logic, having something that could be represented this way:
+ // <b>This is </b>[<b>some text</b> to show <b>the</b>]<b> problem</b>
+
+ // Let's start checking the start boundary.
+ var path = new FCKElementPath( startNode ) ;
+ var pathElements = path.Elements ;
+ var pathElement ;
+
+ for ( var i = 1 ; i < pathElements.length ; i++ )
+ {
+ pathElement = pathElements[i] ;
+
+ if ( pathElement == path.Block || pathElement == path.BlockLimit )
+ break ;
+
+ // If this element can be removed (even partially).
+ if ( tagsRegex.test( pathElement.nodeName ) )
+ FCKDomTools.BreakParent( startNode, pathElement, range ) ;
+ }
+
+ // Now the end boundary.
+ path = new FCKElementPath( endNode ) ;
+ pathElements = path.Elements ;
+
+ for ( var i = 1 ; i < pathElements.length ; i++ )
+ {
+ pathElement = pathElements[i] ;
+
+ if ( pathElement == path.Block || pathElement == path.BlockLimit )
+ break ;
+
+ elementName = pathElement.nodeName.toLowerCase() ;
+
+ // If this element can be removed (even partially).
+ if ( tagsRegex.test( pathElement.nodeName ) )
+ FCKDomTools.BreakParent( endNode, pathElement, range ) ;
+ }
+
+ // Navigate through all nodes between the bookmarks.
+ var currentNode = FCKDomTools.GetNextSourceNode( startNode, true, 1 ) ;
+
+ while ( currentNode )
+ {
+ // If we have reached the end of the selection, stop looping.
+ if ( currentNode == endNode )
+ break ;
+
+ // Cache the next node to be processed. Do it now, because
+ // currentNode may be removed.
+ var nextNode = FCKDomTools.GetNextSourceNode( currentNode, false, 1 ) ;
+
+ // Remove elements nodes that match with this style rules.
+ if ( tagsRegex.test( currentNode.nodeName ) )
+ FCKDomTools.RemoveNode( currentNode, true ) ;
+ else
+ FCKDomTools.RemoveAttributes( currentNode, FCKConfig.RemoveAttributesArray );
+
+ currentNode = nextNode ;
+ }
+
+ range.SelectBookmark( bookmark ) ;
+
+ FCK.Events.FireEvent( 'OnSelectionChange' ) ;
+ },
+
+ GetStyle : function( styleName )
+ {
+ return this.GetStyles()[ styleName ] ;
+ },
+
+ GetStyles : function()
+ {
+ var styles = this._GetStyles ;
+ if ( !styles )
+ {
+ styles = this._GetStyles = FCKTools.Merge(
+ this._LoadStylesCore(),
+ this._LoadStylesCustom(),
+ this._LoadStylesXml() ) ;
+ }
+ return styles ;
+ },
+
+ CheckHasObjectStyle : function( elementName )
+ {
+ return !!this._ObjectStyles[ elementName ] ;
+ },
+
+ _LoadStylesCore : function()
+ {
+ var styles = {};
+ var styleDefs = FCKConfig.CoreStyles ;
+
+ for ( var styleName in styleDefs )
+ {
+ // Core styles are prefixed with _FCK_.
+ var style = styles[ '_FCK_' + styleName ] = new FCKStyle( styleDefs[ styleName ] ) ;
+ style.IsCore = true ;
+ }
+ return styles ;
+ },
+
+ _LoadStylesCustom : function()
+ {
+ var styles = {};
+ var styleDefs = FCKConfig.CustomStyles ;
+
+ if ( styleDefs )
+ {
+ for ( var styleName in styleDefs )
+ {
+ var style = styles[ styleName ] = new FCKStyle( styleDefs[ styleName ] ) ;
+ style.Name = styleName ;
+ }
+ }
+
+ return styles ;
+ },
+
+ _LoadStylesXml : function()
+ {
+ var styles = {};
+
+ var stylesXmlPath = FCKConfig.StylesXmlPath ;
+
+ if ( !stylesXmlPath || stylesXmlPath.length == 0 )
+ return styles ;
+
+ // Load the XML file into a FCKXml object.
+ var xml = new FCKXml() ;
+ xml.LoadUrl( stylesXmlPath ) ;
+
+ var stylesXmlObj = FCKXml.TransformToObject( xml.SelectSingleNode( 'Styles' ) ) ;
+
+ // Get the "Style" nodes defined in the XML file.
+ var styleNodes = stylesXmlObj.$Style ;
+
+ // Check that it did contain some valid nodes
+ if ( !styleNodes )
+ return styles ;
+
+ // Add each style to our "Styles" collection.
+ for ( var i = 0 ; i < styleNodes.length ; i++ )
+ {
+ var styleNode = styleNodes[i] ;
+
+ var element = ( styleNode.element || '' ).toLowerCase() ;
+
+ if ( element.length == 0 )
+ throw( 'The element name is required. Error loading "' + stylesXmlPath + '"' ) ;
+
+ var styleDef = {
+ Element : element,
+ Attributes : {},
+ Styles : {},
+ Overrides : []
+ } ;
+
+ // Get the attributes defined for the style (if any).
+ var attNodes = styleNode.$Attribute || [] ;
+
+ // Add the attributes to the style definition object.
+ for ( var j = 0 ; j < attNodes.length ; j++ )
+ {
+ styleDef.Attributes[ attNodes[j].name ] = attNodes[j].value ;
+ }
+
+ // Get the styles defined for the style (if any).
+ var cssStyleNodes = styleNode.$Style || [] ;
+
+ // Add the attributes to the style definition object.
+ for ( j = 0 ; j < cssStyleNodes.length ; j++ )
+ {
+ styleDef.Styles[ cssStyleNodes[j].name ] = cssStyleNodes[j].value ;
+ }
+
+ // Load override definitions.
+ var cssStyleOverrideNodes = styleNode.$Override ;
+ if ( cssStyleOverrideNodes )
+ {
+ for ( j = 0 ; j < cssStyleOverrideNodes.length ; j++ )
+ {
+ var overrideNode = cssStyleOverrideNodes[j] ;
+ var overrideDef =
+ {
+ Element : overrideNode.element
+ } ;
+
+ var overrideAttNode = overrideNode.$Attribute ;
+ if ( overrideAttNode )
+ {
+ overrideDef.Attributes = {} ;
+ for ( var k = 0 ; k < overrideAttNode.length ; k++ )
+ {
+ var overrideAttValue = overrideAttNode[k].value || null ;
+ if ( overrideAttValue )
+ {
+ // Check if the override attribute value is a regular expression.
+ var regexMatch = overrideAttValue && FCKRegexLib.RegExp.exec( overrideAttValue ) ;
+ if ( regexMatch )
+ overrideAttValue = new RegExp( regexMatch[1], regexMatch[2] || '' ) ;
+ }
+ overrideDef.Attributes[ overrideAttNode[k].name ] = overrideAttValue ;
+ }
+ }
+
+ styleDef.Overrides.push( overrideDef ) ;
+ }
+ }
+
+ var style = new FCKStyle( styleDef ) ;
+ style.Name = styleNode.name || element ;
+
+ if ( style.GetType() == FCK_STYLE_OBJECT )
+ this._ObjectStyles[ element ] = true ;
+
+ // Add the style to the "Styles" collection using it's name as the key.
+ styles[ style.Name ] = style ;
+ }
+
+ return styles ;
+ }
+} ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktablehandler.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktablehandler.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,872 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Manage table operations.
+ */
+
+var FCKTableHandler = new Object() ;
+
+FCKTableHandler.InsertRow = function( insertBefore )
+{
+ // Get the row where the selection is placed in.
+ var oRow = FCKSelection.MoveToAncestorNode( 'TR' ) ;
+ if ( !oRow ) return ;
+
+ // Create a clone of the row.
+ var oNewRow = oRow.cloneNode( true ) ;
+
+ // Insert the new row (copy) before of it.
+ oRow.parentNode.insertBefore( oNewRow, oRow ) ;
+
+ // Clean one of the rows to produce the illusion of inserting an empty row before or after.
+ FCKTableHandler.ClearRow( insertBefore ? oNewRow : oRow ) ;
+}
+
+FCKTableHandler.DeleteRows = function( row )
+{
+ // If no row has been passed as a parameter,
+ // then get the row( s ) containing the cells where the selection is placed in.
+ // If user selected multiple rows ( by selecting multiple cells ), walk
+ // the selected cell list and delete the rows containing the selected cells
+ if ( ! row )
+ {
+ var aCells = FCKTableHandler.GetSelectedCells() ;
+ var aRowsToDelete = new Array() ;
+ //queue up the rows -- it's possible ( and likely ) that we may get duplicates
+ for ( var i = 0; i < aCells.length; i++ )
+ {
+ var oRow = FCKTools.GetElementAscensor( aCells[i],'TR' ) ;
+ aRowsToDelete[oRow.rowIndex] = oRow ;
+ }
+ for ( var i = aRowsToDelete.length; i >= 0; i-- )
+ {
+ if ( aRowsToDelete[i] )
+ FCKTableHandler.DeleteRows( aRowsToDelete[i] );
+ }
+ return ;
+ }
+
+ // Get the row's table.
+ var oTable = FCKTools.GetElementAscensor( row, 'TABLE' ) ;
+
+ // If just one row is available then delete the entire table.
+ if ( oTable.rows.length == 1 )
+ {
+ FCKTableHandler.DeleteTable( oTable ) ;
+ return ;
+ }
+
+ // Delete the row.
+ row.parentNode.removeChild( row ) ;
+}
+
+FCKTableHandler.DeleteTable = function( table )
+{
+ // If no table has been passed as a parameter,
+ // then get the table where the selection is placed in.
+ if ( !table )
+ {
+ table = FCKSelection.GetSelectedElement() ;
+ if ( !table || table.tagName != 'TABLE' )
+ table = FCKSelection.MoveToAncestorNode( 'TABLE' ) ;
+ }
+ if ( !table ) return ;
+
+ // Delete the table.
+ FCKSelection.SelectNode( table ) ;
+ FCKSelection.Collapse();
+
+ // if the table is wrapped with a singleton <p> ( or something similar ), remove
+ // the surrounding tag -- which likely won't show after deletion anyway
+ if ( table.parentNode.childNodes.length == 1 )
+ table.parentNode.parentNode.removeChild( table.parentNode );
+ else
+ table.parentNode.removeChild( table ) ;
+}
+
+FCKTableHandler.InsertColumn = function( insertBefore )
+{
+ // Get the cell where the selection is placed in.
+ var oCell = null ;
+ var nodes = this.GetSelectedCells() ;
+
+ if ( nodes && nodes.length )
+ oCell = nodes[ insertBefore ? 0 : ( nodes.length - 1 ) ] ;
+
+ if ( ! oCell )
+ return ;
+
+ // Get the cell's table.
+ var oTable = FCKTools.GetElementAscensor( oCell, 'TABLE' ) ;
+
+ var iIndex = oCell.cellIndex ;
+
+ // Loop throw all rows available in the table.
+ for ( var i = 0 ; i < oTable.rows.length ; i++ )
+ {
+ // Get the row.
+ var oRow = oTable.rows[i] ;
+
+ // If the row doens't have enough cells, ignore it.
+ if ( oRow.cells.length < ( iIndex + 1 ) )
+ continue ;
+
+ oCell = oRow.cells[iIndex].cloneNode(false) ;
+
+ if ( FCKBrowserInfo.IsGeckoLike )
+ FCKTools.AppendBogusBr( oCell ) ;
+
+ // Get back the currently selected cell.
+ var oBaseCell = oRow.cells[iIndex] ;
+
+ if ( insertBefore )
+ oRow.insertBefore( oCell, oBaseCell ) ;
+ else if ( oBaseCell.nextSibling )
+ oRow.insertBefore( oCell, oBaseCell.nextSibling ) ;
+ else
+ oRow.appendChild( oCell ) ;
+ }
+}
+
+FCKTableHandler.DeleteColumns = function( oCell )
+{
+ // if user selected multiple cols ( by selecting multiple cells ), walk
+ // the selected cell list and delete the rows containing the selected cells
+ if ( !oCell )
+ {
+ var aColsToDelete = FCKTableHandler.GetSelectedCells();
+ for ( var i = aColsToDelete.length; i >= 0; i-- )
+ {
+ if ( aColsToDelete[i] )
+ FCKTableHandler.DeleteColumns( aColsToDelete[i] );
+ }
+ return;
+ }
+
+ if ( !oCell ) return ;
+
+ // Get the cell's table.
+ var oTable = FCKTools.GetElementAscensor( oCell, 'TABLE' ) ;
+
+ // Get the cell index.
+ var iIndex = oCell.cellIndex ;
+
+ // Loop throw all rows (from down to up, because it's possible that some
+ // rows will be deleted).
+ for ( var i = oTable.rows.length - 1 ; i >= 0 ; i-- )
+ {
+ // Get the row.
+ var oRow = oTable.rows[i] ;
+
+ // If the cell to be removed is the first one and the row has just one cell.
+ if ( iIndex == 0 && oRow.cells.length == 1 )
+ {
+ // Remove the entire row.
+ FCKTableHandler.DeleteRows( oRow ) ;
+ continue ;
+ }
+
+ // If the cell to be removed exists the delete it.
+ if ( oRow.cells[iIndex] )
+ oRow.removeChild( oRow.cells[iIndex] ) ;
+ }
+}
+
+FCKTableHandler.InsertCell = function( cell, insertBefore )
+{
+ // Get the cell where the selection is placed in.
+ var oCell = null ;
+ var nodes = this.GetSelectedCells() ;
+ if ( nodes && nodes.length )
+ oCell = nodes[ insertBefore ? 0 : ( nodes.length - 1 ) ] ;
+ if ( ! oCell )
+ return null ;
+
+ // Create the new cell element to be added.
+ var oNewCell = FCK.EditorDocument.createElement( 'TD' ) ;
+ if ( FCKBrowserInfo.IsGeckoLike )
+ FCKTools.AppendBogusBr( oNewCell ) ;
+
+ if ( !insertBefore && oCell.cellIndex == oCell.parentNode.cells.length - 1 )
+ oCell.parentNode.appendChild( oNewCell ) ;
+ else
+ oCell.parentNode.insertBefore( oNewCell, insertBefore ? oCell : oCell.nextSibling ) ;
+
+ return oNewCell ;
+}
+
+FCKTableHandler.DeleteCell = function( cell )
+{
+ // If this is the last cell in the row.
+ if ( cell.parentNode.cells.length == 1 )
+ {
+ // Delete the entire row.
+ FCKTableHandler.DeleteRows( FCKTools.GetElementAscensor( cell, 'TR' ) ) ;
+ return ;
+ }
+
+ // Delete the cell from the row.
+ cell.parentNode.removeChild( cell ) ;
+}
+
+FCKTableHandler.DeleteCells = function()
+{
+ var aCells = FCKTableHandler.GetSelectedCells() ;
+
+ for ( var i = aCells.length - 1 ; i >= 0 ; i-- )
+ {
+ FCKTableHandler.DeleteCell( aCells[i] ) ;
+ }
+}
+
+FCKTableHandler._MarkCells = function( cells, label )
+{
+ for ( var i = 0 ; i < cells.length ; i++ )
+ cells[i][label] = true ;
+}
+
+FCKTableHandler._UnmarkCells = function( cells, label )
+{
+ for ( var i = 0 ; i < cells.length ; i++ )
+ {
+ if ( FCKBrowserInfo.IsIE )
+ cells[i].removeAttribute( label ) ;
+ else
+ delete cells[i][label] ;
+ }
+}
+
+FCKTableHandler._ReplaceCellsByMarker = function( tableMap, marker, substitute )
+{
+ for ( var i = 0 ; i < tableMap.length ; i++ )
+ {
+ for ( var j = 0 ; j < tableMap[i].length ; j++ )
+ {
+ if ( tableMap[i][j][marker] )
+ tableMap[i][j] = substitute ;
+ }
+ }
+}
+
+FCKTableHandler._GetMarkerGeometry = function( tableMap, rowIdx, colIdx, markerName )
+{
+ var selectionWidth = 0 ;
+ var selectionHeight = 0 ;
+ var cellsLeft = 0 ;
+ var cellsUp = 0 ;
+ for ( var i = colIdx ; tableMap[rowIdx][i] && tableMap[rowIdx][i][markerName] ; i++ )
+ selectionWidth++ ;
+ for ( var i = colIdx - 1 ; tableMap[rowIdx][i] && tableMap[rowIdx][i][markerName] ; i-- )
+ {
+ selectionWidth++ ;
+ cellsLeft++ ;
+ }
+ for ( var i = rowIdx ; tableMap[i] && tableMap[i][colIdx] && tableMap[i][colIdx][markerName] ; i++ )
+ selectionHeight++ ;
+ for ( var i = rowIdx - 1 ; tableMap[i] && tableMap[i][colIdx] && tableMap[i][colIdx][markerName] ; i-- )
+ {
+ selectionHeight++ ;
+ cellsUp++ ;
+ }
+ return { 'width' : selectionWidth, 'height' : selectionHeight, 'x' : cellsLeft, 'y' : cellsUp } ;
+}
+
+FCKTableHandler.CheckIsSelectionRectangular = function()
+{
+ // If every row and column in an area on a plane are of the same width and height,
+ // Then the area is a rectangle.
+ var cells = FCKTableHandler.GetSelectedCells() ;
+ if ( cells.length < 1 )
+ return false ;
+
+ this._MarkCells( cells, '_CellSelected' ) ;
+
+ var tableMap = this._CreateTableMap( cells[0].parentNode.parentNode ) ;
+ var rowIdx = cells[0].parentNode.rowIndex ;
+ var colIdx = this._GetCellIndexSpan( tableMap, rowIdx, cells[0] ) ;
+
+ var geometry = this._GetMarkerGeometry( tableMap, rowIdx, colIdx, '_CellSelected' ) ;
+ var baseColIdx = colIdx - geometry.x ;
+ var baseRowIdx = rowIdx - geometry.y ;
+
+ if ( geometry.width >= geometry.height )
+ {
+ for ( colIdx = baseColIdx ; colIdx < baseColIdx + geometry.width ; colIdx++ )
+ {
+ rowIdx = baseRowIdx + ( colIdx - baseColIdx ) % geometry.height ;
+ if ( ! tableMap[rowIdx] || ! tableMap[rowIdx][colIdx] )
+ {
+ this._UnmarkCells( cells, '_CellSelected' ) ;
+ return false ;
+ }
+ var g = this._GetMarkerGeometry( tableMap, rowIdx, colIdx, '_CellSelected' ) ;
+ if ( g.width != geometry.width || g.height != geometry.height )
+ {
+ this._UnmarkCells( cells, '_CellSelected' ) ;
+ return false ;
+ }
+ }
+ }
+ else
+ {
+ for ( rowIdx = baseRowIdx ; rowIdx < baseRowIdx + geometry.height ; rowIdx++ )
+ {
+ colIdx = baseColIdx + ( rowIdx - baseRowIdx ) % geometry.width ;
+ if ( ! tableMap[rowIdx] || ! tableMap[rowIdx][colIdx] )
+ {
+ this._UnmarkCells( cells, '_CellSelected' ) ;
+ return false ;
+ }
+ var g = this._GetMarkerGeometry( tableMap, rowIdx, colIdx, '_CellSelected' ) ;
+ if ( g.width != geometry.width || g.height != geometry.height )
+ {
+ this._UnmarkCells( cells, '_CellSelected' ) ;
+ return false ;
+ }
+ }
+ }
+
+ this._UnmarkCells( cells, '_CellSelected' ) ;
+ return true ;
+}
+
+FCKTableHandler.MergeCells = function()
+{
+ // Get all selected cells.
+ var cells = this.GetSelectedCells() ;
+ if ( cells.length < 2 )
+ return ;
+
+ // Assume the selected cells are already in a rectangular geometry.
+ // Because the checking is already done by FCKTableCommand.
+ var refCell = cells[0] ;
+ var tableMap = this._CreateTableMap( refCell.parentNode.parentNode ) ;
+ var rowIdx = refCell.parentNode.rowIndex ;
+ var colIdx = this._GetCellIndexSpan( tableMap, rowIdx, refCell ) ;
+
+ this._MarkCells( cells, '_SelectedCells' ) ;
+ var selectionGeometry = this._GetMarkerGeometry( tableMap, rowIdx, colIdx, '_SelectedCells' ) ;
+
+ var baseColIdx = colIdx - selectionGeometry.x ;
+ var baseRowIdx = rowIdx - selectionGeometry.y ;
+ var cellContents = FCKTools.GetElementDocument( refCell ).createDocumentFragment() ;
+ for ( var i = 0 ; i < selectionGeometry.height ; i++ )
+ {
+ var rowChildNodesCount = 0 ;
+ for ( var j = 0 ; j < selectionGeometry.width ; j++ )
+ {
+ var currentCell = tableMap[baseRowIdx + i][baseColIdx + j] ;
+ while ( currentCell.childNodes.length > 0 )
+ {
+ var node = currentCell.removeChild( currentCell.firstChild ) ;
+ if ( node.nodeType != 1
+ || ( node.getAttribute( 'type', 2 ) != '_moz' && node.getAttribute( '_moz_dirty' ) != null ) )
+ {
+ cellContents.appendChild( node ) ;
+ rowChildNodesCount++ ;
+ }
+ }
+ }
+ if ( rowChildNodesCount > 0 )
+ cellContents.appendChild( FCKTools.GetElementDocument( refCell ).createElement( 'br' ) ) ;
+ }
+
+ this._ReplaceCellsByMarker( tableMap, '_SelectedCells', refCell ) ;
+ this._UnmarkCells( cells, '_SelectedCells' ) ;
+ this._InstallTableMap( tableMap, refCell.parentNode.parentNode ) ;
+ refCell.appendChild( cellContents ) ;
+
+ if ( FCKBrowserInfo.IsGeckoLike && ( ! refCell.firstChild ) )
+ FCKTools.AppendBogusBr( refCell ) ;
+
+ this._MoveCaretToCell( refCell, false ) ;
+}
+
+FCKTableHandler.MergeRight = function()
+{
+ var target = this.GetMergeRightTarget() ;
+ if ( target == null )
+ return ;
+ var refCell = target.refCell ;
+ var tableMap = target.tableMap ;
+ var nextCell = target.nextCell ;
+
+ var cellContents = FCK.EditorDocument.createDocumentFragment() ;
+ while ( nextCell && nextCell.childNodes && nextCell.childNodes.length > 0 )
+ cellContents.appendChild( nextCell.removeChild( nextCell.firstChild ) ) ;
+
+ nextCell.parentNode.removeChild( nextCell ) ;
+ refCell.appendChild( cellContents ) ;
+ this._MarkCells( [nextCell], '_Replace' ) ;
+ this._ReplaceCellsByMarker( tableMap, '_Replace', refCell ) ;
+ this._InstallTableMap( tableMap, refCell.parentNode.parentNode ) ;
+
+ this._MoveCaretToCell( refCell, false ) ;
+}
+
+FCKTableHandler.MergeDown = function()
+{
+ var target = this.GetMergeDownTarget() ;
+ if ( target == null )
+ return ;
+ var refCell = target.refCell ;
+ var tableMap = target.tableMap ;
+ var nextCell = target.nextCell ;
+
+ var cellContents = FCKTools.GetElementDocument( refCell ).createDocumentFragment() ;
+ while ( nextCell && nextCell.childNodes && nextCell.childNodes.length > 0 )
+ cellContents.appendChild( nextCell.removeChild( nextCell.firstChild ) ) ;
+ if ( cellContents.firstChild )
+ cellContents.insertBefore( FCKTools.GetElementDocument( nextCell ).createElement( 'br' ), cellContents.firstChild ) ;
+ refCell.appendChild( cellContents ) ;
+ this._MarkCells( [nextCell], '_Replace' ) ;
+ this._ReplaceCellsByMarker( tableMap, '_Replace', refCell ) ;
+ this._InstallTableMap( tableMap, refCell.parentNode.parentNode ) ;
+
+ this._MoveCaretToCell( refCell, false ) ;
+}
+
+FCKTableHandler.HorizontalSplitCell = function()
+{
+ var cells = FCKTableHandler.GetSelectedCells() ;
+ if ( cells.length != 1 )
+ return ;
+
+ var refCell = cells[0] ;
+ var tableMap = this._CreateTableMap( refCell.parentNode.parentNode ) ;
+ var rowIdx = refCell.parentNode.rowIndex ;
+ var colIdx = FCKTableHandler._GetCellIndexSpan( tableMap, rowIdx, refCell ) ;
+ var cellSpan = isNaN( refCell.colSpan ) ? 1 : refCell.colSpan ;
+
+ if ( cellSpan > 1 )
+ {
+ // Splittng a multi-column cell - original cell gets ceil(colSpan/2) columns,
+ // new cell gets floor(colSpan/2).
+ var newCellSpan = Math.ceil( cellSpan / 2 ) ;
+ var newCell = FCKTools.GetElementDocument( refCell ).createElement( 'td' ) ;
+ if ( FCKBrowserInfo.IsGeckoLike )
+ FCKTools.AppendBogusBr( newCell ) ;
+ var startIdx = colIdx + newCellSpan ;
+ var endIdx = colIdx + cellSpan ;
+ var rowSpan = isNaN( refCell.rowSpan ) ? 1 : refCell.rowSpan ;
+ for ( var r = rowIdx ; r < rowIdx + rowSpan ; r++ )
+ {
+ for ( var i = startIdx ; i < endIdx ; i++ )
+ tableMap[r][i] = newCell ;
+ }
+ }
+ else
+ {
+ // Splitting a single-column cell - add a new cell, and expand
+ // cells crossing the same column.
+ var newTableMap = [] ;
+ for ( var i = 0 ; i < tableMap.length ; i++ )
+ {
+ var newRow = tableMap[i].slice( 0, colIdx ) ;
+ if ( tableMap[i].length <= colIdx )
+ {
+ newTableMap.push( newRow ) ;
+ continue ;
+ }
+ if ( tableMap[i][colIdx] == refCell )
+ {
+ newRow.push( refCell ) ;
+ newRow.push( FCKTools.GetElementDocument( refCell ).createElement( 'td' ) ) ;
+ if ( FCKBrowserInfo.IsGeckoLike )
+ FCKTools.AppendBogusBr( newRow[newRow.length - 1] ) ;
+ }
+ else
+ {
+ newRow.push( tableMap[i][colIdx] ) ;
+ newRow.push( tableMap[i][colIdx] ) ;
+ }
+ for ( var j = colIdx + 1 ; j < tableMap[i].length ; j++ )
+ newRow.push( tableMap[i][j] ) ;
+ newTableMap.push( newRow ) ;
+ }
+ tableMap = newTableMap ;
+ }
+
+ this._InstallTableMap( tableMap, refCell.parentNode.parentNode ) ;
+}
+
+FCKTableHandler.VerticalSplitCell = function()
+{
+ var cells = FCKTableHandler.GetSelectedCells() ;
+ if ( cells.length != 1 )
+ return ;
+
+ var currentCell = cells[0] ;
+ var tableMap = this._CreateTableMap( currentCell.parentNode.parentNode ) ;
+ var cellIndex = FCKTableHandler._GetCellIndexSpan( tableMap, currentCell.parentNode.rowIndex, currentCell ) ;
+ var currentRowSpan = currentCell.rowSpan ;
+ var currentRowIndex = currentCell.parentNode.rowIndex ;
+ if ( isNaN( currentRowSpan ) )
+ currentRowSpan = 1 ;
+
+ if ( currentRowSpan > 1 )
+ {
+ // 1. Set the current cell's rowSpan to 1.
+ currentCell.rowSpan = Math.ceil( currentRowSpan / 2 ) ;
+
+ // 2. Find the appropriate place to insert a new cell at the next row.
+ var newCellRowIndex = currentRowIndex + Math.ceil( currentRowSpan / 2 ) ;
+ var insertMarker = null ;
+ for ( var i = cellIndex+1 ; i < tableMap[newCellRowIndex].length ; i++ )
+ {
+ if ( tableMap[newCellRowIndex][i].parentNode.rowIndex == newCellRowIndex )
+ {
+ insertMarker = tableMap[newCellRowIndex][i] ;
+ break ;
+ }
+ }
+
+ // 3. Insert the new cell to the indicated place, with the appropriate rowSpan, next row.
+ var newCell = FCK.EditorDocument.createElement( 'td' ) ;
+ newCell.rowSpan = Math.floor( currentRowSpan / 2 ) ;
+ if ( FCKBrowserInfo.IsGeckoLike )
+ FCKTools.AppendBogusBr( newCell ) ;
+ currentCell.parentNode.parentNode.rows[newCellRowIndex].insertBefore( newCell, insertMarker ) ;
+ }
+ else
+ {
+ // 1. Insert a new row.
+ var newCellRowIndex = currentRowIndex + 1 ;
+ var newRow = FCK.EditorDocument.createElement( 'tr' ) ;
+ var tBody = currentCell.parentNode.parentNode ;
+ if ( tBody.rows.length > newCellRowIndex )
+ tBody.insertBefore( newRow, tBody.rows[newCellRowIndex] ) ;
+ else
+ tBody.appendChild( newRow ) ;
+
+ // 2. +1 to rowSpan for all cells crossing currentCell's row.
+ for ( var i = 0 ; i < tableMap[currentRowIndex].length ; )
+ {
+ var colSpan = tableMap[currentRowIndex][i].colSpan ;
+ if ( isNaN( colSpan ) || colSpan < 1 )
+ colSpan = 1 ;
+ if ( i == cellIndex )
+ {
+ i += colSpan ;
+ continue ;
+ }
+ var rowSpan = tableMap[currentRowIndex][i].rowSpan ;
+ if ( isNaN( rowSpan ) )
+ rowSpan = 1 ;
+ tableMap[currentRowIndex][i].rowSpan = rowSpan + 1 ;
+ i += colSpan ;
+ }
+
+ // 3. Insert a new cell to new row.
+ var newCell = FCK.EditorDocument.createElement( 'td' ) ;
+ if ( FCKBrowserInfo.IsGeckoLike )
+ FCKTools.AppendBogusBr( newCell ) ;
+ newRow.appendChild( newCell ) ;
+ }
+}
+
+// Get the cell index from a TableMap.
+FCKTableHandler._GetCellIndexSpan = function( tableMap, rowIndex, cell )
+{
+ if ( tableMap.length < rowIndex + 1 )
+ return null ;
+
+ var oRow = tableMap[ rowIndex ] ;
+
+ for ( var c = 0 ; c < oRow.length ; c++ )
+ {
+ if ( oRow[c] == cell )
+ return c ;
+ }
+
+ return null ;
+}
+
+// Get the cell location from a TableMap. Returns an array with an [x,y] location
+FCKTableHandler._GetCellLocation = function( tableMap, cell )
+{
+ for ( var i = 0 ; i < tableMap.length; i++ )
+ {
+ for ( var c = 0 ; c < tableMap[i].length ; c++ )
+ {
+ if ( tableMap[i][c] == cell ) return [i,c];
+ }
+ }
+ return null ;
+}
+
+// Get the cells available in a column of a TableMap.
+FCKTableHandler._GetColumnCells = function( tableMap, columnIndex )
+{
+ var aCollCells = new Array() ;
+
+ for ( var r = 0 ; r < tableMap.length ; r++ )
+ {
+ var oCell = tableMap[r][columnIndex] ;
+ if ( oCell && ( aCollCells.length == 0 || aCollCells[ aCollCells.length - 1 ] != oCell ) )
+ aCollCells[ aCollCells.length ] = oCell ;
+ }
+
+ return aCollCells ;
+}
+
+// This function is quite hard to explain. It creates a matrix representing all cells in a table.
+// The difference here is that the "spanned" cells (colSpan and rowSpan) are duplicated on the matrix
+// cells that are "spanned". For example, a row with 3 cells where the second cell has colSpan=2 and rowSpan=3
+// will produce a bi-dimensional matrix with the following values (representing the cells):
+// Cell1, Cell2, Cell2, Cell 3
+// Cell4, Cell2, Cell2, Cell 5
+FCKTableHandler._CreateTableMap = function( table )
+{
+ var aRows = table.rows ;
+
+ // Row and Column counters.
+ var r = -1 ;
+
+ var aMap = new Array() ;
+
+ for ( var i = 0 ; i < aRows.length ; i++ )
+ {
+ r++ ;
+ if ( !aMap[r] )
+ aMap[r] = new Array() ;
+
+ var c = -1 ;
+
+ for ( var j = 0 ; j < aRows[i].cells.length ; j++ )
+ {
+ var oCell = aRows[i].cells[j] ;
+
+ c++ ;
+ while ( aMap[r][c] )
+ c++ ;
+
+ var iColSpan = isNaN( oCell.colSpan ) ? 1 : oCell.colSpan ;
+ var iRowSpan = isNaN( oCell.rowSpan ) ? 1 : oCell.rowSpan ;
+
+ for ( var rs = 0 ; rs < iRowSpan ; rs++ )
+ {
+ if ( !aMap[r + rs] )
+ aMap[r + rs] = new Array() ;
+
+ for ( var cs = 0 ; cs < iColSpan ; cs++ )
+ {
+ aMap[r + rs][c + cs] = aRows[i].cells[j] ;
+ }
+ }
+
+ c += iColSpan - 1 ;
+ }
+ }
+ return aMap ;
+}
+
+// This function is the inverse of _CreateTableMap - it takes in a table map and converts it to an HTML table.
+FCKTableHandler._InstallTableMap = function( tableMap, table )
+{
+ // Workaround for #1917 : MSIE will always report a cell's rowSpan as 1 as long
+ // as the cell is not attached to a row. So we'll need an alternative attribute
+ // for storing the calculated rowSpan in IE.
+ var rowSpanAttr = FCKBrowserInfo.IsIE ? "_fckrowspan" : "rowSpan" ;
+
+ // Clear the table of all rows first.
+ while ( table.rows.length > 0 )
+ {
+ var row = table.rows[0] ;
+ row.parentNode.removeChild( row ) ;
+ }
+
+ // Disconnect all the cells in tableMap from their parents, set all colSpan and rowSpan attributes to 1.
+ for ( var i = 0 ; i < tableMap.length ; i++ )
+ {
+ for ( var j = 0 ; j < tableMap[i].length ; j++ )
+ {
+ var cell = tableMap[i][j] ;
+ if ( cell.parentNode )
+ cell.parentNode.removeChild( cell ) ;
+ cell.colSpan = cell[rowSpanAttr] = 1 ;
+ }
+ }
+
+ // Scan by rows and set colSpan.
+ var maxCol = 0 ;
+ for ( var i = 0 ; i < tableMap.length ; i++ )
+ {
+ for ( var j = 0 ; j < tableMap[i].length ; j++ )
+ {
+ var cell = tableMap[i][j] ;
+ if ( ! cell)
+ continue ;
+ if ( j > maxCol )
+ maxCol = j ;
+ if ( cell._colScanned === true )
+ continue ;
+ if ( tableMap[i][j-1] == cell )
+ cell.colSpan++ ;
+ if ( tableMap[i][j+1] != cell )
+ cell._colScanned = true ;
+ }
+ }
+
+ // Scan by columns and set rowSpan.
+ for ( var i = 0 ; i <= maxCol ; i++ )
+ {
+ for ( var j = 0 ; j < tableMap.length ; j++ )
+ {
+ if ( ! tableMap[j] )
+ continue ;
+ var cell = tableMap[j][i] ;
+ if ( ! cell || cell._rowScanned === true )
+ continue ;
+ if ( tableMap[j-1] && tableMap[j-1][i] == cell )
+ cell[rowSpanAttr]++ ;
+ if ( ! tableMap[j+1] || tableMap[j+1][i] != cell )
+ cell._rowScanned = true ;
+ }
+ }
+
+ // Clear all temporary flags.
+ for ( var i = 0 ; i < tableMap.length ; i++ )
+ {
+ for ( var j = 0 ; j < tableMap[i].length ; j++)
+ {
+ var cell = tableMap[i][j] ;
+ if ( FCKBrowserInfo.IsIE )
+ {
+ cell.removeAttribute( '_colScanned' ) ;
+ cell.removeAttribute( '_rowScanned' ) ;
+ }
+ else
+ {
+ delete cell._colScanned ;
+ delete cell._rowScanned ;
+ }
+ }
+ }
+
+ // Insert physical rows and columns to the table.
+ for ( var i = 0 ; i < tableMap.length ; i++ )
+ {
+ var rowObj = FCKTools.GetElementDocument( table ).createElement( 'tr' ) ;
+ for ( var j = 0 ; j < tableMap[i].length ; )
+ {
+ var cell = tableMap[i][j] ;
+ if ( tableMap[i-1] && tableMap[i-1][j] == cell )
+ {
+ j += cell.colSpan ;
+ continue ;
+ }
+ rowObj.appendChild( cell ) ;
+ if ( rowSpanAttr != 'rowSpan' )
+ {
+ cell.rowSpan = cell[rowSpanAttr] ;
+ cell.removeAttribute( rowSpanAttr ) ;
+ }
+ j += cell.colSpan ;
+ if ( cell.colSpan == 1 )
+ cell.removeAttribute( 'colspan' ) ;
+ if ( cell.rowSpan == 1 )
+ cell.removeAttribute( 'rowspan' ) ;
+ }
+ table.appendChild( rowObj ) ;
+ }
+}
+
+FCKTableHandler._MoveCaretToCell = function ( refCell, toStart )
+{
+ var range = new FCKDomRange( FCK.EditorWindow ) ;
+ range.MoveToNodeContents( refCell ) ;
+ range.Collapse( toStart ) ;
+ range.Select() ;
+}
+
+FCKTableHandler.ClearRow = function( tr )
+{
+ // Get the array of row's cells.
+ var aCells = tr.cells ;
+
+ // Replace the contents of each cell with "nothing".
+ for ( var i = 0 ; i < aCells.length ; i++ )
+ {
+ aCells[i].innerHTML = '' ;
+
+ if ( FCKBrowserInfo.IsGeckoLike )
+ FCKTools.AppendBogusBr( aCells[i] ) ;
+ }
+}
+
+FCKTableHandler.GetMergeRightTarget = function()
+{
+ var cells = this.GetSelectedCells() ;
+ if ( cells.length != 1 )
+ return null ;
+
+ var refCell = cells[0] ;
+ var tableMap = this._CreateTableMap( refCell.parentNode.parentNode ) ;
+ var rowIdx = refCell.parentNode.rowIndex ;
+ var colIdx = this._GetCellIndexSpan( tableMap, rowIdx, refCell ) ;
+ var nextColIdx = colIdx + ( isNaN( refCell.colSpan ) ? 1 : refCell.colSpan ) ;
+ var nextCell = tableMap[rowIdx][nextColIdx] ;
+
+ if ( ! nextCell )
+ return null ;
+
+ // The two cells must have the same vertical geometry, otherwise merging does not make sense.
+ this._MarkCells( [refCell, nextCell], '_SizeTest' ) ;
+ var refGeometry = this._GetMarkerGeometry( tableMap, rowIdx, colIdx, '_SizeTest' ) ;
+ var nextGeometry = this._GetMarkerGeometry( tableMap, rowIdx, nextColIdx, '_SizeTest' ) ;
+ this._UnmarkCells( [refCell, nextCell], '_SizeTest' ) ;
+
+ if ( refGeometry.height != nextGeometry.height || refGeometry.y != nextGeometry.y )
+ return null ;
+
+ return { 'refCell' : refCell, 'nextCell' : nextCell, 'tableMap' : tableMap } ;
+}
+
+FCKTableHandler.GetMergeDownTarget = function()
+{
+ var cells = this.GetSelectedCells() ;
+ if ( cells.length != 1 )
+ return null ;
+
+ var refCell = cells[0] ;
+ var tableMap = this._CreateTableMap( refCell.parentNode.parentNode ) ;
+ var rowIdx = refCell.parentNode.rowIndex ;
+ var colIdx = this._GetCellIndexSpan( tableMap, rowIdx, refCell ) ;
+ var newRowIdx = rowIdx + ( isNaN( refCell.rowSpan ) ? 1 : refCell.rowSpan ) ;
+ if ( ! tableMap[newRowIdx] )
+ return null ;
+
+ var nextCell = tableMap[newRowIdx][colIdx] ;
+
+ if ( ! nextCell )
+ return null ;
+
+ // The two cells must have the same horizontal geometry, otherwise merging does not makes sense.
+ this._MarkCells( [refCell, nextCell], '_SizeTest' ) ;
+ var refGeometry = this._GetMarkerGeometry( tableMap, rowIdx, colIdx, '_SizeTest' ) ;
+ var nextGeometry = this._GetMarkerGeometry( tableMap, newRowIdx, colIdx, '_SizeTest' ) ;
+ this._UnmarkCells( [refCell, nextCell], '_SizeTest' ) ;
+
+ if ( refGeometry.width != nextGeometry.width || refGeometry.x != nextGeometry.x )
+ return null ;
+
+ return { 'refCell' : refCell, 'nextCell' : nextCell, 'tableMap' : tableMap } ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktablehandler_gecko.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktablehandler_gecko.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,56 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Manage table operations (non-IE).
+ */
+
+FCKTableHandler.GetSelectedCells = function()
+{
+ var aCells = new Array() ;
+
+ var oSelection = FCKSelection.GetSelection() ;
+
+ // If the selection is a text.
+ if ( oSelection.rangeCount == 1 && oSelection.anchorNode.nodeType == 3 )
+ {
+ var oParent = FCKTools.GetElementAscensor( oSelection.anchorNode, 'TD,TH' ) ;
+
+ if ( oParent )
+ aCells[0] = oParent ;
+
+ return aCells ;
+ }
+
+ for ( var i = 0 ; i < oSelection.rangeCount ; i++ )
+ {
+ var oRange = oSelection.getRangeAt(i) ;
+ var oCell ;
+
+ if ( oRange.startContainer.tagName.Equals( 'TD', 'TH' ) )
+ oCell = oRange.startContainer ;
+ else
+ oCell = oRange.startContainer.childNodes[ oRange.startOffset ] ;
+
+ if ( oCell.tagName.Equals( 'TD', 'TH' ) )
+ aCells[aCells.length] = oCell ;
+ }
+
+ return aCells ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktablehandler_ie.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktablehandler_ie.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,64 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Manage table operations (IE specific).
+ */
+
+FCKTableHandler.GetSelectedCells = function()
+{
+ if ( FCKSelection.GetType() == 'Control' )
+ {
+ var td = FCKSelection.MoveToAncestorNode( 'TD' ) ;
+ return td ? [ td ] : [] ;
+ }
+
+ var aCells = new Array() ;
+
+ var oRange = FCKSelection.GetSelection().createRange() ;
+// var oParent = oRange.parentElement() ;
+ var oParent = FCKSelection.GetParentElement() ;
+
+ if ( oParent && oParent.tagName.Equals( 'TD', 'TH' ) )
+ aCells[0] = oParent ;
+ else
+ {
+ oParent = FCKSelection.MoveToAncestorNode( 'TABLE' ) ;
+
+ if ( oParent )
+ {
+ // Loops throw all cells checking if the cell is, or part of it, is inside the selection
+ // and then add it to the selected cells collection.
+ for ( var i = 0 ; i < oParent.cells.length ; i++ )
+ {
+ var oCellRange = FCK.EditorDocument.body.createTextRange() ;
+ oCellRange.moveToElementText( oParent.cells[i] ) ;
+
+ if ( oRange.inRange( oCellRange )
+ || ( oRange.compareEndPoints('StartToStart',oCellRange) >= 0 && oRange.compareEndPoints('StartToEnd',oCellRange) <= 0 )
+ || ( oRange.compareEndPoints('EndToStart',oCellRange) >= 0 && oRange.compareEndPoints('EndToEnd',oCellRange) <= 0 ) )
+ {
+ aCells[aCells.length] = oParent.cells[i] ;
+ }
+ }
+ }
+ }
+
+ return aCells ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktoolbaritems.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktoolbaritems.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,124 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Toolbar items definitions.
+ */
+
+var FCKToolbarItems = new Object() ;
+FCKToolbarItems.LoadedItems = new Object() ;
+
+FCKToolbarItems.RegisterItem = function( itemName, item )
+{
+ this.LoadedItems[ itemName ] = item ;
+}
+
+FCKToolbarItems.GetItem = function( itemName )
+{
+ var oItem = FCKToolbarItems.LoadedItems[ itemName ] ;
+
+ if ( oItem )
+ return oItem ;
+
+ switch ( itemName )
+ {
+ case 'Source' : oItem = new FCKToolbarButton( 'Source' , FCKLang.Source, null, FCK_TOOLBARITEM_ICONTEXT, true, true, 1 ) ; break ;
+ case 'DocProps' : oItem = new FCKToolbarButton( 'DocProps' , FCKLang.DocProps, null, null, null, null, 2 ) ; break ;
+ case 'Save' : oItem = new FCKToolbarButton( 'Save' , FCKLang.Save, null, null, true, null, 3 ) ; break ;
+ case 'NewPage' : oItem = new FCKToolbarButton( 'NewPage' , FCKLang.NewPage, null, null, true, null, 4 ) ; break ;
+ case 'Preview' : oItem = new FCKToolbarButton( 'Preview' , FCKLang.Preview, null, null, true, null, 5 ) ; break ;
+ case 'Templates' : oItem = new FCKToolbarButton( 'Templates' , FCKLang.Templates, null, null, null, null, 6 ) ; break ;
+ case 'About' : oItem = new FCKToolbarButton( 'About' , FCKLang.About, null, null, true, null, 47 ) ; break ;
+
+ case 'Cut' : oItem = new FCKToolbarButton( 'Cut' , FCKLang.Cut, null, null, false, true, 7 ) ; break ;
+ case 'Copy' : oItem = new FCKToolbarButton( 'Copy' , FCKLang.Copy, null, null, false, true, 8 ) ; break ;
+ case 'Paste' : oItem = new FCKToolbarButton( 'Paste' , FCKLang.Paste, null, null, false, true, 9 ) ; break ;
+ case 'PasteText' : oItem = new FCKToolbarButton( 'PasteText' , FCKLang.PasteText, null, null, false, true, 10 ) ; break ;
+ case 'PasteWord' : oItem = new FCKToolbarButton( 'PasteWord' , FCKLang.PasteWord, null, null, false, true, 11 ) ; break ;
+ case 'Print' : oItem = new FCKToolbarButton( 'Print' , FCKLang.Print, null, null, false, true, 12 ) ; break ;
+ case 'SpellCheck' : oItem = new FCKToolbarButton( 'SpellCheck', FCKLang.SpellCheck, null, null, null, null, 13 ) ; break ;
+ case 'Undo' : oItem = new FCKToolbarButton( 'Undo' , FCKLang.Undo, null, null, false, true, 14 ) ; break ;
+ case 'Redo' : oItem = new FCKToolbarButton( 'Redo' , FCKLang.Redo, null, null, false, true, 15 ) ; break ;
+ case 'SelectAll' : oItem = new FCKToolbarButton( 'SelectAll' , FCKLang.SelectAll, null, null, true, null, 18 ) ; break ;
+ case 'RemoveFormat' : oItem = new FCKToolbarButton( 'RemoveFormat', FCKLang.RemoveFormat, null, null, false, true, 19 ) ; break ;
+ case 'FitWindow' : oItem = new FCKToolbarButton( 'FitWindow' , FCKLang.FitWindow, null, null, true, true, 66 ) ; break ;
+
+ case 'Bold' : oItem = new FCKToolbarButton( 'Bold' , FCKLang.Bold, null, null, false, true, 20 ) ; break ;
+ case 'Italic' : oItem = new FCKToolbarButton( 'Italic' , FCKLang.Italic, null, null, false, true, 21 ) ; break ;
+ case 'Underline' : oItem = new FCKToolbarButton( 'Underline' , FCKLang.Underline, null, null, false, true, 22 ) ; break ;
+ case 'StrikeThrough' : oItem = new FCKToolbarButton( 'StrikeThrough' , FCKLang.StrikeThrough, null, null, false, true, 23 ) ; break ;
+ case 'Subscript' : oItem = new FCKToolbarButton( 'Subscript' , FCKLang.Subscript, null, null, false, true, 24 ) ; break ;
+ case 'Superscript' : oItem = new FCKToolbarButton( 'Superscript' , FCKLang.Superscript, null, null, false, true, 25 ) ; break ;
+
+ case 'OrderedList' : oItem = new FCKToolbarButton( 'InsertOrderedList' , FCKLang.NumberedListLbl, FCKLang.NumberedList, null, false, true, 26 ) ; break ;
+ case 'UnorderedList' : oItem = new FCKToolbarButton( 'InsertUnorderedList' , FCKLang.BulletedListLbl, FCKLang.BulletedList, null, false, true, 27 ) ; break ;
+ case 'Outdent' : oItem = new FCKToolbarButton( 'Outdent' , FCKLang.DecreaseIndent, null, null, false, true, 28 ) ; break ;
+ case 'Indent' : oItem = new FCKToolbarButton( 'Indent' , FCKLang.IncreaseIndent, null, null, false, true, 29 ) ; break ;
+ case 'Blockquote' : oItem = new FCKToolbarButton( 'Blockquote' , FCKLang.Blockquote, null, null, false, true, 73 ) ; break ;
+ case 'CreateDiv' : oItem = new FCKToolbarButton( 'CreateDiv' , FCKLang.CreateDiv, null, null, false, true, 74 ) ; break ;
+
+ case 'Link' : oItem = new FCKToolbarButton( 'Link' , FCKLang.InsertLinkLbl, FCKLang.InsertLink, null, false, true, 34 ) ; break ;
+ case 'Unlink' : oItem = new FCKToolbarButton( 'Unlink' , FCKLang.RemoveLink, null, null, false, true, 35 ) ; break ;
+ case 'Anchor' : oItem = new FCKToolbarButton( 'Anchor' , FCKLang.Anchor, null, null, null, null, 36 ) ; break ;
+
+ case 'Image' : oItem = new FCKToolbarButton( 'Image' , FCKLang.InsertImageLbl, FCKLang.InsertImage, null, false, true, 37 ) ; break ;
+ case 'Flash' : oItem = new FCKToolbarButton( 'Flash' , FCKLang.InsertFlashLbl, FCKLang.InsertFlash, null, false, true, 38 ) ; break ;
+ case 'Table' : oItem = new FCKToolbarButton( 'Table' , FCKLang.InsertTableLbl, FCKLang.InsertTable, null, false, true, 39 ) ; break ;
+ case 'SpecialChar' : oItem = new FCKToolbarButton( 'SpecialChar' , FCKLang.InsertSpecialCharLbl, FCKLang.InsertSpecialChar, null, false, true, 42 ) ; break ;
+ case 'Smiley' : oItem = new FCKToolbarButton( 'Smiley' , FCKLang.InsertSmileyLbl, FCKLang.InsertSmiley, null, false, true, 41 ) ; break ;
+ case 'PageBreak' : oItem = new FCKToolbarButton( 'PageBreak' , FCKLang.PageBreakLbl, FCKLang.PageBreak, null, false, true, 43 ) ; break ;
+
+ case 'Rule' : oItem = new FCKToolbarButton( 'Rule' , FCKLang.InsertLineLbl, FCKLang.InsertLine, null, false, true, 40 ) ; break ;
+
+ case 'JustifyLeft' : oItem = new FCKToolbarButton( 'JustifyLeft' , FCKLang.LeftJustify, null, null, false, true, 30 ) ; break ;
+ case 'JustifyCenter' : oItem = new FCKToolbarButton( 'JustifyCenter' , FCKLang.CenterJustify, null, null, false, true, 31 ) ; break ;
+ case 'JustifyRight' : oItem = new FCKToolbarButton( 'JustifyRight' , FCKLang.RightJustify, null, null, false, true, 32 ) ; break ;
+ case 'JustifyFull' : oItem = new FCKToolbarButton( 'JustifyFull' , FCKLang.BlockJustify, null, null, false, true, 33 ) ; break ;
+
+ case 'Style' : oItem = new FCKToolbarStyleCombo() ; break ;
+ case 'FontName' : oItem = new FCKToolbarFontsCombo() ; break ;
+ case 'FontSize' : oItem = new FCKToolbarFontSizeCombo() ; break ;
+ case 'FontFormat' : oItem = new FCKToolbarFontFormatCombo() ; break ;
+
+ case 'TextColor' : oItem = new FCKToolbarPanelButton( 'TextColor', FCKLang.TextColor, null, null, 45 ) ; break ;
+ case 'BGColor' : oItem = new FCKToolbarPanelButton( 'BGColor' , FCKLang.BGColor, null, null, 46 ) ; break ;
+
+ case 'Find' : oItem = new FCKToolbarButton( 'Find' , FCKLang.Find, null, null, null, null, 16 ) ; break ;
+ case 'Replace' : oItem = new FCKToolbarButton( 'Replace' , FCKLang.Replace, null, null, null, null, 17 ) ; break ;
+
+ case 'Form' : oItem = new FCKToolbarButton( 'Form' , FCKLang.Form, null, null, null, null, 48 ) ; break ;
+ case 'Checkbox' : oItem = new FCKToolbarButton( 'Checkbox' , FCKLang.Checkbox, null, null, null, null, 49 ) ; break ;
+ case 'Radio' : oItem = new FCKToolbarButton( 'Radio' , FCKLang.RadioButton, null, null, null, null, 50 ) ; break ;
+ case 'TextField' : oItem = new FCKToolbarButton( 'TextField' , FCKLang.TextField, null, null, null, null, 51 ) ; break ;
+ case 'Textarea' : oItem = new FCKToolbarButton( 'Textarea' , FCKLang.Textarea, null, null, null, null, 52 ) ; break ;
+ case 'HiddenField' : oItem = new FCKToolbarButton( 'HiddenField' , FCKLang.HiddenField, null, null, null, null, 56 ) ; break ;
+ case 'Button' : oItem = new FCKToolbarButton( 'Button' , FCKLang.Button, null, null, null, null, 54 ) ; break ;
+ case 'Select' : oItem = new FCKToolbarButton( 'Select' , FCKLang.SelectionField, null, null, null, null, 53 ) ; break ;
+ case 'ImageButton' : oItem = new FCKToolbarButton( 'ImageButton' , FCKLang.ImageButton, null, null, null, null, 55 ) ; break ;
+ case 'ShowBlocks' : oItem = new FCKToolbarButton( 'ShowBlocks' , FCKLang.ShowBlocks, null, null, null, true, 72 ) ; break ;
+
+ default:
+ alert( FCKLang.UnknownToolbarItem.replace( /%1/g, itemName ) ) ;
+ return null ;
+ }
+
+ FCKToolbarItems.LoadedItems[ itemName ] = oItem ;
+
+ return oItem ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktoolbarset.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktoolbarset.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,399 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Defines the FCKToolbarSet object that is used to load and draw the
+ * toolbar.
+ */
+
+function FCKToolbarSet_Create( overhideLocation )
+{
+ var oToolbarSet ;
+
+ var sLocation = overhideLocation || FCKConfig.ToolbarLocation ;
+ switch ( sLocation )
+ {
+ case 'In' :
+ document.getElementById( 'xToolbarRow' ).style.display = '' ;
+ oToolbarSet = new FCKToolbarSet( document ) ;
+ break ;
+ case 'None' :
+ oToolbarSet = new FCKToolbarSet( document ) ;
+ break ;
+
+// case 'OutTop' :
+ // Not supported.
+
+ default :
+ FCK.Events.AttachEvent( 'OnBlur', FCK_OnBlur ) ;
+ FCK.Events.AttachEvent( 'OnFocus', FCK_OnFocus ) ;
+
+ var eToolbarTarget ;
+
+ // Out:[TargetWindow]([TargetId])
+ var oOutMatch = sLocation.match( /^Out:(.+)\((\w+)\)$/ ) ;
+ if ( oOutMatch )
+ {
+ if ( FCKBrowserInfo.IsAIR )
+ FCKAdobeAIR.ToolbarSet_GetOutElement( window, oOutMatch ) ;
+ else
+ eToolbarTarget = eval( 'parent.' + oOutMatch[1] ).document.getElementById( oOutMatch[2] ) ;
+ }
+ else
+ {
+ // Out:[TargetId]
+ oOutMatch = sLocation.match( /^Out:(\w+)$/ ) ;
+ if ( oOutMatch )
+ eToolbarTarget = parent.document.getElementById( oOutMatch[1] ) ;
+ }
+
+ if ( !eToolbarTarget )
+ {
+ alert( 'Invalid value for "ToolbarLocation"' ) ;
+ return arguments.callee( 'In' );
+ }
+
+ // If it is a shared toolbar, it may be already available in the target element.
+ oToolbarSet = eToolbarTarget.__FCKToolbarSet ;
+ if ( oToolbarSet )
+ break ;
+
+ // Create the IFRAME that will hold the toolbar inside the target element.
+ var eToolbarIFrame = FCKTools.GetElementDocument( eToolbarTarget ).createElement( 'iframe' ) ;
+ eToolbarIFrame.src = 'javascript:void(0)' ;
+ eToolbarIFrame.frameBorder = 0 ;
+ eToolbarIFrame.width = '100%' ;
+ eToolbarIFrame.height = '10' ;
+ eToolbarTarget.appendChild( eToolbarIFrame ) ;
+ eToolbarIFrame.unselectable = 'on' ;
+
+ // Write the basic HTML for the toolbar (copy from the editor main page).
+ var eTargetDocument = eToolbarIFrame.contentWindow.document ;
+
+ // Workaround for Safari 12256. Ticket #63
+ var sBase = '' ;
+ if ( FCKBrowserInfo.IsSafari )
+ sBase = '<base href="' + window.document.location + '">' ;
+
+ // Initialize the IFRAME document body.
+ eTargetDocument.open() ;
+ eTargetDocument.write( '<html><head>' + sBase + '<script type="text/javascript"> var adjust = function() { window.frameElement.height = document.body.scrollHeight ; }; '
+ + 'window.onresize = window.onload = '
+ + 'function(){' // poll scrollHeight until it no longer changes for 1 sec.
+ + 'var timer = null;'
+ + 'var lastHeight = -1;'
+ + 'var lastChange = 0;'
+ + 'var poller = function(){'
+ + 'var currentHeight = document.body.scrollHeight || 0;'
+ + 'var currentTime = (new Date()).getTime();'
+ + 'if (currentHeight != lastHeight){'
+ + 'lastChange = currentTime;'
+ + 'adjust();'
+ + 'lastHeight = document.body.scrollHeight;'
+ + '}'
+ + 'if (lastChange < currentTime - 1000) clearInterval(timer);'
+ + '};'
+ + 'timer = setInterval(poller, 100);'
+ + '}'
+ + '</script></head><body style="overflow: hidden">' + document.getElementById( 'xToolbarSpace' ).innerHTML + '</body></html>' ) ;
+ eTargetDocument.close() ;
+
+ if( FCKBrowserInfo.IsAIR )
+ FCKAdobeAIR.ToolbarSet_InitOutFrame( eTargetDocument ) ;
+
+ FCKTools.AddEventListener( eTargetDocument, 'contextmenu', FCKTools.CancelEvent ) ;
+
+ // Load external resources (must be done here, otherwise Firefox will not
+ // have the document DOM ready to be used right away.
+ FCKTools.AppendStyleSheet( eTargetDocument, FCKConfig.SkinEditorCSS ) ;
+
+ oToolbarSet = eToolbarTarget.__FCKToolbarSet = new FCKToolbarSet( eTargetDocument ) ;
+ oToolbarSet._IFrame = eToolbarIFrame ;
+
+ if ( FCK.IECleanup )
+ FCK.IECleanup.AddItem( eToolbarTarget, FCKToolbarSet_Target_Cleanup ) ;
+ }
+
+ oToolbarSet.CurrentInstance = FCK ;
+ if ( !oToolbarSet.ToolbarItems )
+ oToolbarSet.ToolbarItems = FCKToolbarItems ;
+
+ FCK.AttachToOnSelectionChange( oToolbarSet.RefreshItemsState ) ;
+
+ return oToolbarSet ;
+}
+
+function FCK_OnBlur( editorInstance )
+{
+ var eToolbarSet = editorInstance.ToolbarSet ;
+
+ if ( eToolbarSet.CurrentInstance == editorInstance )
+ eToolbarSet.Disable() ;
+}
+
+function FCK_OnFocus( editorInstance )
+{
+ var oToolbarset = editorInstance.ToolbarSet ;
+ var oInstance = editorInstance || FCK ;
+
+ // Unregister the toolbar window from the current instance.
+ oToolbarset.CurrentInstance.FocusManager.RemoveWindow( oToolbarset._IFrame.contentWindow ) ;
+
+ // Set the new current instance.
+ oToolbarset.CurrentInstance = oInstance ;
+
+ // Register the toolbar window in the current instance.
+ oInstance.FocusManager.AddWindow( oToolbarset._IFrame.contentWindow, true ) ;
+
+ oToolbarset.Enable() ;
+}
+
+function FCKToolbarSet_Cleanup()
+{
+ this._TargetElement = null ;
+ this._IFrame = null ;
+}
+
+function FCKToolbarSet_Target_Cleanup()
+{
+ this.__FCKToolbarSet = null ;
+}
+
+var FCKToolbarSet = function( targetDocument )
+{
+ this._Document = targetDocument ;
+
+ // Get the element that will hold the elements structure.
+ this._TargetElement = targetDocument.getElementById( 'xToolbar' ) ;
+
+ // Setup the expand and collapse handlers.
+ var eExpandHandle = targetDocument.getElementById( 'xExpandHandle' ) ;
+ var eCollapseHandle = targetDocument.getElementById( 'xCollapseHandle' ) ;
+
+ eExpandHandle.title = FCKLang.ToolbarExpand ;
+ FCKTools.AddEventListener( eExpandHandle, 'click', FCKToolbarSet_Expand_OnClick ) ;
+
+ eCollapseHandle.title = FCKLang.ToolbarCollapse ;
+ FCKTools.AddEventListener( eCollapseHandle, 'click', FCKToolbarSet_Collapse_OnClick ) ;
+
+ // Set the toolbar state at startup.
+ if ( !FCKConfig.ToolbarCanCollapse || FCKConfig.ToolbarStartExpanded )
+ this.Expand() ;
+ else
+ this.Collapse() ;
+
+ // Enable/disable the collapse handler
+ eCollapseHandle.style.display = FCKConfig.ToolbarCanCollapse ? '' : 'none' ;
+
+ if ( FCKConfig.ToolbarCanCollapse )
+ eCollapseHandle.style.display = '' ;
+ else
+ targetDocument.getElementById( 'xTBLeftBorder' ).style.display = '' ;
+
+ // Set the default properties.
+ this.Toolbars = new Array() ;
+ this.IsLoaded = false ;
+
+ if ( FCK.IECleanup )
+ FCK.IECleanup.AddItem( this, FCKToolbarSet_Cleanup ) ;
+}
+
+function FCKToolbarSet_Expand_OnClick()
+{
+ FCK.ToolbarSet.Expand() ;
+}
+
+function FCKToolbarSet_Collapse_OnClick()
+{
+ FCK.ToolbarSet.Collapse() ;
+}
+
+FCKToolbarSet.prototype.Expand = function()
+{
+ this._ChangeVisibility( false ) ;
+}
+
+FCKToolbarSet.prototype.Collapse = function()
+{
+ this._ChangeVisibility( true ) ;
+}
+
+FCKToolbarSet.prototype._ChangeVisibility = function( collapse )
+{
+ this._Document.getElementById( 'xCollapsed' ).style.display = collapse ? '' : 'none' ;
+ this._Document.getElementById( 'xExpanded' ).style.display = collapse ? 'none' : '' ;
+
+ if ( FCKBrowserInfo.IsGecko )
+ {
+ // I had to use "setTimeout" because Gecko was not responding in a right
+ // way when calling window.onresize() directly.
+ FCKTools.RunFunction( window.onresize ) ;
+ }
+}
+
+FCKToolbarSet.prototype.Load = function( toolbarSetName )
+{
+ this.Name = toolbarSetName ;
+
+ this.Items = new Array() ;
+
+ // Reset the array of toolbar items that are active only on WYSIWYG mode.
+ this.ItemsWysiwygOnly = new Array() ;
+
+ // Reset the array of toolbar items that are sensitive to the cursor position.
+ this.ItemsContextSensitive = new Array() ;
+
+ // Cleanup the target element.
+ this._TargetElement.innerHTML = '' ;
+
+ var ToolbarSet = FCKConfig.ToolbarSets[toolbarSetName] ;
+
+ if ( !ToolbarSet )
+ {
+ alert( FCKLang.UnknownToolbarSet.replace( /%1/g, toolbarSetName ) ) ;
+ return ;
+ }
+
+ this.Toolbars = new Array() ;
+
+ for ( var x = 0 ; x < ToolbarSet.length ; x++ )
+ {
+ var oToolbarItems = ToolbarSet[x] ;
+
+ // If the configuration for the toolbar is missing some element or has any extra comma
+ // this item won't be valid, so skip it and keep on processing.
+ if ( !oToolbarItems )
+ continue ;
+
+ var oToolbar ;
+
+ if ( typeof( oToolbarItems ) == 'string' )
+ {
+ if ( oToolbarItems == '/' )
+ oToolbar = new FCKToolbarBreak() ;
+ }
+ else
+ {
+ oToolbar = new FCKToolbar() ;
+
+ for ( var j = 0 ; j < oToolbarItems.length ; j++ )
+ {
+ var sItem = oToolbarItems[j] ;
+
+ if ( sItem == '-')
+ oToolbar.AddSeparator() ;
+ else
+ {
+ var oItem = FCKToolbarItems.GetItem( sItem ) ;
+ if ( oItem )
+ {
+ oToolbar.AddItem( oItem ) ;
+
+ this.Items.push( oItem ) ;
+
+ if ( !oItem.SourceView )
+ this.ItemsWysiwygOnly.push( oItem ) ;
+
+ if ( oItem.ContextSensitive )
+ this.ItemsContextSensitive.push( oItem ) ;
+ }
+ }
+ }
+
+ // oToolbar.AddTerminator() ;
+ }
+
+ oToolbar.Create( this._TargetElement ) ;
+
+ this.Toolbars[ this.Toolbars.length ] = oToolbar ;
+ }
+
+ FCKTools.DisableSelection( this._Document.getElementById( 'xCollapseHandle' ).parentNode ) ;
+
+ if ( FCK.Status != FCK_STATUS_COMPLETE )
+ FCK.Events.AttachEvent( 'OnStatusChange', this.RefreshModeState ) ;
+ else
+ this.RefreshModeState() ;
+
+ this.IsLoaded = true ;
+ this.IsEnabled = true ;
+
+ FCKTools.RunFunction( this.OnLoad ) ;
+}
+
+FCKToolbarSet.prototype.Enable = function()
+{
+ if ( this.IsEnabled )
+ return ;
+
+ this.IsEnabled = true ;
+
+ var aItems = this.Items ;
+ for ( var i = 0 ; i < aItems.length ; i++ )
+ aItems[i].RefreshState() ;
+}
+
+FCKToolbarSet.prototype.Disable = function()
+{
+ if ( !this.IsEnabled )
+ return ;
+
+ this.IsEnabled = false ;
+
+ var aItems = this.Items ;
+ for ( var i = 0 ; i < aItems.length ; i++ )
+ aItems[i].Disable() ;
+}
+
+FCKToolbarSet.prototype.RefreshModeState = function( editorInstance )
+{
+ if ( FCK.Status != FCK_STATUS_COMPLETE )
+ return ;
+
+ var oToolbarSet = editorInstance ? editorInstance.ToolbarSet : this ;
+ var aItems = oToolbarSet.ItemsWysiwygOnly ;
+
+ if ( FCK.EditMode == FCK_EDITMODE_WYSIWYG )
+ {
+ // Enable all buttons that are available on WYSIWYG mode only.
+ for ( var i = 0 ; i < aItems.length ; i++ )
+ aItems[i].Enable() ;
+
+ // Refresh the buttons state.
+ oToolbarSet.RefreshItemsState( editorInstance ) ;
+ }
+ else
+ {
+ // Refresh the buttons state.
+ oToolbarSet.RefreshItemsState( editorInstance ) ;
+
+ // Disable all buttons that are available on WYSIWYG mode only.
+ for ( var j = 0 ; j < aItems.length ; j++ )
+ aItems[j].Disable() ;
+ }
+}
+
+FCKToolbarSet.prototype.RefreshItemsState = function( editorInstance )
+{
+
+ var aItems = ( editorInstance ? editorInstance.ToolbarSet : this ).ItemsContextSensitive ;
+
+ for ( var i = 0 ; i < aItems.length ; i++ )
+ aItems[i].RefreshState() ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktools.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktools.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,749 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Utility functions.
+ */
+
+var FCKTools = new Object() ;
+
+FCKTools.CreateBogusBR = function( targetDocument )
+{
+ var eBR = targetDocument.createElement( 'br' ) ;
+// eBR.setAttribute( '_moz_editor_bogus_node', 'TRUE' ) ;
+ eBR.setAttribute( 'type', '_moz' ) ;
+ return eBR ;
+}
+
+/**
+ * Fixes relative URL entries defined inside CSS styles by appending a prefix
+ * to them.
+ * @param (String) cssStyles The CSS styles definition possibly containing url()
+ * paths.
+ * @param (String) urlFixPrefix The prefix to append to relative URLs.
+ */
+FCKTools.FixCssUrls = function( urlFixPrefix, cssStyles )
+{
+ if ( !urlFixPrefix || urlFixPrefix.length == 0 )
+ return cssStyles ;
+
+ return cssStyles.replace( /url\s*\(([\s'"]*)(.*?)([\s"']*)\)/g, function( match, opener, path, closer )
+ {
+ if ( /^\/|^\w?:/.test( path ) )
+ return match ;
+ else
+ return 'url(' + opener + urlFixPrefix + path + closer + ')' ;
+ } ) ;
+}
+
+FCKTools._GetUrlFixedCss = function( cssStyles, urlFixPrefix )
+{
+ var match = cssStyles.match( /^([^|]+)\|([\s\S]*)/ ) ;
+
+ if ( match )
+ return FCKTools.FixCssUrls( match[1], match[2] ) ;
+ else
+ return cssStyles ;
+}
+
+/**
+ * Appends a <link css> or <style> element to the document.
+ * @param (Object) documentElement The DOM document object to which append the
+ * stylesheet.
+ * @param (Variant) cssFileOrDef A String pointing to the CSS file URL or an
+ * Array with many CSS file URLs or the CSS definitions for the <style>
+ * element.
+ * @return {Array} An array containing all elements created in the target
+ * document. It may include <link> or <style> elements, depending on the
+ * value passed with cssFileOrDef.
+ */
+FCKTools.AppendStyleSheet = function( domDocument, cssFileOrArrayOrDef )
+{
+ if ( !cssFileOrArrayOrDef )
+ return [] ;
+
+ if ( typeof( cssFileOrArrayOrDef ) == 'string' )
+ {
+ // Test if the passed argument is an URL.
+ if ( /[\\\/\.][^{}]*$/.test( cssFileOrArrayOrDef ) )
+ {
+ // The string may have several URLs separated by comma.
+ return this.AppendStyleSheet( domDocument, cssFileOrArrayOrDef.split(',') ) ;
+ }
+ else
+ return [ this.AppendStyleString( domDocument, FCKTools._GetUrlFixedCss( cssFileOrArrayOrDef ) ) ] ;
+ }
+ else
+ {
+ var styles = [] ;
+ for ( var i = 0 ; i < cssFileOrArrayOrDef.length ; i++ )
+ styles.push( this._AppendStyleSheet( domDocument, cssFileOrArrayOrDef[i] ) ) ;
+ return styles ;
+ }
+}
+
+FCKTools.GetStyleHtml = (function()
+{
+ var getStyle = function( styleDef, markTemp )
+ {
+ if ( styleDef.length == 0 )
+ return '' ;
+
+ var temp = markTemp ? ' _fcktemp="true"' : '' ;
+ return '<' + 'style type="text/css"' + temp + '>' + styleDef + '<' + '/style>' ;
+ }
+
+ var getLink = function( cssFileUrl, markTemp )
+ {
+ if ( cssFileUrl.length == 0 )
+ return '' ;
+
+ var temp = markTemp ? ' _fcktemp="true"' : '' ;
+ return '<' + 'link href="' + cssFileUrl + '" type="text/css" rel="stylesheet" ' + temp + '/>' ;
+ }
+
+ return function( cssFileOrArrayOrDef, markTemp )
+ {
+ if ( !cssFileOrArrayOrDef )
+ return '' ;
+
+ if ( typeof( cssFileOrArrayOrDef ) == 'string' )
+ {
+ // Test if the passed argument is an URL.
+ if ( /[\\\/\.][^{}]*$/.test( cssFileOrArrayOrDef ) )
+ {
+ // The string may have several URLs separated by comma.
+ return this.GetStyleHtml( cssFileOrArrayOrDef.split(','), markTemp ) ;
+ }
+ else
+ return getStyle( this._GetUrlFixedCss( cssFileOrArrayOrDef ), markTemp ) ;
+ }
+ else
+ {
+ var html = '' ;
+
+ for ( var i = 0 ; i < cssFileOrArrayOrDef.length ; i++ )
+ html += getLink( cssFileOrArrayOrDef[i], markTemp ) ;
+
+ return html ;
+ }
+ }
+})() ;
+
+FCKTools.GetElementDocument = function ( element )
+{
+ return element.ownerDocument || element.document ;
+}
+
+// Get the window object where the element is placed in.
+FCKTools.GetElementWindow = function( element )
+{
+ return this.GetDocumentWindow( this.GetElementDocument( element ) ) ;
+}
+
+FCKTools.GetDocumentWindow = function( document )
+{
+ // With Safari, there is not way to retrieve the window from the document, so we must fix it.
+ if ( FCKBrowserInfo.IsSafari && !document.parentWindow )
+ this.FixDocumentParentWindow( window.top ) ;
+
+ return document.parentWindow || document.defaultView ;
+}
+
+/*
+ This is a Safari specific function that fix the reference to the parent
+ window from the document object.
+*/
+FCKTools.FixDocumentParentWindow = function( targetWindow )
+{
+ if ( targetWindow.document )
+ targetWindow.document.parentWindow = targetWindow ;
+
+ for ( var i = 0 ; i < targetWindow.frames.length ; i++ )
+ FCKTools.FixDocumentParentWindow( targetWindow.frames[i] ) ;
+}
+
+FCKTools.HTMLEncode = function( text )
+{
+ if ( !text )
+ return '' ;
+
+ text = text.replace( /&/g, '&' ) ;
+ text = text.replace( /</g, '<' ) ;
+ text = text.replace( />/g, '>' ) ;
+
+ return text ;
+}
+
+FCKTools.HTMLDecode = function( text )
+{
+ if ( !text )
+ return '' ;
+
+ text = text.replace( />/g, '>' ) ;
+ text = text.replace( /</g, '<' ) ;
+ text = text.replace( /&/g, '&' ) ;
+
+ return text ;
+}
+
+FCKTools._ProcessLineBreaksForPMode = function( oEditor, text, liState, node, strArray )
+{
+ var closeState = 0 ;
+ var blockStartTag = "<p>" ;
+ var blockEndTag = "</p>" ;
+ var lineBreakTag = "<br />" ;
+ if ( liState )
+ {
+ blockStartTag = "<li>" ;
+ blockEndTag = "</li>" ;
+ closeState = 1 ;
+ }
+
+ // Are we currently inside a <p> tag now?
+ // If yes, close it at the next double line break.
+ while ( node && node != oEditor.FCK.EditorDocument.body )
+ {
+ if ( node.tagName.toLowerCase() == 'p' )
+ {
+ closeState = 1 ;
+ break;
+ }
+ node = node.parentNode ;
+ }
+
+ for ( var i = 0 ; i < text.length ; i++ )
+ {
+ var c = text.charAt( i ) ;
+ if ( c == '\r' )
+ continue ;
+
+ if ( c != '\n' )
+ {
+ strArray.push( c ) ;
+ continue ;
+ }
+
+ // Now we have encountered a line break.
+ // Check if the next character is also a line break.
+ var n = text.charAt( i + 1 ) ;
+ if ( n == '\r' )
+ {
+ i++ ;
+ n = text.charAt( i + 1 ) ;
+ }
+ if ( n == '\n' )
+ {
+ i++ ; // ignore next character - we have already processed it.
+ if ( closeState )
+ strArray.push( blockEndTag ) ;
+ strArray.push( blockStartTag ) ;
+ closeState = 1 ;
+ }
+ else
+ strArray.push( lineBreakTag ) ;
+ }
+}
+
+FCKTools._ProcessLineBreaksForDivMode = function( oEditor, text, liState, node, strArray )
+{
+ var closeState = 0 ;
+ var blockStartTag = "<div>" ;
+ var blockEndTag = "</div>" ;
+ if ( liState )
+ {
+ blockStartTag = "<li>" ;
+ blockEndTag = "</li>" ;
+ closeState = 1 ;
+ }
+
+ // Are we currently inside a <div> tag now?
+ // If yes, close it at the next double line break.
+ while ( node && node != oEditor.FCK.EditorDocument.body )
+ {
+ if ( node.tagName.toLowerCase() == 'div' )
+ {
+ closeState = 1 ;
+ break ;
+ }
+ node = node.parentNode ;
+ }
+
+ for ( var i = 0 ; i < text.length ; i++ )
+ {
+ var c = text.charAt( i ) ;
+ if ( c == '\r' )
+ continue ;
+
+ if ( c != '\n' )
+ {
+ strArray.push( c ) ;
+ continue ;
+ }
+
+ if ( closeState )
+ {
+ if ( strArray[ strArray.length - 1 ] == blockStartTag )
+ {
+ // A div tag must have some contents inside for it to be visible.
+ strArray.push( " " ) ;
+ }
+ strArray.push( blockEndTag ) ;
+ }
+ strArray.push( blockStartTag ) ;
+ closeState = 1 ;
+ }
+ if ( closeState )
+ strArray.push( blockEndTag ) ;
+}
+
+FCKTools._ProcessLineBreaksForBrMode = function( oEditor, text, liState, node, strArray )
+{
+ var closeState = 0 ;
+ var blockStartTag = "<br />" ;
+ var blockEndTag = "" ;
+ if ( liState )
+ {
+ blockStartTag = "<li>" ;
+ blockEndTag = "</li>" ;
+ closeState = 1 ;
+ }
+
+ for ( var i = 0 ; i < text.length ; i++ )
+ {
+ var c = text.charAt( i ) ;
+ if ( c == '\r' )
+ continue ;
+
+ if ( c != '\n' )
+ {
+ strArray.push( c ) ;
+ continue ;
+ }
+
+ if ( closeState && blockEndTag.length )
+ strArray.push ( blockEndTag ) ;
+ strArray.push( blockStartTag ) ;
+ closeState = 1 ;
+ }
+}
+
+FCKTools.ProcessLineBreaks = function( oEditor, oConfig, text )
+{
+ var enterMode = oConfig.EnterMode.toLowerCase() ;
+ var strArray = [] ;
+
+ // Is the caret or selection inside an <li> tag now?
+ var liState = 0 ;
+ var range = new oEditor.FCKDomRange( oEditor.FCK.EditorWindow ) ;
+ range.MoveToSelection() ;
+ var node = range._Range.startContainer ;
+ while ( node && node.nodeType != 1 )
+ node = node.parentNode ;
+ if ( node && node.tagName.toLowerCase() == 'li' )
+ liState = 1 ;
+
+ if ( enterMode == 'p' )
+ this._ProcessLineBreaksForPMode( oEditor, text, liState, node, strArray ) ;
+ else if ( enterMode == 'div' )
+ this._ProcessLineBreaksForDivMode( oEditor, text, liState, node, strArray ) ;
+ else if ( enterMode == 'br' )
+ this._ProcessLineBreaksForBrMode( oEditor, text, liState, node, strArray ) ;
+ return strArray.join( "" ) ;
+}
+
+/**
+ * Adds an option to a SELECT element.
+ */
+FCKTools.AddSelectOption = function( selectElement, optionText, optionValue )
+{
+ var oOption = FCKTools.GetElementDocument( selectElement ).createElement( "OPTION" ) ;
+
+ oOption.text = optionText ;
+ oOption.value = optionValue ;
+
+ selectElement.options.add(oOption) ;
+
+ return oOption ;
+}
+
+FCKTools.RunFunction = function( func, thisObject, paramsArray, timerWindow )
+{
+ if ( func )
+ this.SetTimeout( func, 0, thisObject, paramsArray, timerWindow ) ;
+}
+
+FCKTools.SetTimeout = function( func, milliseconds, thisObject, paramsArray, timerWindow )
+{
+ return ( timerWindow || window ).setTimeout(
+ function()
+ {
+ if ( paramsArray )
+ func.apply( thisObject, [].concat( paramsArray ) ) ;
+ else
+ func.apply( thisObject ) ;
+ },
+ milliseconds ) ;
+}
+
+FCKTools.SetInterval = function( func, milliseconds, thisObject, paramsArray, timerWindow )
+{
+ return ( timerWindow || window ).setInterval(
+ function()
+ {
+ func.apply( thisObject, paramsArray || [] ) ;
+ },
+ milliseconds ) ;
+}
+
+FCKTools.ConvertStyleSizeToHtml = function( size )
+{
+ return size.EndsWith( '%' ) ? size : parseInt( size, 10 ) ;
+}
+
+FCKTools.ConvertHtmlSizeToStyle = function( size )
+{
+ return size.EndsWith( '%' ) ? size : ( size + 'px' ) ;
+}
+
+// START iCM MODIFICATIONS
+// Amended to accept a list of one or more ascensor tag names
+// Amended to check the element itself before working back up through the parent hierarchy
+FCKTools.GetElementAscensor = function( element, ascensorTagNames )
+{
+// var e = element.parentNode ;
+ var e = element ;
+ var lstTags = "," + ascensorTagNames.toUpperCase() + "," ;
+
+ while ( e )
+ {
+ if ( lstTags.indexOf( "," + e.nodeName.toUpperCase() + "," ) != -1 )
+ return e ;
+
+ e = e.parentNode ;
+ }
+ return null ;
+}
+// END iCM MODIFICATIONS
+
+FCKTools.CreateEventListener = function( func, params )
+{
+ var f = function()
+ {
+ var aAllParams = [] ;
+
+ for ( var i = 0 ; i < arguments.length ; i++ )
+ aAllParams.push( arguments[i] ) ;
+
+ func.apply( this, aAllParams.concat( params ) ) ;
+ }
+
+ return f ;
+}
+
+FCKTools.IsStrictMode = function( document )
+{
+ // There is no compatMode in Safari, but it seams that it always behave as
+ // CSS1Compat, so let's assume it as the default for that browser.
+ return ( 'CSS1Compat' == ( document.compatMode || ( FCKBrowserInfo.IsSafari ? 'CSS1Compat' : null ) ) ) ;
+}
+
+// Transforms a "arguments" object to an array.
+FCKTools.ArgumentsToArray = function( args, startIndex, maxLength )
+{
+ startIndex = startIndex || 0 ;
+ maxLength = maxLength || args.length ;
+
+ var argsArray = new Array() ;
+
+ for ( var i = startIndex ; i < startIndex + maxLength && i < args.length ; i++ )
+ argsArray.push( args[i] ) ;
+
+ return argsArray ;
+}
+
+FCKTools.CloneObject = function( sourceObject )
+{
+ var fCloneCreator = function() {} ;
+ fCloneCreator.prototype = sourceObject ;
+ return new fCloneCreator ;
+}
+
+// Appends a bogus <br> at the end of the element, if not yet available.
+FCKTools.AppendBogusBr = function( element )
+{
+ if ( !element )
+ return ;
+
+ var eLastChild = this.GetLastItem( element.getElementsByTagName('br') ) ;
+
+ if ( !eLastChild || ( eLastChild.getAttribute( 'type', 2 ) != '_moz' && eLastChild.getAttribute( '_moz_dirty' ) == null ) )
+ {
+ var doc = this.GetElementDocument( element ) ;
+
+ if ( FCKBrowserInfo.IsOpera )
+ element.appendChild( doc.createTextNode('') ) ;
+ else
+ element.appendChild( this.CreateBogusBR( doc ) ) ;
+ }
+}
+
+FCKTools.GetLastItem = function( list )
+{
+ if ( list.length > 0 )
+ return list[ list.length - 1 ] ;
+
+ return null ;
+}
+
+FCKTools.GetDocumentPosition = function( w, node )
+{
+ var x = 0 ;
+ var y = 0 ;
+ var curNode = node ;
+ var prevNode = null ;
+ var curWindow = FCKTools.GetElementWindow( curNode ) ;
+ while ( curNode && !( curWindow == w && ( curNode == w.document.body || curNode == w.document.documentElement ) ) )
+ {
+ x += curNode.offsetLeft - curNode.scrollLeft ;
+ y += curNode.offsetTop - curNode.scrollTop ;
+
+ if ( ! FCKBrowserInfo.IsOpera )
+ {
+ var scrollNode = prevNode ;
+ while ( scrollNode && scrollNode != curNode )
+ {
+ x -= scrollNode.scrollLeft ;
+ y -= scrollNode.scrollTop ;
+ scrollNode = scrollNode.parentNode ;
+ }
+ }
+
+ prevNode = curNode ;
+ if ( curNode.offsetParent )
+ curNode = curNode.offsetParent ;
+ else
+ {
+ if ( curWindow != w )
+ {
+ curNode = curWindow.frameElement ;
+ prevNode = null ;
+ if ( curNode )
+ curWindow = curNode.contentWindow.parent ;
+ }
+ else
+ curNode = null ;
+ }
+ }
+
+ // document.body is a special case when it comes to offsetTop and offsetLeft values.
+ // 1. It matters if document.body itself is a positioned element;
+ // 2. It matters is when we're in IE and the element has no positioned ancestor.
+ // Otherwise the values should be ignored.
+ if ( FCKDomTools.GetCurrentElementStyle( w.document.body, 'position') != 'static'
+ || ( FCKBrowserInfo.IsIE && FCKDomTools.GetPositionedAncestor( node ) == null ) )
+ {
+ x += w.document.body.offsetLeft ;
+ y += w.document.body.offsetTop ;
+ }
+
+ return { "x" : x, "y" : y } ;
+}
+
+FCKTools.GetWindowPosition = function( w, node )
+{
+ var pos = this.GetDocumentPosition( w, node ) ;
+ var scroll = FCKTools.GetScrollPosition( w ) ;
+ pos.x -= scroll.X ;
+ pos.y -= scroll.Y ;
+ return pos ;
+}
+
+FCKTools.ProtectFormStyles = function( formNode )
+{
+ if ( !formNode || formNode.nodeType != 1 || formNode.tagName.toLowerCase() != 'form' )
+ return [] ;
+ var hijackRecord = [] ;
+ var hijackNames = [ 'style', 'className' ] ;
+ for ( var i = 0 ; i < hijackNames.length ; i++ )
+ {
+ var name = hijackNames[i] ;
+ if ( formNode.elements.namedItem( name ) )
+ {
+ var hijackNode = formNode.elements.namedItem( name ) ;
+ hijackRecord.push( [ hijackNode, hijackNode.nextSibling ] ) ;
+ formNode.removeChild( hijackNode ) ;
+ }
+ }
+ return hijackRecord ;
+}
+
+FCKTools.RestoreFormStyles = function( formNode, hijackRecord )
+{
+ if ( !formNode || formNode.nodeType != 1 || formNode.tagName.toLowerCase() != 'form' )
+ return ;
+ if ( hijackRecord.length > 0 )
+ {
+ for ( var i = hijackRecord.length - 1 ; i >= 0 ; i-- )
+ {
+ var node = hijackRecord[i][0] ;
+ var sibling = hijackRecord[i][1] ;
+ if ( sibling )
+ formNode.insertBefore( node, sibling ) ;
+ else
+ formNode.appendChild( node ) ;
+ }
+ }
+}
+
+// Perform a one-step DFS walk.
+FCKTools.GetNextNode = function( node, limitNode )
+{
+ if ( node.firstChild )
+ return node.firstChild ;
+ else if ( node.nextSibling )
+ return node.nextSibling ;
+ else
+ {
+ var ancestor = node.parentNode ;
+ while ( ancestor )
+ {
+ if ( ancestor == limitNode )
+ return null ;
+ if ( ancestor.nextSibling )
+ return ancestor.nextSibling ;
+ else
+ ancestor = ancestor.parentNode ;
+ }
+ }
+ return null ;
+}
+
+FCKTools.GetNextTextNode = function( textnode, limitNode, checkStop )
+{
+ node = this.GetNextNode( textnode, limitNode ) ;
+ if ( checkStop && node && checkStop( node ) )
+ return null ;
+ while ( node && node.nodeType != 3 )
+ {
+ node = this.GetNextNode( node, limitNode ) ;
+ if ( checkStop && node && checkStop( node ) )
+ return null ;
+ }
+ return node ;
+}
+
+/**
+ * Merge all objects passed by argument into a single object.
+ */
+FCKTools.Merge = function()
+{
+ var args = arguments ;
+ var o = args[0] ;
+
+ for ( var i = 1 ; i < args.length ; i++ )
+ {
+ var arg = args[i] ;
+ for ( var p in arg )
+ o[p] = arg[p] ;
+ }
+
+ return o ;
+}
+
+/**
+ * Check if the passed argument is a real Array. It may not working when
+ * calling it cross windows.
+ */
+FCKTools.IsArray = function( it )
+{
+ return ( it instanceof Array ) ;
+}
+
+/**
+ * Appends a "length" property to an object, containing the number of
+ * properties available on it, excluded the append property itself.
+ */
+FCKTools.AppendLengthProperty = function( targetObject, propertyName )
+{
+ var counter = 0 ;
+
+ for ( var n in targetObject )
+ counter++ ;
+
+ return targetObject[ propertyName || 'length' ] = counter ;
+}
+
+/**
+ * Gets the browser parsed version of a css text (style attribute value). On
+ * some cases, the browser makes changes to the css text, returning a different
+ * value. For example, hexadecimal colors get transformed to rgb().
+ */
+FCKTools.NormalizeCssText = function( unparsedCssText )
+{
+ // Injects the style in a temporary span object, so the browser parses it,
+ // retrieving its final format.
+ var tempSpan = document.createElement( 'span' ) ;
+ tempSpan.style.cssText = unparsedCssText ;
+ return tempSpan.style.cssText ;
+}
+
+/**
+ * Binding the "this" reference to an object for a function.
+ */
+FCKTools.Bind = function( subject, func )
+{
+ return function(){ return func.apply( subject, arguments ) ; } ;
+}
+
+/**
+ * Retrieve the correct "empty iframe" URL for the current browser, which
+ * causes the minimum fuzz (e.g. security warnings in HTTPS, DNS error in
+ * IE5.5, etc.) for that browser, making the iframe ready to DOM use whithout
+ * having to loading an external file.
+ */
+FCKTools.GetVoidUrl = function()
+{
+ if ( FCK_IS_CUSTOM_DOMAIN )
+ return "javascript: void( function(){" +
+ "document.open();" +
+ "document.write('<html><head><title></title></head><body></body></html>');" +
+ "document.domain = '" + FCK_RUNTIME_DOMAIN + "';" +
+ "document.close();" +
+ "}() ) ;";
+
+ if ( FCKBrowserInfo.IsIE )
+ {
+ if ( FCKBrowserInfo.IsIE7 || !FCKBrowserInfo.IsIE6 )
+ return "" ; // IE7+ / IE5.5
+ else
+ return "javascript: '';" ; // IE6+
+ }
+
+ return "javascript: void(0);" ; // All other browsers.
+}
+
+FCKTools.ResetStyles = function( element )
+{
+ element.style.cssText = 'margin:0;' +
+ 'padding:0;' +
+ 'border:0;' +
+ 'background-color:transparent;' +
+ 'background-image:none;' ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktools_gecko.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktools_gecko.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,282 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Utility functions. (Gecko version).
+ */
+
+FCKTools.CancelEvent = function( e )
+{
+ if ( e )
+ e.preventDefault() ;
+}
+
+FCKTools.DisableSelection = function( element )
+{
+ if ( FCKBrowserInfo.IsGecko )
+ element.style.MozUserSelect = 'none' ; // Gecko only.
+ else if ( FCKBrowserInfo.IsSafari )
+ element.style.KhtmlUserSelect = 'none' ; // WebKit only.
+ else
+ element.style.userSelect = 'none' ; // CSS3 (not supported yet).
+}
+
+// Appends a CSS file to a document.
+FCKTools._AppendStyleSheet = function( documentElement, cssFileUrl )
+{
+ var e = documentElement.createElement( 'LINK' ) ;
+ e.rel = 'stylesheet' ;
+ e.type = 'text/css' ;
+ e.href = cssFileUrl ;
+ documentElement.getElementsByTagName("HEAD")[0].appendChild( e ) ;
+ return e ;
+}
+
+// Appends a CSS style string to a document.
+FCKTools.AppendStyleString = function( documentElement, cssStyles )
+{
+ if ( !cssStyles )
+ return null ;
+
+ var e = documentElement.createElement( "STYLE" ) ;
+ e.appendChild( documentElement.createTextNode( cssStyles ) ) ;
+ documentElement.getElementsByTagName( "HEAD" )[0].appendChild( e ) ;
+ return e ;
+}
+
+// Removes all attributes and values from the element.
+FCKTools.ClearElementAttributes = function( element )
+{
+ // Loop throw all attributes in the element
+ for ( var i = 0 ; i < element.attributes.length ; i++ )
+ {
+ // Remove the element by name.
+ element.removeAttribute( element.attributes[i].name, 0 ) ; // 0 : Case Insensitive
+ }
+}
+
+// Returns an Array of strings with all defined in the elements inside another element.
+FCKTools.GetAllChildrenIds = function( parentElement )
+{
+ // Create the array that will hold all Ids.
+ var aIds = new Array() ;
+
+ // Define a recursive function that search for the Ids.
+ var fGetIds = function( parent )
+ {
+ for ( var i = 0 ; i < parent.childNodes.length ; i++ )
+ {
+ var sId = parent.childNodes[i].id ;
+
+ // Check if the Id is defined for the element.
+ if ( sId && sId.length > 0 ) aIds[ aIds.length ] = sId ;
+
+ // Recursive call.
+ fGetIds( parent.childNodes[i] ) ;
+ }
+ }
+
+ // Start the recursive calls.
+ fGetIds( parentElement ) ;
+
+ return aIds ;
+}
+
+// Replaces a tag with its contents. For example "<span>My <b>tag</b></span>"
+// will be replaced with "My <b>tag</b>".
+FCKTools.RemoveOuterTags = function( e )
+{
+ var oFragment = e.ownerDocument.createDocumentFragment() ;
+
+ for ( var i = 0 ; i < e.childNodes.length ; i++ )
+ oFragment.appendChild( e.childNodes[i].cloneNode(true) ) ;
+
+ e.parentNode.replaceChild( oFragment, e ) ;
+}
+
+FCKTools.CreateXmlObject = function( object )
+{
+ switch ( object )
+ {
+ case 'XmlHttp' :
+ return new XMLHttpRequest() ;
+
+ case 'DOMDocument' :
+ // Originaly, we were had the following here:
+ // return document.implementation.createDocument( '', '', null ) ;
+ // But that doesn't work if we're running under domain relaxation mode, so we need a workaround.
+ // See http://ajaxian.com/archives/xml-messages-with-cross-domain-json about the trick we're using.
+ var doc = ( new DOMParser() ).parseFromString( '<tmp></tmp>', 'text/xml' ) ;
+ FCKDomTools.RemoveNode( doc.firstChild ) ;
+ return doc ;
+ }
+ return null ;
+}
+
+FCKTools.GetScrollPosition = function( relativeWindow )
+{
+ return { X : relativeWindow.pageXOffset, Y : relativeWindow.pageYOffset } ;
+}
+
+FCKTools.AddEventListener = function( sourceObject, eventName, listener )
+{
+ sourceObject.addEventListener( eventName, listener, false ) ;
+}
+
+FCKTools.RemoveEventListener = function( sourceObject, eventName, listener )
+{
+ sourceObject.removeEventListener( eventName, listener, false ) ;
+}
+
+// Listeners attached with this function cannot be detached.
+FCKTools.AddEventListenerEx = function( sourceObject, eventName, listener, paramsArray )
+{
+ sourceObject.addEventListener(
+ eventName,
+ function( e )
+ {
+ listener.apply( sourceObject, [ e ].concat( paramsArray || [] ) ) ;
+ },
+ false
+ ) ;
+}
+
+// Returns and object with the "Width" and "Height" properties.
+FCKTools.GetViewPaneSize = function( win )
+{
+ return { Width : win.innerWidth, Height : win.innerHeight } ;
+}
+
+FCKTools.SaveStyles = function( element )
+{
+ var data = FCKTools.ProtectFormStyles( element ) ;
+
+ var oSavedStyles = new Object() ;
+
+ if ( element.className.length > 0 )
+ {
+ oSavedStyles.Class = element.className ;
+ element.className = '' ;
+ }
+
+ var sInlineStyle = element.getAttribute( 'style' ) ;
+
+ if ( sInlineStyle && sInlineStyle.length > 0 )
+ {
+ oSavedStyles.Inline = sInlineStyle ;
+ element.setAttribute( 'style', '', 0 ) ; // 0 : Case Insensitive
+ }
+
+ FCKTools.RestoreFormStyles( element, data ) ;
+ return oSavedStyles ;
+}
+
+FCKTools.RestoreStyles = function( element, savedStyles )
+{
+ var data = FCKTools.ProtectFormStyles( element ) ;
+ element.className = savedStyles.Class || '' ;
+
+ if ( savedStyles.Inline )
+ element.setAttribute( 'style', savedStyles.Inline, 0 ) ; // 0 : Case Insensitive
+ else
+ element.removeAttribute( 'style', 0 ) ;
+ FCKTools.RestoreFormStyles( element, data ) ;
+}
+
+FCKTools.RegisterDollarFunction = function( targetWindow )
+{
+ targetWindow.$ = function( id )
+ {
+ return targetWindow.document.getElementById( id ) ;
+ } ;
+}
+
+FCKTools.AppendElement = function( target, elementName )
+{
+ return target.appendChild( target.ownerDocument.createElement( elementName ) ) ;
+}
+
+// Get the coordinates of an element.
+// @el : The element to get the position.
+// @relativeWindow: The window to which we want the coordinates relative to.
+FCKTools.GetElementPosition = function( el, relativeWindow )
+{
+ // Initializes the Coordinates object that will be returned by the function.
+ var c = { X:0, Y:0 } ;
+
+ var oWindow = relativeWindow || window ;
+
+ var oOwnerWindow = FCKTools.GetElementWindow( el ) ;
+
+ var previousElement = null ;
+ // Loop throw the offset chain.
+ while ( el )
+ {
+ var sPosition = oOwnerWindow.getComputedStyle(el, '').position ;
+
+ // Check for non "static" elements.
+ // 'FCKConfig.FloatingPanelsZIndex' -- Submenus are under a positioned IFRAME.
+ if ( sPosition && sPosition != 'static' && el.style.zIndex != FCKConfig.FloatingPanelsZIndex )
+ break ;
+
+ /*
+ FCKDebug.Output( el.tagName + ":" + "offset=" + el.offsetLeft + "," + el.offsetTop + " "
+ + "scroll=" + el.scrollLeft + "," + el.scrollTop ) ;
+ */
+
+ c.X += el.offsetLeft - el.scrollLeft ;
+ c.Y += el.offsetTop - el.scrollTop ;
+
+ // Backtrack due to offsetParent's calculation by the browser ignores scrollLeft and scrollTop.
+ // Backtracking is not needed for Opera
+ if ( ! FCKBrowserInfo.IsOpera )
+ {
+ var scrollElement = previousElement ;
+ while ( scrollElement && scrollElement != el )
+ {
+ c.X -= scrollElement.scrollLeft ;
+ c.Y -= scrollElement.scrollTop ;
+ scrollElement = scrollElement.parentNode ;
+ }
+ }
+
+ previousElement = el ;
+ if ( el.offsetParent )
+ el = el.offsetParent ;
+ else
+ {
+ if ( oOwnerWindow != oWindow )
+ {
+ el = oOwnerWindow.frameElement ;
+ previousElement = null ;
+ if ( el )
+ oOwnerWindow = FCKTools.GetElementWindow( el ) ;
+ }
+ else
+ {
+ c.X += el.scrollLeft ;
+ c.Y += el.scrollTop ;
+ break ;
+ }
+ }
+ }
+
+ // Return the Coordinates object
+ return c ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktools_ie.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fcktools_ie.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,234 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Utility functions. (IE version).
+ */
+
+FCKTools.CancelEvent = function( e )
+{
+ return false ;
+}
+
+// Appends one or more CSS files to a document.
+FCKTools._AppendStyleSheet = function( documentElement, cssFileUrl )
+{
+ return documentElement.createStyleSheet( cssFileUrl ).owningElement ;
+}
+
+// Appends a CSS style string to a document.
+FCKTools.AppendStyleString = function( documentElement, cssStyles )
+{
+ if ( !cssStyles )
+ return null ;
+
+ var s = documentElement.createStyleSheet( "" ) ;
+ s.cssText = cssStyles ;
+ return s ;
+}
+
+// Removes all attributes and values from the element.
+FCKTools.ClearElementAttributes = function( element )
+{
+ element.clearAttributes() ;
+}
+
+FCKTools.GetAllChildrenIds = function( parentElement )
+{
+ var aIds = new Array() ;
+ for ( var i = 0 ; i < parentElement.all.length ; i++ )
+ {
+ var sId = parentElement.all[i].id ;
+ if ( sId && sId.length > 0 )
+ aIds[ aIds.length ] = sId ;
+ }
+ return aIds ;
+}
+
+FCKTools.RemoveOuterTags = function( e )
+{
+ e.insertAdjacentHTML( 'beforeBegin', e.innerHTML ) ;
+ e.parentNode.removeChild( e ) ;
+}
+
+FCKTools.CreateXmlObject = function( object )
+{
+ var aObjs ;
+
+ switch ( object )
+ {
+ case 'XmlHttp' :
+ // Try the native XMLHttpRequest introduced with IE7.
+ if ( document.location.protocol != 'file:' )
+ try { return new XMLHttpRequest() ; } catch (e) {}
+
+ aObjs = [ 'MSXML2.XmlHttp', 'Microsoft.XmlHttp' ] ;
+ break ;
+
+ case 'DOMDocument' :
+ aObjs = [ 'MSXML2.DOMDocument', 'Microsoft.XmlDom' ] ;
+ break ;
+ }
+
+ for ( var i = 0 ; i < 2 ; i++ )
+ {
+ try { return new ActiveXObject( aObjs[i] ) ; }
+ catch (e)
+ {}
+ }
+
+ if ( FCKLang.NoActiveX )
+ {
+ alert( FCKLang.NoActiveX ) ;
+ FCKLang.NoActiveX = null ;
+ }
+ return null ;
+}
+
+FCKTools.DisableSelection = function( element )
+{
+ element.unselectable = 'on' ;
+
+ var e, i = 0 ;
+ // The extra () is to avoid a warning with strict error checking. This is ok.
+ while ( (e = element.all[ i++ ]) )
+ {
+ switch ( e.tagName )
+ {
+ case 'IFRAME' :
+ case 'TEXTAREA' :
+ case 'INPUT' :
+ case 'SELECT' :
+ /* Ignore the above tags */
+ break ;
+ default :
+ e.unselectable = 'on' ;
+ }
+ }
+}
+
+FCKTools.GetScrollPosition = function( relativeWindow )
+{
+ var oDoc = relativeWindow.document ;
+
+ // Try with the doc element.
+ var oPos = { X : oDoc.documentElement.scrollLeft, Y : oDoc.documentElement.scrollTop } ;
+
+ if ( oPos.X > 0 || oPos.Y > 0 )
+ return oPos ;
+
+ // If no scroll, try with the body.
+ return { X : oDoc.body.scrollLeft, Y : oDoc.body.scrollTop } ;
+}
+
+FCKTools.AddEventListener = function( sourceObject, eventName, listener )
+{
+ sourceObject.attachEvent( 'on' + eventName, listener ) ;
+}
+
+FCKTools.RemoveEventListener = function( sourceObject, eventName, listener )
+{
+ sourceObject.detachEvent( 'on' + eventName, listener ) ;
+}
+
+// Listeners attached with this function cannot be detached.
+FCKTools.AddEventListenerEx = function( sourceObject, eventName, listener, paramsArray )
+{
+ // Ok... this is a closures party, but is the only way to make it clean of memory leaks.
+ var o = new Object() ;
+ o.Source = sourceObject ;
+ o.Params = paramsArray || [] ; // Memory leak if we have DOM objects here.
+ o.Listener = function( ev )
+ {
+ return listener.apply( o.Source, [ ev ].concat( o.Params ) ) ;
+ }
+
+ if ( FCK.IECleanup )
+ FCK.IECleanup.AddItem( null, function() { o.Source = null ; o.Params = null ; } ) ;
+
+ sourceObject.attachEvent( 'on' + eventName, o.Listener ) ;
+
+ sourceObject = null ; // Memory leak cleaner (because of the above closure).
+ paramsArray = null ; // Memory leak cleaner (because of the above closure).
+}
+
+// Returns and object with the "Width" and "Height" properties.
+FCKTools.GetViewPaneSize = function( win )
+{
+ var oSizeSource ;
+
+ var oDoc = win.document.documentElement ;
+ if ( oDoc && oDoc.clientWidth ) // IE6 Strict Mode
+ oSizeSource = oDoc ;
+ else
+ oSizeSource = win.document.body ; // Other IEs
+
+ if ( oSizeSource )
+ return { Width : oSizeSource.clientWidth, Height : oSizeSource.clientHeight } ;
+ else
+ return { Width : 0, Height : 0 } ;
+}
+
+FCKTools.SaveStyles = function( element )
+{
+ var data = FCKTools.ProtectFormStyles( element ) ;
+
+ var oSavedStyles = new Object() ;
+
+ if ( element.className.length > 0 )
+ {
+ oSavedStyles.Class = element.className ;
+ element.className = '' ;
+ }
+
+ var sInlineStyle = element.style.cssText ;
+
+ if ( sInlineStyle.length > 0 )
+ {
+ oSavedStyles.Inline = sInlineStyle ;
+ element.style.cssText = '' ;
+ }
+
+ FCKTools.RestoreFormStyles( element, data ) ;
+ return oSavedStyles ;
+}
+
+FCKTools.RestoreStyles = function( element, savedStyles )
+{
+ var data = FCKTools.ProtectFormStyles( element ) ;
+ element.className = savedStyles.Class || '' ;
+ element.style.cssText = savedStyles.Inline || '' ;
+ FCKTools.RestoreFormStyles( element, data ) ;
+}
+
+FCKTools.RegisterDollarFunction = function( targetWindow )
+{
+ targetWindow.$ = targetWindow.document.getElementById ;
+}
+
+FCKTools.AppendElement = function( target, elementName )
+{
+ return target.appendChild( this.GetElementDocument( target ).createElement( elementName ) ) ;
+}
+
+// This function may be used by Regex replacements.
+FCKTools.ToLowerCase = function( strValue )
+{
+ return strValue.toLowerCase() ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckundo.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckundo.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,223 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ */
+
+var FCKUndo = new Object() ;
+
+FCKUndo.SavedData = new Array() ;
+FCKUndo.CurrentIndex = -1 ;
+FCKUndo.TypesCount = 0 ;
+FCKUndo.Changed = false ; // Is the document changed in respect to its initial image?
+FCKUndo.MaxTypes = 25 ;
+FCKUndo.Typing = false ;
+FCKUndo.SaveLocked = false ;
+
+FCKUndo._GetBookmark = function()
+{
+ FCKSelection.Restore() ;
+
+ var range = new FCKDomRange( FCK.EditorWindow ) ;
+ try
+ {
+ // There are some tricky cases where this might fail (e.g. having a lone empty table in IE)
+ range.MoveToSelection() ;
+ }
+ catch ( e )
+ {
+ return null ;
+ }
+ if ( FCKBrowserInfo.IsIE )
+ {
+ var bookmark = range.CreateBookmark() ;
+ var dirtyHtml = FCK.EditorDocument.body.innerHTML ;
+ range.MoveToBookmark( bookmark ) ;
+ return [ bookmark, dirtyHtml ] ;
+ }
+ return range.CreateBookmark2() ;
+}
+
+FCKUndo._SelectBookmark = function( bookmark )
+{
+ if ( ! bookmark )
+ return ;
+
+ var range = new FCKDomRange( FCK.EditorWindow ) ;
+ if ( bookmark instanceof Object )
+ {
+ if ( FCKBrowserInfo.IsIE )
+ range.MoveToBookmark( bookmark[0] ) ;
+ else
+ range.MoveToBookmark2( bookmark ) ;
+ try
+ {
+ // this does not always succeed, there are still some tricky cases where it fails
+ // e.g. add a special character at end of document, undo, redo -> error
+ range.Select() ;
+ }
+ catch ( e )
+ {
+ // if select restore fails, put the caret at the end of the document
+ range.MoveToPosition( FCK.EditorDocument.body, 4 ) ;
+ range.Select() ;
+ }
+ }
+}
+
+FCKUndo._CompareCursors = function( cursor1, cursor2 )
+{
+ for ( var i = 0 ; i < Math.min( cursor1.length, cursor2.length ) ; i++ )
+ {
+ if ( cursor1[i] < cursor2[i] )
+ return -1;
+ else if (cursor1[i] > cursor2[i] )
+ return 1;
+ }
+ if ( cursor1.length < cursor2.length )
+ return -1;
+ else if (cursor1.length > cursor2.length )
+ return 1;
+ return 0;
+}
+
+FCKUndo._CheckIsBookmarksEqual = function( bookmark1, bookmark2 )
+{
+ if ( ! ( bookmark1 && bookmark2 ) )
+ return false ;
+ if ( FCKBrowserInfo.IsIE )
+ {
+ var startOffset1 = bookmark1[1].search( bookmark1[0].StartId ) ;
+ var startOffset2 = bookmark2[1].search( bookmark2[0].StartId ) ;
+ var endOffset1 = bookmark1[1].search( bookmark1[0].EndId ) ;
+ var endOffset2 = bookmark2[1].search( bookmark2[0].EndId ) ;
+ return startOffset1 == startOffset2 && endOffset1 == endOffset2 ;
+ }
+ else
+ {
+ return this._CompareCursors( bookmark1.Start, bookmark2.Start ) == 0
+ && this._CompareCursors( bookmark1.End, bookmark2.End ) == 0 ;
+ }
+}
+
+FCKUndo.SaveUndoStep = function()
+{
+ if ( FCK.EditMode != FCK_EDITMODE_WYSIWYG || this.SaveLocked )
+ return ;
+
+ // Assume the editor content is changed when SaveUndoStep() is called after the first time.
+ // This also enables the undo button in toolbar.
+ if ( this.SavedData.length )
+ this.Changed = true ;
+
+ // Get the HTML content.
+ var sHtml = FCK.EditorDocument.body.innerHTML ;
+ var bookmark = this._GetBookmark() ;
+
+ // Shrink the array to the current level.
+ this.SavedData = this.SavedData.slice( 0, this.CurrentIndex + 1 ) ;
+
+ // Cancel operation if the new step is identical to the previous one.
+ if ( this.CurrentIndex > 0
+ && sHtml == this.SavedData[ this.CurrentIndex ][0]
+ && this._CheckIsBookmarksEqual( bookmark, this.SavedData[ this.CurrentIndex ][1] ) )
+ return ;
+ // Save the selection and caret position in the first undo level for the first change.
+ else if ( this.CurrentIndex == 0 && this.SavedData.length && sHtml == this.SavedData[0][0] )
+ {
+ this.SavedData[0][1] = bookmark ;
+ return ;
+ }
+
+ // If we reach the Maximum number of undo levels, we must remove the first
+ // entry of the list shifting all elements.
+ if ( this.CurrentIndex + 1 >= FCKConfig.MaxUndoLevels )
+ this.SavedData.shift() ;
+ else
+ this.CurrentIndex++ ;
+
+ // Save the new level in front of the actual position.
+ this.SavedData[ this.CurrentIndex ] = [ sHtml, bookmark ] ;
+
+ FCK.Events.FireEvent( "OnSelectionChange" ) ;
+}
+
+FCKUndo.CheckUndoState = function()
+{
+ return ( this.Changed || this.CurrentIndex > 0 ) ;
+}
+
+FCKUndo.CheckRedoState = function()
+{
+ return ( this.CurrentIndex < ( this.SavedData.length - 1 ) ) ;
+}
+
+FCKUndo.Undo = function()
+{
+ if ( this.CheckUndoState() )
+ {
+ // If it is the first step.
+ if ( this.CurrentIndex == ( this.SavedData.length - 1 ) )
+ {
+ // Save the actual state for a possible "Redo" call.
+ this.SaveUndoStep() ;
+ }
+
+ // Go a step back.
+ this._ApplyUndoLevel( --this.CurrentIndex ) ;
+
+ FCK.Events.FireEvent( "OnSelectionChange" ) ;
+ }
+}
+
+FCKUndo.Redo = function()
+{
+ if ( this.CheckRedoState() )
+ {
+ // Go a step forward.
+ this._ApplyUndoLevel( ++this.CurrentIndex ) ;
+
+ FCK.Events.FireEvent( "OnSelectionChange" ) ;
+ }
+}
+
+FCKUndo._ApplyUndoLevel = function( level )
+{
+ var oData = this.SavedData[ level ] ;
+
+ if ( !oData )
+ return ;
+
+ // Update the editor contents with that step data.
+ if ( FCKBrowserInfo.IsIE )
+ {
+ if ( oData[1] && oData[1][1] )
+ FCK.SetInnerHtml( oData[1][1] ) ;
+ else
+ FCK.SetInnerHtml( oData[0] ) ;
+ }
+ else
+ FCK.EditorDocument.body.innerHTML = oData[0] ;
+
+ // Restore the selection
+ this._SelectBookmark( oData[1] ) ;
+
+ this.TypesCount = 0 ;
+ this.Changed = false ;
+ this.Typing = false ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckurlparams.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckurlparams.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,39 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Defines the FCKURLParams object that is used to get all parameters
+ * passed by the URL QueryString (after the "?").
+ */
+
+// #### URLParams: holds all URL passed parameters (like ?Param1=Value1&Param2=Value2)
+var FCKURLParams = new Object() ;
+
+(function()
+{
+ var aParams = document.location.search.substr(1).split('&') ;
+ for ( var i = 0 ; i < aParams.length ; i++ )
+ {
+ var aParam = aParams[i].split('=') ;
+ var sParamName = decodeURIComponent( aParam[0] ) ;
+ var sParamValue = decodeURIComponent( aParam[1] ) ;
+
+ FCKURLParams[ sParamName ] = sParamValue ;
+ }
+})();
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckxhtml.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckxhtml.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,534 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Defines the FCKXHtml object, responsible for the XHTML operations.
+ */
+
+var FCKXHtml = new Object() ;
+
+FCKXHtml.CurrentJobNum = 0 ;
+
+FCKXHtml.GetXHTML = function( node, includeNode, format )
+{
+ FCKDomTools.CheckAndRemovePaddingNode( FCKTools.GetElementDocument( node ), FCKConfig.EnterMode ) ;
+ FCKXHtmlEntities.Initialize() ;
+
+ // Set the correct entity to use for empty blocks.
+ this._NbspEntity = ( FCKConfig.ProcessHTMLEntities? 'nbsp' : '#160' ) ;
+
+ // Save the current IsDirty state. The XHTML processor may change the
+ // original HTML, dirtying it.
+ var bIsDirty = FCK.IsDirty() ;
+
+ // Special blocks are blocks of content that remain untouched during the
+ // process. It is used for SCRIPTs and STYLEs.
+ FCKXHtml.SpecialBlocks = new Array() ;
+
+ // Create the XML DOMDocument object.
+ this.XML = FCKTools.CreateXmlObject( 'DOMDocument' ) ;
+
+ // Add a root element that holds all child nodes.
+ this.MainNode = this.XML.appendChild( this.XML.createElement( 'xhtml' ) ) ;
+
+ FCKXHtml.CurrentJobNum++ ;
+
+// var dTimer = new Date() ;
+
+ if ( includeNode )
+ this._AppendNode( this.MainNode, node ) ;
+ else
+ this._AppendChildNodes( this.MainNode, node, false ) ;
+
+ // Get the resulting XHTML as a string.
+ var sXHTML = this._GetMainXmlString() ;
+
+// alert( 'Time: ' + ( ( ( new Date() ) - dTimer ) ) + ' ms' ) ;
+
+ this.XML = null ;
+
+ // Safari adds xmlns="http://www.w3.org/1999/xhtml" to the root node (#963)
+ if ( FCKBrowserInfo.IsSafari )
+ sXHTML = sXHTML.replace( /^<xhtml.*?>/, '<xhtml>' ) ;
+
+ // Strip the "XHTML" root node.
+ sXHTML = sXHTML.substr( 7, sXHTML.length - 15 ).Trim() ;
+
+ // According to the doctype set the proper end for self-closing tags
+ // HTML: <br>
+ // XHTML: Add a space, like <br/> -> <br />
+ if (FCKConfig.DocType.length > 0 && FCKRegexLib.HtmlDocType.test( FCKConfig.DocType ) )
+ sXHTML = sXHTML.replace( FCKRegexLib.SpaceNoClose, '>');
+ else
+ sXHTML = sXHTML.replace( FCKRegexLib.SpaceNoClose, ' />');
+
+ if ( FCKConfig.ForceSimpleAmpersand )
+ sXHTML = sXHTML.replace( FCKRegexLib.ForceSimpleAmpersand, '&' ) ;
+
+ if ( format )
+ sXHTML = FCKCodeFormatter.Format( sXHTML ) ;
+
+ // Now we put back the SpecialBlocks contents.
+ for ( var i = 0 ; i < FCKXHtml.SpecialBlocks.length ; i++ )
+ {
+ var oRegex = new RegExp( '___FCKsi___' + i ) ;
+ sXHTML = sXHTML.replace( oRegex, FCKXHtml.SpecialBlocks[i] ) ;
+ }
+
+ // Replace entities marker with the ampersand.
+ sXHTML = sXHTML.replace( FCKRegexLib.GeckoEntitiesMarker, '&' ) ;
+
+ // Restore the IsDirty state if it was not dirty.
+ if ( !bIsDirty )
+ FCK.ResetIsDirty() ;
+
+ FCKDomTools.EnforcePaddingNode( FCKTools.GetElementDocument( node ), FCKConfig.EnterMode ) ;
+ return sXHTML ;
+}
+
+FCKXHtml._AppendAttribute = function( xmlNode, attributeName, attributeValue )
+{
+ try
+ {
+ if ( attributeValue == undefined || attributeValue == null )
+ attributeValue = '' ;
+ else if ( attributeValue.replace )
+ {
+ if ( FCKConfig.ForceSimpleAmpersand )
+ attributeValue = attributeValue.replace( /&/g, '___FCKAmp___' ) ;
+
+ // Entities must be replaced in the attribute values.
+ attributeValue = attributeValue.replace( FCKXHtmlEntities.EntitiesRegex, FCKXHtml_GetEntity ) ;
+ }
+
+ // Create the attribute.
+ var oXmlAtt = this.XML.createAttribute( attributeName ) ;
+ oXmlAtt.value = attributeValue ;
+
+ // Set the attribute in the node.
+ xmlNode.attributes.setNamedItem( oXmlAtt ) ;
+ }
+ catch (e)
+ {}
+}
+
+FCKXHtml._AppendChildNodes = function( xmlNode, htmlNode, isBlockElement )
+{
+ var oNode = htmlNode.firstChild ;
+
+ while ( oNode )
+ {
+ this._AppendNode( xmlNode, oNode ) ;
+ oNode = oNode.nextSibling ;
+ }
+
+ // Trim block elements. This is also needed to avoid Firefox leaving extra
+ // BRs at the end of them.
+ if ( isBlockElement && htmlNode.tagName && htmlNode.tagName.toLowerCase() != 'pre' )
+ {
+ FCKDomTools.TrimNode( xmlNode ) ;
+
+ if ( FCKConfig.FillEmptyBlocks )
+ {
+ var lastChild = xmlNode.lastChild ;
+ if ( lastChild && lastChild.nodeType == 1 && lastChild.nodeName == 'br' )
+ this._AppendEntity( xmlNode, this._NbspEntity ) ;
+ }
+ }
+
+ // If the resulting node is empty.
+ if ( xmlNode.childNodes.length == 0 )
+ {
+ if ( isBlockElement && FCKConfig.FillEmptyBlocks )
+ {
+ this._AppendEntity( xmlNode, this._NbspEntity ) ;
+ return xmlNode ;
+ }
+
+ var sNodeName = xmlNode.nodeName ;
+
+ // Some inline elements are required to have something inside (span, strong, etc...).
+ if ( FCKListsLib.InlineChildReqElements[ sNodeName ] )
+ return null ;
+
+ // We can't use short representation of empty elements that are not marked
+ // as empty in th XHTML DTD.
+ if ( !FCKListsLib.EmptyElements[ sNodeName ] )
+ xmlNode.appendChild( this.XML.createTextNode('') ) ;
+ }
+
+ return xmlNode ;
+}
+
+FCKXHtml._AppendNode = function( xmlNode, htmlNode )
+{
+ if ( !htmlNode )
+ return false ;
+
+ switch ( htmlNode.nodeType )
+ {
+ // Element Node.
+ case 1 :
+ // If we detect a <br> inside a <pre> in Gecko, turn it into a line break instead.
+ // This is a workaround for the Gecko bug here: https://bugzilla.mozilla.org/show_bug.cgi?id=92921
+ if ( FCKBrowserInfo.IsGecko
+ && htmlNode.tagName.toLowerCase() == 'br'
+ && htmlNode.parentNode.tagName.toLowerCase() == 'pre' )
+ {
+ var val = '\r' ;
+ if ( htmlNode == htmlNode.parentNode.firstChild )
+ val += '\r' ;
+ return FCKXHtml._AppendNode( xmlNode, this.XML.createTextNode( val ) ) ;
+ }
+
+ // Here we found an element that is not the real element, but a
+ // fake one (like the Flash placeholder image), so we must get the real one.
+ if ( htmlNode.getAttribute('_fckfakelement') )
+ return FCKXHtml._AppendNode( xmlNode, FCK.GetRealElement( htmlNode ) ) ;
+
+ // Ignore bogus BR nodes in the DOM.
+ if ( FCKBrowserInfo.IsGecko &&
+ ( htmlNode.hasAttribute('_moz_editor_bogus_node') || htmlNode.getAttribute( 'type' ) == '_moz' ) )
+ {
+ if ( htmlNode.nextSibling )
+ return false ;
+ else
+ {
+ htmlNode.removeAttribute( '_moz_editor_bogus_node' ) ;
+ htmlNode.removeAttribute( 'type' ) ;
+ }
+ }
+
+ // This is for elements that are instrumental to FCKeditor and
+ // must be removed from the final HTML.
+ if ( htmlNode.getAttribute('_fcktemp') )
+ return false ;
+
+ // Get the element name.
+ var sNodeName = htmlNode.tagName.toLowerCase() ;
+
+ if ( FCKBrowserInfo.IsIE )
+ {
+ // IE doens't include the scope name in the nodeName. So, add the namespace.
+ if ( htmlNode.scopeName && htmlNode.scopeName != 'HTML' && htmlNode.scopeName != 'FCK' )
+ sNodeName = htmlNode.scopeName.toLowerCase() + ':' + sNodeName ;
+ }
+ else
+ {
+ if ( sNodeName.StartsWith( 'fck:' ) )
+ sNodeName = sNodeName.Remove( 0,4 ) ;
+ }
+
+ // Check if the node name is valid, otherwise ignore this tag.
+ // If the nodeName starts with a slash, it is a orphan closing tag.
+ // On some strange cases, the nodeName is empty, even if the node exists.
+ if ( !FCKRegexLib.ElementName.test( sNodeName ) )
+ return false ;
+
+ // The already processed nodes must be marked to avoid then to be duplicated (bad formatted HTML).
+ // So here, the "mark" is checked... if the element is Ok, then mark it.
+ if ( htmlNode._fckxhtmljob && htmlNode._fckxhtmljob == FCKXHtml.CurrentJobNum )
+ return false ;
+
+ var oNode = this.XML.createElement( sNodeName ) ;
+
+ // Add all attributes.
+ FCKXHtml._AppendAttributes( xmlNode, htmlNode, oNode, sNodeName ) ;
+
+ htmlNode._fckxhtmljob = FCKXHtml.CurrentJobNum ;
+
+ // Tag specific processing.
+ var oTagProcessor = FCKXHtml.TagProcessors[ sNodeName ] ;
+
+ if ( oTagProcessor )
+ oNode = oTagProcessor( oNode, htmlNode, xmlNode ) ;
+ else
+ oNode = this._AppendChildNodes( oNode, htmlNode, Boolean( FCKListsLib.NonEmptyBlockElements[ sNodeName ] ) ) ;
+
+ if ( !oNode )
+ return false ;
+
+ xmlNode.appendChild( oNode ) ;
+
+ break ;
+
+ // Text Node.
+ case 3 :
+ if ( htmlNode.parentNode && htmlNode.parentNode.nodeName.IEquals( 'pre' ) )
+ return this._AppendTextNode( xmlNode, htmlNode.nodeValue ) ;
+ return this._AppendTextNode( xmlNode, htmlNode.nodeValue.ReplaceNewLineChars(' ') ) ;
+
+ // Comment
+ case 8 :
+ // IE catches the <!DOTYPE ... > as a comment, but it has no
+ // innerHTML, so we can catch it, and ignore it.
+ if ( FCKBrowserInfo.IsIE && !htmlNode.innerHTML )
+ break ;
+
+ try { xmlNode.appendChild( this.XML.createComment( htmlNode.nodeValue ) ) ; }
+ catch (e) { /* Do nothing... probably this is a wrong format comment. */ }
+ break ;
+
+ // Unknown Node type.
+ default :
+ xmlNode.appendChild( this.XML.createComment( "Element not supported - Type: " + htmlNode.nodeType + " Name: " + htmlNode.nodeName ) ) ;
+ break ;
+ }
+ return true ;
+}
+
+// Append an item to the SpecialBlocks array and returns the tag to be used.
+FCKXHtml._AppendSpecialItem = function( item )
+{
+ return '___FCKsi___' + FCKXHtml.SpecialBlocks.AddItem( item ) ;
+}
+
+FCKXHtml._AppendEntity = function( xmlNode, entity )
+{
+ xmlNode.appendChild( this.XML.createTextNode( '#?-:' + entity + ';' ) ) ;
+}
+
+FCKXHtml._AppendTextNode = function( targetNode, textValue )
+{
+ var bHadText = textValue.length > 0 ;
+ if ( bHadText )
+ targetNode.appendChild( this.XML.createTextNode( textValue.replace( FCKXHtmlEntities.EntitiesRegex, FCKXHtml_GetEntity ) ) ) ;
+ return bHadText ;
+}
+
+// Retrieves a entity (internal format) for a given character.
+function FCKXHtml_GetEntity( character )
+{
+ // We cannot simply place the entities in the text, because the XML parser
+ // will translate & to &. So we use a temporary marker which is replaced
+ // in the end of the processing.
+ var sEntity = FCKXHtmlEntities.Entities[ character ] || ( '#' + character.charCodeAt(0) ) ;
+ return '#?-:' + sEntity + ';' ;
+}
+
+// An object that hold tag specific operations.
+FCKXHtml.TagProcessors =
+{
+ a : function( node, htmlNode )
+ {
+ // Firefox may create empty tags when deleting the selection in some special cases (SF-BUG 1556878).
+ if ( htmlNode.innerHTML.Trim().length == 0 && !htmlNode.name )
+ return false ;
+
+ var sSavedUrl = htmlNode.getAttribute( '_fcksavedurl' ) ;
+ if ( sSavedUrl != null )
+ FCKXHtml._AppendAttribute( node, 'href', sSavedUrl ) ;
+
+
+ // Anchors with content has been marked with an additional class, now we must remove it.
+ if ( FCKBrowserInfo.IsIE )
+ {
+ // Buggy IE, doesn't copy the name of changed anchors.
+ if ( htmlNode.name )
+ FCKXHtml._AppendAttribute( node, 'name', htmlNode.name ) ;
+ }
+
+ node = FCKXHtml._AppendChildNodes( node, htmlNode, false ) ;
+
+ return node ;
+ },
+
+ area : function( node, htmlNode )
+ {
+ var sSavedUrl = htmlNode.getAttribute( '_fcksavedurl' ) ;
+ if ( sSavedUrl != null )
+ FCKXHtml._AppendAttribute( node, 'href', sSavedUrl ) ;
+
+ // IE ignores the "COORDS" and "SHAPE" attribute so we must add it manually.
+ if ( FCKBrowserInfo.IsIE )
+ {
+ if ( ! node.attributes.getNamedItem( 'coords' ) )
+ {
+ var sCoords = htmlNode.getAttribute( 'coords', 2 ) ;
+ if ( sCoords && sCoords != '0,0,0' )
+ FCKXHtml._AppendAttribute( node, 'coords', sCoords ) ;
+ }
+
+ if ( ! node.attributes.getNamedItem( 'shape' ) )
+ {
+ var sShape = htmlNode.getAttribute( 'shape', 2 ) ;
+ if ( sShape && sShape.length > 0 )
+ FCKXHtml._AppendAttribute( node, 'shape', sShape.toLowerCase() ) ;
+ }
+ }
+
+ return node ;
+ },
+
+ body : function( node, htmlNode )
+ {
+ node = FCKXHtml._AppendChildNodes( node, htmlNode, false ) ;
+ // Remove spellchecker attributes added for Firefox when converting to HTML code (Bug #1351).
+ node.removeAttribute( 'spellcheck' ) ;
+ return node ;
+ },
+
+ // IE loses contents of iframes, and Gecko does give it back HtmlEncoded
+ // Note: Opera does lose the content and doesn't provide it in the innerHTML string
+ iframe : function( node, htmlNode )
+ {
+ var sHtml = htmlNode.innerHTML ;
+
+ // Gecko does give back the encoded html
+ if ( FCKBrowserInfo.IsGecko )
+ sHtml = FCKTools.HTMLDecode( sHtml );
+
+ // Remove the saved urls here as the data won't be processed as nodes
+ sHtml = sHtml.replace( /\s_fcksavedurl="[^"]*"/g, '' ) ;
+
+ node.appendChild( FCKXHtml.XML.createTextNode( FCKXHtml._AppendSpecialItem( sHtml ) ) ) ;
+
+ return node ;
+ },
+
+ img : function( node, htmlNode )
+ {
+ // The "ALT" attribute is required in XHTML.
+ if ( ! node.attributes.getNamedItem( 'alt' ) )
+ FCKXHtml._AppendAttribute( node, 'alt', '' ) ;
+
+ var sSavedUrl = htmlNode.getAttribute( '_fcksavedurl' ) ;
+ if ( sSavedUrl != null )
+ FCKXHtml._AppendAttribute( node, 'src', sSavedUrl ) ;
+
+ // Bug #768 : If the width and height are defined inline CSS,
+ // don't define it again in the HTML attributes.
+ if ( htmlNode.style.width )
+ node.removeAttribute( 'width' ) ;
+ if ( htmlNode.style.height )
+ node.removeAttribute( 'height' ) ;
+
+ return node ;
+ },
+
+ // Fix orphaned <li> nodes (Bug #503).
+ li : function( node, htmlNode, targetNode )
+ {
+ // If the XML parent node is already a <ul> or <ol>, then add the <li> as usual.
+ if ( targetNode.nodeName.IEquals( ['ul', 'ol'] ) )
+ return FCKXHtml._AppendChildNodes( node, htmlNode, true ) ;
+
+ var newTarget = FCKXHtml.XML.createElement( 'ul' ) ;
+
+ // Reset the _fckxhtmljob so the HTML node is processed again.
+ htmlNode._fckxhtmljob = null ;
+
+ // Loop through all sibling LIs, adding them to the <ul>.
+ do
+ {
+ FCKXHtml._AppendNode( newTarget, htmlNode ) ;
+
+ // Look for the next element following this <li>.
+ do
+ {
+ htmlNode = FCKDomTools.GetNextSibling( htmlNode ) ;
+
+ } while ( htmlNode && htmlNode.nodeType == 3 && htmlNode.nodeValue.Trim().length == 0 )
+
+ } while ( htmlNode && htmlNode.nodeName.toLowerCase() == 'li' )
+
+ return newTarget ;
+ },
+
+ // Fix nested <ul> and <ol>.
+ ol : function( node, htmlNode, targetNode )
+ {
+ if ( htmlNode.innerHTML.Trim().length == 0 )
+ return false ;
+
+ var ePSibling = targetNode.lastChild ;
+
+ if ( ePSibling && ePSibling.nodeType == 3 )
+ ePSibling = ePSibling.previousSibling ;
+
+ if ( ePSibling && ePSibling.nodeName.toUpperCase() == 'LI' )
+ {
+ htmlNode._fckxhtmljob = null ;
+ FCKXHtml._AppendNode( ePSibling, htmlNode ) ;
+ return false ;
+ }
+
+ node = FCKXHtml._AppendChildNodes( node, htmlNode ) ;
+
+ return node ;
+ },
+
+ pre : function ( node, htmlNode )
+ {
+ var firstChild = htmlNode.firstChild ;
+
+ if ( firstChild && firstChild.nodeType == 3 )
+ node.appendChild( FCKXHtml.XML.createTextNode( FCKXHtml._AppendSpecialItem( '\r\n' ) ) ) ;
+
+ FCKXHtml._AppendChildNodes( node, htmlNode, true ) ;
+
+ return node ;
+ },
+
+ script : function( node, htmlNode )
+ {
+ // The "TYPE" attribute is required in XHTML.
+ if ( ! node.attributes.getNamedItem( 'type' ) )
+ FCKXHtml._AppendAttribute( node, 'type', 'text/javascript' ) ;
+
+ node.appendChild( FCKXHtml.XML.createTextNode( FCKXHtml._AppendSpecialItem( htmlNode.text ) ) ) ;
+
+ return node ;
+ },
+
+ span : function( node, htmlNode )
+ {
+ // Firefox may create empty tags when deleting the selection in some special cases (SF-BUG 1084404).
+ if ( htmlNode.innerHTML.length == 0 )
+ return false ;
+
+ node = FCKXHtml._AppendChildNodes( node, htmlNode, false ) ;
+
+ return node ;
+ },
+
+ style : function( node, htmlNode )
+ {
+ // The "TYPE" attribute is required in XHTML.
+ if ( ! node.attributes.getNamedItem( 'type' ) )
+ FCKXHtml._AppendAttribute( node, 'type', 'text/css' ) ;
+
+ var cssText = htmlNode.innerHTML ;
+ if ( FCKBrowserInfo.IsIE ) // Bug #403 : IE always appends a \r\n to the beginning of StyleNode.innerHTML
+ cssText = cssText.replace( /^(\r\n|\n|\r)/, '' ) ;
+
+ node.appendChild( FCKXHtml.XML.createTextNode( FCKXHtml._AppendSpecialItem( cssText ) ) ) ;
+
+ return node ;
+ },
+
+ title : function( node, htmlNode )
+ {
+ node.appendChild( FCKXHtml.XML.createTextNode( FCK.EditorDocument.title ) ) ;
+
+ return node ;
+ }
+} ;
+
+FCKXHtml.TagProcessors.ul = FCKXHtml.TagProcessors.ol ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckxhtml_gecko.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckxhtml_gecko.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,114 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Defines the FCKXHtml object, responsible for the XHTML operations.
+ * Gecko specific.
+ */
+
+FCKXHtml._GetMainXmlString = function()
+{
+ return ( new XMLSerializer() ).serializeToString( this.MainNode ) ;
+}
+
+FCKXHtml._AppendAttributes = function( xmlNode, htmlNode, node )
+{
+ var aAttributes = htmlNode.attributes ;
+
+ for ( var n = 0 ; n < aAttributes.length ; n++ )
+ {
+ var oAttribute = aAttributes[n] ;
+
+ if ( oAttribute.specified )
+ {
+ var sAttName = oAttribute.nodeName.toLowerCase() ;
+ var sAttValue ;
+
+ // Ignore any attribute starting with "_fck".
+ if ( sAttName.StartsWith( '_fck' ) )
+ continue ;
+ // There is a bug in Mozilla that returns '_moz_xxx' attributes as specified.
+ else if ( sAttName.indexOf( '_moz' ) == 0 )
+ continue ;
+ // There are one cases (on Gecko) when the oAttribute.nodeValue must be used:
+ // - for the "class" attribute
+ else if ( sAttName == 'class' )
+ {
+ sAttValue = oAttribute.nodeValue.replace( FCKRegexLib.FCK_Class, '' ) ;
+ if ( sAttValue.length == 0 )
+ continue ;
+ }
+ // XHTML doens't support attribute minimization like "CHECKED". It must be transformed to checked="checked".
+ else if ( oAttribute.nodeValue === true )
+ sAttValue = sAttName ;
+ else
+ sAttValue = htmlNode.getAttribute( sAttName, 2 ) ; // We must use getAttribute to get it exactly as it is defined.
+
+ this._AppendAttribute( node, sAttName, sAttValue ) ;
+ }
+ }
+}
+
+if ( FCKBrowserInfo.IsOpera )
+{
+ // Opera moves the <FCK:meta> element outside head (#1166).
+
+ // Save a reference to the XML <head> node, so we can use it for
+ // orphan <meta>s.
+ FCKXHtml.TagProcessors['head'] = function( node, htmlNode )
+ {
+ FCKXHtml.XML._HeadElement = node ;
+
+ node = FCKXHtml._AppendChildNodes( node, htmlNode, true ) ;
+
+ return node ;
+ }
+
+ // Check whether a <meta> element is outside <head>, and move it to the
+ // proper place.
+ FCKXHtml.TagProcessors['meta'] = function( node, htmlNode, xmlNode )
+ {
+ if ( htmlNode.parentNode.nodeName.toLowerCase() != 'head' )
+ {
+ var headElement = FCKXHtml.XML._HeadElement ;
+
+ if ( headElement && xmlNode != headElement )
+ {
+ delete htmlNode._fckxhtmljob ;
+ FCKXHtml._AppendNode( headElement, htmlNode ) ;
+ return null ;
+ }
+ }
+
+ return node ;
+ }
+}
+
+if ( FCKBrowserInfo.IsGecko )
+{
+ // #2162, some Firefox extensions might add references to internal links
+ FCKXHtml.TagProcessors['link'] = function( node, htmlNode )
+ {
+ if ( htmlNode.href.substr(0, 9).toLowerCase() == 'chrome://' )
+ return false ;
+
+ return node ;
+ }
+
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckxhtml_ie.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckxhtml_ie.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,213 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Defines the FCKXHtml object, responsible for the XHTML operations.
+ * IE specific.
+ */
+
+FCKXHtml._GetMainXmlString = function()
+{
+ return this.MainNode.xml ;
+}
+
+FCKXHtml._AppendAttributes = function( xmlNode, htmlNode, node, nodeName )
+{
+ var aAttributes = htmlNode.attributes,
+ bHasStyle ;
+
+ for ( var n = 0 ; n < aAttributes.length ; n++ )
+ {
+ var oAttribute = aAttributes[n] ;
+
+ if ( oAttribute.specified )
+ {
+ var sAttName = oAttribute.nodeName.toLowerCase() ;
+ var sAttValue ;
+
+ // Ignore any attribute starting with "_fck".
+ if ( sAttName.StartsWith( '_fck' ) )
+ continue ;
+ // The following must be done because of a bug on IE regarding the style
+ // attribute. It returns "null" for the nodeValue.
+ else if ( sAttName == 'style' )
+ {
+ // Just mark it to do it later in this function.
+ bHasStyle = true ;
+ continue ;
+ }
+ // There are two cases when the oAttribute.nodeValue must be used:
+ // - for the "class" attribute
+ // - for events attributes (on IE only).
+ else if ( sAttName == 'class' )
+ {
+ sAttValue = oAttribute.nodeValue.replace( FCKRegexLib.FCK_Class, '' ) ;
+ if ( sAttValue.length == 0 )
+ continue ;
+ }
+ else if ( sAttName.indexOf('on') == 0 )
+ sAttValue = oAttribute.nodeValue ;
+ else if ( nodeName == 'body' && sAttName == 'contenteditable' )
+ continue ;
+ // XHTML doens't support attribute minimization like "CHECKED". It must be transformed to checked="checked".
+ else if ( oAttribute.nodeValue === true )
+ sAttValue = sAttName ;
+ else
+ {
+ // We must use getAttribute to get it exactly as it is defined.
+ // There are some rare cases that IE throws an error here, so we must try/catch.
+ try
+ {
+ sAttValue = htmlNode.getAttribute( sAttName, 2 ) ;
+ }
+ catch (e) {}
+ }
+ this._AppendAttribute( node, sAttName, sAttValue || oAttribute.nodeValue ) ;
+ }
+ }
+
+ // IE loses the style attribute in JavaScript-created elements tags. (#2390)
+ if ( bHasStyle || htmlNode.style.cssText.length > 0 )
+ {
+ var data = FCKTools.ProtectFormStyles( htmlNode ) ;
+ var sStyleValue = htmlNode.style.cssText.replace( FCKRegexLib.StyleProperties, FCKTools.ToLowerCase ) ;
+ FCKTools.RestoreFormStyles( htmlNode, data ) ;
+ this._AppendAttribute( node, 'style', sStyleValue ) ;
+ }
+}
+
+// On very rare cases, IE is loosing the "align" attribute for DIV. (right align and apply bulleted list)
+FCKXHtml.TagProcessors['div'] = function( node, htmlNode )
+{
+ if ( htmlNode.align.length > 0 )
+ FCKXHtml._AppendAttribute( node, 'align', htmlNode.align ) ;
+
+ node = FCKXHtml._AppendChildNodes( node, htmlNode, true ) ;
+
+ return node ;
+}
+
+// IE automatically changes <FONT> tags to <FONT size=+0>.
+FCKXHtml.TagProcessors['font'] = function( node, htmlNode )
+{
+ if ( node.attributes.length == 0 )
+ node = FCKXHtml.XML.createDocumentFragment() ;
+
+ node = FCKXHtml._AppendChildNodes( node, htmlNode ) ;
+
+ return node ;
+}
+
+FCKXHtml.TagProcessors['form'] = function( node, htmlNode )
+{
+ if ( htmlNode.acceptCharset && htmlNode.acceptCharset.length > 0 && htmlNode.acceptCharset != 'UNKNOWN' )
+ FCKXHtml._AppendAttribute( node, 'accept-charset', htmlNode.acceptCharset ) ;
+
+ // IE has a bug and htmlNode.attributes['name'].specified=false if there is
+ // no element with id="name" inside the form (#360 and SF-BUG-1155726).
+ var nameAtt = htmlNode.attributes['name'] ;
+
+ if ( nameAtt && nameAtt.value.length > 0 )
+ FCKXHtml._AppendAttribute( node, 'name', nameAtt.value ) ;
+
+ node = FCKXHtml._AppendChildNodes( node, htmlNode, true ) ;
+
+ return node ;
+}
+
+// IE doens't see the value attribute as an attribute for the <INPUT> tag.
+FCKXHtml.TagProcessors['input'] = function( node, htmlNode )
+{
+ if ( htmlNode.name )
+ FCKXHtml._AppendAttribute( node, 'name', htmlNode.name ) ;
+
+ if ( htmlNode.value && !node.attributes.getNamedItem( 'value' ) )
+ FCKXHtml._AppendAttribute( node, 'value', htmlNode.value ) ;
+
+ if ( !node.attributes.getNamedItem( 'type' ) )
+ FCKXHtml._AppendAttribute( node, 'type', 'text' ) ;
+
+ return node ;
+}
+
+FCKXHtml.TagProcessors['label'] = function( node, htmlNode )
+{
+ if ( htmlNode.htmlFor.length > 0 )
+ FCKXHtml._AppendAttribute( node, 'for', htmlNode.htmlFor ) ;
+
+ node = FCKXHtml._AppendChildNodes( node, htmlNode ) ;
+
+ return node ;
+}
+
+// Fix behavior for IE, it doesn't read back the .name on newly created maps
+FCKXHtml.TagProcessors['map'] = function( node, htmlNode )
+{
+ if ( ! node.attributes.getNamedItem( 'name' ) )
+ {
+ var name = htmlNode.name ;
+ if ( name )
+ FCKXHtml._AppendAttribute( node, 'name', name ) ;
+ }
+
+ node = FCKXHtml._AppendChildNodes( node, htmlNode, true ) ;
+
+ return node ;
+}
+
+FCKXHtml.TagProcessors['meta'] = function( node, htmlNode )
+{
+ var oHttpEquiv = node.attributes.getNamedItem( 'http-equiv' ) ;
+
+ if ( oHttpEquiv == null || oHttpEquiv.value.length == 0 )
+ {
+ // Get the http-equiv value from the outerHTML.
+ var sHttpEquiv = htmlNode.outerHTML.match( FCKRegexLib.MetaHttpEquiv ) ;
+
+ if ( sHttpEquiv )
+ {
+ sHttpEquiv = sHttpEquiv[1] ;
+ FCKXHtml._AppendAttribute( node, 'http-equiv', sHttpEquiv ) ;
+ }
+ }
+
+ return node ;
+}
+
+// IE ignores the "SELECTED" attribute so we must add it manually.
+FCKXHtml.TagProcessors['option'] = function( node, htmlNode )
+{
+ if ( htmlNode.selected && !node.attributes.getNamedItem( 'selected' ) )
+ FCKXHtml._AppendAttribute( node, 'selected', 'selected' ) ;
+
+ node = FCKXHtml._AppendChildNodes( node, htmlNode ) ;
+
+ return node ;
+}
+
+// IE doens't hold the name attribute as an attribute for the <TEXTAREA> and <SELECT> tags.
+FCKXHtml.TagProcessors['textarea'] = FCKXHtml.TagProcessors['select'] = function( node, htmlNode )
+{
+ if ( htmlNode.name )
+ FCKXHtml._AppendAttribute( node, 'name', htmlNode.name ) ;
+
+ node = FCKXHtml._AppendChildNodes( node, htmlNode ) ;
+
+ return node ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckxhtmlentities.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/_source/internals/fckxhtmlentities.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,354 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This file define the HTML entities handled by the editor.
+ */
+
+var FCKXHtmlEntities = new Object() ;
+
+FCKXHtmlEntities.Initialize = function()
+{
+ if ( FCKXHtmlEntities.Entities )
+ return ;
+
+ var sChars = '' ;
+ var oEntities, e ;
+
+ if ( FCKConfig.ProcessHTMLEntities )
+ {
+ FCKXHtmlEntities.Entities = {
+ // Latin-1 Entities
+ ' ':'nbsp',
+ '¡':'iexcl',
+ '¢':'cent',
+ '£':'pound',
+ '¤':'curren',
+ '¥':'yen',
+ '¦':'brvbar',
+ '§':'sect',
+ '¨':'uml',
+ '©':'copy',
+ 'ª':'ordf',
+ '«':'laquo',
+ '¬':'not',
+ '':'shy',
+ '®':'reg',
+ '¯':'macr',
+ '°':'deg',
+ '±':'plusmn',
+ '²':'sup2',
+ '³':'sup3',
+ '´':'acute',
+ 'µ':'micro',
+ '¶':'para',
+ '·':'middot',
+ '¸':'cedil',
+ '¹':'sup1',
+ 'º':'ordm',
+ '»':'raquo',
+ '¼':'frac14',
+ '½':'frac12',
+ '¾':'frac34',
+ '¿':'iquest',
+ '×':'times',
+ '÷':'divide',
+
+ // Symbols
+
+ 'ƒ':'fnof',
+ '•':'bull',
+ '…':'hellip',
+ '′':'prime',
+ '″':'Prime',
+ '‾':'oline',
+ '⁄':'frasl',
+ '℘':'weierp',
+ 'ℑ':'image',
+ 'ℜ':'real',
+ '™':'trade',
+ 'ℵ':'alefsym',
+ '←':'larr',
+ '↑':'uarr',
+ '→':'rarr',
+ '↓':'darr',
+ '↔':'harr',
+ '↵':'crarr',
+ '⇐':'lArr',
+ '⇑':'uArr',
+ '⇒':'rArr',
+ '⇓':'dArr',
+ '⇔':'hArr',
+ '∀':'forall',
+ '∂':'part',
+ '∃':'exist',
+ '∅':'empty',
+ '∇':'nabla',
+ '∈':'isin',
+ '∉':'notin',
+ '∋':'ni',
+ '∏':'prod',
+ '∑':'sum',
+ '−':'minus',
+ '∗':'lowast',
+ '√':'radic',
+ '∝':'prop',
+ '∞':'infin',
+ '∠':'ang',
+ '∧':'and',
+ '∨':'or',
+ '∩':'cap',
+ '∪':'cup',
+ '∫':'int',
+ '∴':'there4',
+ '∼':'sim',
+ '≅':'cong',
+ '≈':'asymp',
+ '≠':'ne',
+ '≡':'equiv',
+ '≤':'le',
+ '≥':'ge',
+ '⊂':'sub',
+ '⊃':'sup',
+ '⊄':'nsub',
+ '⊆':'sube',
+ '⊇':'supe',
+ '⊕':'oplus',
+ '⊗':'otimes',
+ '⊥':'perp',
+ '⋅':'sdot',
+ '\u2308':'lceil',
+ '\u2309':'rceil',
+ '\u230a':'lfloor',
+ '\u230b':'rfloor',
+ '\u2329':'lang',
+ '\u232a':'rang',
+ '◊':'loz',
+ '♠':'spades',
+ '♣':'clubs',
+ '♥':'hearts',
+ '♦':'diams',
+
+ // Other Special Characters
+
+ '"':'quot',
+ // '&':'amp', // This entity is automatically handled by the XHTML parser.
+ // '<':'lt', // This entity is automatically handled by the XHTML parser.
+ // '>':'gt', // This entity is automatically handled by the XHTML parser.
+ 'ˆ':'circ',
+ '˜':'tilde',
+ ' ':'ensp',
+ ' ':'emsp',
+ ' ':'thinsp',
+ '':'zwnj',
+ '':'zwj',
+ '':'lrm',
+ '':'rlm',
+ '–':'ndash',
+ '—':'mdash',
+ '‘':'lsquo',
+ '’':'rsquo',
+ '‚':'sbquo',
+ '“':'ldquo',
+ '”':'rdquo',
+ '„':'bdquo',
+ '†':'dagger',
+ '‡':'Dagger',
+ '‰':'permil',
+ '‹':'lsaquo',
+ '›':'rsaquo',
+ '€':'euro'
+ } ;
+
+ // Process Base Entities.
+ for ( e in FCKXHtmlEntities.Entities )
+ sChars += e ;
+
+ // Include Latin Letters Entities.
+ if ( FCKConfig.IncludeLatinEntities )
+ {
+ oEntities = {
+ 'À':'Agrave',
+ 'Á':'Aacute',
+ 'Â':'Acirc',
+ 'Ã':'Atilde',
+ 'Ä':'Auml',
+ 'Å':'Aring',
+ 'Æ':'AElig',
+ 'Ç':'Ccedil',
+ 'È':'Egrave',
+ 'É':'Eacute',
+ 'Ê':'Ecirc',
+ 'Ë':'Euml',
+ 'Ì':'Igrave',
+ 'Í':'Iacute',
+ 'Î':'Icirc',
+ 'Ï':'Iuml',
+ 'Ð':'ETH',
+ 'Ñ':'Ntilde',
+ 'Ò':'Ograve',
+ 'Ó':'Oacute',
+ 'Ô':'Ocirc',
+ 'Õ':'Otilde',
+ 'Ö':'Ouml',
+ 'Ø':'Oslash',
+ 'Ù':'Ugrave',
+ 'Ú':'Uacute',
+ 'Û':'Ucirc',
+ 'Ü':'Uuml',
+ 'Ý':'Yacute',
+ 'Þ':'THORN',
+ 'ß':'szlig',
+ 'à':'agrave',
+ 'á':'aacute',
+ 'â':'acirc',
+ 'ã':'atilde',
+ 'ä':'auml',
+ 'å':'aring',
+ 'æ':'aelig',
+ 'ç':'ccedil',
+ 'è':'egrave',
+ 'é':'eacute',
+ 'ê':'ecirc',
+ 'ë':'euml',
+ 'ì':'igrave',
+ 'í':'iacute',
+ 'î':'icirc',
+ 'ï':'iuml',
+ 'ð':'eth',
+ 'ñ':'ntilde',
+ 'ò':'ograve',
+ 'ó':'oacute',
+ 'ô':'ocirc',
+ 'õ':'otilde',
+ 'ö':'ouml',
+ 'ø':'oslash',
+ 'ù':'ugrave',
+ 'ú':'uacute',
+ 'û':'ucirc',
+ 'ü':'uuml',
+ 'ý':'yacute',
+ 'þ':'thorn',
+ 'ÿ':'yuml',
+ 'Œ':'OElig',
+ 'œ':'oelig',
+ 'Š':'Scaron',
+ 'š':'scaron',
+ 'Ÿ':'Yuml'
+ } ;
+
+ for ( e in oEntities )
+ {
+ FCKXHtmlEntities.Entities[ e ] = oEntities[ e ] ;
+ sChars += e ;
+ }
+
+ oEntities = null ;
+ }
+
+ // Include Greek Letters Entities.
+ if ( FCKConfig.IncludeGreekEntities )
+ {
+ oEntities = {
+ 'Α':'Alpha',
+ 'Β':'Beta',
+ 'Γ':'Gamma',
+ 'Δ':'Delta',
+ 'Ε':'Epsilon',
+ 'Ζ':'Zeta',
+ 'Η':'Eta',
+ 'Θ':'Theta',
+ 'Ι':'Iota',
+ 'Κ':'Kappa',
+ 'Λ':'Lambda',
+ 'Μ':'Mu',
+ 'Ν':'Nu',
+ 'Ξ':'Xi',
+ 'Ο':'Omicron',
+ 'Π':'Pi',
+ 'Ρ':'Rho',
+ 'Σ':'Sigma',
+ 'Τ':'Tau',
+ 'Υ':'Upsilon',
+ 'Φ':'Phi',
+ 'Χ':'Chi',
+ 'Ψ':'Psi',
+ 'Ω':'Omega',
+ 'α':'alpha',
+ 'β':'beta',
+ 'γ':'gamma',
+ 'δ':'delta',
+ 'ε':'epsilon',
+ 'ζ':'zeta',
+ 'η':'eta',
+ 'θ':'theta',
+ 'ι':'iota',
+ 'κ':'kappa',
+ 'λ':'lambda',
+ 'μ':'mu',
+ 'ν':'nu',
+ 'ξ':'xi',
+ 'ο':'omicron',
+ 'π':'pi',
+ 'ρ':'rho',
+ 'ς':'sigmaf',
+ 'σ':'sigma',
+ 'τ':'tau',
+ 'υ':'upsilon',
+ 'φ':'phi',
+ 'χ':'chi',
+ 'ψ':'psi',
+ 'ω':'omega',
+ '\u03d1':'thetasym',
+ '\u03d2':'upsih',
+ '\u03d6':'piv'
+ } ;
+
+ for ( e in oEntities )
+ {
+ FCKXHtmlEntities.Entities[ e ] = oEntities[ e ] ;
+ sChars += e ;
+ }
+
+ oEntities = null ;
+ }
+ }
+ else
+ {
+ FCKXHtmlEntities.Entities = {} ;
+
+ // Even if we are not processing the entities, we must render the
+ // correctly. As we don't want HTML entities, let's use its numeric
+ // representation ( ).
+ sChars = ' ' ;
+ }
+
+ // Create the Regex used to find entities in the text.
+ var sRegexPattern = '[' + sChars + ']' ;
+
+ if ( FCKConfig.ProcessNumericEntities )
+ sRegexPattern = '[^ -~]|' + sRegexPattern ;
+
+ var sAdditional = FCKConfig.AdditionalNumericEntities ;
+
+ if ( sAdditional && sAdditional.length > 0 )
+ sRegexPattern += '|' + FCKConfig.AdditionalNumericEntities ;
+
+ FCKXHtmlEntities.EntitiesRegex = new RegExp( sRegexPattern, 'g' ) ;
+}
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/css/fck_editorarea.css
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/css/fck_editorarea.css (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/css/fck_editorarea.css Thu Aug 28 18:47:59 2008
@@ -26,10 +26,10 @@
* file.
*/
-/*
- The "body" styles should match your editor web site, mainly regarding
- background color and font family and size.
-*/
+/**
+ * The "body" styles should match your editor web site, mainly regarding
+ * background color and font family and size.
+ */
body
{
@@ -50,10 +50,10 @@
text-decoration: -moz-anchor-decoration; /* For Firefox 3, otherwise no underline will be used */
}
-/*
- Just uncomment the following block if you want to avoid spaces between
- paragraphs. Remember to apply the same style in your output front end page.
-*/
+/**
+ * Just uncomment the following block if you want to avoid spaces between
+ * paragraphs. Remember to apply the same style in your output front end page.
+ */
/*
p, ul, li
@@ -63,12 +63,30 @@
}
*/
+/**
+ * Uncomment the following block, or only selected lines if appropriate,
+ * if you have some style items that would break the styles combo box.
+ * You can also write other CSS overrides inside the style block below
+ * as needed and they will be applied to inside the style combo only.
+ */
+
/*
- The following are some sample styles used in the "Styles" toolbar command.
- You should instead remove them, and include the styles used by the site
- you are using the editor in.
+.SC_Item *, .SC_ItemSelected *
+{
+ margin: 0px !important;
+ padding: 0px !important;
+ text-indent: 0px !important;
+ clip: auto !important;
+ position: static !important;
+}
*/
+/**
+ * The following are some sample styles used in the "Styles" toolbar command.
+ * You should instead remove them, and include the styles used by the site
+ * you are using the editor in.
+ */
+
.Bold
{
font-weight: bold;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/css/images/fck_plugin.gif
==============================================================================
Binary file. No diff available.
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_about.html
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_about.html (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_about.html Thu Aug 28 18:47:59 2008
@@ -78,8 +78,8 @@
border-left: #000000 1px solid; border-bottom: #000000 1px solid">
<span fcklang="DlgAboutVersion">version</span>
<br />
- <b>2.6.2</b><br />
- Build 19417</td>
+ <b>2.6.3</b><br />
+ Build 19836</td>
</tr>
</table>
</td>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_about/sponsors/spellchecker_net.gif
==============================================================================
Binary file. No diff available.
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_anchor.html
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_anchor.html (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_anchor.html Thu Aug 28 18:47:59 2008
@@ -119,10 +119,7 @@
var aNewAnchors = oEditor.FCK.CreateLink( '#' ) ;
if ( aNewAnchors.length == 0 )
- {
- // Nothing was selected, so now just create a normal A
- aNewAnchors.push( oEditor.FCK.InsertElement( 'a' ) ) ;
- }
+ aNewAnchors.push( oEditor.FCK.InsertElement( 'a' ) ) ;
else
{
// Remove the fake href
@@ -136,7 +133,18 @@
oAnchor = aNewAnchors[i] ;
// Set the name
- oAnchor.name = sNewName ;
+ if ( FCKBrowserInfo.IsIE )
+ {
+ // Setting anchor names directly in IE will trash the HTML code stored
+ // in FCKTempBin after undos. See #2263.
+ var replaceAnchor = oEditor.FCK.EditorDocument.createElement( '<a name="' +
+ FCKTools.HTMLEncode( sNewName ).replace( '"', '"' ) + '">' ) ;
+ oEditor.FCKDomTools.MoveChildren( oAnchor, replaceAnchor ) ;
+ oAnchor.parentNode.replaceChild( replaceAnchor, oAnchor ) ;
+ oAnchor = replaceAnchor ;
+ }
+ else
+ oAnchor.name = sNewName ;
// IE does require special processing to show the Anchor's image
// Opera doesn't allow to select empty anchors
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_div.html
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_div.html Thu Aug 28 18:47:59 2008
@@ -0,0 +1,364 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
+<!--
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Form dialog window.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <meta content="noindex, nofollow" name="robots" />
+ <script src="common/fck_dialog_common.js" type="text/javascript"></script>
+ <script type="text/javascript">
+var dialog = window.parent ;
+var oEditor = dialog.InnerDialogLoaded() ;
+var FCK = oEditor.FCK ;
+var FCKLang = oEditor.FCKLang ;
+var FCKBrowserInfo = oEditor.FCKBrowserInfo ;
+var FCKStyles = oEditor.FCKStyles ;
+var FCKElementPath = oEditor.FCKElementPath ;
+var FCKDomRange = oEditor.FCKDomRange ;
+var FCKDomTools = oEditor.FCKDomTools ;
+var FCKDomRangeIterator = oEditor.FCKDomRangeIterator ;
+var FCKListsLib = oEditor.FCKListsLib ;
+var AlwaysCreate = dialog.Args().CustomValue ;
+
+String.prototype.IEquals = function()
+{
+ var thisUpper = this.toUpperCase() ;
+
+ var aArgs = arguments ;
+
+ // The arguments could also be a single array.
+ if ( aArgs.length == 1 && aArgs[0].pop )
+ aArgs = aArgs[0] ;
+
+ for ( var i = 0 ; i < aArgs.length ; i++ )
+ {
+ if ( thisUpper == aArgs[i].toUpperCase() )
+ return true ;
+ }
+ return false ;
+}
+
+var CurrentContainers = [] ;
+if ( !AlwaysCreate )
+{
+ dialog.Selection.EnsureSelection() ;
+ CurrentContainers = FCKDomTools.GetSelectedDivContainers() ;
+}
+
+// Add some tabs
+dialog.AddTab( 'General', FCKLang.DlgDivGeneralTab );
+dialog.AddTab( 'Advanced', FCKLang.DlgDivAdvancedTab ) ;
+
+function AddStyleOption( styleName )
+{
+ var el = GetE( 'selStyle' ) ;
+ var opt = document.createElement( 'option' ) ;
+ opt.text = opt.value = styleName ;
+
+ if ( FCKBrowserInfo.IsIE )
+ el.add( opt ) ;
+ else
+ el.add( opt, null ) ;
+}
+
+function OnDialogTabChange( tabCode )
+{
+ ShowE( 'divGeneral', tabCode == 'General' ) ;
+ ShowE( 'divAdvanced', tabCode == 'Advanced' ) ;
+ dialog.SetAutoSize( true ) ;
+}
+
+function GetNearestAncestorDirection( node )
+{
+ var dir = 'ltr' ; // HTML default.
+ while ( ( node = node.parentNode ) )
+ {
+ if ( node.dir )
+ dir = node.dir ;
+ }
+ return dir ;
+}
+
+window.onload = function()
+{
+ // First of all, translate the dialog box texts
+ oEditor.FCKLanguageManager.TranslatePage(document) ;
+
+ dialog.SetOkButton( true ) ;
+ dialog.SetAutoSize( true ) ;
+
+ // Popuplate the style menu
+ var styles = FCKStyles.GetStyles() ;
+ var selectableStyles = {} ;
+ for ( var i in styles )
+ {
+ if ( ! /^_FCK_/.test( i ) && styles[i].Element == 'div' )
+ selectableStyles[i] = styles[i] ;
+ }
+ if ( CurrentContainers.length <= 1 )
+ {
+ var target = CurrentContainers[0] ;
+ var match = null ;
+ for ( var i in selectableStyles )
+ {
+ if ( target && styles[i].CheckElementRemovable( target, true ) )
+ match = i ;
+ }
+ if ( !match )
+ AddStyleOption( "" ) ;
+ for ( var i in selectableStyles )
+ AddStyleOption( i ) ;
+ if ( match )
+ GetE( 'selStyle' ).value = match ;
+
+ // Set the value for other inputs
+ if ( target )
+ {
+ GetE( 'txtClass' ).value = target.className ;
+ GetE( 'txtId' ).value = target.id ;
+ GetE( 'txtLang' ).value = target.lang ;
+ GetE( 'txtInlineStyle').value = target.style.cssText ;
+ GetE( 'txtTitle' ).value = target.title ;
+ GetE( 'selLangDir').value = target.dir || GetNearestAncestorDirection( target ) ;
+ }
+ }
+ else
+ {
+ GetE( 'txtId' ).disabled = true ;
+ AddStyleOption( "" ) ;
+ for ( var i in selectableStyles )
+ AddStyleOption( i ) ;
+ }
+}
+
+function CreateDiv()
+{
+ var newBlocks = [] ;
+ var range = new FCKDomRange( FCK.EditorWindow ) ;
+ range.MoveToSelection() ;
+
+ var bookmark = range.CreateBookmark() ;
+
+ // Kludge for #1592: if the bookmark nodes are in the beginning of
+ // $tagName, then move them to the nearest block element in the
+ // $tagName.
+ if ( FCKBrowserInfo.IsIE )
+ {
+ var bStart = range.GetBookmarkNode( bookmark, true ) ;
+ var bEnd = range.GetBookmarkNode( bookmark, false ) ;
+
+ var cursor ;
+
+ if ( bStart
+ && bStart.parentNode.nodeName.IEquals( 'div' )
+ && !bStart.previousSibling )
+ {
+ cursor = bStart ;
+ while ( ( cursor = cursor.nextSibling ) )
+ {
+ if ( FCKListsLib.BlockElements[ cursor.nodeName.toLowerCase() ] )
+ FCKDomTools.MoveNode( bStart, cursor, true ) ;
+ }
+ }
+
+ if ( bEnd
+ && bEnd.parentNode.nodeName.IEquals( 'div' )
+ && !bEnd.previousSibling )
+ {
+ cursor = bEnd ;
+ while ( ( cursor = cursor.nextSibling ) )
+ {
+ if ( FCKListsLib.BlockElements[ cursor.nodeName.toLowerCase() ] )
+ {
+ if ( cursor.firstChild == bStart )
+ FCKDomTools.InsertAfterNode( bStart, bEnd ) ;
+ else
+ FCKDomTools.MoveNode( bEnd, cursor, true ) ;
+ }
+ }
+ }
+ }
+
+ var iterator = new FCKDomRangeIterator( range ) ;
+ var block ;
+
+ iterator.EnforceRealBlocks = true ;
+ var paragraphs = [] ;
+ var groups = [] ;
+ var lastBlockLimit = null ;
+ while ( ( block = iterator.GetNextParagraph() ) )
+ {
+ var elementPath = new FCKElementPath( block ) ;
+ if ( elementPath.BlockLimit != lastBlockLimit )
+ {
+ groups.push( [] ) ;
+ lastBlockLimit = elementPath.BlockLimit ;
+ }
+ groups[groups.length - 1].push( block ) ;
+ }
+
+ for ( var i = 0 ; i < groups.length ; i++ )
+ {
+ var divNode = FCK.EditorDocument.createElement( 'div' ) ;
+ groups[i][0].parentNode.insertBefore( divNode, groups[i][0] ) ;
+ for ( var j = 0 ; j < groups[i].length ; j++ )
+ FCKDomTools.MoveNode( groups[i][j], divNode ) ;
+ newBlocks.push( divNode ) ;
+ }
+
+ range.MoveToBookmark( bookmark ) ;
+ range.Select() ;
+
+ FCK.Focus() ;
+ FCK.Events.FireEvent( 'OnSelectionChange' ) ;
+
+ return newBlocks ;
+}
+
+function Ok()
+{
+ oEditor.FCKUndo.SaveUndoStep() ;
+
+ if ( CurrentContainers.length < 1 )
+ CurrentContainers = CreateDiv();
+
+ var setValue = function( attrName, inputName )
+ {
+ var val = GetE( inputName ).value ;
+ for ( var i = 0 ; i < CurrentContainers.length ; i++ )
+ {
+ if ( val == '' )
+ CurrentContainers[i].removeAttribute( attrName ) ;
+ else
+ CurrentContainers[i].setAttribute( attrName, val ) ;
+ }
+ }
+
+ // Apply modifications to the DIV container according to dialog inputs.
+ if ( CurrentContainers.length == 1 )
+ {
+ setValue( 'class', 'txtClass' ) ;
+ setValue( 'id', 'txtId' ) ;
+ }
+ setValue( 'lang', 'txtLang' ) ;
+ if ( FCKBrowserInfo.IsIE )
+ {
+ for ( var i = 0 ; i < CurrentContainers.length ; i++ )
+ CurrentContainers[i].style.cssText = GetE( 'txtInlineStyle' ).value ;
+ }
+ else
+ setValue( 'style', 'txtInlineStyle' ) ;
+ setValue( 'title', 'txtTitle' ) ;
+ for ( var i = 0 ; i < CurrentContainers.length ; i++ )
+ {
+ var dir = GetE( 'selLangDir' ).value ;
+ var styleName = GetE( 'selStyle' ).value ;
+ if ( GetNearestAncestorDirection( CurrentContainers[i] ) != dir )
+ CurrentContainers[i].dir = dir ;
+ else
+ CurrentContainers[i].removeAttribute( 'dir' ) ;
+
+ if ( styleName )
+ FCKStyles.GetStyle( styleName ).ApplyToObject( CurrentContainers[i] ) ;
+ }
+
+ return true ;
+}
+
+ </script>
+</head>
+<body style="overflow: hidden">
+ <div id="divGeneral">
+ <table cellspacing="0" cellpadding="0" width="100%" border="0">
+ <colgroup span="2">
+ <col width="49%" />
+ <col width="2%" />
+ <col width="49%" />
+ </colgroup>
+ <tr>
+ <td>
+ <span fcklang="DlgDivStyle">Style</span><br />
+ <select id="selStyle" style="width: 100%;">
+ </select>
+ </td>
+ <td> </td>
+ <td>
+ <span fcklang="DlgGenClass">Stylesheet Classes</span><br />
+ <input id="txtClass" style="width: 100%" type="text" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="divAdvanced" style="display: none">
+ <table cellspacing="0" cellpadding="0" width="100%" border="0">
+ <colgroup span="2">
+ <col width="49%" />
+ <col width="2%" />
+ <col width="49%" />
+ </colgroup>
+ <tr>
+ <td>
+ <span fcklang="DlgGenId">Id</span><br />
+ <input style="width: 100%" type="text" id="txtId" />
+ </td>
+ <td> </td>
+ <td>
+ <span fcklang="DlgGenLangCode">Language Code</span><br />
+ <input style="width: 100%" type="text" id="txtLang" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="3"> </td>
+ </tr>
+ <tr>
+ <td colspan="3">
+ <span fcklang="DlgDivInlineStyle">Inline Style</span><br />
+ <input style="width: 100%" type="text" id="txtInlineStyle" />
+ </td>
+ </tr>
+ <tr>
+ <td colspan="3"> </td>
+ </tr>
+ <tr>
+ <td colspan="3">
+ <span fcklang="DlgGenTitle">Advisory Title</span><br />
+ <input style="width: 100%" type="text" id="txtTitle" />
+ </td>
+ </tr>
+ <tr>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>
+ <span fcklang="DlgGenLangDir">Language Direction</span><br />
+ <select id="selLangDir">
+ <option fcklang="DlgGenLangDirLtr" value="ltr">Left to Right (LTR)
+ <option fcklang="DlgGenLangDirRtl" value="rtl">Right to Left (RTL)
+ </select>
+ </td>
+ </tr>
+ </table>
+ </div>
+</body>
+</html>
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_link/fck_link.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_link/fck_link.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_link/fck_link.js Thu Aug 28 18:47:59 2008
@@ -77,36 +77,187 @@
var oParser = new Object() ;
-oParser.ParseEMailUrl = function( emailUrl )
+// This method simply returns the two inputs in numerical order. You can even
+// provide strings, as the method would parseInt() the values.
+oParser.SortNumerical = function(a, b)
+{
+ return parseInt( a, 10 ) - parseInt( b, 10 ) ;
+}
+
+oParser.ParseEMailParams = function(sParams)
+{
+ // Initialize the oEMailParams object.
+ var oEMailParams = new Object() ;
+ oEMailParams.Subject = '' ;
+ oEMailParams.Body = '' ;
+
+ var aMatch = sParams.match( /(^|^\?|&)subject=([^&]+)/i ) ;
+ if ( aMatch ) oEMailParams.Subject = decodeURIComponent( aMatch[2] ) ;
+
+ aMatch = sParams.match( /(^|^\?|&)body=([^&]+)/i ) ;
+ if ( aMatch ) oEMailParams.Body = decodeURIComponent( aMatch[2] ) ;
+
+ return oEMailParams ;
+}
+
+// This method returns either an object containing the email info, or FALSE
+// if the parameter is not an email link.
+oParser.ParseEMailUri = function( sUrl )
{
// Initializes the EMailInfo object.
var oEMailInfo = new Object() ;
- oEMailInfo.Address = '' ;
- oEMailInfo.Subject = '' ;
- oEMailInfo.Body = '' ;
+ oEMailInfo.Address = '' ;
+ oEMailInfo.Subject = '' ;
+ oEMailInfo.Body = '' ;
+
+ var aLinkInfo = sUrl.match( /^(\w+):(.*)$/ ) ;
+ if ( aLinkInfo && aLinkInfo[1] == 'mailto' )
+ {
+ // This seems to be an unprotected email link.
+ var aParts = aLinkInfo[2].match( /^([^\?]+)\??(.+)?/ ) ;
+ if ( aParts )
+ {
+ // Set the e-mail address.
+ oEMailInfo.Address = aParts[1] ;
- var oParts = emailUrl.match( /^([^\?]+)\??(.+)?/ ) ;
- if ( oParts )
+ // Look for the optional e-mail parameters.
+ if ( aParts[2] )
+ {
+ var oEMailParams = oParser.ParseEMailParams( aParts[2] ) ;
+ oEMailInfo.Subject = oEMailParams.Subject ;
+ oEMailInfo.Body = oEMailParams.Body ;
+ }
+ }
+ return oEMailInfo ;
+ }
+ else if ( aLinkInfo && aLinkInfo[1] == 'javascript' )
{
- // Set the e-mail address.
- oEMailInfo.Address = oParts[1] ;
+ // This may be a protected email.
- // Look for the optional e-mail parameters.
- if ( oParts[2] )
+ // Try to match the url against the EMailProtectionFunction.
+ var func = FCKConfig.EMailProtectionFunction ;
+ if ( func != null )
{
- var oMatch = oParts[2].match( /(^|&)subject=([^&]+)/i ) ;
- if ( oMatch ) oEMailInfo.Subject = decodeURIComponent( oMatch[2] ) ;
+ try
+ {
+ // Escape special chars.
+ func = func.replace( /([\/^$*+.?()\[\]])/g, '\\$1' ) ;
+
+ // Define the possible keys.
+ var keys = new Array('NAME', 'DOMAIN', 'SUBJECT', 'BODY') ;
- oMatch = oParts[2].match( /(^|&)body=([^&]+)/i ) ;
- if ( oMatch ) oEMailInfo.Body = decodeURIComponent( oMatch[2] ) ;
+ // Get the order of the keys (hold them in the array <pos>) and
+ // the function replaced by regular expression patterns.
+ var sFunc = func ;
+ var pos = new Array() ;
+ for ( var i = 0 ; i < keys.length ; i ++ )
+ {
+ var rexp = new RegExp( keys[i] ) ;
+ var p = func.search( rexp ) ;
+ if ( p >= 0 )
+ {
+ sFunc = sFunc.replace( rexp, '\'([^\']*)\'' ) ;
+ pos[pos.length] = p + ':' + keys[i] ;
+ }
+ }
+
+ // Sort the available keys.
+ pos.sort( oParser.SortNumerical ) ;
+
+ // Replace the excaped single quotes in the url, such they do
+ // not affect the regexp afterwards.
+ aLinkInfo[2] = aLinkInfo[2].replace( /\\'/g, '###SINGLE_QUOTE###' ) ;
+
+ // Create the regexp and execute it.
+ var rFunc = new RegExp( '^' + sFunc + '$' ) ;
+ var aMatch = rFunc.exec( aLinkInfo[2] ) ;
+ if ( aMatch )
+ {
+ var aInfo = new Array();
+ for ( var i = 1 ; i < aMatch.length ; i ++ )
+ {
+ var k = pos[i-1].match(/^\d+:(.+)$/) ;
+ aInfo[k[1]] = aMatch[i].replace(/###SINGLE_QUOTE###/g, '\'') ;
+ }
+
+ // Fill the EMailInfo object that will be returned
+ oEMailInfo.Address = aInfo['NAME'] + '@' + aInfo['DOMAIN'] ;
+ oEMailInfo.Subject = decodeURIComponent( aInfo['SUBJECT'] ) ;
+ oEMailInfo.Body = decodeURIComponent( aInfo['BODY'] ) ;
+
+ return oEMailInfo ;
+ }
+ }
+ catch (e)
+ {
+ }
}
- }
- return oEMailInfo ;
+ // Try to match the email against the encode protection.
+ var aMatch = aLinkInfo[2].match( /^location\.href='mailto:'\+(String\.fromCharCode\([\d,]+\))\+'(.*)'$/ ) ;
+ if ( aMatch )
+ {
+ // The link is encoded
+ oEMailInfo.Address = eval( aMatch[1] ) ;
+ if ( aMatch[2] )
+ {
+ var oEMailParams = oParser.ParseEMailParams( aMatch[2] ) ;
+ oEMailInfo.Subject = oEMailParams.Subject ;
+ oEMailInfo.Body = oEMailParams.Body ;
+ }
+ return oEMailInfo ;
+ }
+ }
+ return false;
}
oParser.CreateEMailUri = function( address, subject, body )
{
+ // Switch for the EMailProtection setting.
+ switch ( FCKConfig.EMailProtection )
+ {
+ case 'function' :
+ var func = FCKConfig.EMailProtectionFunction ;
+ if ( func == null )
+ {
+ if ( FCKConfig.Debug )
+ {
+ alert('EMailProtection alert!\nNo function defined. Please set "FCKConfig.EMailProtectionFunction"') ;
+ }
+ return '';
+ }
+
+ // Split the email address into name and domain parts.
+ var aAddressParts = address.split( '@', 2 ) ;
+ if ( aAddressParts[1] == undefined )
+ {
+ aAddressParts[1] = '' ;
+ }
+
+ // Replace the keys by their values (embedded in single quotes).
+ func = func.replace(/NAME/g, "'" + aAddressParts[0].replace(/'/g, '\\\'') + "'") ;
+ func = func.replace(/DOMAIN/g, "'" + aAddressParts[1].replace(/'/g, '\\\'') + "'") ;
+ func = func.replace(/SUBJECT/g, "'" + encodeURIComponent( subject ).replace(/'/g, '\\\'') + "'") ;
+ func = func.replace(/BODY/g, "'" + encodeURIComponent( body ).replace(/'/g, '\\\'') + "'") ;
+
+ return 'javascript:' + func ;
+
+ case 'encode' :
+ var aParams = [] ;
+ var aAddressCode = [] ;
+
+ if ( subject.length > 0 )
+ aParams.push( 'subject='+ encodeURIComponent( subject ) ) ;
+ if ( body.length > 0 )
+ aParams.push( 'body=' + encodeURIComponent( body ) ) ;
+ for ( var i = 0 ; i < address.length ; i++ )
+ aAddressCode.push( address.charCodeAt( i ) ) ;
+
+ return 'javascript:location.href=\'mailto:\'+String.fromCharCode(' + aAddressCode.join( ',' ) + ')+\'?' + aParams.join( '&' ) + '\'' ;
+ }
+
+ // EMailProtection 'none'
+
var sBaseUri = 'mailto:' + address ;
var sParams = '' ;
@@ -263,28 +414,26 @@
// Search for the protocol.
var sProtocol = oRegex.UriProtocol.exec( sHRef ) ;
- if ( sProtocol )
+ // Search for a protected email link.
+ var oEMailInfo = oParser.ParseEMailUri( sHRef );
+
+ if ( oEMailInfo )
+ {
+ sType = 'email' ;
+
+ GetE('txtEMailAddress').value = oEMailInfo.Address ;
+ GetE('txtEMailSubject').value = oEMailInfo.Subject ;
+ GetE('txtEMailBody').value = oEMailInfo.Body ;
+ }
+ else if ( sProtocol )
{
sProtocol = sProtocol[0].toLowerCase() ;
GetE('cmbLinkProtocol').value = sProtocol ;
// Remove the protocol and get the remaining URL.
var sUrl = sHRef.replace( oRegex.UriProtocol, '' ) ;
-
- if ( sProtocol == 'mailto:' ) // It is an e-mail link.
- {
- sType = 'email' ;
-
- var oEMailInfo = oParser.ParseEMailUrl( sUrl ) ;
- GetE('txtEMailAddress').value = oEMailInfo.Address ;
- GetE('txtEMailSubject').value = oEMailInfo.Subject ;
- GetE('txtEMailBody').value = oEMailInfo.Body ;
- }
- else // It is a normal link.
- {
- sType = 'url' ;
- GetE('txtUrl').value = sUrl ;
- }
+ sType = 'url' ;
+ GetE('txtUrl').value = sUrl ;
}
else if ( sHRef.substr(0,1) == '#' && sHRef.length > 1 ) // It is an anchor link.
{
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_paste.html
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_paste.html (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_paste.html Thu Aug 28 18:47:59 2008
@@ -64,7 +64,7 @@
var eFrameSpace = document.getElementById( 'xFrameSpace' ) ;
eFrameSpace.innerHTML = '<iframe id="frmData" src="' + sFrameUrl + '" ' +
- 'height="98%" width="99%" frameborder="0" style="border: #000000 1px; background-color: #ffffff"></iframe>' ;
+ 'height="98%" width="99%" frameborder="0" style="border: #000000 1px; background-color: #ffffff"><\/iframe>' ;
var oFrame = eFrameSpace.firstChild ;
@@ -187,7 +187,7 @@
var html = oNode.innerHTML ;
html = html.replace(/<o:p>\s*<\/o:p>/g, '') ;
- html = html.replace(/<o:p>.*?<\/o:p>/g, ' ') ;
+ html = html.replace(/<o:p>[\s\S]*?<\/o:p>/g, ' ') ;
// Remove mso-xxx styles.
html = html.replace( /\s*mso-[^:]+:[^;"]+;?/gi, '' ) ;
@@ -224,6 +224,10 @@
if ( bRemoveStyles )
html = html.replace( /<(\w[^>]*) style="([^\"]*)"([^>]*)/gi, "<$1$3" ) ;
+ // Remove style, meta and link tags
+ html = html.replace( /<STYLE[^>]*>[\s\S]*?<\/STYLE[^>]*>/gi, '' ) ;
+ html = html.replace( /<(?:META|LINK)[^>]*>\s*/gi, '' ) ;
+
// Remove empty styles.
html = html.replace( /\s*style="\s*"/gi, '' ) ;
@@ -234,25 +238,28 @@
// Remove Lang attributes
html = html.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3") ;
- html = html.replace( /<SPAN\s*>(.*?)<\/SPAN>/gi, '$1' ) ;
+ html = html.replace( /<SPAN\s*>([\s\S]*?)<\/SPAN>/gi, '$1' ) ;
- html = html.replace( /<FONT\s*>(.*?)<\/FONT>/gi, '$1' ) ;
+ html = html.replace( /<FONT\s*>([\s\S]*?)<\/FONT>/gi, '$1' ) ;
// Remove XML elements and declarations
html = html.replace(/<\\?\?xml[^>]*>/gi, '' ) ;
+ // Remove w: tags with contents.
+ html = html.replace( /<w:[^>]*>[\s\S]*?<\/w:[^>]*>/gi, '' ) ;
+
// Remove Tags with XML namespace declarations: <o:p><\/o:p>
html = html.replace(/<\/?\w+:[^>]*>/gi, '' ) ;
// Remove comments [SF BUG-1481861].
- html = html.replace(/<\!--.*?-->/g, '' ) ;
+ html = html.replace(/<\!--[\s\S]*?-->/g, '' ) ;
html = html.replace( /<(U|I|STRIKE)> <\/\1>/g, ' ' ) ;
html = html.replace( /<H\d>\s*<\/H\d>/gi, '' ) ;
// Remove "display:none" tags.
- html = html.replace( /<(\w+)[^>]*\sstyle="[^"]*DISPLAY\s?:\s?none(.*?)<\/\1>/ig, '' ) ;
+ html = html.replace( /<(\w+)[^>]*\sstyle="[^"]*DISPLAY\s?:\s?none[\s\S]*?<\/\1>/ig, '' ) ;
// Remove language tags
html = html.replace( /<(\w[^>]*) language=([^ |>]*)([^>]*)/gi, "<$1$3") ;
@@ -267,8 +274,8 @@
html = html.replace( /<H(\d)([^>]*)>/gi, '<h$1>' ) ;
// Word likes to insert extra <font> tags, when using MSIE. (Wierd).
- html = html.replace( /<(H\d)><FONT[^>]*>(.*?)<\/FONT><\/\1>/gi, '<$1>$2<\/$1>' );
- html = html.replace( /<(H\d)><EM>(.*?)<\/EM><\/\1>/gi, '<$1>$2<\/$1>' );
+ html = html.replace( /<(H\d)><FONT[^>]*>([\s\S]*?)<\/FONT><\/\1>/gi, '<$1>$2<\/$1>' );
+ html = html.replace( /<(H\d)><EM>([\s\S]*?)<\/EM><\/\1>/gi, '<$1>$2<\/$1>' );
}
else
{
@@ -282,7 +289,7 @@
html = html.replace( /<\/H\d>/gi, '<\/font><\/b><\/div>' ) ;
// Transform <P> to <DIV>
- var re = new RegExp( '(<P)([^>]*>.*?)(<\/P>)', 'gi' ) ; // Different because of a IE 5.0 error
+ var re = new RegExp( '(<P)([^>]*>[\\s\\S]*?)(<\/P>)', 'gi' ) ; // Different because of a IE 5.0 error
html = html.replace( re, '<div$2<\/div>' ) ;
// Remove empty tags (three times, just to be sure).
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_replace.html
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_replace.html (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_replace.html Thu Aug 28 18:47:59 2008
@@ -185,7 +185,7 @@
var focusNode = domRange.StartNode ;
if ( focusNode.nodeType != 1 )
focusNode = focusNode.parentNode ;
- focusNode.scrollIntoView( false ) ;
+ FCKDomTools.ScrollIntoView( focusNode, false ) ;
this._cursors = charRange._cursors ;
},
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_spellerpages.html
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_spellerpages.html (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_spellerpages.html Thu Aug 28 18:47:59 2008
@@ -52,7 +52,12 @@
function oSpeller_OnFinished( numberOCorrections )
{
if ( numberOCorrections > 0 )
- oEditor.FCK.SetData( document.getElementById('txtHtml').value ) ;
+ {
+ oEditor.FCKUndo.SaveUndoStep() ;
+ oEditor.FCK.EditorDocument.body.innerHTML = document.getElementById('txtHtml').value ;
+ if ( oEditor.FCKBrowserInfo.IsIE )
+ oEditor.FCKSelection.Collapse( true ) ;
+ }
window.parent.Cancel() ;
}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.cfm
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.cfm Thu Aug 28 18:47:59 2008
@@ -0,0 +1,148 @@
+<cfsetting enablecfoutputonly="true">
+<!---
+This code uses a CF User Defined Function and should work in CF version 5.0
+and up without alteration.
+
+Also if you are hosting your site at an ISP, you will have to check with them
+to see if the use of <CFEXECUTE> is allowed. In most cases ISP will not allow
+the use of that tag for security reasons. Clients would be able to access each
+others files in certain cases.
+--->
+
+<!--- The following variables values must reflect your installation. --->
+<cfset aspell_dir = "C:\Program Files\Aspell\bin">
+<cfset lang = "en_US">
+<cfset aspell_opts = "-a --lang=#lang# --encoding=utf-8 -H --rem-sgml-check=alt">
+<cfset tempfile_in = GetTempFile(GetTempDirectory(), "spell_")>
+<cfset tempfile_out = GetTempFile(GetTempDirectory(), "spell_")>
+<cfset spellercss = "../spellerStyle.css">
+<cfset word_win_src = "../wordWindow.js">
+
+<cfset form.checktext = form["textinputs[]"]>
+
+<!--- make no difference between URL and FORM scopes --->
+<cfparam name="url.checktext" default="">
+<cfparam name="form.checktext" default="#url.checktext#">
+
+<!--- Takes care of those pesky smart quotes from MS apps, replaces them with regular quotes --->
+<cfset submitted_text = ReplaceList(form.checktext,"%u201C,%u201D","%22,%22")>
+
+<!--- submitted_text now is ready for processing --->
+
+<!--- use carat on each line to escape possible aspell commands --->
+<cfset text = "">
+<cfset CRLF = Chr(13) & Chr(10)>
+
+<cfloop list="#submitted_text#" index="field" delimiters=",">
+ <cfset text = text & "%" & CRLF
+ & "^A" & CRLF
+ & "!" & CRLF>
+ <!--- Strip all tags for the text. (by FredCK - #339 / #681) --->
+ <cfset field = REReplace(URLDecode(field), "<[^>]+>", " ", "all")>
+ <cfloop list="#field#" index="line" delimiters="#CRLF#">
+ <cfset text = ListAppend(text, "^" & Trim(JSStringFormat(line)), CRLF)>
+ </cfloop>
+</cfloop>
+
+<!--- create temp file from the submitted text, this will be passed to aspell to be check for misspelled words --->
+<cffile action="write" file="#tempfile_in#" output="#text#" charset="utf-8">
+
+<!--- execute aspell in an UTF-8 console and redirect output to a file. UTF-8 encoding is lost if done differently --->
+<cfexecute name="cmd.exe" arguments='/c type "#tempfile_in#" | "#aspell_dir#\aspell.exe" #aspell_opts# > "#tempfile_out#"' timeout="100"/>
+
+<!--- read output file for further processing --->
+<cffile action="read" file="#tempfile_out#" variable="food" charset="utf-8">
+
+<!--- remove temp files --->
+<cffile action="delete" file="#tempfile_in#">
+<cffile action="delete" file="#tempfile_out#">
+
+<cfset texts = StructNew()>
+<cfset texts.textinputs = "">
+<cfset texts.words = "">
+<cfset texts.abort = "">
+
+<!--- Generate Text Inputs --->
+<cfset i = 0>
+<cfloop list="#submitted_text#" index="textinput">
+ <cfset texts.textinputs = ListAppend(texts.textinputs, 'textinputs[#i#] = decodeURIComponent("#textinput#");', CRLF)>
+ <cfset i = i + 1>
+</cfloop>
+
+<!--- Generate Words Lists --->
+<cfset word_cnt = 0>
+<cfset input_cnt = -1>
+<cfloop list="#food#" index="aspell_line" delimiters="#CRLF#">
+ <cfset leftChar = Left(aspell_line, 1)>
+ <cfif leftChar eq "*">
+ <cfset input_cnt = input_cnt + 1>
+ <cfset word_cnt = 0>
+ <cfset texts.words = ListAppend(texts.words, "words[#input_cnt#] = [];", CRLF)>
+ <cfset texts.words = ListAppend(texts.words, "suggs[#input_cnt#] = [];", CRLF)>
+ <cfelse>
+ <cfif leftChar eq "&" or leftChar eq "##">
+ <!--- word that misspelled --->
+ <cfset bad_word = Trim(ListGetAt(aspell_line, 2, " "))>
+ <cfset bad_word = Replace(bad_word, "'", "\'", "ALL")>
+ <!--- sugestions --->
+ <cfset sug_list = Trim(ListRest(aspell_line, ":"))>
+ <cfset sug_list = ListQualify(Replace(sug_list, "'", "\'", "ALL"), "'")>
+ <!--- javascript --->
+ <cfset texts.words = ListAppend(texts.words, "words[#input_cnt#][#word_cnt#] = '#bad_word#';", CRLF)>
+ <cfset texts.words = ListAppend(texts.words, "suggs[#input_cnt#][#word_cnt#] = [#sug_list#];", CRLF)>
+ <cfset word_cnt = word_cnt + 1>
+ </cfif>
+ </cfif>
+</cfloop>
+
+<cfif texts.words eq "">
+ <cfset texts.abort = "alert('Spell check complete.\n\nNo misspellings found.'); top.window.close();">
+</cfif>
+
+<cfcontent type="text/html; charset=utf-8">
+
+<cfoutput><html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<link rel="stylesheet" type="text/css" href="#spellercss#" />
+<script language="javascript" src="#word_win_src#"></script>
+<script language="javascript">
+var suggs = new Array();
+var words = new Array();
+var textinputs = new Array();
+var error;
+
+#texts.textinputs##CRLF#
+#texts.words#
+#texts.abort#
+
+var wordWindowObj = new wordWindow();
+wordWindowObj.originalSpellings = words;
+wordWindowObj.suggestions = suggs;
+wordWindowObj.textInputs = textinputs;
+
+function init_spell() {
+ // check if any error occured during server-side processing
+ if( error ) {
+ alert( error );
+ } else {
+ // call the init_spell() function in the parent frameset
+ if (parent.frames.length) {
+ parent.init_spell( wordWindowObj );
+ } else {
+ alert('This page was loaded outside of a frameset. It might not display properly');
+ }
+ }
+}
+</script>
+
+</head>
+<body onLoad="init_spell();">
+
+<script type="text/javascript">
+wordWindowObj.writeBody();
+</script>
+
+</body>
+</html></cfoutput>
+<cfsetting enablecfoutputonly="false">
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.php
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.php Thu Aug 28 18:47:59 2008
@@ -0,0 +1,199 @@
+<?php
+header('Content-type: text/html; charset=utf-8');
+
+// The following variables values must reflect your installation needs.
+
+$aspell_prog = '"C:\Program Files\Aspell\bin\aspell.exe"'; // by FredCK (for Windows)
+//$aspell_prog = 'aspell'; // by FredCK (for Linux)
+
+$lang = 'en_US';
+$aspell_opts = "-a --lang=$lang --encoding=utf-8 -H --rem-sgml-check=alt"; // by FredCK
+
+$tempfiledir = "./";
+
+$spellercss = '../spellerStyle.css'; // by FredCK
+$word_win_src = '../wordWindow.js'; // by FredCK
+
+$textinputs = $_POST['textinputs']; # array
+$input_separator = "A";
+
+# set the JavaScript variable to the submitted text.
+# textinputs is an array, each element corresponding to the (url-encoded)
+# value of the text control submitted for spell-checking
+function print_textinputs_var() {
+ global $textinputs;
+ foreach( $textinputs as $key=>$val ) {
+ # $val = str_replace( "'", "%27", $val );
+ echo "textinputs[$key] = decodeURIComponent(\"" . $val . "\");\n";
+ }
+}
+
+# make declarations for the text input index
+function print_textindex_decl( $text_input_idx ) {
+ echo "words[$text_input_idx] = [];\n";
+ echo "suggs[$text_input_idx] = [];\n";
+}
+
+# set an element of the JavaScript 'words' array to a misspelled word
+function print_words_elem( $word, $index, $text_input_idx ) {
+ echo "words[$text_input_idx][$index] = '" . escape_quote( $word ) . "';\n";
+}
+
+
+# set an element of the JavaScript 'suggs' array to a list of suggestions
+function print_suggs_elem( $suggs, $index, $text_input_idx ) {
+ echo "suggs[$text_input_idx][$index] = [";
+ foreach( $suggs as $key=>$val ) {
+ if( $val ) {
+ echo "'" . escape_quote( $val ) . "'";
+ if ( $key+1 < count( $suggs )) {
+ echo ", ";
+ }
+ }
+ }
+ echo "];\n";
+}
+
+# escape single quote
+function escape_quote( $str ) {
+ return preg_replace ( "/'/", "\\'", $str );
+}
+
+
+# handle a server-side error.
+function error_handler( $err ) {
+ echo "error = '" . preg_replace( "/['\\\\]/", "\\\\$0", $err ) . "';\n";
+}
+
+## get the list of misspelled words. Put the results in the javascript words array
+## for each misspelled word, get suggestions and put in the javascript suggs array
+function print_checker_results() {
+
+ global $aspell_prog;
+ global $aspell_opts;
+ global $tempfiledir;
+ global $textinputs;
+ global $input_separator;
+ $aspell_err = "";
+ # create temp file
+ $tempfile = tempnam( $tempfiledir, 'aspell_data_' );
+
+ # open temp file, add the submitted text.
+ if( $fh = fopen( $tempfile, 'w' )) {
+ for( $i = 0; $i < count( $textinputs ); $i++ ) {
+ $text = urldecode( $textinputs[$i] );
+
+ // Strip all tags for the text. (by FredCK - #339 / #681)
+ $text = preg_replace( "/<[^>]+>/", " ", $text ) ;
+
+ $lines = explode( "\n", $text );
+ fwrite ( $fh, "%\n" ); # exit terse mode
+ fwrite ( $fh, "^$input_separator\n" );
+ fwrite ( $fh, "!\n" ); # enter terse mode
+ foreach( $lines as $key=>$value ) {
+ # use carat on each line to escape possible aspell commands
+ fwrite( $fh, "^$value\n" );
+ }
+ }
+ fclose( $fh );
+
+ # exec aspell command - redirect STDERR to STDOUT
+ $cmd = "$aspell_prog $aspell_opts < $tempfile 2>&1";
+ if( $aspellret = shell_exec( $cmd )) {
+ $linesout = explode( "\n", $aspellret );
+ $index = 0;
+ $text_input_index = -1;
+ # parse each line of aspell return
+ foreach( $linesout as $key=>$val ) {
+ $chardesc = substr( $val, 0, 1 );
+ # if '&', then not in dictionary but has suggestions
+ # if '#', then not in dictionary and no suggestions
+ # if '*', then it is a delimiter between text inputs
+ # if '@' then version info
+ if( $chardesc == '&' || $chardesc == '#' ) {
+ $line = explode( " ", $val, 5 );
+ print_words_elem( $line[1], $index, $text_input_index );
+ if( isset( $line[4] )) {
+ $suggs = explode( ", ", $line[4] );
+ } else {
+ $suggs = array();
+ }
+ print_suggs_elem( $suggs, $index, $text_input_index );
+ $index++;
+ } elseif( $chardesc == '*' ) {
+ $text_input_index++;
+ print_textindex_decl( $text_input_index );
+ $index = 0;
+ } elseif( $chardesc != '@' && $chardesc != "" ) {
+ # assume this is error output
+ $aspell_err .= $val;
+ }
+ }
+ if( $aspell_err ) {
+ $aspell_err = "Error executing `$cmd`\\n$aspell_err";
+ error_handler( $aspell_err );
+ }
+ } else {
+ error_handler( "System error: Aspell program execution failed (`$cmd`)" );
+ }
+ } else {
+ error_handler( "System error: Could not open file '$tempfile' for writing" );
+ }
+
+ # close temp file, delete file
+ unlink( $tempfile );
+}
+
+
+?>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<link rel="stylesheet" type="text/css" href="<?php echo $spellercss ?>" />
+<script language="javascript" src="<?php echo $word_win_src ?>"></script>
+<script language="javascript">
+var suggs = new Array();
+var words = new Array();
+var textinputs = new Array();
+var error;
+<?php
+
+print_textinputs_var();
+
+print_checker_results();
+
+?>
+
+var wordWindowObj = new wordWindow();
+wordWindowObj.originalSpellings = words;
+wordWindowObj.suggestions = suggs;
+wordWindowObj.textInputs = textinputs;
+
+function init_spell() {
+ // check if any error occured during server-side processing
+ if( error ) {
+ alert( error );
+ } else {
+ // call the init_spell() function in the parent frameset
+ if (parent.frames.length) {
+ parent.init_spell( wordWindowObj );
+ } else {
+ alert('This page was loaded outside of a frameset. It might not display properly');
+ }
+ }
+}
+
+
+
+</script>
+
+</head>
+<!-- <body onLoad="init_spell();"> by FredCK -->
+<body onLoad="init_spell();" bgcolor="#ffffff">
+
+<script type="text/javascript">
+wordWindowObj.writeBody();
+</script>
+
+</body>
+</html>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.pl
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/dialog/fck_spellerpages/spellerpages/server-scripts/spellchecker.pl Thu Aug 28 18:47:59 2008
@@ -0,0 +1,181 @@
+#!/usr/bin/perl
+
+use CGI qw/ :standard /;
+use File::Temp qw/ tempfile tempdir /;
+
+# my $spellercss = '/speller/spellerStyle.css'; # by FredCK
+my $spellercss = '../spellerStyle.css'; # by FredCK
+# my $wordWindowSrc = '/speller/wordWindow.js'; # by FredCK
+my $wordWindowSrc = '../wordWindow.js'; # by FredCK
+my @textinputs = param( 'textinputs[]' ); # array
+# my $aspell_cmd = 'aspell'; # by FredCK (for Linux)
+my $aspell_cmd = '"C:\Program Files\Aspell\bin\aspell.exe"'; # by FredCK (for Windows)
+my $lang = 'en_US';
+# my $aspell_opts = "-a --lang=$lang --encoding=utf-8"; # by FredCK
+my $aspell_opts = "-a --lang=$lang --encoding=utf-8 -H --rem-sgml-check=alt"; # by FredCK
+my $input_separator = "A";
+
+# set the 'wordtext' JavaScript variable to the submitted text.
+sub printTextVar {
+ for( my $i = 0; $i <= $#textinputs; $i++ ) {
+ print "textinputs[$i] = decodeURIComponent('" . escapeQuote( $textinputs[$i] ) . "')\n";
+ }
+}
+
+sub printTextIdxDecl {
+ my $idx = shift;
+ print "words[$idx] = [];\n";
+ print "suggs[$idx] = [];\n";
+}
+
+sub printWordsElem {
+ my( $textIdx, $wordIdx, $word ) = @_;
+ print "words[$textIdx][$wordIdx] = '" . escapeQuote( $word ) . "';\n";
+}
+
+sub printSuggsElem {
+ my( $textIdx, $wordIdx, @suggs ) = @_;
+ print "suggs[$textIdx][$wordIdx] = [";
+ for my $i ( 0..$#suggs ) {
+ print "'" . escapeQuote( $suggs[$i] ) . "'";
+ if( $i < $#suggs ) {
+ print ", ";
+ }
+ }
+ print "];\n";
+}
+
+sub printCheckerResults {
+ my $textInputIdx = -1;
+ my $wordIdx = 0;
+ my $unhandledText;
+ # create temp file
+ my $dir = tempdir( CLEANUP => 1 );
+ my( $fh, $tmpfilename ) = tempfile( DIR => $dir );
+
+ # temp file was created properly?
+
+ # open temp file, add the submitted text.
+ for( my $i = 0; $i <= $#textinputs; $i++ ) {
+ $text = url_decode( $textinputs[$i] );
+ # Strip all tags for the text. (by FredCK - #339 / #681)
+ $text =~ s/<[^>]+>/ /g;
+ @lines = split( /\n/, $text );
+ print $fh "\%\n"; # exit terse mode
+ print $fh "^$input_separator\n";
+ print $fh "!\n"; # enter terse mode
+ for my $line ( @lines ) {
+ # use carat on each line to escape possible aspell commands
+ print $fh "^$line\n";
+ }
+
+ }
+ # exec aspell command
+ my $cmd = "$aspell_cmd $aspell_opts < $tmpfilename 2>&1";
+ open ASPELL, "$cmd |" or handleError( "Could not execute `$cmd`\\n$!" ) and return;
+ # parse each line of aspell return
+ for my $ret ( <ASPELL> ) {
+ chomp( $ret );
+ # if '&', then not in dictionary but has suggestions
+ # if '#', then not in dictionary and no suggestions
+ # if '*', then it is a delimiter between text inputs
+ if( $ret =~ /^\*/ ) {
+ $textInputIdx++;
+ printTextIdxDecl( $textInputIdx );
+ $wordIdx = 0;
+
+ } elsif( $ret =~ /^(&|#)/ ) {
+ my @tokens = split( " ", $ret, 5 );
+ printWordsElem( $textInputIdx, $wordIdx, $tokens[1] );
+ my @suggs = ();
+ if( $tokens[4] ) {
+ @suggs = split( ", ", $tokens[4] );
+ }
+ printSuggsElem( $textInputIdx, $wordIdx, @suggs );
+ $wordIdx++;
+ } else {
+ $unhandledText .= $ret;
+ }
+ }
+ close ASPELL or handleError( "Error executing `$cmd`\\n$unhandledText" ) and return;
+}
+
+sub escapeQuote {
+ my $str = shift;
+ $str =~ s/'/\\'/g;
+ return $str;
+}
+
+sub handleError {
+ my $err = shift;
+ print "error = '" . escapeQuote( $err ) . "';\n";
+}
+
+sub url_decode {
+ local $_ = @_ ? shift : $_;
+ defined or return;
+ # change + signs to spaces
+ tr/+/ /;
+ # change hex escapes to the proper characters
+ s/%([a-fA-F0-9]{2})/pack "H2", $1/eg;
+ return $_;
+}
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# Display HTML
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+print <<EOF;
+Content-type: text/html; charset=utf-8
+
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<link rel="stylesheet" type="text/css" href="$spellercss"/>
+<script src="$wordWindowSrc"></script>
+<script type="text/javascript">
+var suggs = new Array();
+var words = new Array();
+var textinputs = new Array();
+var error;
+EOF
+
+printTextVar();
+
+printCheckerResults();
+
+print <<EOF;
+var wordWindowObj = new wordWindow();
+wordWindowObj.originalSpellings = words;
+wordWindowObj.suggestions = suggs;
+wordWindowObj.textInputs = textinputs;
+
+
+function init_spell() {
+ // check if any error occured during server-side processing
+ if( error ) {
+ alert( error );
+ } else {
+ // call the init_spell() function in the parent frameset
+ if (parent.frames.length) {
+ parent.init_spell( wordWindowObj );
+ } else {
+ error = "This page was loaded outside of a frameset. ";
+ error += "It might not display properly";
+ alert( error );
+ }
+ }
+}
+
+</script>
+
+</head>
+<body onLoad="init_spell();">
+
+<script type="text/javascript">
+wordWindowObj.writeBody();
+</script>
+
+</body>
+</html>
+EOF
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/fckeditor.html
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/fckeditor.html (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/fckeditor.html Thu Aug 28 18:47:59 2008
@@ -29,6 +29,37 @@
<meta http-equiv="Cache-Control" content="public">
<script type="text/javascript">
+// #1645: Alert the user if opening FCKeditor in FF3 from local filesystem
+// without security.fileuri.strict_origin_policy disabled.
+if ( document.location.protocol == 'file:' )
+{
+ try
+ {
+ window.parent.document.domain ;
+ }
+ catch ( e )
+ {
+ window.addEventListener( 'load', function()
+ {
+ document.body.innerHTML = '\
+ <div style="border: 1px red solid; font-family: arial; font-size: 12px; color: red; padding:10px;">\
+ <p>\
+ <b>Your browser security settings don\'t allow FCKeditor to be opened from\
+ the local filesystem.<\/b>\
+ <\/p>\
+ <p>\
+ Please open the <b>about:config<\/b> page and disable the\
+ "security.fileuri.strict_origin_policy" option; then load this page again.\
+ <\/p>\
+ <p>\
+ Check our <a href="http://docs.fckeditor.net/FCKeditor_2.x/Developers_Guide/FAQ#ff3perms">FAQ<\/a>\
+ for more information.\
+ <\/p>\
+ <\/div>' ;
+ }, false ) ;
+ }
+}
+
// Save a reference to the default domain.
var FCK_ORIGINAL_DOMAIN ;
@@ -222,7 +253,8 @@
if ( FCKBrowserInfo.IsGecko )
FCKTools.RunFunction( window.onresize ) ;
- _AttachFormSubmitToAPI() ;
+ if ( !FCKConfig.PreventSubmitHandler )
+ _AttachFormSubmitToAPI() ;
FCK.SetStatus( FCK_STATUS_COMPLETE ) ;
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/fckeditor.original.html
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/fckeditor.original.html (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/fckeditor.original.html Thu Aug 28 18:47:59 2008
@@ -31,6 +31,37 @@
@Packager.RemoveLine -->
<script type="text/javascript">
+// #1645: Alert the user if opening FCKeditor in FF3 from local filesystem
+// without security.fileuri.strict_origin_policy disabled.
+if ( document.location.protocol == 'file:' )
+{
+ try
+ {
+ window.parent.document.domain ;
+ }
+ catch ( e )
+ {
+ window.addEventListener( 'load', function()
+ {
+ document.body.innerHTML = '\
+ <div style="border: 1px red solid; font-family: arial; font-size: 12px; color: red; padding:10px;">\
+ <p>\
+ <b>Your browser security settings don\'t allow FCKeditor to be opened from\
+ the local filesystem.<\/b>\
+ <\/p>\
+ <p>\
+ Please open the <b>about:config<\/b> page and disable the\
+ "security.fileuri.strict_origin_policy" option; then load this page again.\
+ <\/p>\
+ <p>\
+ Check our <a href="http://docs.fckeditor.net/FCKeditor_2.x/Developers_Guide/FAQ#ff3perms">FAQ<\/a>\
+ for more information.\
+ <\/p>\
+ <\/div>' ;
+ }, false ) ;
+ }
+}
+
// Save a reference to the default domain.
var FCK_ORIGINAL_DOMAIN ;
@@ -329,7 +360,8 @@
if ( FCKBrowserInfo.IsGecko )
FCKTools.RunFunction( window.onresize ) ;
- _AttachFormSubmitToAPI() ;
+ if ( !FCKConfig.PreventSubmitHandler )
+ _AttachFormSubmitToAPI() ;
FCK.SetStatus( FCK_STATUS_COMPLETE ) ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/basexml.asp
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/basexml.asp Thu Aug 28 18:47:59 2008
@@ -0,0 +1,63 @@
+<%
+ ' FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ ' Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ '
+ ' == BEGIN LICENSE ==
+ '
+ ' Licensed under the terms of any of the following licenses at your
+ ' choice:
+ '
+ ' - GNU General Public License Version 2 or later (the "GPL")
+ ' http://www.gnu.org/licenses/gpl.html
+ '
+ ' - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ ' http://www.gnu.org/licenses/lgpl.html
+ '
+ ' - Mozilla Public License Version 1.1 or later (the "MPL")
+ ' http://www.mozilla.org/MPL/MPL-1.1.html
+ '
+ ' == END LICENSE ==
+ '
+ ' This file include the functions that create the base XML output.
+%>
+<%
+
+Sub SetXmlHeaders()
+ ' Cleans the response buffer.
+ Response.Clear()
+
+ ' Prevent the browser from caching the result.
+ Response.CacheControl = "no-cache"
+
+ ' Set the response format.
+ Response.CodePage = 65001
+ Response.CharSet = "UTF-8"
+ Response.ContentType = "text/xml"
+End Sub
+
+Sub CreateXmlHeader( command, resourceType, currentFolder, url )
+ ' Create the XML document header.
+ Response.Write "<?xml version=""1.0"" encoding=""utf-8"" ?>"
+
+ ' Create the main "Connector" node.
+ Response.Write "<Connector command=""" & command & """ resourceType=""" & resourceType & """>"
+
+ ' Add the current folder node.
+ Response.Write "<CurrentFolder path=""" & ConvertToXmlAttribute( currentFolder ) & """ url=""" & ConvertToXmlAttribute( url ) & """ />"
+End Sub
+
+Sub CreateXmlFooter()
+ Response.Write "</Connector>"
+End Sub
+
+Sub SendError( number, text )
+ SetXmlHeaders
+
+ ' Create the XML document header.
+ Response.Write "<?xml version=""1.0"" encoding=""utf-8"" ?>"
+
+ Response.Write "<Connector><Error number=""" & number & """ text=""" & Server.HTMLEncode( text ) & """ /></Connector>"
+
+ Response.End
+End Sub
+%>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/class_upload.asp
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/class_upload.asp Thu Aug 28 18:47:59 2008
@@ -0,0 +1,353 @@
+<%
+ ' FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ ' Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ '
+ ' == BEGIN LICENSE ==
+ '
+ ' Licensed under the terms of any of the following licenses at your
+ ' choice:
+ '
+ ' - GNU General Public License Version 2 or later (the "GPL")
+ ' http://www.gnu.org/licenses/gpl.html
+ '
+ ' - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ ' http://www.gnu.org/licenses/lgpl.html
+ '
+ ' - Mozilla Public License Version 1.1 or later (the "MPL")
+ ' http://www.mozilla.org/MPL/MPL-1.1.html
+ '
+ ' == END LICENSE ==
+ '
+ ' These are the classes used to handle ASP upload without using third
+ ' part components (OCX/DLL).
+%>
+<%
+'**********************************************
+' File: NetRube_Upload.asp
+' Version: NetRube Upload Class Version 2.3 Build 20070528
+' Author: NetRube
+' Email: NetRube at 126.com
+' Date: 05/28/2007
+' Comments: The code for the Upload.
+' This can free usage, but please
+' not to delete this copyright information.
+' If you have a modification version,
+' Please send out a duplicate to me.
+'**********************************************
+' 文件名: NetRube_Upload.asp
+' 版本: NetRube Upload Class Version 2.3 Build 20070528
+' 作者: NetRube(网络乡巴佬)
+' 电子邮件: NetRube at 126.com
+' 日期: 2007年05月28日
+' 声明: 文件上传类
+' 本上传类可以自由使用,但请保留此版权声明信息
+' 如果您对本上传类进行修改增强,
+' 请发送一份给俺。
+'**********************************************
+
+Class NetRube_Upload
+
+ Public File, Form
+ Private oSourceData
+ Private nMaxSize, nErr, sAllowed, sDenied, sHtmlExtensions
+
+ Private Sub Class_Initialize
+ nErr = 0
+ nMaxSize = 1048576
+
+ Set File = Server.CreateObject("Scripting.Dictionary")
+ File.CompareMode = 1
+ Set Form = Server.CreateObject("Scripting.Dictionary")
+ Form.CompareMode = 1
+
+ Set oSourceData = Server.CreateObject("ADODB.Stream")
+ oSourceData.Type = 1
+ oSourceData.Mode = 3
+ oSourceData.Open
+ End Sub
+
+ Private Sub Class_Terminate
+ Form.RemoveAll
+ Set Form = Nothing
+ File.RemoveAll
+ Set File = Nothing
+
+ oSourceData.Close
+ Set oSourceData = Nothing
+ End Sub
+
+ Public Property Get Version
+ Version = "NetRube Upload Class Version 2.3 Build 20070528"
+ End Property
+
+ Public Property Get ErrNum
+ ErrNum = nErr
+ End Property
+
+ Public Property Let MaxSize(nSize)
+ nMaxSize = nSize
+ End Property
+
+ Public Property Let Allowed(sExt)
+ sAllowed = sExt
+ End Property
+
+ Public Property Let Denied(sExt)
+ sDenied = sExt
+ End Property
+
+ Public Property Let HtmlExtensions(sExt)
+ sHtmlExtensions = sExt
+ End Property
+
+ Public Sub GetData
+ Dim aCType
+ aCType = Split(Request.ServerVariables("HTTP_CONTENT_TYPE"), ";")
+ if ( uBound(aCType) < 0 ) then
+ nErr = 1
+ Exit Sub
+ end if
+ If aCType(0) <> "multipart/form-data" Then
+ nErr = 1
+ Exit Sub
+ End If
+
+ Dim nTotalSize
+ nTotalSize = Request.TotalBytes
+ If nTotalSize < 1 Then
+ nErr = 2
+ Exit Sub
+ End If
+ If nMaxSize > 0 And nTotalSize > nMaxSize Then
+ nErr = 3
+ Exit Sub
+ End If
+
+ 'Thankful long(yrl031715 at 163.com)
+ 'Fix upload large file.
+ '**********************************************
+ ' 修正作者:long
+ ' 联系邮件: yrl031715 at 163.com
+ ' 修正时间:2007年5月6日
+ ' 修正说明:由于iis6的Content-Length 头信息中包含的请求长度超过了 AspMaxRequestEntityAllowed 的值(默认200K), IIS 将返回一个 403 错误信息.
+ ' 直接导致在iis6下调试FCKeditor上传功能时,一旦文件超过200K,上传文件时文件管理器失去响应,受此影响,文件的快速上传功能也存在在缺陷。
+ ' 在参考 宝玉 的 Asp无组件上传带进度条 演示程序后作出如下修改,以修正在iis6下的错误。
+
+ Dim nTotalBytes, nPartBytes, ReadBytes
+ ReadBytes = 0
+ nTotalBytes = Request.TotalBytes
+ '循环分块读取
+ Do While ReadBytes < nTotalBytes
+ '分块读取
+ nPartBytes = 64 * 1024 '分成每块64k
+ If nPartBytes + ReadBytes > nTotalBytes Then
+ nPartBytes = nTotalBytes - ReadBytes
+ End If
+ oSourceData.Write Request.BinaryRead(nPartBytes)
+ ReadBytes = ReadBytes + nPartBytes
+ Loop
+ '**********************************************
+ oSourceData.Position = 0
+
+ Dim oTotalData, oFormStream, sFormHeader, sFormName, bCrLf, nBoundLen, nFormStart, nFormEnd, nPosStart, nPosEnd, sBoundary
+
+ oTotalData = oSourceData.Read
+ bCrLf = ChrB(13) & ChrB(10)
+ sBoundary = MidB(oTotalData, 1, InStrB(1, oTotalData, bCrLf) - 1)
+ nBoundLen = LenB(sBoundary) + 2
+ nFormStart = nBoundLen
+
+ Set oFormStream = Server.CreateObject("ADODB.Stream")
+
+ Do While (nFormStart + 2) < nTotalSize
+ nFormEnd = InStrB(nFormStart, oTotalData, bCrLf & bCrLf) + 3
+
+ With oFormStream
+ .Type = 1
+ .Mode = 3
+ .Open
+ oSourceData.Position = nFormStart
+ oSourceData.CopyTo oFormStream, nFormEnd - nFormStart
+ .Position = 0
+ .Type = 2
+ .CharSet = "UTF-8"
+ sFormHeader = .ReadText
+ .Close
+ End With
+
+ nFormStart = InStrB(nFormEnd, oTotalData, sBoundary) - 1
+ nPosStart = InStr(22, sFormHeader, " name=", 1) + 7
+ nPosEnd = InStr(nPosStart, sFormHeader, """")
+ sFormName = Mid(sFormHeader, nPosStart, nPosEnd - nPosStart)
+
+ If InStr(45, sFormHeader, " filename=", 1) > 0 Then
+ Set File(sFormName) = New NetRube_FileInfo
+ File(sFormName).FormName = sFormName
+ File(sFormName).Start = nFormEnd
+ File(sFormName).Size = nFormStart - nFormEnd - 2
+ nPosStart = InStr(nPosEnd, sFormHeader, " filename=", 1) + 11
+ nPosEnd = InStr(nPosStart, sFormHeader, """")
+ File(sFormName).ClientPath = Mid(sFormHeader, nPosStart, nPosEnd - nPosStart)
+ File(sFormName).Name = Mid(File(sFormName).ClientPath, InStrRev(File(sFormName).ClientPath, "\") + 1)
+ File(sFormName).Ext = LCase(Mid(File(sFormName).Name, InStrRev(File(sFormName).Name, ".") + 1))
+ nPosStart = InStr(nPosEnd, sFormHeader, "Content-Type: ", 1) + 14
+ nPosEnd = InStr(nPosStart, sFormHeader, vbCr)
+ File(sFormName).MIME = Mid(sFormHeader, nPosStart, nPosEnd - nPosStart)
+ Else
+ With oFormStream
+ .Type = 1
+ .Mode = 3
+ .Open
+ oSourceData.Position = nFormEnd
+ oSourceData.CopyTo oFormStream, nFormStart - nFormEnd - 2
+ .Position = 0
+ .Type = 2
+ .CharSet = "UTF-8"
+ Form(sFormName) = .ReadText
+ .Close
+ End With
+ End If
+
+ nFormStart = nFormStart + nBoundLen
+ Loop
+
+ oTotalData = ""
+ Set oFormStream = Nothing
+ End Sub
+
+ Public Sub SaveAs(sItem, sFileName)
+ If File(sItem).Size < 1 Then
+ nErr = 2
+ Exit Sub
+ End If
+
+ If Not IsAllowed(File(sItem).Ext) Then
+ nErr = 4
+ Exit Sub
+ End If
+
+ If InStr( LCase( sFileName ), "::$data" ) > 0 Then
+ nErr = 4
+ Exit Sub
+ End If
+
+ Dim sFileExt, iFileSize
+ sFileExt = File(sItem).Ext
+ iFileSize = File(sItem).Size
+
+ ' Check XSS.
+ If Not IsHtmlExtension( sFileExt ) Then
+ ' Calculate the size of data to load (max 1Kb).
+ Dim iXSSSize
+ iXSSSize = iFileSize
+
+ If iXSSSize > 1024 Then
+ iXSSSize = 1024
+ End If
+
+ ' Read the data.
+ Dim sData
+ oSourceData.Position = File(sItem).Start
+ sData = oSourceData.Read( iXSSSize ) ' Byte Array
+ sData = ByteArray2Text( sData ) ' String
+
+ ' Sniff HTML data.
+ If SniffHtml( sData ) Then
+ nErr = 4
+ Exit Sub
+ End If
+ End If
+
+ Dim oFileStream
+ Set oFileStream = Server.CreateObject("ADODB.Stream")
+ With oFileStream
+ .Type = 1
+ .Mode = 3
+ .Open
+ oSourceData.Position = File(sItem).Start
+ oSourceData.CopyTo oFileStream, File(sItem).Size
+ .Position = 0
+ .SaveToFile sFileName, 2
+ .Close
+ End With
+ Set oFileStream = Nothing
+ End Sub
+
+ Private Function IsAllowed(sExt)
+ Dim oRE
+ Set oRE = New RegExp
+ oRE.IgnoreCase = True
+ oRE.Global = True
+
+ If sDenied = "" Then
+ oRE.Pattern = sAllowed
+ IsAllowed = (sAllowed = "") Or oRE.Test(sExt)
+ Else
+ oRE.Pattern = sDenied
+ IsAllowed = Not oRE.Test(sExt)
+ End If
+
+ Set oRE = Nothing
+ End Function
+
+ Private Function IsHtmlExtension( sExt )
+ If sHtmlExtensions = "" Then
+ Exit Function
+ End If
+
+ Dim oRE
+ Set oRE = New RegExp
+ oRE.IgnoreCase = True
+ oRE.Global = True
+ oRE.Pattern = sHtmlExtensions
+
+ IsHtmlExtension = oRE.Test(sExt)
+
+ Set oRE = Nothing
+ End Function
+
+ Private Function SniffHtml( sData )
+
+ Dim oRE
+ Set oRE = New RegExp
+ oRE.IgnoreCase = True
+ oRE.Global = True
+
+ Dim aPatterns
+ aPatterns = Array( "<!DOCTYPE\W*X?HTML", "<(body|head|html|img|pre|script|table|title)", "type\s*=\s*[\'""]?\s*(?:\w*/)?(?:ecma|java)", "(?:href|src|data)\s*=\s*[\'""]?\s*(?:ecma|java)script:", "url\s*\(\s*[\'""]?\s*(?:ecma|java)script:" )
+
+ Dim i
+ For i = 0 to UBound( aPatterns )
+ oRE.Pattern = aPatterns( i )
+ If oRE.Test( sData ) Then
+ SniffHtml = True
+ Exit Function
+ End If
+ Next
+
+ SniffHtml = False
+
+ End Function
+
+ ' Thanks to http://www.ericphelps.com/q193998/index.htm
+ Private Function ByteArray2Text(varByteArray)
+ Dim strData, strBuffer, lngCounter
+ strData = ""
+ strBuffer = ""
+ For lngCounter = 0 to UBound(varByteArray)
+ strBuffer = strBuffer & Chr(255 And Ascb(Midb(varByteArray,lngCounter + 1, 1)))
+ 'Keep strBuffer at 1k bytes maximum
+ If lngCounter Mod 1024 = 0 Then
+ strData = strData & strBuffer
+ strBuffer = ""
+ End If
+ Next
+ ByteArray2Text = strData & strBuffer
+ End Function
+
+End Class
+
+Class NetRube_FileInfo
+ Dim FormName, ClientPath, Path, Name, Ext, Content, Size, MIME, Start
+End Class
+%>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/commands.asp
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/commands.asp Thu Aug 28 18:47:59 2008
@@ -0,0 +1,198 @@
+<%
+ ' FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ ' Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ '
+ ' == BEGIN LICENSE ==
+ '
+ ' Licensed under the terms of any of the following licenses at your
+ ' choice:
+ '
+ ' - GNU General Public License Version 2 or later (the "GPL")
+ ' http://www.gnu.org/licenses/gpl.html
+ '
+ ' - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ ' http://www.gnu.org/licenses/lgpl.html
+ '
+ ' - Mozilla Public License Version 1.1 or later (the "MPL")
+ ' http://www.mozilla.org/MPL/MPL-1.1.html
+ '
+ ' == END LICENSE ==
+ '
+ ' This file include the functions that handle the Command requests
+ ' in the ASP Connector.
+%>
+<%
+Sub GetFolders( resourceType, currentFolder )
+ ' Map the virtual path to the local server path.
+ Dim sServerDir
+ sServerDir = ServerMapFolder( resourceType, currentFolder, "GetFolders" )
+
+ ' Open the "Folders" node.
+ Response.Write "<Folders>"
+
+ Dim oFSO, oCurrentFolder, oFolders, oFolder
+ Set oFSO = Server.CreateObject( "Scripting.FileSystemObject" )
+ if not (oFSO.FolderExists( sServerDir ) ) then
+ Set oFSO = Nothing
+ SendError 102, currentFolder
+ end if
+
+ Set oCurrentFolder = oFSO.GetFolder( sServerDir )
+ Set oFolders = oCurrentFolder.SubFolders
+
+ For Each oFolder in oFolders
+ Response.Write "<Folder name=""" & ConvertToXmlAttribute( oFolder.name ) & """ />"
+ Next
+
+ Set oFSO = Nothing
+
+ ' Close the "Folders" node.
+ Response.Write "</Folders>"
+End Sub
+
+Sub GetFoldersAndFiles( resourceType, currentFolder )
+ ' Map the virtual path to the local server path.
+ Dim sServerDir
+ sServerDir = ServerMapFolder( resourceType, currentFolder, "GetFoldersAndFiles" )
+
+ Dim oFSO, oCurrentFolder, oFolders, oFolder, oFiles, oFile
+ Set oFSO = Server.CreateObject( "Scripting.FileSystemObject" )
+ if not (oFSO.FolderExists( sServerDir ) ) then
+ Set oFSO = Nothing
+ SendError 102, currentFolder
+ end if
+
+ Set oCurrentFolder = oFSO.GetFolder( sServerDir )
+ Set oFolders = oCurrentFolder.SubFolders
+ Set oFiles = oCurrentFolder.Files
+
+ ' Open the "Folders" node.
+ Response.Write "<Folders>"
+
+ For Each oFolder in oFolders
+ Response.Write "<Folder name=""" & ConvertToXmlAttribute( oFolder.name ) & """ />"
+ Next
+
+ ' Close the "Folders" node.
+ Response.Write "</Folders>"
+
+ ' Open the "Files" node.
+ Response.Write "<Files>"
+
+ For Each oFile in oFiles
+ Dim iFileSize
+ iFileSize = Round( oFile.size / 1024 )
+ If ( iFileSize < 1 AND oFile.size <> 0 ) Then iFileSize = 1
+
+ Response.Write "<File name=""" & ConvertToXmlAttribute( oFile.name ) & """ size=""" & iFileSize & """ />"
+ Next
+
+ ' Close the "Files" node.
+ Response.Write "</Files>"
+End Sub
+
+Sub CreateFolder( resourceType, currentFolder )
+ Dim sErrorNumber
+
+ Dim sNewFolderName
+ sNewFolderName = Request.QueryString( "NewFolderName" )
+ sNewFolderName = SanitizeFolderName( sNewFolderName )
+
+ If ( sNewFolderName = "" OR InStr( 1, sNewFolderName, ".." ) > 0 ) Then
+ sErrorNumber = "102"
+ Else
+ ' Map the virtual path to the local server path of the current folder.
+ Dim sServerDir
+ sServerDir = ServerMapFolder( resourceType, CombineLocalPaths(currentFolder, sNewFolderName), "CreateFolder" )
+
+ On Error Resume Next
+
+ CreateServerFolder sServerDir
+
+ Dim iErrNumber, sErrDescription
+ iErrNumber = err.number
+ sErrDescription = err.Description
+
+ On Error Goto 0
+
+ Select Case iErrNumber
+ Case 0
+ sErrorNumber = "0"
+ Case 52
+ sErrorNumber = "102" ' Invalid Folder Name.
+ Case 70
+ sErrorNumber = "103" ' Security Error.
+ Case 76
+ sErrorNumber = "102" ' Path too long.
+ Case Else
+ sErrorNumber = "110"
+ End Select
+ End If
+
+ ' Create the "Error" node.
+ Response.Write "<Error number=""" & sErrorNumber & """ originalNumber=""" & iErrNumber & """ originalDescription=""" & ConvertToXmlAttribute( sErrDescription ) & """ />"
+End Sub
+
+Sub FileUpload( resourceType, currentFolder, sCommand )
+ Dim oUploader
+ Set oUploader = New NetRube_Upload
+ oUploader.MaxSize = 0
+ oUploader.Allowed = ConfigAllowedExtensions.Item( resourceType )
+ oUploader.Denied = ConfigDeniedExtensions.Item( resourceType )
+ oUploader.HtmlExtensions = ConfigHtmlExtensions
+ oUploader.GetData
+
+ Dim sErrorNumber
+ sErrorNumber = "0"
+
+ Dim sFileName, sOriginalFileName, sExtension
+ sFileName = ""
+
+ If oUploader.ErrNum > 0 Then
+ sErrorNumber = "202"
+ Else
+ ' Map the virtual path to the local server path.
+ Dim sServerDir
+ sServerDir = ServerMapFolder( resourceType, currentFolder, sCommand )
+
+ Dim oFSO
+ Set oFSO = Server.CreateObject( "Scripting.FileSystemObject" )
+ if not (oFSO.FolderExists( sServerDir ) ) then
+ sErrorNumber = "102"
+ else
+ ' Get the uploaded file name.
+ sFileName = oUploader.File( "NewFile" ).Name
+ sExtension = oUploader.File( "NewFile" ).Ext
+ sFileName = SanitizeFileName( sFileName )
+ sOriginalFileName = sFileName
+
+ Dim iCounter
+ iCounter = 0
+
+ Do While ( True )
+ Dim sFilePath
+ sFilePath = CombineLocalPaths(sServerDir, sFileName)
+
+ If ( oFSO.FileExists( sFilePath ) ) Then
+ iCounter = iCounter + 1
+ sFileName = RemoveExtension( sOriginalFileName ) & "(" & iCounter & ")." & sExtension
+ sErrorNumber = "201"
+ Else
+ oUploader.SaveAs "NewFile", sFilePath
+ If oUploader.ErrNum > 0 Then sErrorNumber = "202"
+ Exit Do
+ End If
+ Loop
+ end if
+ End If
+
+ Set oUploader = Nothing
+
+ dim sFileUrl
+ sFileUrl = CombinePaths( GetResourceTypePath( resourceType, sCommand ) , currentFolder )
+ sFileUrl = CombinePaths( sFileUrl, sFileName )
+
+ SendUploadResults sErrorNumber, sFileUrl, sFileName, ""
+End Sub
+
+%>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/config.asp
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/config.asp Thu Aug 28 18:47:59 2008
@@ -0,0 +1,128 @@
+<%
+ ' FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ ' Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ '
+ ' == BEGIN LICENSE ==
+ '
+ ' Licensed under the terms of any of the following licenses at your
+ ' choice:
+ '
+ ' - GNU General Public License Version 2 or later (the "GPL")
+ ' http://www.gnu.org/licenses/gpl.html
+ '
+ ' - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ ' http://www.gnu.org/licenses/lgpl.html
+ '
+ ' - Mozilla Public License Version 1.1 or later (the "MPL")
+ ' http://www.mozilla.org/MPL/MPL-1.1.html
+ '
+ ' == END LICENSE ==
+ '
+ ' Configuration file for the File Manager Connector for ASP.
+%>
+<%
+
+' SECURITY: You must explicitly enable this "connector" (set it to "True").
+' WARNING: don't just set "ConfigIsEnabled = true", you must be sure that only
+' authenticated users can access this file or use some kind of session checking.
+Dim ConfigIsEnabled
+ConfigIsEnabled = False
+
+' Path to user files relative to the document root.
+' This setting is preserved only for backward compatibility.
+' You should look at the settings for each resource type to get the full potential
+Dim ConfigUserFilesPath
+ConfigUserFilesPath = "/userfiles/"
+
+' Due to security issues with Apache modules, it is recommended to leave the
+' following setting enabled.
+Dim ConfigForceSingleExtension
+ConfigForceSingleExtension = true
+
+' What the user can do with this connector
+Dim ConfigAllowedCommands
+ConfigAllowedCommands = "QuickUpload|FileUpload|GetFolders|GetFoldersAndFiles|CreateFolder"
+
+' Allowed Resource Types
+Dim ConfigAllowedTypes
+ConfigAllowedTypes = "File|Image|Flash|Media"
+
+' For security, HTML is allowed in the first Kb of data for files having the
+' following extensions only.
+Dim ConfigHtmlExtensions
+ConfigHtmlExtensions = "html|htm|xml|xsd|txt|js"
+'
+' Configuration settings for each Resource Type
+'
+' - AllowedExtensions: the possible extensions that can be allowed.
+' If it is empty then any file type can be uploaded.
+'
+' - DeniedExtensions: The extensions that won't be allowed.
+' If it is empty then no restrictions are done here.
+'
+' For a file to be uploaded it has to fulfill both the AllowedExtensions
+' and DeniedExtensions (that's it: not being denied) conditions.
+'
+' - FileTypesPath: the virtual folder relative to the document root where
+' these resources will be located.
+' Attention: It must start and end with a slash: '/'
+'
+' - FileTypesAbsolutePath: the physical path to the above folder. It must be
+' an absolute path.
+' If it's an empty string then it will be autocalculated.
+' Useful if you are using a virtual directory, symbolic link or alias.
+' Examples: 'C:\\MySite\\userfiles\\' or '/root/mysite/userfiles/'.
+' Attention: The above 'FileTypesPath' must point to the same directory.
+' Attention: It must end with a slash: '/'
+'
+' - QuickUploadPath: the virtual folder relative to the document root where
+' these resources will be uploaded using the Upload tab in the resources
+' dialogs.
+' Attention: It must start and end with a slash: '/'
+'
+' - QuickUploadAbsolutePath: the physical path to the above folder. It must be
+' an absolute path.
+' If it's an empty string then it will be autocalculated.
+' Useful if you are using a virtual directory, symbolic link or alias.
+' Examples: 'C:\\MySite\\userfiles\\' or '/root/mysite/userfiles/'.
+' Attention: The above 'QuickUploadPath' must point to the same directory.
+' Attention: It must end with a slash: '/'
+'
+
+Dim ConfigAllowedExtensions, ConfigDeniedExtensions, ConfigFileTypesPath, ConfigFileTypesAbsolutePath, ConfigQuickUploadPath, ConfigQuickUploadAbsolutePath
+Set ConfigAllowedExtensions = CreateObject( "Scripting.Dictionary" )
+Set ConfigDeniedExtensions = CreateObject( "Scripting.Dictionary" )
+Set ConfigFileTypesPath = CreateObject( "Scripting.Dictionary" )
+Set ConfigFileTypesAbsolutePath = CreateObject( "Scripting.Dictionary" )
+Set ConfigQuickUploadPath = CreateObject( "Scripting.Dictionary" )
+Set ConfigQuickUploadAbsolutePath = CreateObject( "Scripting.Dictionary" )
+
+ConfigAllowedExtensions.Add "File", "7z|aiff|asf|avi|bmp|csv|doc|fla|flv|gif|gz|gzip|jpeg|jpg|mid|mov|mp3|mp4|mpc|mpeg|mpg|ods|odt|pdf|png|ppt|pxd|qt|ram|rar|rm|rmi|rmvb|rtf|sdc|sitd|swf|sxc|sxw|tar|tgz|tif|tiff|txt|vsd|wav|wma|wmv|xls|xml|zip"
+ConfigDeniedExtensions.Add "File", ""
+ConfigFileTypesPath.Add "File", ConfigUserFilesPath & "file/"
+ConfigFileTypesAbsolutePath.Add "File", ""
+ConfigQuickUploadPath.Add "File", ConfigUserFilesPath
+ConfigQuickUploadAbsolutePath.Add "File", ""
+
+ConfigAllowedExtensions.Add "Image", "bmp|gif|jpeg|jpg|png"
+ConfigDeniedExtensions.Add "Image", ""
+ConfigFileTypesPath.Add "Image", ConfigUserFilesPath & "image/"
+ConfigFileTypesAbsolutePath.Add "Image", ""
+ConfigQuickUploadPath.Add "Image", ConfigUserFilesPath
+ConfigQuickUploadAbsolutePath.Add "Image", ""
+
+ConfigAllowedExtensions.Add "Flash", "swf|flv"
+ConfigDeniedExtensions.Add "Flash", ""
+ConfigFileTypesPath.Add "Flash", ConfigUserFilesPath & "flash/"
+ConfigFileTypesAbsolutePath.Add "Flash", ""
+ConfigQuickUploadPath.Add "Flash", ConfigUserFilesPath
+ConfigQuickUploadAbsolutePath.Add "Flash", ""
+
+ConfigAllowedExtensions.Add "Media", "aiff|asf|avi|bmp|fla|flv|gif|jpeg|jpg|mid|mov|mp3|mp4|mpc|mpeg|mpg|png|qt|ram|rm|rmi|rmvb|swf|tif|tiff|wav|wma|wmv"
+ConfigDeniedExtensions.Add "Media", ""
+ConfigFileTypesPath.Add "Media", ConfigUserFilesPath & "media/"
+ConfigFileTypesAbsolutePath.Add "Media", ""
+ConfigQuickUploadPath.Add "Media", ConfigUserFilesPath
+ConfigQuickUploadAbsolutePath.Add "Media", ""
+
+%>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/connector.asp
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/connector.asp Thu Aug 28 18:47:59 2008
@@ -0,0 +1,88 @@
+<%@ CodePage=65001 Language="VBScript"%>
+<%
+Option Explicit
+Response.Buffer = True
+%>
+<%
+ ' FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ ' Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ '
+ ' == BEGIN LICENSE ==
+ '
+ ' Licensed under the terms of any of the following licenses at your
+ ' choice:
+ '
+ ' - GNU General Public License Version 2 or later (the "GPL")
+ ' http://www.gnu.org/licenses/gpl.html
+ '
+ ' - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ ' http://www.gnu.org/licenses/lgpl.html
+ '
+ ' - Mozilla Public License Version 1.1 or later (the "MPL")
+ ' http://www.mozilla.org/MPL/MPL-1.1.html
+ '
+ ' == END LICENSE ==
+ '
+ ' This is the File Manager Connector for ASP.
+%>
+<!--#include file="config.asp"-->
+<!--#include file="util.asp"-->
+<!--#include file="io.asp"-->
+<!--#include file="basexml.asp"-->
+<!--#include file="commands.asp"-->
+<!--#include file="class_upload.asp"-->
+<%
+
+If ( ConfigIsEnabled = False ) Then
+ SendError 1, "This connector is disabled. Please check the ""editor/filemanager/connectors/asp/config.asp"" file"
+End If
+
+DoResponse
+
+Sub DoResponse()
+ Dim sCommand, sResourceType, sCurrentFolder
+
+ ' Get the main request information.
+ sCommand = Request.QueryString("Command")
+
+ sResourceType = Request.QueryString("Type")
+ If ( sResourceType = "" ) Then sResourceType = "File"
+
+ sCurrentFolder = GetCurrentFolder()
+
+ ' Check if it is an allowed command
+ if ( Not IsAllowedCommand( sCommand ) ) then
+ SendError 1, "The """ & sCommand & """ command isn't allowed"
+ end if
+
+ ' Check if it is an allowed resource type.
+ if ( Not IsAllowedType( sResourceType ) ) Then
+ SendError 1, "The """ & sResourceType & """ resource type isn't allowed"
+ end if
+
+ ' File Upload doesn't have to Return XML, so it must be intercepted before anything.
+ If ( sCommand = "FileUpload" ) Then
+ FileUpload sResourceType, sCurrentFolder, sCommand
+ Exit Sub
+ End If
+
+ SetXmlHeaders
+
+ CreateXmlHeader sCommand, sResourceType, sCurrentFolder, GetUrlFromPath( sResourceType, sCurrentFolder, sCommand)
+
+ ' Execute the required command.
+ Select Case sCommand
+ Case "GetFolders"
+ GetFolders sResourceType, sCurrentFolder
+ Case "GetFoldersAndFiles"
+ GetFoldersAndFiles sResourceType, sCurrentFolder
+ Case "CreateFolder"
+ CreateFolder sResourceType, sCurrentFolder
+ End Select
+
+ CreateXmlFooter
+
+ Response.End
+End Sub
+
+%>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/io.asp
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/io.asp Thu Aug 28 18:47:59 2008
@@ -0,0 +1,236 @@
+<%
+ ' FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ ' Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ '
+ ' == BEGIN LICENSE ==
+ '
+ ' Licensed under the terms of any of the following licenses at your
+ ' choice:
+ '
+ ' - GNU General Public License Version 2 or later (the "GPL")
+ ' http://www.gnu.org/licenses/gpl.html
+ '
+ ' - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ ' http://www.gnu.org/licenses/lgpl.html
+ '
+ ' - Mozilla Public License Version 1.1 or later (the "MPL")
+ ' http://www.mozilla.org/MPL/MPL-1.1.html
+ '
+ ' == END LICENSE ==
+ '
+ ' This file include IO specific functions used by the ASP Connector.
+%>
+<%
+function CombinePaths( sBasePath, sFolder)
+ CombinePaths = RemoveFromEnd( sBasePath, "/" ) & "/" & RemoveFromStart( sFolder, "/" )
+end function
+
+function CombineLocalPaths( sBasePath, sFolder)
+ sFolder = replace(sFolder, "/", "\")
+ ' The RemoveFrom* functions use RegExp, so we must escape the \
+ CombineLocalPaths = RemoveFromEnd( sBasePath, "\\" ) & "\" & RemoveFromStart( sFolder, "\\" )
+end function
+
+Function GetResourceTypePath( resourceType, sCommand )
+ if ( sCommand = "QuickUpload") then
+ GetResourceTypePath = ConfigQuickUploadPath.Item( resourceType )
+ else
+ GetResourceTypePath = ConfigFileTypesPath.Item( resourceType )
+ end if
+end Function
+
+Function GetResourceTypeDirectory( resourceType, sCommand )
+ if ( sCommand = "QuickUpload") then
+
+ if ( ConfigQuickUploadAbsolutePath.Item( resourceType ) <> "" ) then
+ GetResourceTypeDirectory = ConfigQuickUploadAbsolutePath.Item( resourceType )
+ else
+ ' Map the "UserFiles" path to a local directory.
+ GetResourceTypeDirectory = Server.MapPath( ConfigQuickUploadPath.Item( resourceType ) )
+ end if
+ else
+ if ( ConfigFileTypesAbsolutePath.Item( resourceType ) <> "" ) then
+ GetResourceTypeDirectory = ConfigFileTypesAbsolutePath.Item( resourceType )
+ else
+ ' Map the "UserFiles" path to a local directory.
+ GetResourceTypeDirectory = Server.MapPath( ConfigFileTypesPath.Item( resourceType ) )
+ end if
+ end if
+end Function
+
+Function GetUrlFromPath( resourceType, folderPath, sCommand )
+ GetUrlFromPath = CombinePaths( GetResourceTypePath( resourceType, sCommand ), folderPath )
+End Function
+
+Function RemoveExtension( fileName )
+ RemoveExtension = Left( fileName, InStrRev( fileName, "." ) - 1 )
+End Function
+
+Function ServerMapFolder( resourceType, folderPath, sCommand )
+ Dim sResourceTypePath
+ ' Get the resource type directory.
+ sResourceTypePath = GetResourceTypeDirectory( resourceType, sCommand )
+
+ ' Ensure that the directory exists.
+ CreateServerFolder sResourceTypePath
+
+ ' Return the resource type directory combined with the required path.
+ ServerMapFolder = CombineLocalPaths( sResourceTypePath, folderPath )
+End Function
+
+Sub CreateServerFolder( folderPath )
+ Dim oFSO
+ Set oFSO = Server.CreateObject( "Scripting.FileSystemObject" )
+
+ Dim sParent
+ sParent = oFSO.GetParentFolderName( folderPath )
+
+ ' If folderPath is a network path (\\server\folder\) then sParent is an empty string.
+ ' Get out.
+ if (sParent = "") then exit sub
+
+ ' Check if the parent exists, or create it.
+ If ( NOT oFSO.FolderExists( sParent ) ) Then CreateServerFolder( sParent )
+
+ If ( oFSO.FolderExists( folderPath ) = False ) Then
+ On Error resume next
+ oFSO.CreateFolder( folderPath )
+
+ if err.number<>0 then
+ dim sErrorNumber
+ Dim iErrNumber, sErrDescription
+ iErrNumber = err.number
+ sErrDescription = err.Description
+
+ On Error Goto 0
+
+ Select Case iErrNumber
+ Case 52
+ sErrorNumber = "102" ' Invalid Folder Name.
+ Case 70
+ sErrorNumber = "103" ' Security Error.
+ Case 76
+ sErrorNumber = "102" ' Path too long.
+ Case Else
+ sErrorNumber = "110"
+ End Select
+
+ SendError sErrorNumber, "CreateServerFolder(" & folderPath & ") : " & sErrDescription
+ end if
+
+ End If
+
+ Set oFSO = Nothing
+End Sub
+
+Function IsAllowedExt( extension, resourceType )
+ Dim oRE
+ Set oRE = New RegExp
+ oRE.IgnoreCase = True
+ oRE.Global = True
+
+ Dim sAllowed, sDenied
+ sAllowed = ConfigAllowedExtensions.Item( resourceType )
+ sDenied = ConfigDeniedExtensions.Item( resourceType )
+
+ IsAllowedExt = True
+
+ If sDenied <> "" Then
+ oRE.Pattern = sDenied
+ IsAllowedExt = Not oRE.Test( extension )
+ End If
+
+ If IsAllowedExt And sAllowed <> "" Then
+ oRE.Pattern = sAllowed
+ IsAllowedExt = oRE.Test( extension )
+ End If
+
+ Set oRE = Nothing
+End Function
+
+Function IsAllowedType( resourceType )
+ Dim oRE
+ Set oRE = New RegExp
+ oRE.IgnoreCase = True
+ oRE.Global = True
+ oRE.Pattern = "^(" & ConfigAllowedTypes & ")$"
+
+ IsAllowedType = oRE.Test( resourceType )
+
+ Set oRE = Nothing
+End Function
+
+Function IsAllowedCommand( sCommand )
+ Dim oRE
+ Set oRE = New RegExp
+ oRE.IgnoreCase = True
+ oRE.Global = True
+ oRE.Pattern = "^(" & ConfigAllowedCommands & ")$"
+
+ IsAllowedCommand = oRE.Test( sCommand )
+
+ Set oRE = Nothing
+End Function
+
+function GetCurrentFolder()
+ dim sCurrentFolder
+ sCurrentFolder = Request.QueryString("CurrentFolder")
+ If ( sCurrentFolder = "" ) Then sCurrentFolder = "/"
+
+ ' Check the current folder syntax (must begin and start with a slash).
+ If ( Right( sCurrentFolder, 1 ) <> "/" ) Then sCurrentFolder = sCurrentFolder & "/"
+ If ( Left( sCurrentFolder, 1 ) <> "/" ) Then sCurrentFolder = "/" & sCurrentFolder
+
+ ' Check for invalid folder paths (..)
+ If ( InStr( 1, sCurrentFolder, ".." ) <> 0 OR InStr( 1, sCurrentFolder, "\" ) <> 0) Then
+ SendError 102, ""
+ End If
+
+ GetCurrentFolder = sCurrentFolder
+end function
+
+' Do a cleanup of the folder name to avoid possible problems
+function SanitizeFolderName( sNewFolderName )
+ Dim oRegex
+ Set oRegex = New RegExp
+ oRegex.Global = True
+
+' remove . \ / | : ? * " < > and control characters
+ oRegex.Pattern = "(\.|\\|\/|\||:|\?|\*|""|\<|\>|[\u0000-\u001F]|\u007F)"
+ SanitizeFolderName = oRegex.Replace( sNewFolderName, "_" )
+
+ Set oRegex = Nothing
+end function
+
+' Do a cleanup of the file name to avoid possible problems
+function SanitizeFileName( sNewFileName )
+ Dim oRegex
+ Set oRegex = New RegExp
+ oRegex.Global = True
+
+ if ( ConfigForceSingleExtension = True ) then
+ oRegex.Pattern = "\.(?![^.]*$)"
+ sNewFileName = oRegex.Replace( sNewFileName, "_" )
+ end if
+
+' remove \ / | : ? * " < > and control characters
+ oRegex.Pattern = "(\\|\/|\||:|\?|\*|""|\<|\>|[\u0000-\u001F]|\u007F)"
+ SanitizeFileName = oRegex.Replace( sNewFileName, "_" )
+
+ Set oRegex = Nothing
+end function
+
+' This is the function that sends the results of the uploading process.
+Sub SendUploadResults( errorNumber, fileUrl, fileName, customMsg )
+ Response.Clear
+ Response.Write "<script type=""text/javascript"">"
+ ' Minified version of the document.domain automatic fix script (#1919).
+ ' The original script can be found at _dev/domain_fix_template.js
+ Response.Write "(function(){var d=document.domain;while (true){try{var A=window.parent.document.domain;break;}catch(e) {};d=d.replace(/.*?(?:\.|$)/,'');if (d.length==0) break;try{document.domain=d;}catch (e){break;}}})();"
+
+ Response.Write "window.parent.OnUploadCompleted(" & errorNumber & ",""" & Replace( fileUrl, """", "\""" ) & """,""" & Replace( fileName, """", "\""" ) & """,""" & Replace( customMsg , """", "\""" ) & """) ;"
+ Response.Write "</script>"
+ Response.End
+End Sub
+
+%>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/upload.asp
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/upload.asp Thu Aug 28 18:47:59 2008
@@ -0,0 +1,65 @@
+<%@ CodePage=65001 Language="VBScript"%>
+<%
+Option Explicit
+Response.Buffer = True
+%>
+<%
+ ' FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ ' Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ '
+ ' == BEGIN LICENSE ==
+ '
+ ' Licensed under the terms of any of the following licenses at your
+ ' choice:
+ '
+ ' - GNU General Public License Version 2 or later (the "GPL")
+ ' http://www.gnu.org/licenses/gpl.html
+ '
+ ' - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ ' http://www.gnu.org/licenses/lgpl.html
+ '
+ ' - Mozilla Public License Version 1.1 or later (the "MPL")
+ ' http://www.mozilla.org/MPL/MPL-1.1.html
+ '
+ ' == END LICENSE ==
+ '
+ ' This is the "File Uploader" for ASP.
+%>
+<!--#include file="config.asp"-->
+<!--#include file="util.asp"-->
+<!--#include file="io.asp"-->
+<!--#include file="commands.asp"-->
+<!--#include file="class_upload.asp"-->
+<%
+
+Sub SendError( number, text )
+ SendUploadResults number, "", "", text
+End Sub
+
+' Check if this uploader has been enabled.
+If ( ConfigIsEnabled = False ) Then
+ SendUploadResults "1", "", "", "This file uploader is disabled. Please check the ""editor/filemanager/connectors/asp/config.asp"" file"
+End If
+
+ Dim sCommand, sResourceType, sCurrentFolder
+
+ sCommand = "QuickUpload"
+
+ sResourceType = Request.QueryString("Type")
+ If ( sResourceType = "" ) Then sResourceType = "File"
+
+ sCurrentFolder = GetCurrentFolder()
+
+ ' Is Upload enabled?
+ if ( Not IsAllowedCommand( sCommand ) ) then
+ SendUploadResults "1", "", "", "The """ & sCommand & """ command isn't allowed"
+ end if
+
+ ' Check if it is an allowed resource type.
+ if ( Not IsAllowedType( sResourceType ) ) Then
+ SendUploadResults "1", "", "", "The " & sResourceType & " resource type isn't allowed"
+ end if
+
+ FileUpload sResourceType, sCurrentFolder, sCommand
+
+%>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/util.asp
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/asp/util.asp Thu Aug 28 18:47:59 2008
@@ -0,0 +1,55 @@
+<%
+ ' FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ ' Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ '
+ ' == BEGIN LICENSE ==
+ '
+ ' Licensed under the terms of any of the following licenses at your
+ ' choice:
+ '
+ ' - GNU General Public License Version 2 or later (the "GPL")
+ ' http://www.gnu.org/licenses/gpl.html
+ '
+ ' - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ ' http://www.gnu.org/licenses/lgpl.html
+ '
+ ' - Mozilla Public License Version 1.1 or later (the "MPL")
+ ' http://www.mozilla.org/MPL/MPL-1.1.html
+ '
+ ' == END LICENSE ==
+ '
+ ' This file include generic functions used by the ASP Connector.
+%>
+<%
+Function RemoveFromStart( sourceString, charToRemove )
+ Dim oRegex
+ Set oRegex = New RegExp
+ oRegex.Pattern = "^" & charToRemove & "+"
+
+ RemoveFromStart = oRegex.Replace( sourceString, "" )
+End Function
+
+Function RemoveFromEnd( sourceString, charToRemove )
+ Dim oRegex
+ Set oRegex = New RegExp
+ oRegex.Pattern = charToRemove & "+$"
+
+ RemoveFromEnd = oRegex.Replace( sourceString, "" )
+End Function
+
+Function ConvertToXmlAttribute( value )
+ ConvertToXmlAttribute = Replace( value, "&", "&" )
+End Function
+
+Function InArray( value, sourceArray )
+ Dim i
+ For i = 0 to UBound( sourceArray )
+ If sourceArray(i) = value Then
+ InArray = True
+ Exit Function
+ End If
+ Next
+ InArray = False
+End Function
+
+%>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/aspx/config.ascx
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/aspx/config.ascx Thu Aug 28 18:47:59 2008
@@ -0,0 +1,98 @@
+<%@ Control Language="C#" EnableViewState="false" AutoEventWireup="false" Inherits="FredCK.FCKeditorV2.FileBrowser.Config" %>
+<%--
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Configuration file for the File Browser Connector for ASP.NET.
+--%>
+<script runat="server">
+
+ /**
+ * This function must check the user session to be sure that he/she is
+ * authorized to upload and access files in the File Browser.
+ */
+ private bool CheckAuthentication()
+ {
+ // WARNING : DO NOT simply return "true". By doing so, you are allowing
+ // "anyone" to upload and list the files in your server. You must implement
+ // some kind of session validation here. Even something very simple as...
+ //
+ // return ( Session[ "IsAuthorized" ] != null && (bool)Session[ "IsAuthorized" ] == true );
+ //
+ // ... where Session[ "IsAuthorized" ] is set to "true" as soon as the
+ // user logs in your system.
+
+ return false;
+ }
+
+ public override void SetConfig()
+ {
+ // SECURITY: You must explicitly enable this "connector". (Set it to "true").
+ Enabled = CheckAuthentication();
+
+ // URL path to user files.
+ UserFilesPath = "/userfiles/";
+
+ // The connector tries to resolve the above UserFilesPath automatically.
+ // Use the following setting it you prefer to explicitely specify the
+ // absolute path. Examples: 'C:\\MySite\\userfiles\\' or '/root/mysite/userfiles/'.
+ // Attention: The above 'UserFilesPath' URL must point to the same directory.
+ UserFilesAbsolutePath = "";
+
+ // Due to security issues with Apache modules, it is recommended to leave the
+ // following setting enabled.
+ ForceSingleExtension = true;
+
+ // Allowed Resource Types
+ AllowedTypes = new string[] { "File", "Image", "Flash", "Media" };
+
+ // For security, HTML is allowed in the first Kb of data for files having the
+ // following extensions only.
+ HtmlExtensions = new string[] { "html", "htm", "xml", "xsd", "txt", "js" };
+
+ TypeConfig[ "File" ].AllowedExtensions = new string[] { "7z", "aiff", "asf", "avi", "bmp", "csv", "doc", "fla", "flv", "gif", "gz", "gzip", "jpeg", "jpg", "mid", "mov", "mp3", "mp4", "mpc", "mpeg", "mpg", "ods", "odt", "pdf", "png", "ppt", "pxd", "qt", "ram", "rar", "rm", "rmi", "rmvb", "rtf", "sdc", "sitd", "swf", "sxc", "sxw", "tar", "tgz", "tif", "tiff", "txt", "vsd", "wav", "wma", "wmv", "xls", "xml", "zip" };
+ TypeConfig[ "File" ].DeniedExtensions = new string[] { };
+ TypeConfig[ "File" ].FilesPath = "%UserFilesPath%file/";
+ TypeConfig[ "File" ].FilesAbsolutePath = ( UserFilesAbsolutePath == "" ? "" : "%UserFilesAbsolutePath%file/" );
+ TypeConfig[ "File" ].QuickUploadPath = "%UserFilesPath%";
+ TypeConfig[ "File" ].QuickUploadAbsolutePath = ( UserFilesAbsolutePath == "" ? "" : "%UserFilesAbsolutePath%" );
+
+ TypeConfig[ "Image" ].AllowedExtensions = new string[] { "bmp", "gif", "jpeg", "jpg", "png" };
+ TypeConfig[ "Image" ].DeniedExtensions = new string[] { };
+ TypeConfig[ "Image" ].FilesPath = "%UserFilesPath%image/";
+ TypeConfig[ "Image" ].FilesAbsolutePath = ( UserFilesAbsolutePath == "" ? "" : "%UserFilesAbsolutePath%image/" );
+ TypeConfig[ "Image" ].QuickUploadPath = "%UserFilesPath%";
+ TypeConfig[ "Image" ].QuickUploadAbsolutePath = ( UserFilesAbsolutePath == "" ? "" : "%UserFilesAbsolutePath%" );
+
+ TypeConfig[ "Flash" ].AllowedExtensions = new string[] { "swf", "flv" };
+ TypeConfig[ "Flash" ].DeniedExtensions = new string[] { };
+ TypeConfig[ "Flash" ].FilesPath = "%UserFilesPath%flash/";
+ TypeConfig[ "Flash" ].FilesAbsolutePath = ( UserFilesAbsolutePath == "" ? "" : "%UserFilesAbsolutePath%flash/" );
+ TypeConfig[ "Flash" ].QuickUploadPath = "%UserFilesPath%";
+ TypeConfig[ "Flash" ].QuickUploadAbsolutePath = ( UserFilesAbsolutePath == "" ? "" : "%UserFilesAbsolutePath%" );
+
+ TypeConfig[ "Media" ].AllowedExtensions = new string[] { "aiff", "asf", "avi", "bmp", "fla", "flv", "gif", "jpeg", "jpg", "mid", "mov", "mp3", "mp4", "mpc", "mpeg", "mpg", "png", "qt", "ram", "rm", "rmi", "rmvb", "swf", "tif", "tiff", "wav", "wma", "wmv" };
+ TypeConfig[ "Media" ].DeniedExtensions = new string[] { };
+ TypeConfig[ "Media" ].FilesPath = "%UserFilesPath%media/";
+ TypeConfig[ "Media" ].FilesAbsolutePath = ( UserFilesAbsolutePath == "" ? "" : "%UserFilesAbsolutePath%media/" );
+ TypeConfig[ "Media" ].QuickUploadPath = "%UserFilesPath%";
+ TypeConfig[ "Media" ].QuickUploadAbsolutePath = ( UserFilesAbsolutePath == "" ? "" : "%UserFilesAbsolutePath%" );
+ }
+
+</script>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/aspx/connector.aspx
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/aspx/connector.aspx Thu Aug 28 18:47:59 2008
@@ -0,0 +1,32 @@
+<%@ Page Language="c#" Trace="false" Inherits="FredCK.FCKeditorV2.FileBrowser.Connector" AutoEventWireup="false" %>
+<%@ Register Src="config.ascx" TagName="Config" TagPrefix="FCKeditor" %>
+<%--
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This is the File Browser Connector for ASP.NET.
+ *
+ * The code of this page if included in the FCKeditor.Net package,
+ * in the FredCK.FCKeditorV2.dll assembly file. So to use it you must
+ * include that DLL in your "bin" directory.
+ *
+ * To download the FCKeditor.Net package, go to our official web site:
+ * http://www.fckeditor.net
+--%>
+<FCKeditor:Config id="Config" runat="server"></FCKeditor:Config>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/aspx/upload.aspx
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/aspx/upload.aspx Thu Aug 28 18:47:59 2008
@@ -0,0 +1,32 @@
+<%@ Page Language="c#" Trace="false" Inherits="FredCK.FCKeditorV2.FileBrowser.Uploader" AutoEventWireup="false" %>
+<%@ Register Src="config.ascx" TagName="Config" TagPrefix="FCKeditor" %>
+<%--
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This is the Uploader for ASP.NET.
+ *
+ * The code of this page if included in the FCKeditor.Net package,
+ * in the FredCK.FCKeditorV2.dll assemblyfile. So to use it you must
+ * include that DLL in your "bin" directory.
+ *
+ * To download the FCKeditor.Net package, go to our official web site:
+ * http://www.fckeditor.net
+--%>
+<FCKeditor:Config id="Config" runat="server"></FCKeditor:Config>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/ImageObject.cfc
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/ImageObject.cfc Thu Aug 28 18:47:59 2008
@@ -0,0 +1,273 @@
+<cfcomponent name="ImageObject">
+<!---
+ ImageObject.cfc written by Rick Root (rick at webworksllc.com)
+
+ Related Web Sites:
+ - http://www.opensourcecf.com/imagecfc (home page)
+
+
+ This is an object oriented interface to the original
+ ImageCFC.
+
+ Example Code:
+
+ io = createObject("component","ImageObject");
+ io.setOption("defaultJpegCompression",95);
+ io.init("#ExpandPath(".")#/emily.jpg");
+ io.scaleWidth(500);
+ io.save("#ExpandPath(".")#/imagex1.jpg");
+
+ io.flipHorizontal();
+ io.save("#ExpandPath(".")#/imagex2.jpg");
+ io.revert();
+ io.filterFastBlur(2,5);
+ io.save("#ExpandPath(".")#/imagex3.jpg");
+ io.revert();
+ io.filterPosterize(32);
+ io.save("#ExpandPath(".")#/imagex4.jpg");
+
+
+ LICENSE
+ -------
+ Copyright (c) 2006, Rick Root <rick at webworksllc.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, are permitted provided that the
+ following conditions are met:
+
+ - Redistributions of source code must retain the above
+ copyright notice, this list of conditions and the
+ following disclaimer.
+ - Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the
+ following disclaimer in the documentation and/or other
+ materials provided with the distribution.
+ - Neither the name of the Webworks, LLC. nor the names of
+ its contributors may be used to endorse or promote products
+ derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+--->
+
+<cfset variables.img = "">
+<cfset variables.revertimg = "">
+<cfset variables.imageCFC = createObject("component","image")>
+<cfset variables.imageInfo = structNew()>
+ <cfset variables.imageInfo.width = 0>
+ <cfset variables.imageInfo.height = 0>
+ <cfset variables.imageInfo.colorModel = "">
+ <cfset variables.imageInfo.colorspace = "">
+ <cfset variables.imageInfo.objColorModel = "">
+ <cfset variables.imageInfo.objColorspace = "">
+ <cfset variables.imageInfo.sampleModel = "">
+ <cfset variables.imageInfo.imageType = 0>
+ <cfset variables.imageInfo.misc = "">
+ <cfset variables.imageInfo.canModify = false>
+<cfset variables.imageCFC.setOption("throwonerror",true)>
+
+<!---
+
+ init(filename) Initialize object from a file.
+ init(width, height) Initialize with a blank image
+ init(bufferedImage) Initiailize with an existing object
+--->
+<cffunction name="init" access="public" output="false" returnType="void">
+ <cfargument name="arg1" type="any" required="yes">
+ <cfargument name="arg2" type="any" required="no">
+
+ <cfif isDefined("arg2") and isNumeric(arg1) and isNumeric(arg2)>
+ <cfset arg1 = javacast("int",int(arg1))>
+ <cfset arg2 = javacast("int",int(arg2))>
+ <cfset variables.img = createObject("java","java.awt.image.BufferedImage")>
+ <cfset variables.img.init(arg1,arg2,variables.img.TYPE_INT_RGB)>
+ <cfelseif arg1.getClass().getName() eq "java.awt.image.BufferedImage">
+ <cfset variables.img = arg1>
+ <cfelseif isSimpleValue(arg1) and len(arg1) gt 0>
+ <cfset imageResults = variables.imageCFC.readImage(arg1, "no")>
+ <cfset variables.img = imageResults.img>
+ <cfelse>
+ <cfthrow message="Object Instantiation Error" detail="You have attempted to initialize ooimage.cfc with invalid arguments. Please consult the documentation for correct initialization arguments.">
+ </cfif>
+ <cfif variables.revertimg eq "">
+ <cfset variables.revertimg = variables.img>
+ </cfif>
+ <cfset variables.imageInfo = imageCFC.getImageInfo(variables.img,"")>
+ <cfreturn>
+</cffunction>
+
+<cffunction name="flipHorizontal" access="public" output="true" returnType="void" hint="Flip an image horizontally.">
+ <cfset var imageResults = imageCFC.flipHorizontal(variables.img,"","")>
+ <cfset variables.revertimg = variables.img>
+ <cfset variables.img = imageResults.img>
+ <cfset variables.imageInfo = imageCFC.getImageInfo(variables.img,"")>
+</cffunction>
+
+<cffunction name="getImageInfo" access="public" output="true" returntype="struct" hint="Returns image information.">
+ <cfreturn variables.imageInfo>
+</cffunction>
+<cffunction name="getImageObject" access="public" output="true" returntype="struct" hint="Returns a java Buffered Image Object.">
+ <cfreturn variables.img>
+</cffunction>
+
+<cffunction name="flipVertical" access="public" output="true" returntype="void" hint="Flop an image vertically.">
+ <cfset var imageResults = imageCFC.flipVertical(variables.img,"","")>
+ <cfset variables.revertimg = variables.img>
+ <cfset variables.img = imageResults.img>
+ <cfset variables.imageInfo = imageCFC.getImageInfo(variables.img,"")>
+</cffunction>
+
+<cffunction name="scaleWidth" access="public" output="true" returntype="void" hint="Scale an image to a specific width.">
+ <cfargument name="newWidth" required="yes" type="numeric">
+ <cfset var imageResults = imageCFC.scaleWidth(variables.img,"","", newWidth)>
+ <cfset variables.revertimg = variables.img>
+ <cfset variables.img = imageResults.img>
+ <cfset variables.imageInfo = imageCFC.getImageInfo(variables.img,"")>
+
+</cffunction>
+
+<cffunction name="scaleHeight" access="public" output="true" returntype="void" hint="Scale an image to a specific height.">
+ <cfargument name="newHeight" required="yes" type="numeric">
+ <cfset var imageResults = imageCFC.scaleHeight(variables.img,"","", newHeight)>
+ <cfset variables.revertimg = variables.img>
+ <cfset variables.img = imageResults.img>
+ <cfset variables.imageInfo = imageCFC.getImageInfo(variables.img,"")>
+</cffunction>
+
+<cffunction name="resize" access="public" output="true" returntype="void" hint="Resize an image to a specific width and height.">
+ <cfargument name="newWidth" required="yes" type="numeric">
+ <cfargument name="newHeight" required="yes" type="numeric">
+ <cfargument name="preserveAspect" required="no" type="boolean" default="FALSE">
+ <cfargument name="cropToExact" required="no" type="boolean" default="FALSE">
+
+ <cfset var imageResults = imageCFC.resize(variables.img,"","",newWidth,newHeight,preserveAspect,cropToExact)>
+ <cfset variables.revertimg = variables.img>
+ <cfset variables.img = imageResults.img>
+ <cfset variables.imageInfo = imageCFC.getImageInfo(variables.img,"")>
+</cffunction>
+
+<cffunction name="crop" access="public" output="true" returntype="void" hint="Crop an image.">
+ <cfargument name="fromX" required="yes" type="numeric">
+ <cfargument name="fromY" required="yes" type="numeric">
+ <cfargument name="newWidth" required="yes" type="numeric">
+ <cfargument name="newHeight" required="yes" type="numeric">
+ <cfset var imageResults = imageCFC.crop(variables.img,"","",fromX,fromY,newWidth,newHeight)>
+ <cfset variables.revertimg = variables.img>
+ <cfset variables.img = imageResults.img>
+ <cfset variables.imageInfo = imageCFC.getImageInfo(variables.img,"")>
+
+</cffunction>
+
+<cffunction name="rotate" access="public" output="true" returntype="void" hint="Rotate an image (+/-)90, (+/-)180, or (+/-)270 degrees.">
+ <cfargument name="degrees" required="yes" type="numeric">
+ <cfset var imageResults = imageCFC.rotate(variables.img,"","",degrees)>
+ <cfset variables.revertimg = variables.img>
+ <cfset variables.img = imageResults.img>
+ <cfset variables.imageInfo = imageCFC.getImageInfo(variables.img,"")>
+
+</cffunction>
+
+<cffunction name="setOption" access="public" output="true" returnType="void" hint="Sets values for allowed CFC options.">
+ <cfargument name="key" type="string" required="yes">
+ <cfargument name="val" type="string" required="yes">
+ <cfif lcase(trim(key)) eq "throwonerror">
+ <cfthrow message="Option Configuration Error" detail="You cannot set the throwOnError option when using ImageObject.cfc">
+ </cfif>
+ <cfset imageCFC.setOption(key, val)>
+
+</cffunction>
+
+<cffunction name="getOption" access="public" output="true" returnType="any" hint="Returns the current value for the specified CFC option.">
+ <cfargument name="key" type="string" required="yes">
+ <cfreturn imageCFC.getOption(key)>
+</cffunction>
+
+<cffunction name="filterFastBlur" access="public" output="true" returntype="void" hint="Internal method used for flipping and flopping images.">
+ <cfargument name="blurAmount" required="yes" type="numeric">
+ <cfargument name="iterations" required="yes" type="numeric">
+ <cfset var imageResults = imageCFC.filterFastBlur(variables.img,"","",blurAmount,iterations)>
+ <cfset variables.revertimg = variables.img>
+ <cfset variables.img = imageResults.img>
+ <cfset variables.imageInfo = imageCFC.getImageInfo(variables.img,"")>
+
+</cffunction>
+
+<cffunction name="filterSharpen" access="public" output="true" returntype="void" hint="Internal method used for flipping and flopping images.">
+ <cfset var imageResults = imageCFC.filterSharpen(variables.img,"","")>
+ <cfset variables.revertimg = variables.img>
+ <cfset variables.img = imageResults.img>
+ <cfset variables.imageInfo = imageCFC.getImageInfo(variables.img,"")>
+
+</cffunction>
+
+
+<cffunction name="filterPosterize" access="public" output="true" returntype="void" hint="Internal method used for flipping and flopping images.">
+ <cfargument name="amount" required="yes" type="string">
+ <cfset var imageResults = imageCFC.filterPosterize(variables.img,"","",amount)>
+ <cfset variables.revertimg = variables.img>
+ <cfset variables.img = imageResults.img>
+ <cfset variables.imageInfo = imageCFC.getImageInfo(variables.img,"")>
+</cffunction>
+
+
+<cffunction name="addText" access="public" output="true" returntype="void" hint="Add text to an image.">
+ <cfargument name="x" required="yes" type="numeric">
+ <cfargument name="y" required="yes" type="numeric">
+ <cfargument name="fontDetails" required="yes" type="struct">
+ <cfargument name="content" required="yes" type="String">
+ <cfset var imageResults = imageCFC.addText(variables.img,"","",x,y,fontDetails,content)>
+ <cfset variables.revertimg = variables.img>
+ <cfset variables.img = imageResults.img>
+ <cfset variables.imageInfo = imageCFC.getImageInfo(variables.img,"")>
+
+</cffunction>
+
+<cffunction name="watermark" access="public" output="false" returnType="void">
+ <cfargument name="wmImage" required="yes" type="Any">
+ <cfargument name="alpha" required="yes" type="numeric">
+ <cfargument name="placeAtX" required="yes" type="numeric">
+ <cfargument name="placeAtY" required="yes" type="numeric">
+
+ <cfset var imageResults = "">
+ <cfif isSimpleValue(wmImage)>
+ <!--- filename or URL --->
+ <cfset imageResults = imageCFC.watermark(variables.img,"","",wmImage,alpha,placeAtX,placeAtY)>
+ <cfelse>
+ <!--- must be a java object --->
+ <cfset imageResults = imageCFC.watermark(variables.img,wmImage,"","",alpha,placeAtX,placeAtY)>
+ </cfif>
+ <cfset variables.revertimg = variables.img>
+ <cfset variables.img = imageResults.img>
+ <cfset variables.imageInfo = imageCFC.getImageInfo(variables.img,"")>
+
+</cffunction>
+
+<cffunction name="save" access="public" output="false" returnType="void">
+ <cfargument name="filename" type="string" required="no">
+ <cfargument name="jpegCompression" type="numeric" required="no">
+ <cfif isDefined("arguments.jpegCompression") and isNumeric(arguments.jpegCompression)>
+ <cfset imageCFC.writeImage(filename,variables.img,jpegCompression)>
+ <cfelse>
+ <cfset imageCFC.writeImage(filename,variables.img)>
+ </cfif>
+</cffunction>
+
+<cffunction name="revert" access="public" output="true" returntype="void" hint="Undo the previous manipulation.">
+ <cfset variables.img = variables.revertimg>
+ <cfset variables.imageInfo = imageCFC.getImageInfo(variables.img,"")>
+</cffunction>
+
+</cfcomponent>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf5_connector.cfm
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf5_connector.cfm Thu Aug 28 18:47:59 2008
@@ -0,0 +1,315 @@
+<cfsetting enablecfoutputonly="yes" showdebugoutput="no">
+<!---
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * File Browser connector for ColdFusion 5.
+ * (based on the original CF connector by Hendrik Kramer - hk at lwd.de)
+ *
+ * Note:
+ * FCKeditor requires that the connector responds with UTF-8 encoded XML.
+ * As ColdFusion 5 does not fully support UTF-8 encoding, we force ASCII
+ * file and folder names in this connector to allow CF5 send a UTF-8
+ * encoded response - code points under 127 in UTF-8 are stored using a
+ * single byte, using the same encoding as ASCII, which is damn handy.
+ * This is all grand for the English speakers, like meself, but I dunno
+ * how others are gonna take to it. Well, the previous version of this
+ * connector already did this with file names and nobody seemed to mind,
+ * so fingers-crossed nobody will mind their folder names being munged too.
+ *
+--->
+
+<cfparam name="url.command">
+<cfparam name="url.type">
+<cfparam name="url.currentFolder">
+<!--- note: no serverPath url parameter - see config.cfm if you need to set the serverPath manually --->
+
+<cfinclude template="config.cfm">
+
+<cfscript>
+ userFilesPath = config.userFilesPath;
+
+ if ( userFilesPath eq "" )
+ {
+ userFilesPath = "/userfiles/";
+ }
+
+ // make sure the user files path is correctly formatted
+ userFilesPath = replace(userFilesPath, "\", "/", "ALL");
+ userFilesPath = replace(userFilesPath, '//', '/', 'ALL');
+ if ( right(userFilesPath,1) NEQ "/" )
+ {
+ userFilesPath = userFilesPath & "/";
+ }
+ if ( left(userFilesPath,1) NEQ "/" )
+ {
+ userFilesPath = "/" & userFilesPath;
+ }
+
+ // make sure the current folder is correctly formatted
+ url.currentFolder = replace(url.currentFolder, "\", "/", "ALL");
+ url.currentFolder = replace(url.currentFolder, '//', '/', 'ALL');
+ if ( right(url.currentFolder,1) neq "/" )
+ {
+ url.currentFolder = url.currentFolder & "/";
+ }
+ if ( left(url.currentFolder,1) neq "/" )
+ {
+ url.currentFolder = "/" & url.currentFolder;
+ }
+
+ if ( find("/",getBaseTemplatePath()) neq 0 )
+ {
+ fs = "/";
+ }
+ else
+ {
+ fs = "\";
+ }
+
+ // Get the base physical path to the web root for this application. The code to determine the path automatically assumes that
+ // the "FCKeditor" directory in the http request path is directly off the web root for the application and that it's not a
+ // virtual directory or a symbolic link / junction. Use the serverPath config setting to force a physical path if necessary.
+ if ( len(config.serverPath) )
+ {
+ serverPath = config.serverPath;
+
+ if ( right(serverPath,1) neq fs )
+ {
+ serverPath = serverPath & fs;
+ }
+ }
+ else
+ {
+ serverPath = replaceNoCase(getBaseTemplatePath(),replace(cgi.script_name,"/",fs,"all"),"") & replace(userFilesPath,"/",fs,"all");
+ }
+
+ rootPath = left( serverPath, Len(serverPath) - Len(userFilesPath) ) ;
+ xmlContent = ""; // append to this string to build content
+</cfscript>
+
+<cfset resourceTypeUrl = rereplace( replace( Config.FileTypesPath[url.type], fs, "/", "all"), "/$", "") >
+
+<cfif isDefined( "Config.FileTypesAbsolutePath" )
+ and structkeyexists( Config.FileTypesAbsolutePath, url.type )
+ and Len( Config.FileTypesAbsolutePath[url.type] )>
+
+ <cfset userFilesServerPath = Config.FileTypesAbsolutePath[url.type] & url.currentFolder>
+<cfelse>
+ <cftry>
+ <cfset userFilesServerPath = expandpath( resourceTypeUrl ) & url.currentFolder>
+ <!--- Catch: Parameter 1 of function ExpandPath must be a relative path --->
+ <cfcatch type="any">
+ <cfset userFilesServerPath = rootPath & Config.FileTypesPath[url.type] & url.currentFolder>
+ </cfcatch>
+ </cftry>
+</cfif>
+
+<cfset userFilesServerPath = replace( userFilesServerPath, "/", fs, "all" ) >
+<!--- get rid of double directory separators --->
+<cfset userFilesServerPath = replace( userFilesServerPath, fs & fs, fs, "all") >
+
+<cfif not config.enabled>
+
+ <cfset xmlContent = "<Error number=""1"" text=""This connector is disabled. Please check the 'editor/filemanager/connectors/cfm/config.cfm' file"" />">
+
+<cfelseif find("..",url.currentFolder) or find("\",url.currentFolder)>
+
+ <cfset xmlContent = "<Error number=""102"" />">
+
+<cfelseif isDefined("Config.ConfigAllowedCommands") and not ListFind(Config.ConfigAllowedCommands, url.command)>
+
+ <cfset xmlContent = '<Error number="1" text="The "' & url.command & '" command isn''t allowed" />'>
+
+<cfelseif isDefined("Config.ConfigAllowedTypes") and not ListFind(Config.ConfigAllowedTypes, url.type)>
+
+ <cfset xmlContent = '<Error number="1" text="The "' & url.type & '" type isn''t allowed" />'>
+
+</cfif>
+
+<cfset resourceTypeDirectory = left( userFilesServerPath, Len(userFilesServerPath) - Len(url.currentFolder) )>
+
+<cfif not len(xmlContent) and not directoryexists(resourceTypeDirectory)>
+ <!--- create directories in physical path if they don't already exist --->
+ <cfset currentPath = "">
+ <cftry>
+ <cfloop list="#resourceTypeDirectory#" index="name" delimiters="#fs#">
+ <cfif currentPath eq "" and fs eq "\">
+ <!--- Without checking this, we would have in Windows \C:\ --->
+ <cfif not directoryExists(name)>
+ <cfdirectory action="create" directory="#name#" mode="755">
+ </cfif>
+ <cfelse>
+ <cfif not directoryExists(currentPath & fs & name)>
+ <cfdirectory action="create" directory="#currentPath##fs##name#" mode="755">
+ </cfif>
+ </cfif>
+
+ <cfif fs eq "\" and currentPath eq "">
+ <cfset currentPath = name>
+ <cfelse>
+ <cfset currentPath = currentPath & fs & name>
+ </cfif>
+ </cfloop>
+
+ <cfcatch type="any">
+
+ <!--- this should only occur as a result of a permissions problem --->
+ <cfset xmlContent = "<Error number=""103"" />">
+
+ </cfcatch>
+
+ </cftry>
+</cfif>
+
+<cfif not len(xmlContent)>
+
+ <!--- no errors thus far - run command --->
+
+ <!--- we need to know the physical path to the current folder for all commands --->
+ <cfset currentFolderPath = userFilesServerPath>
+
+ <cfswitch expression="#url.command#">
+
+ <cfcase value="FileUpload">
+ <cfset config_included = true >
+ <cfinclude template="cf5_upload.cfm">
+ <cfabort>
+ </cfcase>
+
+
+ <cfcase value="GetFolders">
+
+ <!--- Sort directories first, name ascending --->
+ <cfdirectory
+ action="list"
+ directory="#currentFolderPath#"
+ name="qDir"
+ sort="type,name">
+
+ <cfscript>
+ i=1;
+ folders = "";
+ while( i lte qDir.recordCount ) {
+ if( not compareNoCase( qDir.type[i], "FILE" ))
+ break;
+ if( not listFind(".,..", qDir.name[i]) )
+ folders = folders & '<Folder name="#HTMLEditFormat( qDir.name[i] )#" />';
+ i=i+1;
+ }
+
+ xmlContent = xmlContent & '<Folders>' & folders & '</Folders>';
+ </cfscript>
+
+ </cfcase>
+
+
+ <cfcase value="GetFoldersAndFiles">
+
+ <!--- Sort directories first, name ascending --->
+ <cfdirectory
+ action="list"
+ directory="#currentFolderPath#"
+ name="qDir"
+ sort="type,name">
+
+ <cfscript>
+ i=1;
+ folders = "";
+ files = "";
+ while( i lte qDir.recordCount ) {
+ if( not compareNoCase( qDir.type[i], "DIR" ) and not listFind(".,..", qDir.name[i]) ) {
+ folders = folders & '<Folder name="#HTMLEditFormat(qDir.name[i])#" />';
+ } else if( not compareNoCase( qDir.type[i], "FILE" ) ) {
+ fileSizeKB = round(qDir.size[i] / 1024);
+ files = files & '<File name="#HTMLEditFormat(qDir.name[i])#" size="#IIf( fileSizeKB GT 0, DE( fileSizeKB ), 1)#" />';
+ }
+ i=i+1;
+ }
+
+ xmlContent = xmlContent & '<Folders>' & folders & '</Folders>';
+ xmlContent = xmlContent & '<Files>' & files & '</Files>';
+ </cfscript>
+
+ </cfcase>
+
+
+ <cfcase value="CreateFolder">
+
+ <cfparam name="url.newFolderName" default="">
+
+ <cfscript>
+ newFolderName = url.newFolderName;
+ if( reFind("[^A-Za-z0-9_\-\.]", newFolderName) ) {
+ // Munge folder name same way as we do the filename
+ // This means folder names are always US-ASCII so we don't have to worry about CF5 and UTF-8
+ newFolderName = reReplace(newFolderName, "[^A-Za-z0-9\-\.]", "_", "all");
+ newFolderName = reReplace(newFolderName, "_{2,}", "_", "all");
+ newFolderName = reReplace(newFolderName, "([^_]+)_+$", "\1", "all");
+ newFolderName = reReplace(newFolderName, "$_([^_]+)$", "\1", "all");
+ }
+ </cfscript>
+
+ <cfif not len(newFolderName) or len(newFolderName) gt 255>
+ <cfset errorNumber = 102>
+ <cfelseif directoryExists(currentFolderPath & newFolderName)>
+ <cfset errorNumber = 101>
+ <cfelseif reFind("^\.\.",newFolderName)>
+ <cfset errorNumber = 103>
+ <cfelse>
+ <cfset errorNumber = 0>
+
+ <cftry>
+ <cfdirectory
+ action="create"
+ directory="#currentFolderPath##newFolderName#"
+ mode="755">
+ <cfcatch>
+ <!---
+ un-resolvable error numbers in ColdFusion:
+ * 102 : Invalid folder name.
+ * 103 : You have no permissions to create the folder.
+ --->
+ <cfset errorNumber = 110>
+ </cfcatch>
+ </cftry>
+ </cfif>
+
+ <cfset xmlContent = xmlContent & '<Error number="#errorNumber#" />'>
+
+ </cfcase>
+
+ <cfdefaultcase>
+ <cfthrow type="fckeditor.connector" message="Illegal command: #url.command#">
+ </cfdefaultcase>
+
+ </cfswitch>
+</cfif>
+
+<cfscript>
+ xmlHeader = '<?xml version="1.0" encoding="utf-8" ?><Connector command="#url.command#" resourceType="#url.type#">';
+ xmlHeader = xmlHeader & '<CurrentFolder path="#url.currentFolder#" url="#resourceTypeUrl##url.currentFolder#" />';
+ xmlFooter = '</Connector>';
+</cfscript>
+
+<cfheader name="Expires" value="#GetHttpTimeString(Now())#">
+<cfheader name="Pragma" value="no-cache">
+<cfheader name="Cache-Control" value="no-cache, no-store, must-revalidate">
+<cfcontent reset="true" type="text/xml; charset=UTF-8">
+<cfoutput>#xmlHeader##xmlContent##xmlFooter#</cfoutput>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf5_upload.cfm
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf5_upload.cfm Thu Aug 28 18:47:59 2008
@@ -0,0 +1,299 @@
+<cfsetting enablecfoutputonly="Yes">
+<!---
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This is the "File Uploader" for ColdFusion 5.
+ * Based on connector.cfm by Mark Woods (mark at thickpaddy.com)
+ *
+ * Note:
+ * FCKeditor requires that the connector responds with UTF-8 encoded XML.
+ * As ColdFusion 5 does not fully support UTF-8 encoding, we force ASCII
+ * file and folder names in this connector to allow CF5 send a UTF-8
+ * encoded response - code points under 127 in UTF-8 are stored using a
+ * single byte, using the same encoding as ASCII, which is damn handy.
+ * This is all grand for the English speakers, like meself, but I dunno
+ * how others are gonna take to it. Well, the previous version of this
+ * connector already did this with file names and nobody seemed to mind,
+ * so fingers-crossed nobody will mind their folder names being munged too.
+ *
+--->
+
+<cfparam name="url.command" default="QuickUpload">
+<cfparam name="url.type" default="File">
+<cfparam name="url.currentFolder" default="/">
+
+<cfif not isDefined("config_included")>
+ <cfinclude template="config.cfm">
+</cfif>
+
+<cfscript>
+ function SendUploadResults(errorNumber, fileUrl, fileName, customMsg)
+ {
+ WriteOutput('<script type="text/javascript">');
+ // Minified version of the document.domain automatic fix script (#1919).
+ // The original script can be found at _dev/domain_fix_template.js
+ WriteOutput("(function(){var d=document.domain;while (true){try{var A=window.parent.document.domain;break;}catch(e) {};d=d.replace(/.*?(?:\.|$)/,'');if (d.length==0) break;try{document.domain=d;}catch (e){break;}}})();");
+ WriteOutput('window.parent.OnUploadCompleted(' & errorNumber & ', "' & JSStringFormat(fileUrl) & '", "' & JSStringFormat(fileName) & '", "' & JSStringFormat(customMsg) & '");' );
+ WriteOutput('</script>');
+ }
+</cfscript>
+
+<cfif NOT config.enabled>
+ <cfset SendUploadResults(1, "", "", "This file uploader is disabled. Please check the ""editor/filemanager/connectors/cfm/config.cfm"" file")>
+ <cfabort>
+</cfif>
+
+<cfif isDefined("Config.ConfigAllowedCommands") and not ListFind(Config.ConfigAllowedCommands, url.command)>
+ <cfset SendUploadResults(1, "", "", "The """ & url.command & """ command isn't allowed")>
+ <cfabort>
+</cfif>
+
+<cfif isDefined("Config.ConfigAllowedTypes") and not ListFind(Config.ConfigAllowedTypes, url.type)>
+ <cfset SendUploadResults(1, "", "", "The """ & url.type & """ type isn't allowed")>
+ <cfabort>
+</cfif>
+
+<cfif find( "..", url.currentFolder) or find( "\", url.currentFolder)>
+ <cfset SendUploadResults(102)>
+ <cfabort>
+</cfif>
+
+<cfscript>
+ userFilesPath = config.userFilesPath;
+
+ if ( userFilesPath eq "" ) {
+ userFilesPath = "/userfiles/";
+ }
+
+ // make sure the user files path is correctly formatted
+ userFilesPath = replace(userFilesPath, "\", "/", "ALL");
+ userFilesPath = replace(userFilesPath, '//', '/', 'ALL');
+ if ( right(userFilesPath,1) NEQ "/" ) {
+ userFilesPath = userFilesPath & "/";
+ }
+ if ( left(userFilesPath,1) NEQ "/" ) {
+ userFilesPath = "/" & userFilesPath;
+ }
+
+ // make sure the current folder is correctly formatted
+ url.currentFolder = replace(url.currentFolder, "\", "/", "ALL");
+ url.currentFolder = replace(url.currentFolder, '//', '/', 'ALL');
+ if ( right(url.currentFolder,1) neq "/" ) {
+ url.currentFolder = url.currentFolder & "/";
+ }
+ if ( left(url.currentFolder,1) neq "/" ) {
+ url.currentFolder = "/" & url.currentFolder;
+ }
+
+ if (find("/",getBaseTemplatePath())) {
+ fs = "/";
+ } else {
+ fs = "\";
+ }
+
+ // Get the base physical path to the web root for this application. The code to determine the path automatically assumes that
+ // the "FCKeditor" directory in the http request path is directly off the web root for the application and that it's not a
+ // virtual directory or a symbolic link / junction. Use the serverPath config setting to force a physical path if necessary.
+ if ( len(config.serverPath) ) {
+ serverPath = config.serverPath;
+
+ if ( right(serverPath,1) neq fs ) {
+ serverPath = serverPath & fs;
+ }
+ } else {
+ serverPath = replaceNoCase(getBaseTemplatePath(),replace(cgi.script_name,"/",fs,"all"),"") & replace(userFilesPath,"/",fs,"all");
+ }
+
+ rootPath = left( serverPath, Len(serverPath) - Len(userFilesPath) ) ;
+</cfscript>
+<cfif url.command eq "QuickUpload">
+ <cfset resourceTypeUrl = rereplace( replace( Config.QuickUploadPath[url.type], fs, "/", "all"), "/$", "") >
+ <cfif isDefined( "Config.QuickUploadAbsolutePath" )
+ and structkeyexists( Config.QuickUploadAbsolutePath, url.type )
+ and Len( Config.QuickUploadAbsolutePath[url.type] )>
+ <cfset userFilesServerPath = Config.QuickUploadAbsolutePath[url.type] & url.currentFolder>
+ <cfelse>
+ <cftry>
+ <cfset userFilesServerPath = expandpath( resourceTypeUrl ) & url.currentFolder>
+ <!--- Catch: Parameter 1 of function ExpandPath must be a relative path --->
+ <cfcatch type="any">
+ <cfset userFilesServerPath = rootPath & Config.QuickUploadPath[url.type] & url.currentFolder>
+ </cfcatch>
+ </cftry>
+ </cfif>
+<cfelse>
+ <cfset resourceTypeUrl = rereplace( replace( Config.FileTypesPath[url.type], fs, "/", "all"), "/$", "") >
+ <cfif isDefined( "Config.FileTypesAbsolutePath" )
+ and structkeyexists( Config.FileTypesAbsolutePath, url.type )
+ and Len( Config.FileTypesAbsolutePath[url.type] )>
+ <cfset userFilesServerPath = Config.FileTypesAbsolutePath[url.type] & url.currentFolder>
+ <cfelse>
+ <cftry>
+ <cfset userFilesServerPath = expandpath( resourceTypeUrl ) & url.currentFolder>
+ <!--- Catch: Parameter 1 of function ExpandPath must be a relative path --->
+ <cfcatch type="any">
+ <cfset userFilesServerPath = rootPath & Config.FileTypesPath[url.type] & url.currentFolder>
+ </cfcatch>
+ </cftry>
+ </cfif>
+</cfif>
+
+<cfset userFilesServerPath = replace( userFilesServerPath, "/", fs, "all" ) >
+<!--- get rid of double directory separators --->
+<cfset userFilesServerPath = replace( userFilesServerPath, fs & fs, fs, "all") >
+
+<!--- create resource type directory if not exists --->
+<cfset resourceTypeDirectory = left( userFilesServerPath, Len(userFilesServerPath) - Len(url.currentFolder) )>
+
+<cfif not directoryexists( resourceTypeDirectory )>
+
+ <cfset currentPath = "">
+ <cftry>
+ <cfloop list="#resourceTypeDirectory#" index="name" delimiters="#fs#">
+ <cfif currentPath eq "" and fs eq "\">
+ <!--- Without checking this, we would have in Windows \C:\ --->
+ <cfif not directoryExists(name)>
+ <cfdirectory action="create" directory="#name#" mode="755">
+ </cfif>
+ <cfelse>
+ <cfif not directoryExists(currentPath & fs & name)>
+ <cfdirectory action="create" directory="#currentPath##fs##name#" mode="755">
+ </cfif>
+ </cfif>
+
+ <cfif fs eq "\" and currentPath eq "">
+ <cfset currentPath = name>
+ <cfelse>
+ <cfset currentPath = currentPath & fs & name>
+ </cfif>
+ </cfloop>
+
+ <cfcatch type="any">
+
+ <!--- this should only occur as a result of a permissions problem --->
+ <cfset SendUploadResults(103)>
+ <cfabort>
+
+ </cfcatch>
+
+ </cftry>
+</cfif>
+
+<cfset currentFolderPath = userFilesServerPath>
+<cfset resourceType = url.type>
+
+<cfset fileName = "">
+<cfset fileExt = "">
+
+<!--- Can be overwritten. The last value will be sent with the result --->
+<cfset customMsg = "">
+
+<cftry>
+ <!--- first upload the file with an unique filename --->
+ <cffile action="upload"
+ fileField="NewFile"
+ destination="#currentFolderPath#"
+ nameConflict="makeunique"
+ mode="644"
+ attributes="normal">
+
+ <cfif cffile.fileSize EQ 0>
+ <cfthrow>
+ </cfif>
+
+ <cfset lAllowedExtensions = config.allowedExtensions[#resourceType#]>
+ <cfset lDeniedExtensions = config.deniedExtensions[#resourceType#]>
+
+ <cfif ( len(lAllowedExtensions) and not listFindNoCase(lAllowedExtensions,cffile.ServerFileExt) )
+ or ( len(lDeniedExtensions) and listFindNoCase(lDeniedExtensions,cffile.ServerFileExt) )>
+
+ <cfset errorNumber = "202">
+ <cffile action="delete" file="#cffile.ServerDirectory##fs##cffile.ServerFile#">
+
+ <cfelse>
+
+ <cfscript>
+ errorNumber = 0;
+ fileName = cffile.ClientFileName ;
+ fileExt = cffile.ServerFileExt ;
+ fileExisted = false ;
+
+ // munge filename for html download. Only a-z, 0-9, _, - and . are allowed
+ if( reFind("[^A-Za-z0-9_\-\.]", fileName) ) {
+ fileName = reReplace(fileName, "[^A-Za-z0-9\-\.]", "_", "ALL");
+ fileName = reReplace(fileName, "_{2,}", "_", "ALL");
+ fileName = reReplace(fileName, "([^_]+)_+$", "\1", "ALL");
+ fileName = reReplace(fileName, "$_([^_]+)$", "\1", "ALL");
+ }
+
+ // remove additional dots from file name
+ if( isDefined("Config.ForceSingleExtension") and Config.ForceSingleExtension )
+ fileName = replace( fileName, '.', "_", "all" ) ;
+
+ // When the original filename already exists, add numbers (0), (1), (2), ... at the end of the filename.
+ if( compare( cffile.ServerFileName, fileName ) ) {
+ counter = 0;
+ tmpFileName = fileName;
+ while( fileExists("#currentFolderPath##fileName#.#fileExt#") ) {
+ fileExisted = true ;
+ counter = counter + 1 ;
+ fileName = tmpFileName & '(#counter#)' ;
+ }
+ }
+ </cfscript>
+
+ <!--- Rename the uploaded file, if neccessary --->
+ <cfif compare(cffile.ServerFileName,fileName)>
+
+ <cfif fileExisted>
+ <cfset errorNumber = "201">
+ </cfif>
+ <cffile
+ action="rename"
+ source="#currentFolderPath##cffile.ServerFileName#.#cffile.ServerFileExt#"
+ destination="#currentFolderPath##fileName#.#fileExt#"
+ mode="644"
+ attributes="normal">
+
+ </cfif>
+
+ </cfif>
+
+ <cfcatch type="any">
+
+ <cfset errorNumber = "1">
+ <cfset customMsg = cfcatch.message >
+
+ </cfcatch>
+</cftry>
+
+<cfif errorNumber EQ 0>
+ <!--- file was uploaded succesfully --->
+ <cfset SendUploadResults(errorNumber, '#resourceTypeUrl##url.currentFolder##fileName#.#fileExt#', "", "")>
+ <cfabort>
+<cfelseif errorNumber EQ 201>
+ <!--- file was changed (201), submit the new filename --->
+ <cfset SendUploadResults(errorNumber, '#resourceTypeUrl##url.currentFolder##fileName#.#fileExt#', replace( fileName & "." & fileExt, "'", "\'", "ALL"), customMsg)>
+ <cfabort>
+<cfelse>
+ <!--- An error occured(202). Submit only the error code and a message (if available). --->
+ <cfset SendUploadResults(errorNumber, '', '', customMsg)>
+ <cfabort>
+</cfif>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf_basexml.cfm
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf_basexml.cfm Thu Aug 28 18:47:59 2008
@@ -0,0 +1,68 @@
+<cfsetting enablecfoutputonly="Yes">
+<!---
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This file include the functions that create the base XML output by the ColdFusion Connector (MX 6.0 and above).
+--->
+
+<cffunction name="SetXmlHeaders" returntype="void">
+ <cfheader name="Expires" value="#GetHttpTimeString(Now())#">
+ <cfheader name="Pragma" value="no-cache">
+ <cfheader name="Cache-Control" value="no-cache, no-store, must-revalidate">
+ <cfcontent reset="true" type="text/xml; charset=UTF-8">
+</cffunction>
+
+<cffunction name="CreateXmlHeader" returntype="void" output="true">
+ <cfargument name="command" required="true">
+ <cfargument name="resourceType" required="true">
+ <cfargument name="currentFolder" required="true">
+
+ <cfset SetXmlHeaders()>
+ <cfoutput><?xml version="1.0" encoding="utf-8" ?></cfoutput>
+ <cfoutput><Connector command="#ARGUMENTS.command#" resourceType="#ARGUMENTS.resourceType#"></cfoutput>
+ <cfoutput><CurrentFolder path="#HTMLEditFormat(ARGUMENTS.currentFolder)#" url="#HTMLEditFormat( GetUrlFromPath( resourceType, currentFolder, command ) )#" /></cfoutput>
+ <cfset REQUEST.HeaderSent = true>
+</cffunction>
+
+<cffunction name="CreateXmlFooter" returntype="void" output="true">
+ <cfoutput></Connector></cfoutput>
+</cffunction>
+
+<cffunction name="SendError" returntype="void" output="true">
+ <cfargument name="number" required="true" type="Numeric">
+ <cfargument name="text" required="true">
+ <cfif isDefined("REQUEST.HeaderSent") and REQUEST.HeaderSent>
+ <cfset SendErrorNode( ARGUMENTS.number, ARGUMENTS.text )>
+ <cfset CreateXmlFooter() >
+ <cfelse>
+ <cfset SetXmlHeaders()>
+ <cfoutput><?xml version="1.0" encoding="utf-8" ?></cfoutput>
+ <cfoutput><Connector></cfoutput>
+ <cfset SendErrorNode( ARGUMENTS.number, ARGUMENTS.text )>
+ <cfset CreateXmlFooter() >
+ </cfif>
+ <cfabort>
+</cffunction>
+
+<cffunction name="SendErrorNode" returntype="void" output="true">
+ <cfargument name="number" required="true" type="Numeric">
+ <cfargument name="text" required="true">
+ <cfoutput><Error number="#ARGUMENTS.number#" text="#htmleditformat(ARGUMENTS.text)#" /></cfoutput>
+</cffunction>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf_commands.cfm
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf_commands.cfm Thu Aug 28 18:47:59 2008
@@ -0,0 +1,230 @@
+<cfsetting enablecfoutputonly="Yes">
+<!---
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This file include the functions that handle the Command requests
+ * in the ColdFusion Connector (MX 6.0 and above).
+--->
+
+<cffunction name="FileUpload" returntype="void" output="true">
+ <cfargument name="resourceType" type="string" required="yes" default="">
+ <cfargument name="currentFolder" type="string" required="yes" default="">
+ <cfargument name="sCommand" type="string" required="yes" default="">
+
+ <cfset var sFileName = "">
+ <cfset var sFilePart = "">
+ <cfset var sFileExt = "">
+ <cfset var sFileUrl = "">
+ <cfset var sTempDir = "">
+ <cfset var sTempFilePath = "">
+ <cfset var errorNumber = 0>
+ <cfset var customMsg = 0>
+ <cfset var counter = 0>
+ <cfset var destination = "">
+
+ <cftry>
+ <cfif isDefined( "REQUEST.Config.TempDirectory" )>
+ <cfset sTempDir = REQUEST.Config.TempDirectory>
+ <cfelse>
+ <cfset sTempDir = GetTempDirectory()>
+ </cfif>
+ <cfif NOT DirectoryExists (sTempDir)>
+ <cfthrow message="Invalid temporary directory: #sTempDir#">
+ </cfif>
+
+ <cffile action="UPLOAD" filefield="NewFile" destination="#sTempDir#" nameconflict="makeunique" mode="0755" />
+ <cfset sTempFilePath = CFFILE.ServerDirectory & REQUEST.fs & CFFILE.ServerFile>
+
+ <!--- Map the virtual path to the local server path. --->
+ <cfset sServerDir = ServerMapFolder( ARGUMENTS.resourceType, ARGUMENTS.currentFolder, ARGUMENTS.sCommand) >
+ <!--- Get the uploaded file name. --->
+ <cfset sFileName = SanitizeFileName( CFFILE.ClientFile ) >
+ <cfset sOriginalFileName = sFileName >
+
+ <cfif isDefined( "REQUEST.Config.SecureImageUploads" ) and REQUEST.Config.SecureImageUploads>
+ <cfif not IsImageValid( sTempFilePath, CFFILE.ClientFileExt )>
+ <cftry>
+ <cffile action="delete" file="#sTempFilePath#">
+ <cfcatch type="any">
+ </cfcatch>
+ </cftry>
+ <cfthrow errorcode="202" type="fckeditor">
+ </cfif>
+ </cfif>
+
+ <cfif isDefined( "REQUEST.Config.HtmlExtensions" ) and not listFindNoCase( REQUEST.Config.HtmlExtensions, CFFILE.ClientFileExt )>
+ <cfif DetectHtml( sTempFilePath )>
+ <cftry>
+ <cffile action="delete" file="#sTempFilePath#">
+ <cfcatch type="any">
+ </cfcatch>
+ </cftry>
+ <cfthrow errorcode="202" type="fckeditor">
+ </cfif>
+ </cfif>
+
+ <cfif not IsAllowedExt( CFFILE.ClientFileExt, ARGUMENTS.resourceType )>
+ <cftry>
+ <cffile action="delete" file="#sTempFilePath#">
+ <cfcatch type="any">
+ </cfcatch>
+ </cftry>
+ <cfthrow errorcode="202" type="fckeditor">
+ </cfif>
+
+ <!--- When the original filename already exists, add numbers (0), (1), (2), ... at the end of the filename. --->
+ <cfscript>
+ sFileExt = GetExtension( sFileName ) ;
+ sFilePart = RemoveExtension( sFileName );
+ while( fileExists( sServerDir & sFileName ) )
+ {
+ counter = counter + 1;
+ sFileName = sFilePart & '(#counter#).' & CFFILE.ClientFileExt;
+ errorNumber = 201;
+ }
+ </cfscript>
+
+ <cfset destination = sServerDir & sFileName>
+
+ <cflock name="#destination#" timeout="30" type="Exclusive">
+ <cftry>
+ <cffile action="move" source="#sTempFilePath#" destination="#destination#" mode="755">
+ <!--- omit CF 6.1 error during moving uploaded file, just copy that file instead of moving --->
+ <cfcatch type="any">
+ <cffile action="copy" source="#sTempFilePath#" destination="#destination#" mode="755">
+ </cfcatch>
+ </cftry>
+ </cflock>
+
+ <cfset sFileUrl = CombinePaths( GetResourceTypePath( ARGUMENTS.resourceType, sCommand ) , ARGUMENTS.currentFolder ) >
+ <cfset sFileUrl = CombinePaths( sFileUrl , sFileName ) >
+
+ <cfcatch type="fckeditor">
+ <cfset errorNumber = CFCATCH.ErrorCode>
+ </cfcatch>
+
+ <cfcatch type="any">
+ <cfset errorNumber = "1">
+ <cfset customMsg = CFCATCH.Message >
+ </cfcatch>
+
+ </cftry>
+
+ <cfset SendUploadResults( errorNumber, sFileUrl, sFileName, customMsg ) >
+</cffunction>
+
+<cffunction name="GetFolders" returntype="void" output="true">
+ <cfargument name="resourceType" type="String" required="true">
+ <cfargument name="currentFolder" type="String" required="true">
+
+ <cfset var i = 1>
+ <cfset var folders = "">
+ <!--- Map the virtual path to the local server path --->
+ <cfset var sServerDir = ServerMapFolder( ARGUMENTS.resourceType, ARGUMENTS.currentFolder, "GetFolders" ) >
+
+ <!--- Sort directories first, name ascending --->
+ <cfdirectory action="list" directory="#sServerDir#" name="qDir" sort="type,name">
+ <cfscript>
+ while( i lte qDir.recordCount )
+ {
+ if( compareNoCase( qDir.type[i], "FILE" ) and not listFind( ".,..", qDir.name[i] ) )
+ {
+ folders = folders & '<Folder name="#HTMLEditFormat( qDir.name[i] )#" />' ;
+ }
+ i = i + 1;
+ }
+ </cfscript>
+ <cfoutput><Folders>#folders#</Folders></cfoutput>
+</cffunction>
+
+<cffunction name="GetFoldersAndfiles" returntype="void" output="true">
+ <cfargument name="resourceType" type="String" required="true">
+ <cfargument name="currentFolder" type="String" required="true">
+
+ <cfset var i = 1>
+ <cfset var folders = "">
+ <cfset var files = "">
+ <!--- Map the virtual path to the local server path --->
+ <cfset var sServerDir = ServerMapFolder( ARGUMENTS.resourceType, ARGUMENTS.currentFolder, "GetFolders" ) >
+
+ <!--- Sort directories first, name ascending --->
+ <cfdirectory action="list" directory="#sServerDir#" name="qDir" sort="type,name">
+ <cfscript>
+ while( i lte qDir.recordCount )
+ {
+ if( not compareNoCase( qDir.type[i], "DIR" ) and not listFind( ".,..", qDir.name[i] ) )
+ {
+ folders = folders & '<Folder name="#HTMLEditFormat(qDir.name[i])#" />' ;
+ }
+ else if( not compareNoCase( qDir.type[i], "FILE" ) )
+ {
+ fileSizeKB = round(qDir.size[i] / 1024) ;
+ files = files & '<File name="#HTMLEditFormat(qDir.name[i])#" size="#IIf( fileSizeKB GT 0, DE( fileSizeKB ), 1)#" />' ;
+ }
+ i = i + 1 ;
+ }
+ </cfscript>
+ <cfoutput><Folders>#folders#</Folders></cfoutput>
+ <cfoutput><Files>#files#</Files></cfoutput>
+</cffunction>
+
+<cffunction name="CreateFolder" returntype="void" output="true">
+ <cfargument name="resourceType" required="true" type="string">
+ <cfargument name="currentFolder" required="true" type="string">
+
+ <cfset var sNewFolderName = url.newFolderName >
+ <cfset var sServerDir = "" >
+ <cfset var errorNumber = 0>
+ <cfset var sErrorMsg = "">
+ <cfset var currentFolderPath = ServerMapFolder( ARGUMENTS.resourceType, ARGUMENTS.currentFolder, 'CreateFolder' )>
+
+ <cfparam name="url.newFolderName" default="">
+
+ <cfscript>
+ sNewFolderName = SanitizeFolderName( sNewFolderName ) ;
+ </cfscript>
+
+ <cfif not len( sNewFolderName ) or len( sNewFolderName ) gt 255>
+ <cfset errorNumber = 102>
+ <cfelseif directoryExists( currentFolderPath & sNewFolderName )>
+ <cfset errorNumber = 101>
+ <cfelseif find( "..", sNewFolderName )>
+ <cfset errorNumber = 103>
+ <cfelse>
+ <cfset errorNumber = 0>
+
+ <!--- Map the virtual path to the local server path of the current folder. --->
+ <cfset sServerDir = currentFolderPath & sNewFolderName >
+
+ <cftry>
+ <cfdirectory action="create" directory="#currentFolderPath##sNewFolderName#" mode="755">
+ <cfcatch type="any">
+ <!---
+ un-resolvable error numbers in ColdFusion:
+ * 102 : Invalid folder name.
+ * 103 : You have no permissions to create the folder.
+ --->
+ <cfset errorNumber = 110>
+ </cfcatch>
+ </cftry>
+ </cfif>
+
+ <cfoutput><Error number="#errorNumber#" originalDescription="#HTMLEditFormat(sErrorMsg)#" /></cfoutput>
+</cffunction>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf_connector.cfm
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf_connector.cfm Thu Aug 28 18:47:59 2008
@@ -0,0 +1,89 @@
+<cfsetting enablecfoutputonly="yes" showdebugoutput="no">
+<!---
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * File Browser connector for ColdFusion (MX 6.0 and above).
+ * (based on the original CF connector by Hendrik Kramer - hk at lwd.de)
+ *
+--->
+
+<cfparam name="url.command">
+<cfparam name="url.type">
+<cfparam name="url.currentFolder">
+
+<!--- note: no serverPath url parameter - see config.cfm if you need to set the serverPath manually --->
+
+<cfinclude template="config.cfm">
+<cfinclude template="cf_util.cfm">
+<cfinclude template="cf_io.cfm">
+<cfinclude template="cf_basexml.cfm">
+<cfinclude template="cf_commands.cfm">
+
+<cfif not Config.Enabled>
+ <cfset SendError( 1, 'This connector is disabled. Please check the "editor/filemanager/connectors/cfm/config.cfm" file' )>
+</cfif>
+
+<cfset REQUEST.Config = Config>
+<cfif find( "/", getBaseTemplatePath() ) >
+ <cfset REQUEST.Fs = "/">
+<cfelse>
+ <cfset REQUEST.Fs = "\">
+</cfif>
+
+<cfset DoResponse() >
+
+<cffunction name="DoResponse" output="true" returntype="void">
+
+ <!--- Get the main request informaiton. --->
+ <cfset var sCommand = "#URL.Command#" >
+ <cfset var sResourceType = URL.Type >
+ <cfset var sCurrentFolder = GetCurrentFolder() >
+
+ <!--- Check if it is an allowed command --->
+ <cfif not IsAllowedCommand( sCommand ) >
+ <cfset SendError( 1, "The """ & sCommand & """ command isn't allowed" ) >
+ </cfif>
+
+ <!--- Check if it is an allowed type. --->
+ <cfif not IsAllowedType( sResourceType ) >
+ <cfset SendError( 1, 'Invalid type specified' ) >
+ </cfif>
+
+ <!--- File Upload doesn't have to Return XML, so it must be intercepted before anything. --->
+ <cfif sCommand eq "FileUpload">
+ <cfset FileUpload( sResourceType, sCurrentFolder, sCommand )>
+ <cfabort>
+ </cfif>
+
+ <cfset CreateXmlHeader( sCommand, sResourceType, sCurrentFolder )>
+
+ <!--- Execute the required command. --->
+ <cfif sCommand eq "GetFolders">
+ <cfset GetFolders( sResourceType, sCurrentFolder ) >
+ <cfelseif sCommand eq "GetFoldersAndFiles">
+ <cfset GetFoldersAndFiles( sResourceType, sCurrentFolder ) >
+ <cfelseif sCommand eq "CreateFolder">
+ <cfset CreateFolder( sResourceType, sCurrentFolder ) >
+ </cfif>
+
+ <cfset CreateXmlFooter()>
+
+ <cfexit>
+</cffunction>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf_io.cfm
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf_io.cfm Thu Aug 28 18:47:59 2008
@@ -0,0 +1,291 @@
+<cfsetting enablecfoutputonly="Yes">
+<!---
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This file include IO specific functions used by the ColdFusion Connector (MX 6.0 and above).
+ *
+--->
+
+<cffunction name="CombinePaths" returntype="String" output="true">
+ <cfargument name="sBasePath" required="true">
+ <cfargument name="sFolder" required="true">
+ <cfset sBasePath = RemoveFromEnd( sBasePath, "/" )>
+ <cfset sBasePath = RemoveFromEnd( sBasePath, "\" )>
+ <cfreturn sBasePath & "/" & RemoveFromStart( ARGUMENTS.sFolder, '/' )>
+</cffunction>
+
+<cffunction name="GetResourceTypePath" returntype="String" output="false">
+ <cfargument name="resourceType" required="true">
+ <cfargument name="sCommand" required="true">
+
+ <cfif ARGUMENTS.sCommand eq "QuickUpload">
+ <cfreturn REQUEST.Config['QuickUploadPath'][ARGUMENTS.resourceType]>
+ <cfelse>
+ <cfreturn REQUEST.Config['FileTypesPath'][ARGUMENTS.resourceType]>
+ </cfif>
+</cffunction>
+
+<cffunction name="GetResourceTypeDirectory" returntype="String" output="false">
+ <cfargument name="resourceType" required="true">
+ <cfargument name="sCommand" required="true">
+
+ <cfif ARGUMENTS.sCommand eq "QuickUpload">
+ <cfif isDefined( "REQUEST.Config.QuickUploadAbsolutePath" )
+ and structkeyexists( REQUEST.Config.QuickUploadAbsolutePath, ARGUMENTS.resourceType )
+ and Len( REQUEST.Config.QuickUploadAbsolutePath[ARGUMENTS.resourceType] )>
+ <cfreturn REQUEST.Config.QuickUploadAbsolutePath[ARGUMENTS.resourceType]>
+ </cfif>
+
+ <cfreturn expandpath( REQUEST.Config.QuickUploadPath[ARGUMENTS.resourceType] )>
+ <cfelse>
+ <cfif isDefined( "REQUEST.Config.FileTypesAbsolutePath" )
+ and structkeyexists( REQUEST.Config.FileTypesAbsolutePath, ARGUMENTS.resourceType )
+ and Len( REQUEST.Config.FileTypesAbsolutePath[ARGUMENTS.resourceType] )>
+ <cfreturn REQUEST.Config.FileTypesAbsolutePath[ARGUMENTS.resourceType]>
+ </cfif>
+
+ <cfreturn expandpath( REQUEST.Config.FileTypesPath[ARGUMENTS.resourceType] )>
+ </cfif>
+</cffunction>
+
+<cffunction name="GetUrlFromPath" returntype="String" output="false">
+ <cfargument name="resourceType" required="true">
+ <cfargument name="folderPath" required="true">
+ <cfargument name="sCommand" required="true">
+
+ <cfreturn CombinePaths( GetResourceTypePath( ARGUMENTS.resourceType, ARGUMENTS.sCommand ), ARGUMENTS.folderPath )>
+</cffunction>
+
+<cffunction name="RemoveExtension" output="false" returntype="String">
+ <cfargument name="fileName" required="true">
+ <cfset var pos = find( ".", reverse ( ARGUMENTS.fileName ) )>
+
+ <cfreturn mid( ARGUMENTS.fileName, 1, Len( ARGUMENTS.fileName ) - pos ) >
+</cffunction>
+
+<cffunction name="GetExtension" output="false" returntype="String">
+ <cfargument name="fileName" required="true">
+ <cfset var pos = find( ".", reverse ( ARGUMENTS.fileName ) )>
+
+ <cfif not pos>
+ <cfreturn "">
+ </cfif>
+
+ <cfreturn mid( ARGUMENTS.fileName, pos, Len( ARGUMENTS.fileName ) - pos ) >
+</cffunction>
+
+<cffunction name="ServerMapFolder" returntype="String" output="false">
+ <cfargument name="resourceType" required="true">
+ <cfargument name="folderPath" required="true">
+ <cfargument name="sCommand" required="true">
+
+ <!--- Get the resource type directory. --->
+ <cfset var sResourceTypePath = GetResourceTypeDirectory( ARGUMENTS.resourceType, ARGUMENTS.sCommand ) >
+ <!--- Ensure that the directory exists. --->
+ <cfset var sErrorMsg = CreateServerFolder( sResourceTypePath ) >
+
+ <cfif sErrorMsg neq ''>
+ <cfset SendError( 1, 'Error creating folder "' & sResourceTypePath & '" (' & sErrorMsg & ')' )>
+ </cfif>
+
+ <!--- Return the resource type directory combined with the required path. --->
+ <cfreturn CombinePaths( sResourceTypePath , ARGUMENTS.folderPath )>
+</cffunction>
+
+<cffunction name="GetParentFolder" returntype="string" output="false">
+ <cfargument name="folderPath" required="true">
+
+ <cfreturn rereplace(ARGUMENTS.folderPath, "[/\\\\][^/\\\\]+[/\\\\]?$", "")>
+</cffunction>
+
+<cffunction name="CreateServerFolder" returntype="String" output="false">
+ <cfargument name="folderPath">
+
+ <!--- Ensure the folder path has no double-slashes, or mkdir may fail on certain platforms --->
+ <cfset folderPath = rereplace(ARGUMENTS.folderPath, "//+", "/", "all")>
+
+ <cfif directoryexists(ARGUMENTS.folderPath) or fileexists(ARGUMENTS.folderPath)>
+ <cfreturn "">
+ <cfelse>
+ <cftry>
+ <cfdirectory action="create" mode="0755" directory="#ARGUMENTS.folderPath#">
+ <cfcatch type="any">
+ <cfreturn CFCATCH.Message>
+ </cfcatch>
+ </cftry>
+ </cfif>
+
+ <cfreturn "">
+</cffunction>
+
+<cffunction name="IsAllowedExt" returntype="boolean" output="false">
+ <cfargument name="sExtension" required="true">
+ <cfargument name="resourceType" required="true">
+
+ <cfif isDefined( "REQUEST.Config.AllowedExtensions." & ARGUMENTS.resourceType )
+ and listLen( REQUEST.Config.AllowedExtensions[ARGUMENTS.resourceType] )
+ and not listFindNoCase( REQUEST.Config.AllowedExtensions[ARGUMENTS.resourceType], ARGUMENTS.sExtension )>
+ <cfreturn false>
+ </cfif>
+
+ <cfif isDefined( "REQUEST.Config.DeniedExtensions." & ARGUMENTS.resourceType )
+ and listLen( REQUEST.Config.DeniedExtensions[ARGUMENTS.resourceType] )
+ and listFindNoCase( REQUEST.Config.DeniedExtensions[ARGUMENTS.resourceType], ARGUMENTS.sExtension )>
+ <cfreturn false>
+ </cfif>
+
+ <cfreturn true>
+</cffunction>
+
+<cffunction name="IsAllowedType" returntype="boolean" output="false">
+ <cfargument name="resourceType">
+
+ <cfif not listFindNoCase( REQUEST.Config.ConfigAllowedTypes, ARGUMENTS.resourceType )>
+ <cfreturn false>
+ </cfif>
+
+ <cfreturn true>
+</cffunction>
+
+<cffunction name="IsAllowedCommand" returntype="boolean" output="true">
+ <cfargument name="sCommand" required="true" type="String">
+
+ <cfif not listFindNoCase( REQUEST.Config.ConfigAllowedCommands, ARGUMENTS.sCommand )>
+ <cfreturn false>
+ </cfif>
+
+ <cfreturn true>
+</cffunction>
+
+<cffunction name="GetCurrentFolder" returntype="String" output="true">
+ <cfset var sCurrentFolder = "/">
+
+ <cfif isDefined( "URL.CurrentFolder" )>
+ <cfset sCurrentFolder = URL.CurrentFolder>
+ </cfif>
+
+ <!--- Check the current folder syntax (must begin and start with a slash). --->
+ <cfif not refind( "/$", sCurrentFolder)>
+ <cfset sCurrentFolder = sCurrentFolder & "/">
+ </cfif>
+
+ <cfif not refind( "^/", sCurrentFolder )>
+ <cfset sCurrentFolder = "/" & sCurrentFolder>
+ </cfif>
+
+ <!--- Ensure the folder path has no double-slashes, or mkdir may fail on certain platforms --->
+ <cfset sCurrentFolder = rereplace( sCurrentFolder, "//+", "/", "all" )>
+
+ <cfif find( "..", sCurrentFolder) or find( "\", sCurrentFolder) >
+ <cfset SendError( 102, "" )>
+ </cfif>
+
+ <cfreturn sCurrentFolder>
+</cffunction>
+
+<cffunction name="SanitizeFolderName" returntype="String" output="false">
+ <cfargument name="sNewFolderName" required="true">
+
+ <!--- Do a cleanup of the folder name to avoid possible problems --->
+ <!--- Remove . \ / | : ? * " < > and control characters --->
+ <cfset sNewFolderName = rereplace( sNewFolderName, '\.+|\\+|\/+|\|+|\:+|\?+|\*+|"+|<+|>+|[[:cntrl:]]+', "_", "all" )>
+
+ <cfreturn sNewFolderName>
+</cffunction>
+
+<cffunction name="BinaryFileRead" returntype="String" output="true">
+ <cfargument name="fileName" required="true" type="string">
+ <cfargument name="bytes" required="true" type="Numeric">
+
+ <cfscript>
+ var chunk = "";
+ var fileReaderClass = "";
+ var fileReader = "";
+ var file = "";
+ var done = false;
+ var counter = 0;
+ var byteArray = "";
+
+ if( not fileExists( ARGUMENTS.fileName ) )
+ {
+ return "" ;
+ }
+
+ if (REQUEST.CFVersion gte 8)
+ {
+ file = FileOpen( ARGUMENTS.fileName, "readbinary" ) ;
+ byteArray = FileRead( file, 1024 ) ;
+ chunk = toString( toBinary( toBase64( byteArray ) ) ) ;
+ FileClose( file ) ;
+ }
+ else
+ {
+ fileReaderClass = createObject("java", "java.io.FileInputStream");
+ fileReader = fileReaderClass.init(fileName);
+
+ while(not done)
+ {
+ char = fileReader.read();
+ counter = counter + 1;
+ if ( char eq -1 or counter eq ARGUMENTS.bytes)
+ {
+ done = true;
+ }
+ else
+ {
+ chunk = chunk & chr(char) ;
+ }
+ }
+ }
+ </cfscript>
+
+ <cfreturn chunk>
+</cffunction>
+
+<cffunction name="SendUploadResults" returntype="String" output="true">
+ <cfargument name="errorNumber" required="true" type="Numeric">
+ <cfargument name="fileUrl" required="false" type="String" default="">
+ <cfargument name="fileName" required="false" type="String" default="">
+ <cfargument name="customMsg" required="false" type="String" default="">
+
+ <!--- Minified version of the document.domain automatic fix script (#1919).
+ The original script can be found at _dev/domain_fix_template.js --->
+ <cfoutput>
+<script type="text/javascript">
+(function(){var d=document.domain;while (true){try{var A=window.parent.document.domain;break;}catch(e) {};d=d.replace(/.*?(?:\.|$)/,'');if (d.length==0) break;try{document.domain=d;}catch (e){break;}}})();
+window.parent.OnUploadCompleted( #errorNumber#, "#JSStringFormat(fileUrl)#", "#JSStringFormat(fileName)#", "#JSStringFormat(customMsg)#" );
+</script>
+ </cfoutput>
+ <cfabort>
+</cffunction>
+
+<cffunction name="SanitizeFileName" returntype="String" output="false">
+ <cfargument name="sNewFileName" required="true">
+
+ <cfif isDefined("REQUEST.Config.ForceSingleExtension") and REQUEST.Config.ForceSingleExtension>
+ <cfset sNewFileName = rereplace( sNewFileName, '\.(?![^.]*$)', "_", "all" )>
+ </cfif>
+
+ <!--- Do a cleanup of the file name to avoid possible problems --->
+ <!--- Remove \ / | : ? * " < > and control characters --->
+ <cfset sNewFileName = rereplace( sNewFileName, '\\[.]+|\\+|\/+|\|+|\:+|\?+|\*+|"+|<+|>+|[[:cntrl:]]+', "_", "all" )>
+
+ <cfreturn sNewFileName>
+</cffunction>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf_upload.cfm
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf_upload.cfm Thu Aug 28 18:47:59 2008
@@ -0,0 +1,72 @@
+<cfsetting enablecfoutputonly="yes" showdebugoutput="no">
+<!---
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * File Browser connector for ColdFusion (MX 6.0 and above).
+ * (based on the original CF connector by Hendrik Kramer - hk at lwd.de)
+--->
+
+<cfparam name="url.type" default="File">
+<cfparam name="url.currentFolder" default="/">
+
+<!--- note: no serverPath url parameter - see config.cfm if you need to set the serverPath manually --->
+
+<cfinclude template="config.cfm">
+<cfinclude template="cf_util.cfm">
+<cfinclude template="cf_io.cfm">
+<cfinclude template="cf_commands.cfm">
+
+<cffunction name="SendError" returntype="void" output="true">
+ <cfargument name="number" required="true" type="Numeric">
+ <cfargument name="text" required="true">
+ <cfreturn SendUploadResults( "#ARGUMENTS.number#", "", "", "ARGUMENTS.text" )>
+</cffunction>
+
+<cfset REQUEST.Config = Config>
+<cfif find( "/", getBaseTemplatePath() ) >
+ <cfset REQUEST.Fs = "/">
+<cfelse>
+ <cfset REQUEST.Fs = "\">
+</cfif>
+
+<cfif not Config.Enabled>
+ <cfset SendUploadResults( '1', '', '', 'This file uploader is disabled. Please check the "editor/filemanager/connectors/cfm/config.cfm" file' )>
+</cfif>
+
+<cfset sCommand = 'QuickUpload'>
+<cfset sType = "File">
+
+<cfif isDefined( "URL.Type" )>
+ <cfset sType = URL.Type>
+</cfif>
+
+<cfset sCurrentFolder = GetCurrentFolder()>
+
+<!--- Is enabled the upload? --->
+<cfif not IsAllowedCommand( sCommand )>
+ <cfset SendUploadResults( "1", "", "", "The """ & sCommand & """ command isn't allowed" )>
+</cfif>
+
+<!--- Check if it is an allowed type. --->
+<cfif not IsAllowedType( sType )>
+ <cfset SendUploadResults( "1", "", "", "Invalid type specified" ) >
+</cfif>
+
+<cfset FileUpload( sType, sCurrentFolder, sCommand )>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf_util.cfm
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/cf_util.cfm Thu Aug 28 18:47:59 2008
@@ -0,0 +1,131 @@
+<cfsetting enablecfoutputonly="Yes">
+<!---
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This file include generic functions used by the ColdFusion Connector (MX 6.0 and above).
+--->
+
+<cffunction name="RemoveFromStart" output="false" returntype="String">
+ <cfargument name="sourceString" type="String">
+ <cfargument name="charToRemove" type="String">
+
+ <cfif left(ARGUMENTS.sourceString, 1) eq ARGUMENTS.charToRemove>
+ <cfreturn mid( ARGUMENTS.sourceString, 2, len(ARGUMENTS.sourceString) -1 )>
+ </cfif>
+
+ <cfreturn ARGUMENTS.sourceString>
+</cffunction>
+
+<cffunction name="RemoveFromEnd" output="false" returntype="String">
+ <cfargument name="sourceString" type="String">
+ <cfargument name="charToRemove" type="String">
+
+ <cfif right(ARGUMENTS.sourceString, 1) eq ARGUMENTS.charToRemove>
+ <cfreturn mid( ARGUMENTS.sourceString, 1, len(ARGUMENTS.sourceString) -1 )>
+ </cfif>
+
+ <cfreturn ARGUMENTS.sourceString>
+</cffunction>
+
+<!---
+Check file content.
+Currently this function validates only image files.
+Returns false if file is invalid.
+detectionLevel:
+ 0 = none
+ 1 = check image size for images,
+ 2 = use DetectHtml for images
+---->
+<cffunction name="IsImageValid" returntype="boolean" output="true">
+ <cfargument name="filePath" required="true" type="String">
+ <cfargument name="extension" required="true" type="String">
+
+ <cfset var imageCFC = "">
+ <cfset var imageInfo = "">
+
+ <cfif not ListFindNoCase("gif,jpeg,jpg,png,swf,psd,bmp,iff,tiff,tif,swc,jpc,jp2,jpx,jb2,xmb,wbmp", ARGUMENTS.extension)>
+ <cfreturn true>
+ </cfif>
+
+ <cftry>
+ <cfif REQUEST.CFVersion gte 8>
+ <cfset objImage = ImageRead(ARGUMENTS.filePath) >
+ <cfset imageInfo = ImageInfo(objImage)>
+ <!--- <cfimage action="info" source="#ARGUMENTS.filePath#" structName="imageInfo" /> --->
+ <cfelse>
+ <cfset imageCFC = createObject("component", "image")>
+ <cfset imageInfo = imageCFC.getImageInfo("", ARGUMENTS.filePath)>
+ </cfif>
+
+ <cfif imageInfo.height lte 0 or imageInfo.width lte 0>
+ <cfreturn false>
+ </cfif>
+ <cfcatch type="any">
+ <cfreturn false>
+ </cfcatch>
+ </cftry>
+
+ <cfreturn true>
+</cffunction>
+
+<!---
+ Detect HTML in the first KB to prevent against potential security issue with
+ IE/Safari/Opera file type auto detection bug.
+ Returns true if file contain insecure HTML code at the beginning.
+--->
+<cffunction name="DetectHtml" output="false" returntype="boolean">
+ <cfargument name="filePath" required="true" type="String">
+
+ <cfset var tags = "<body,<head,<html,<img,<pre,<script,<table,<title">
+ <cfset var chunk = lcase( Trim( BinaryFileRead( ARGUMENTS.filePath, 1024 ) ) )>
+
+ <cfif not Len(chunk)>
+ <cfreturn false>
+ </cfif>
+
+ <cfif refind('<!doctype\W*x?html', chunk)>
+ <cfreturn true>
+ </cfif>
+
+ <cfloop index = "tag" list = "#tags#">
+ <cfif find( tag, chunk )>
+ <cfreturn true>
+ </cfif>
+ </cfloop>
+
+ <!--- type = javascript --->
+ <cfif refind('type\s*=\s*[''"]?\s*(?:\w*/)?(?:ecma|java)', chunk)>
+ <cfreturn true>
+ </cfif> >
+
+ <!--- href = javascript --->
+ <!--- src = javascript --->
+ <!--- data = javascript --->
+ <cfif refind('(?:href|src|data)\s*=\s*[\''"]?\s*(?:ecma|java)script:', chunk)>
+ <cfreturn true>
+ </cfif>
+
+ <!--- url(javascript --->
+ <cfif refind('url\s*\(\s*[\''"]?\s*(?:ecma|java)script:', chunk)>
+ <cfreturn true>
+ </cfif>
+
+ <cfreturn false>
+</cffunction>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/config.cfm
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/config.cfm Thu Aug 28 18:47:59 2008
@@ -0,0 +1,189 @@
+<cfsetting enablecfoutputonly="Yes">
+<!---
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Configuration file for the ColdFusion Connector (all versions).
+--->
+
+<cfscript>
+ Config = StructNew() ;
+
+ // SECURITY: You must explicitly enable this "connector". (Set enabled to "true")
+ Config.Enabled = false ;
+
+
+ // Path to uploaded files relative to the document root.
+ Config.UserFilesPath = "/userfiles/" ;
+
+ // Use this to force the server path if FCKeditor is not running directly off
+ // the root of the application or the FCKeditor directory in the URL is a virtual directory
+ // or a symbolic link / junction
+ // Example: C:\inetpub\wwwroot\myDocs\
+ Config.ServerPath = "" ;
+
+ // Due to security issues with Apache modules, it is recommended to leave the
+ // following setting enabled.
+ Config.ForceSingleExtension = true ;
+
+ // Perform additional checks for image files - if set to true, validate image size
+ // (This feature works in MX 6.0 and above)
+ Config.SecureImageUploads = true;
+
+ // What the user can do with this connector
+ Config.ConfigAllowedCommands = "QuickUpload,FileUpload,GetFolders,GetFoldersAndFiles,CreateFolder" ;
+
+ //Allowed Resource Types
+ Config.ConfigAllowedTypes = "File,Image,Flash,Media" ;
+
+ // For security, HTML is allowed in the first Kb of data for files having the
+ // following extensions only.
+ // (This feature works in MX 6.0 and above))
+ Config.HtmlExtensions = "html,htm,xml,xsd,txt,js" ;
+
+ //Due to known issues with GetTempDirectory function, it is
+ //recommended to set this vairiable to a valid directory
+ //instead of using the GetTempDirectory function
+ //(used by MX 6.0 and above)
+ Config.TempDirectory = GetTempDirectory();
+
+// Configuration settings for each Resource Type
+//
+// - AllowedExtensions: the possible extensions that can be allowed.
+// If it is empty then any file type can be uploaded.
+// - DeniedExtensions: The extensions that won't be allowed.
+// If it is empty then no restrictions are done here.
+//
+// For a file to be uploaded it has to fulfill both the AllowedExtensions
+// and DeniedExtensions (that's it: not being denied) conditions.
+//
+// - FileTypesPath: the virtual folder relative to the document root where
+// these resources will be located.
+// Attention: It must start and end with a slash: '/'
+//
+// - FileTypesAbsolutePath: the physical path to the above folder. It must be
+// an absolute path.
+// If it's an empty string then it will be autocalculated.
+// Usefull if you are using a virtual directory, symbolic link or alias.
+// Examples: 'C:\\MySite\\userfiles\\' or '/root/mysite/userfiles/'.
+// Attention: The above 'FileTypesPath' must point to the same directory.
+// Attention: It must end with a slash: '/'
+//
+//
+// - QuickUploadPath: the virtual folder relative to the document root where
+// these resources will be uploaded using the Upload tab in the resources
+// dialogs.
+// Attention: It must start and end with a slash: '/'
+//
+// - QuickUploadAbsolutePath: the physical path to the above folder. It must be
+// an absolute path.
+// If it's an empty string then it will be autocalculated.
+// Usefull if you are using a virtual directory, symbolic link or alias.
+// Examples: 'C:\\MySite\\userfiles\\' or '/root/mysite/userfiles/'.
+// Attention: The above 'QuickUploadPath' must point to the same directory.
+// Attention: It must end with a slash: '/'
+
+ Config.AllowedExtensions = StructNew() ;
+ Config.DeniedExtensions = StructNew() ;
+ Config.FileTypesPath = StructNew() ;
+ Config.FileTypesAbsolutePath = StructNew() ;
+ Config.QuickUploadPath = StructNew() ;
+ Config.QuickUploadAbsolutePath = StructNew() ;
+
+ Config.AllowedExtensions["File"] = "7z,aiff,asf,avi,bmp,csv,doc,fla,flv,gif,gz,gzip,jpeg,jpg,mid,mov,mp3,mp4,mpc,mpeg,mpg,ods,odt,pdf,png,ppt,pxd,qt,ram,rar,rm,rmi,rmvb,rtf,sdc,sitd,swf,sxc,sxw,tar,tgz,tif,tiff,txt,vsd,wav,wma,wmv,xls,xml,zip" ;
+ Config.DeniedExtensions["File"] = "" ;
+ Config.FileTypesPath["File"] = Config.UserFilesPath & 'file/' ;
+ Config.FileTypesAbsolutePath["File"] = iif( Config.ServerPath eq "", de(""), de(Config.ServerPath & 'file/') ) ;
+ Config.QuickUploadPath["File"] = Config.FileTypesPath["File"] ;
+ Config.QuickUploadAbsolutePath["File"] = Config.FileTypesAbsolutePath["File"] ;
+
+ Config.AllowedExtensions["Image"] = "bmp,gif,jpeg,jpg,png" ;
+ Config.DeniedExtensions["Image"] = "" ;
+ Config.FileTypesPath["Image"] = Config.UserFilesPath & 'image/' ;
+ Config.FileTypesAbsolutePath["Image"] = iif( Config.ServerPath eq "", de(""), de(Config.ServerPath & 'image/') ) ;
+ Config.QuickUploadPath["Image"] = Config.FileTypesPath["Image"] ;
+ Config.QuickUploadAbsolutePath["Image"] = Config.FileTypesAbsolutePath["Image"] ;
+
+ Config.AllowedExtensions["Flash"] = "swf,flv" ;
+ Config.DeniedExtensions["Flash"] = "" ;
+ Config.FileTypesPath["Flash"] = Config.UserFilesPath & 'flash/' ;
+ Config.FileTypesAbsolutePath["Flash"] = iif( Config.ServerPath eq "", de(""), de(Config.ServerPath & 'flash/') ) ;
+ Config.QuickUploadPath["Flash"] = Config.FileTypesPath["Flash"] ;
+ Config.QuickUploadAbsolutePath["Flash"] = Config.FileTypesAbsolutePath["Flash"] ;
+
+ Config.AllowedExtensions["Media"] = "aiff,asf,avi,bmp,fla,flv,gif,jpeg,jpg,mid,mov,mp3,mp4,mpc,mpeg,mpg,png,qt,ram,rm,rmi,rmvb,swf,tif,tiff,wav,wma,wmv" ;
+ Config.DeniedExtensions["Media"] = "" ;
+ Config.FileTypesPath["Media"] = Config.UserFilesPath & 'media/' ;
+ Config.FileTypesAbsolutePath["Media"] = iif( Config.ServerPath eq "", de(""), de(Config.ServerPath & 'media/') ) ;
+ Config.QuickUploadPath["Media"] = Config.FileTypesPath["Media"] ;
+ Config.QuickUploadAbsolutePath["Media"] = Config.FileTypesAbsolutePath["Media"] ;
+</cfscript>
+
+<cftry>
+<!--- code to maintain backwards compatibility with previous version of cfm connector --->
+<cfif isDefined("application.userFilesPath")>
+
+ <cflock scope="application" type="readonly" timeout="5">
+ <cfset config.userFilesPath = application.userFilesPath>
+ </cflock>
+
+<cfelseif isDefined("server.userFilesPath")>
+
+ <cflock scope="server" type="readonly" timeout="5">
+ <cfset config.userFilesPath = server.userFilesPath>
+ </cflock>
+
+</cfif>
+
+<!--- look for config struct in application and server scopes --->
+<cfif isDefined("application.FCKeditor") and isStruct(application.FCKeditor)>
+
+ <cflock scope="application" type="readonly" timeout="5">
+ <cfset variables.FCKeditor = duplicate(application.FCKeditor)>
+ </cflock>
+
+<cfelseif isDefined("server.FCKeditor") and isStruct(server.FCKeditor)>
+
+ <cflock scope="server" type="readonly" timeout="5">
+ <cfset variables.FCKeditor = duplicate(server.FCKeditor)>
+ </cflock>
+
+</cfif>
+ <!--- catch potential "The requested scope application has not been enabled" exception --->
+ <cfcatch type="any">
+ </cfcatch>
+</cftry>
+
+<cfif isDefined("FCKeditor")>
+
+ <!--- copy key values from external to local config (i.e. override default config as required) --->
+ <cfscript>
+ function structCopyKeys(stFrom, stTo) {
+ for ( key in stFrom ) {
+ if ( isStruct(stFrom[key]) ) {
+ structCopyKeys(stFrom[key],stTo[key]);
+ } else {
+ stTo[key] = stFrom[key];
+ }
+ }
+ }
+ structCopyKeys(FCKeditor, config);
+ </cfscript>
+
+</cfif>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/connector.cfm
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/connector.cfm Thu Aug 28 18:47:59 2008
@@ -0,0 +1,32 @@
+<cfsetting enablecfoutputonly="Yes">
+<!---
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * File Browser connector for ColdFusion (all versions).
+ *
+--->
+
+<cfset REQUEST.CFVersion = Left( SERVER.COLDFUSION.PRODUCTVERSION, Find( ",", SERVER.COLDFUSION.PRODUCTVERSION ) - 1 )>
+<cfif REQUEST.CFVersion lte 5>
+ <cfinclude template="cf5_connector.cfm">
+<cfelse>
+ <cfinclude template="cf_connector.cfm">
+</cfif>
+<cfabort>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/image.cfc
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/image.cfc Thu Aug 28 18:47:59 2008
@@ -0,0 +1,1324 @@
+<!---
+ image.cfc v2.19, written by Rick Root (rick at webworksllc.com)
+ Derivative of work originally done originally by James Dew.
+
+ Related Web Sites:
+ - http://www.opensourcecf.com/imagecfc (home page)
+ - http://www.cfopen.org/projects/imagecfc (project page)
+
+ LICENSE
+ -------
+ Copyright (c) 2007, Rick Root <rick at webworksllc.com>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, are permitted provided that the
+ following conditions are met:
+
+ - Redistributions of source code must retain the above
+ copyright notice, this list of conditions and the
+ following disclaimer.
+ - Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the
+ following disclaimer in the documentation and/or other
+ materials provided with the distribution.
+ - Neither the name of the Webworks, LLC. nor the names of
+ its contributors may be used to endorse or promote products
+ derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ============================================================
+ This is a derivative work. Following is the original
+ Copyright notice.
+ ============================================================
+
+ Copyright (c) 2004 James F. Dew <jdew at yggdrasil.ca>
+
+ Permission to use, copy, modify, and distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+--->
+<!---
+ SPECIAL NOTE FOR HEADLESS SYSTEMS
+ ---------------------------------
+ If you get a "cannot connect to X11 server" when running certain
+ parts of this component under Bluedragon (Linux), you must
+ add "-Djava.awt.headless=true" to the java startup line in
+ <bluedragon>/bin/StartBluedragon.sh. This isssue is discussed
+ in the Bluedragon Installation Guide section 3.8.1 for
+ Bluedragon 6.2.1.
+
+ Bluedragon may also report a ClassNotFound exception when trying
+ to instantiate the java.awt.image.BufferedImage class. This is
+ most likely the same issue.
+
+ If you get "This graphics environment can be used only in the
+ software emulation mode" when calling certain parts of this
+ component under Coldfusion MX, you should refer to Technote
+ ID #18747: http://www.macromedia.com/go/tn_18747
+--->
+
+<cfcomponent displayname="Image">
+
+<cfset variables.throwOnError = "Yes">
+<cfset variables.defaultJpegCompression = "90">
+<cfset variables.interpolation = "bicubic">
+<cfset variables.textAntiAliasing = "Yes">
+<cfset variables.tempDirectory = "#expandPath(".")#">
+
+<cfset variables.javanulls = "no">
+<cftry>
+ <cfset nullvalue = javacast("null","")>
+ <cfset variables.javanulls = "yes">
+ <cfcatch type="any">
+ <cfset variables.javanulls = "no">
+ <!--- javacast null not supported, so filters won't work --->
+ </cfcatch>
+</cftry>
+<!---
+<cfif javanulls>
+ <cfset variables.blurFilter = createObject("component","blurFilter")>
+ <cfset variables.sharpenFilter = createObject("component","sharpenFilter")>
+ <cfset variables.posterizeFilter = createObject("component","posterizeFilter")>
+</cfif>
+--->
+
+<cfset variables.Math = createobject("java", "java.lang.Math")>
+<cfset variables.arrObj = createobject("java", "java.lang.reflect.Array")>
+<cfset variables.floatClass = createobject("java", "java.lang.Float").TYPE>
+<cfset variables.intClass = createobject("java", "java.lang.Integer").TYPE>
+<cfset variables.shortClass = createobject("java", "java.lang.Short").TYPE>
+
+<cffunction name="getImageInfo" access="public" output="true" returntype="struct" hint="Rotate an image (+/-)90, (+/-)180, or (+/-)270 degrees.">
+ <cfargument name="objImage" required="yes" type="Any">
+ <cfargument name="inputFile" required="yes" type="string">
+
+ <cfset var retVal = StructNew()>
+ <cfset var loadImage = StructNew()>
+ <cfset var img = "">
+
+ <cfset retVal.errorCode = 0>
+ <cfset retVal.errorMessage = "">
+
+ <cfif inputFile neq "">
+ <cfset loadImage = readImage(inputFile, "NO")>
+ <cfif loadImage.errorCode is 0>
+ <cfset img = loadImage.img>
+ <cfelse>
+ <cfset retVal = throw(loadImage.errorMessage)>
+ <cfreturn retVal>
+ </cfif>
+ <cfset retVal.metaData = getImageMetadata(loadImage.inFile)>
+ <cfelse>
+ <cfset img = objImage>
+ <cfset retVal.metadata = getImageMetadata("")>
+ </cfif>
+ <cftry>
+ <cfset retVal.width = img.getWidth()>
+ <cfset retVal.height = img.getHeight()>
+ <cfset retVal.colorModel = img.getColorModel().toString()>
+ <cfset retVal.colorspace = img.getColorModel().getColorSpace().toString()>
+ <cfset retVal.objColorModel = img.getColorModel()>
+ <cfset retVal.objColorspace = img.getColorModel().getColorSpace()>
+ <cfset retVal.sampleModel = img.getSampleModel().toString()>
+ <cfset retVal.imageType = img.getType()>
+ <cfset retVal.misc = img.toString()>
+ <cfset retVal.canModify = true>
+ <cfreturn retVal>
+ <cfcatch type="any">
+ <cfset retVal = throw( "#cfcatch.message#: #cfcatch.detail#")>
+ <cfreturn retVal>
+ </cfcatch>
+ </cftry>
+</cffunction>
+
+<cffunction name="getImageMetadata" access="private" output="false" returntype="query">
+ <cfargument name="inFile" required="yes" type="Any"><!--- java.io.File --->
+
+ <cfset var retQry = queryNew("dirName,tagName,tagValue")>
+ <cfset var paths = arrayNew(1)>
+ <cfset var loader = "">
+ <cfset var JpegMetadatareader = "">
+ <cfset var myMetadata = "">
+ <cfset var directories = "">
+ <cfset var currentDirectory = "">
+ <cfset var tags = "">
+ <cfset var currentTag = "">
+ <cfset var tagName = "">
+
+ <cftry>
+ <cfscript>
+ paths = arrayNew(1);
+ paths[1] = expandPath("metadata-extractor-2.3.1.jar");
+ loader = createObject("component", "javaloader.JavaLoader").init(paths);
+
+ //at this stage we only have access to the class, but we don't have an instance
+ JpegMetadataReader = loader.create("com.drew.imaging.jpeg.JpegMetadataReader");
+
+ myMetaData = JpegMetadataReader.readMetadata(inFile);
+ directories = myMetaData.getDirectoryIterator();
+ while (directories.hasNext()) {
+ currentDirectory = directories.next();
+ tags = currentDirectory.getTagIterator();
+ while (tags.hasNext()) {
+ currentTag = tags.next();
+ if (currentTag.getTagName() DOES NOT CONTAIN "Unknown") { //leave out the junk data
+ queryAddRow(retQry);
+ querySetCell(retQry,"dirName",replace(currentTag.getDirectoryName(),' ','_','ALL'));
+ tagName = replace(currentTag.getTagName(),' ','','ALL');
+ tagName = replace(tagName,'/','','ALL');
+ querySetCell(retQry,"tagName",tagName);
+ querySetCell(retQry,"tagValue",currentTag.getDescription());
+ }
+ }
+ }
+ return retQry;
+ </cfscript>
+ <cfcatch type="any">
+ <cfreturn retQry />
+ </cfcatch>
+ </cftry>
+</cffunction>
+
+<cffunction name="flipHorizontal" access="public" output="true" returntype="struct" hint="Flip an image horizontally.">
+ <cfargument name="objImage" required="yes" type="Any">
+ <cfargument name="inputFile" required="yes" type="string">
+ <cfargument name="outputFile" required="yes" type="string">
+ <cfargument name="jpegCompression" required="no" type="numeric" default="#variables.defaultJpegCompression#">
+
+ <cfreturn flipflop(objImage, inputFile, outputFile, "horizontal", jpegCompression)>
+</cffunction>
+
+<cffunction name="flipVertical" access="public" output="true" returntype="struct" hint="Flop an image vertically.">
+ <cfargument name="objImage" required="yes" type="Any">
+ <cfargument name="inputFile" required="yes" type="string">
+ <cfargument name="outputFile" required="yes" type="string">
+ <cfargument name="jpegCompression" required="no" type="numeric" default="#variables.defaultJpegCompression#">
+
+ <cfreturn flipflop(objImage, inputFile, outputFile, "vertical", jpegCompression)>
+</cffunction>
+
+<cffunction name="scaleWidth" access="public" output="true" returntype="struct" hint="Scale an image to a specific width.">
+ <cfargument name="objImage" required="yes" type="Any">
+ <cfargument name="inputFile" required="yes" type="string">
+ <cfargument name="outputFile" required="yes" type="string">
+ <cfargument name="newWidth" required="yes" type="numeric">
+ <cfargument name="jpegCompression" required="no" type="numeric" default="#variables.defaultJpegCompression#">
+
+ <cfreturn resize(objImage, inputFile, outputFile, newWidth, 0, "false", "false", jpegCompression)>
+</cffunction>
+
+<cffunction name="scaleHeight" access="public" output="true" returntype="struct" hint="Scale an image to a specific height.">
+ <cfargument name="objImage" required="yes" type="Any">
+ <cfargument name="inputFile" required="yes" type="string">
+ <cfargument name="outputFile" required="yes" type="string">
+ <cfargument name="newHeight" required="yes" type="numeric">
+ <cfargument name="jpegCompression" required="no" type="numeric" default="#variables.defaultJpegCompression#">
+
+ <cfreturn resize(objImage, inputFile, outputFile, 0, newHeight, "false", "false", jpegCompression)>
+</cffunction>
+
+<cffunction name="resize" access="public" output="true" returntype="struct" hint="Resize an image to a specific width and height.">
+ <cfargument name="objImage" required="yes" type="Any">
+ <cfargument name="inputFile" required="yes" type="string">
+ <cfargument name="outputFile" required="yes" type="string">
+ <cfargument name="newWidth" required="yes" type="numeric">
+ <cfargument name="newHeight" required="yes" type="numeric">
+ <cfargument name="preserveAspect" required="no" type="boolean" default="FALSE">
+ <cfargument name="cropToExact" required="no" type="boolean" default="FALSE">
+ <cfargument name="jpegCompression" required="no" type="numeric" default="#variables.defaultJpegCompression#">
+
+ <cfset var retVal = StructNew()>
+ <cfset var loadImage = StructNew()>
+ <cfset var saveImage = StructNew()>
+ <cfset var at = "">
+ <cfset var op = "">
+ <cfset var w = "">
+ <cfset var h = "">
+ <cfset var scale = 1>
+ <cfset var scaleX = 1>
+ <cfset var scaleY = 1>
+ <cfset var resizedImage = "">
+ <cfset var rh = getRenderingHints()>
+ <cfset var specifiedWidth = arguments.newWidth>
+ <cfset var specifiedHeight = arguments.newHeight>
+ <cfset var imgInfo = "">
+ <cfset var img = "">
+ <cfset var cropImageResult = "">
+ <cfset var cropOffsetX = "">
+ <cfset var cropOffsetY = "">
+
+ <cfset retVal.errorCode = 0>
+ <cfset retVal.errorMessage = "">
+
+ <cfif inputFile neq "">
+ <cfset loadImage = readImage(inputFile, "NO")>
+ <cfif loadImage.errorCode is 0>
+ <cfset img = loadImage.img>
+ <cfelse>
+ <cfset retVal = throw(loadImage.errorMessage)>
+ <cfreturn retVal>
+ </cfif>
+ <cfelse>
+ <cfset img = objImage>
+ </cfif>
+ <cfif img.getType() eq 0>
+ <cfset img = convertImageObject(img,img.TYPE_3BYTE_BGR)>
+ </cfif>
+ <cfscript>
+ resizedImage = CreateObject("java", "java.awt.image.BufferedImage");
+ at = CreateObject("java", "java.awt.geom.AffineTransform");
+ op = CreateObject("java", "java.awt.image.AffineTransformOp");
+
+ w = img.getWidth();
+ h = img.getHeight();
+
+ if (preserveAspect and cropToExact and newHeight gt 0 and newWidth gt 0)
+ {
+ if (w / h gt newWidth / newHeight){
+ newWidth = 0;
+ } else if (w / h lt newWidth / newHeight){
+ newHeight = 0;
+ }
+ } else if (preserveAspect and newHeight gt 0 and newWidth gt 0) {
+ if (w / h gt newWidth / newHeight){
+ newHeight = 0;
+ } else if (w / h lt newWidth / newHeight){
+ newWidth = 0;
+ }
+ }
+ if (newWidth gt 0 and newHeight eq 0) {
+ scale = newWidth / w;
+ w = newWidth;
+ h = round(h*scale);
+ } else if (newHeight gt 0 and newWidth eq 0) {
+ scale = newHeight / h;
+ h = newHeight;
+ w = round(w*scale);
+ } else if (newHeight gt 0 and newWidth gt 0) {
+ w = newWidth;
+ h = newHeight;
+ } else {
+ retVal = throw( retVal.errorMessage);
+ return retVal;
+ }
+ resizedImage.init(javacast("int",w),javacast("int",h),img.getType());
+
+ w = w / img.getWidth();
+ h = h / img.getHeight();
+
+
+
+ op.init(at.getScaleInstance(javacast("double",w),javacast("double",h)), rh);
+ // resizedImage = op.createCompatibleDestImage(img, img.getColorModel());
+ op.filter(img, resizedImage);
+
+ imgInfo = getimageinfo(resizedImage, "");
+ if (imgInfo.errorCode gt 0)
+ {
+ return imgInfo;
+ }
+
+ cropOffsetX = max( Int( (imgInfo.width/2) - (newWidth/2) ), 0 );
+ cropOffsetY = max( Int( (imgInfo.height/2) - (newHeight/2) ), 0 );
+ // There is a chance that the image is exactly the correct
+ // width and height and don't need to be cropped
+ if
+ (
+ preserveAspect and cropToExact
+ and
+ (imgInfo.width IS NOT specifiedWidth OR imgInfo.height IS NOT specifiedHeight)
+ )
+ {
+ // Get the correct offset to get the center of the image
+ cropOffsetX = max( Int( (imgInfo.width/2) - (specifiedWidth/2) ), 0 );
+ cropOffsetY = max( Int( (imgInfo.height/2) - (specifiedHeight/2) ), 0 );
+
+ cropImageResult = crop( resizedImage, "", "", cropOffsetX, cropOffsetY, specifiedWidth, specifiedHeight );
+ if ( cropImageResult.errorCode GT 0)
+ {
+ return cropImageResult;
+ } else {
+ resizedImage = cropImageResult.img;
+ }
+ }
+ if (outputFile eq "")
+ {
+ retVal.img = resizedImage;
+ return retVal;
+ } else {
+ saveImage = writeImage(outputFile, resizedImage, jpegCompression);
+ if (saveImage.errorCode gt 0)
+ {
+ return saveImage;
+ } else {
+ return retVal;
+ }
+ }
+ </cfscript>
+</cffunction>
+
+<cffunction name="crop" access="public" output="true" returntype="struct" hint="Crop an image.">
+ <cfargument name="objImage" required="yes" type="Any">
+ <cfargument name="inputFile" required="yes" type="string">
+ <cfargument name="outputFile" required="yes" type="string">
+ <cfargument name="fromX" required="yes" type="numeric">
+ <cfargument name="fromY" required="yes" type="numeric">
+ <cfargument name="newWidth" required="yes" type="numeric">
+ <cfargument name="newHeight" required="yes" type="numeric">
+ <cfargument name="jpegCompression" required="no" type="numeric" default="#variables.defaultJpegCompression#">
+
+ <cfset var retVal = StructNew()>
+ <cfset var loadImage = StructNew()>
+ <cfset var saveImage = StructNew()>
+ <cfset var croppedImage = "">
+ <cfset var rh = getRenderingHints()>
+ <cfset var img = "">
+
+ <cfset retVal.errorCode = 0>
+ <cfset retVal.errorMessage = "">
+
+ <cfif inputFile neq "">
+ <cfset loadImage = readImage(inputFile, "NO")>
+ <cfif loadImage.errorCode is 0>
+ <cfset img = loadImage.img>
+ <cfelse>
+ <cfset retVal = throw(loadImage.errorMessage)>
+ <cfreturn retVal>
+ </cfif>
+ <cfelse>
+ <cfset img = objImage>
+ </cfif>
+ <cfif img.getType() eq 0>
+ <cfset img = convertImageObject(img,img.TYPE_3BYTE_BGR)>
+ </cfif>
+ <cfscript>
+ if (fromX + newWidth gt img.getWidth()
+ OR
+ fromY + newHeight gt img.getHeight()
+ )
+ {
+ retval = throw( "The cropped image dimensions go beyond the original image dimensions.");
+ return retVal;
+ }
+ croppedImage = img.getSubimage(javaCast("int", fromX), javaCast("int", fromY), javaCast("int", newWidth), javaCast("int", newHeight) );
+ if (outputFile eq "")
+ {
+ retVal.img = croppedImage;
+ return retVal;
+ } else {
+ saveImage = writeImage(outputFile, croppedImage, jpegCompression);
+ if (saveImage.errorCode gt 0)
+ {
+ return saveImage;
+ } else {
+ return retVal;
+ }
+ }
+ </cfscript>
+</cffunction>
+
+<cffunction name="rotate" access="public" output="true" returntype="struct" hint="Rotate an image (+/-)90, (+/-)180, or (+/-)270 degrees.">
+ <cfargument name="objImage" required="yes" type="Any">
+ <cfargument name="inputFile" required="yes" type="string">
+ <cfargument name="outputFile" required="yes" type="string">
+ <cfargument name="degrees" required="yes" type="numeric">
+ <cfargument name="jpegCompression" required="no" type="numeric" default="#variables.defaultJpegCompression#">
+
+ <cfset var retVal = StructNew()>
+ <cfset var img = "">
+ <cfset var loadImage = StructNew()>
+ <cfset var saveImage = StructNew()>
+ <cfset var at = "">
+ <cfset var op = "">
+ <cfset var w = 0>
+ <cfset var h = 0>
+ <cfset var iw = 0>
+ <cfset var ih = 0>
+ <cfset var x = 0>
+ <cfset var y = 0>
+ <cfset var rotatedImage = "">
+ <cfset var rh = getRenderingHints()>
+
+ <cfset retVal.errorCode = 0>
+ <cfset retVal.errorMessage = "">
+
+ <cfif inputFile neq "">
+ <cfset loadImage = readImage(inputFile, "NO")>
+ <cfif loadImage.errorCode is 0>
+ <cfset img = loadImage.img>
+ <cfelse>
+ <cfset retVal = throw(loadImage.errorMessage)>
+ <cfreturn retVal>
+ </cfif>
+ <cfelse>
+ <cfset img = objImage>
+ </cfif>
+ <cfif img.getType() eq 0>
+ <cfset img = convertImageObject(img,img.TYPE_3BYTE_BGR)>
+ </cfif>
+ <cfif ListFind("-270,-180,-90,90,180,270",degrees) is 0>
+ <cfset retVal = throw( "At this time, image.cfc only supports rotating images in 90 degree increments.")>
+ <cfreturn retVal>
+ </cfif>
+
+ <cfscript>
+ rotatedImage = CreateObject("java", "java.awt.image.BufferedImage");
+ at = CreateObject("java", "java.awt.geom.AffineTransform");
+ op = CreateObject("java", "java.awt.image.AffineTransformOp");
+
+ iw = img.getWidth(); h = iw;
+ ih = img.getHeight(); w = ih;
+
+ if(arguments.degrees eq 180) { w = iw; h = ih; }
+
+ x = (w/2)-(iw/2);
+ y = (h/2)-(ih/2);
+
+ rotatedImage.init(javacast("int",w),javacast("int",h),img.getType());
+
+ at.rotate(arguments.degrees * 0.0174532925,w/2,h/2);
+ at.translate(x,y);
+ op.init(at, rh);
+
+ op.filter(img, rotatedImage);
+
+ if (outputFile eq "")
+ {
+ retVal.img = rotatedImage;
+ return retVal;
+ } else {
+ saveImage = writeImage(outputFile, rotatedImage, jpegCompression);
+ if (saveImage.errorCode gt 0)
+ {
+ return saveImage;
+ } else {
+ return retVal;
+ }
+ }
+ </cfscript>
+</cffunction>
+
+<cffunction name="convert" access="public" output="true" returntype="struct" hint="Convert an image from one format to another.">
+ <cfargument name="objImage" required="yes" type="Any">
+ <cfargument name="inputFile" required="yes" type="string">
+ <cfargument name="outputFile" required="yes" type="string">
+ <cfargument name="jpegCompression" required="no" type="numeric" default="#variables.defaultJpegCompression#">
+
+ <cfset var retVal = StructNew()>
+ <cfset var loadImage = StructNew()>
+ <cfset var saveImage = StructNew()>
+ <cfset var img = "">
+
+ <cfset retVal.errorCode = 0>
+ <cfset retVal.errorMessage = "">
+
+ <cfif inputFile neq "">
+ <cfset loadImage = readImage(inputFile, "NO")>
+ <cfif loadImage.errorCode is 0>
+ <cfset img = loadImage.img>
+ <cfelse>
+ <cfset retVal = throw(loadImage.errorMessage)>
+ <cfreturn retVal>
+ </cfif>
+ <cfelse>
+ <cfset img = objImage>
+ </cfif>
+
+ <cfscript>
+ if (outputFile eq "")
+ {
+ retVal = throw( "The convert method requires a valid output filename.");
+ return retVal;
+ } else {
+ saveImage = writeImage(outputFile, img, jpegCompression);
+ if (saveImage.errorCode gt 0)
+ {
+ return saveImage;
+ } else {
+ return retVal;
+ }
+ }
+ </cfscript>
+</cffunction>
+
+<cffunction name="setOption" access="public" output="true" returnType="void" hint="Sets values for allowed CFC options.">
+ <cfargument name="key" type="string" required="yes">
+ <cfargument name="val" type="string" required="yes">
+
+ <cfset var validKeys = "interpolation,textantialiasing,throwonerror,defaultJpegCompression">
+ <cfset arguments.key = lcase(trim(arguments.key))>
+ <cfset arguments.val = lcase(trim(arguments.val))>
+ <cfif listFind(validKeys, arguments.key) gt 0>
+ <cfset variables[arguments.key] = arguments.val>
+ </cfif>
+</cffunction>
+
+<cffunction name="getOption" access="public" output="true" returnType="any" hint="Returns the current value for the specified CFC option.">
+ <cfargument name="key" type="string" required="yes">
+
+ <cfset var validKeys = "interpolation,textantialiasing,throwonerror,defaultJpegCompression">
+ <cfset arguments.key = lcase(trim(arguments.key))>
+ <cfif listFindNoCase(validKeys, arguments.key) gt 0>
+ <cfreturn variables[arguments.key]>
+ <cfelse>
+ <cfreturn "">
+ </cfif>
+</cffunction>
+
+<cffunction name="getRenderingHints" access="private" output="true" returnType="any" hint="Internal method controls various aspects of rendering quality.">
+ <cfset var rh = CreateObject("java","java.awt.RenderingHints")>
+ <cfset var initMap = CreateObject("java","java.util.HashMap")>
+ <cfset initMap.init()>
+ <cfset rh.init(initMap)>
+ <cfset rh.put(rh.KEY_ALPHA_INTERPOLATION, rh.VALUE_ALPHA_INTERPOLATION_QUALITY)> <!--- QUALITY, SPEED, DEFAULT --->
+ <cfset rh.put(rh.KEY_ANTIALIASING, rh.VALUE_ANTIALIAS_ON)> <!--- ON, OFF, DEFAULT --->
+ <cfset rh.put(rh.KEY_COLOR_RENDERING, rh.VALUE_COLOR_RENDER_QUALITY)> <!--- QUALITY, SPEED, DEFAULT --->
+ <cfset rh.put(rh.KEY_DITHERING, rh.VALUE_DITHER_DEFAULT)> <!--- DISABLE, ENABLE, DEFAULT --->
+ <cfset rh.put(rh.KEY_RENDERING, rh.VALUE_RENDER_QUALITY)> <!--- QUALITY, SPEED, DEFAULT --->
+ <cfset rh.put(rh.KEY_FRACTIONALMETRICS, rh.VALUE_FRACTIONALMETRICS_DEFAULT)> <!--- DISABLE, ENABLE, DEFAULT --->
+ <cfset rh.put(rh.KEY_STROKE_CONTROL, rh.VALUE_STROKE_DEFAULT)>
+
+ <cfif variables.textAntiAliasing>
+ <cfset rh.put(rh.KEY_TEXT_ANTIALIASING, rh.VALUE_TEXT_ANTIALIAS_ON)>
+ <cfelse>
+ <cfset rh.put(rh.KEY_TEXT_ANTIALIASING, rh.VALUE_TEXT_ANTIALIAS_OFF)>
+ </cfif>
+
+ <cfif variables.interpolation eq "nearest_neighbor">
+ <cfset rh.put(rh.KEY_INTERPOLATION, rh.VALUE_INTERPOLATION_NEAREST_NEIGHBOR)>
+ <cfelseif variables.interpolation eq "bilinear">
+ <cfset rh.put(rh.KEY_INTERPOLATION, rh.VALUE_INTERPOLATION_BILINEAR)>
+ <cfelse>
+ <cfset rh.put(rh.KEY_INTERPOLATION, rh.VALUE_INTERPOLATION_BICUBIC)>
+ </cfif>
+
+ <cfreturn rh>
+</cffunction>
+
+<cffunction name="readImage" access="public" output="true" returntype="struct" hint="Reads an image from a local file. Requires an absolute path.">
+ <cfargument name="source" required="yes" type="string">
+ <cfargument name="forModification" required="no" type="boolean" default="yes">
+
+ <cfif isURL(source)>
+ <cfreturn readImageFromURL(source, forModification)>
+ <cfelse>
+ <cfreturn readImageFromFile(source, forModification)>
+ </cfif>
+</cffunction>
+
+<cffunction name="readImageFromFile" access="private" output="true" returntype="struct" hint="Reads an image from a local file. Requires an absolute path.">
+ <cfargument name="inputFile" required="yes" type="string">
+ <cfargument name="forModification" required="no" type="boolean" default="yes">
+
+ <cfset var retVal = StructNew()>
+ <cfset var img = "">
+ <cfset var inFile = "">
+ <cfset var filename = getFileFromPath(inputFile)>
+ <cfset var extension = lcase(listLast(inputFile,"."))>
+ <cfset var imageIO = CreateObject("java", "javax.imageio.ImageIO")>
+ <cfset var validExtensionsToRead = ArrayToList(imageIO.getReaderFormatNames())>
+
+ <cfset retVal.errorCode = 0>
+ <cfset retVal.errorMessage = "">
+
+ <cfif not fileExists(arguments.inputFile)>
+ <cfset retVal = throw("The specified file #Chr(34)##arguments.inputFile##Chr(34)# could not be found.")>
+ <cfreturn retVal>
+ <cfelseif listLen(filename,".") lt 2>
+ <cfset retVal = throw("Sorry, image files without extensions cannot be manipulated.")>
+ <cfreturn retVal>
+ <cfelseif listFindNoCase(validExtensionsToRead, extension) is 0>
+ <cfset retVal = throw("Java is unable to read #extension# files.")>
+ <cfreturn retVal>
+ <cfelseif NOT fileExists(arguments.inputFile)>
+ <cfset retVal = throw("The specified input file does not exist.")>
+ <cfreturn retVal>
+ <cfelse>
+ <cfset img = CreateObject("java", "java.awt.image.BufferedImage")>
+ <cfset inFile = CreateObject("java", "java.io.File")>
+ <cfset inFile.init(arguments.inputFile)>
+ <cfif NOT inFile.canRead()>
+ <cfset retVal = throw("Unable to open source file #Chr(34)##arguments.inputFile##Chr(34)#.")>
+ <cfreturn retVal>
+ <cfelse>
+ <cftry>
+ <cfset img = imageIO.read(inFile)>
+ <cfcatch type="any">
+ <cfset retval = throw("An error occurred attempting to read the specified image. #cfcatch.message# - #cfcatch.detail#")>
+ <cfreturn retVal>
+ </cfcatch>
+ </cftry>
+ <cfset retVal.img = img>
+ <cfset retVal.inFile = inFile>
+ <cfreturn retVal>
+ </cfif>
+ </cfif>
+</cffunction>
+
+<cffunction name="readImageFromURL" access="private" output="true" returntype="struct" hint="Read an image from a URL. Requires an absolute URL.">
+ <cfargument name="inputURL" required="yes" type="string">
+ <cfargument name="forModification" required="no" type="boolean" default="yes">
+
+ <cfset var retVal = StructNew()>
+ <cfset var img = CreateObject("java", "java.awt.image.BufferedImage")>
+ <cfset var inURL = CreateObject("java", "java.net.URL")>
+ <cfset var imageIO = CreateObject("java", "javax.imageio.ImageIO")>
+
+ <cfset retVal.errorCode = 0>
+ <cfset retVal.errorMessage = "">
+
+
+ <cfset inURL.init(arguments.inputURL)>
+ <cftry>
+ <cfset img = imageIO.read(inURL)>
+ <cfcatch type="any">
+ <cfset retval = throw("An error occurred attempting to read the specified image. #cfcatch.message# - #cfcatch.detail#")>
+ <cfreturn retVal>
+ </cfcatch>
+ </cftry>
+ <cfset retVal.img = img>
+ <cfreturn retVal>
+</cffunction>
+
+<cffunction name="writeImage" access="public" output="true" returntype="struct" hint="Write an image to disk.">
+ <cfargument name="outputFile" required="yes" type="string">
+ <cfargument name="img" required="yes" type="any">
+ <cfargument name="jpegCompression" required="no" type="numeric" default="#variables.defaultJpegCompression#">
+
+ <cfset var retVal = StructNew()>
+ <cfset var outFile = "">
+ <cfset var filename = getFileFromPath(outputFile)>
+ <cfset var extension = lcase(listLast(filename,"."))>
+ <cfset var imageIO = CreateObject("java", "javax.imageio.ImageIO")>
+ <cfset var validExtensionsToWrite = ArrayToList(imageIO.getWriterFormatNames())>
+ <!--- used for jpeg output method --->
+ <cfset var out = "">
+ <cfset var fos = "">
+ <cfset var JPEGCodec = "">
+ <cfset var encoder = "">
+ <cfset var param = "">
+ <cfset var quality = javacast("float", jpegCompression/100)>
+ <cfset var tempOutputFile = "#variables.tempDirectory#\#createUUID()#.#extension#">
+
+ <cfset retVal.errorCode = 0>
+ <cfset retVal.errorMessage = "">
+
+ <cfif listFindNoCase(validExtensionsToWrite, extension) eq 0>
+ <cfset throw("Java is unable to write #extension# files. Valid formats include: #validExtensionsToWrite#")>
+ </cfif>
+
+ <cfif extension neq "jpg" and extension neq "jpeg">
+ <!---
+ Simple output method for non jpeg images
+ --->
+ <cfset outFile = CreateObject("java", "java.io.File")>
+ <cfset outFile.init(tempOutputFile)>
+ <cfset imageIO.write(img, extension, outFile)>
+ <cfelse>
+ <cfscript>
+ /*
+ JPEG output method handles compression
+ */
+ out = createObject("java", "java.io.BufferedOutputStream");
+ fos = createObject("java", "java.io.FileOutputStream");
+ fos.init(tempOutputFile);
+ out.init(fos);
+ JPEGCodec = createObject("java", "com.sun.image.codec.jpeg.JPEGCodec");
+ encoder = JPEGCodec.createJPEGEncoder(out);
+ param = encoder.getDefaultJPEGEncodeParam(img);
+ param.setQuality(quality, false);
+ encoder.setJPEGEncodeParam(param);
+ encoder.encode(img);
+ out.close();
+ </cfscript>
+ </cfif>
+ <!--- move file to its final destination --->
+ <cffile action="MOVE" source="#tempOutputFile#" destination="#arguments.outputFile#">
+ <cfreturn retVal>
+</cffunction>
+
+<cffunction name="flipflop" access="private" output="true" returntype="struct" hint="Internal method used for flipping and flopping images.">
+ <cfargument name="objImage" required="yes" type="Any">
+ <cfargument name="inputFile" required="yes" type="string">
+ <cfargument name="outputFile" required="yes" type="string">
+ <cfargument name="direction" required="yes" type="string"><!--- horizontal or vertical --->
+ <cfargument name="jpegCompression" required="no" type="numeric" default="#variables.defaultJpegCompression#">
+
+ <cfset var retVal = StructNew()>
+ <cfset var loadImage = StructNew()>
+ <cfset var saveImage = StructNew()>
+ <cfset var flippedImage = "">
+ <cfset var rh = getRenderingHints()>
+ <cfset var img = "">
+
+ <cfset retVal.errorCode = 0>
+ <cfset retVal.errorMessage = "">
+
+ <cfif inputFile neq "">
+ <cfset loadImage = readImage(inputFile, "NO")>
+ <cfif loadImage.errorCode is 0>
+ <cfset img = loadImage.img>
+ <cfelse>
+ <cfset retVal = throw(loadImage.errorMessage)>
+ <cfreturn retVal>
+ </cfif>
+ <cfelse>
+ <cfset img = objImage>
+ </cfif>
+ <cfif img.getType() eq 0>
+ <cfset img = convertImageObject(img,img.TYPE_3BYTE_BGR)>
+ </cfif>
+ <cfscript>
+ flippedImage = CreateObject("java", "java.awt.image.BufferedImage");
+ at = CreateObject("java", "java.awt.geom.AffineTransform");
+ op = CreateObject("java", "java.awt.image.AffineTransformOp");
+
+ flippedImage.init(img.getWidth(), img.getHeight(), img.getType());
+
+ if (direction eq "horizontal") {
+ at = at.getScaleInstance(-1, 1);
+ at.translate(-img.getWidth(), 0);
+ } else {
+ at = at.getScaleInstance(1,-1);
+ at.translate(0, -img.getHeight());
+ }
+ op.init(at, rh);
+ op.filter(img, flippedImage);
+
+ if (outputFile eq "")
+ {
+ retVal.img = flippedImage;
+ return retVal;
+ } else {
+ saveImage = writeImage(outputFile, flippedImage, jpegCompression);
+ if (saveImage.errorCode gt 0)
+ {
+ return saveImage;
+ } else {
+ return retVal;
+ }
+ }
+ </cfscript>
+</cffunction>
+
+
+
+<cffunction name="filterFastBlur" access="public" output="true" returntype="struct" hint="Internal method used for flipping and flopping images.">
+ <cfargument name="objImage" required="yes" type="Any">
+ <cfargument name="inputFile" required="yes" type="string">
+ <cfargument name="outputFile" required="yes" type="string">
+ <cfargument name="blurAmount" required="yes" type="numeric">
+ <cfargument name="iterations" required="yes" type="numeric">
+ <cfargument name="jpegCompression" required="no" type="numeric" default="#variables.defaultJpegCompression#">
+
+ <cfset var retVal = StructNew()>
+ <cfset var loadImage = StructNew()>
+ <cfset var saveImage = StructNew()>
+ <cfset var srcImage = "">
+ <cfset var destImage = "">
+ <cfset var rh = getRenderingHints()>
+
+ <cfset retVal.errorCode = 0>
+ <cfset retVal.errorMessage = "">
+
+ <cfif NOT variables.javanulls>
+ <cfset throw("Sorry, but the blur filter is not supported on this platform.")>
+ </cfif>
+ <cfif inputFile neq "">
+ <cfset loadImage = readImage(inputFile, "NO")>
+ <cfif loadImage.errorCode is 0>
+ <cfset srcImage = loadImage.img>
+ <cfelse>
+ <cfset retVal = throw(loadImage.errorMessage)>
+ <cfreturn retVal>
+ </cfif>
+ <cfelse>
+ <cfset srcImage = objImage>
+ </cfif>
+ <cfif srcImage.getType() eq 0>
+ <cfset srcImage = convertImageObject(srcImage,srcImage.TYPE_3BYTE_BGR)>
+ </cfif>
+
+ <cfscript>
+
+ // initialize the blur filter
+ variables.blurFilter.init(arguments.blurAmount);
+ // move the source image into the destination image
+ // so we can repeatedly blur it.
+ destImage = srcImage;
+
+ for (i=1; i lte iterations; i=i+1)
+ {
+ // do the blur i times
+ destImage = variables.blurFilter.filter(destImage);
+ }
+
+
+ if (outputFile eq "")
+ {
+ // return the image object
+ retVal.img = destImage;
+ return retVal;
+ } else {
+ // write the image object to the specified file.
+ saveImage = writeImage(outputFile, destImage, jpegCompression);
+ if (saveImage.errorCode gt 0)
+ {
+ return saveImage;
+ } else {
+ return retVal;
+ }
+ }
+ </cfscript>
+</cffunction>
+
+<cffunction name="filterSharpen" access="public" output="true" returntype="struct" hint="Internal method used for flipping and flopping images.">
+ <cfargument name="objImage" required="yes" type="Any">
+ <cfargument name="inputFile" required="yes" type="string">
+ <cfargument name="outputFile" required="yes" type="string">
+ <cfargument name="jpegCompression" required="no" type="numeric" default="#variables.defaultJpegCompression#">
+
+ <cfset var retVal = StructNew()>
+ <cfset var loadImage = StructNew()>
+ <cfset var saveImage = StructNew()>
+ <cfset var srcImage = "">
+ <cfset var destImage = "">
+ <cfset var rh = getRenderingHints()>
+
+ <cfset retVal.errorCode = 0>
+ <cfset retVal.errorMessage = "">
+
+ <cfif NOT variables.javanulls>
+ <cfset throw("Sorry, but the blur filter is not supported on this platform.")>
+ </cfif>
+
+ <cfif inputFile neq "">
+ <cfset loadImage = readImage(inputFile, "NO")>
+ <cfif loadImage.errorCode is 0>
+ <cfset srcImage = loadImage.img>
+ <cfelse>
+ <cfset retVal = throw(loadImage.errorMessage)>
+ <cfreturn retVal>
+ </cfif>
+ <cfelse>
+ <cfset srcImage = objImage>
+ </cfif>
+ <cfif srcImage.getType() eq 0>
+ <cfset srcImage = convertImageObject(srcImage,srcImage.TYPE_3BYTE_BGR)>
+ </cfif>
+
+ <cfscript>
+ // initialize the sharpen filter
+ variables.sharpenFilter.init();
+
+ destImage = variables.sharpenFilter.filter(srcImage);
+
+
+ if (outputFile eq "")
+ {
+ // return the image object
+ retVal.img = destImage;
+ return retVal;
+ } else {
+ // write the image object to the specified file.
+ saveImage = writeImage(outputFile, destImage, jpegCompression);
+ if (saveImage.errorCode gt 0)
+ {
+ return saveImage;
+ } else {
+ return retVal;
+ }
+ }
+ </cfscript>
+</cffunction>
+
+
+<cffunction name="filterPosterize" access="public" output="true" returntype="struct" hint="Internal method used for flipping and flopping images.">
+ <cfargument name="objImage" required="yes" type="Any">
+ <cfargument name="inputFile" required="yes" type="string">
+ <cfargument name="outputFile" required="yes" type="string">
+ <cfargument name="amount" required="yes" type="string">
+ <cfargument name="jpegCompression" required="no" type="numeric" default="#variables.defaultJpegCompression#">
+
+ <cfset var retVal = StructNew()>
+ <cfset var loadImage = StructNew()>
+ <cfset var saveImage = StructNew()>
+ <cfset var srcImage = "">
+ <cfset var destImage = "">
+ <cfset var rh = getRenderingHints()>
+
+ <cfset retVal.errorCode = 0>
+ <cfset retVal.errorMessage = "">
+
+ <cfif NOT variables.javanulls>
+ <cfset throw("Sorry, but the blur filter is not supported on this platform.")>
+ </cfif>
+
+ <cfif inputFile neq "">
+ <cfset loadImage = readImage(inputFile, "NO")>
+ <cfif loadImage.errorCode is 0>
+ <cfset srcImage = loadImage.img>
+ <cfelse>
+ <cfset retVal = throw(loadImage.errorMessage)>
+ <cfreturn retVal>
+ </cfif>
+ <cfelse>
+ <cfset srcImage = objImage>
+ </cfif>
+ <cfif srcImage.getType() eq 0>
+ <cfset srcImage = convertImageObject(srcImage,srcImage.TYPE_3BYTE_BGR)>
+ </cfif>
+ <cfif srcImage.getType() neq 5>
+ <cfset throw("ImageCFC cannot posterize this image type (#srcImage.getType()#)")>
+ </cfif>
+ <cfscript>
+ // initialize the posterize filter
+ variables.posterizeFilter.init(arguments.amount);
+
+ destImage = variables.posterizeFilter.filter(srcImage);
+
+
+ if (outputFile eq "")
+ {
+ // return the image object
+ retVal.img = destImage;
+ return retVal;
+ } else {
+ // write the image object to the specified file.
+ saveImage = writeImage(outputFile, destImage, jpegCompression);
+ if (saveImage.errorCode gt 0)
+ {
+ return saveImage;
+ } else {
+ return retVal;
+ }
+ }
+ </cfscript>
+</cffunction>
+
+
+<cffunction name="addText" access="public" output="true" returntype="struct" hint="Add text to an image.">
+ <cfargument name="objImage" required="yes" type="Any">
+ <cfargument name="inputFile" required="yes" type="string">
+ <cfargument name="outputFile" required="yes" type="string">
+ <cfargument name="x" required="yes" type="numeric">
+ <cfargument name="y" required="yes" type="numeric">
+ <cfargument name="fontDetails" required="yes" type="struct">
+ <cfargument name="content" required="yes" type="String">
+ <cfargument name="jpegCompression" required="no" type="numeric" default="#variables.defaultJpegCompression#">
+
+ <cfset var retVal = StructNew()>
+ <cfset var loadImage = StructNew()>
+ <cfset var img = "">
+ <cfset var saveImage = StructNew()>
+ <cfset var g2d = "">
+ <cfset var bgImage = "">
+ <cfset var fontImage = "">
+ <cfset var overlayImage = "">
+ <cfset var Color = "">
+ <cfset var font = "">
+ <cfset var font_stream = "">
+ <cfset var ac = "">
+ <cfset var rgb = "">
+
+ <cfset retVal.errorCode = 0>
+ <cfset retVal.errorMessage = "">
+
+ <cfparam name="arguments.fontDetails.size" default="12">
+ <cfparam name="arguments.fontDetails.color" default="black">
+ <cfparam name="arguments.fontDetails.fontFile" default="">
+ <cfparam name="arguments.fontDetails.fontName" default="serif">
+
+ <cfif arguments.fontDetails.fontFile neq "" and not fileExists(arguments.fontDetails.fontFile)>
+ <cfset retVal = throw("The specified font file #Chr(34)##arguments.inputFile##Chr(34)# could not be found on the server.")>
+ <cfreturn retVal>
+ </cfif>
+ <cftry>
+ <cfset rgb = getRGB(arguments.fontDetails.color)>
+ <cfcatch type="any">
+ <cfset retVal = throw("Invalid color #Chr(34)##arguments.fontDetails.color##Chr(34)#")>
+ <cfreturn retVal>
+ </cfcatch>
+ </cftry>
+ <cfif inputFile neq "">
+ <cfset loadImage = readImage(inputFile, "NO")>
+ <cfif loadImage.errorCode is 0>
+ <cfset img = loadImage.img>
+ <cfelse>
+ <cfset retVal = throw(loadImage.errorMessage)>
+ <cfreturn retVal>
+ </cfif>
+ <cfelse>
+ <cfset img = objImage>
+ </cfif>
+ <cfif img.getType() eq 0>
+ <cfset img = convertImageObject(img,img.TYPE_3BYTE_BGR)>
+ </cfif>
+ <cfscript>
+ // load objects
+ bgImage = CreateObject("java", "java.awt.image.BufferedImage");
+ fontImage = CreateObject("java", "java.awt.image.BufferedImage");
+ overlayImage = CreateObject("java", "java.awt.image.BufferedImage");
+ Color = CreateObject("java","java.awt.Color");
+ font = createObject("java","java.awt.Font");
+ font_stream = createObject("java","java.io.FileInputStream");
+ ac = CreateObject("Java", "java.awt.AlphaComposite");
+
+ // set up basic needs
+ fontColor = Color.init(javacast("int", rgb.red), javacast("int", rgb.green), javacast("int", rgb.blue));
+
+ if (fontDetails.fontFile neq "")
+ {
+ font_stream.init(arguments.fontDetails.fontFile);
+ font = font.createFont(font.TRUETYPE_FONT, font_stream);
+ font = font.deriveFont(javacast("float",arguments.fontDetails.size));
+ } else {
+ font.init(fontDetails.fontName, evaluate(fontDetails.style), fontDetails.size);
+ }
+ // get font metrics using a 1x1 bufferedImage
+ fontImage.init(1,1,img.getType());
+ g2 = fontImage.createGraphics();
+ g2.setRenderingHints(getRenderingHints());
+ fc = g2.getFontRenderContext();
+ bounds = font.getStringBounds(content,fc);
+
+ g2 = img.createGraphics();
+ g2.setRenderingHints(getRenderingHints());
+ g2.setFont(font);
+ g2.setColor(fontColor);
+ // in case you want to change the alpha
+ // g2.setComposite(ac.getInstance(ac.SRC_OVER, 0.50));
+
+ // the location (arguments.fontDetails.size+y) doesn't really work
+ // the way I want it to.
+ g2.drawString(content,javacast("int",x),javacast("int",arguments.fontDetails.size+y));
+
+ if (outputFile eq "")
+ {
+ retVal.img = img;
+ return retVal;
+ } else {
+ saveImage = writeImage(outputFile, img, jpegCompression);
+ if (saveImage.errorCode gt 0)
+ {
+ return saveImage;
+ } else {
+ return retVal;
+ }
+ }
+ </cfscript>
+</cffunction>
+
+<cffunction name="watermark" access="public" output="false">
+ <cfargument name="objImage1" required="yes" type="Any">
+ <cfargument name="objImage2" required="yes" type="Any">
+ <cfargument name="inputFile1" required="yes" type="string">
+ <cfargument name="inputFile2" required="yes" type="string">
+ <cfargument name="alpha" required="yes" type="numeric">
+ <cfargument name="placeAtX" required="yes" type="numeric">
+ <cfargument name="placeAtY" required="yes" type="numeric">
+ <cfargument name="outputFile" required="yes" type="string">
+ <cfargument name="jpegCompression" required="no" type="numeric" default="#variables.defaultJpegCompression#">
+
+ <cfset var retVal = StructNew()>
+ <cfset var loadImage = StructNew()>
+ <cfset var originalImage = "">
+ <cfset var wmImage = "">
+ <cfset var saveImage = StructNew()>
+ <cfset var ac = "">
+ <cfset var rh = getRenderingHints()>
+
+ <cfset retVal.errorCode = 0>
+ <cfset retVal.errorMessage = "">
+
+ <cfif inputFile1 neq "">
+ <cfset loadImage = readImage(inputFile1, "NO")>
+ <cfif loadImage.errorCode is 0>
+ <cfset originalImage = loadImage.img>
+ <cfelse>
+ <cfset retVal = throw(loadImage.errorMessage)>
+ <cfreturn retVal>
+ </cfif>
+ <cfelse>
+ <cfset originalImage = objImage1>
+ </cfif>
+ <cfif originalImage.getType() eq 0>
+ <cfset originalImage = convertImageObject(originalImage,originalImage.TYPE_3BYTE_BGR)>
+ </cfif>
+
+ <cfif inputFile2 neq "">
+ <cfset loadImage = readImage(inputFile2, "NO")>
+ <cfif loadImage.errorCode is 0>
+ <cfset wmImage = loadImage.img>
+ <cfelse>
+ <cfset retVal = throw(loadImage.errorMessage)>
+ <cfreturn retVal>
+ </cfif>
+ <cfelse>
+ <cfset wmImage = objImage2>
+ </cfif>
+ <cfif wmImage.getType() eq 0>
+ <cfset wmImage = convertImageObject(wmImage,wmImage.TYPE_3BYTE_BGR)>
+ </cfif>
+
+
+ <cfscript>
+ at = CreateObject("java", "java.awt.geom.AffineTransform");
+ op = CreateObject("java", "java.awt.image.AffineTransformOp");
+ ac = CreateObject("Java", "java.awt.AlphaComposite");
+ gfx = originalImage.getGraphics();
+ gfx.setComposite(ac.getInstance(ac.SRC_OVER, alpha));
+
+ at.init();
+ // op.init(at,op.TYPE_BILINEAR);
+ op.init(at, rh);
+
+ gfx.drawImage(wmImage, op, javaCast("int",arguments.placeAtX), javacast("int", arguments.placeAtY));
+
+ gfx.dispose();
+
+ if (outputFile eq "")
+ {
+ retVal.img = originalImage;
+ return retVal;
+ } else {
+ saveImage = writeImage(outputFile, originalImage, jpegCompression);
+ if (saveImage.errorCode gt 0)
+ {
+ return saveImage;
+ } else {
+ return retVal;
+ }
+ }
+ </cfscript>
+</cffunction>
+
+<cffunction name="isURL" access="private" output="false" returnType="boolean">
+ <cfargument name="stringToCheck" required="yes" type="string">
+ <cfif REFindNoCase("^(((https?:)\/\/))[-[:alnum:]\?%,\.\/&##!@:=\+~_]+[A-Za-z0-9\/]$",stringToCheck) NEQ 0>
+ <cfreturn true>
+ <cfelse>
+ <cfreturn false>
+ </cfif>
+</cffunction>
+
+<!--- function returns RGB values in a structure for hex or the 16
+ HTML named colors --->
+<cffunction name="getRGB" access="private" output="true" returnType="struct">
+ <cfargument name="color" type="string" required="yes">
+
+ <cfset var retVal = structNew()>
+ <cfset var cnt = 0>
+ <cfset var namedColors = "aqua,black,blue,fuchsia,gray,green,lime,maroon,navy,olive,purple,red,silver,teal,white,yellow">
+ <cfset var namedColorsHexValues = "00ffff,000000,0000ff,ff00ff,808080,008000,00ff00,800000,000080,808080,ff0000,c0c0c0,008080,ffffff,ffff00">
+
+ <cfset retVal.red = 0>
+ <cfset retVal.green = 0>
+ <cfset retVal.blue = 0>
+
+ <cfset arguments.color = trim(arguments.color)>
+ <cfif len(arguments.color) is 0>
+ <cfreturn retVal>
+ <cfelseif listFind(namedColors, arguments.color) gt 0>
+ <cfset arguments.color = listGetAt(namedColorsHexValues, listFind(namedColors, arguments.color))>
+ </cfif>
+ <cfif left(arguments.color,1) eq "##">
+ <cfset arguments.color = right(arguments.color,len(arguments.color)-1)>
+ </cfif>
+ <cfif len(arguments.color) neq 6>
+ <cfreturn retVal>
+ <cfelse>
+ <cftry>
+ <cfset retVal.red = InputBaseN(mid(arguments.color,1,2),16)>
+ <cfset retVal.green = InputBaseN(mid(arguments.color,3,2),16)>
+ <cfset retVal.blue = InputBaseN(mid(arguments.color,5,2),16)>
+ <cfcatch type="any">
+ <cfset retVal.red = 0>
+ <cfset retVal.green = 0>
+ <cfset retVal.blue = 0>
+ <cfreturn retVal>
+ </cfcatch>
+ </cftry>
+ </cfif>
+ <cfreturn retVal>
+</cffunction>
+
+<cffunction name="throw" access="private" output="false" returnType="struct">
+ <cfargument name="detail" type="string" required="yes">
+ <cfargument name="force" type="boolean" required="no" default="no">
+
+ <cfset var retVal = StructNew()>
+
+ <cfif variables.throwOnError or arguments.force>
+ <cfthrow detail="#arguments.detail#" message="#arguments.detail#">
+ <cfelse>
+ <cfset retVal.errorCode = 1>
+ <cfset retVal.errorMessage = arguments.detail>
+ <cfreturn retVal>
+ </cfif>
+</cffunction>
+
+<cffunction name="debugDump" access="private">
+ <cfdump var="#arguments#"><cfabort>
+</cffunction>
+
+<cffunction name="convertImageObject" access="private" output="false" returnType="any">
+ <cfargument name="bImage" type="Any" required="yes">
+ <cfargument name="type" type="numeric" required="yes">
+
+ <cfscript>
+ // convert the image to a specified BufferedImage type and return it
+
+ var width = bImage.getWidth();
+ var height = bImage.getHeight();
+ var newImage = createObject("java","java.awt.image.BufferedImage").init(javacast("int",width), javacast("int",height), javacast("int",type));
+ // int[] rgbArray = new int[width*height];
+ var rgbArray = variables.arrObj.newInstance(variables.intClass, javacast("int",width*height));
+
+ bImage.getRGB(
+ javacast("int",0),
+ javacast("int",0),
+ javacast("int",width),
+ javacast("int",height),
+ rgbArray,
+ javacast("int",0),
+ javacast("int",width)
+ );
+ newImage.setRGB(
+ javacast("int",0),
+ javacast("int",0),
+ javacast("int",width),
+ javacast("int",height),
+ rgbArray,
+ javacast("int",0),
+ javacast("int",width)
+ );
+ return newImage;
+ </cfscript>
+
+</cffunction>
+
+</cfcomponent>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/upload.cfm
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/cfm/upload.cfm Thu Aug 28 18:47:59 2008
@@ -0,0 +1,31 @@
+<cfsetting enablecfoutputonly="Yes">
+<!---
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This is the "File Uploader" for ColdFusion (all versions).
+ *
+--->
+
+<cfset REQUEST.CFVersion = Left( SERVER.COLDFUSION.PRODUCTVERSION, Find( ",", SERVER.COLDFUSION.PRODUCTVERSION ) - 1 )>
+<cfif REQUEST.CFVersion lte 5>
+ <cfinclude template="cf5_upload.cfm">
+<cfelse>
+ <cfinclude template="cf_upload.cfm">
+</cfif>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/lasso/config.lasso
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/lasso/config.lasso Thu Aug 28 18:47:59 2008
@@ -0,0 +1,65 @@
+[//lasso
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Configuration file for the File Manager Connector for Lasso.
+ */
+
+ /*.....................................................................
+ The connector uses the file tags, which require authentication. Enter a
+ valid username and password from Lasso admin for a group with file tags
+ permissions for uploads and the path you define in UserFilesPath below.
+ */
+
+ var('connection') = array(
+ -username='xxxxxxxx',
+ -password='xxxxxxxx'
+ );
+
+
+ /*.....................................................................
+ Set the base path for files that users can upload and browse (relative
+ to server root).
+
+ Set which file extensions are allowed and/or denied for each file type.
+ */
+ var('config') = map(
+ 'Enabled' = false,
+ 'UserFilesPath' = '/userfiles/',
+ 'Subdirectories' = map(
+ 'File' = 'File/',
+ 'Image' = 'Image/',
+ 'Flash' = 'Flash/',
+ 'Media' = 'Media/'
+ ),
+ 'AllowedExtensions' = map(
+ 'File' = array('7z','aiff','asf','avi','bmp','csv','doc','fla','flv','gif','gz','gzip','jpeg','jpg','mid','mov','mp3','mp4','mpc','mpeg','mpg','ods','odt','pdf','png','ppt','pxd','qt','ram','rar','rm','rmi','rmvb','rtf','sdc','sitd','swf','sxc','sxw','tar','tgz','tif','tiff','txt','vsd','wav','wma','wmv','xls','xml','zip'),
+ 'Image' = array('bmp','gif','jpeg','jpg','png'),
+ 'Flash' = array('swf','flv'),
+ 'Media' = array('aiff','asf','avi','bmp','fla','flv','gif','jpeg','jpg','mid','mov','mp3','mp4','mpc','mpeg','mpg','png','qt','ram','rm','rmi','rmvb','swf','tif','tiff','wav','wma','wmv')
+ ),
+ 'DeniedExtensions' = map(
+ 'File' = array(),
+ 'Image' = array(),
+ 'Flash' = array(),
+ 'Media' = array()
+ )
+ );
+]
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/lasso/connector.lasso
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/lasso/connector.lasso Thu Aug 28 18:47:59 2008
@@ -0,0 +1,322 @@
+[//lasso
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This is the File Manager Connector for Lasso.
+ */
+
+ /*.....................................................................
+ Include global configuration. See config.lasso for details.
+ */
+ include('config.lasso');
+
+
+ /*.....................................................................
+ Translate current date/time to GMT for custom header.
+ */
+ var('headerDate') = date_localtogmt(date)->format('%a, %d %b %Y %T GMT');
+
+
+ /*.....................................................................
+ Convert query string parameters to variables and initialize output.
+ */
+ var(
+ 'Command' = action_param('Command'),
+ 'Type' = action_param('Type'),
+ 'CurrentFolder' = action_param('CurrentFolder'),
+ 'ServerPath' = action_param('ServerPath'),
+ 'NewFolderName' = action_param('NewFolderName'),
+ 'NewFile' = null,
+ 'NewFileName' = string,
+ 'OrigFilePath' = string,
+ 'NewFilePath' = string,
+ 'commandData' = string,
+ 'folders' = '\t<Folders>\n',
+ 'files' = '\t<Files>\n',
+ 'errorNumber' = integer,
+ 'responseType' = 'xml',
+ 'uploadResult' = '0'
+ );
+
+ /*.....................................................................
+ Custom tag sets the HTML response.
+ */
+
+ define_tag(
+ 'htmlreply',
+ -namespace='fck_',
+ -priority='replace',
+ -required='uploadResult',
+ -optional='NewFilePath',
+ -type='string',
+ -description='Sets the HTML response for the FCKEditor File Upload feature.'
+ );
+ $__html_reply__ = '\
+<script type="text/javascript">
+(function()
+{
+ var d = document.domain ;
+
+ while ( true )
+ {
+ // Test if we can access a parent property.
+ try
+ {
+ var test = window.top.opener.document.domain ;
+ break ;
+ }
+ catch( e ) {}
+
+ // Remove a domain part: www.mytest.example.com => mytest.example.com => example.com ...
+ d = d.replace( /.*?(?:\\.|$)/, "" ) ;
+
+ if ( d.length == 0 )
+ break ; // It was not able to detect the domain.
+
+ try
+ {
+ document.domain = d ;
+ }
+ catch (e)
+ {
+ break ;
+ }
+ }
+})() ;
+';
+ if($uploadResult == '0' || $uploadResult == '201');
+ $__html_reply__ = $__html_reply__ + '\
+ window.parent.OnUploadCompleted(' + $uploadResult + ',\'' + $NewFilePath + '\',\'' + $NewFilePath->split('/')->last + '\');
+</script>
+ ';
+ else;
+ $__html_reply__ = $__html_reply__ + '\
+ window.parent.OnUploadCompleted(' + $uploadResult + ');
+</script>
+ ';
+ /if;
+ /define_tag;
+
+
+ /*.....................................................................
+ Calculate the path to the current folder.
+ */
+ $ServerPath == '' ? $ServerPath = $config->find('UserFilesPath');
+
+ var('currentFolderURL' = $ServerPath
+ + $config->find('Subdirectories')->find(action_param('Type'))
+ + $CurrentFolder
+ );
+
+ if($CurrentFolder->(Find: '..') || $CurrentFolder->(Find: '\\'));
+ if($Command == 'FileUpload');
+ $responseType = 'html';
+ $uploadResult = '102';
+ fck_htmlreply(
+ -uploadResult=$uploadResult
+ );
+ else;
+ $errorNumber = 102;
+ $commandData += '<Error number="' + $errorNumber + '" />\n';
+ /if;
+ else;
+
+ /*.....................................................................
+ Build the appropriate response per the 'Command' parameter. Wrap the
+ entire process in an inline for file tag permissions.
+ */
+ inline($connection);
+ select($Command);
+ /*.............................................................
+ List all subdirectories in the 'Current Folder' directory.
+ */
+ case('GetFolders');
+ $commandData += '\t<Folders>\n';
+
+ iterate(file_listdirectory($currentFolderURL), local('this'));
+ #this->endswith('/') ? $commandData += '\t\t<Folder name="' + #this->removetrailing('/')& + '" />\n';
+ /iterate;
+
+ $commandData += '\t</Folders>\n';
+
+
+ /*.............................................................
+ List both files and folders in the 'Current Folder' directory.
+ Include the file sizes in kilobytes.
+ */
+ case('GetFoldersAndFiles');
+ iterate(file_listdirectory($currentFolderURL), local('this'));
+ if(#this->endswith('/'));
+ $folders += '\t\t<Folder name="' + #this->removetrailing('/')& + '" />\n';
+ else;
+ local('size') = file_getsize($currentFolderURL + #this) / 1024;
+ $files += '\t\t<File name="' + #this + '" size="' + #size + '" />\n';
+ /if;
+ /iterate;
+
+ $folders += '\t</Folders>\n';
+ $files += '\t</Files>\n';
+
+ $commandData += $folders + $files;
+
+
+ /*.............................................................
+ Create a directory 'NewFolderName' within the 'Current Folder.'
+ */
+ case('CreateFolder');
+ $NewFolderName = (String_ReplaceRegExp: $NewFolderName, -find='\\.|\\\\|\\/|\\||\\:|\\?|\\*|"|<|>', -replace='_');
+ var('newFolder' = $currentFolderURL + $NewFolderName + '/');
+ file_create($newFolder);
+
+
+ /*.........................................................
+ Map Lasso's file error codes to FCKEditor's error codes.
+ */
+ select(file_currenterror( -errorcode));
+ case(0);
+ $errorNumber = 0;
+ case( -9983);
+ $errorNumber = 101;
+ case( -9976);
+ $errorNumber = 102;
+ case( -9977);
+ $errorNumber = 102;
+ case( -9961);
+ $errorNumber = 103;
+ case;
+ $errorNumber = 110;
+ /select;
+
+ $commandData += '<Error number="' + $errorNumber + '" />\n';
+
+
+ /*.............................................................
+ Process an uploaded file.
+ */
+ case('FileUpload');
+ /*.........................................................
+ This is the only command that returns an HTML response.
+ */
+ $responseType = 'html';
+
+
+ /*.........................................................
+ Was a file actually uploaded?
+ */
+ if(file_uploads->size);
+ $NewFile = file_uploads->get(1);
+ else;
+ $uploadResult = '202';
+ /if;
+
+ if($uploadResult == '0');
+ /*.....................................................
+ Split the file's extension from the filename in order
+ to follow the API's naming convention for duplicate
+ files. (Test.txt, Test(1).txt, Test(2).txt, etc.)
+ */
+ $NewFileName = $NewFile->find('OrigName');
+ $NewFileName = (String_ReplaceRegExp: $NewFileName, -find='\\\\|\\/|\\||\\:|\\?|\\*|"|<|>', -replace='_');
+ $OrigFilePath = $currentFolderURL + $NewFileName;
+ $NewFilePath = $OrigFilePath;
+ local('fileExtension') = '.' + $NewFile->find('OrigExtension');
+ #fileExtension = (String_ReplaceRegExp: #fileExtension, -find='\\\\|\\/|\\||\\:|\\?|\\*|"|<|>', -replace='_');
+ local('shortFileName') = $NewFileName->removetrailing(#fileExtension)&;
+
+
+ /*.....................................................
+ Make sure the file extension is allowed.
+ */
+ if($config->find('DeniedExtensions')->find($Type) >> $NewFile->find('OrigExtension'));
+ $uploadResult = '202';
+ else;
+ /*.................................................
+ Rename the target path until it is unique.
+ */
+ while(file_exists($NewFilePath));
+ $NewFilePath = $currentFolderURL + #shortFileName + '(' + loop_count + ')' + #fileExtension;
+ /while;
+
+
+ /*.................................................
+ Copy the uploaded file to its final location.
+ */
+ file_copy($NewFile->find('path'), $NewFilePath);
+
+
+ /*.................................................
+ Set the error code for the response. Note whether
+ the file had to be renamed.
+ */
+ select(file_currenterror( -errorcode));
+ case(0);
+ $OrigFilePath != $NewFilePath ? $uploadResult = 201;
+ case;
+ $uploadResult = file_currenterror( -errorcode);
+ /select;
+ /if;
+ /if;
+ fck_htmlreply(
+ -uploadResult=$uploadResult,
+ -NewFilePath=$NewFilePath
+ );
+ /select;
+ /inline;
+ /if;
+
+ /*.....................................................................
+ Send a custom header for xml responses.
+ */
+ if($responseType == 'xml');
+ header;
+]
+HTTP/1.0 200 OK
+Date: [$headerDate]
+Server: Lasso Professional [lasso_version( -lassoversion)]
+Expires: Mon, 26 Jul 1997 05:00:00 GMT
+Last-Modified: [$headerDate]
+Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
+Pragma: no-cache
+Keep-Alive: timeout=15, max=98
+Connection: Keep-Alive
+Content-Type: text/xml; charset=utf-8
+[//lasso
+/header;
+
+ /*
+ Set the content type encoding for Lasso.
+ */
+ content_type('text/xml; charset=utf-8');
+
+ /*
+ Wrap the response as XML and output.
+ */
+ $__html_reply__ = '\
+<?xml version="1.0" encoding="utf-8" ?>
+<Connector command="' + $Command + '" resourceType="' + $Type + '">';
+
+ if($errorNumber != '102');
+ $__html_reply__ += '<CurrentFolder path="' + $CurrentFolder + '" url="' + $currentFolderURL + '" />';
+ /if;
+
+ $__html_reply__ += $commandData + '
+</Connector>';
+ /if;
+]
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/lasso/upload.lasso
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/lasso/upload.lasso Thu Aug 28 18:47:59 2008
@@ -0,0 +1,168 @@
+[//lasso
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This is the "File Uploader" for Lasso.
+ */
+
+ /*.....................................................................
+ Include global configuration. See config.lasso for details.
+ */
+ include('config.lasso');
+
+
+ /*.....................................................................
+ Convert query string parameters to variables and initialize output.
+ */
+ var(
+ 'Type' = action_param('Type'),
+ 'CurrentFolder' = action_param('CurrentFolder'),
+ 'ServerPath' = action_param('ServerPath'),
+ 'NewFile' = null,
+ 'NewFileName' = string,
+ 'OrigFilePath' = string,
+ 'NewFilePath' = string,
+ 'errorNumber' = 0,
+ 'customMsg' = ''
+ );
+
+ $Type == '' ? $Type = 'File';
+
+
+ /*.....................................................................
+ Calculate the path to the current folder.
+ */
+ $ServerPath == '' ? $ServerPath = $config->find('UserFilesPath');
+
+ var('currentFolderURL' = $ServerPath
+ + $config->find('Subdirectories')->find(action_param('Type'))
+ + action_param('CurrentFolder')
+ );
+
+ /*.....................................................................
+ Custom tag sets the HTML response.
+ */
+
+ define_tag(
+ 'sendresults',
+ -namespace='fck_',
+ -priority='replace',
+ -required='errorNumber',
+ -type='integer',
+ -optional='fileUrl',
+ -type='string',
+ -optional='fileName',
+ -type='string',
+ -optional='customMsg',
+ -type='string',
+ -description='Sets the HTML response for the FCKEditor Quick Upload feature.'
+ );
+
+ $__html_reply__ = '<script type="text/javascript">';
+
+ // Minified version of the document.domain automatic fix script (#1919).
+ // The original script can be found at _dev/domain_fix_template.js
+ // Note: in Lasso replace \ with \\
+ $__html_reply__ = $__html_reply__ + "(function(){var d=document.domain;while (true){try{var A=window.parent.document.domain;break;}catch(e) {};d=d.replace(/.*?(?:\\.|$)/,'');if (d.length==0) break;try{document.domain=d;}catch (e){break;}}})();";
+
+ $__html_reply__ = $__html_reply__ + '\
+ window.parent.OnUploadCompleted(' + #errorNumber + ',"'
+ + string_replace(#fileUrl, -find='"', -replace='\\"') + '","'
+ + string_replace(#fileName, -find='"', -replace='\\"') + '","'
+ + string_replace(#customMsg, -find='"', -replace='\\"') + '");
+</script>
+ ';
+ /define_tag;
+
+ if($CurrentFolder->(Find: '..') || $CurrentFolder->(Find: '\\'));
+ $errorNumber = 102;
+ /if;
+
+ if($config->find('Enabled'));
+ /*.................................................................
+ Process an uploaded file.
+ */
+ inline($connection);
+ /*.............................................................
+ Was a file actually uploaded?
+ */
+ if($errorNumber != '102');
+ file_uploads->size ? $NewFile = file_uploads->get(1) | $errorNumber = 202;
+ /if;
+
+ if($errorNumber == 0);
+ /*.........................................................
+ Split the file's extension from the filename in order
+ to follow the API's naming convention for duplicate
+ files. (Test.txt, Test(1).txt, Test(2).txt, etc.)
+ */
+ $NewFileName = $NewFile->find('OrigName');
+ $OrigFilePath = $currentFolderURL + $NewFileName;
+ $NewFilePath = $OrigFilePath;
+ local('fileExtension') = '.' + $NewFile->find('OrigExtension');
+ local('shortFileName') = $NewFileName->removetrailing(#fileExtension)&;
+
+
+ /*.........................................................
+ Make sure the file extension is allowed.
+ */
+
+ if($config->find('DeniedExtensions')->find($Type) >> $NewFile->find('OrigExtension'));
+ $errorNumber = 202;
+ else;
+ /*.....................................................
+ Rename the target path until it is unique.
+ */
+ while(file_exists($NewFilePath));
+ $NewFileName = #shortFileName + '(' + loop_count + ')' + #fileExtension;
+ $NewFilePath = $currentFolderURL + $NewFileName;
+ /while;
+
+
+ /*.....................................................
+ Copy the uploaded file to its final location.
+ */
+ file_copy($NewFile->find('path'), $NewFilePath);
+
+
+ /*.....................................................
+ Set the error code for the response.
+ */
+ select(file_currenterror( -errorcode));
+ case(0);
+ $OrigFilePath != $NewFilePath ? $errorNumber = 201;
+ case;
+ $errorNumber = 202;
+ /select;
+ /if;
+ /if;
+ /inline;
+ else;
+ $errorNumber = 1;
+ $customMsg = 'This file uploader is disabled. Please check the "editor/filemanager/upload/lasso/config.lasso" file.';
+ /if;
+
+ fck_sendresults(
+ -errorNumber=$errorNumber,
+ -fileUrl=$NewFilePath,
+ -fileName=$NewFileName,
+ -customMsg=$customMsg
+ );
+]
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/basexml.pl
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/basexml.pl Thu Aug 28 18:47:59 2008
@@ -0,0 +1,63 @@
+#####
+# FCKeditor - The text editor for Internet - http://www.fckeditor.net
+# Copyright (C) 2003-2008 Frederico Caldeira Knabben
+#
+# == BEGIN LICENSE ==
+#
+# Licensed under the terms of any of the following licenses at your
+# choice:
+#
+# - GNU General Public License Version 2 or later (the "GPL")
+# http://www.gnu.org/licenses/gpl.html
+#
+# - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+# http://www.gnu.org/licenses/lgpl.html
+#
+# - Mozilla Public License Version 1.1 or later (the "MPL")
+# http://www.mozilla.org/MPL/MPL-1.1.html
+#
+# == END LICENSE ==
+#
+# This is the File Manager Connector for Perl.
+#####
+
+sub CreateXmlHeader
+{
+ local($command,$resourceType,$currentFolder) = @_;
+
+ # Create the XML document header.
+ print '<?xml version="1.0" encoding="utf-8" ?>';
+
+ # Create the main "Connector" node.
+ print '<Connector command="' . $command . '" resourceType="' . $resourceType . '">';
+
+ # Add the current folder node.
+ print '<CurrentFolder path="' . ConvertToXmlAttribute($currentFolder) . '" url="' . ConvertToXmlAttribute(GetUrlFromPath($resourceType,$currentFolder)) . '" />';
+}
+
+sub CreateXmlFooter
+{
+ print '</Connector>';
+}
+
+sub SendError
+{
+ local( $number, $text ) = @_;
+
+ print << "_HTML_HEAD_";
+Content-Type:text/xml; charset=utf-8
+Pragma: no-cache
+Cache-Control: no-cache
+Expires: Thu, 01 Dec 1994 16:00:00 GMT
+
+_HTML_HEAD_
+
+ # Create the XML document header
+ print '<?xml version="1.0" encoding="utf-8" ?>' ;
+
+ print '<Connector><Error number="' . $number . '" text="' . &specialchar_cnv( $text ) . '" /></Connector>' ;
+
+ exit ;
+}
+
+1;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/commands.pl
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/commands.pl Thu Aug 28 18:47:59 2008
@@ -0,0 +1,187 @@
+#####
+# FCKeditor - The text editor for Internet - http://www.fckeditor.net
+# Copyright (C) 2003-2008 Frederico Caldeira Knabben
+#
+# == BEGIN LICENSE ==
+#
+# Licensed under the terms of any of the following licenses at your
+# choice:
+#
+# - GNU General Public License Version 2 or later (the "GPL")
+# http://www.gnu.org/licenses/gpl.html
+#
+# - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+# http://www.gnu.org/licenses/lgpl.html
+#
+# - Mozilla Public License Version 1.1 or later (the "MPL")
+# http://www.mozilla.org/MPL/MPL-1.1.html
+#
+# == END LICENSE ==
+#
+# This is the File Manager Connector for Perl.
+#####
+
+sub GetFolders
+{
+
+ local($resourceType, $currentFolder) = @_;
+
+ # Map the virtual path to the local server path.
+ $sServerDir = &ServerMapFolder($resourceType, $currentFolder);
+ print "<Folders>"; # Open the "Folders" node.
+
+ opendir(DIR,"$sServerDir");
+ @files = grep(!/^\.\.?$/,readdir(DIR));
+ closedir(DIR);
+
+ foreach $sFile (@files) {
+ if($sFile != '.' && $sFile != '..' && (-d "$sServerDir$sFile")) {
+ $cnv_filename = &ConvertToXmlAttribute($sFile);
+ print '<Folder name="' . $cnv_filename . '" />';
+ }
+ }
+ print "</Folders>"; # Close the "Folders" node.
+}
+
+sub GetFoldersAndFiles
+{
+
+ local($resourceType, $currentFolder) = @_;
+ # Map the virtual path to the local server path.
+ $sServerDir = &ServerMapFolder($resourceType,$currentFolder);
+
+ # Initialize the output buffers for "Folders" and "Files".
+ $sFolders = '<Folders>';
+ $sFiles = '<Files>';
+
+ opendir(DIR,"$sServerDir");
+ @files = grep(!/^\.\.?$/,readdir(DIR));
+ closedir(DIR);
+
+ foreach $sFile (@files) {
+ if($sFile ne '.' && $sFile ne '..') {
+ if(-d "$sServerDir$sFile") {
+ $cnv_filename = &ConvertToXmlAttribute($sFile);
+ $sFolders .= '<Folder name="' . $cnv_filename . '" />' ;
+ } else {
+ ($iFileSize,$refdate,$filedate,$fileperm) = (stat("$sServerDir$sFile"))[7,8,9,2];
+ if($iFileSize > 0) {
+ $iFileSize = int($iFileSize / 1024);
+ if($iFileSize < 1) {
+ $iFileSize = 1;
+ }
+ }
+ $cnv_filename = &ConvertToXmlAttribute($sFile);
+ $sFiles .= '<File name="' . $cnv_filename . '" size="' . $iFileSize . '" />' ;
+ }
+ }
+ }
+ print $sFolders ;
+ print '</Folders>'; # Close the "Folders" node.
+ print $sFiles ;
+ print '</Files>'; # Close the "Files" node.
+}
+
+sub CreateFolder
+{
+
+ local($resourceType, $currentFolder) = @_;
+ $sErrorNumber = '0' ;
+ $sErrorMsg = '' ;
+
+ if($FORM{'NewFolderName'} ne "") {
+ $sNewFolderName = $FORM{'NewFolderName'};
+ $sNewFolderName =~ s/\.|\\|\/|\||\:|\?|\*|\"|<|>|[[:cntrl:]]/_/g;
+ # Map the virtual path to the local server path of the current folder.
+ $sServerDir = &ServerMapFolder($resourceType, $currentFolder);
+ if(-w $sServerDir) {
+ $sServerDir .= $sNewFolderName;
+ $sErrorMsg = &CreateServerFolder($sServerDir);
+ if($sErrorMsg == 0) {
+ $sErrorNumber = '0';
+ } elsif($sErrorMsg eq 'Invalid argument' || $sErrorMsg eq 'No such file or directory') {
+ $sErrorNumber = '102'; #// Path too long.
+ } else {
+ $sErrorNumber = '110';
+ }
+ } else {
+ $sErrorNumber = '103';
+ }
+ } else {
+ $sErrorNumber = '102' ;
+ }
+ # Create the "Error" node.
+ $cnv_errmsg = &ConvertToXmlAttribute($sErrorMsg);
+ print '<Error number="' . $sErrorNumber . '" originalDescription="' . $cnv_errmsg . '" />';
+}
+
+sub FileUpload
+{
+eval("use File::Copy;");
+
+ local($resourceType, $currentFolder) = @_;
+
+ $sErrorNumber = '0' ;
+ $sFileName = '' ;
+ if($new_fname) {
+ # Map the virtual path to the local server path.
+ $sServerDir = &ServerMapFolder($resourceType,$currentFolder);
+
+ # Get the uploaded file name.
+ $sFileName = $new_fname;
+ $sFileName =~ s/\\|\/|\||\:|\?|\*|\"|<|>|[[:cntrl:]]/_/g;
+ $sOriginalFileName = $sFileName;
+
+ $iCounter = 0;
+ while(1) {
+ $sFilePath = $sServerDir . $sFileName;
+ if(-e $sFilePath) {
+ $iCounter++ ;
+ ($path,$BaseName,$ext) = &RemoveExtension($sOriginalFileName);
+ $sFileName = $BaseName . '(' . $iCounter . ').' . $ext;
+ $sErrorNumber = '201';
+ } else {
+ copy("$img_dir/$new_fname","$sFilePath");
+ if (defined $CHMOD_ON_UPLOAD) {
+ if ($CHMOD_ON_UPLOAD) {
+ umask(000);
+ chmod($CHMOD_ON_UPLOAD,$sFilePath);
+ }
+ }
+ else {
+ umask(000);
+ chmod(0777,$sFilePath);
+ }
+ unlink("$img_dir/$new_fname");
+ last;
+ }
+ }
+ } else {
+ $sErrorNumber = '202' ;
+ }
+ $sFileName =~ s/"/\\"/g;
+
+ SendUploadResults($sErrorNumber, $resourceType.$currentFolder.$sFileName, $sFileName, '');
+}
+
+sub SendUploadResults
+{
+
+ local($sErrorNumber, $sFileUrl, $sFileName, $customMsg) = @_;
+
+ # Minified version of the document.domain automatic fix script (#1919).
+ # The original script can be found at _dev/domain_fix_template.js
+ # Note: in Perl replace \ with \\ and $ with \$
+ print <<EOF;
+Content-type: text/html
+
+<script type="text/javascript">
+(function(){var d=document.domain;while (true){try{var A=window.parent.document.domain;break;}catch(e) {};d=d.replace(/.*?(?:\\.|\$)/,'');if (d.length==0) break;try{document.domain=d;}catch (e){break;}}})();
+
+EOF
+ print 'window.parent.OnUploadCompleted(' . $sErrorNumber . ',"' . JS_cnv($sFileUrl) . '","' . JS_cnv($sFileName) . '","' . JS_cnv($customMsg) . '") ;';
+ print '</script>';
+ exit ;
+}
+
+1;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/connector.cgi
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/connector.cgi Thu Aug 28 18:47:59 2008
@@ -0,0 +1,136 @@
+#!/usr/bin/env perl
+
+#####
+# FCKeditor - The text editor for Internet - http://www.fckeditor.net
+# Copyright (C) 2003-2008 Frederico Caldeira Knabben
+#
+# == BEGIN LICENSE ==
+#
+# Licensed under the terms of any of the following licenses at your
+# choice:
+#
+# - GNU General Public License Version 2 or later (the "GPL")
+# http://www.gnu.org/licenses/gpl.html
+#
+# - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+# http://www.gnu.org/licenses/lgpl.html
+#
+# - Mozilla Public License Version 1.1 or later (the "MPL")
+# http://www.mozilla.org/MPL/MPL-1.1.html
+#
+# == END LICENSE ==
+#
+# This is the File Manager Connector for Perl.
+#####
+
+##
+# ATTENTION: To enable this connector, look for the "SECURITY" comment in this file.
+##
+
+## START: Hack for Windows (Not important to understand the editor code... Perl specific).
+if(Windows_check()) {
+ chdir(GetScriptPath($0));
+}
+
+sub Windows_check
+{
+ # IIS,PWS(NT/95)
+ $www_server_os = $^O;
+ # Win98 & NT(SP4)
+ if($www_server_os eq "") { $www_server_os= $ENV{'OS'}; }
+ # AnHTTPd/Omni/IIS
+ if($ENV{'SERVER_SOFTWARE'} =~ /AnWeb|Omni|IIS\//i) { $www_server_os= 'win'; }
+ # Win Apache
+ if($ENV{'WINDIR'} ne "") { $www_server_os= 'win'; }
+ if($www_server_os=~ /win/i) { return(1); }
+ return(0);
+}
+
+sub GetScriptPath {
+ local($path) = @_;
+ if($path =~ /[\:\/\\]/) { $path =~ s/(.*?)[\/\\][^\/\\]+$/$1/; } else { $path = '.'; }
+ $path;
+}
+## END: Hack for IIS
+
+require 'util.pl';
+require 'io.pl';
+require 'basexml.pl';
+require 'commands.pl';
+require 'upload_fck.pl';
+
+##
+# SECURITY: REMOVE/COMMENT THE FOLLOWING LINE TO ENABLE THIS CONNECTOR.
+##
+ &SendError( 1, 'This connector is disabled. Please check the "editor/filemanager/connectors/perl/connector.cgi" file' ) ;
+
+ &read_input();
+
+ if($FORM{'ServerPath'} ne "") {
+ $GLOBALS{'UserFilesPath'} = $FORM{'ServerPath'};
+ if(!($GLOBALS{'UserFilesPath'} =~ /\/$/)) {
+ $GLOBALS{'UserFilesPath'} .= '/' ;
+ }
+ } else {
+ $GLOBALS{'UserFilesPath'} = '/userfiles/';
+ }
+
+ # Map the "UserFiles" path to a local directory.
+ $rootpath = &GetRootPath();
+ $GLOBALS{'UserFilesDirectory'} = $rootpath . $GLOBALS{'UserFilesPath'};
+
+ &DoResponse();
+
+sub DoResponse
+{
+
+ if($FORM{'Command'} eq "" || $FORM{'Type'} eq "" || $FORM{'CurrentFolder'} eq "") {
+ return ;
+ }
+ # Get the main request informaiton.
+ $sCommand = $FORM{'Command'};
+ $sResourceType = $FORM{'Type'};
+ $sCurrentFolder = $FORM{'CurrentFolder'};
+
+ # Check the current folder syntax (must begin and start with a slash).
+ if(!($sCurrentFolder =~ /\/$/)) {
+ $sCurrentFolder .= '/';
+ }
+ if(!($sCurrentFolder =~ /^\//)) {
+ $sCurrentFolder = '/' . $sCurrentFolder;
+ }
+
+ # Check for invalid folder paths (..)
+ if ( $sCurrentFolder =~ /(?:\.\.|\\)/ ) {
+ SendError( 102, "" ) ;
+ }
+
+ # File Upload doesn't have to Return XML, so it must be intercepted before anything.
+ if($sCommand eq 'FileUpload') {
+ FileUpload($sResourceType,$sCurrentFolder);
+ return ;
+ }
+
+ print << "_HTML_HEAD_";
+Content-Type:text/xml; charset=utf-8
+Pragma: no-cache
+Cache-Control: no-cache
+Expires: Thu, 01 Dec 1994 16:00:00 GMT
+
+_HTML_HEAD_
+
+ &CreateXmlHeader($sCommand,$sResourceType,$sCurrentFolder);
+
+ # Execute the required command.
+ if($sCommand eq 'GetFolders') {
+ &GetFolders($sResourceType,$sCurrentFolder);
+ } elsif($sCommand eq 'GetFoldersAndFiles') {
+ &GetFoldersAndFiles($sResourceType,$sCurrentFolder);
+ } elsif($sCommand eq 'CreateFolder') {
+ &CreateFolder($sResourceType,$sCurrentFolder);
+ }
+
+ &CreateXmlFooter();
+
+ exit ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/io.pl
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/io.pl Thu Aug 28 18:47:59 2008
@@ -0,0 +1,141 @@
+#####
+# FCKeditor - The text editor for Internet - http://www.fckeditor.net
+# Copyright (C) 2003-2008 Frederico Caldeira Knabben
+#
+# == BEGIN LICENSE ==
+#
+# Licensed under the terms of any of the following licenses at your
+# choice:
+#
+# - GNU General Public License Version 2 or later (the "GPL")
+# http://www.gnu.org/licenses/gpl.html
+#
+# - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+# http://www.gnu.org/licenses/lgpl.html
+#
+# - Mozilla Public License Version 1.1 or later (the "MPL")
+# http://www.mozilla.org/MPL/MPL-1.1.html
+#
+# == END LICENSE ==
+#
+# This is the File Manager Connector for Perl.
+#####
+
+sub GetUrlFromPath
+{
+ local($resourceType, $folderPath) = @_;
+
+ if($resourceType eq '') {
+ $rmpath = &RemoveFromEnd($GLOBALS{'UserFilesPath'},'/');
+ return("$rmpath$folderPath");
+ } else {
+ return("$GLOBALS{'UserFilesPath'}$resourceType$folderPath");
+ }
+}
+
+sub RemoveExtension
+{
+ local($fileName) = @_;
+ local($path, $base, $ext);
+ if($fileName !~ /\./) {
+ $fileName .= '.';
+ }
+ if($fileName =~ /([^\\\/]*)\.(.*)$/) {
+ $base = $1;
+ $ext = $2;
+ if($fileName =~ /(.*)$base\.$ext$/) {
+ $path = $1;
+ }
+ }
+ return($path,$base,$ext);
+
+}
+
+sub ServerMapFolder
+{
+ local($resourceType,$folderPath) = @_;
+
+ # Get the resource type directory.
+ $sResourceTypePath = $GLOBALS{'UserFilesDirectory'} . $resourceType . '/';
+
+ # Ensure that the directory exists.
+ &CreateServerFolder($sResourceTypePath);
+
+ # Return the resource type directory combined with the required path.
+ $rmpath = &RemoveFromStart($folderPath,'/');
+ return("$sResourceTypePath$rmpath");
+}
+
+sub GetParentFolder
+{
+ local($folderPath) = @_;
+
+ $folderPath =~ s/[\/][^\/]+[\/]?$//g;
+ return $folderPath;
+}
+
+sub CreateServerFolder
+{
+ local($folderPath) = @_;
+
+ $sParent = &GetParentFolder($folderPath);
+ # Check if the parent exists, or create it.
+ if(!(-e $sParent)) {
+ $sErrorMsg = &CreateServerFolder($sParent);
+ if($sErrorMsg == 1) {
+ return(1);
+ }
+ }
+ if(!(-e $folderPath)) {
+ if (defined $CHMOD_ON_FOLDER_CREATE && !$CHMOD_ON_FOLDER_CREATE) {
+ mkdir("$folderPath");
+ }
+ else {
+ umask(000);
+ if (defined $CHMOD_ON_FOLDER_CREATE) {
+ mkdir("$folderPath",$CHMOD_ON_FOLDER_CREATE);
+ }
+ else {
+ mkdir("$folderPath",0777);
+ }
+ }
+
+ return(0);
+ } else {
+ return(1);
+ }
+}
+
+sub GetRootPath
+{
+#use Cwd;
+
+# my $dir = getcwd;
+# print $dir;
+# $dir =~ s/$ENV{'DOCUMENT_ROOT'}//g;
+# print $dir;
+# return($dir);
+
+# $wk = $0;
+# $wk =~ s/\/connector\.cgi//g;
+# if($wk) {
+# $current_dir = $wk;
+# } else {
+# $current_dir = `pwd`;
+# }
+# return($current_dir);
+use Cwd;
+
+ if($ENV{'DOCUMENT_ROOT'}) {
+ $dir = $ENV{'DOCUMENT_ROOT'};
+ } else {
+ my $dir = getcwd;
+ $workdir =~ s/\/connector\.cgi//g;
+ $dir =~ s/$workdir//g;
+ }
+ return($dir);
+
+
+
+}
+1;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/upload.cgi
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/upload.cgi Thu Aug 28 18:47:59 2008
@@ -0,0 +1,117 @@
+#!/usr/bin/env perl
+
+#####
+# FCKeditor - The text editor for Internet - http://www.fckeditor.net
+# Copyright (C) 2003-2008 Frederico Caldeira Knabben
+#
+# == BEGIN LICENSE ==
+#
+# Licensed under the terms of any of the following licenses at your
+# choice:
+#
+# - GNU General Public License Version 2 or later (the "GPL")
+# http://www.gnu.org/licenses/gpl.html
+#
+# - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+# http://www.gnu.org/licenses/lgpl.html
+#
+# - Mozilla Public License Version 1.1 or later (the "MPL")
+# http://www.mozilla.org/MPL/MPL-1.1.html
+#
+# == END LICENSE ==
+#
+# This is the File Manager Connector for Perl.
+#####
+
+##
+# ATTENTION: To enable this connector, look for the "SECURITY" comment in this file.
+##
+
+## START: Hack for Windows (Not important to understand the editor code... Perl specific).
+if(Windows_check()) {
+ chdir(GetScriptPath($0));
+}
+
+sub Windows_check
+{
+ # IIS,PWS(NT/95)
+ $www_server_os = $^O;
+ # Win98 & NT(SP4)
+ if($www_server_os eq "") { $www_server_os= $ENV{'OS'}; }
+ # AnHTTPd/Omni/IIS
+ if($ENV{'SERVER_SOFTWARE'} =~ /AnWeb|Omni|IIS\//i) { $www_server_os= 'win'; }
+ # Win Apache
+ if($ENV{'WINDIR'} ne "") { $www_server_os= 'win'; }
+ if($www_server_os=~ /win/i) { return(1); }
+ return(0);
+}
+
+sub GetScriptPath {
+ local($path) = @_;
+ if($path =~ /[\:\/\\]/) { $path =~ s/(.*?)[\/\\][^\/\\]+$/$1/; } else { $path = '.'; }
+ $path;
+}
+## END: Hack for IIS
+
+require 'util.pl';
+require 'io.pl';
+require 'basexml.pl';
+require 'commands.pl';
+require 'upload_fck.pl';
+
+##
+# SECURITY: REMOVE/COMMENT THE FOLLOWING LINE TO ENABLE THIS CONNECTOR.
+##
+ &SendUploadResults(1, '', '', 'This connector is disabled. Please check the "editor/filemanager/connectors/perl/upload.cgi" file' ) ;
+
+ &read_input();
+
+ if($FORM{'ServerPath'} ne "") {
+ $GLOBALS{'UserFilesPath'} = $FORM{'ServerPath'};
+ if(!($GLOBALS{'UserFilesPath'} =~ /\/$/)) {
+ $GLOBALS{'UserFilesPath'} .= '/' ;
+ }
+ } else {
+ $GLOBALS{'UserFilesPath'} = '/userfiles/';
+ }
+
+ # Map the "UserFiles" path to a local directory.
+ $rootpath = &GetRootPath();
+ $GLOBALS{'UserFilesDirectory'} = $rootpath . $GLOBALS{'UserFilesPath'};
+
+ &DoResponse();
+
+sub DoResponse
+{
+ # Get the main request information.
+ $sCommand = 'FileUpload'; #$FORM{'Command'};
+ $sResourceType = $FORM{'Type'};
+ $sCurrentFolder = $FORM{'CurrentFolder'};
+
+ if ($sResourceType eq '') {
+ $sResourceType = 'File' ;
+ }
+ if ($sCurrentFolder eq '') {
+ $sCurrentFolder = '/' ;
+ }
+
+ # Check the current folder syntax (must begin and start with a slash).
+ if(!($sCurrentFolder =~ /\/$/)) {
+ $sCurrentFolder .= '/';
+ }
+ if(!($sCurrentFolder =~ /^\//)) {
+ $sCurrentFolder = '/' . $sCurrentFolder;
+ }
+
+ # Check for invalid folder paths (..)
+ if ( $sCurrentFolder =~ /(?:\.\.|\\)/ ) {
+ SendError( 102, "" ) ;
+ }
+
+ # File Upload doesn't have to Return XML, so it must be intercepted before anything.
+ if($sCommand eq 'FileUpload') {
+ FileUpload($sResourceType,$sCurrentFolder);
+ return ;
+ }
+
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/upload_fck.pl
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/upload_fck.pl Thu Aug 28 18:47:59 2008
@@ -0,0 +1,686 @@
+#####
+# FCKeditor - The text editor for Internet - http://www.fckeditor.net
+# Copyright (C) 2003-2008 Frederico Caldeira Knabben
+#
+# == BEGIN LICENSE ==
+#
+# Licensed under the terms of any of the following licenses at your
+# choice:
+#
+# - GNU General Public License Version 2 or later (the "GPL")
+# http://www.gnu.org/licenses/gpl.html
+#
+# - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+# http://www.gnu.org/licenses/lgpl.html
+#
+# - Mozilla Public License Version 1.1 or later (the "MPL")
+# http://www.mozilla.org/MPL/MPL-1.1.html
+#
+# == END LICENSE ==
+#
+# This is the File Manager Connector for Perl.
+#####
+
+# image data save dir
+$img_dir = './temp/';
+
+
+# File size max(unit KB)
+$MAX_CONTENT_SIZE = 30000;
+
+# After file is uploaded, sometimes it is required to change its permissions
+# so that it was possible to access it at the later time.
+# If possible, it is recommended to set more restrictive permissions, like 0755.
+# Set to 0 to disable this feature.
+$CHMOD_ON_UPLOAD = 0777;
+
+# See comments above.
+# Used when creating folders that does not exist.
+$CHMOD_ON_FOLDER_CREATE = 0755;
+
+# Filelock (1=use,0=not use)
+$PM{'flock'} = '1';
+
+
+# upload Content-Type list
+my %UPLOAD_CONTENT_TYPE_LIST = (
+ 'image/(x-)?png' => 'png', # PNG image
+ 'image/p?jpe?g' => 'jpg', # JPEG image
+ 'image/gif' => 'gif', # GIF image
+ 'image/x-xbitmap' => 'xbm', # XBM image
+
+ 'image/(x-(MS-)?)?bmp' => 'bmp', # Windows BMP image
+ 'image/pict' => 'pict', # Macintosh PICT image
+ 'image/tiff' => 'tif', # TIFF image
+ 'application/pdf' => 'pdf', # PDF image
+ 'application/x-shockwave-flash' => 'swf', # Shockwave Flash
+
+ 'video/(x-)?msvideo' => 'avi', # Microsoft Video
+ 'video/quicktime' => 'mov', # QuickTime Video
+ 'video/mpeg' => 'mpeg', # MPEG Video
+ 'video/x-mpeg2' => 'mpv2', # MPEG2 Video
+
+ 'audio/(x-)?midi?' => 'mid', # MIDI Audio
+ 'audio/(x-)?wav' => 'wav', # WAV Audio
+ 'audio/basic' => 'au', # ULAW Audio
+ 'audio/mpeg' => 'mpga', # MPEG Audio
+
+ 'application/(x-)?zip(-compressed)?' => 'zip', # ZIP Compress
+
+ 'text/html' => 'html', # HTML
+ 'text/plain' => 'txt', # TEXT
+ '(?:application|text)/(?:rtf|richtext)' => 'rtf', # RichText
+
+ 'application/msword' => 'doc', # Microsoft Word
+ 'application/vnd.ms-excel' => 'xls', # Microsoft Excel
+
+ ''
+);
+
+# Upload is permitted.
+# A regular expression is possible.
+my %UPLOAD_EXT_LIST = (
+ 'png' => 'PNG image',
+ 'p?jpe?g|jpe|jfif|pjp' => 'JPEG image',
+ 'gif' => 'GIF image',
+ 'xbm' => 'XBM image',
+
+ 'bmp|dib|rle' => 'Windows BMP image',
+ 'pi?ct' => 'Macintosh PICT image',
+ 'tiff?' => 'TIFF image',
+ 'pdf' => 'PDF image',
+ 'swf' => 'Shockwave Flash',
+
+ 'avi' => 'Microsoft Video',
+ 'moo?v|qt' => 'QuickTime Video',
+ 'm(p(e?gv?|e|v)|1v)' => 'MPEG Video',
+ 'mp(v2|2v)' => 'MPEG2 Video',
+
+ 'midi?|kar|smf|rmi|mff' => 'MIDI Audio',
+ 'wav' => 'WAVE Audio',
+ 'au|snd' => 'ULAW Audio',
+ 'mp(e?ga|2|a|3)|abs' => 'MPEG Audio',
+
+ 'zip' => 'ZIP Compress',
+ 'lzh' => 'LZH Compress',
+ 'cab' => 'CAB Compress',
+
+ 'd?html?' => 'HTML',
+ 'rtf|rtx' => 'RichText',
+ 'txt|text' => 'Text',
+
+ ''
+);
+
+
+# sjis or euc
+my $CHARCODE = 'sjis';
+
+$TRANS_2BYTE_CODE = 0;
+
+##############################################################################
+# Summary
+#
+# Form Read input
+#
+# Parameters
+# Returns
+# Memo
+##############################################################################
+sub read_input
+{
+eval("use File::Copy;");
+eval("use File::Path;");
+
+ my ($FORM) = @_;
+
+ if (defined $CHMOD_ON_FOLDER_CREATE && !$CHMOD_ON_FOLDER_CREATE) {
+ mkdir("$img_dir");
+ }
+ else {
+ umask(000);
+ if (defined $CHMOD_ON_FOLDER_CREATE) {
+ mkdir("$img_dir",$CHMOD_ON_FOLDER_CREATE);
+ }
+ else {
+ mkdir("$img_dir",0777);
+ }
+ }
+
+ undef $img_data_exists;
+ undef @NEWFNAMES;
+ undef @NEWFNAME_DATA;
+
+ if($ENV{'CONTENT_LENGTH'} > 10000000 || $ENV{'CONTENT_LENGTH'} > $MAX_CONTENT_SIZE * 1024) {
+ &upload_error(
+ 'Size Error',
+ sprintf(
+ "Transmitting size is too large.MAX <strong>%d KB</strong> Now Size <strong>%d KB</strong>(<strong>%d bytes</strong> Over)",
+ $MAX_CONTENT_SIZE,
+ int($ENV{'CONTENT_LENGTH'} / 1024),
+ $ENV{'CONTENT_LENGTH'} - $MAX_CONTENT_SIZE * 1024
+ )
+ );
+ }
+
+ my $Buffer;
+ if($ENV{'CONTENT_TYPE'} =~ /multipart\/form-data/) {
+ # METHOD POST only
+ return unless($ENV{'CONTENT_LENGTH'});
+
+ binmode(STDIN);
+ # STDIN A pause character is detected.'(MacIE3.0 boundary of $ENV{'CONTENT_TYPE'} cannot be trusted.)
+ my $Boundary = <STDIN>;
+ $Boundary =~ s/\x0D\x0A//;
+ $Boundary = quotemeta($Boundary);
+ while(<STDIN>) {
+ if(/^\s*Content-Disposition:/i) {
+ my($name,$ContentType,$FileName);
+ # form data get
+ if(/\bname="([^"]+)"/i || /\bname=([^\s:;]+)/i) {
+ $name = $1;
+ $name =~ tr/+/ /;
+ $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
+ &Encode(\$name);
+ }
+ if(/\bfilename="([^"]*)"/i || /\bfilename=([^\s:;]*)/i) {
+ $FileName = $1 || 'unknown';
+ }
+ # head read
+ while(<STDIN>) {
+ last if(! /\w/);
+ if(/^\s*Content-Type:\s*"([^"]+)"/i || /^\s*Content-Type:\s*([^\s:;]+)/i) {
+ $ContentType = $1;
+ }
+ }
+ # body read
+ $value = "";
+ while(<STDIN>) {
+ last if(/^$Boundary/o);
+ $value .= $_;
+ };
+ $lastline = $_;
+ $value =~s /\x0D\x0A$//;
+ if($value ne '') {
+ if($FileName || $ContentType) {
+ $img_data_exists = 1;
+ (
+ $FileName, #
+ $Ext, #
+ $Length, #
+ $ImageWidth, #
+ $ImageHeight, #
+ $ContentName #
+ ) = &CheckContentType(\$value,$FileName,$ContentType);
+
+ $FORM{$name} = $FileName;
+ $new_fname = $FileName;
+ push(@NEWFNAME_DATA,"$FileName\t$Ext\t$Length\t$ImageWidth\t$ImageHeight\t$ContentName");
+
+ # Multi-upload correspondence
+ push(@NEWFNAMES,$new_fname);
+ open(OUT,">$img_dir/$new_fname");
+ binmode(OUT);
+ eval "flock(OUT,2);" if($PM{'flock'} == 1);
+ print OUT $value;
+ eval "flock(OUT,8);" if($PM{'flock'} == 1);
+ close(OUT);
+
+ } elsif($name) {
+ $value =~ tr/+/ /;
+ $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
+ &Encode(\$value,'trans');
+ $FORM{$name} .= "\0" if(defined($FORM{$name}));
+ $FORM{$name} .= $value;
+ }
+ }
+ };
+ last if($lastline =~ /^$Boundary\-\-/o);
+ }
+ } elsif($ENV{'CONTENT_LENGTH'}) {
+ read(STDIN,$Buffer,$ENV{'CONTENT_LENGTH'});
+ }
+ foreach(split(/&/,$Buffer),split(/&/,$ENV{'QUERY_STRING'})) {
+ my($name, $value) = split(/=/);
+ $name =~ tr/+/ /;
+ $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
+ $value =~ tr/+/ /;
+ $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
+
+ &Encode(\$name);
+ &Encode(\$value,'trans');
+ $FORM{$name} .= "\0" if(defined($FORM{$name}));
+ $FORM{$name} .= $value;
+
+ }
+
+}
+
+##############################################################################
+# Summary
+#
+# CheckContentType
+#
+# Parameters
+# Returns
+# Memo
+##############################################################################
+sub CheckContentType
+{
+
+ my($DATA,$FileName,$ContentType) = @_;
+ my($Ext,$ImageWidth,$ImageHeight,$ContentName,$Infomation);
+ my $DataLength = length($$DATA);
+
+ # An unknown file type
+
+ $_ = $ContentType;
+ my $UnknownType = (
+ !$_
+ || /^application\/(x-)?macbinary$/i
+ || /^application\/applefile$/i
+ || /^application\/octet-stream$/i
+ || /^text\/plane$/i
+ || /^x-unknown-content-type/i
+ );
+
+ # MacBinary(Mac Unnecessary data are deleted.)
+ if($UnknownType || $ENV{'HTTP_USER_AGENT'} =~ /Macintosh|Mac_/) {
+ if($DataLength > 128 && !unpack("C",substr($$DATA,0,1)) && !unpack("C",substr($$DATA,74,1)) && !unpack("C",substr($$DATA,82,1)) ) {
+ my $MacBinary_ForkLength = unpack("N", substr($$DATA, 83, 4)); # ForkLength Get
+ my $MacBinary_FileName = quotemeta(substr($$DATA, 2, unpack("C",substr($$DATA, 1, 1))));
+ if($MacBinary_FileName && $MacBinary_ForkLength && $DataLength >= $MacBinary_ForkLength + 128
+ && ($FileName =~ /$MacBinary_FileName/i || substr($$DATA,102,4) eq 'mBIN')) { # DATA TOP 128byte MacBinary!!
+ $$DATA = substr($$DATA,128,$MacBinary_ForkLength);
+ my $ResourceLength = $DataLength - $MacBinary_ForkLength - 128;
+ $DataLength = $MacBinary_ForkLength;
+ }
+ }
+ }
+
+ # A file name is changed into EUC.
+# &jcode::convert(\$FileName,'euc',$FormCodeDefault);
+# &jcode::h2z_euc(\$FileName);
+ $FileName =~ s/^.*\\//; # Windows, Mac
+ $FileName =~ s/^.*\///; # UNIX
+ $FileName =~ s/&/&/g;
+ $FileName =~ s/"/"/g;
+ $FileName =~ s/</</g;
+ $FileName =~ s/>/>/g;
+#
+# if($CHARCODE ne 'euc') {
+# &jcode::convert(\$FileName,$CHARCODE,'euc');
+# }
+
+ # An extension is extracted and it changes into a small letter.
+ my $FileExt;
+ if($FileName =~ /\.(\w+)$/) {
+ $FileExt = $1;
+ $FileExt =~ tr/A-Z/a-z/;
+ }
+
+ # Executable file detection (ban on upload)
+ if($$DATA =~ /^MZ/) {
+ $Ext = 'exe';
+ }
+ # text
+ if(!$Ext && ($UnknownType || $ContentType =~ /^text\//i || $ContentType =~ /^application\/(?:rtf|richtext)$/i || $ContentType =~ /^image\/x-xbitmap$/i)
+ && ! $$DATA =~ /[\000-\006\177\377]/) {
+# $$DATA =~ s/\x0D\x0A/\n/g;
+# $$DATA =~ tr/\x0D\x0A/\n\n/;
+#
+# if(
+# $$DATA =~ /<\s*SCRIPT(?:.|\n)*?>/i
+# || $$DATA =~ /<\s*(?:.|\n)*?\bONLOAD\s*=(?:.|\n)*?>/i
+# || $$DATA =~ /<\s*(?:.|\n)*?\bONCLICK\s*=(?:.|\n)*?>/i
+# ) {
+# $Infomation = '(JavaScript contains)';
+# }
+# if($$DATA =~ /<\s*TABLE(?:.|\n)*?>/i
+# || $$DATA =~ /<\s*BLINK(?:.|\n)*?>/i
+# || $$DATA =~ /<\s*MARQUEE(?:.|\n)*?>/i
+# || $$DATA =~ /<\s*OBJECT(?:.|\n)*?>/i
+# || $$DATA =~ /<\s*EMBED(?:.|\n)*?>/i
+# || $$DATA =~ /<\s*FRAME(?:.|\n)*?>/i
+# || $$DATA =~ /<\s*APPLET(?:.|\n)*?>/i
+# || $$DATA =~ /<\s*FORM(?:.|\n)*?>/i
+# || $$DATA =~ /<\s*(?:.|\n)*?\bSRC\s*=(?:.|\n)*?>/i
+# || $$DATA =~ /<\s*(?:.|\n)*?\bDYNSRC\s*=(?:.|\n)*?>/i
+# ) {
+# $Infomation = '(the HTML tag which is not safe is included)';
+# }
+
+ if($FileExt =~ /^txt$/i || $FileExt =~ /^cgi$/i || $FileExt =~ /^pl$/i) { # Text File
+ $Ext = 'txt';
+ } elsif($ContentType =~ /^text\/html$/i || $FileExt =~ /html?/i || $$DATA =~ /<\s*HTML(?:.|\n)*?>/i) { # HTML File
+ $Ext = 'html';
+ } elsif($ContentType =~ /^image\/x-xbitmap$/i || $FileExt =~ /^xbm$/i) { # XBM(x-BitMap) Image
+ my $XbmName = $1;
+ my ($XbmWidth, $XbmHeight);
+ if($$DATA =~ /\#define\s*$XbmName\_width\s*(\d+)/i) {
+ $XbmWidth = $1;
+ }
+ if($$DATA =~ /\#define\s*$XbmName\_height\s*(\d+)/i) {
+ $XbmHeight = $1;
+ }
+ if($XbmWidth && $XbmHeight) {
+ $Ext = 'xbm';
+ $ImageWidth = $XbmWidth;
+ $ImageHeight = $XbmHeight;
+ }
+ } else { #
+ $Ext = 'txt';
+ }
+ }
+
+ # image
+ if(!$Ext && ($UnknownType || $ContentType =~ /^image\//i)) {
+ # PNG
+ if($$DATA =~ /^\x89PNG\x0D\x0A\x1A\x0A/) {
+ if(substr($$DATA, 12, 4) eq 'IHDR') {
+ $Ext = 'png';
+ ($ImageWidth, $ImageHeight) = unpack("N2", substr($$DATA, 16, 8));
+ }
+ } elsif($$DATA =~ /^GIF8(?:9|7)a/) { # GIF89a(modified), GIF89a, GIF87a
+ $Ext = 'gif';
+ ($ImageWidth, $ImageHeight) = unpack("v2", substr($$DATA, 6, 4));
+ } elsif($$DATA =~ /^II\x2a\x00\x08\x00\x00\x00/ || $$DATA =~ /^MM\x00\x2a\x00\x00\x00\x08/) { # TIFF
+ $Ext = 'tif';
+ } elsif($$DATA =~ /^BM/) { # BMP
+ $Ext = 'bmp';
+ } elsif($$DATA =~ /^\xFF\xD8\xFF/ || $$DATA =~ /JFIF/) { # JPEG
+ my $HeaderPoint = index($$DATA, "\xFF\xD8\xFF", 0);
+ my $Point = $HeaderPoint + 2;
+ while($Point < $DataLength) {
+ my($Maker, $MakerType, $MakerLength) = unpack("C2n",substr($$DATA,$Point,4));
+ if($Maker != 0xFF || $MakerType == 0xd9 || $MakerType == 0xda) {
+ last;
+ } elsif($MakerType >= 0xC0 && $MakerType <= 0xC3) {
+ $Ext = 'jpg';
+ ($ImageHeight, $ImageWidth) = unpack("n2", substr($$DATA, $Point + 5, 4));
+ if($HeaderPoint > 0) {
+ $$DATA = substr($$DATA, $HeaderPoint);
+ $DataLength = length($$DATA);
+ }
+ last;
+ } else {
+ $Point += $MakerLength + 2;
+ }
+ }
+ }
+ }
+
+ # audio
+ if(!$Ext && ($UnknownType || $ContentType =~ /^audio\//i)) {
+ # MIDI Audio
+ if($$DATA =~ /^MThd/) {
+ $Ext = 'mid';
+ } elsif($$DATA =~ /^\x2esnd/) { # ULAW Audio
+ $Ext = 'au';
+ } elsif($$DATA =~ /^RIFF/ || $$DATA =~ /^ID3/ && $$DATA =~ /RIFF/) {
+ my $HeaderPoint = index($$DATA, "RIFF", 0);
+ $_ = substr($$DATA, $HeaderPoint + 8, 8);
+ if(/^WAVEfmt $/) {
+ # WAVE
+ if(unpack("V",substr($$DATA, $HeaderPoint + 16, 4)) == 16) {
+ $Ext = 'wav';
+ } else { # RIFF WAVE MP3
+ $Ext = 'mp3';
+ }
+ } elsif(/^RMIDdata$/) { # RIFF MIDI
+ $Ext = 'rmi';
+ } elsif(/^RMP3data$/) { # RIFF MP3
+ $Ext = 'rmp';
+ }
+ if($ContentType =~ /^audio\//i) {
+ $Infomation .= '(RIFF '. substr($$DATA, $HeaderPoint + 8, 4). ')';
+ }
+ }
+ }
+
+ # a binary file
+ unless ($Ext) {
+ # PDF image
+ if($$DATA =~ /^\%PDF/) {
+ # Picture size is not measured.
+ $Ext = 'pdf';
+ } elsif($$DATA =~ /^FWS/) { # Shockwave Flash
+ $Ext = 'swf';
+ } elsif($$DATA =~ /^RIFF/ || $$DATA =~ /^ID3/ && $$DATA =~ /RIFF/) {
+ my $HeaderPoint = index($$DATA, "RIFF", 0);
+ $_ = substr($$DATA,$HeaderPoint + 8, 8);
+ # AVI
+ if(/^AVI LIST$/) {
+ $Ext = 'avi';
+ }
+ if($ContentType =~ /^video\//i) {
+ $Infomation .= '(RIFF '. substr($$DATA, $HeaderPoint + 8, 4). ')';
+ }
+ } elsif($$DATA =~ /^PK/) { # ZIP Compress File
+ $Ext = 'zip';
+ } elsif($$DATA =~ /^MSCF/) { # CAB Compress File
+ $Ext = 'cab';
+ } elsif($$DATA =~ /^Rar\!/) { # RAR Compress File
+ $Ext = 'rar';
+ } elsif(substr($$DATA, 2, 5) =~ /^\-lh(\d+|d)\-$/) { # LHA Compress File
+ $Infomation .= "(lh$1)";
+ $Ext = 'lzh';
+ } elsif(substr($$DATA, 325, 25) eq "Apple Video Media Handler" || substr($$DATA, 325, 30) eq "Apple \x83\x72\x83\x66\x83\x49\x81\x45\x83\x81\x83\x66\x83\x42\x83\x41\x83\x6E\x83\x93\x83\x68\x83\x89") {
+ # QuickTime
+ $Ext = 'mov';
+ }
+ }
+
+ # Header analysis failure
+ unless ($Ext) {
+ # It will be followed if it applies for the MIME type from the browser.
+ foreach (keys %UPLOAD_CONTENT_TYPE_LIST) {
+ next unless ($_);
+ if($ContentType =~ /^$_$/i) {
+ $Ext = $UPLOAD_CONTENT_TYPE_LIST{$_};
+ $ContentName = &CheckContentExt($Ext);
+ if(
+ grep {$_ eq $Ext;} (
+ 'png',
+ 'gif',
+ 'jpg',
+ 'xbm',
+ 'tif',
+ 'bmp',
+ 'pdf',
+ 'swf',
+ 'mov',
+ 'zip',
+ 'cab',
+ 'lzh',
+ 'rar',
+ 'mid',
+ 'rmi',
+ 'au',
+ 'wav',
+ 'avi',
+ 'exe'
+ )
+ ) {
+ $Infomation .= ' / Header analysis failure';
+ }
+ if($Ext ne $FileExt && &CheckContentExt($FileExt) eq $ContentName) {
+ $Ext = $FileExt;
+ }
+ last;
+ }
+ }
+ # a MIME type is unknown--It judges from an extension.
+ unless ($Ext) {
+ $ContentName = &CheckContentExt($FileExt);
+ if($ContentName) {
+ $Ext = $FileExt;
+ $Infomation .= ' / MIME type is unknown('. $ContentType. ')';
+ last;
+ }
+ }
+ }
+
+# $ContentName = &CheckContentExt($Ext) unless($ContentName);
+# if($Ext && $ContentName) {
+# $ContentName .= $Infomation;
+# } else {
+# &upload_error(
+# 'Extension Error',
+# "$FileName A not corresponding extension ($Ext)<BR>The extension which can be responded ". join(',', sort values(%UPLOAD_EXT_LIST))
+# );
+# }
+
+# # SSI Tag Deletion
+# if($Ext =~ /.?html?/ && $$DATA =~ /<\!/) {
+# foreach (
+# 'config',
+# 'echo',
+# 'exec',
+# 'flastmod',
+# 'fsize',
+# 'include'
+# ) {
+# $$DATA =~ s/\#\s*$_/\&\#35\;$_/ig
+# }
+# }
+
+ return (
+ $FileName,
+ $Ext,
+ int($DataLength / 1024 + 1),
+ $ImageWidth,
+ $ImageHeight,
+ $ContentName
+ );
+}
+
+##############################################################################
+# Summary
+#
+# Extension discernment
+#
+# Parameters
+# Returns
+# Memo
+##############################################################################
+
+sub CheckContentExt
+{
+
+ my($Ext) = @_;
+ my $ContentName;
+ foreach (keys %UPLOAD_EXT_LIST) {
+ next unless ($_);
+ if($_ && $Ext =~ /^$_$/) {
+ $ContentName = $UPLOAD_EXT_LIST{$_};
+ last;
+ }
+ }
+ return $ContentName;
+
+}
+
+##############################################################################
+# Summary
+#
+# Form decode
+#
+# Parameters
+# Returns
+# Memo
+##############################################################################
+sub Encode
+{
+
+ my($value,$Trans) = @_;
+
+# my $FormCode = &jcode::getcode($value) || $FormCodeDefault;
+# $FormCodeDefault ||= $FormCode;
+#
+# if($Trans && $TRANS_2BYTE_CODE) {
+# if($FormCode ne 'euc') {
+# &jcode::convert($value, 'euc', $FormCode);
+# }
+# &jcode::tr(
+# $value,
+# "\xA3\xB0-\xA3\xB9\xA3\xC1-\xA3\xDA\xA3\xE1-\xA3\xFA",
+# '0-9A-Za-z'
+# );
+# if($CHARCODE ne 'euc') {
+# &jcode::convert($value,$CHARCODE,'euc');
+# }
+# } else {
+# if($CHARCODE ne $FormCode) {
+# &jcode::convert($value,$CHARCODE,$FormCode);
+# }
+# }
+# if($CHARCODE eq 'euc') {
+# &jcode::h2z_euc($value);
+# } elsif($CHARCODE eq 'sjis') {
+# &jcode::h2z_sjis($value);
+# }
+
+}
+
+##############################################################################
+# Summary
+#
+# Error Msg
+#
+# Parameters
+# Returns
+# Memo
+##############################################################################
+
+sub upload_error
+{
+
+ local($error_message) = $_[0];
+ local($error_message2) = $_[1];
+
+ print "Content-type: text/html\n\n";
+ print<<EOF;
+<HTML>
+<HEAD>
+<TITLE>Error Message</TITLE></HEAD>
+<BODY>
+<table border="1" cellspacing="10" cellpadding="10">
+ <TR bgcolor="#0000B0">
+ <TD bgcolor="#0000B0" NOWRAP><font size="-1" color="white"><B>Error Message</B></font></TD>
+ </TR>
+</table>
+<UL>
+<H4> $error_message </H4>
+$error_message2 <BR>
+</UL>
+</BODY>
+</HTML>
+EOF
+ &rm_tmp_uploaded_files; # Image Temporary deletion
+ exit;
+}
+
+##############################################################################
+# Summary
+#
+# Image Temporary deletion
+#
+# Parameters
+# Returns
+# Memo
+##############################################################################
+
+sub rm_tmp_uploaded_files
+{
+ if($img_data_exists == 1){
+ sleep 1;
+ foreach $fname_list(@NEWFNAMES) {
+ if(-e "$img_dir/$fname_list") {
+ unlink("$img_dir/$fname_list");
+ }
+ }
+ }
+
+}
+1;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/util.pl
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/perl/util.pl Thu Aug 28 18:47:59 2008
@@ -0,0 +1,68 @@
+#####
+# FCKeditor - The text editor for Internet - http://www.fckeditor.net
+# Copyright (C) 2003-2008 Frederico Caldeira Knabben
+#
+# == BEGIN LICENSE ==
+#
+# Licensed under the terms of any of the following licenses at your
+# choice:
+#
+# - GNU General Public License Version 2 or later (the "GPL")
+# http://www.gnu.org/licenses/gpl.html
+#
+# - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+# http://www.gnu.org/licenses/lgpl.html
+#
+# - Mozilla Public License Version 1.1 or later (the "MPL")
+# http://www.mozilla.org/MPL/MPL-1.1.html
+#
+# == END LICENSE ==
+#
+# This is the File Manager Connector for Perl.
+#####
+
+sub RemoveFromStart
+{
+ local($sourceString, $charToRemove) = @_;
+ $sPattern = '^' . $charToRemove . '+' ;
+ $sourceString =~ s/^$charToRemove+//g;
+ return $sourceString;
+}
+
+sub RemoveFromEnd
+{
+ local($sourceString, $charToRemove) = @_;
+ $sPattern = $charToRemove . '+$' ;
+ $sourceString =~ s/$charToRemove+$//g;
+ return $sourceString;
+}
+
+sub ConvertToXmlAttribute
+{
+ local($value) = @_;
+ return $value;
+# return utf8_encode(htmlspecialchars($value));
+
+}
+
+sub specialchar_cnv
+{
+ local($ch) = @_;
+
+ $ch =~ s/&/&/g; # &
+ $ch =~ s/\"/"/g; #"
+ $ch =~ s/\'/'/g; # '
+ $ch =~ s/</</g; # <
+ $ch =~ s/>/>/g; # >
+ return($ch);
+}
+
+sub JS_cnv
+{
+ local($ch) = @_;
+
+ $ch =~ s/\"/\\\"/g; #"
+ return($ch);
+}
+
+1;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/basexml.php
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/basexml.php Thu Aug 28 18:47:59 2008
@@ -0,0 +1,93 @@
+<?php
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * These functions define the base of the XML response sent by the PHP
+ * connector.
+ */
+
+function SetXmlHeaders()
+{
+ ob_end_clean() ;
+
+ // Prevent the browser from caching the result.
+ // Date in the past
+ header('Expires: Mon, 26 Jul 1997 05:00:00 GMT') ;
+ // always modified
+ header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT') ;
+ // HTTP/1.1
+ header('Cache-Control: no-store, no-cache, must-revalidate') ;
+ header('Cache-Control: post-check=0, pre-check=0', false) ;
+ // HTTP/1.0
+ header('Pragma: no-cache') ;
+
+ // Set the response format.
+ header( 'Content-Type: text/xml; charset=utf-8' ) ;
+}
+
+function CreateXmlHeader( $command, $resourceType, $currentFolder )
+{
+ SetXmlHeaders() ;
+
+ // Create the XML document header.
+ echo '<?xml version="1.0" encoding="utf-8" ?>' ;
+
+ // Create the main "Connector" node.
+ echo '<Connector command="' . $command . '" resourceType="' . $resourceType . '">' ;
+
+ // Add the current folder node.
+ echo '<CurrentFolder path="' . ConvertToXmlAttribute( $currentFolder ) . '" url="' . ConvertToXmlAttribute( GetUrlFromPath( $resourceType, $currentFolder, $command ) ) . '" />' ;
+
+ $GLOBALS['HeaderSent'] = true ;
+}
+
+function CreateXmlFooter()
+{
+ echo '</Connector>' ;
+}
+
+function SendError( $number, $text )
+{
+ if ( isset( $GLOBALS['HeaderSent'] ) && $GLOBALS['HeaderSent'] )
+ {
+ SendErrorNode( $number, $text ) ;
+ CreateXmlFooter() ;
+ }
+ else
+ {
+ SetXmlHeaders() ;
+
+ // Create the XML document header
+ echo '<?xml version="1.0" encoding="utf-8" ?>' ;
+
+ echo '<Connector>' ;
+
+ SendErrorNode( $number, $text ) ;
+
+ echo '</Connector>' ;
+ }
+ exit ;
+}
+
+function SendErrorNode( $number, $text )
+{
+ echo '<Error number="' . $number . '" text="' . htmlspecialchars( $text ) . '" />' ;
+}
+?>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/commands.php
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/commands.php Thu Aug 28 18:47:59 2008
@@ -0,0 +1,273 @@
+<?php
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This is the File Manager Connector for PHP.
+ */
+
+function GetFolders( $resourceType, $currentFolder )
+{
+ // Map the virtual path to the local server path.
+ $sServerDir = ServerMapFolder( $resourceType, $currentFolder, 'GetFolders' ) ;
+
+ // Array that will hold the folders names.
+ $aFolders = array() ;
+
+ $oCurrentFolder = opendir( $sServerDir ) ;
+
+ while ( $sFile = readdir( $oCurrentFolder ) )
+ {
+ if ( $sFile != '.' && $sFile != '..' && is_dir( $sServerDir . $sFile ) )
+ $aFolders[] = '<Folder name="' . ConvertToXmlAttribute( $sFile ) . '" />' ;
+ }
+
+ closedir( $oCurrentFolder ) ;
+
+ // Open the "Folders" node.
+ echo "<Folders>" ;
+
+ natcasesort( $aFolders ) ;
+ foreach ( $aFolders as $sFolder )
+ echo $sFolder ;
+
+ // Close the "Folders" node.
+ echo "</Folders>" ;
+}
+
+function GetFoldersAndFiles( $resourceType, $currentFolder )
+{
+ // Map the virtual path to the local server path.
+ $sServerDir = ServerMapFolder( $resourceType, $currentFolder, 'GetFoldersAndFiles' ) ;
+
+ // Arrays that will hold the folders and files names.
+ $aFolders = array() ;
+ $aFiles = array() ;
+
+ $oCurrentFolder = opendir( $sServerDir ) ;
+
+ while ( $sFile = readdir( $oCurrentFolder ) )
+ {
+ if ( $sFile != '.' && $sFile != '..' )
+ {
+ if ( is_dir( $sServerDir . $sFile ) )
+ $aFolders[] = '<Folder name="' . ConvertToXmlAttribute( $sFile ) . '" />' ;
+ else
+ {
+ $iFileSize = @filesize( $sServerDir . $sFile ) ;
+ if ( !$iFileSize ) {
+ $iFileSize = 0 ;
+ }
+ if ( $iFileSize > 0 )
+ {
+ $iFileSize = round( $iFileSize / 1024 ) ;
+ if ( $iFileSize < 1 ) $iFileSize = 1 ;
+ }
+
+ $aFiles[] = '<File name="' . ConvertToXmlAttribute( $sFile ) . '" size="' . $iFileSize . '" />' ;
+ }
+ }
+ }
+
+ // Send the folders
+ natcasesort( $aFolders ) ;
+ echo '<Folders>' ;
+
+ foreach ( $aFolders as $sFolder )
+ echo $sFolder ;
+
+ echo '</Folders>' ;
+
+ // Send the files
+ natcasesort( $aFiles ) ;
+ echo '<Files>' ;
+
+ foreach ( $aFiles as $sFiles )
+ echo $sFiles ;
+
+ echo '</Files>' ;
+}
+
+function CreateFolder( $resourceType, $currentFolder )
+{
+ if (!isset($_GET)) {
+ global $_GET;
+ }
+ $sErrorNumber = '0' ;
+ $sErrorMsg = '' ;
+
+ if ( isset( $_GET['NewFolderName'] ) )
+ {
+ $sNewFolderName = $_GET['NewFolderName'] ;
+ $sNewFolderName = SanitizeFolderName( $sNewFolderName ) ;
+
+ if ( strpos( $sNewFolderName, '..' ) !== FALSE )
+ $sErrorNumber = '102' ; // Invalid folder name.
+ else
+ {
+ // Map the virtual path to the local server path of the current folder.
+ $sServerDir = ServerMapFolder( $resourceType, $currentFolder, 'CreateFolder' ) ;
+
+ if ( is_writable( $sServerDir ) )
+ {
+ $sServerDir .= $sNewFolderName ;
+
+ $sErrorMsg = CreateServerFolder( $sServerDir ) ;
+
+ switch ( $sErrorMsg )
+ {
+ case '' :
+ $sErrorNumber = '0' ;
+ break ;
+ case 'Invalid argument' :
+ case 'No such file or directory' :
+ $sErrorNumber = '102' ; // Path too long.
+ break ;
+ default :
+ $sErrorNumber = '110' ;
+ break ;
+ }
+ }
+ else
+ $sErrorNumber = '103' ;
+ }
+ }
+ else
+ $sErrorNumber = '102' ;
+
+ // Create the "Error" node.
+ echo '<Error number="' . $sErrorNumber . '" originalDescription="' . ConvertToXmlAttribute( $sErrorMsg ) . '" />' ;
+}
+
+function FileUpload( $resourceType, $currentFolder, $sCommand )
+{
+ if (!isset($_FILES)) {
+ global $_FILES;
+ }
+ $sErrorNumber = '0' ;
+ $sFileName = '' ;
+
+ if ( isset( $_FILES['NewFile'] ) && !is_null( $_FILES['NewFile']['tmp_name'] ) )
+ {
+ global $Config ;
+
+ $oFile = $_FILES['NewFile'] ;
+
+ // Map the virtual path to the local server path.
+ $sServerDir = ServerMapFolder( $resourceType, $currentFolder, $sCommand ) ;
+
+ // Get the uploaded file name.
+ $sFileName = $oFile['name'] ;
+ $sFileName = SanitizeFileName( $sFileName ) ;
+
+ $sOriginalFileName = $sFileName ;
+
+ // Get the extension.
+ $sExtension = substr( $sFileName, ( strrpos($sFileName, '.') + 1 ) ) ;
+ $sExtension = strtolower( $sExtension ) ;
+
+ if ( isset( $Config['SecureImageUploads'] ) )
+ {
+ if ( ( $isImageValid = IsImageValid( $oFile['tmp_name'], $sExtension ) ) === false )
+ {
+ $sErrorNumber = '202' ;
+ }
+ }
+
+ if ( isset( $Config['HtmlExtensions'] ) )
+ {
+ if ( !IsHtmlExtension( $sExtension, $Config['HtmlExtensions'] ) &&
+ ( $detectHtml = DetectHtml( $oFile['tmp_name'] ) ) === true )
+ {
+ $sErrorNumber = '202' ;
+ }
+ }
+
+ // Check if it is an allowed extension.
+ if ( !$sErrorNumber && IsAllowedExt( $sExtension, $resourceType ) )
+ {
+ $iCounter = 0 ;
+
+ while ( true )
+ {
+ $sFilePath = $sServerDir . $sFileName ;
+
+ if ( is_file( $sFilePath ) )
+ {
+ $iCounter++ ;
+ $sFileName = RemoveExtension( $sOriginalFileName ) . '(' . $iCounter . ').' . $sExtension ;
+ $sErrorNumber = '201' ;
+ }
+ else
+ {
+ move_uploaded_file( $oFile['tmp_name'], $sFilePath ) ;
+
+ if ( is_file( $sFilePath ) )
+ {
+ if ( isset( $Config['ChmodOnUpload'] ) && !$Config['ChmodOnUpload'] )
+ {
+ break ;
+ }
+
+ $permissions = 0777;
+
+ if ( isset( $Config['ChmodOnUpload'] ) && $Config['ChmodOnUpload'] )
+ {
+ $permissions = $Config['ChmodOnUpload'] ;
+ }
+
+ $oldumask = umask(0) ;
+ chmod( $sFilePath, $permissions ) ;
+ umask( $oldumask ) ;
+ }
+
+ break ;
+ }
+ }
+
+ if ( file_exists( $sFilePath ) )
+ {
+ //previous checks failed, try once again
+ if ( isset( $isImageValid ) && $isImageValid === -1 && IsImageValid( $sFilePath, $sExtension ) === false )
+ {
+ @unlink( $sFilePath ) ;
+ $sErrorNumber = '202' ;
+ }
+ else if ( isset( $detectHtml ) && $detectHtml === -1 && DetectHtml( $sFilePath ) === true )
+ {
+ @unlink( $sFilePath ) ;
+ $sErrorNumber = '202' ;
+ }
+ }
+ }
+ else
+ $sErrorNumber = '202' ;
+ }
+ else
+ $sErrorNumber = '202' ;
+
+
+ $sFileUrl = CombinePaths( GetResourceTypePath( $resourceType, $sCommand ) , $currentFolder ) ;
+ $sFileUrl = CombinePaths( $sFileUrl, $sFileName ) ;
+
+ SendUploadResults( $sErrorNumber, $sFileUrl, $sFileName ) ;
+
+ exit ;
+}
+?>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/config.php
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/config.php Thu Aug 28 18:47:59 2008
@@ -0,0 +1,151 @@
+<?php
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Configuration file for the File Manager Connector for PHP.
+ */
+
+global $Config ;
+
+// SECURITY: You must explicitly enable this "connector". (Set it to "true").
+// WARNING: don't just set "$Config['Enabled'] = true ;", you must be sure that only
+// authenticated users can access this file or use some kind of session checking.
+$Config['Enabled'] = false ;
+
+
+// Path to user files relative to the document root.
+$Config['UserFilesPath'] = '/userfiles/' ;
+
+// Fill the following value it you prefer to specify the absolute path for the
+// user files directory. Useful if you are using a virtual directory, symbolic
+// link or alias. Examples: 'C:\\MySite\\userfiles\\' or '/root/mysite/userfiles/'.
+// Attention: The above 'UserFilesPath' must point to the same directory.
+$Config['UserFilesAbsolutePath'] = '' ;
+
+// Due to security issues with Apache modules, it is recommended to leave the
+// following setting enabled.
+$Config['ForceSingleExtension'] = true ;
+
+// Perform additional checks for image files.
+// If set to true, validate image size (using getimagesize).
+$Config['SecureImageUploads'] = true;
+
+// What the user can do with this connector.
+$Config['ConfigAllowedCommands'] = array('QuickUpload', 'FileUpload', 'GetFolders', 'GetFoldersAndFiles', 'CreateFolder') ;
+
+// Allowed Resource Types.
+$Config['ConfigAllowedTypes'] = array('File', 'Image', 'Flash', 'Media') ;
+
+// For security, HTML is allowed in the first Kb of data for files having the
+// following extensions only.
+$Config['HtmlExtensions'] = array("html", "htm", "xml", "xsd", "txt", "js") ;
+
+// After file is uploaded, sometimes it is required to change its permissions
+// so that it was possible to access it at the later time.
+// If possible, it is recommended to set more restrictive permissions, like 0755.
+// Set to 0 to disable this feature.
+// Note: not needed on Windows-based servers.
+$Config['ChmodOnUpload'] = 0777 ;
+
+// See comments above.
+// Used when creating folders that does not exist.
+$Config['ChmodOnFolderCreate'] = 0777 ;
+
+/*
+ Configuration settings for each Resource Type
+
+ - AllowedExtensions: the possible extensions that can be allowed.
+ If it is empty then any file type can be uploaded.
+ - DeniedExtensions: The extensions that won't be allowed.
+ If it is empty then no restrictions are done here.
+
+ For a file to be uploaded it has to fulfill both the AllowedExtensions
+ and DeniedExtensions (that's it: not being denied) conditions.
+
+ - FileTypesPath: the virtual folder relative to the document root where
+ these resources will be located.
+ Attention: It must start and end with a slash: '/'
+
+ - FileTypesAbsolutePath: the physical path to the above folder. It must be
+ an absolute path.
+ If it's an empty string then it will be autocalculated.
+ Useful if you are using a virtual directory, symbolic link or alias.
+ Examples: 'C:\\MySite\\userfiles\\' or '/root/mysite/userfiles/'.
+ Attention: The above 'FileTypesPath' must point to the same directory.
+ Attention: It must end with a slash: '/'
+
+ - QuickUploadPath: the virtual folder relative to the document root where
+ these resources will be uploaded using the Upload tab in the resources
+ dialogs.
+ Attention: It must start and end with a slash: '/'
+
+ - QuickUploadAbsolutePath: the physical path to the above folder. It must be
+ an absolute path.
+ If it's an empty string then it will be autocalculated.
+ Useful if you are using a virtual directory, symbolic link or alias.
+ Examples: 'C:\\MySite\\userfiles\\' or '/root/mysite/userfiles/'.
+ Attention: The above 'QuickUploadPath' must point to the same directory.
+ Attention: It must end with a slash: '/'
+
+ NOTE: by default, QuickUploadPath and QuickUploadAbsolutePath point to
+ "userfiles" directory to maintain backwards compatibility with older versions of FCKeditor.
+ This is fine, but you in some cases you will be not able to browse uploaded files using file browser.
+ Example: if you click on "image button", select "Upload" tab and send image
+ to the server, image will appear in FCKeditor correctly, but because it is placed
+ directly in /userfiles/ directory, you'll be not able to see it in built-in file browser.
+ The more expected behaviour would be to send images directly to "image" subfolder.
+ To achieve that, simply change
+ $Config['QuickUploadPath']['Image'] = $Config['UserFilesPath'] ;
+ $Config['QuickUploadAbsolutePath']['Image'] = $Config['UserFilesAbsolutePath'] ;
+ into:
+ $Config['QuickUploadPath']['Image'] = $Config['FileTypesPath']['Image'] ;
+ $Config['QuickUploadAbsolutePath']['Image'] = $Config['FileTypesAbsolutePath']['Image'] ;
+
+*/
+
+$Config['AllowedExtensions']['File'] = array('7z', 'aiff', 'asf', 'avi', 'bmp', 'csv', 'doc', 'fla', 'flv', 'gif', 'gz', 'gzip', 'jpeg', 'jpg', 'mid', 'mov', 'mp3', 'mp4', 'mpc', 'mpeg', 'mpg', 'ods', 'odt', 'pdf', 'png', 'ppt', 'pxd', 'qt', 'ram', 'rar', 'rm', 'rmi', 'rmvb', 'rtf', 'sdc', 'sitd', 'swf', 'sxc', 'sxw', 'tar', 'tgz', 'tif', 'tiff', 'txt', 'vsd', 'wav', 'wma', 'wmv', 'xls', 'xml', 'zip') ;
+$Config['DeniedExtensions']['File'] = array() ;
+$Config['FileTypesPath']['File'] = $Config['UserFilesPath'] . 'file/' ;
+$Config['FileTypesAbsolutePath']['File']= ($Config['UserFilesAbsolutePath'] == '') ? '' : $Config['UserFilesAbsolutePath'].'file/' ;
+$Config['QuickUploadPath']['File'] = $Config['UserFilesPath'] ;
+$Config['QuickUploadAbsolutePath']['File']= $Config['UserFilesAbsolutePath'] ;
+
+$Config['AllowedExtensions']['Image'] = array('bmp','gif','jpeg','jpg','png') ;
+$Config['DeniedExtensions']['Image'] = array() ;
+$Config['FileTypesPath']['Image'] = $Config['UserFilesPath'] . 'image/' ;
+$Config['FileTypesAbsolutePath']['Image']= ($Config['UserFilesAbsolutePath'] == '') ? '' : $Config['UserFilesAbsolutePath'].'image/' ;
+$Config['QuickUploadPath']['Image'] = $Config['UserFilesPath'] ;
+$Config['QuickUploadAbsolutePath']['Image']= $Config['UserFilesAbsolutePath'] ;
+
+$Config['AllowedExtensions']['Flash'] = array('swf','flv') ;
+$Config['DeniedExtensions']['Flash'] = array() ;
+$Config['FileTypesPath']['Flash'] = $Config['UserFilesPath'] . 'flash/' ;
+$Config['FileTypesAbsolutePath']['Flash']= ($Config['UserFilesAbsolutePath'] == '') ? '' : $Config['UserFilesAbsolutePath'].'flash/' ;
+$Config['QuickUploadPath']['Flash'] = $Config['UserFilesPath'] ;
+$Config['QuickUploadAbsolutePath']['Flash']= $Config['UserFilesAbsolutePath'] ;
+
+$Config['AllowedExtensions']['Media'] = array('aiff', 'asf', 'avi', 'bmp', 'fla', 'flv', 'gif', 'jpeg', 'jpg', 'mid', 'mov', 'mp3', 'mp4', 'mpc', 'mpeg', 'mpg', 'png', 'qt', 'ram', 'rm', 'rmi', 'rmvb', 'swf', 'tif', 'tiff', 'wav', 'wma', 'wmv') ;
+$Config['DeniedExtensions']['Media'] = array() ;
+$Config['FileTypesPath']['Media'] = $Config['UserFilesPath'] . 'media/' ;
+$Config['FileTypesAbsolutePath']['Media']= ($Config['UserFilesAbsolutePath'] == '') ? '' : $Config['UserFilesAbsolutePath'].'media/' ;
+$Config['QuickUploadPath']['Media'] = $Config['UserFilesPath'] ;
+$Config['QuickUploadAbsolutePath']['Media']= $Config['UserFilesAbsolutePath'] ;
+
+?>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/connector.php
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/connector.php Thu Aug 28 18:47:59 2008
@@ -0,0 +1,87 @@
+<?php
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This is the File Manager Connector for PHP.
+ */
+
+ob_start() ;
+
+require('./config.php') ;
+require('./util.php') ;
+require('./io.php') ;
+require('./basexml.php') ;
+require('./commands.php') ;
+require('./phpcompat.php') ;
+
+if ( !$Config['Enabled'] )
+ SendError( 1, 'This connector is disabled. Please check the "editor/filemanager/connectors/php/config.php" file' ) ;
+
+DoResponse() ;
+
+function DoResponse()
+{
+ if (!isset($_GET)) {
+ global $_GET;
+ }
+ if ( !isset( $_GET['Command'] ) || !isset( $_GET['Type'] ) || !isset( $_GET['CurrentFolder'] ) )
+ return ;
+
+ // Get the main request informaiton.
+ $sCommand = $_GET['Command'] ;
+ $sResourceType = $_GET['Type'] ;
+ $sCurrentFolder = GetCurrentFolder() ;
+
+ // Check if it is an allowed command
+ if ( ! IsAllowedCommand( $sCommand ) )
+ SendError( 1, 'The "' . $sCommand . '" command isn\'t allowed' ) ;
+
+ // Check if it is an allowed type.
+ if ( !IsAllowedType( $sResourceType ) )
+ SendError( 1, 'Invalid type specified' ) ;
+
+ // File Upload doesn't have to Return XML, so it must be intercepted before anything.
+ if ( $sCommand == 'FileUpload' )
+ {
+ FileUpload( $sResourceType, $sCurrentFolder, $sCommand ) ;
+ return ;
+ }
+
+ CreateXmlHeader( $sCommand, $sResourceType, $sCurrentFolder ) ;
+
+ // Execute the required command.
+ switch ( $sCommand )
+ {
+ case 'GetFolders' :
+ GetFolders( $sResourceType, $sCurrentFolder ) ;
+ break ;
+ case 'GetFoldersAndFiles' :
+ GetFoldersAndFiles( $sResourceType, $sCurrentFolder ) ;
+ break ;
+ case 'CreateFolder' :
+ CreateFolder( $sResourceType, $sCurrentFolder ) ;
+ break ;
+ }
+
+ CreateXmlFooter() ;
+
+ exit ;
+}
+?>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/io.php
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/io.php Thu Aug 28 18:47:59 2008
@@ -0,0 +1,295 @@
+<?php
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This is the File Manager Connector for PHP.
+ */
+function CombinePaths( $sBasePath, $sFolder )
+{
+ return RemoveFromEnd( $sBasePath, '/' ) . '/' . RemoveFromStart( $sFolder, '/' ) ;
+}
+function GetResourceTypePath( $resourceType, $sCommand )
+{
+ global $Config ;
+
+ if ( $sCommand == "QuickUpload")
+ return $Config['QuickUploadPath'][$resourceType] ;
+ else
+ return $Config['FileTypesPath'][$resourceType] ;
+}
+
+function GetResourceTypeDirectory( $resourceType, $sCommand )
+{
+ global $Config ;
+ if ( $sCommand == "QuickUpload")
+ {
+ if ( strlen( $Config['QuickUploadAbsolutePath'][$resourceType] ) > 0 )
+ return $Config['QuickUploadAbsolutePath'][$resourceType] ;
+
+ // Map the "UserFiles" path to a local directory.
+ return Server_MapPath( $Config['QuickUploadPath'][$resourceType] ) ;
+ }
+ else
+ {
+ if ( strlen( $Config['FileTypesAbsolutePath'][$resourceType] ) > 0 )
+ return $Config['FileTypesAbsolutePath'][$resourceType] ;
+
+ // Map the "UserFiles" path to a local directory.
+ return Server_MapPath( $Config['FileTypesPath'][$resourceType] ) ;
+ }
+}
+
+function GetUrlFromPath( $resourceType, $folderPath, $sCommand )
+{
+ return CombinePaths( GetResourceTypePath( $resourceType, $sCommand ), $folderPath ) ;
+}
+
+function RemoveExtension( $fileName )
+{
+ return substr( $fileName, 0, strrpos( $fileName, '.' ) ) ;
+}
+
+function ServerMapFolder( $resourceType, $folderPath, $sCommand )
+{
+ // Get the resource type directory.
+ $sResourceTypePath = GetResourceTypeDirectory( $resourceType, $sCommand ) ;
+
+ // Ensure that the directory exists.
+ $sErrorMsg = CreateServerFolder( $sResourceTypePath ) ;
+ if ( $sErrorMsg != '' )
+ SendError( 1, "Error creating folder \"{$sResourceTypePath}\" ({$sErrorMsg})" ) ;
+
+ // Return the resource type directory combined with the required path.
+ return CombinePaths( $sResourceTypePath , $folderPath ) ;
+}
+
+function GetParentFolder( $folderPath )
+{
+ $sPattern = "-[/\\\\][^/\\\\]+[/\\\\]?$-" ;
+ return preg_replace( $sPattern, '', $folderPath ) ;
+}
+
+function CreateServerFolder( $folderPath, $lastFolder = null )
+{
+ global $Config ;
+ $sParent = GetParentFolder( $folderPath ) ;
+
+ // Ensure the folder path has no double-slashes, or mkdir may fail on certain platforms
+ while ( strpos($folderPath, '//') !== false )
+ {
+ $folderPath = str_replace( '//', '/', $folderPath ) ;
+ }
+
+ // Check if the parent exists, or create it.
+ if ( !file_exists( $sParent ) )
+ {
+ //prevents agains infinite loop when we can't create root folder
+ if ( !is_null( $lastFolder ) && $lastFolder === $sParent) {
+ return "Can't create $folderPath directory" ;
+ }
+
+ $sErrorMsg = CreateServerFolder( $sParent, $folderPath ) ;
+ if ( $sErrorMsg != '' )
+ return $sErrorMsg ;
+ }
+
+ if ( !file_exists( $folderPath ) )
+ {
+ // Turn off all error reporting.
+ error_reporting( 0 ) ;
+
+ $php_errormsg = '' ;
+ // Enable error tracking to catch the error.
+ ini_set( 'track_errors', '1' ) ;
+
+ if ( isset( $Config['ChmodOnFolderCreate'] ) && !$Config['ChmodOnFolderCreate'] )
+ {
+ mkdir( $folderPath ) ;
+ }
+ else
+ {
+ $permissions = 0777 ;
+ if ( isset( $Config['ChmodOnFolderCreate'] ) )
+ {
+ $permissions = $Config['ChmodOnFolderCreate'] ;
+ }
+ // To create the folder with 0777 permissions, we need to set umask to zero.
+ $oldumask = umask(0) ;
+ mkdir( $folderPath, $permissions ) ;
+ umask( $oldumask ) ;
+ }
+
+ $sErrorMsg = $php_errormsg ;
+
+ // Restore the configurations.
+ ini_restore( 'track_errors' ) ;
+ ini_restore( 'error_reporting' ) ;
+
+ return $sErrorMsg ;
+ }
+ else
+ return '' ;
+}
+
+function GetRootPath()
+{
+ if (!isset($_SERVER)) {
+ global $_SERVER;
+ }
+ $sRealPath = realpath( './' ) ;
+ // #2124 ensure that no slash is at the end
+ $sRealPath = rtrim($sRealPath,"\\/");
+
+ $sSelfPath = $_SERVER['PHP_SELF'] ;
+ $sSelfPath = substr( $sSelfPath, 0, strrpos( $sSelfPath, '/' ) ) ;
+
+ $sSelfPath = str_replace( '/', DIRECTORY_SEPARATOR, $sSelfPath ) ;
+
+ $position = strpos( $sRealPath, $sSelfPath ) ;
+
+ // This can check only that this script isn't run from a virtual dir
+ // But it avoids the problems that arise if it isn't checked
+ if ( $position === false || $position <> strlen( $sRealPath ) - strlen( $sSelfPath ) )
+ SendError( 1, 'Sorry, can\'t map "UserFilesPath" to a physical path. You must set the "UserFilesAbsolutePath" value in "editor/filemanager/connectors/php/config.php".' ) ;
+
+ return substr( $sRealPath, 0, $position ) ;
+}
+
+// Emulate the asp Server.mapPath function.
+// given an url path return the physical directory that it corresponds to
+function Server_MapPath( $path )
+{
+ // This function is available only for Apache
+ if ( function_exists( 'apache_lookup_uri' ) )
+ {
+ $info = apache_lookup_uri( $path ) ;
+ return $info->filename . $info->path_info ;
+ }
+
+ // This isn't correct but for the moment there's no other solution
+ // If this script is under a virtual directory or symlink it will detect the problem and stop
+ return GetRootPath() . $path ;
+}
+
+function IsAllowedExt( $sExtension, $resourceType )
+{
+ global $Config ;
+ // Get the allowed and denied extensions arrays.
+ $arAllowed = $Config['AllowedExtensions'][$resourceType] ;
+ $arDenied = $Config['DeniedExtensions'][$resourceType] ;
+
+ if ( count($arAllowed) > 0 && !in_array( $sExtension, $arAllowed ) )
+ return false ;
+
+ if ( count($arDenied) > 0 && in_array( $sExtension, $arDenied ) )
+ return false ;
+
+ return true ;
+}
+
+function IsAllowedType( $resourceType )
+{
+ global $Config ;
+ if ( !in_array( $resourceType, $Config['ConfigAllowedTypes'] ) )
+ return false ;
+
+ return true ;
+}
+
+function IsAllowedCommand( $sCommand )
+{
+ global $Config ;
+
+ if ( !in_array( $sCommand, $Config['ConfigAllowedCommands'] ) )
+ return false ;
+
+ return true ;
+}
+
+function GetCurrentFolder()
+{
+ if (!isset($_GET)) {
+ global $_GET;
+ }
+ $sCurrentFolder = isset( $_GET['CurrentFolder'] ) ? $_GET['CurrentFolder'] : '/' ;
+
+ // Check the current folder syntax (must begin and start with a slash).
+ if ( !preg_match( '|/$|', $sCurrentFolder ) )
+ $sCurrentFolder .= '/' ;
+ if ( strpos( $sCurrentFolder, '/' ) !== 0 )
+ $sCurrentFolder = '/' . $sCurrentFolder ;
+
+ // Ensure the folder path has no double-slashes
+ while ( strpos ($sCurrentFolder, '//') !== false ) {
+ $sCurrentFolder = str_replace ('//', '/', $sCurrentFolder) ;
+ }
+
+ // Check for invalid folder paths (..)
+ if ( strpos( $sCurrentFolder, '..' ) || strpos( $sCurrentFolder, "\\" ))
+ SendError( 102, '' ) ;
+
+ return $sCurrentFolder ;
+}
+
+// Do a cleanup of the folder name to avoid possible problems
+function SanitizeFolderName( $sNewFolderName )
+{
+ $sNewFolderName = stripslashes( $sNewFolderName ) ;
+
+ // Remove . \ / | : ? * " < >
+ $sNewFolderName = preg_replace( '/\\.|\\\\|\\/|\\||\\:|\\?|\\*|"|<|>|[[:cntrl:]]/', '_', $sNewFolderName ) ;
+
+ return $sNewFolderName ;
+}
+
+// Do a cleanup of the file name to avoid possible problems
+function SanitizeFileName( $sNewFileName )
+{
+ global $Config ;
+
+ $sNewFileName = stripslashes( $sNewFileName ) ;
+
+ // Replace dots in the name with underscores (only one dot can be there... security issue).
+ if ( $Config['ForceSingleExtension'] )
+ $sNewFileName = preg_replace( '/\\.(?![^.]*$)/', '_', $sNewFileName ) ;
+
+ // Remove \ / | : ? * " < >
+ $sNewFileName = preg_replace( '/\\\\|\\/|\\||\\:|\\?|\\*|"|<|>|[[:cntrl:]]/', '_', $sNewFileName ) ;
+
+ return $sNewFileName ;
+}
+
+// This is the function that sends the results of the uploading process.
+function SendUploadResults( $errorNumber, $fileUrl = '', $fileName = '', $customMsg = '' )
+{
+ // Minified version of the document.domain automatic fix script (#1919).
+ // The original script can be found at _dev/domain_fix_template.js
+ echo <<<EOF
+<script type="text/javascript">
+(function(){var d=document.domain;while (true){try{var A=window.parent.document.domain;break;}catch(e) {};d=d.replace(/.*?(?:\.|$)/,'');if (d.length==0) break;try{document.domain=d;}catch (e){break;}}})();
+EOF;
+
+ $rpl = array( '\\' => '\\\\', '"' => '\\"' ) ;
+ echo 'window.parent.OnUploadCompleted(' . $errorNumber . ',"' . strtr( $fileUrl, $rpl ) . '","' . strtr( $fileName, $rpl ) . '", "' . strtr( $customMsg, $rpl ) . '") ;' ;
+ echo '</script>' ;
+ exit ;
+}
+
+?>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/phpcompat.php
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/phpcompat.php Thu Aug 28 18:47:59 2008
@@ -0,0 +1,17 @@
+<?php
+
+if ( !isset( $_SERVER ) ) {
+ $_SERVER = $HTTP_SERVER_VARS ;
+}
+if ( !isset( $_GET ) ) {
+ $_GET = $HTTP_GET_VARS ;
+}
+if ( !isset( $_FILES ) ) {
+ $_FILES = $HTTP_POST_FILES ;
+}
+
+if ( !defined( 'DIRECTORY_SEPARATOR' ) ) {
+ define( 'DIRECTORY_SEPARATOR',
+ strtoupper(substr(PHP_OS, 0, 3) == 'WIN') ? '\\' : '/'
+ ) ;
+}
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/upload.php
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/upload.php Thu Aug 28 18:47:59 2008
@@ -0,0 +1,59 @@
+<?php
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * This is the "File Uploader" for PHP.
+ */
+
+require('./config.php') ;
+require('./util.php') ;
+require('./io.php') ;
+require('./commands.php') ;
+require('./phpcompat.php') ;
+
+function SendError( $number, $text )
+{
+ SendUploadResults( $number, '', '', $text ) ;
+}
+
+
+// Check if this uploader has been enabled.
+if ( !$Config['Enabled'] )
+ SendUploadResults( '1', '', '', 'This file uploader is disabled. Please check the "editor/filemanager/connectors/php/config.php" file' ) ;
+
+$sCommand = 'QuickUpload' ;
+
+// The file type (from the QueryString, by default 'File').
+$sType = isset( $_GET['Type'] ) ? $_GET['Type'] : 'File' ;
+
+$sCurrentFolder = GetCurrentFolder() ;
+
+// Is enabled the upload?
+if ( ! IsAllowedCommand( $sCommand ) )
+ SendUploadResults( '1', '', '', 'The ""' . $sCommand . '"" command isn\'t allowed' ) ;
+
+// Check if it is an allowed type.
+if ( !IsAllowedType( $sType ) )
+ SendUploadResults( 1, '', '', 'Invalid type specified' ) ;
+
+
+FileUpload( $sType, $sCurrentFolder, $sCommand )
+
+?>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/util.php
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/php/util.php Thu Aug 28 18:47:59 2008
@@ -0,0 +1,220 @@
+<?php
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Utility functions for the File Manager Connector for PHP.
+ */
+
+function RemoveFromStart( $sourceString, $charToRemove )
+{
+ $sPattern = '|^' . $charToRemove . '+|' ;
+ return preg_replace( $sPattern, '', $sourceString ) ;
+}
+
+function RemoveFromEnd( $sourceString, $charToRemove )
+{
+ $sPattern = '|' . $charToRemove . '+$|' ;
+ return preg_replace( $sPattern, '', $sourceString ) ;
+}
+
+function FindBadUtf8( $string )
+{
+ $regex =
+ '([\x00-\x7F]'.
+ '|[\xC2-\xDF][\x80-\xBF]'.
+ '|\xE0[\xA0-\xBF][\x80-\xBF]'.
+ '|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}'.
+ '|\xED[\x80-\x9F][\x80-\xBF]'.
+ '|\xF0[\x90-\xBF][\x80-\xBF]{2}'.
+ '|[\xF1-\xF3][\x80-\xBF]{3}'.
+ '|\xF4[\x80-\x8F][\x80-\xBF]{2}'.
+ '|(.{1}))';
+
+ while (preg_match('/'.$regex.'/S', $string, $matches)) {
+ if ( isset($matches[2])) {
+ return true;
+ }
+ $string = substr($string, strlen($matches[0]));
+ }
+
+ return false;
+}
+
+function ConvertToXmlAttribute( $value )
+{
+ if ( defined( 'PHP_OS' ) )
+ {
+ $os = PHP_OS ;
+ }
+ else
+ {
+ $os = php_uname() ;
+ }
+
+ if ( strtoupper( substr( $os, 0, 3 ) ) === 'WIN' || FindBadUtf8( $value ) )
+ {
+ return ( utf8_encode( htmlspecialchars( $value ) ) ) ;
+ }
+ else
+ {
+ return ( htmlspecialchars( $value ) ) ;
+ }
+}
+
+/**
+ * Check whether given extension is in html etensions list
+ *
+ * @param string $ext
+ * @param array $htmlExtensions
+ * @return boolean
+ */
+function IsHtmlExtension( $ext, $htmlExtensions )
+{
+ if ( !$htmlExtensions || !is_array( $htmlExtensions ) )
+ {
+ return false ;
+ }
+ $lcaseHtmlExtensions = array() ;
+ foreach ( $htmlExtensions as $key => $val )
+ {
+ $lcaseHtmlExtensions[$key] = strtolower( $val ) ;
+ }
+ return in_array( $ext, $lcaseHtmlExtensions ) ;
+}
+
+/**
+ * Detect HTML in the first KB to prevent against potential security issue with
+ * IE/Safari/Opera file type auto detection bug.
+ * Returns true if file contain insecure HTML code at the beginning.
+ *
+ * @param string $filePath absolute path to file
+ * @return boolean
+ */
+function DetectHtml( $filePath )
+{
+ $fp = @fopen( $filePath, 'rb' ) ;
+
+ //open_basedir restriction, see #1906
+ if ( $fp === false || !flock( $fp, LOCK_SH ) )
+ {
+ return -1 ;
+ }
+
+ $chunk = fread( $fp, 1024 ) ;
+ flock( $fp, LOCK_UN ) ;
+ fclose( $fp ) ;
+
+ $chunk = strtolower( $chunk ) ;
+
+ if (!$chunk)
+ {
+ return false ;
+ }
+
+ $chunk = trim( $chunk ) ;
+
+ if ( preg_match( "/<!DOCTYPE\W*X?HTML/sim", $chunk ) )
+ {
+ return true;
+ }
+
+ $tags = array( '<body', '<head', '<html', '<img', '<pre', '<script', '<table', '<title' ) ;
+
+ foreach( $tags as $tag )
+ {
+ if( false !== strpos( $chunk, $tag ) )
+ {
+ return true ;
+ }
+ }
+
+ //type = javascript
+ if ( preg_match( '!type\s*=\s*[\'"]?\s*(?:\w*/)?(?:ecma|java)!sim', $chunk ) )
+ {
+ return true ;
+ }
+
+ //href = javascript
+ //src = javascript
+ //data = javascript
+ if ( preg_match( '!(?:href|src|data)\s*=\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) )
+ {
+ return true ;
+ }
+
+ //url(javascript
+ if ( preg_match( '!url\s*\(\s*[\'"]?\s*(?:ecma|java)script:!sim', $chunk ) )
+ {
+ return true ;
+ }
+
+ return false ;
+}
+
+/**
+ * Check file content.
+ * Currently this function validates only image files.
+ * Returns false if file is invalid.
+ *
+ * @param string $filePath absolute path to file
+ * @param string $extension file extension
+ * @param integer $detectionLevel 0 = none, 1 = use getimagesize for images, 2 = use DetectHtml for images
+ * @return boolean
+ */
+function IsImageValid( $filePath, $extension )
+{
+ if (!@is_readable($filePath)) {
+ return -1;
+ }
+
+ $imageCheckExtensions = array('gif', 'jpeg', 'jpg', 'png', 'swf', 'psd', 'bmp', 'iff');
+
+ // version_compare is available since PHP4 >= 4.0.7
+ if ( function_exists( 'version_compare' ) ) {
+ $sCurrentVersion = phpversion();
+ if ( version_compare( $sCurrentVersion, "4.2.0" ) >= 0 ) {
+ $imageCheckExtensions[] = "tiff";
+ $imageCheckExtensions[] = "tif";
+ }
+ if ( version_compare( $sCurrentVersion, "4.3.0" ) >= 0 ) {
+ $imageCheckExtensions[] = "swc";
+ }
+ if ( version_compare( $sCurrentVersion, "4.3.2" ) >= 0 ) {
+ $imageCheckExtensions[] = "jpc";
+ $imageCheckExtensions[] = "jp2";
+ $imageCheckExtensions[] = "jpx";
+ $imageCheckExtensions[] = "jb2";
+ $imageCheckExtensions[] = "xbm";
+ $imageCheckExtensions[] = "wbmp";
+ }
+ }
+
+ if ( !in_array( $extension, $imageCheckExtensions ) ) {
+ return true;
+ }
+
+ if ( @getimagesize( $filePath ) === false ) {
+ return false ;
+ }
+
+ return true;
+}
+
+?>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/config.py
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/config.py Thu Aug 28 18:47:59 2008
@@ -0,0 +1,146 @@
+#!/usr/bin/env python
+"""
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Configuration file for the File Manager Connector for Python
+"""
+
+# INSTALLATION NOTE: You must set up your server environment accordingly to run
+# python scripts. This connector requires Python 2.4 or greater.
+#
+# Supported operation modes:
+# * WSGI (recommended): You'll need apache + mod_python + modpython_gateway
+# or any web server capable of the WSGI python standard
+# * Plain Old CGI: Any server capable of running standard python scripts
+# (although mod_python is recommended for performance)
+# This was the previous connector version operation mode
+#
+# If you're using Apache web server, replace the htaccess.txt to to .htaccess,
+# and set the proper options and paths.
+# For WSGI and mod_python, you may need to download modpython_gateway from:
+# http://projects.amor.org/misc/svn/modpython_gateway.py and copy it in this
+# directory.
+
+
+# SECURITY: You must explicitly enable this "connector". (Set it to "True").
+# WARNING: don't just set "ConfigIsEnabled = True", you must be sure that only
+# authenticated users can access this file or use some kind of session checking.
+Enabled = False
+
+# Path to user files relative to the document root.
+UserFilesPath = '/userfiles/'
+
+# Fill the following value it you prefer to specify the absolute path for the
+# user files directory. Useful if you are using a virtual directory, symbolic
+# link or alias. Examples: 'C:\\MySite\\userfiles\\' or '/root/mysite/userfiles/'.
+# Attention: The above 'UserFilesPath' must point to the same directory.
+# WARNING: GetRootPath may not work in virtual or mod_python configurations, and
+# may not be thread safe. Use this configuration parameter instead.
+UserFilesAbsolutePath = ''
+
+# Due to security issues with Apache modules, it is recommended to leave the
+# following setting enabled.
+ForceSingleExtension = True
+
+# What the user can do with this connector
+ConfigAllowedCommands = [ 'QuickUpload', 'FileUpload', 'GetFolders', 'GetFoldersAndFiles', 'CreateFolder' ]
+
+# Allowed Resource Types
+ConfigAllowedTypes = ['File', 'Image', 'Flash', 'Media']
+
+# After file is uploaded, sometimes it is required to change its permissions
+# so that it was possible to access it at the later time.
+# If possible, it is recommended to set more restrictive permissions, like 0755.
+# Set to 0 to disable this feature.
+# Note: not needed on Windows-based servers.
+ChmodOnUpload = 0755
+
+# See comments above.
+# Used when creating folders that does not exist.
+ChmodOnFolderCreate = 0755
+
+# Do not touch this 3 lines, see "Configuration settings for each Resource Type"
+AllowedExtensions = {}; DeniedExtensions = {};
+FileTypesPath = {}; FileTypesAbsolutePath = {};
+QuickUploadPath = {}; QuickUploadAbsolutePath = {};
+
+# Configuration settings for each Resource Type
+#
+# - AllowedExtensions: the possible extensions that can be allowed.
+# If it is empty then any file type can be uploaded.
+# - DeniedExtensions: The extensions that won't be allowed.
+# If it is empty then no restrictions are done here.
+#
+# For a file to be uploaded it has to fulfill both the AllowedExtensions
+# and DeniedExtensions (that's it: not being denied) conditions.
+#
+# - FileTypesPath: the virtual folder relative to the document root where
+# these resources will be located.
+# Attention: It must start and end with a slash: '/'
+#
+# - FileTypesAbsolutePath: the physical path to the above folder. It must be
+# an absolute path.
+# If it's an empty string then it will be autocalculated.
+# Useful if you are using a virtual directory, symbolic link or alias.
+# Examples: 'C:\\MySite\\userfiles\\' or '/root/mysite/userfiles/'.
+# Attention: The above 'FileTypesPath' must point to the same directory.
+# Attention: It must end with a slash: '/'
+#
+#
+# - QuickUploadPath: the virtual folder relative to the document root where
+# these resources will be uploaded using the Upload tab in the resources
+# dialogs.
+# Attention: It must start and end with a slash: '/'
+#
+# - QuickUploadAbsolutePath: the physical path to the above folder. It must be
+# an absolute path.
+# If it's an empty string then it will be autocalculated.
+# Useful if you are using a virtual directory, symbolic link or alias.
+# Examples: 'C:\\MySite\\userfiles\\' or '/root/mysite/userfiles/'.
+# Attention: The above 'QuickUploadPath' must point to the same directory.
+# Attention: It must end with a slash: '/'
+
+AllowedExtensions['File'] = ['7z','aiff','asf','avi','bmp','csv','doc','fla','flv','gif','gz','gzip','jpeg','jpg','mid','mov','mp3','mp4','mpc','mpeg','mpg','ods','odt','pdf','png','ppt','pxd','qt','ram','rar','rm','rmi','rmvb','rtf','sdc','sitd','swf','sxc','sxw','tar','tgz','tif','tiff','txt','vsd','wav','wma','wmv','xls','xml','zip']
+DeniedExtensions['File'] = []
+FileTypesPath['File'] = UserFilesPath + 'file/'
+FileTypesAbsolutePath['File'] = (not UserFilesAbsolutePath == '') and (UserFilesAbsolutePath + 'file/') or ''
+QuickUploadPath['File'] = FileTypesPath['File']
+QuickUploadAbsolutePath['File'] = FileTypesAbsolutePath['File']
+
+AllowedExtensions['Image'] = ['bmp','gif','jpeg','jpg','png']
+DeniedExtensions['Image'] = []
+FileTypesPath['Image'] = UserFilesPath + 'image/'
+FileTypesAbsolutePath['Image'] = (not UserFilesAbsolutePath == '') and UserFilesAbsolutePath + 'image/' or ''
+QuickUploadPath['Image'] = FileTypesPath['Image']
+QuickUploadAbsolutePath['Image']= FileTypesAbsolutePath['Image']
+
+AllowedExtensions['Flash'] = ['swf','flv']
+DeniedExtensions['Flash'] = []
+FileTypesPath['Flash'] = UserFilesPath + 'flash/'
+FileTypesAbsolutePath['Flash'] = ( not UserFilesAbsolutePath == '') and UserFilesAbsolutePath + 'flash/' or ''
+QuickUploadPath['Flash'] = FileTypesPath['Flash']
+QuickUploadAbsolutePath['Flash']= FileTypesAbsolutePath['Flash']
+
+AllowedExtensions['Media'] = ['aiff','asf','avi','bmp','fla', 'flv','gif','jpeg','jpg','mid','mov','mp3','mp4','mpc','mpeg','mpg','png','qt','ram','rm','rmi','rmvb','swf','tif','tiff','wav','wma','wmv']
+DeniedExtensions['Media'] = []
+FileTypesPath['Media'] = UserFilesPath + 'media/'
+FileTypesAbsolutePath['Media'] = ( not UserFilesAbsolutePath == '') and UserFilesAbsolutePath + 'media/' or ''
+QuickUploadPath['Media'] = FileTypesPath['Media']
+QuickUploadAbsolutePath['Media']= FileTypesAbsolutePath['Media']
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/connector.py
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/connector.py Thu Aug 28 18:47:59 2008
@@ -0,0 +1,118 @@
+#!/usr/bin/env python
+
+"""
+FCKeditor - The text editor for Internet - http://www.fckeditor.net
+Copyright (C) 2003-2008 Frederico Caldeira Knabben
+
+== BEGIN LICENSE ==
+
+Licensed under the terms of any of the following licenses at your
+choice:
+
+ - GNU General Public License Version 2 or later (the "GPL")
+ http://www.gnu.org/licenses/gpl.html
+
+ - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ http://www.gnu.org/licenses/lgpl.html
+
+ - Mozilla Public License Version 1.1 or later (the "MPL")
+ http://www.mozilla.org/MPL/MPL-1.1.html
+
+== END LICENSE ==
+
+Connector for Python (CGI and WSGI).
+
+See config.py for configuration settings
+
+"""
+import os
+
+from fckutil import *
+from fckcommands import * # default command's implementation
+from fckoutput import * # base http, xml and html output mixins
+from fckconnector import FCKeditorConnectorBase # import base connector
+import config as Config
+
+class FCKeditorConnector( FCKeditorConnectorBase,
+ GetFoldersCommandMixin,
+ GetFoldersAndFilesCommandMixin,
+ CreateFolderCommandMixin,
+ UploadFileCommandMixin,
+ BaseHttpMixin, BaseXmlMixin, BaseHtmlMixin ):
+ "The Standard connector class."
+ def doResponse(self):
+ "Main function. Process the request, set headers and return a string as response."
+ s = ""
+ # Check if this connector is disabled
+ if not(Config.Enabled):
+ return self.sendError(1, "This connector is disabled. Please check the connector configurations in \"editor/filemanager/connectors/py/config.py\" and try again.")
+ # Make sure we have valid inputs
+ for key in ("Command","Type","CurrentFolder"):
+ if not self.request.has_key (key):
+ return
+ # Get command, resource type and current folder
+ command = self.request.get("Command")
+ resourceType = self.request.get("Type")
+ currentFolder = getCurrentFolder(self.request.get("CurrentFolder"))
+ # Check for invalid paths
+ if currentFolder is None:
+ return self.sendError(102, "")
+
+ # Check if it is an allowed command
+ if ( not command in Config.ConfigAllowedCommands ):
+ return self.sendError( 1, 'The %s command isn\'t allowed' % command )
+
+ if ( not resourceType in Config.ConfigAllowedTypes ):
+ return self.sendError( 1, 'Invalid type specified' )
+
+ # Setup paths
+ if command == "QuickUpload":
+ self.userFilesFolder = Config.QuickUploadAbsolutePath[resourceType]
+ self.webUserFilesFolder = Config.QuickUploadPath[resourceType]
+ else:
+ self.userFilesFolder = Config.FileTypesAbsolutePath[resourceType]
+ self.webUserFilesFolder = Config.FileTypesPath[resourceType]
+
+ if not self.userFilesFolder: # no absolute path given (dangerous...)
+ self.userFilesFolder = mapServerPath(self.environ,
+ self.webUserFilesFolder)
+ # Ensure that the directory exists.
+ if not os.path.exists(self.userFilesFolder):
+ try:
+ self.createServerFoldercreateServerFolder( self.userFilesFolder )
+ except:
+ return self.sendError(1, "This connector couldn\'t access to local user\'s files directories. Please check the UserFilesAbsolutePath in \"editor/filemanager/connectors/py/config.py\" and try again. ")
+
+ # File upload doesn't have to return XML, so intercept here
+ if (command == "FileUpload"):
+ return self.uploadFile(resourceType, currentFolder)
+
+ # Create Url
+ url = combinePaths( self.webUserFilesFolder, currentFolder )
+
+ # Begin XML
+ s += self.createXmlHeader(command, resourceType, currentFolder, url)
+ # Execute the command
+ selector = {"GetFolders": self.getFolders,
+ "GetFoldersAndFiles": self.getFoldersAndFiles,
+ "CreateFolder": self.createFolder,
+ }
+ s += selector[command](resourceType, currentFolder)
+ s += self.createXmlFooter()
+ return s
+
+# Running from command line (plain old CGI)
+if __name__ == '__main__':
+ try:
+ # Create a Connector Instance
+ conn = FCKeditorConnector()
+ data = conn.doResponse()
+ for header in conn.headers:
+ print '%s: %s' % header
+ print
+ print data
+ except:
+ print "Content-Type: text/plain"
+ print
+ import cgi
+ cgi.print_exception()
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/fckcommands.py
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/fckcommands.py Thu Aug 28 18:47:59 2008
@@ -0,0 +1,198 @@
+#!/usr/bin/env python
+
+"""
+FCKeditor - The text editor for Internet - http://www.fckeditor.net
+Copyright (C) 2003-2008 Frederico Caldeira Knabben
+
+== BEGIN LICENSE ==
+
+Licensed under the terms of any of the following licenses at your
+choice:
+
+- GNU General Public License Version 2 or later (the "GPL")
+http://www.gnu.org/licenses/gpl.html
+
+- GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+http://www.gnu.org/licenses/lgpl.html
+
+- Mozilla Public License Version 1.1 or later (the "MPL")
+http://www.mozilla.org/MPL/MPL-1.1.html
+
+== END LICENSE ==
+
+Connector for Python (CGI and WSGI).
+
+"""
+
+import os
+try: # Windows needs stdio set for binary mode for file upload to work.
+ import msvcrt
+ msvcrt.setmode (0, os.O_BINARY) # stdin = 0
+ msvcrt.setmode (1, os.O_BINARY) # stdout = 1
+except ImportError:
+ pass
+
+from fckutil import *
+from fckoutput import *
+import config as Config
+
+class GetFoldersCommandMixin (object):
+ def getFolders(self, resourceType, currentFolder):
+ """
+ Purpose: command to recieve a list of folders
+ """
+ # Map the virtual path to our local server
+ serverPath = mapServerFolder(self.userFilesFolder,currentFolder)
+ s = """<Folders>""" # Open the folders node
+ for someObject in os.listdir(serverPath):
+ someObjectPath = mapServerFolder(serverPath, someObject)
+ if os.path.isdir(someObjectPath):
+ s += """<Folder name="%s" />""" % (
+ convertToXmlAttribute(someObject)
+ )
+ s += """</Folders>""" # Close the folders node
+ return s
+
+class GetFoldersAndFilesCommandMixin (object):
+ def getFoldersAndFiles(self, resourceType, currentFolder):
+ """
+ Purpose: command to recieve a list of folders and files
+ """
+ # Map the virtual path to our local server
+ serverPath = mapServerFolder(self.userFilesFolder,currentFolder)
+ # Open the folders / files node
+ folders = """<Folders>"""
+ files = """<Files>"""
+ for someObject in os.listdir(serverPath):
+ someObjectPath = mapServerFolder(serverPath, someObject)
+ if os.path.isdir(someObjectPath):
+ folders += """<Folder name="%s" />""" % (
+ convertToXmlAttribute(someObject)
+ )
+ elif os.path.isfile(someObjectPath):
+ size = os.path.getsize(someObjectPath)
+ files += """<File name="%s" size="%s" />""" % (
+ convertToXmlAttribute(someObject),
+ os.path.getsize(someObjectPath)
+ )
+ # Close the folders / files node
+ folders += """</Folders>"""
+ files += """</Files>"""
+ return folders + files
+
+class CreateFolderCommandMixin (object):
+ def createFolder(self, resourceType, currentFolder):
+ """
+ Purpose: command to create a new folder
+ """
+ errorNo = 0; errorMsg ='';
+ if self.request.has_key("NewFolderName"):
+ newFolder = self.request.get("NewFolderName", None)
+ newFolder = sanitizeFolderName (newFolder)
+ try:
+ newFolderPath = mapServerFolder(self.userFilesFolder, combinePaths(currentFolder, newFolder))
+ self.createServerFolder(newFolderPath)
+ except Exception, e:
+ errorMsg = str(e).decode('iso-8859-1').encode('utf-8') # warning with encodigns!!!
+ if hasattr(e,'errno'):
+ if e.errno==17: #file already exists
+ errorNo=0
+ elif e.errno==13: # permission denied
+ errorNo = 103
+ elif e.errno==36 or e.errno==2 or e.errno==22: # filename too long / no such file / invalid name
+ errorNo = 102
+ else:
+ errorNo = 110
+ else:
+ errorNo = 102
+ return self.sendErrorNode ( errorNo, errorMsg )
+
+ def createServerFolder(self, folderPath):
+ "Purpose: physically creates a folder on the server"
+ # No need to check if the parent exists, just create all hierachy
+
+ try:
+ permissions = Config.ChmodOnFolderCreate
+ if not permissions:
+ os.makedirs(folderPath)
+ except AttributeError: #ChmodOnFolderCreate undefined
+ permissions = 0755
+
+ if permissions:
+ oldumask = os.umask(0)
+ os.makedirs(folderPath,mode=0755)
+ os.umask( oldumask )
+
+class UploadFileCommandMixin (object):
+ def uploadFile(self, resourceType, currentFolder):
+ """
+ Purpose: command to upload files to server (same as FileUpload)
+ """
+ errorNo = 0
+ if self.request.has_key("NewFile"):
+ # newFile has all the contents we need
+ newFile = self.request.get("NewFile", "")
+ # Get the file name
+ newFileName = newFile.filename
+ newFileName = sanitizeFileName( newFileName )
+ newFileNameOnly = removeExtension(newFileName)
+ newFileExtension = getExtension(newFileName).lower()
+ allowedExtensions = Config.AllowedExtensions[resourceType]
+ deniedExtensions = Config.DeniedExtensions[resourceType]
+
+ if (allowedExtensions):
+ # Check for allowed
+ isAllowed = False
+ if (newFileExtension in allowedExtensions):
+ isAllowed = True
+ elif (deniedExtensions):
+ # Check for denied
+ isAllowed = True
+ if (newFileExtension in deniedExtensions):
+ isAllowed = False
+ else:
+ # No extension limitations
+ isAllowed = True
+
+ if (isAllowed):
+ # Upload to operating system
+ # Map the virtual path to the local server path
+ currentFolderPath = mapServerFolder(self.userFilesFolder, currentFolder)
+ i = 0
+ while (True):
+ newFilePath = os.path.join (currentFolderPath,newFileName)
+ if os.path.exists(newFilePath):
+ i += 1
+ newFileName = "%s(%04d).%s" % (
+ newFileNameOnly, i, newFileExtension
+ )
+ errorNo= 201 # file renamed
+ else:
+ # Read file contents and write to the desired path (similar to php's move_uploaded_file)
+ fout = file(newFilePath, 'wb')
+ while (True):
+ chunk = newFile.file.read(100000)
+ if not chunk: break
+ fout.write (chunk)
+ fout.close()
+
+ if os.path.exists ( newFilePath ):
+ doChmod = False
+ try:
+ doChmod = Config.ChmodOnUpload
+ permissions = Config.ChmodOnUpload
+ except AttributeError: #ChmodOnUpload undefined
+ doChmod = True
+ permissions = 0755
+ if ( doChmod ):
+ oldumask = os.umask(0)
+ os.chmod( newFilePath, permissions )
+ os.umask( oldumask )
+
+ newFileUrl = self.webUserFilesFolder + currentFolder + newFileName
+
+ return self.sendUploadResults( errorNo , newFileUrl, newFileName )
+ else:
+ return self.sendUploadResults( errorNo = 203, customMsg = "Extension not allowed" )
+ else:
+ return self.sendUploadResults( errorNo = 202, customMsg = "No File" )
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/fckconnector.py
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/fckconnector.py Thu Aug 28 18:47:59 2008
@@ -0,0 +1,90 @@
+#!/usr/bin/env python
+
+"""
+FCKeditor - The text editor for Internet - http://www.fckeditor.net
+Copyright (C) 2003-2008 Frederico Caldeira Knabben
+
+== BEGIN LICENSE ==
+
+Licensed under the terms of any of the following licenses at your
+choice:
+
+- GNU General Public License Version 2 or later (the "GPL")
+http://www.gnu.org/licenses/gpl.html
+
+- GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+http://www.gnu.org/licenses/lgpl.html
+
+- Mozilla Public License Version 1.1 or later (the "MPL")
+http://www.mozilla.org/MPL/MPL-1.1.html
+
+== END LICENSE ==
+
+Base Connector for Python (CGI and WSGI).
+
+See config.py for configuration settings
+
+"""
+import cgi, os
+
+from fckutil import *
+from fckcommands import * # default command's implementation
+from fckoutput import * # base http, xml and html output mixins
+import config as Config
+
+class FCKeditorConnectorBase( object ):
+ "The base connector class. Subclass it to extend functionality (see Zope example)"
+
+ def __init__(self, environ=None):
+ "Constructor: Here you should parse request fields, initialize variables, etc."
+ self.request = FCKeditorRequest(environ) # Parse request
+ self.headers = [] # Clean Headers
+ if environ:
+ self.environ = environ
+ else:
+ self.environ = os.environ
+
+ # local functions
+
+ def setHeader(self, key, value):
+ self.headers.append ((key, value))
+ return
+
+class FCKeditorRequest(object):
+ "A wrapper around the request object"
+ def __init__(self, environ):
+ if environ: # WSGI
+ self.request = cgi.FieldStorage(fp=environ['wsgi.input'],
+ environ=environ,
+ keep_blank_values=1)
+ self.environ = environ
+ else: # plain old cgi
+ self.environ = os.environ
+ self.request = cgi.FieldStorage()
+ if 'REQUEST_METHOD' in self.environ and 'QUERY_STRING' in self.environ:
+ if self.environ['REQUEST_METHOD'].upper()=='POST':
+ # we are in a POST, but GET query_string exists
+ # cgi parses by default POST data, so parse GET QUERY_STRING too
+ self.get_request = cgi.FieldStorage(fp=None,
+ environ={
+ 'REQUEST_METHOD':'GET',
+ 'QUERY_STRING':self.environ['QUERY_STRING'],
+ },
+ )
+ else:
+ self.get_request={}
+
+ def has_key(self, key):
+ return self.request.has_key(key) or self.get_request.has_key(key)
+
+ def get(self, key, default=None):
+ if key in self.request.keys():
+ field = self.request[key]
+ elif key in self.get_request.keys():
+ field = self.get_request[key]
+ else:
+ return default
+ if hasattr(field,"filename") and field.filename: #file upload, do not convert return value
+ return field
+ else:
+ return field.value
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/fckoutput.py
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/fckoutput.py Thu Aug 28 18:47:59 2008
@@ -0,0 +1,116 @@
+#!/usr/bin/env python
+
+"""
+FCKeditor - The text editor for Internet - http://www.fckeditor.net
+Copyright (C) 2003-2008 Frederico Caldeira Knabben
+
+== BEGIN LICENSE ==
+
+Licensed under the terms of any of the following licenses at your
+choice:
+
+- GNU General Public License Version 2 or later (the "GPL")
+http://www.gnu.org/licenses/gpl.html
+
+- GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+http://www.gnu.org/licenses/lgpl.html
+
+- Mozilla Public License Version 1.1 or later (the "MPL")
+http://www.mozilla.org/MPL/MPL-1.1.html
+
+== END LICENSE ==
+
+Connector for Python (CGI and WSGI).
+
+"""
+
+from time import gmtime, strftime
+import string
+
+def escape(text, replace=string.replace):
+ """
+ Converts the special characters '<', '>', and '&'.
+
+ RFC 1866 specifies that these characters be represented
+ in HTML as < > and & respectively. In Python
+ 1.5 we use the new string.replace() function for speed.
+ """
+ text = replace(text, '&', '&') # must be done 1st
+ text = replace(text, '<', '<')
+ text = replace(text, '>', '>')
+ text = replace(text, '"', '"')
+ return text
+
+def convertToXmlAttribute(value):
+ if (value is None):
+ value = ""
+ return escape(value)
+
+class BaseHttpMixin(object):
+ def setHttpHeaders(self, content_type='text/xml'):
+ "Purpose: to prepare the headers for the xml to return"
+ # Prevent the browser from caching the result.
+ # Date in the past
+ self.setHeader('Expires','Mon, 26 Jul 1997 05:00:00 GMT')
+ # always modified
+ self.setHeader('Last-Modified',strftime("%a, %d %b %Y %H:%M:%S GMT", gmtime()))
+ # HTTP/1.1
+ self.setHeader('Cache-Control','no-store, no-cache, must-revalidate')
+ self.setHeader('Cache-Control','post-check=0, pre-check=0')
+ # HTTP/1.0
+ self.setHeader('Pragma','no-cache')
+
+ # Set the response format.
+ self.setHeader( 'Content-Type', content_type + '; charset=utf-8' )
+ return
+
+class BaseXmlMixin(object):
+ def createXmlHeader(self, command, resourceType, currentFolder, url):
+ "Purpose: returns the xml header"
+ self.setHttpHeaders()
+ # Create the XML document header
+ s = """<?xml version="1.0" encoding="utf-8" ?>"""
+ # Create the main connector node
+ s += """<Connector command="%s" resourceType="%s">""" % (
+ command,
+ resourceType
+ )
+ # Add the current folder node
+ s += """<CurrentFolder path="%s" url="%s" />""" % (
+ convertToXmlAttribute(currentFolder),
+ convertToXmlAttribute(url),
+ )
+ return s
+
+ def createXmlFooter(self):
+ "Purpose: returns the xml footer"
+ return """</Connector>"""
+
+ def sendError(self, number, text):
+ "Purpose: in the event of an error, return an xml based error"
+ self.setHttpHeaders()
+ return ("""<?xml version="1.0" encoding="utf-8" ?>""" +
+ """<Connector>""" +
+ self.sendErrorNode (number, text) +
+ """</Connector>""" )
+
+ def sendErrorNode(self, number, text):
+ return """<Error number="%s" text="%s" />""" % (number, convertToXmlAttribute(text))
+
+class BaseHtmlMixin(object):
+ def sendUploadResults( self, errorNo = 0, fileUrl = '', fileName = '', customMsg = '' ):
+ self.setHttpHeaders("text/html")
+ "This is the function that sends the results of the uploading process"
+
+ "Minified version of the document.domain automatic fix script (#1919)."
+ "The original script can be found at _dev/domain_fix_template.js"
+ return """<script type="text/javascript">
+ (function(){var d=document.domain;while (true){try{var A=window.parent.document.domain;break;}catch(e) {};d=d.replace(/.*?(?:\.|$)/,'');if (d.length==0) break;try{document.domain=d;}catch (e){break;}}})();
+
+ window.parent.OnUploadCompleted(%(errorNumber)s,"%(fileUrl)s","%(fileName)s","%(customMsg)s");
+ </script>""" % {
+ 'errorNumber': errorNo,
+ 'fileUrl': fileUrl.replace ('"', '\\"'),
+ 'fileName': fileName.replace ( '"', '\\"' ) ,
+ 'customMsg': customMsg.replace ( '"', '\\"' ),
+ }
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/fckutil.py
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/fckutil.py Thu Aug 28 18:47:59 2008
@@ -0,0 +1,126 @@
+#!/usr/bin/env python
+
+"""
+FCKeditor - The text editor for Internet - http://www.fckeditor.net
+Copyright (C) 2003-2008 Frederico Caldeira Knabben
+
+== BEGIN LICENSE ==
+
+Licensed under the terms of any of the following licenses at your
+choice:
+
+- GNU General Public License Version 2 or later (the "GPL")
+http://www.gnu.org/licenses/gpl.html
+
+- GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+http://www.gnu.org/licenses/lgpl.html
+
+- Mozilla Public License Version 1.1 or later (the "MPL")
+http://www.mozilla.org/MPL/MPL-1.1.html
+
+== END LICENSE ==
+
+Utility functions for the File Manager Connector for Python
+
+"""
+
+import string, re
+import os
+import config as Config
+
+# Generic manipulation functions
+
+def removeExtension(fileName):
+ index = fileName.rindex(".")
+ newFileName = fileName[0:index]
+ return newFileName
+
+def getExtension(fileName):
+ index = fileName.rindex(".") + 1
+ fileExtension = fileName[index:]
+ return fileExtension
+
+def removeFromStart(string, char):
+ return string.lstrip(char)
+
+def removeFromEnd(string, char):
+ return string.rstrip(char)
+
+# Path functions
+
+def combinePaths( basePath, folder ):
+ return removeFromEnd( basePath, '/' ) + '/' + removeFromStart( folder, '/' )
+
+def getFileName(filename):
+ " Purpose: helper function to extrapolate the filename "
+ for splitChar in ["/", "\\"]:
+ array = filename.split(splitChar)
+ if (len(array) > 1):
+ filename = array[-1]
+ return filename
+
+def sanitizeFolderName( newFolderName ):
+ "Do a cleanup of the folder name to avoid possible problems"
+ # Remove . \ / | : ? * " < > and control characters
+ return re.sub( '(?u)\\.|\\\\|\\/|\\||\\:|\\?|\\*|"|<|>|[^\u0000-\u001f\u007f-\u009f]', '_', newFolderName )
+
+def sanitizeFileName( newFileName ):
+ "Do a cleanup of the file name to avoid possible problems"
+ # Replace dots in the name with underscores (only one dot can be there... security issue).
+ if ( Config.ForceSingleExtension ): # remove dots
+ newFileName = re.sub ( '/\\.(?![^.]*$)/', '_', newFileName ) ;
+ newFileName = newFileName.replace('\\','/') # convert windows to unix path
+ newFileName = os.path.basename (newFileName) # strip directories
+ # Remove \ / | : ? *
+ return re.sub ( '(?u)/\\\\|\\/|\\||\\:|\\?|\\*|"|<|>|[^\u0000-\u001f\u007f-\u009f]/', '_', newFileName )
+
+def getCurrentFolder(currentFolder):
+ if not currentFolder:
+ currentFolder = '/'
+
+ # Check the current folder syntax (must begin and end with a slash).
+ if (currentFolder[-1] <> "/"):
+ currentFolder += "/"
+ if (currentFolder[0] <> "/"):
+ currentFolder = "/" + currentFolder
+
+ # Ensure the folder path has no double-slashes
+ while '//' in currentFolder:
+ currentFolder = currentFolder.replace('//','/')
+
+ # Check for invalid folder paths (..)
+ if '..' in currentFolder or '\\' in currentFolder:
+ return None
+
+ return currentFolder
+
+def mapServerPath( environ, url):
+ " Emulate the asp Server.mapPath function. Given an url path return the physical directory that it corresponds to "
+ # This isn't correct but for the moment there's no other solution
+ # If this script is under a virtual directory or symlink it will detect the problem and stop
+ return combinePaths( getRootPath(environ), url )
+
+def mapServerFolder(resourceTypePath, folderPath):
+ return combinePaths ( resourceTypePath , folderPath )
+
+def getRootPath(environ):
+ "Purpose: returns the root path on the server"
+ # WARNING: this may not be thread safe, and doesn't work w/ VirtualServer/mod_python
+ # Use Config.UserFilesAbsolutePath instead
+
+ if environ.has_key('DOCUMENT_ROOT'):
+ return environ['DOCUMENT_ROOT']
+ else:
+ realPath = os.path.realpath( './' )
+ selfPath = environ['SCRIPT_FILENAME']
+ selfPath = selfPath [ : selfPath.rfind( '/' ) ]
+ selfPath = selfPath.replace( '/', os.path.sep)
+
+ position = realPath.find(selfPath)
+
+ # This can check only that this script isn't run from a virtual dir
+ # But it avoids the problems that arise if it isn't checked
+ raise realPath
+ if ( position < 0 or position <> len(realPath) - len(selfPath) or realPath[ : position ]==''):
+ raise Exception('Sorry, can\'t map "UserFilesPath" to a physical path. You must set the "UserFilesAbsolutePath" value in "editor/filemanager/connectors/py/config.py".')
+ return realPath[ : position ]
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/htaccess.txt
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/htaccess.txt Thu Aug 28 18:47:59 2008
@@ -0,0 +1,23 @@
+# replace the name of this file to .htaccess (if using apache),
+# and set the proper options and paths according your enviroment
+
+Allow from all
+
+# If using mod_python uncomment this:
+PythonPath "[r'C:\Archivos de programa\Apache Software Foundation\Apache2.2\htdocs\fckeditor\editor\filemanager\connectors\py'] + sys.path"
+
+
+# Recomended: WSGI application running with mod_python and modpython_gateway
+SetHandler python-program
+PythonHandler modpython_gateway::handler
+PythonOption wsgi.application wsgi::App
+
+
+# Emulated CGI with mod_python and cgihandler
+#AddHandler mod_python .py
+#PythonHandler mod_python.cgihandler
+
+
+# Plain old CGI
+#Options +ExecCGI
+#AddHandler cgi-script py
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/upload.py
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/upload.py Thu Aug 28 18:47:59 2008
@@ -0,0 +1,88 @@
+#!/usr/bin/env python
+
+"""
+FCKeditor - The text editor for Internet - http://www.fckeditor.net
+Copyright (C) 2003-2008 Frederico Caldeira Knabben
+
+== BEGIN LICENSE ==
+
+Licensed under the terms of any of the following licenses at your
+choice:
+
+- GNU General Public License Version 2 or later (the "GPL")
+http://www.gnu.org/licenses/gpl.html
+
+- GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+http://www.gnu.org/licenses/lgpl.html
+
+- Mozilla Public License Version 1.1 or later (the "MPL")
+http://www.mozilla.org/MPL/MPL-1.1.html
+
+== END LICENSE ==
+
+This is the "File Uploader" for Python
+
+"""
+import os
+
+from fckutil import *
+from fckcommands import * # default command's implementation
+from fckconnector import FCKeditorConnectorBase # import base connector
+import config as Config
+
+class FCKeditorQuickUpload( FCKeditorConnectorBase,
+ UploadFileCommandMixin,
+ BaseHttpMixin, BaseHtmlMixin):
+ def doResponse(self):
+ "Main function. Process the request, set headers and return a string as response."
+ # Check if this connector is disabled
+ if not(Config.Enabled):
+ return self.sendUploadResults(1, "This file uploader is disabled. Please check the \"editor/filemanager/connectors/py/config.py\"")
+ command = 'QuickUpload'
+ # The file type (from the QueryString, by default 'File').
+ resourceType = self.request.get('Type','File')
+ currentFolder = getCurrentFolder(self.request.get("CurrentFolder",""))
+ # Check for invalid paths
+ if currentFolder is None:
+ return self.sendUploadResults(102, '', '', "")
+
+ # Check if it is an allowed command
+ if ( not command in Config.ConfigAllowedCommands ):
+ return self.sendUploadResults( 1, '', '', 'The %s command isn\'t allowed' % command )
+
+ if ( not resourceType in Config.ConfigAllowedTypes ):
+ return self.sendUploadResults( 1, '', '', 'Invalid type specified' )
+
+ # Setup paths
+ self.userFilesFolder = Config.QuickUploadAbsolutePath[resourceType]
+ self.webUserFilesFolder = Config.QuickUploadPath[resourceType]
+ if not self.userFilesFolder: # no absolute path given (dangerous...)
+ self.userFilesFolder = mapServerPath(self.environ,
+ self.webUserFilesFolder)
+
+ # Ensure that the directory exists.
+ if not os.path.exists(self.userFilesFolder):
+ try:
+ self.createServerFoldercreateServerFolder( self.userFilesFolder )
+ except:
+ return self.sendError(1, "This connector couldn\'t access to local user\'s files directories. Please check the UserFilesAbsolutePath in \"editor/filemanager/connectors/py/config.py\" and try again. ")
+
+ # File upload doesn't have to return XML, so intercept here
+ return self.uploadFile(resourceType, currentFolder)
+
+# Running from command line (plain old CGI)
+if __name__ == '__main__':
+ try:
+ # Create a Connector Instance
+ conn = FCKeditorQuickUpload()
+ data = conn.doResponse()
+ for header in conn.headers:
+ if not header is None:
+ print '%s: %s' % header
+ print
+ print data
+ except:
+ print "Content-Type: text/plain"
+ print
+ import cgi
+ cgi.print_exception()
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/wsgi.py
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/wsgi.py Thu Aug 28 18:47:59 2008
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+
+"""
+FCKeditor - The text editor for Internet - http://www.fckeditor.net
+Copyright (C) 2003-2008 Frederico Caldeira Knabben
+
+== BEGIN LICENSE ==
+
+Licensed under the terms of any of the following licenses at your
+choice:
+
+ - GNU General Public License Version 2 or later (the "GPL")
+ http://www.gnu.org/licenses/gpl.html
+
+ - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ http://www.gnu.org/licenses/lgpl.html
+
+ - Mozilla Public License Version 1.1 or later (the "MPL")
+ http://www.mozilla.org/MPL/MPL-1.1.html
+
+== END LICENSE ==
+
+Connector/QuickUpload for Python (WSGI wrapper).
+
+See config.py for configuration settings
+
+"""
+
+from connector import FCKeditorConnector
+from upload import FCKeditorQuickUpload
+
+import cgitb
+from cStringIO import StringIO
+
+# Running from WSGI capable server (recomended)
+def App(environ, start_response):
+ "WSGI entry point. Run the connector"
+ if environ['SCRIPT_NAME'].endswith("connector.py"):
+ conn = FCKeditorConnector(environ)
+ elif environ['SCRIPT_NAME'].endswith("upload.py"):
+ conn = FCKeditorQuickUpload(environ)
+ else:
+ start_response ("200 Ok", [('Content-Type','text/html')])
+ yield "Unknown page requested: "
+ yield environ['SCRIPT_NAME']
+ return
+ try:
+ # run the connector
+ data = conn.doResponse()
+ # Start WSGI response:
+ start_response ("200 Ok", conn.headers)
+ # Send response text
+ yield data
+ except:
+ start_response("500 Internal Server Error",[("Content-type","text/html")])
+ file = StringIO()
+ cgitb.Hook(file = file).handle()
+ yield file.getvalue()
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/zope.py
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/py/zope.py Thu Aug 28 18:47:59 2008
@@ -0,0 +1,188 @@
+#!/usr/bin/env python
+
+"""
+FCKeditor - The text editor for Internet - http://www.fckeditor.net
+Copyright (C) 2003-2008 Frederico Caldeira Knabben
+
+== BEGIN LICENSE ==
+
+Licensed under the terms of any of the following licenses at your
+choice:
+
+- GNU General Public License Version 2 or later (the "GPL")
+http://www.gnu.org/licenses/gpl.html
+
+- GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+http://www.gnu.org/licenses/lgpl.html
+
+- Mozilla Public License Version 1.1 or later (the "MPL")
+http://www.mozilla.org/MPL/MPL-1.1.html
+
+== END LICENSE ==
+
+Connector for Python and Zope.
+
+This code was not tested at all.
+It just was ported from pre 2.5 release, so for further reference see
+\editor\filemanager\browser\default\connectors\py\connector.py in previous
+releases.
+
+"""
+
+from fckutil import *
+from connector import *
+import config as Config
+
+class FCKeditorConnectorZope(FCKeditorConnector):
+ """
+ Zope versiof FCKeditorConnector
+ """
+ # Allow access (Zope)
+ __allow_access_to_unprotected_subobjects__ = 1
+
+ def __init__(self, context=None):
+ """
+ Constructor
+ """
+ FCKeditorConnector.__init__(self, environ=None) # call superclass constructor
+ # Instance Attributes
+ self.context = context
+ self.request = FCKeditorRequest(context)
+
+ def getZopeRootContext(self):
+ if self.zopeRootContext is None:
+ self.zopeRootContext = self.context.getPhysicalRoot()
+ return self.zopeRootContext
+
+ def getZopeUploadContext(self):
+ if self.zopeUploadContext is None:
+ folderNames = self.userFilesFolder.split("/")
+ c = self.getZopeRootContext()
+ for folderName in folderNames:
+ if (folderName <> ""):
+ c = c[folderName]
+ self.zopeUploadContext = c
+ return self.zopeUploadContext
+
+ def setHeader(self, key, value):
+ self.context.REQUEST.RESPONSE.setHeader(key, value)
+
+ def getFolders(self, resourceType, currentFolder):
+ # Open the folders node
+ s = ""
+ s += """<Folders>"""
+ zopeFolder = self.findZopeFolder(resourceType, currentFolder)
+ for (name, o) in zopeFolder.objectItems(["Folder"]):
+ s += """<Folder name="%s" />""" % (
+ convertToXmlAttribute(name)
+ )
+ # Close the folders node
+ s += """</Folders>"""
+ return s
+
+ def getZopeFoldersAndFiles(self, resourceType, currentFolder):
+ folders = self.getZopeFolders(resourceType, currentFolder)
+ files = self.getZopeFiles(resourceType, currentFolder)
+ s = folders + files
+ return s
+
+ def getZopeFiles(self, resourceType, currentFolder):
+ # Open the files node
+ s = ""
+ s += """<Files>"""
+ zopeFolder = self.findZopeFolder(resourceType, currentFolder)
+ for (name, o) in zopeFolder.objectItems(["File","Image"]):
+ s += """<File name="%s" size="%s" />""" % (
+ convertToXmlAttribute(name),
+ ((o.get_size() / 1024) + 1)
+ )
+ # Close the files node
+ s += """</Files>"""
+ return s
+
+ def findZopeFolder(self, resourceType, folderName):
+ # returns the context of the resource / folder
+ zopeFolder = self.getZopeUploadContext()
+ folderName = self.removeFromStart(folderName, "/")
+ folderName = self.removeFromEnd(folderName, "/")
+ if (resourceType <> ""):
+ try:
+ zopeFolder = zopeFolder[resourceType]
+ except:
+ zopeFolder.manage_addProduct["OFSP"].manage_addFolder(id=resourceType, title=resourceType)
+ zopeFolder = zopeFolder[resourceType]
+ if (folderName <> ""):
+ folderNames = folderName.split("/")
+ for folderName in folderNames:
+ zopeFolder = zopeFolder[folderName]
+ return zopeFolder
+
+ def createFolder(self, resourceType, currentFolder):
+ # Find out where we are
+ zopeFolder = self.findZopeFolder(resourceType, currentFolder)
+ errorNo = 0
+ errorMsg = ""
+ if self.request.has_key("NewFolderName"):
+ newFolder = self.request.get("NewFolderName", None)
+ zopeFolder.manage_addProduct["OFSP"].manage_addFolder(id=newFolder, title=newFolder)
+ else:
+ errorNo = 102
+ return self.sendErrorNode ( errorNo, errorMsg )
+
+ def uploadFile(self, resourceType, currentFolder, count=None):
+ zopeFolder = self.findZopeFolder(resourceType, currentFolder)
+ file = self.request.get("NewFile", None)
+ fileName = self.getFileName(file.filename)
+ fileNameOnly = self.removeExtension(fileName)
+ fileExtension = self.getExtension(fileName).lower()
+ if (count):
+ nid = "%s.%s.%s" % (fileNameOnly, count, fileExtension)
+ else:
+ nid = fileName
+ title = nid
+ try:
+ zopeFolder.manage_addProduct['OFSP'].manage_addFile(
+ id=nid,
+ title=title,
+ file=file.read()
+ )
+ except:
+ if (count):
+ count += 1
+ else:
+ count = 1
+ return self.zopeFileUpload(resourceType, currentFolder, count)
+ return self.sendUploadResults( 0 )
+
+class FCKeditorRequest(object):
+ "A wrapper around the request object"
+ def __init__(self, context=None):
+ r = context.REQUEST
+ self.request = r
+
+ def has_key(self, key):
+ return self.request.has_key(key)
+
+ def get(self, key, default=None):
+ return self.request.get(key, default)
+
+"""
+Running from zope, you will need to modify this connector.
+If you have uploaded the FCKeditor into Zope (like me), you need to
+move this connector out of Zope, and replace the "connector" with an
+alias as below. The key to it is to pass the Zope context in, as
+we then have a like to the Zope context.
+
+## Script (Python) "connector.py"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=*args, **kws
+##title=ALIAS
+##
+
+import Products.zope as connector
+return connector.FCKeditorConnectorZope(context=context).doResponse()
+"""
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/test.html
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/test.html Thu Aug 28 18:47:59 2008
@@ -0,0 +1,210 @@
+<!--
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Test page for the File Browser connectors.
+-->
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <title>FCKeditor - Connectors Tests</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <script type="text/javascript">
+
+// Automatically detect the correct document.domain (#1919).
+(function()
+{
+ var d = document.domain ;
+
+ while ( true )
+ {
+ // Test if we can access a parent property.
+ try
+ {
+ var test = window.opener.document.domain ;
+ break ;
+ }
+ catch( e ) {}
+
+ // Remove a domain part: www.mytest.example.com => mytest.example.com => example.com ...
+ d = d.replace( /.*?(?:\.|$)/, '' ) ;
+
+ if ( d.length == 0 )
+ break ; // It was not able to detect the domain.
+
+ try
+ {
+ document.domain = d ;
+ }
+ catch (e)
+ {
+ break ;
+ }
+ }
+})() ;
+
+function BuildBaseUrl( command )
+{
+ var sUrl =
+ document.getElementById('cmbConnector').value +
+ '?Command=' + command +
+ '&Type=' + document.getElementById('cmbType').value +
+ '&CurrentFolder=' + encodeURIComponent(document.getElementById('txtFolder').value) ;
+
+ return sUrl ;
+}
+
+function SetFrameUrl( url )
+{
+ document.getElementById('eRunningFrame').src = url ;
+
+ document.getElementById('eUrl').innerHTML = url ;
+}
+
+function GetFolders()
+{
+ SetFrameUrl( BuildBaseUrl( 'GetFolders' ) ) ;
+ return false ;
+}
+
+function GetFoldersAndFiles()
+{
+ SetFrameUrl( BuildBaseUrl( 'GetFoldersAndFiles' ) ) ;
+ return false ;
+}
+
+function CreateFolder()
+{
+ var sFolder = prompt( 'Type the folder name:', 'Test Folder' ) ;
+
+ if ( ! sFolder )
+ return false ;
+
+ var sUrl = BuildBaseUrl( 'CreateFolder' ) ;
+ sUrl += '&NewFolderName=' + encodeURIComponent( sFolder ) ;
+
+ SetFrameUrl( sUrl ) ;
+ return false ;
+}
+
+function OnUploadCompleted( errorNumber, fileName )
+{
+ switch ( errorNumber )
+ {
+ case 0 :
+ alert( 'File uploaded with no errors' ) ;
+ break ;
+ case 201 :
+ GetFoldersAndFiles() ;
+ alert( 'A file with the same name is already available. The uploaded file has been renamed to "' + fileName + '"' ) ;
+ break ;
+ case 202 :
+ alert( 'Invalid file' ) ;
+ break ;
+ default :
+ alert( 'Error on file upload. Error number: ' + errorNumber ) ;
+ break ;
+ }
+}
+
+this.frames.frmUpload = this ;
+
+function SetAction()
+{
+ var sUrl = BuildBaseUrl( 'FileUpload' ) ;
+ document.getElementById('eUrl').innerHTML = sUrl ;
+ document.getElementById('frmUpload').action = sUrl ;
+}
+
+ </script>
+</head>
+<body>
+ <table height="100%" cellspacing="0" cellpadding="0" width="100%" border="0">
+ <tr>
+ <td>
+ <table cellspacing="0" cellpadding="0" border="0">
+ <tr>
+ <td>
+ Connector:<br />
+ <select id="cmbConnector" name="cmbConnector">
+ <option value="asp/connector.asp" selected="selected">ASP</option>
+ <option value="aspx/connector.aspx">ASP.Net</option>
+ <option value="cfm/connector.cfm">ColdFusion</option>
+ <option value="lasso/connector.lasso">Lasso</option>
+ <option value="perl/connector.cgi">Perl</option>
+ <option value="php/connector.php">PHP</option>
+ <option value="py/connector.py">Python</option>
+ </select>
+ </td>
+ <td>
+ </td>
+ <td>
+ Current Folder<br />
+ <input id="txtFolder" type="text" value="/" name="txtFolder" /></td>
+ <td>
+ </td>
+ <td>
+ Resource Type<br />
+ <select id="cmbType" name="cmbType">
+ <option value="File" selected="selected">File</option>
+ <option value="Image">Image</option>
+ <option value="Flash">Flash</option>
+ <option value="Media">Media</option>
+ <option value="Invalid">Invalid Type (for testing)</option>
+ </select>
+ </td>
+ </tr>
+ </table>
+ <br />
+ <table cellspacing="0" cellpadding="0" border="0">
+ <tr>
+ <td valign="top">
+ <a href="#" onclick="GetFolders();">Get Folders</a></td>
+ <td>
+ </td>
+ <td valign="top">
+ <a href="#" onclick="GetFoldersAndFiles();">Get Folders and Files</a></td>
+ <td>
+ </td>
+ <td valign="top">
+ <a href="#" onclick="CreateFolder();">Create Folder</a></td>
+ <td>
+ </td>
+ <td valign="top">
+ <form id="frmUpload" action="" target="eRunningFrame" method="post" enctype="multipart/form-data">
+ File Upload<br />
+ <input id="txtFileUpload" type="file" name="NewFile" />
+ <input type="submit" value="Upload" onclick="SetAction();" />
+ </form>
+ </td>
+ </tr>
+ </table>
+ <br />
+ URL: <span id="eUrl"></span>
+ </td>
+ </tr>
+ <tr>
+ <td height="100%" valign="top">
+ <iframe id="eRunningFrame" src="javascript:void(0)" name="eRunningFrame" width="100%"
+ height="100%"></iframe>
+ </td>
+ </tr>
+ </table>
+</body>
+</html>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/uploadtest.html
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/filemanager/connectors/uploadtest.html Thu Aug 28 18:47:59 2008
@@ -0,0 +1,192 @@
+<!--
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Test page for the "File Uploaders".
+-->
+<html>
+ <head>
+ <title>FCKeditor - Uploaders Tests</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <script type="text/javascript">
+
+// Automatically detect the correct document.domain (#1919).
+(function()
+{
+ var d = document.domain ;
+
+ while ( true )
+ {
+ // Test if we can access a parent property.
+ try
+ {
+ var test = window.opener.document.domain ;
+ break ;
+ }
+ catch( e ) {}
+
+ // Remove a domain part: www.mytest.example.com => mytest.example.com => example.com ...
+ d = d.replace( /.*?(?:\.|$)/, '' ) ;
+
+ if ( d.length == 0 )
+ break ; // It was not able to detect the domain.
+
+ try
+ {
+ document.domain = d ;
+ }
+ catch (e)
+ {
+ break ;
+ }
+ }
+})() ;
+
+function SendFile()
+{
+ var sUploaderUrl = cmbUploaderUrl.value ;
+
+ if ( sUploaderUrl.length == 0 )
+ sUploaderUrl = txtCustomUrl.value ;
+
+ if ( sUploaderUrl.length == 0 )
+ {
+ alert( 'Please provide your custom URL or select a default one' ) ;
+ return ;
+ }
+
+ eURL.innerHTML = sUploaderUrl ;
+ txtUrl.value = '' ;
+
+ var date = new Date()
+
+ frmUpload.action = sUploaderUrl + '?time=' + date.getTime();
+ if (document.getElementById('cmbType').value) {
+ frmUpload.action = frmUpload.action + '&Type='+document.getElementById('cmbType').value;
+ }
+ if (document.getElementById('CurrentFolder').value) {
+ frmUpload.action = frmUpload.action + '&CurrentFolder='+document.getElementById('CurrentFolder').value;
+ }
+ frmUpload.submit() ;
+}
+
+function OnUploadCompleted( errorNumber, fileUrl, fileName, customMsg )
+{
+ switch ( errorNumber )
+ {
+ case 0 : // No errors
+ txtUrl.value = fileUrl ;
+ alert( 'File uploaded with no errors' ) ;
+ break ;
+ case 1 : // Custom error
+ alert( customMsg ) ;
+ break ;
+ case 10 : // Custom warning
+ txtUrl.value = fileUrl ;
+ alert( customMsg ) ;
+ break ;
+ case 201 :
+ txtUrl.value = fileUrl ;
+ alert( 'A file with the same name is already available. The uploaded file has been renamed to "' + fileName + '"' ) ;
+ break ;
+ case 202 :
+ alert( 'Invalid file' ) ;
+ break ;
+ case 203 :
+ alert( "Security error. You probably don't have enough permissions to upload. Please check your server." ) ;
+ break ;
+ default :
+ alert( 'Error on file upload. Error number: ' + errorNumber ) ;
+ break ;
+ }
+}
+
+ </script>
+ </head>
+ <body>
+ <table cellSpacing="0" cellPadding="0" width="100%" border="0" height="100%">
+ <tr>
+ <td>
+ <table cellSpacing="0" cellPadding="0" width="100%" border="0">
+ <tr>
+ <td nowrap>
+ Select the "File Uploader" to use: <br>
+ <select id="cmbUploaderUrl">
+ <option selected value="asp/upload.asp">ASP</option>
+ <option value="aspx/upload.aspx">ASP.Net</option>
+ <option value="cfm/upload.cfm">ColdFusion</option>
+ <option value="lasso/upload.lasso">Lasso</option>
+ <option value="perl/upload.cgi">Perl</option>
+ <option value="php/upload.php">PHP</option>
+ <option value="py/upload.py">Python</option>
+ <option value="">(Custom)</option>
+ </select>
+ </td>
+ <td>
+ Resource Type<br />
+ <select id="cmbType" name="cmbType">
+ <option value="">None</option>
+ <option value="File">File</option>
+ <option value="Image">Image</option>
+ <option value="Flash">Flash</option>
+ <option value="Media">Media</option>
+ <option value="Invalid">Invalid Type (for testing)</option>
+ </select>
+ </td>
+ <td>
+ Current Folder: <br>
+ <input type="text" name="CurrentFolder" id="CurrentFolder" value="/">
+ </td>
+ <td nowrap> </td>
+ <td width="100%">
+ Custom Uploader URL:<BR>
+ <input id="txtCustomUrl" style="WIDTH: 100%; BACKGROUND-COLOR: #dcdcdc" disabled type="text">
+ </td>
+ </tr>
+ </table>
+ <br>
+ <table cellSpacing="0" cellPadding="0" width="100%" border="0">
+ <tr>
+ <td noWrap>
+ <form id="frmUpload" target="UploadWindow" enctype="multipart/form-data" action="" method="post">
+ Upload a new file:<br>
+ <input type="file" name="NewFile"><br>
+
+ <input type="button" value="Send it to the Server" onclick="SendFile();">
+ </form>
+ </td>
+ <td style="WIDTH: 16px"> </td>
+ <td vAlign="top" width="100%">
+ Uploaded File URL:<br>
+ <INPUT id="txtUrl" style="WIDTH: 100%" readonly type="text">
+ </td>
+ </tr>
+ </table>
+ <br>
+ Post URL: <span id="eURL"> </span>
+ </td>
+ </tr>
+ <tr>
+ <td height="100%">
+ <iframe name="UploadWindow" width="100%" height="100%" src="javascript:void(0)"></iframe>
+ </td>
+ </tr>
+ </table>
+ </body>
+</html>
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/js/fckadobeair.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/js/fckadobeair.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,176 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Compatibility code for Adobe AIR.
+ */
+
+if ( FCKBrowserInfo.IsAIR )
+{
+ var FCKAdobeAIR = (function()
+ {
+ /*
+ * ### Private functions.
+ */
+
+ var getDocumentHead = function( doc )
+ {
+ var head ;
+ var heads = doc.getElementsByTagName( 'head' ) ;
+
+ if( heads && heads[0] )
+ head = heads[0] ;
+ else
+ {
+ head = doc.createElement( 'head' ) ;
+ doc.documentElement.insertBefore( head, doc.documentElement.firstChild ) ;
+ }
+
+ return head ;
+ } ;
+
+ /*
+ * ### Public interface.
+ */
+ return {
+ FCKeditorAPI_Evaluate : function( parentWindow, script )
+ {
+ // TODO : This one doesn't work always. The parent window will
+ // point to an anonymous function in this window. If this
+ // window is destroyied the parent window will be pointing to
+ // an invalid reference.
+
+ // Evaluate the script in this window.
+ eval( script ) ;
+
+ // Point the FCKeditorAPI property of the parent window to the
+ // local reference.
+ parentWindow.FCKeditorAPI = window.FCKeditorAPI ;
+ },
+
+ EditingArea_Start : function( doc, html )
+ {
+ // Get the HTML for the <head>.
+ var headInnerHtml = html.match( /<head>([\s\S]*)<\/head>/i )[1] ;
+
+ if ( headInnerHtml && headInnerHtml.length > 0 )
+ {
+ // Inject the <head> HTML inside a <div>.
+ // Do that before getDocumentHead because WebKit moves
+ // <link css> elements to the <head> at this point.
+ var div = doc.createElement( 'div' ) ;
+ div.innerHTML = headInnerHtml ;
+
+ // Move the <div> nodes to <head>.
+ FCKDomTools.MoveChildren( div, getDocumentHead( doc ) ) ;
+ }
+
+ doc.body.innerHTML = html.match( /<body>([\s\S]*)<\/body>/i )[1] ;
+
+ //prevent clicking on hyperlinks and navigating away
+ doc.addEventListener('click', function( ev )
+ {
+ ev.preventDefault() ;
+ ev.stopPropagation() ;
+ }, true ) ;
+ },
+
+ Panel_Contructor : function( doc, baseLocation )
+ {
+ var head = getDocumentHead( doc ) ;
+
+ // Set the <base> href.
+ head.appendChild( doc.createElement('base') ).href = baseLocation ;
+
+ doc.body.style.margin = '0px' ;
+ doc.body.style.padding = '0px' ;
+ },
+
+ ToolbarSet_GetOutElement : function( win, outMatch )
+ {
+ var toolbarTarget = win.parent ;
+
+ var targetWindowParts = outMatch[1].split( '.' ) ;
+ while ( targetWindowParts.length > 0 )
+ {
+ var part = targetWindowParts.shift() ;
+ if ( part.length > 0 )
+ toolbarTarget = toolbarTarget[ part ] ;
+ }
+
+ toolbarTarget = toolbarTarget.document.getElementById( outMatch[2] ) ;
+ },
+
+ ToolbarSet_InitOutFrame : function( doc )
+ {
+ var head = getDocumentHead( doc ) ;
+
+ head.appendChild( doc.createElement('base') ).href = window.document.location ;
+
+ var targetWindow = doc.defaultView;
+
+ targetWindow.adjust = function()
+ {
+ targetWindow.frameElement.height = doc.body.scrollHeight;
+ } ;
+
+ targetWindow.onresize = targetWindow.adjust ;
+ targetWindow.setTimeout( targetWindow.adjust, 0 ) ;
+
+ doc.body.style.overflow = 'hidden';
+ doc.body.innerHTML = document.getElementById( 'xToolbarSpace' ).innerHTML ;
+ }
+ } ;
+ })();
+
+ /*
+ * ### Overrides
+ */
+ ( function()
+ {
+ // Save references for override reuse.
+ var _Original_FCKPanel_Window_OnFocus = FCKPanel_Window_OnFocus ;
+ var _Original_FCKPanel_Window_OnBlur = FCKPanel_Window_OnBlur ;
+ var _Original_FCK_StartEditor = FCK.StartEditor ;
+
+ FCKPanel_Window_OnFocus = function( e, panel )
+ {
+ // Call the original implementation.
+ _Original_FCKPanel_Window_OnFocus.call( this, e, panel ) ;
+
+ if ( panel._focusTimer )
+ clearTimeout( panel._focusTimer ) ;
+ }
+
+ FCKPanel_Window_OnBlur = function( e, panel )
+ {
+ // Delay the execution of the original function.
+ panel._focusTimer = FCKTools.SetTimeout( _Original_FCKPanel_Window_OnBlur, 100, this, [ e, panel ] ) ;
+ }
+
+ FCK.StartEditor = function()
+ {
+ // Force pointing to the CSS files instead of using the inline CSS cached styles.
+ window.FCK_InternalCSS = FCKConfig.BasePath + 'css/fck_internal.css' ;
+ window.FCK_ShowTableBordersCSS = FCKConfig.BasePath + 'css/fck_showtableborders_gecko.css' ;
+
+ _Original_FCK_StartEditor.apply( this, arguments ) ;
+ }
+ })();
+}
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/js/fckeditorcode_gecko.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/js/fckeditorcode_gecko.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/js/fckeditorcode_gecko.js Thu Aug 28 18:47:59 2008
@@ -24,64 +24,64 @@
var FCK_STATUS_NOTLOADED=window.parent.FCK_STATUS_NOTLOADED=0;var FCK_STATUS_ACTIVE=window.parent.FCK_STATUS_ACTIVE=1;var FCK_STATUS_COMPLETE=window.parent.FCK_STATUS_COMPLETE=2;var FCK_TRISTATE_OFF=window.parent.FCK_TRISTATE_OFF=0;var FCK_TRISTATE_ON=window.parent.FCK_TRISTATE_ON=1;var FCK_TRISTATE_DISABLED=window.parent.FCK_TRISTATE_DISABLED=-1;var FCK_UNKNOWN=window.parent.FCK_UNKNOWN=-9;var FCK_TOOLBARITEM_ONLYICON=window.parent.FCK_TOOLBARITEM_ONLYICON=0;var FCK_TOOLBARITEM_ONLYTEXT=window.parent.FCK_TOOLBARITEM_ONLYTEXT=1;var FCK_TOOLBARITEM_ICONTEXT=window.parent.FCK_TOOLBARITEM_ICONTEXT=2;var FCK_EDITMODE_WYSIWYG=window.parent.FCK_EDITMODE_WYSIWYG=0;var FCK_EDITMODE_SOURCE=window.parent.FCK_EDITMODE_SOURCE=1;var FCK_IMAGES_PATH='images/';var FCK_SPACER_PATH='images/spacer.gif';var CTRL=1000;var SHIFT=2000;var ALT=4000;var FCK_STYLE_BLOCK=0;var FCK_STYLE_INLINE=1;var FCK_STYLE_OBJECT=2;
String.prototype.Contains=function(A){return (this.indexOf(A)>-1);};String.prototype.Equals=function(){var A=arguments;if (A.length==1&&A[0].pop) A=A[0];for (var i=0;i<A.length;i++){if (this==A[i]) return true;};return false;};String.prototype.IEquals=function(){var A=this.toUpperCase();var B=arguments;if (B.length==1&&B[0].pop) B=B[0];for (var i=0;i<B.length;i++){if (A==B[i].toUpperCase()) return true;};return false;};String.prototype.ReplaceAll=function(A,B){var C=this;for (var i=0;i<A.length;i++){C=C.replace(A[i],B[i]);};return C;};String.prototype.StartsWith=function(A){return (this.substr(0,A.length)==A);};String.prototype.EndsWith=function(A,B){var C=this.length;var D=A.length;if (D>C) return false;if (B){var E=new RegExp(A+'$','i');return E.test(this);}else return (D==0||this.substr(C-D,D)==A);};String.prototype.Remove=function(A,B){var s='';if (A>0) s=this.substring(0,A);if (A+B<this.length) s+=this.substring(A+B,this.length);return s;};String.prototype.Trim=function(){return this.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g,'');};String.prototype.LTrim=function(){return this.replace(/^[ \t\n\r]*/g,'');};String.prototype.RTrim=function(){return this.replace(/[ \t\n\r]*$/g,'');};String.prototype.ReplaceNewLineChars=function(A){return this.replace(/\n/g,A);};String.prototype.Replace=function(A,B,C){if (typeof B=='function'){return this.replace(A,function(){return B.apply(C||this,arguments);});}else return this.replace(A,B);};Array.prototype.AddItem=function(A){var i=this.length;this[i]=A;return i;};Array.prototype.IndexOf=function(A){for (var i=0;i<this.length;i++){if (this[i]==A) return i;};return-1;};
-var s=navigator.userAgent.toLowerCase();var FCKBrowserInfo={IsIE:/*@cc_on!@*/false,IsIE7:/*@cc_on!@*/false && ( parseInt( s.match( /msie (\d+)/)[1],10)>=7),IsIE6:/*@cc_on!@*/false && ( parseInt( s.match( /msie (\d+)/)[1],10)>=6),IsSafari:s.Contains(' applewebkit/'),IsOpera:!!window.opera,IsAIR:s.Contains(' adobeair/'),IsMac:s.Contains('macintosh')};(function(A){A.IsGecko=(navigator.product=='Gecko')&&!A.IsSafari&&!A.IsOpera;A.IsGeckoLike=(A.IsGecko||A.IsSafari||A.IsOpera);if (A.IsGecko){var B=s.match(/rv:(\d+\.\d+)/);var C=B&&parseFloat(B[1]);if (C){A.IsGecko10=(C<1.8);A.IsGecko19=(C>1.8);}}})(FCKBrowserInfo);
+var s=navigator.userAgent.toLowerCase();var FCKBrowserInfo={IsIE:/*@cc_on!@*/false,IsIE7:/*@cc_on!@*/false&&(parseInt(s.match(/msie (\d+)/)[1],10)>=7),IsIE6:/*@cc_on!@*/false&&(parseInt(s.match(/msie (\d+)/)[1],10)>=6),IsSafari:s.Contains(' applewebkit/'),IsOpera:!!window.opera,IsAIR:s.Contains(' adobeair/'),IsMac:s.Contains('macintosh')};(function(A){A.IsGecko=(navigator.product=='Gecko')&&!A.IsSafari&&!A.IsOpera;A.IsGeckoLike=(A.IsGecko||A.IsSafari||A.IsOpera);if (A.IsGecko){var B=s.match(/rv:(\d+\.\d+)/);var C=B&&parseFloat(B[1]);if (C){A.IsGecko10=(C<1.8);A.IsGecko19=(C>1.8);}}})(FCKBrowserInfo);
var FCKURLParams={};(function(){var A=document.location.search.substr(1).split('&');for (var i=0;i<A.length;i++){var B=A[i].split('=');var C=decodeURIComponent(B[0]);var D=decodeURIComponent(B[1]);FCKURLParams[C]=D;}})();
var FCKEvents=function(A){this.Owner=A;this._RegisteredEvents={};};FCKEvents.prototype.AttachEvent=function(A,B){var C;if (!(C=this._RegisteredEvents[A])) this._RegisteredEvents[A]=[B];else{if (C.IndexOf(B)==-1) C.push(B);}};FCKEvents.prototype.FireEvent=function(A,B){var C=true;var D=this._RegisteredEvents[A];if (D){for (var i=0;i<D.length;i++){try{C=(D[i](this.Owner,B)&&C);}catch(e){if (e.number!=-2146823277) throw e;}}};return C;};
var FCKDataProcessor=function(){};FCKDataProcessor.prototype={ConvertToHtml:function(A){if (FCKConfig.FullPage){FCK.DocTypeDeclaration=A.match(FCKRegexLib.DocTypeTag);if (!FCKRegexLib.HasBodyTag.test(A)) A='<body>'+A+'</body>';if (!FCKRegexLib.HtmlOpener.test(A)) A='<html dir="'+FCKConfig.ContentLangDirection+'">'+A+'</html>';if (!FCKRegexLib.HeadOpener.test(A)) A=A.replace(FCKRegexLib.HtmlOpener,'$&<head><title></title></head>');return A;}else{var B=FCKConfig.DocType+'<html dir="'+FCKConfig.ContentLangDirection+'"';if (FCKBrowserInfo.IsIE&&FCKConfig.DocType.length>0&&!FCKRegexLib.Html4DocType.test(FCKConfig.DocType)) B+=' style="overflow-y: scroll"';B+='><head><title></title></head><body'+FCKConfig.GetBodyAttributes()+'>'+A+'</body></html>';return B;}},ConvertToDataFormat:function(A,B,C,D){var E=FCKXHtml.GetXHTML(A,!B,D);if (C&&FCKRegexLib.EmptyOutParagraph.test(E)) return '';return E;},FixHtml:function(A){return A;}};
-var FCK={Name:FCKURLParams['InstanceName'],Status:0,EditMode:0,Toolbar:null,HasFocus:false,DataProcessor:new FCKDataProcessor(),GetInstanceObject:(function(){var w=window;return function(name){return w[name];}})(),AttachToOnSelectionChange:function(A){this.Events.AttachEvent('OnSelectionChange',A);},GetLinkedFieldValue:function(){return this.LinkedField.value;},GetParentForm:function(){return this.LinkedField.form;},StartupValue:'',IsDirty:function(){if (this.EditMode==1) return (this.StartupValue!=this.EditingArea.Textarea.value);else{if (!this.EditorDocument) return false;return (this.StartupValue!=this.EditorDocument.body.innerHTML);}},ResetIsDirty:function(){if (this.EditMode==1) this.StartupValue=this.EditingArea.Textarea.value;else if (this.EditorDocument.body) this.StartupValue=this.EditorDocument.body.innerHTML;},StartEditor:function(){this.TempBaseTag=FCKConfig.BaseHref.length>0?'<base href="'+FCKConfig.BaseHref+'" _fcktemp="true"></base>':'';var A=FCK.KeystrokeHandler=new FCKKeystrokeHandler();A.OnKeystroke=_FCK_KeystrokeHandler_OnKeystroke;A.SetKeystrokes(FCKConfig.Keystrokes);if (FCKBrowserInfo.IsIE7){if ((CTRL+86/*V*/) in A.Keystrokes) A.SetKeystrokes([CTRL+86,true]);if ((SHIFT+45/*INS*/) in A.Keystrokes) A.SetKeystrokes([SHIFT+45,true]);};A.SetKeystrokes([CTRL+8,true]);this.EditingArea=new FCKEditingArea(document.getElementById('xEditingArea'));this.EditingArea.FFSpellChecker=FCKConfig.FirefoxSpellChecker;this.SetData(this.GetLinkedFieldValue(),true);FCKTools.AddEventListener(document,"keydown",this._TabKeyHandler);this.AttachToOnSelectionChange(_FCK_PaddingNodeListener);if (FCKBrowserInfo.IsGecko) this.AttachToOnSelectionChange(this._ExecCheckEmptyBlock);},Focus:function(){FCK.EditingArea.Focus();},SetStatus:function(A){this.Status=A;if (A==1){FCKFocusManager.AddWindow(window,true);if (FCKBrowserInfo.IsIE) FCKFocusManager.AddWindow(window.frameElement,true);if (FCKConfig.StartupFocus) FCK.Focus();};this.Events.FireEvent('OnStatusChange',A);},FixBody:function(){var A=FCKConfig.EnterMode;if (A!='p'&&A!='div') return;var B=this.EditorDocument;if (!B) return;var C=B.body;if (!C) return;FCKDomTools.TrimNode(C);var D=C.firstChild;var E;while (D){var F=false;switch (D.nodeType){case 1:var G=D.nodeName.toLowerCase();if (!FCKListsLib.BlockElements[G]&&G!='li'&&!D.getAttribute('_fckfakelement')&&D.getAttribute('_moz_dirty')==null) F=true;break;case 3:if (E||D.nodeValue.Trim().length>0) F=true;break;case 8:if (E) F=true;break;};if (F){var H=D.parentNode;if (!E) E=H.insertBefore(B.createElement(A),D);E.appendChild(H.removeChild(D));D=E.nextSibling;}else{if (E){FCKDomTools.TrimNode(E);E=null;};D=D.nextSibling;}};if (E) FCKDomTools.TrimNode(E);},GetData:function(A){if (FCK.EditMode==1) return FCK.EditingArea.Textarea.value;this.FixBody();var B=FCK.EditorDocument;if (!B) return null;var C=FCKConfig.FullPage;var D=FCK.DataProcessor.ConvertToDataFormat(C?B.documentElement:B.body,!C,FCKConfig.IgnoreEmptyParagraphValue,A);D=FCK.ProtectEventsRestore(D);if (FCKBrowserInfo.IsIE) D=D.replace(FCKRegexLib.ToReplace,'$1');if (C){if (FCK.DocTypeDeclaration&&FCK.DocTypeDeclaration.length>0) D=FCK.DocTypeDeclaration+'\n'+D;if (FCK.XmlDeclaration&&FCK.XmlDeclaration.length>0) D=FCK.XmlDeclaration+'\n'+D;};return FCKConfig.ProtectedSource.Revert(D);},UpdateLinkedField:function(){var A=FCK.GetXHTML(FCKConfig.FormatOutput);if (FCKConfig.HtmlEncodeOutput) A=FCKTools.HTMLEncode(A);FCK.LinkedField.value=A;FCK.Events.FireEvent('OnAfterLinkedFieldUpdate');},RegisteredDoubleClickHandlers:{},OnDoubleClick:function(A){var B=FCK.RegisteredDoubleClickHandlers[A.tagName.toUpperCase()];if (B){for (var i=0;i<B.length;i++) B[i](A);};B=FCK.RegisteredDoubleClickHandlers['*'];if (B){for (var i=0;i<B.length;i++) B[i](A);}},RegisterDoubleClickHandler:function(A,B){var C=B||'*';C=C.toUpperCase();var D;if (!(D=FCK.RegisteredDoubleClickHandlers[C])) FCK.RegisteredDoubleClickHandlers[C]=[A];else{if (D.IndexOf(A)==-1) D.push(A);}},OnAfterSetHTML:function(){FCKDocumentProcessor.Process(FCK.EditorDocument);FCKUndo.SaveUndoStep();FCK.Events.FireEvent('OnSelectionChange');FCK.Events.FireEvent('OnAfterSetHTML');},ProtectUrls:function(A){A=A.replace(FCKRegexLib.ProtectUrlsA,'$& _fcksavedurl=$1');A=A.replace(FCKRegexLib.ProtectUrlsImg,'$& _fcksavedurl=$1');A=A.replace(FCKRegexLib.ProtectUrlsArea,'$& _fcksavedurl=$1');return A;},ProtectEvents:function(A){return A.replace(FCKRegexLib.TagsWithEvent,_FCK_ProtectEvents_ReplaceTags);},ProtectEventsRestore:function(A){return A.replace(FCKRegexLib.ProtectedEvents,_FCK_ProtectEvents_RestoreEvents);},ProtectTags:function(A){var B=FCKConfig.ProtectedTags;if (FCKBrowserInfo.IsIE) B+=B.length>0?'|ABBR|XML|EMBED|OBJECT':'ABBR|XML|EMBED|OBJECT';var C;if (B.length>0){C=new RegExp('<('+B+')(?!\w|:)','gi');A=A.replace(C,'<FCK:$1');C=new RegExp('<\/('+B+')>','gi');A=A.replace(C,'<\/FCK:$1>');};B='META';if (FCKBrowserInfo.IsIE) B+='|HR';C=new RegExp('<(('+B+')(?=\\s|>|/)[\\s\\S]*?)/?>','gi');A=A.replace(C,'<FCK:$1 />');return A;},SetData:function(A,B){this.EditingArea.Mode=FCK.EditMode;if (FCKBrowserInfo.IsIE&&FCK.EditorDocument){FCK.EditorDocument.detachEvent("onselectionchange",Doc_OnSelectionChange);};if (FCK.EditMode==0){this._ForceResetIsDirty=(B===true);A=FCKConfig.ProtectedSource.Protect(A);A=FCK.DataProcessor.ConvertToHtml(A);A=A.replace(FCKRegexLib.InvalidSelfCloseTags,'$1></$2>');A=FCK.ProtectEvents(A);A=FCK.ProtectUrls(A);A=FCK.ProtectTags(A);if (FCK.TempBaseTag.length>0&&!FCKRegexLib.HasBaseTag.test(A)) A=A.replace(FCKRegexLib.HeadOpener,'$&'+FCK.TempBaseTag);var C='';if (!FCKConfig.FullPage) C+=_FCK_GetEditorAreaStyleTags();if (FCKBrowserInfo.IsIE) C+=FCK._GetBehaviorsStyle();else if (FCKConfig.ShowBorders) C+=FCKTools.GetStyleHtml(FCK_ShowTableBordersCSS,true);C+=FCKTools.GetStyleHtml(FCK_InternalCSS,true);A=A.replace(FCKRegexLib.HeadCloser,C+'$&');this.EditingArea.OnLoad=_FCK_EditingArea_OnLoad;this.EditingArea.Start(A);}else{FCK.EditorWindow=null;FCK.EditorDocument=null;FCKDomTools.PaddingNode=null;this.EditingArea.OnLoad=null;this.EditingArea.Start(A);this.EditingArea.Textarea._FCKShowContextMenu=true;FCK.EnterKeyHandler=null;if (B) this.ResetIsDirty();FCK.KeystrokeHandler.AttachToElement(this.EditingArea.Textarea);this.EditingArea.Textarea.focus();FCK.Events.FireEvent('OnAfterSetHTML');};if (FCKBrowserInfo.IsGecko) window.onresize();},RedirectNamedCommands:{},ExecuteNamedCommand:function(A,B,C,D){if (!D) FCKUndo.SaveUndoStep();if (!C&&FCK.RedirectNamedCommands[A]!=null) FCK.ExecuteRedirectedNamedCommand(A,B);else{FCK.Focus();FCK.EditorDocument.execCommand(A,false,B);FCK.Events.FireEvent('OnSelectionChange');};if (!D) FCKUndo.SaveUndoStep();},GetNamedCommandState:function(A){try{if (FCKBrowserInfo.IsSafari&&FCK.EditorWindow&&A.IEquals('Paste')) return 0;if (!FCK.EditorDocument.queryCommandEnabled(A)) return -1;else{return FCK.EditorDocument.queryCommandState(A)?1:0;}}catch (e){return 0;}},GetNamedCommandValue:function(A){var B='';var C=FCK.GetNamedCommandState(A);if (C==-1) return null;try{B=this.EditorDocument.queryCommandValue(A);}catch(e) {};return B?B:'';},Paste:function(A){if (FCK.Status!=2||!FCK.Events.FireEvent('OnPaste')) return false;return A||FCK._ExecPaste();},PasteFromWord:function(){FCKDialog.OpenDialog('FCKDialog_Paste',FCKLang.PasteFromWord,'dialog/fck_paste.html',400,330,'Word');},Preview:function(){var A;if (FCKConfig.FullPage){if (FCK.TempBaseTag.length>0) A=FCK.TempBaseTag+FCK.GetXHTML();else A=FCK.GetXHTML();}else{A=FCKConfig.DocType+'<html dir="'+FCKConfig.ContentLangDirection+'"><head>'+FCK.TempBaseTag+'<title>'+FCKLang.Preview+'</title>'+_FCK_GetEditorAreaStyleTags()+'</head><body'+FCKConfig.GetBodyAttributes()+'>'+FCK.GetXHTML()+'</body></html>';};var B=FCKConfig.ScreenWidth*0.8;var C=FCKConfig.ScreenHeight*0.7;var D=(FCKConfig.ScreenWidth-B)/2;var E='';if (FCK_IS_CUSTOM_DOMAIN&&FCKBrowserInfo.IsIE){window._FCKHtmlToLoad=A;E='javascript:void( (function(){document.open() ;document.domain="'+document.domain+'" ;document.write( window.opener._FCKHtmlToLoad );document.close() ;window.opener._FCKHtmlToLoad = null ;})() )';};var F=window.open(E,null,'toolbar=yes,location=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width='+B+',height='+C+',left='+D);if (!FCK_IS_CUSTOM_DOMAIN||!FCKBrowserInfo.IsIE){F.document.write(A);F.document.close();}},SwitchEditMode:function(A){var B=(FCK.EditMode==0);var C=FCK.IsDirty();var D;if (B){FCKCommands.GetCommand('ShowBlocks').SaveState();if (!A&&FCKBrowserInfo.IsIE) FCKUndo.SaveUndoStep();D=FCK.GetXHTML(FCKConfig.FormatSource);if (D==null) return false;}else D=this.EditingArea.Textarea.value;FCK.EditMode=B?1:0;FCK.SetData(D,!C);FCK.Focus();FCKTools.RunFunction(FCK.ToolbarSet.RefreshModeState,FCK.ToolbarSet);return true;},InsertElement:function(A){if (typeof A=='string') A=this.EditorDocument.createElement(A);var B=A.nodeName.toLowerCase();FCKSelection.Restore();var C=new FCKDomRange(this.EditorWindow);C.MoveToSelection();C.DeleteContents();if (FCKListsLib.BlockElements[B]!=null){if (C.StartBlock){if (C.CheckStartOfBlock()) C.MoveToPosition(C.StartBlock,3);else if (C.CheckEndOfBlock()) C.MoveToPosition(C.StartBlock,4);else C.SplitBlock();};C.InsertNode(A);var D=FCKDomTools.GetNextSourceElement(A,false,null,['hr','br','param','img','area','input'],true);if (!D&&FCKConfig.EnterMode!='br'){D=this.EditorDocument.body.appendChild(this.EditorDocument.createElement(FCKConfig.EnterMode));if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(D);};if (FCKListsLib.EmptyElements[B]==null) C.MoveToElementEditStart(A);else if (D) C.MoveToElementEditStart(D);else C.MoveToPosition(A,4);if (FCKBrowserInfo.IsGecko){if (D) D.scrollIntoView(false);A.scrollIntoView(false);}}else{C.InsertNode(A);C.SetStart(A,4);C.SetEnd(A,4);};C.Select();C.Release();this.Focus();return A;},_InsertBlockElement:function(A){},_IsFunctionKey:function(A){if (A>=16&&A<=20) return true;if (A==27||(A>=33&&A<=40)) return true;if (A==45) return true;return false;},_KeyDownListener:function(A){if (!A) A=FCK.EditorWindow.event;if (FCK.EditorWindow){if (!FCK._IsFunctionKey(A.keyCode)&&!(A.ctrlKey||A.metaKey)&&!(A.keyCode==46)) FCK._KeyDownUndo();};return true;},_KeyDownUndo:function(){if (!FCKUndo.Typing){FCKUndo.SaveUndoStep();FCKUndo.Typing=true;FCK.Events.FireEvent("OnSelectionChange");};FCKUndo.TypesCount++;FCKUndo.Changed=1;if (FCKUndo.TypesCount>FCKUndo.MaxTypes){FCKUndo.TypesCount=0;FCKUndo.SaveUndoStep();}},_TabKeyHandler:function(A){if (!A) A=window.event;var B=A.keyCode;if (B==9&&FCK.EditMode!=0){if (FCKBrowserInfo.IsIE){var C=document.selection.createRange();if (C.parentElement()!=FCK.EditingArea.Textarea) return true;C.text='\t';C.select();}else{var a=[];var D=FCK.EditingArea.Textarea;var E=D.selectionStart;var F=D.selectionEnd;a.push(D.value.substr(0,E));a.push('\t');a.push(D.value.substr(F));D.value=a.join('');D.setSelectionRange(E+1,E+1);};if (A.preventDefault) return A.preventDefault();return A.returnValue=false;};return true;}};FCK.Events=new FCKEvents(FCK);FCK.GetHTML=FCK.GetXHTML=FCK.GetData;FCK.SetHTML=FCK.SetData;FCK.InsertElementAndGetIt=FCK.CreateElement=FCK.InsertElement;function _FCK_ProtectEvents_ReplaceTags(A){return A.replace(FCKRegexLib.EventAttributes,_FCK_ProtectEvents_ReplaceEvents);};function _FCK_ProtectEvents_ReplaceEvents(A,B){return ' '+B+'_fckprotectedatt="'+encodeURIComponent(A)+'"';};function _FCK_ProtectEvents_RestoreEvents(A,B){return decodeURIComponent(B);};function _FCK_MouseEventsListener(A){if (!A) A=window.event;if (A.type=='mousedown') FCK.MouseDownFlag=true;else if (A.type=='mouseup') FCK.MouseDownFlag=false;else if (A.type=='mousemove') FCK.Events.FireEvent('OnMouseMove',A);};function _FCK_PaddingNodeListener(){if (FCKConfig.EnterMode.IEquals('br')) return;FCKDomTools.EnforcePaddingNode(FCK.EditorDocument,FCKConfig.EnterMode);if (!FCKBrowserInfo.IsIE&&FCKDomTools.PaddingNode){var A=FCKSelection.GetSelection();if (A&&A.rangeCount==1){var B=A.getRangeAt(0);if (B.collapsed&&B.startContainer==FCK.EditorDocument.body&&B.startOffset==0){B.selectNodeContents(FCKDomTools.PaddingNode);B.collapse(true);A.removeAllRanges();A.addRange(B);}}}else if (FCKDomTools.PaddingNode){var C=FCKSelection.GetParentElement();var D=FCKDomTools.PaddingNode;if (C&&C.nodeName.IEquals('body')){if (FCK.EditorDocument.body.childNodes.length==1&&FCK.EditorDocument.body.firstChild==D){if (FCKSelection._GetSelectionDocument(FCK.EditorDocument.selection)!=FCK.EditorDocument) return;var B=FCK.EditorDocument.body.createTextRange();var F=false;if (!D.childNodes.firstChild){D.appendChild(FCKTools.GetElementDocument(D).createTextNode('\ufeff'));F=true;};B.moveToElementText(D);B.select();if (F) B.pasteHTML('');}}}};function _FCK_EditingArea_OnLoad(){FCK.EditorWindow=FCK.EditingArea.Window;FCK.EditorDocument=FCK.EditingArea.Document;FCK.InitializeBehaviors();FCK.MouseDownFlag=false;FCKTools.AddEventListener(FCK.EditorDocument,'mousemove',_FCK_MouseEventsListener);FCKTools.AddEventListener(FCK.EditorDocument,'mousedown',_FCK_MouseEventsListener);FCKTools.AddEventListener(FCK.EditorDocument,'mouseup',_FCK_MouseEventsListener);if (FCKBrowserInfo.IsSafari){var A=function(evt){if (!(evt.ctrlKey||evt.metaKey)) return;if (FCK.EditMode!=0) return;switch (evt.keyCode){case 89:FCKUndo.Redo();break;case 90:FCKUndo.Undo();break;}};FCKTools.AddEventListener(FCK.EditorDocument,'keyup',A);};FCK.EnterKeyHandler=new FCKEnterKey(FCK.EditorWindow,FCKConfig.EnterMode,FCKConfig.ShiftEnterMode,FCKConfig.TabSpaces);FCK.KeystrokeHandler.AttachToElement(FCK.EditorDocument);if (FCK._ForceResetIsDirty) FCK.ResetIsDirty();if (FCKBrowserInfo.IsIE&&FCK.HasFocus) FCK.EditorDocument.body.setActive();FCK.OnAfterSetHTML();FCKCommands.GetCommand('ShowBlocks').RestoreState();if (FCK.Status!=0) return;FCK.SetStatus(1);};function _FCK_GetEditorAreaStyleTags(){return FCKTools.GetStyleHtml(FCKConfig.EditorAreaCSS)+FCKTools.GetStyleHtml(FCKConfig.EditorAreaStyles);};function _FCK_KeystrokeHandler_OnKeystroke(A,B){if (FCK.Status!=2) return false;if (FCK.EditMode==0){switch (B){case 'Paste':return!FCK.Paste();case 'Cut':FCKUndo.SaveUndoStep();return false;}}else{if (B.Equals('Paste','Undo','Redo','SelectAll','Cut')) return false;};var C=FCK.Commands.GetCommand(B);if (C.GetState()==-1) return false;return (C.Execute.apply(C,FCKTools.ArgumentsToArray(arguments,2))!==false);};(function(){var A=window.parent.document;var B=A.getElementById(FCK.Name);var i=0;while (B||i==0){if (B&&B.tagName.toLowerCase().Equals('input','textarea')){FCK.LinkedField=B;break;};B=A.getElementsByName(FCK.Name)[i++];}})();var FCKTempBin={Elements:[],AddElement:function(A){var B=this.Elements.length;this.Elements[B]=A;return B;},RemoveElement:function(A){var e=this.Elements[A];this.Elements[A]=null;return e;},Reset:function(){var i=0;while (i<this.Elements.length) this.Elements[i++]=null;this.Elements.length=0;}};var FCKFocusManager=FCK.FocusManager={IsLocked:false,AddWindow:function(A,B){var C;if (FCKBrowserInfo.IsIE) C=A.nodeType==1?A:A.frameElement?A.frameElement:A.document;else if (FCKBrowserInfo.IsSafari) C=A;else C=A.document;FCKTools.AddEventListener(C,'blur',FCKFocusManager_Win_OnBlur);FCKTools.AddEventListener(C,'focus',B?FCKFocusManager_Win_OnFocus_Area:FCKFocusManager_Win_OnFocus);},RemoveWindow:function(A){if (FCKBrowserInfo.IsIE) oTarget=A.nodeType==1?A:A.frameElement?A.frameElement:A.document;else oTarget=A.document;FCKTools.RemoveEventListener(oTarget,'blur',FCKFocusManager_Win_OnBlur);FCKTools.RemoveEventListener(oTarget,'focus',FCKFocusManager_Win_OnFocus_Area);FCKTools.RemoveEventListener(oTarget,'focus',FCKFocusManager_Win_OnFocus);},Lock:function(){this.IsLocked=true;},Unlock:function(){if (this._HasPendingBlur) FCKFocusManager._Timer=window.setTimeout(FCKFocusManager_FireOnBlur,100);this.IsLocked=false;},_ResetTimer:function(){this._HasPendingBlur=false;if (this._Timer){window.clearTimeout(this._Timer);delete this._Timer;}}};function FCKFocusManager_Win_OnBlur(){if (typeof(FCK)!='undefined'&&FCK.HasFocus){FCKFocusManager._ResetTimer();FCKFocusManager._Timer=window.setTimeout(FCKFocusManager_FireOnBlur,100);}};function FCKFocusManager_FireOnBlur(){if (FCKFocusManager.IsLocked) FCKFocusManager._HasPendingBlur=true;else{FCK.HasFocus=false;FCK.Events.FireEvent("OnBlur");}};function FCKFocusManager_Win_OnFocus_Area(){if (FCKFocusManager._IsFocusing) return;FCKFocusManager._IsFocusing=true;FCK.Focus();FCKFocusManager_Win_OnFocus();FCKTools.RunFunction(function(){delete FCKFocusManager._IsFocusing;});};function FCKFocusManager_Win_OnFocus(){FCKFocusManager._ResetTimer();if (!FCK.HasFocus&&!FCKFocusManager.IsLocked){FCK.HasFocus=true;FCK.Events.FireEvent("OnFocus");}};(function(){var A=window.frameElement;var B=A.width;var C=A.height;if (/^\d+$/.test(B)) B+='px';if (/^\d+$/.test(C)) C+='px';var D=A.style;D.border=D.padding=D.margin=0;D.backgroundColor='transparent';D.backgroundImage='none';D.width=B;D.height=C;})();
-FCK.Description="FCKeditor for Gecko Browsers";FCK.InitializeBehaviors=function(){if (window.onresize) window.onresize();FCKFocusManager.AddWindow(this.EditorWindow);this.ExecOnSelectionChange=function(){FCK.Events.FireEvent("OnSelectionChange");};this._ExecDrop=function(evt){if (FCK.MouseDownFlag){FCK.MouseDownFlag=false;return;};if (FCKConfig.ForcePasteAsPlainText){if (evt.dataTransfer){var A=evt.dataTransfer.getData('Text');A=FCKTools.HTMLEncode(A);A=FCKTools.ProcessLineBreaks(window,FCKConfig,A);FCK.InsertHtml(A);}else if (FCKConfig.ShowDropDialog) FCK.PasteAsPlainText();evt.preventDefault();evt.stopPropagation();}};this._ExecCheckCaret=function(evt){if (FCK.EditMode!=0) return;if (evt.type=='keypress'){var B=evt.keyCode;if (B<33||B>40) return;};var C=function(H){if (H.nodeType!=1) return false;var D=H.tagName.toLowerCase();return (FCKListsLib.BlockElements[D]||FCKListsLib.EmptyElements[D]);};var E=function(){var F=FCKSelection.GetSelection();var G=F.getRangeAt(0);if (!G||!G.collapsed) return;var H=G.endContainer;if (H.nodeType!=3) return;if (H.nodeValue.length!=G.endOffset) return;var I=H.parentNode.tagName.toLowerCase();if (!(I=='a'||(!FCKBrowserInfo.IsOpera&&String(H.parentNode.contentEditable)=='false')||(!(FCKListsLib.BlockElements[I]||FCKListsLib.NonEmptyBlockElements[I])&&B==35))) return;var J=FCKTools.GetNextTextNode(H,H.parentNode,C);if (J) return;G=FCK.EditorDocument.createRange();J=FCKTools.GetNextTextNode(H,H.parentNode.parentNode,C);if (J){if (FCKBrowserInfo.IsOpera&&B==37) return;G.setStart(J,0);G.setEnd(J,0);}else{while (H.parentNode&&H.parentNode!=FCK.EditorDocument.body&&H.parentNode!=FCK.EditorDocument.documentElement&&H==H.parentNode.lastChild&&(!FCKListsLib.BlockElements[H.parentNode.tagName.toLowerCase()]&&!FCKListsLib.NonEmptyBlockElements[H.parentNode.tagName.toLowerCase()])) H=H.parentNode;if (FCKListsLib.BlockElements[I]||FCKListsLib.EmptyElements[I]||H==FCK.EditorDocument.body){G.setStart(H,H.childNodes.length);G.setEnd(H,H.childNodes.length);}else{var K=H.nextSibling;while (K){if (K.nodeType!=1){K=K.nextSibling;continue;};var L=K.tagName.toLowerCase();if (FCKListsLib.BlockElements[L]||FCKListsLib.EmptyElements[L]||FCKListsLib.NonEmptyBlockElements[L]) break;K=K.nextSibling;};var M=FCK.EditorDocument.createTextNode('');if (K) H.parentNode.insertBefore(M,K);else H.parentNode.appendChild(M);G.setStart(M,0);G.setEnd(M,0);}};F.removeAllRanges();F.addRange(G);FCK.Events.FireEvent("OnSelectionChange");};setTimeout(E,1);};this.ExecOnSelectionChangeTimer=function(){if (FCK.LastOnChangeTimer) window.clearTimeout(FCK.LastOnChangeTimer);FCK.LastOnChangeTimer=window.setTimeout(FCK.ExecOnSelectionChange,100);};this.EditorDocument.addEventListener('mouseup',this.ExecOnSelectionChange,false);this.EditorDocument.addEventListener('keyup',this.ExecOnSelectionChangeTimer,false);this._DblClickListener=function(e){FCK.OnDoubleClick(e.target);e.stopPropagation();};this.EditorDocument.addEventListener('dblclick',this._DblClickListener,true);this.EditorDocument.addEventListener('keydown',this._KeyDownListener,false);if (FCKBrowserInfo.IsGecko){this.EditorWindow.addEventListener('dragdrop',this._ExecDrop,true);}else if (FCKBrowserInfo.IsSafari){var N=function(evt){ if (!FCK.MouseDownFlag) evt.returnValue=false;};this.EditorDocument.addEventListener('dragenter',N,true);this.EditorDocument.addEventListener('dragover',N,true);this.EditorDocument.addEventListener('drop',this._ExecDrop,true);this.EditorDocument.addEventListener('mousedown',function(ev){var O=ev.srcElement;if (O.nodeName.IEquals('IMG','HR','INPUT','TEXTAREA','SELECT')){FCKSelection.SelectNode(O);}},true);this.EditorDocument.addEventListener('mouseup',function(ev){if (ev.srcElement.nodeName.IEquals('INPUT','TEXTAREA','SELECT')) ev.preventDefault()},true);this.EditorDocument.addEventListener('click',function(ev){if (ev.srcElement.nodeName.IEquals('INPUT','TEXTAREA','SELECT')) ev.preventDefault()},true);};if (FCKBrowserInfo.IsGecko||FCKBrowserInfo.IsOpera){this.EditorDocument.addEventListener('keypress',this._ExecCheckCaret,false);this.EditorDocument.addEventListener('click',this._ExecCheckCaret,false);};FCK.ContextMenu._InnerContextMenu.SetMouseClickWindow(FCK.EditorWindow);FCK.ContextMenu._InnerContextMenu.AttachToElement(FCK.EditorDocument);};FCK.MakeEditable=function(){this.EditingArea.MakeEditable();};function Document_OnContextMenu(e){if (!e.target._FCKShowContextMenu) e.preventDefault();};document.oncontextmenu=Document_OnContextMenu;FCK._BaseGetNamedCommandState=FCK.GetNamedCommandState;FCK.GetNamedCommandState=function(A){switch (A){case 'Unlink':return FCKSelection.HasAncestorNode('A')?0:-1;default:return FCK._BaseGetNamedCommandState(A);}};FCK.RedirectNamedCommands={Print:true,Paste:true};FCK.ExecuteRedirectedNamedCommand=function(A,B){switch (A){case 'Print':FCK.EditorWindow.print();break;case 'Paste':try{if (FCKBrowserInfo.IsSafari) throw '';if (FCK.Paste()) FCK.ExecuteNamedCommand('Paste',null,true);}catch (e) { FCKDialog.OpenDialog('FCKDialog_Paste',FCKLang.Paste,'dialog/fck_paste.html',400,330,'Security');};break;default:FCK.ExecuteNamedCommand(A,B);}};FCK._ExecPaste=function(){FCKUndo.SaveUndoStep();if (FCKConfig.ForcePasteAsPlainText){FCK.PasteAsPlainText();return false;};return true;};FCK.InsertHtml=function(A){var B=FCK.EditorDocument;A=FCKConfig.ProtectedSource.Protect(A);A=FCK.ProtectEvents(A);A=FCK.ProtectUrls(A);A=FCK.ProtectTags(A);FCKUndo.SaveUndoStep();if (FCKBrowserInfo.IsGecko){A='<span id="__fakeFCKRemove1__" style="display:none;">fakeFCKRemove</span>'+A+'<span id="__fakeFCKRemove2__" style="display:none;">fakeFCKRemove</span>';};B.execCommand('inserthtml',false,A);if (FCKBrowserInfo.IsGecko){FCKDomTools.RemoveNode(B.getElementById('__fakeFCKRemove1__'));FCKDomTools.RemoveNode(B.getElementById('__fakeFCKRemove2__'));};this.Focus();var C=new FCKDomRange(this.EditorWindow);C.MoveToSelection();var D=C.CreateBookmark();FCKDocumentProcessor.Process(B);try{C.MoveToBookmark(D);C.Select();}catch (e) {};this.Events.FireEvent("OnSelectionChange");};FCK.PasteAsPlainText=function(){FCKTools.RunFunction(FCKDialog.OpenDialog,FCKDialog,['FCKDialog_Paste',FCKLang.PasteAsText,'dialog/fck_paste.html',400,330,'PlainText']);};FCK.GetClipboardHTML=function(){return '';};FCK.CreateLink=function(A,B){var C=[];if (FCKSelection.GetSelection().isCollapsed) return C;FCK.ExecuteNamedCommand('Unlink',null,false,!!B);if (A.length>0){var D='javascript:void(0);/*'+(new Date().getTime())+'*/';FCK.ExecuteNamedCommand('CreateLink',D,false,!!B);var E=this.EditorDocument.evaluate("//a[@href='"+D+"']",this.EditorDocument.body,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);for (var i=0;i<E.snapshotLength;i++){var F=E.snapshotItem(i);F.href=A;C.push(F);}};return C;};FCK._FillEmptyBlock=function(A){if (!A||A.nodeType!=1) return;var B=A.tagName.toLowerCase();if (B!='p'&&B!='div') return;if (A.firstChild) return;FCKTools.AppendBogusBr(A);};FCK._ExecCheckEmptyBlock=function(){FCK._FillEmptyBlock(FCK.EditorDocument.body.firstChild);var A=FCKSelection.GetSelection();if (!A||A.rangeCount<1) return;var B=A.getRangeAt(0);FCK._FillEmptyBlock(B.startContainer);};
-var FCKConfig=FCK.Config={};if (document.location.protocol=='file:'){FCKConfig.BasePath=decodeURIComponent(document.location.pathname.substr(1));FCKConfig.BasePath=FCKConfig.BasePath.replace(/\\/gi, '/');var sFullProtocol=document.location.href.match(/^(file\:\/{2,3})/)[1];if (FCKBrowserInfo.IsOpera) sFullProtocol+='localhost/';FCKConfig.BasePath=sFullProtocol+FCKConfig.BasePath.substring(0,FCKConfig.BasePath.lastIndexOf('/')+1);}else FCKConfig.BasePath=document.location.protocol+'//'+document.location.host+document.location.pathname.substring(0,document.location.pathname.lastIndexOf('/')+1);FCKConfig.FullBasePath=FCKConfig.BasePath;FCKConfig.EditorPath=FCKConfig.BasePath.replace(/editor\/$/,'');try{FCKConfig.ScreenWidth=screen.width;FCKConfig.ScreenHeight=screen.height;}catch (e){FCKConfig.ScreenWidth=800;FCKConfig.ScreenHeight=600;};FCKConfig.ProcessHiddenField=function(){this.PageConfig={};var A=window.parent.document.getElementById(FCK.Name+'___Config');if (!A) return;var B=A.value.split('&');for (var i=0;i<B.length;i++){if (B[i].length==0) continue;var C=B[i].split('=');var D=decodeURIComponent(C[0]);var E=decodeURIComponent(C[1]);if (D=='CustomConfigurationsPath') FCKConfig[D]=E;else if (E.toLowerCase()=="true") this.PageConfig[D]=true;else if (E.toLowerCase()=="false") this.PageConfig[D]=false;else if (E.length>0&&!isNaN(E)) this.PageConfig[D]=parseInt(E,10);else this.PageConfig[D]=E;}};function FCKConfig_LoadPageConfig(){var A=FCKConfig.PageConfig;for (var B in A) FCKConfig[B]=A[B];};function FCKConfig_PreProcess(){var A=FCKConfig;if (A.AllowQueryStringDebug){try{if ((/fckdebug=true/i).test(window.top.location.search)) A.Debug=true;}catch (e) {/*Ignore it. Much probably we are inside a FRAME where the "top" is in another domain (security error).*/}};if (!A.PluginsPath.EndsWith('/')) A.PluginsPath+='/';var B=A.ToolbarComboPreviewCSS;if (!B||B.length==0) A.ToolbarComboPreviewCSS=A.EditorAreaCSS;A.RemoveAttributesArray=(A.RemoveAttributes||'').split(',');if (!FCKConfig.SkinEditorCSS||FCKConfig.SkinEditorCSS.length==0) FCKConfig.SkinEditorCSS=FCKConfig.SkinPath+'fck_editor.css';if (!FCKConfig.SkinDialogCSS||FCKConfig.SkinDialogCSS.length==0) FCKConfig.SkinDialogCSS=FCKConfig.SkinPath+'fck_dialog.css';};FCKConfig.ToolbarSets={};FCKConfig.Plugins={};FCKConfig.Plugins.Items=[];FCKConfig.Plugins.Add=function(A,B,C){FCKConfig.Plugins.Items.AddItem([A,B,C]);};FCKConfig.ProtectedSource={};FCKConfig.ProtectedSource._CodeTag=(new Date()).valueOf();FCKConfig.ProtectedSource.RegexEntries=[/<!--[\s\S]*?-->/g,/<script[\s\S]*?<\/script>/gi,/<noscript[\s\S]*?<\/noscript>/gi];FCKConfig.ProtectedSource.Add=function(A){this.RegexEntries.AddItem(A);};FCKConfig.ProtectedSource.Protect=function(A){var B=this._CodeTag;function _Replace(protectedSource){var C=FCKTempBin.AddElement(protectedSource);return '<!--{'+B+C+'}-->';};for (var i=0;i<this.RegexEntries.length;i++){A=A.replace(this.RegexEntries[i],_Replace);};return A;};FCKConfig.ProtectedSource.Revert=function(A,B){function _Replace(m,opener,index){var C=B?FCKTempBin.RemoveElement(index):FCKTempBin.Elements[index];return FCKConfig.ProtectedSource.Revert(C,B);};var D=new RegExp("(<|<)!--\\{"+this._CodeTag+"(\\d+)\\}--(>|>)","g");return A.replace(D,_Replace);};FCKConfig.GetBodyAttributes=function(){var A='';if (this.BodyId&&this.BodyId.length>0) A+=' id="'+this.BodyId+'"';if (this.BodyClass&&this.BodyClass.length>0) A+=' class="'+this.BodyClass+'"';return A;};FCKConfig.ApplyBodyAttributes=function(A){if (this.BodyId&&this.BodyId.length>0) A.id=FCKConfig.BodyId;if (this.BodyClass&&this.BodyClass.length>0) A.className+=' '+FCKConfig.BodyClass;};
+var FCK={Name:FCKURLParams['InstanceName'],Status:0,EditMode:0,Toolbar:null,HasFocus:false,DataProcessor:new FCKDataProcessor(),GetInstanceObject:(function(){var w=window;return function(name){return w[name];}})(),AttachToOnSelectionChange:function(A){this.Events.AttachEvent('OnSelectionChange',A);},GetLinkedFieldValue:function(){return this.LinkedField.value;},GetParentForm:function(){return this.LinkedField.form;},StartupValue:'',IsDirty:function(){if (this.EditMode==1) return (this.StartupValue!=this.EditingArea.Textarea.value);else{if (!this.EditorDocument) return false;return (this.StartupValue!=this.EditorDocument.body.innerHTML);}},ResetIsDirty:function(){if (this.EditMode==1) this.StartupValue=this.EditingArea.Textarea.value;else if (this.EditorDocument.body) this.StartupValue=this.EditorDocument.body.innerHTML;},StartEditor:function(){this.TempBaseTag=FCKConfig.BaseHref.length>0?'<base href="'+FCKConfig.BaseHref+'" _fcktemp="true"></base>':'';var A=FCK.KeystrokeHandler=new FCKKeystrokeHandler();A.OnKeystroke=_FCK_KeystrokeHandler_OnKeystroke;A.SetKeystrokes(FCKConfig.Keystrokes);if (FCKBrowserInfo.IsIE7){if ((CTRL+86) in A.Keystrokes) A.SetKeystrokes([CTRL+86,true]);if ((SHIFT+45) in A.Keystrokes) A.SetKeystrokes([SHIFT+45,true]);};A.SetKeystrokes([CTRL+8,true]);this.EditingArea=new FCKEditingArea(document.getElementById('xEditingArea'));this.EditingArea.FFSpellChecker=FCKConfig.FirefoxSpellChecker;this.SetData(this.GetLinkedFieldValue(),true);FCKTools.AddEventListener(document,"keydown",this._TabKeyHandler);this.AttachToOnSelectionChange(_FCK_PaddingNodeListener);if (FCKBrowserInfo.IsGecko) this.AttachToOnSelectionChange(this._ExecCheckEmptyBlock);},Focus:function(){FCK.EditingArea.Focus();},SetStatus:function(A){this.Status=A;if (A==1){FCKFocusManager.AddWindow(window,true);if (FCKBrowserInfo.IsIE) FCKFocusManager.AddWindow(window.frameElement,true);if (FCKConfig.StartupFocus) FCK.Focus();};this.Events.FireEvent('OnStatusChange',A);},FixBody:function(){var A=FCKConfig.EnterMode;if (A!='p'&&A!='div') return;var B=this.EditorDocument;if (!B) return;var C=B.body;if (!C) return;FCKDomTools.TrimNode(C);var D=C.firstChild;var E;while (D){var F=false;switch (D.nodeType){case 1:var G=D.nodeName.toLowerCase();if (!FCKListsLib.BlockElements[G]&&G!='li'&&!D.getAttribute('_fckfakelement')&&D.getAttribute('_moz_dirty')==null) F=true;break;case 3:if (E||D.nodeValue.Trim().length>0) F=true;break;case 8:if (E) F=true;break;};if (F){var H=D.parentNode;if (!E) E=H.insertBefore(B.createElement(A),D);E.appendChild(H.removeChild(D));D=E.nextSibling;}else{if (E){FCKDomTools.TrimNode(E);E=null;};D=D.nextSibling;}};if (E) FCKDomTools.TrimNode(E);},GetData:function(A){if (FCK.EditMode==1) return FCK.EditingArea.Textarea.value;this.FixBody();var B=FCK.EditorDocument;if (!B) return null;var C=FCKConfig.FullPage;var D=FCK.DataProcessor.ConvertToDataFormat(C?B.documentElement:B.body,!C,FCKConfig.IgnoreEmptyParagraphValue,A);D=FCK.ProtectEventsRestore(D);if (FCKBrowserInfo.IsIE) D=D.replace(FCKRegexLib.ToReplace,'$1');if (C){if (FCK.DocTypeDeclaration&&FCK.DocTypeDeclaration.length>0) D=FCK.DocTypeDeclaration+'\n'+D;if (FCK.XmlDeclaration&&FCK.XmlDeclaration.length>0) D=FCK.XmlDeclaration+'\n'+D;};return FCKConfig.ProtectedSource.Revert(D);},UpdateLinkedField:function(){var A=FCK.GetXHTML(FCKConfig.FormatOutput);if (FCKConfig.HtmlEncodeOutput) A=FCKTools.HTMLEncode(A);FCK.LinkedField.value=A;FCK.Events.FireEvent('OnAfterLinkedFieldUpdate');},RegisteredDoubleClickHandlers:{},OnDoubleClick:function(A){var B=FCK.RegisteredDoubleClickHandlers[A.tagName.toUpperCase()];if (B){for (var i=0;i<B.length;i++) B[i](A);};B=FCK.RegisteredDoubleClickHandlers['*'];if (B){for (var i=0;i<B.length;i++) B[i](A);}},RegisterDoubleClickHandler:function(A,B){var C=B||'*';C=C.toUpperCase();var D;if (!(D=FCK.RegisteredDoubleClickHandlers[C])) FCK.RegisteredDoubleClickHandlers[C]=[A];else{if (D.IndexOf(A)==-1) D.push(A);}},OnAfterSetHTML:function(){FCKDocumentProcessor.Process(FCK.EditorDocument);FCKUndo.SaveUndoStep();FCK.Events.FireEvent('OnSelectionChange');FCK.Events.FireEvent('OnAfterSetHTML');},ProtectUrls:function(A){A=A.replace(FCKRegexLib.ProtectUrlsA,'$& _fcksavedurl=$1');A=A.replace(FCKRegexLib.ProtectUrlsImg,'$& _fcksavedurl=$1');A=A.replace(FCKRegexLib.ProtectUrlsArea,'$& _fcksavedurl=$1');return A;},ProtectEvents:function(A){return A.replace(FCKRegexLib.TagsWithEvent,_FCK_ProtectEvents_ReplaceTags);},ProtectEventsRestore:function(A){return A.replace(FCKRegexLib.ProtectedEvents,_FCK_ProtectEvents_RestoreEvents);},ProtectTags:function(A){var B=FCKConfig.ProtectedTags;if (FCKBrowserInfo.IsIE) B+=B.length>0?'|ABBR|XML|EMBED|OBJECT':'ABBR|XML|EMBED|OBJECT';var C;if (B.length>0){C=new RegExp('<('+B+')(?!\w|:)','gi');A=A.replace(C,'<FCK:$1');C=new RegExp('<\/('+B+')>','gi');A=A.replace(C,'<\/FCK:$1>');};B='META';if (FCKBrowserInfo.IsIE) B+='|HR';C=new RegExp('<(('+B+')(?=\\s|>|/)[\\s\\S]*?)/?>','gi');A=A.replace(C,'<FCK:$1 />');return A;},SetData:function(A,B){this.EditingArea.Mode=FCK.EditMode;if (FCKBrowserInfo.IsIE&&FCK.EditorDocument){FCK.EditorDocument.detachEvent("onselectionchange",Doc_OnSelectionChange);};FCKTempBin.Reset();if (FCK.EditMode==0){this._ForceResetIsDirty=(B===true);A=FCKConfig.ProtectedSource.Protect(A);A=FCK.DataProcessor.ConvertToHtml(A);A=A.replace(FCKRegexLib.InvalidSelfCloseTags,'$1></$2>');A=FCK.ProtectEvents(A);A=FCK.ProtectUrls(A);A=FCK.ProtectTags(A);if (FCK.TempBaseTag.length>0&&!FCKRegexLib.HasBaseTag.test(A)) A=A.replace(FCKRegexLib.HeadOpener,'$&'+FCK.TempBaseTag);var C='';if (!FCKConfig.FullPage) C+=_FCK_GetEditorAreaStyleTags();if (FCKBrowserInfo.IsIE) C+=FCK._GetBehaviorsStyle();else if (FCKConfig.ShowBorders) C+=FCKTools.GetStyleHtml(FCK_ShowTableBordersCSS,true);C+=FCKTools.GetStyleHtml(FCK_InternalCSS,true);A=A.replace(FCKRegexLib.HeadCloser,C+'$&');this.EditingArea.OnLoad=_FCK_EditingArea_OnLoad;this.EditingArea.Start(A);}else{FCK.EditorWindow=null;FCK.EditorDocument=null;FCKDomTools.PaddingNode=null;this.EditingArea.OnLoad=null;this.EditingArea.Start(A);this.EditingArea.Textarea._FCKShowContextMenu=true;FCK.EnterKeyHandler=null;if (B) this.ResetIsDirty();FCK.KeystrokeHandler.AttachToElement(this.EditingArea.Textarea);this.EditingArea.Textarea.focus();FCK.Events.FireEvent('OnAfterSetHTML');};if (FCKBrowserInfo.IsGecko) window.onresize();},RedirectNamedCommands:{},ExecuteNamedCommand:function(A,B,C,D){if (!D) FCKUndo.SaveUndoStep();if (!C&&FCK.RedirectNamedCommands[A]!=null) FCK.ExecuteRedirectedNamedCommand(A,B);else{FCK.Focus();FCK.EditorDocument.execCommand(A,false,B);FCK.Events.FireEvent('OnSelectionChange');};if (!D) FCKUndo.SaveUndoStep();},GetNamedCommandState:function(A){try{if (FCKBrowserInfo.IsSafari&&FCK.EditorWindow&&A.IEquals('Paste')) return 0;if (!FCK.EditorDocument.queryCommandEnabled(A)) return -1;else{return FCK.EditorDocument.queryCommandState(A)?1:0;}}catch (e){return 0;}},GetNamedCommandValue:function(A){var B='';var C=FCK.GetNamedCommandState(A);if (C==-1) return null;try{B=this.EditorDocument.queryCommandValue(A);}catch(e) {};return B?B:'';},Paste:function(A){if (FCK.Status!=2||!FCK.Events.FireEvent('OnPaste')) return false;return A||FCK._ExecPaste();},PasteFromWord:function(){FCKDialog.OpenDialog('FCKDialog_Paste',FCKLang.PasteFromWord,'dialog/fck_paste.html',400,330,'Word');},Preview:function(){var A;if (FCKConfig.FullPage){if (FCK.TempBaseTag.length>0) A=FCK.TempBaseTag+FCK.GetXHTML();else A=FCK.GetXHTML();}else{A=FCKConfig.DocType+'<html dir="'+FCKConfig.ContentLangDirection+'"><head>'+FCK.TempBaseTag+'<title>'+FCKLang.Preview+'</title>'+_FCK_GetEditorAreaStyleTags()+'</head><body'+FCKConfig.GetBodyAttributes()+'>'+FCK.GetXHTML()+'</body></html>';};var B=FCKConfig.ScreenWidth*0.8;var C=FCKConfig.ScreenHeight*0.7;var D=(FCKConfig.ScreenWidth-B)/2;var E='';if (FCK_IS_CUSTOM_DOMAIN&&FCKBrowserInfo.IsIE){window._FCKHtmlToLoad=A;E='javascript:void( (function(){document.open() ;document.domain="'+document.domain+'" ;document.write( window.opener._FCKHtmlToLoad );document.close() ;window.opener._FCKHtmlToLoad = null ;})() )';};var F=window.open(E,null,'toolbar=yes,location=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width='+B+',height='+C+',left='+D);if (!FCK_IS_CUSTOM_DOMAIN||!FCKBrowserInfo.IsIE){F.document.write(A);F.document.close();}},SwitchEditMode:function(A){var B=(FCK.EditMode==0);var C=FCK.IsDirty();var D;if (B){FCKCommands.GetCommand('ShowBlocks').SaveState();if (!A&&FCKBrowserInfo.IsIE) FCKUndo.SaveUndoStep();D=FCK.GetXHTML(FCKConfig.FormatSource);if (FCKBrowserInfo.IsIE) FCKTempBin.ToHtml();if (D==null) return false;}else D=this.EditingArea.Textarea.value;FCK.EditMode=B?1:0;FCK.SetData(D,!C);FCK.Focus();FCKTools.RunFunction(FCK.ToolbarSet.RefreshModeState,FCK.ToolbarSet);return true;},InsertElement:function(A){if (typeof A=='string') A=this.EditorDocument.createElement(A);var B=A.nodeName.toLowerCase();FCKSelection.Restore();var C=new FCKDomRange(this.EditorWindow);C.MoveToSelection();C.DeleteContents();if (FCKListsLib.BlockElements[B]!=null){if (C.StartBlock){if (C.CheckStartOfBlock()) C.MoveToPosition(C.StartBlock,3);else if (C.CheckEndOfBlock()) C.MoveToPosition(C.StartBlock,4);else C.SplitBlock();};C.InsertNode(A);var D=FCKDomTools.GetNextSourceElement(A,false,null,['hr','br','param','img','area','input'],true);if (!D&&FCKConfig.EnterMode!='br'){D=this.EditorDocument.body.appendChild(this.EditorDocument.createElement(FCKConfig.EnterMode));if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(D);};if (FCKListsLib.EmptyElements[B]==null) C.MoveToElementEditStart(A);else if (D) C.MoveToElementEditStart(D);else C.MoveToPosition(A,4);if (FCKBrowserInfo.IsGeckoLike){if (D) FCKDomTools.ScrollIntoView(D,false);FCKDomTools.ScrollIntoView(A,false);}}else{C.InsertNode(A);C.SetStart(A,4);C.SetEnd(A,4);};C.Select();C.Release();this.Focus();return A;},_InsertBlockElement:function(A){},_IsFunctionKey:function(A){if (A>=16&&A<=20) return true;if (A==27||(A>=33&&A<=40)) return true;if (A==45) return true;return false;},_KeyDownListener:function(A){if (!A) A=FCK.EditorWindow.event;if (FCK.EditorWindow){if (!FCK._IsFunctionKey(A.keyCode)&&!(A.ctrlKey||A.metaKey)&&!(A.keyCode==46)) FCK._KeyDownUndo();};return true;},_KeyDownUndo:function(){if (!FCKUndo.Typing){FCKUndo.SaveUndoStep();FCKUndo.Typing=true;FCK.Events.FireEvent("OnSelectionChange");};FCKUndo.TypesCount++;FCKUndo.Changed=1;if (FCKUndo.TypesCount>FCKUndo.MaxTypes){FCKUndo.TypesCount=0;FCKUndo.SaveUndoStep();}},_TabKeyHandler:function(A){if (!A) A=window.event;var B=A.keyCode;if (B==9&&FCK.EditMode!=0){if (FCKBrowserInfo.IsIE){var C=document.selection.createRange();if (C.parentElement()!=FCK.EditingArea.Textarea) return true;C.text='\t';C.select();}else{var a=[];var D=FCK.EditingArea.Textarea;var E=D.selectionStart;var F=D.selectionEnd;a.push(D.value.substr(0,E));a.push('\t');a.push(D.value.substr(F));D.value=a.join('');D.setSelectionRange(E+1,E+1);};if (A.preventDefault) return A.preventDefault();return A.returnValue=false;};return true;}};FCK.Events=new FCKEvents(FCK);FCK.GetHTML=FCK.GetXHTML=FCK.GetData;FCK.SetHTML=FCK.SetData;FCK.InsertElementAndGetIt=FCK.CreateElement=FCK.InsertElement;function _FCK_ProtectEvents_ReplaceTags(A){return A.replace(FCKRegexLib.EventAttributes,_FCK_ProtectEvents_ReplaceEvents);};function _FCK_ProtectEvents_ReplaceEvents(A,B){return ' '+B+'_fckprotectedatt="'+encodeURIComponent(A)+'"';};function _FCK_ProtectEvents_RestoreEvents(A,B){return decodeURIComponent(B);};function _FCK_MouseEventsListener(A){if (!A) A=window.event;if (A.type=='mousedown') FCK.MouseDownFlag=true;else if (A.type=='mouseup') FCK.MouseDownFlag=false;else if (A.type=='mousemove') FCK.Events.FireEvent('OnMouseMove',A);};function _FCK_PaddingNodeListener(){if (FCKConfig.EnterMode.IEquals('br')) return;FCKDomTools.EnforcePaddingNode(FCK.EditorDocument,FCKConfig.EnterMode);if (!FCKBrowserInfo.IsIE&&FCKDomTools.PaddingNode){var A=FCKSelection.GetSelection();if (A&&A.rangeCount==1){var B=A.getRangeAt(0);if (B.collapsed&&B.startContainer==FCK.EditorDocument.body&&B.startOffset==0){B.selectNodeContents(FCKDomTools.PaddingNode);B.collapse(true);A.removeAllRanges();A.addRange(B);}}}else if (FCKDomTools.PaddingNode){var C=FCKSelection.GetParentElement();var D=FCKDomTools.PaddingNode;if (C&&C.nodeName.IEquals('body')){if (FCK.EditorDocument.body.childNodes.length==1&&FCK.EditorDocument.body.firstChild==D){if (FCKSelection._GetSelectionDocument(FCK.EditorDocument.selection)!=FCK.EditorDocument) return;var B=FCK.EditorDocument.body.createTextRange();var F=false;if (!D.childNodes.firstChild){D.appendChild(FCKTools.GetElementDocument(D).createTextNode('\ufeff'));F=true;};B.moveToElementText(D);B.select();if (F) B.pasteHTML('');}}}};function _FCK_EditingArea_OnLoad(){FCK.EditorWindow=FCK.EditingArea.Window;FCK.EditorDocument=FCK.EditingArea.Document;if (FCKBrowserInfo.IsIE) FCKTempBin.ToElements();FCK.InitializeBehaviors();FCK.MouseDownFlag=false;FCKTools.AddEventListener(FCK.EditorDocument,'mousemove',_FCK_MouseEventsListener);FCKTools.AddEventListener(FCK.EditorDocument,'mousedown',_FCK_MouseEventsListener);FCKTools.AddEventListener(FCK.EditorDocument,'mouseup',_FCK_MouseEventsListener);if (FCKBrowserInfo.IsSafari){var A=function(evt){if (!(evt.ctrlKey||evt.metaKey)) return;if (FCK.EditMode!=0) return;switch (evt.keyCode){case 89:FCKUndo.Redo();break;case 90:FCKUndo.Undo();break;}};FCKTools.AddEventListener(FCK.EditorDocument,'keyup',A);};FCK.EnterKeyHandler=new FCKEnterKey(FCK.EditorWindow,FCKConfig.EnterMode,FCKConfig.ShiftEnterMode,FCKConfig.TabSpaces);FCK.KeystrokeHandler.AttachToElement(FCK.EditorDocument);if (FCK._ForceResetIsDirty) FCK.ResetIsDirty();if (FCKBrowserInfo.IsIE&&FCK.HasFocus) FCK.EditorDocument.body.setActive();FCK.OnAfterSetHTML();FCKCommands.GetCommand('ShowBlocks').RestoreState();if (FCK.Status!=0) return;FCK.SetStatus(1);};function _FCK_GetEditorAreaStyleTags(){return FCKTools.GetStyleHtml(FCKConfig.EditorAreaCSS)+FCKTools.GetStyleHtml(FCKConfig.EditorAreaStyles);};function _FCK_KeystrokeHandler_OnKeystroke(A,B){if (FCK.Status!=2) return false;if (FCK.EditMode==0){switch (B){case 'Paste':return!FCK.Paste();case 'Cut':FCKUndo.SaveUndoStep();return false;}}else{if (B.Equals('Paste','Undo','Redo','SelectAll','Cut')) return false;};var C=FCK.Commands.GetCommand(B);if (C.GetState()==-1) return false;return (C.Execute.apply(C,FCKTools.ArgumentsToArray(arguments,2))!==false);};(function(){var A=window.parent.document;var B=A.getElementById(FCK.Name);var i=0;while (B||i==0){if (B&&B.tagName.toLowerCase().Equals('input','textarea')){FCK.LinkedField=B;break;};B=A.getElementsByName(FCK.Name)[i++];}})();var FCKTempBin={Elements:[],AddElement:function(A){var B=this.Elements.length;this.Elements[B]=A;return B;},RemoveElement:function(A){var e=this.Elements[A];this.Elements[A]=null;return e;},Reset:function(){var i=0;while (i<this.Elements.length) this.Elements[i++]=null;this.Elements.length=0;},ToHtml:function(){for (var i=0;i<this.Elements.length;i++){this.Elements[i]='<div> '+this.Elements[i].outerHTML+'</div>';this.Elements[i].isHtml=true;}},ToElements:function(){var A=FCK.EditorDocument.createElement('div');for (var i=0;i<this.Elements.length;i++){if (this.Elements[i].isHtml){A.innerHTML=this.Elements[i];this.Elements[i]=A.firstChild.removeChild(A.firstChild.lastChild);}}}};var FCKFocusManager=FCK.FocusManager={IsLocked:false,AddWindow:function(A,B){var C;if (FCKBrowserInfo.IsIE) C=A.nodeType==1?A:A.frameElement?A.frameElement:A.document;else if (FCKBrowserInfo.IsSafari) C=A;else C=A.document;FCKTools.AddEventListener(C,'blur',FCKFocusManager_Win_OnBlur);FCKTools.AddEventListener(C,'focus',B?FCKFocusManager_Win_OnFocus_Area:FCKFocusManager_Win_OnFocus);},RemoveWindow:function(A){if (FCKBrowserInfo.IsIE) oTarget=A.nodeType==1?A:A.frameElement?A.frameElement:A.document;else oTarget=A.document;FCKTools.RemoveEventListener(oTarget,'blur',FCKFocusManager_Win_OnBlur);FCKTools.RemoveEventListener(oTarget,'focus',FCKFocusManager_Win_OnFocus_Area);FCKTools.RemoveEventListener(oTarget,'focus',FCKFocusManager_Win_OnFocus);},Lock:function(){this.IsLocked=true;},Unlock:function(){if (this._HasPendingBlur) FCKFocusManager._Timer=window.setTimeout(FCKFocusManager_FireOnBlur,100);this.IsLocked=false;},_ResetTimer:function(){this._HasPendingBlur=false;if (this._Timer){window.clearTimeout(this._Timer);delete this._Timer;}}};function FCKFocusManager_Win_OnBlur(){if (typeof(FCK)!='undefined'&&FCK.HasFocus){FCKFocusManager._ResetTimer();FCKFocusManager._Timer=window.setTimeout(FCKFocusManager_FireOnBlur,100);}};function FCKFocusManager_FireOnBlur(){if (FCKFocusManager.IsLocked) FCKFocusManager._HasPendingBlur=true;else{FCK.HasFocus=false;FCK.Events.FireEvent("OnBlur");}};function FCKFocusManager_Win_OnFocus_Area(){if (FCKFocusManager._IsFocusing) return;FCKFocusManager._IsFocusing=true;FCK.Focus();FCKFocusManager_Win_OnFocus();FCKTools.RunFunction(function(){delete FCKFocusManager._IsFocusing;});};function FCKFocusManager_Win_OnFocus(){FCKFocusManager._ResetTimer();if (!FCK.HasFocus&&!FCKFocusManager.IsLocked){FCK.HasFocus=true;FCK.Events.FireEvent("OnFocus");}};(function(){var A=window.frameElement;var B=A.width;var C=A.height;if (/^\d+$/.test(B)) B+='px';if (/^\d+$/.test(C)) C+='px';var D=A.style;D.border=D.padding=D.margin=0;D.backgroundColor='transparent';D.backgroundImage='none';D.width=B;D.height=C;})();
+FCK.Description="FCKeditor for Gecko Browsers";FCK.InitializeBehaviors=function(){if (window.onresize) window.onresize();FCKFocusManager.AddWindow(this.EditorWindow);this.ExecOnSelectionChange=function(){FCK.Events.FireEvent("OnSelectionChange");};this._ExecDrop=function(evt){if (FCK.MouseDownFlag){FCK.MouseDownFlag=false;return;};if (FCKConfig.ForcePasteAsPlainText){if (evt.dataTransfer){var A=evt.dataTransfer.getData('Text');A=FCKTools.HTMLEncode(A);A=FCKTools.ProcessLineBreaks(window,FCKConfig,A);FCK.InsertHtml(A);}else if (FCKConfig.ShowDropDialog) FCK.PasteAsPlainText();evt.preventDefault();evt.stopPropagation();}};this._ExecCheckCaret=function(evt){if (FCK.EditMode!=0) return;if (evt.type=='keypress'){var B=evt.keyCode;if (B<33||B>40) return;};var C=function(H){if (H.nodeType!=1) return false;var D=H.tagName.toLowerCase();return (FCKListsLib.BlockElements[D]||FCKListsLib.EmptyElements[D]);};var E=function(){var F=FCKSelection.GetSelection();var G=F.getRangeAt(0);if (!G||!G.collapsed) return;var H=G.endContainer;if (H.nodeType!=3) return;if (H.nodeValue.length!=G.endOffset) return;var I=H.parentNode.tagName.toLowerCase();if (!(I=='a'||(!FCKBrowserInfo.IsOpera&&String(H.parentNode.contentEditable)=='false')||(!(FCKListsLib.BlockElements[I]||FCKListsLib.NonEmptyBlockElements[I])&&B==35))) return;var J=FCKTools.GetNextTextNode(H,H.parentNode,C);if (J) return;G=FCK.EditorDocument.createRange();J=FCKTools.GetNextTextNode(H,H.parentNode.parentNode,C);if (J){if (FCKBrowserInfo.IsOpera&&B==37) return;G.setStart(J,0);G.setEnd(J,0);}else{while (H.parentNode&&H.parentNode!=FCK.EditorDocument.body&&H.parentNode!=FCK.EditorDocument.documentElement&&H==H.parentNode.lastChild&&(!FCKListsLib.BlockElements[H.parentNode.tagName.toLowerCase()]&&!FCKListsLib.NonEmptyBlockElements[H.parentNode.tagName.toLowerCase()])) H=H.parentNode;if (FCKListsLib.BlockElements[I]||FCKListsLib.EmptyElements[I]||H==FCK.EditorDocument.body){G.setStart(H,H.childNodes.length);G.setEnd(H,H.childNodes.length);}else{var K=H.nextSibling;while (K){if (K.nodeType!=1){K=K.nextSibling;continue;};var L=K.tagName.toLowerCase();if (FCKListsLib.BlockElements[L]||FCKListsLib.EmptyElements[L]||FCKListsLib.NonEmptyBlockElements[L]) break;K=K.nextSibling;};var M=FCK.EditorDocument.createTextNode('');if (K) H.parentNode.insertBefore(M,K);else H.parentNode.appendChild(M);G.setStart(M,0);G.setEnd(M,0);}};F.removeAllRanges();F.addRange(G);FCK.Events.FireEvent("OnSelectionChange");};setTimeout(E,1);};this.ExecOnSelectionChangeTimer=function(){if (FCK.LastOnChangeTimer) window.clearTimeout(FCK.LastOnChangeTimer);FCK.LastOnChangeTimer=window.setTimeout(FCK.ExecOnSelectionChange,100);};this.EditorDocument.addEventListener('mouseup',this.ExecOnSelectionChange,false);this.EditorDocument.addEventListener('keyup',this.ExecOnSelectionChangeTimer,false);this._DblClickListener=function(e){FCK.OnDoubleClick(e.target);e.stopPropagation();};this.EditorDocument.addEventListener('dblclick',this._DblClickListener,true);this.EditorDocument.addEventListener('keydown',this._KeyDownListener,false);if (FCKBrowserInfo.IsGecko){this.EditorWindow.addEventListener('dragdrop',this._ExecDrop,true);}else if (FCKBrowserInfo.IsSafari){var N=function(evt){ if (!FCK.MouseDownFlag) evt.returnValue=false;};this.EditorDocument.addEventListener('dragenter',N,true);this.EditorDocument.addEventListener('dragover',N,true);this.EditorDocument.addEventListener('drop',this._ExecDrop,true);this.EditorDocument.addEventListener('mousedown',function(ev){var O=ev.srcElement;if (O.nodeName.IEquals('IMG','HR','INPUT','TEXTAREA','SELECT')){FCKSelection.SelectNode(O);}},true);this.EditorDocument.addEventListener('mouseup',function(ev){if (ev.srcElement.nodeName.IEquals('INPUT','TEXTAREA','SELECT')) ev.preventDefault()},true);this.EditorDocument.addEventListener('click',function(ev){if (ev.srcElement.nodeName.IEquals('INPUT','TEXTAREA','SELECT')) ev.preventDefault()},true);};if (FCKBrowserInfo.IsGecko||FCKBrowserInfo.IsOpera){this.EditorDocument.addEventListener('keypress',this._ExecCheckCaret,false);this.EditorDocument.addEventListener('click',this._ExecCheckCaret,false);};FCK.ContextMenu._InnerContextMenu.SetMouseClickWindow(FCK.EditorWindow);FCK.ContextMenu._InnerContextMenu.AttachToElement(FCK.EditorDocument);};FCK.MakeEditable=function(){this.EditingArea.MakeEditable();};function Document_OnContextMenu(e){if (!e.target._FCKShowContextMenu) e.preventDefault();};document.oncontextmenu=Document_OnContextMenu;FCK._BaseGetNamedCommandState=FCK.GetNamedCommandState;FCK.GetNamedCommandState=function(A){switch (A){case 'Unlink':return FCKSelection.HasAncestorNode('A')?0:-1;default:return FCK._BaseGetNamedCommandState(A);}};FCK.RedirectNamedCommands={Print:true,Paste:true};FCK.ExecuteRedirectedNamedCommand=function(A,B){switch (A){case 'Print':FCK.EditorWindow.print();break;case 'Paste':try{if (FCKBrowserInfo.IsSafari) throw '';if (FCK.Paste()) FCK.ExecuteNamedCommand('Paste',null,true);}catch (e) { FCKDialog.OpenDialog('FCKDialog_Paste',FCKLang.Paste,'dialog/fck_paste.html',400,330,'Security');};break;default:FCK.ExecuteNamedCommand(A,B);}};FCK._ExecPaste=function(){FCKUndo.SaveUndoStep();if (FCKConfig.ForcePasteAsPlainText){FCK.PasteAsPlainText();return false;};return true;};FCK.InsertHtml=function(A){var B=FCK.EditorDocument,range;A=FCKConfig.ProtectedSource.Protect(A);A=FCK.ProtectEvents(A);A=FCK.ProtectUrls(A);A=FCK.ProtectTags(A);FCKUndo.SaveUndoStep();if (FCKBrowserInfo.IsGecko){A=A.replace(/ $/,'$&<span _fcktemp="1"/>');var C=new FCKDocumentFragment(this.EditorDocument);C.AppendHtml(A);var D=C.RootNode.lastChild;range=new FCKDomRange(this.EditorWindow);range.MoveToSelection();range.DeleteContents();range.InsertNode(C.RootNode);range.MoveToPosition(D,4);}else B.execCommand('inserthtml',false,A);this.Focus();if (!range){range=new FCKDomRange(this.EditorWindow);range.MoveToSelection();};var E=range.CreateBookmark();FCKDocumentProcessor.Process(B);try{range.MoveToBookmark(E);range.Select();}catch (e) {};this.Events.FireEvent("OnSelectionChange");};FCK.PasteAsPlainText=function(){FCKTools.RunFunction(FCKDialog.OpenDialog,FCKDialog,['FCKDialog_Paste',FCKLang.PasteAsText,'dialog/fck_paste.html',400,330,'PlainText']);};FCK.GetClipboardHTML=function(){return '';};FCK.CreateLink=function(A,B){var C=[];if (FCKSelection.GetSelection().isCollapsed) return C;FCK.ExecuteNamedCommand('Unlink',null,false,!!B);if (A.length>0){var D='javascript:void(0);/*'+(new Date().getTime())+'*/';FCK.ExecuteNamedCommand('CreateLink',D,false,!!B);var E=this.EditorDocument.evaluate("//a[@href='"+D+"']",this.EditorDocument.body,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);for (var i=0;i<E.snapshotLength;i++){var F=E.snapshotItem(i);F.href=A;C.push(F);}};return C;};FCK._FillEmptyBlock=function(A){if (!A||A.nodeType!=1) return;var B=A.tagName.toLowerCase();if (B!='p'&&B!='div') return;if (A.firstChild) return;FCKTools.AppendBogusBr(A);};FCK._ExecCheckEmptyBlock=function(){FCK._FillEmptyBlock(FCK.EditorDocument.body.firstChild);var A=FCKSelection.GetSelection();if (!A||A.rangeCount<1) return;var B=A.getRangeAt(0);FCK._FillEmptyBlock(B.startContainer);};
+var FCKConfig=FCK.Config={};if (document.location.protocol=='file:'){FCKConfig.BasePath=decodeURIComponent(document.location.pathname.substr(1));FCKConfig.BasePath=FCKConfig.BasePath.replace(/\\/gi,'/');var sFullProtocol=document.location.href.match(/^(file\:\/{2,3})/)[1];if (FCKBrowserInfo.IsOpera) sFullProtocol+='localhost/';FCKConfig.BasePath=sFullProtocol+FCKConfig.BasePath.substring(0,FCKConfig.BasePath.lastIndexOf('/')+1);}else FCKConfig.BasePath=document.location.protocol+'//'+document.location.host+document.location.pathname.substring(0,document.location.pathname.lastIndexOf('/')+1);FCKConfig.FullBasePath=FCKConfig.BasePath;FCKConfig.EditorPath=FCKConfig.BasePath.replace(/editor\/$/,'');try{FCKConfig.ScreenWidth=screen.width;FCKConfig.ScreenHeight=screen.height;}catch (e){FCKConfig.ScreenWidth=800;FCKConfig.ScreenHeight=600;};FCKConfig.ProcessHiddenField=function(){this.PageConfig={};var A=window.parent.document.getElementById(FCK.Name+'___Config');if (!A) return;var B=A.value.split('&');for (var i=0;i<B.length;i++){if (B[i].length==0) continue;var C=B[i].split('=');var D=decodeURIComponent(C[0]);var E=decodeURIComponent(C[1]);if (D=='CustomConfigurationsPath') FCKConfig[D]=E;else if (E.toLowerCase()=="true") this.PageConfig[D]=true;else if (E.toLowerCase()=="false") this.PageConfig[D]=false;else if (E.length>0&&!isNaN(E)) this.PageConfig[D]=parseInt(E,10);else this.PageConfig[D]=E;}};function FCKConfig_LoadPageConfig(){var A=FCKConfig.PageConfig;for (var B in A) FCKConfig[B]=A[B];};function FCKConfig_PreProcess(){var A=FCKConfig;if (A.AllowQueryStringDebug){try{if ((/fckdebug=true/i).test(window.top.location.search)) A.Debug=true;}catch (e) { }};if (!A.PluginsPath.EndsWith('/')) A.PluginsPath+='/';var B=A.ToolbarComboPreviewCSS;if (!B||B.length==0) A.ToolbarComboPreviewCSS=A.EditorAreaCSS;A.RemoveAttributesArray=(A.RemoveAttributes||'').split(',');if (!FCKConfig.SkinEditorCSS||FCKConfig.SkinEditorCSS.length==0) FCKConfig.SkinEditorCSS=FCKConfig.SkinPath+'fck_editor.css';if (!FCKConfig.SkinDialogCSS||FCKConfig.SkinDialogCSS.length==0) FCKConfig.SkinDialogCSS=FCKConfig.SkinPath+'fck_dialog.css';};FCKConfig.ToolbarSets={};FCKConfig.Plugins={};FCKConfig.Plugins.Items=[];FCKConfig.Plugins.Add=function(A,B,C){FCKConfig.Plugins.Items.AddItem([A,B,C]);};FCKConfig.ProtectedSource={};FCKConfig.ProtectedSource._CodeTag=(new Date()).valueOf();FCKConfig.ProtectedSource.RegexEntries=[/<!--[\s\S]*?-->/g,/<script[\s\S]*?<\/script>/gi,/<noscript[\s\S]*?<\/noscript>/gi];FCKConfig.ProtectedSource.Add=function(A){this.RegexEntries.AddItem(A);};FCKConfig.ProtectedSource.Protect=function(A){var B=this._CodeTag;function _Replace(protectedSource){var C=FCKTempBin.AddElement(protectedSource);return '<!--{'+B+C+'}-->';};for (var i=0;i<this.RegexEntries.length;i++){A=A.replace(this.RegexEntries[i],_Replace);};return A;};FCKConfig.ProtectedSource.Revert=function(A,B){function _Replace(m,opener,index){var C=B?FCKTempBin.RemoveElement(index):FCKTempBin.Elements[index];return FCKConfig.ProtectedSource.Revert(C,B);};var D=new RegExp("(<|<)!--\\{"+this._CodeTag+"(\\d+)\\}--(>|>)","g");return A.replace(D,_Replace);};FCKConfig.GetBodyAttributes=function(){var A='';if (this.BodyId&&this.BodyId.length>0) A+=' id="'+this.BodyId+'"';if (this.BodyClass&&this.BodyClass.length>0) A+=' class="'+this.BodyClass+'"';return A;};FCKConfig.ApplyBodyAttributes=function(A){if (this.BodyId&&this.BodyId.length>0) A.id=FCKConfig.BodyId;if (this.BodyClass&&this.BodyClass.length>0) A.className+=' '+FCKConfig.BodyClass;};
var FCKDebug={Output:function(){},OutputObject:function(){}};
-var FCKDomTools={MoveChildren:function(A,B,C){if (A==B) return;var D;if (C){while ((D=A.lastChild)) B.insertBefore(A.removeChild(D),B.firstChild);}else{while ((D=A.firstChild)) B.appendChild(A.removeChild(D));}},MoveNode:function(A,B,C){if (C) B.insertBefore(FCKDomTools.RemoveNode(A),B.firstChild);else B.appendChild(FCKDomTools.RemoveNode(A));},TrimNode:function(A){this.LTrimNode(A);this.RTrimNode(A);},LTrimNode:function(A){var B;while ((B=A.firstChild)){if (B.nodeType==3){var C=B.nodeValue.LTrim();var D=B.nodeValue.length;if (C.length==0){A.removeChild(B);continue;}else if (C.length<D){B.splitText(D-C.length);A.removeChild(A.firstChild);}};break;}},RTrimNode:function(A){var B;while ((B=A.lastChild)){if (B.nodeType==3){var C=B.nodeValue.RTrim();var D=B.nodeValue.length;if (C.length==0){B.parentNode.removeChild(B);continue;}else if (C.length<D){B.splitText(C.length);A.lastChild.parentNode.removeChild(A.lastChild);}};break;};if (!FCKBrowserInfo.IsIE&&!FCKBrowserInfo.IsOpera){B=A.lastChild;if (B&&B.nodeType==1&&B.nodeName.toLowerCase()=='br'){B.parentNode.removeChild(B);}}},RemoveNode:function(A,B){if (B){var C;while ((C=A.firstChild)) A.parentNode.insertBefore(A.removeChild(C),A);};return A.parentNode.removeChild(A);},GetFirstChild:function(A,B){if (typeof (B)=='string') B=[B];var C=A.firstChild;while(C){if (C.nodeType==1&&C.tagName.Equals.apply(C.tagName,B)) return C;C=C.nextSibling;};return null;},GetLastChild:function(A,B){if (typeof (B)=='string') B=[B];var C=A.lastChild;while(C){if (C.nodeType==1&&(!B||C.tagName.Equals(B))) return C;C=C.previousSibling;};return null;},GetPreviousSourceElement:function(A,B,C,D){if (!A) return null;if (C&&A.nodeType==1&&A.nodeName.IEquals(C)) return null;if (A.previousSibling) A=A.previousSibling;else return this.GetPreviousSourceElement(A.parentNode,B,C,D);while (A){if (A.nodeType==1){if (C&&A.nodeName.IEquals(C)) break;if (!D||!A.nodeName.IEquals(D)) return A;}else if (B&&A.nodeType==3&&A.nodeValue.RTrim().length>0) break;if (A.lastChild) A=A.lastChild;else return this.GetPreviousSourceElement(A,B,C,D);};return null;},GetNextSourceElement:function(A,B,C,D,E){while((A=this.GetNextSourceNode(A,E))){if (A.nodeType==1){if (C&&A.nodeName.IEquals(C)) break;if (D&&A.nodeName.IEquals(D)) return this.GetNextSourceElement(A,B,C,D);return A;}else if (B&&A.nodeType==3&&A.nodeValue.RTrim().length>0) break;};return null;},GetNextSourceNode:function(A,B,C,D){if (!A) return null;var E;if (!B&&A.firstChild) E=A.firstChild;else{if (D&&A==D) return null;E=A.nextSibling;if (!E&&(!D||D!=A.parentNode)) return this.GetNextSourceNode(A.parentNode,true,C,D);};if (C&&E&&E.nodeType!=C) return this.GetNextSourceNode(E,false,C,D);return E;},GetPreviousSourceNode:function(A,B,C,D){if (!A) return null;var E;if (!B&&A.lastChild) E=A.lastChild;else{if (D&&A==D) return null;E=A.previousSibling;if (!E&&(!D||D!=A.parentNode)) return this.GetPreviousSourceNode(A.parentNode,true,C,D);};if (C&&E&&E.nodeType!=C) return this.GetPreviousSourceNode(E,false,C,D);return E;},InsertAfterNode:function(A,B){return A.parentNode.insertBefore(B,A.nextSibling);},GetParents:function(A){var B=[];while (A){B.unshift(A);A=A.parentNode;};return B;},GetCommonParents:function(A,B){var C=this.GetParents(A);var D=this.GetParents(B);var E=[];for (var i=0;i<C.length;i++){if (C[i]==D[i]) E.push(C[i]);};return E;},GetCommonParentNode:function(A,B,C){var D={};if (!C.pop) C=[C];while (C.length>0) D[C.pop().toLowerCase()]=1;var E=this.GetCommonParents(A,B);var F=null;while ((F=E.pop())){if (D[F.nodeName.toLowerCase()]) return F;};return null;},GetIndexOf:function(A){var B=A.parentNode?A.parentNode.firstChild:null;var C=-1;while (B){C++;if (B==A) return C;B=B.nextSibling;};return-1;},PaddingNode:null,EnforcePaddingNode:function(A,B){try{if (!A||!A.body) return;}catch (e){return;};this.CheckAndRemovePaddingNode(A,B,true);try{if (A.body.lastChild&&(A.body.lastChild.nodeType!=1||A.body.lastChild.tagName.toLowerCase()==B.toLowerCase())) return;}catch (e){return;};var C=A.createElement(B);if (FCKBrowserInfo.IsGecko&&FCKListsLib.NonEmptyBlockElements[B]) FCKTools.AppendBogusBr(C);this.PaddingNode=C;if (A.body.childNodes.length==1&&A.body.firstChild.nodeType==1&&A.body.firstChild.tagName.toLowerCase()=='br'&&(A.body.firstChild.getAttribute('_moz_dirty')!=null||A.body.firstChild.getAttribute('type')=='_moz')) A.body.replaceChild(C,A.body.firstChild);else A.body.appendChild(C);},CheckAndRemovePaddingNode:function(A,B,C){var D=this.PaddingNode;if (!D) return;try{if (D.parentNode!=A.body||D.tagName.toLowerCase()!=B||(D.childNodes.length>1)||(D.firstChild&&D.firstChild.nodeValue!='\xa0'&&String(D.firstChild.tagName).toLowerCase()!='br')){this.PaddingNode=null;return;}}catch (e){this.PaddingNode=null;return;};if (!C){if (D.parentNode.childNodes.length>1) D.parentNode.removeChild(D);this.PaddingNode=null;}},HasAttribute:function(A,B){if (A.hasAttribute) return A.hasAttribute(B);else{var C=A.attributes[B];return (C!=undefined&&C.specified);}},HasAttributes:function(A){var B=A.attributes;for (var i=0;i<B.length;i++){if (FCKBrowserInfo.IsIE&&B[i].nodeName=='class'){if (A.className.length>0) return true;}else if (B[i].specified) return true;};return false;},RemoveAttribute:function(A,B){if (FCKBrowserInfo.IsIE&&B.toLowerCase()=='class') B='className';return A.removeAttribute(B,0);},RemoveAttributes:function (A,B){for (var i=0;i<B.length;i++) this.RemoveAttribute(A,B[i]);},GetAttributeValue:function(A,B){var C=B;if (typeof B=='string') B=A.attributes[B];else C=B.nodeName;if (B&&B.specified){if (C=='style') return A.style.cssText;else if (C=='class'||C.indexOf('on')==0) return B.nodeValue;else{return A.getAttribute(C,2);}};return null;},Contains:function(A,B){if (A.contains&&B.nodeType==1) return A.contains(B);while ((B=B.parentNode)){if (B==A) return true;};return false;},BreakParent:function(A,B,C){var D=C||new FCKDomRange(FCKTools.GetElementWindow(A));D.SetStart(A,4);D.SetEnd(B,4);var E=D.ExtractContents();D.InsertNode(A.parentNode.removeChild(A));E.InsertAfterNode(A);D.Release(!!C);},GetNodeAddress:function(A,B){var C=[];while (A&&A!=FCKTools.GetElementDocument(A).documentElement){var D=A.parentNode;var E=-1;for(var i=0;i<D.childNodes.length;i++){var F=D.childNodes[i];if (B===true&&F.nodeType==3&&F.previousSibling&&F.previousSibling.nodeType==3) continue;E++;if (D.childNodes[i]==A) break;};C.unshift(E);A=A.parentNode;};return C;},GetNodeFromAddress:function(A,B,C){var D=A.documentElement;for (var i=0;i<B.length;i++){var E=B[i];if (!C){D=D.childNodes[E];continue;};var F=-1;for (var j=0;j<D.childNodes.length;j++){var G=D.childNodes[j];if (C===true&&G.nodeType==3&&G.previousSibling&&G.previousSibling.nodeType==3) continue;F++;if (F==E){D=G;break;}}};return D;},CloneElement:function(A){A=A.cloneNode(false);A.removeAttribute('id',false);return A;},ClearElementJSProperty:function(A,B){if (FCKBrowserInfo.IsIE) A.removeAttribute(B);else delete A[B];},SetElementMarker:function (A,B,C,D){var E=String(parseInt(Math.random()*0xfffffff,10));B._FCKMarkerId=E;B[C]=D;if (!A[E]) A[E]={ 'element':B,'markers':{} };A[E]['markers'][C]=D;},ClearElementMarkers:function(A,B,C){var D=B._FCKMarkerId;if (!D) return;this.ClearElementJSProperty(B,'_FCKMarkerId');for (var j in A[D]['markers']) this.ClearElementJSProperty(B,j);if (C) delete A[D];},ClearAllMarkers:function(A){for (var i in A) this.ClearElementMarkers(A,A[i]['element'],true);},ListToArray:function(A,B,C,D,E){if (!A.nodeName.IEquals(['ul','ol'])) return [];if (!D) D=0;if (!C) C=[];for (var i=0;i<A.childNodes.length;i++){var F=A.childNodes[i];if (!F.nodeName.IEquals('li')) continue;var G={ 'parent':A,'indent':D,'contents':[] };if (!E){G.grandparent=A.parentNode;if (G.grandparent&&G.grandparent.nodeName.IEquals('li')) G.grandparent=G.grandparent.parentNode;}else G.grandparent=E;if (B) this.SetElementMarker(B,F,'_FCK_ListArray_Index',C.length);C.push(G);for (var j=0;j<F.childNodes.length;j++){var H=F.childNodes[j];if (H.nodeName.IEquals(['ul','ol'])) this.ListToArray(H,B,C,D+1,G.grandparent);else G.contents.push(H);}};return C;},ArrayToList:function(A,B,C){if (C==undefined) C=0;if (!A||A.length<C+1) return null;var D=FCKTools.GetElementDocument(A[C].parent);var E=D.createDocumentFragment();var F=null;var G=C;var H=Math.max(A[C].indent,0);var I=null;while (true){var J=A[G];if (J.indent==H){if (!F||A[G].parent.nodeName!=F.nodeName){F=A[G].parent.cloneNode(false);E.appendChild(F);};I=D.createElement('li');F.appendChild(I);for (var i=0;i<J.contents.length;i++) I.appendChild(J.contents[i].cloneNode(true));G++;}else if (J.indent==Math.max(H,0)+1){var K=this.ArrayToList(A,null,G);I.appendChild(K.listNode);G=K.nextIndex;}else if (J.indent==-1&&C==0&&J.grandparent){var I;if (J.grandparent.nodeName.IEquals(['ul','ol'])) I=D.createElement('li');else{if (FCKConfig.EnterMode.IEquals(['div','p'])&&!J.grandparent.nodeName.IEquals('td')) I=D.createElement(FCKConfig.EnterMode);else I=D.createDocumentFragment();};for (var i=0;i<J.contents.length;i++) I.appendChild(J.contents[i].cloneNode(true));if (I.nodeType==11){if (I.lastChild&&I.lastChild.getAttribute&&I.lastChild.getAttribute('type')=='_moz') I.removeChild(I.lastChild);I.appendChild(D.createElement('br'));};if (I.nodeName.IEquals(FCKConfig.EnterMode)&&I.firstChild){this.TrimNode(I);if (FCKListsLib.BlockBoundaries[I.firstChild.nodeName.toLowerCase()]){var M=D.createDocumentFragment();while (I.firstChild) M.appendChild(I.removeChild(I.firstChild));I=M;}};if (FCKBrowserInfo.IsGeckoLike&&I.nodeName.IEquals(['div','p'])) FCKTools.AppendBogusBr(I);E.appendChild(I);F=null;G++;}else return null;if (A.length<=G||Math.max(A[G].indent,0)<H){break;}};if (B){var N=E.firstChild;while (N){if (N.nodeType==1) this.ClearElementMarkers(B,N);N=this.GetNextSourceNode(N);}};return { 'listNode':E,'nextIndex':G };},GetNextSibling:function(A,B){A=A.nextSibling;while (A&&!B&&A.nodeType!=1&&(A.nodeType!=3||A.nodeValue.length==0)) A=A.nextSibling;return A;},GetPreviousSibling:function(A,B){A=A.previousSibling;while (A&&!B&&A.nodeType!=1&&(A.nodeType!=3||A.nodeValue.length==0)) A=A.previousSibling;return A;},CheckIsEmptyElement:function(A,B){var C=A.firstChild;var D;while (C){if (C.nodeType==1){if (D||!FCKListsLib.InlineNonEmptyElements[C.nodeName.toLowerCase()]) return false;if (!B||B(C)===true) D=C;}else if (C.nodeType==3&&C.nodeValue.length>0) return false;C=C.nextSibling;};return D?this.CheckIsEmptyElement(D,B):true;},SetElementStyles:function(A,B){var C=A.style;for (var D in B) C[D]=B[D];},SetOpacity:function(A,B){if (FCKBrowserInfo.IsIE){B=Math.round(B*100);A.style.filter=(B>100?'':'progid:DXImageTransform.Microsoft.Alpha(opacity='+B+')');}else A.style.opacity=B;},GetCurrentElementStyle:function(A,B){if (FCKBrowserInfo.IsIE) return A.currentStyle[B];else return A.ownerDocument.defaultView.getComputedStyle(A,'').getPropertyValue(B);},GetPositionedAncestor:function(A){var B=A;while (B!=FCKTools.GetElementDocument(B).documentElement){if (this.GetCurrentElementStyle(B,'position')!='static') return B;if (B==FCKTools.GetElementDocument(B).documentElement&¤tWindow!=w) B=currentWindow.frameElement;else B=B.parentNode;};return null;},ScrollIntoView:function(A,B){var C=FCKTools.GetElementWindow(A);var D=FCKTools.GetViewPaneSize(C).Height;var E=D*-1;if (B===false){E+=A.offsetHeight;E+=parseInt(this.GetCurrentElementStyle(A,'marginBottom')||0,10);};E+=A.offsetTop;while ((A=A.offsetParent)) E+=A.offsetTop||0;var F=FCKTools.GetScrollPosition(C).Y;if (E>0&&E>F) C.scrollTo(0,E);},CheckIsEditable:function(A){var B=A.nodeName.toLowerCase();var C=FCK.DTD[B]||FCK.DTD.span;return (C['#']&&!FCKListsLib.NonEditableElements[B]);}};
+var FCKDomTools={MoveChildren:function(A,B,C){if (A==B) return;var D;if (C){while ((D=A.lastChild)) B.insertBefore(A.removeChild(D),B.firstChild);}else{while ((D=A.firstChild)) B.appendChild(A.removeChild(D));}},MoveNode:function(A,B,C){if (C) B.insertBefore(FCKDomTools.RemoveNode(A),B.firstChild);else B.appendChild(FCKDomTools.RemoveNode(A));},TrimNode:function(A){this.LTrimNode(A);this.RTrimNode(A);},LTrimNode:function(A){var B;while ((B=A.firstChild)){if (B.nodeType==3){var C=B.nodeValue.LTrim();var D=B.nodeValue.length;if (C.length==0){A.removeChild(B);continue;}else if (C.length<D){B.splitText(D-C.length);A.removeChild(A.firstChild);}};break;}},RTrimNode:function(A){var B;while ((B=A.lastChild)){if (B.nodeType==3){var C=B.nodeValue.RTrim();var D=B.nodeValue.length;if (C.length==0){B.parentNode.removeChild(B);continue;}else if (C.length<D){B.splitText(C.length);A.lastChild.parentNode.removeChild(A.lastChild);}};break;};if (!FCKBrowserInfo.IsIE&&!FCKBrowserInfo.IsOpera){B=A.lastChild;if (B&&B.nodeType==1&&B.nodeName.toLowerCase()=='br'){B.parentNode.removeChild(B);}}},RemoveNode:function(A,B){if (B){var C;while ((C=A.firstChild)) A.parentNode.insertBefore(A.removeChild(C),A);};return A.parentNode.removeChild(A);},GetFirstChild:function(A,B){if (typeof (B)=='string') B=[B];var C=A.firstChild;while(C){if (C.nodeType==1&&C.tagName.Equals.apply(C.tagName,B)) return C;C=C.nextSibling;};return null;},GetLastChild:function(A,B){if (typeof (B)=='string') B=[B];var C=A.lastChild;while(C){if (C.nodeType==1&&(!B||C.tagName.Equals(B))) return C;C=C.previousSibling;};return null;},GetPreviousSourceElement:function(A,B,C,D){if (!A) return null;if (C&&A.nodeType==1&&A.nodeName.IEquals(C)) return null;if (A.previousSibling) A=A.previousSibling;else return this.GetPreviousSourceElement(A.parentNode,B,C,D);while (A){if (A.nodeType==1){if (C&&A.nodeName.IEquals(C)) break;if (!D||!A.nodeName.IEquals(D)) return A;}else if (B&&A.nodeType==3&&A.nodeValue.RTrim().length>0) break;if (A.lastChild) A=A.lastChild;else return this.GetPreviousSourceElement(A,B,C,D);};return null;},GetNextSourceElement:function(A,B,C,D,E){while((A=this.GetNextSourceNode(A,E))){if (A.nodeType==1){if (C&&A.nodeName.IEquals(C)) break;if (D&&A.nodeName.IEquals(D)) return this.GetNextSourceElement(A,B,C,D);return A;}else if (B&&A.nodeType==3&&A.nodeValue.RTrim().length>0) break;};return null;},GetNextSourceNode:function(A,B,C,D){if (!A) return null;var E;if (!B&&A.firstChild) E=A.firstChild;else{if (D&&A==D) return null;E=A.nextSibling;if (!E&&(!D||D!=A.parentNode)) return this.GetNextSourceNode(A.parentNode,true,C,D);};if (C&&E&&E.nodeType!=C) return this.GetNextSourceNode(E,false,C,D);return E;},GetPreviousSourceNode:function(A,B,C,D){if (!A) return null;var E;if (!B&&A.lastChild) E=A.lastChild;else{if (D&&A==D) return null;E=A.previousSibling;if (!E&&(!D||D!=A.parentNode)) return this.GetPreviousSourceNode(A.parentNode,true,C,D);};if (C&&E&&E.nodeType!=C) return this.GetPreviousSourceNode(E,false,C,D);return E;},InsertAfterNode:function(A,B){return A.parentNode.insertBefore(B,A.nextSibling);},GetParents:function(A){var B=[];while (A){B.unshift(A);A=A.parentNode;};return B;},GetCommonParents:function(A,B){var C=this.GetParents(A);var D=this.GetParents(B);var E=[];for (var i=0;i<C.length;i++){if (C[i]==D[i]) E.push(C[i]);};return E;},GetCommonParentNode:function(A,B,C){var D={};if (!C.pop) C=[C];while (C.length>0) D[C.pop().toLowerCase()]=1;var E=this.GetCommonParents(A,B);var F=null;while ((F=E.pop())){if (D[F.nodeName.toLowerCase()]) return F;};return null;},GetIndexOf:function(A){var B=A.parentNode?A.parentNode.firstChild:null;var C=-1;while (B){C++;if (B==A) return C;B=B.nextSibling;};return-1;},PaddingNode:null,EnforcePaddingNode:function(A,B){try{if (!A||!A.body) return;}catch (e){return;};this.CheckAndRemovePaddingNode(A,B,true);try{if (A.body.lastChild&&(A.body.lastChild.nodeType!=1||A.body.lastChild.tagName.toLowerCase()==B.toLowerCase())) return;}catch (e){return;};var C=A.createElement(B);if (FCKBrowserInfo.IsGecko&&FCKListsLib.NonEmptyBlockElements[B]) FCKTools.AppendBogusBr(C);this.PaddingNode=C;if (A.body.childNodes.length==1&&A.body.firstChild.nodeType==1&&A.body.firstChild.tagName.toLowerCase()=='br'&&(A.body.firstChild.getAttribute('_moz_dirty')!=null||A.body.firstChild.getAttribute('type')=='_moz')) A.body.replaceChild(C,A.body.firstChild);else A.body.appendChild(C);},CheckAndRemovePaddingNode:function(A,B,C){var D=this.PaddingNode;if (!D) return;try{if (D.parentNode!=A.body||D.tagName.toLowerCase()!=B||(D.childNodes.length>1)||(D.firstChild&&D.firstChild.nodeValue!='\xa0'&&String(D.firstChild.tagName).toLowerCase()!='br')){this.PaddingNode=null;return;}}catch (e){this.PaddingNode=null;return;};if (!C){if (D.parentNode.childNodes.length>1) D.parentNode.removeChild(D);this.PaddingNode=null;}},HasAttribute:function(A,B){if (A.hasAttribute) return A.hasAttribute(B);else{var C=A.attributes[B];return (C!=undefined&&C.specified);}},HasAttributes:function(A){var B=A.attributes;for (var i=0;i<B.length;i++){if (FCKBrowserInfo.IsIE&&B[i].nodeName=='class'){if (A.className.length>0) return true;}else if (B[i].specified) return true;};return false;},RemoveAttribute:function(A,B){if (FCKBrowserInfo.IsIE&&B.toLowerCase()=='class') B='className';return A.removeAttribute(B,0);},RemoveAttributes:function (A,B){for (var i=0;i<B.length;i++) this.RemoveAttribute(A,B[i]);},GetAttributeValue:function(A,B){var C=B;if (typeof B=='string') B=A.attributes[B];else C=B.nodeName;if (B&&B.specified){if (C=='style') return A.style.cssText;else if (C=='class'||C.indexOf('on')==0) return B.nodeValue;else{return A.getAttribute(C,2);}};return null;},Contains:function(A,B){if (A.contains&&B.nodeType==1) return A.contains(B);while ((B=B.parentNode)){if (B==A) return true;};return false;},BreakParent:function(A,B,C){var D=C||new FCKDomRange(FCKTools.GetElementWindow(A));D.SetStart(A,4);D.SetEnd(B,4);var E=D.ExtractContents();D.InsertNode(A.parentNode.removeChild(A));E.InsertAfterNode(A);D.Release(!!C);},GetNodeAddress:function(A,B){var C=[];while (A&&A!=FCKTools.GetElementDocument(A).documentElement){var D=A.parentNode;var E=-1;for(var i=0;i<D.childNodes.length;i++){var F=D.childNodes[i];if (B===true&&F.nodeType==3&&F.previousSibling&&F.previousSibling.nodeType==3) continue;E++;if (D.childNodes[i]==A) break;};C.unshift(E);A=A.parentNode;};return C;},GetNodeFromAddress:function(A,B,C){var D=A.documentElement;for (var i=0;i<B.length;i++){var E=B[i];if (!C){D=D.childNodes[E];continue;};var F=-1;for (var j=0;j<D.childNodes.length;j++){var G=D.childNodes[j];if (C===true&&G.nodeType==3&&G.previousSibling&&G.previousSibling.nodeType==3) continue;F++;if (F==E){D=G;break;}}};return D;},CloneElement:function(A){A=A.cloneNode(false);A.removeAttribute('id',false);return A;},ClearElementJSProperty:function(A,B){if (FCKBrowserInfo.IsIE) A.removeAttribute(B);else delete A[B];},SetElementMarker:function (A,B,C,D){var E=String(parseInt(Math.random()*0xffffffff,10));B._FCKMarkerId=E;B[C]=D;if (!A[E]) A[E]={ 'element':B,'markers':{} };A[E]['markers'][C]=D;},ClearElementMarkers:function(A,B,C){var D=B._FCKMarkerId;if (!D) return;this.ClearElementJSProperty(B,'_FCKMarkerId');for (var j in A[D]['markers']) this.ClearElementJSProperty(B,j);if (C) delete A[D];},ClearAllMarkers:function(A){for (var i in A) this.ClearElementMarkers(A,A[i]['element'],true);},ListToArray:function(A,B,C,D,E){if (!A.nodeName.IEquals(['ul','ol'])) return [];if (!D) D=0;if (!C) C=[];for (var i=0;i<A.childNodes.length;i++){var F=A.childNodes[i];if (!F.nodeName.IEquals('li')) continue;var G={ 'parent':A,'indent':D,'contents':[] };if (!E){G.grandparent=A.parentNode;if (G.grandparent&&G.grandparent.nodeName.IEquals('li')) G.grandparent=G.grandparent.parentNode;}else G.grandparent=E;if (B) this.SetElementMarker(B,F,'_FCK_ListArray_Index',C.length);C.push(G);for (var j=0;j<F.childNodes.length;j++){var H=F.childNodes[j];if (H.nodeName.IEquals(['ul','ol'])) this.ListToArray(H,B,C,D+1,G.grandparent);else G.contents.push(H);}};return C;},ArrayToList:function(A,B,C){if (C==undefined) C=0;if (!A||A.length<C+1) return null;var D=FCKTools.GetElementDocument(A[C].parent);var E=D.createDocumentFragment();var F=null;var G=C;var H=Math.max(A[C].indent,0);var I=null;while (true){var J=A[G];if (J.indent==H){if (!F||A[G].parent.nodeName!=F.nodeName){F=A[G].parent.cloneNode(false);E.appendChild(F);};I=D.createElement('li');F.appendChild(I);for (var i=0;i<J.contents.length;i++) I.appendChild(J.contents[i].cloneNode(true));G++;}else if (J.indent==Math.max(H,0)+1){var K=this.ArrayToList(A,null,G);I.appendChild(K.listNode);G=K.nextIndex;}else if (J.indent==-1&&C==0&&J.grandparent){var I;if (J.grandparent.nodeName.IEquals(['ul','ol'])) I=D.createElement('li');else{if (FCKConfig.EnterMode.IEquals(['div','p'])&&!J.grandparent.nodeName.IEquals('td')) I=D.createElement(FCKConfig.EnterMode);else I=D.createDocumentFragment();};for (var i=0;i<J.contents.length;i++) I.appendChild(J.contents[i].cloneNode(true));if (I.nodeType==11){if (I.lastChild&&I.lastChild.getAttribute&&I.lastChild.getAttribute('type')=='_moz') I.removeChild(I.lastChild);I.appendChild(D.createElement('br'));};if (I.nodeName.IEquals(FCKConfig.EnterMode)&&I.firstChild){this.TrimNode(I);if (FCKListsLib.BlockBoundaries[I.firstChild.nodeName.toLowerCase()]){var M=D.createDocumentFragment();while (I.firstChild) M.appendChild(I.removeChild(I.firstChild));I=M;}};if (FCKBrowserInfo.IsGeckoLike&&I.nodeName.IEquals(['div','p'])) FCKTools.AppendBogusBr(I);E.appendChild(I);F=null;G++;}else return null;if (A.length<=G||Math.max(A[G].indent,0)<H){break;}};if (B){var N=E.firstChild;while (N){if (N.nodeType==1) this.ClearElementMarkers(B,N);N=this.GetNextSourceNode(N);}};return { 'listNode':E,'nextIndex':G };},GetNextSibling:function(A,B){A=A.nextSibling;while (A&&!B&&A.nodeType!=1&&(A.nodeType!=3||A.nodeValue.length==0)) A=A.nextSibling;return A;},GetPreviousSibling:function(A,B){A=A.previousSibling;while (A&&!B&&A.nodeType!=1&&(A.nodeType!=3||A.nodeValue.length==0)) A=A.previousSibling;return A;},CheckIsEmptyElement:function(A,B){var C=A.firstChild;var D;while (C){if (C.nodeType==1){if (D||!FCKListsLib.InlineNonEmptyElements[C.nodeName.toLowerCase()]) return false;if (!B||B(C)===true) D=C;}else if (C.nodeType==3&&C.nodeValue.length>0) return false;C=C.nextSibling;};return D?this.CheckIsEmptyElement(D,B):true;},SetElementStyles:function(A,B){var C=A.style;for (var D in B) C[D]=B[D];},SetOpacity:function(A,B){if (FCKBrowserInfo.IsIE){B=Math.round(B*100);A.style.filter=(B>100?'':'progid:DXImageTransform.Microsoft.Alpha(opacity='+B+')');}else A.style.opacity=B;},GetCurrentElementStyle:function(A,B){if (FCKBrowserInfo.IsIE) return A.currentStyle[B];else return A.ownerDocument.defaultView.getComputedStyle(A,'').getPropertyValue(B);},GetPositionedAncestor:function(A){var B=A;while (B!=FCKTools.GetElementDocument(B).documentElement){if (this.GetCurrentElementStyle(B,'position')!='static') return B;if (B==FCKTools.GetElementDocument(B).documentElement&¤tWindow!=w) B=currentWindow.frameElement;else B=B.parentNode;};return null;},ScrollIntoView:function(A,B){var C=FCKTools.GetElementWindow(A);var D=FCKTools.GetViewPaneSize(C).Height;var E=D*-1;if (B===false){E+=A.offsetHeight||0;E+=parseInt(this.GetCurrentElementStyle(A,'marginBottom')||0,10)||0;};var F=FCKTools.GetDocumentPosition(C,A);E+=F.y;var G=FCKTools.GetScrollPosition(C).Y;if (E>0&&(E>G||E<G-D)) C.scrollTo(0,E);},CheckIsEditable:function(A){var B=A.nodeName.toLowerCase();var C=FCK.DTD[B]||FCK.DTD.span;return (C['#']&&!FCKListsLib.NonEditableElements[B]);},GetSelectedDivContainers:function(){var A=[];var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=B.GetTouchedStartNode();var D=B.GetTouchedEndNode();var E=C;if (C==D){while (D.nodeType==1&&D.lastChild) D=D.lastChild;D=FCKDomTools.GetNextSourceNode(D);}while (E&&E!=D){if (E.nodeType!=3||!/^[ \t\n]*$/.test(E.nodeValue)){var F=new FCKElementPath(E);var G=F.BlockLimit;if (G&&G.nodeName.IEquals('div')&&A.IndexOf(G)==-1) A.push(G);};E=FCKDomTools.GetNextSourceNode(E);};return A;}};
var FCKTools={};FCKTools.CreateBogusBR=function(A){var B=A.createElement('br');B.setAttribute('type','_moz');return B;};FCKTools.FixCssUrls=function(A,B){if (!A||A.length==0) return B;return B.replace(/url\s*\(([\s'"]*)(.*?)([\s"']*)\)/g,function(match,opener,path,closer){if (/^\/|^\w?:/.test(path)) return match;else return 'url('+opener+A+path+closer+')';});};FCKTools._GetUrlFixedCss=function(A,B){var C=A.match(/^([^|]+)\|([\s\S]*)/);if (C) return FCKTools.FixCssUrls(C[1],C[2]);else return A;};FCKTools.AppendStyleSheet=function(A,B){if (!B) return [];if (typeof(B)=='string'){if (/[\\\/\.][^{}]*$/.test(B)){return this.AppendStyleSheet(A,B.split(','));}else return [this.AppendStyleString(A,FCKTools._GetUrlFixedCss(B))];}else{var C=[];for (var i=0;i<B.length;i++) C.push(this._AppendStyleSheet(A,B[i]));return C;}};FCKTools.GetStyleHtml=(function(){var A=function(styleDef,markTemp){if (styleDef.length==0) return '';var B=markTemp?' _fcktemp="true"':'';return '<style type="text/css"'+B+'>'+styleDef+'</style>';};var C=function(cssFileUrl,markTemp){if (cssFileUrl.length==0) return '';var B=markTemp?' _fcktemp="true"':'';return '<link href="'+cssFileUrl+'" type="text/css" rel="stylesheet" '+B+'/>';};return function(cssFileOrArrayOrDef,markTemp){if (!cssFileOrArrayOrDef) return '';if (typeof(cssFileOrArrayOrDef)=='string'){if (/[\\\/\.][^{}]*$/.test(cssFileOrArrayOrDef)){return this.GetStyleHtml(cssFileOrArrayOrDef.split(','),markTemp);}else return A(this._GetUrlFixedCss(cssFileOrArrayOrDef),markTemp);}else{var E='';for (var i=0;i<cssFileOrArrayOrDef.length;i++) E+=C(cssFileOrArrayOrDef[i],markTemp);return E;}}})();FCKTools.GetElementDocument=function (A){return A.ownerDocument||A.document;};FCKTools.GetElementWindow=function(A){return this.GetDocumentWindow(this.GetElementDocument(A));};FCKTools.GetDocumentWindow=function(A){if (FCKBrowserInfo.IsSafari&&!A.parentWindow) this.FixDocumentParentWindow(window.top);return A.parentWindow||A.defaultView;};FCKTools.FixDocumentParentWindow=function(A){if (A.document) A.document.parentWindow=A;for (var i=0;i<A.frames.length;i++) FCKTools.FixDocumentParentWindow(A.frames[i]);};FCKTools.HTMLEncode=function(A){if (!A) return '';A=A.replace(/&/g,'&');A=A.replace(/</g,'<');A=A.replace(/>/g,'>');return A;};FCKTools.HTMLDecode=function(A){if (!A) return '';A=A.replace(/>/g,'>');A=A.replace(/</g,'<');A=A.replace(/&/g,'&');return A;};FCKTools._ProcessLineBreaksForPMode=function(A,B,C,D,E){var F=0;var G="<p>";var H="</p>";var I="<br />";if (C){G="<li>";H="</li>";F=1;}while (D&&D!=A.FCK.EditorDocument.body){if (D.tagName.toLowerCase()=='p'){F=1;break;};D=D.parentNode;};for (var i=0;i<B.length;i++){var c=B.charAt(i);if (c=='\r') continue;if (c!='\n'){E.push(c);continue;};var n=B.charAt(i+1);if (n=='\r'){i++;n=B.charAt(i+1);};if (n=='\n'){i++;if (F) E.push(H);E.push(G);F=1;}else E.push(I);}};FCKTools._ProcessLineBreaksForDivMode=function(A,B,C,D,E){var F=0;var G="<div>";var H="</div>";if (C){G="<li>";H="</li>";F=1;}while (D&&D!=A.FCK.EditorDocument.body){if (D.tagName.toLowerCase()=='div'){F=1;break;};D=D.parentNode;};for (var i=0;i<B.length;i++){var c=B.charAt(i);if (c=='\r') continue;if (c!='\n'){E.push(c);continue;};if (F){if (E[E.length-1]==G){E.push(" ");};E.push(H);};E.push(G);F=1;};if (F) E.push(H);};FCKTools._ProcessLineBreaksForBrMode=function(A,B,C,D,E){var F=0;var G="<br />";var H="";if (C){G="<li>";H="</li>";F=1;};for (var i=0;i<B.length;i++){var c=B.charAt(i);if (c=='\r') continue;if (c!='\n'){E.push(c);continue;};if (F&&H.length) E.push (H);E.push(G);F=1;}};FCKTools.ProcessLineBreaks=function(A,B,C){var D=B.EnterMode.toLowerCase();var E=[];var F=0;var G=new A.FCKDomRange(A.FCK.EditorWindow);G.MoveToSelection();var H=G._Range.startContainer;while (H&&H.nodeType!=1) H=H.parentNode;if (H&&H.tagName.toLowerCase()=='li') F=1;if (D=='p') this._ProcessLineBreaksForPMode(A,C,F,H,E);else if (D=='div') this._ProcessLineBreaksForDivMode(A,C,F,H,E);else if (D=='br') this._ProcessLineBreaksForBrMode(A,C,F,H,E);return E.join("");};FCKTools.AddSelectOption=function(A,B,C){var D=FCKTools.GetElementDocument(A).createElement("OPTION");D.text=B;D.value=C;A.options.add(D);return D;};FCKTools.RunFunction=function(A,B,C,D){if (A) this.SetTimeout(A,0,B,C,D);};FCKTools.SetTimeout=function(A,B,C,D,E){return (E||window).setTimeout(function(){if (D) A.apply(C,[].concat(D));else A.apply(C);},B);};FCKTools.SetInterval=function(A,B,C,D,E){return (E||window).setInterval(function(){A.apply(C,D||[]);},B);};FCKTools.ConvertStyleSizeToHtml=function(A){return A.EndsWith('%')?A:parseInt(A,10);};FCKTools.ConvertHtmlSizeToStyle=function(A){return A.EndsWith('%')?A:(A+'px');};FCKTools.GetElementAscensor=function(A,B){var e=A;var C=","+B.toUpperCase()+",";while (e){if (C.indexOf(","+e.nodeName.toUpperCase()+",")!=-1) return e;e=e.parentNode;};return null;};FCKTools.CreateEventListener=function(A,B){var f=function(){var C=[];for (var i=0;i<arguments.length;i++) C.push(arguments[i]);A.apply(this,C.concat(B));};return f;};FCKTools.IsStrictMode=function(A){return ('CSS1Compat'==(A.compatMode||(FCKBrowserInfo.IsSafari?'CSS1Compat':null)));};FCKTools.ArgumentsToArray=function(A,B,C){B=B||0;C=C||A.length;var D=[];for (var i=B;i<B+C&&i<A.length;i++) D.push(A[i]);return D;};FCKTools.CloneObject=function(A){var B=function() {};B.prototype=A;return new B;};FCKTools.AppendBogusBr=function(A){if (!A) return;var B=this.GetLastItem(A.getElementsByTagName('br'));if (!B||(B.getAttribute('type',2)!='_moz'&&B.getAttribute('_moz_dirty')==null)){var C=this.GetElementDocument(A);if (FCKBrowserInfo.IsOpera) A.appendChild(C.createTextNode(''));else A.appendChild(this.CreateBogusBR(C));}};FCKTools.GetLastItem=function(A){if (A.length>0) return A[A.length-1];return null;};FCKTools.GetDocumentPosition=function(w,A){var x=0;var y=0;var B=A;var C=null;var D=FCKTools.GetElementWindow(B);while (B&&!(D==w&&(B==w.document.body||B==w.document.documentElement))){x+=B.offsetLeft-B.scrollLeft;y+=B.offsetTop-B.scrollTop;if (!FCKBrowserInfo.IsOpera){var E=C;while (E&&E!=B){x-=E.scrollLeft;y-=E.scrollTop;E=E.parentNode;}};C=B;if (B.offsetParent) B=B.offsetParent;else{if (D!=w){B=D.frameElement;C=null;if (B) D=B.contentWindow.parent;}else B=null;}};if (FCKDomTools.GetCurrentElementStyle(w.document.body,'position')!='static'||(FCKBrowserInfo.IsIE&&FCKDomTools.GetPositionedAncestor(A)==null)){x+=w.document.body.offsetLeft;y+=w.document.body.offsetTop;};return { "x":x,"y":y };};FCKTools.GetWindowPosition=function(w,A){var B=this.GetDocumentPosition(w,A);var C=FCKTools.GetScrollPosition(w);B.x-=C.X;B.y-=C.Y;return B;};FCKTools.ProtectFormStyles=function(A){if (!A||A.nodeType!=1||A.tagName.toLowerCase()!='form') return [];var B=[];var C=['style','className'];for (var i=0;i<C.length;i++){var D=C[i];if (A.elements.namedItem(D)){var E=A.elements.namedItem(D);B.push([E,E.nextSibling]);A.removeChild(E);}};return B;};FCKTools.RestoreFormStyles=function(A,B){if (!A||A.nodeType!=1||A.tagName.toLowerCase()!='form') return;if (B.length>0){for (var i=B.length-1;i>=0;i--){var C=B[i][0];var D=B[i][1];if (D) A.insertBefore(C,D);else A.appendChild(C);}}};FCKTools.GetNextNode=function(A,B){if (A.firstChild) return A.firstChild;else if (A.nextSibling) return A.nextSibling;else{var C=A.parentNode;while (C){if (C==B) return null;if (C.nextSibling) return C.nextSibling;else C=C.parentNode;}};return null;};FCKTools.GetNextTextNode=function(A,B,C){node=this.GetNextNode(A,B);if (C&&node&&C(node)) return null;while (node&&node.nodeType!=3){node=this.GetNextNode(node,B);if (C&&node&&C(node)) return null;};return node;};FCKTools.Merge=function(){var A=arguments;var o=A[0];for (var i=1;i<A.length;i++){var B=A[i];for (var p in B) o[p]=B[p];};return o;};FCKTools.IsArray=function(A){return (A instanceof Array);};FCKTools.AppendLengthProperty=function(A,B){var C=0;for (var n in A) C++;return A[B||'length']=C;};FCKTools.NormalizeCssText=function(A){var B=document.createElement('span');B.style.cssText=A;return B.style.cssText;};FCKTools.Bind=function(A,B){return function(){ return B.apply(A,arguments);};};FCKTools.GetVoidUrl=function(){if (FCK_IS_CUSTOM_DOMAIN) return "javascript: void( function(){document.open();document.write('<html><head><title></title></head><body></body></html>');document.domain = '"+FCK_RUNTIME_DOMAIN+"';document.close();}() ) ;";if (FCKBrowserInfo.IsIE){if (FCKBrowserInfo.IsIE7||!FCKBrowserInfo.IsIE6) return "";else return "javascript: '';";};return "javascript: void(0);";};FCKTools.ResetStyles=function(A){A.style.cssText='margin:0;padding:0;border:0;background-color:transparent;background-image:none;';};
FCKTools.CancelEvent=function(e){if (e) e.preventDefault();};FCKTools.DisableSelection=function(A){if (FCKBrowserInfo.IsGecko) A.style.MozUserSelect='none';else if (FCKBrowserInfo.IsSafari) A.style.KhtmlUserSelect='none';else A.style.userSelect='none';};FCKTools._AppendStyleSheet=function(A,B){var e=A.createElement('LINK');e.rel='stylesheet';e.type='text/css';e.href=B;A.getElementsByTagName("HEAD")[0].appendChild(e);return e;};FCKTools.AppendStyleString=function(A,B){if (!B) return null;var e=A.createElement("STYLE");e.appendChild(A.createTextNode(B));A.getElementsByTagName("HEAD")[0].appendChild(e);return e;};FCKTools.ClearElementAttributes=function(A){for (var i=0;i<A.attributes.length;i++){A.removeAttribute(A.attributes[i].name,0);}};FCKTools.GetAllChildrenIds=function(A){var B=[];var C=function(parent){for (var i=0;i<parent.childNodes.length;i++){var D=parent.childNodes[i].id;if (D&&D.length>0) B[B.length]=D;C(parent.childNodes[i]);}};C(A);return B;};FCKTools.RemoveOuterTags=function(e){var A=e.ownerDocument.createDocumentFragment();for (var i=0;i<e.childNodes.length;i++) A.appendChild(e.childNodes[i].cloneNode(true));e.parentNode.replaceChild(A,e);};FCKTools.CreateXmlObject=function(A){switch (A){case 'XmlHttp':return new XMLHttpRequest();case 'DOMDocument':var B=(new DOMParser()).parseFromString('<tmp></tmp>','text/xml');FCKDomTools.RemoveNode(B.firstChild);return B;};return null;};FCKTools.GetScrollPosition=function(A){return { X:A.pageXOffset,Y:A.pageYOffset };};FCKTools.AddEventListener=function(A,B,C){A.addEventListener(B,C,false);};FCKTools.RemoveEventListener=function(A,B,C){A.removeEventListener(B,C,false);};FCKTools.AddEventListenerEx=function(A,B,C,D){A.addEventListener(B,function(e){C.apply(A,[e].concat(D||[]));},false);};FCKTools.GetViewPaneSize=function(A){return { Width:A.innerWidth,Height:A.innerHeight };};FCKTools.SaveStyles=function(A){var B=FCKTools.ProtectFormStyles(A);var C={};if (A.className.length>0){C.Class=A.className;A.className='';};var D=A.getAttribute('style');if (D&&D.length>0){C.Inline=D;A.setAttribute('style','',0);};FCKTools.RestoreFormStyles(A,B);return C;};FCKTools.RestoreStyles=function(A,B){var C=FCKTools.ProtectFormStyles(A);A.className=B.Class||'';if (B.Inline) A.setAttribute('style',B.Inline,0);else A.removeAttribute('style',0);FCKTools.RestoreFormStyles(A,C);};FCKTools.RegisterDollarFunction=function(A){A.$=function(id){return A.document.getElementById(id);};};FCKTools.AppendElement=function(A,B){return A.appendChild(A.ownerDocument.createElement(B));};FCKTools.GetElementPosition=function(A,B){var c={ X:0,Y:0 };var C=B||window;var D=FCKTools.GetElementWindow(A);var E=null;while (A){var F=D.getComputedStyle(A,'').position;if (F&&F!='static'&&A.style.zIndex!=FCKConfig.FloatingPanelsZIndex) break;c.X+=A.offsetLeft-A.scrollLeft;c.Y+=A.offsetTop-A.scrollTop;if (!FCKBrowserInfo.IsOpera){var G=E;while (G&&G!=A){c.X-=G.scrollLeft;c.Y-=G.scrollTop;G=G.parentNode;}};E=A;if (A.offsetParent) A=A.offsetParent;else{if (D!=C){A=D.frameElement;E=null;if (A) D=FCKTools.GetElementWindow(A);}else{c.X+=A.scrollLeft;c.Y+=A.scrollTop;break;}}};return c;};
-var FCKeditorAPI;function InitializeAPI(){var A=window.parent;if (!(FCKeditorAPI=A.FCKeditorAPI)){var B='window.FCKeditorAPI = {Version : "2.6.2",VersionBuild : "19417",Instances : new Object(),GetInstance : function( name ){return this.Instances[ name ];},_FormSubmit : function(){for ( var name in FCKeditorAPI.Instances ){var oEditor = FCKeditorAPI.Instances[ name ] ;if ( oEditor.GetParentForm && oEditor.GetParentForm() == this )oEditor.UpdateLinkedField() ;}this._FCKOriginalSubmit() ;},_FunctionQueue : {Functions : new Array(),IsRunning : false,Add : function( f ){this.Functions.push( f );if ( !this.IsRunning )this.StartNext();},StartNext : function(){var aQueue = this.Functions ;if ( aQueue.length > 0 ){this.IsRunning = true;aQueue[0].call();}else this.IsRunning = false;},Remove : function( f ){var aQueue = this.Functions;var i = 0, fFunc;while( (fFunc = aQueue[ i ]) ){if ( fFunc == f )aQueue.splice( i,1 );i++ ;}this.StartNext();}}}';if (A.execScript) A.execScript(B,'JavaScript');else{if (FCKBrowserInfo.IsGecko10){eval.call(A,B);}else if(FCKBrowserInfo.IsAIR){FCKAdobeAIR.FCKeditorAPI_Evaluate(A,B);}else if (FCKBrowserInfo.IsSafari||FCKBrowserInfo.IsGecko19){var C=A.document;var D=C.createElement('script');D.appendChild(C.createTextNode(B));C.documentElement.appendChild(D);}else A.eval(B);};FCKeditorAPI=A.FCKeditorAPI;FCKeditorAPI.__Instances=FCKeditorAPI.Instances;};FCKeditorAPI.Instances[FCK.Name]=FCK;};function _AttachFormSubmitToAPI(){var A=FCK.GetParentForm();if (A){FCKTools.AddEventListener(A,'submit',FCK.UpdateLinkedField);if (!A._FCKOriginalSubmit&&(typeof(A.submit)=='function'||(!A.submit.tagName&&!A.submit.length))){A._FCKOriginalSubmit=A.submit;A.submit=FCKeditorAPI._FormSubmit;}}};function FCKeditorAPI_Cleanup(){if (window.FCKConfig&&FCKConfig.MsWebBrowserControlCompat&&!window.FCKUnloadFlag) return;delete FCKeditorAPI.Instances[FCK.Name];};function FCKeditorAPI_ConfirmCleanup(){if (window.FCKConfig&&FCKConfig.MsWebBrowserControlCompat) window.FCKUnloadFlag=true;};FCKTools.AddEventListener(window,'unload',FCKeditorAPI_Cleanup);FCKTools.AddEventListener(window,'beforeunload',FCKeditorAPI_ConfirmCleanup);
+var FCKeditorAPI;function InitializeAPI(){var A=window.parent;if (!(FCKeditorAPI=A.FCKeditorAPI)){var B='window.FCKeditorAPI = {Version : "2.6.3",VersionBuild : "19836",Instances : new Object(),GetInstance : function( name ){return this.Instances[ name ];},_FormSubmit : function(){for ( var name in FCKeditorAPI.Instances ){var oEditor = FCKeditorAPI.Instances[ name ] ;if ( oEditor.GetParentForm && oEditor.GetParentForm() == this )oEditor.UpdateLinkedField() ;}this._FCKOriginalSubmit() ;},_FunctionQueue : {Functions : new Array(),IsRunning : false,Add : function( f ){this.Functions.push( f );if ( !this.IsRunning )this.StartNext();},StartNext : function(){var aQueue = this.Functions ;if ( aQueue.length > 0 ){this.IsRunning = true;aQueue[0].call();}else this.IsRunning = false;},Remove : function( f ){var aQueue = this.Functions;var i = 0, fFunc;while( (fFunc = aQueue[ i ]) ){if ( fFunc == f )aQueue.splice( i,1 );i++ ;}this.StartNext();}}}';if (A.execScript) A.execScript(B,'JavaScript');else{if (FCKBrowserInfo.IsGecko10){eval.call(A,B);}else if(FCKBrowserInfo.IsAIR){FCKAdobeAIR.FCKeditorAPI_Evaluate(A,B);}else if (FCKBrowserInfo.IsSafari){var C=A.document;var D=C.createElement('script');D.appendChild(C.createTextNode(B));C.documentElement.appendChild(D);}else A.eval(B);};FCKeditorAPI=A.FCKeditorAPI;FCKeditorAPI.__Instances=FCKeditorAPI.Instances;};FCKeditorAPI.Instances[FCK.Name]=FCK;};function _AttachFormSubmitToAPI(){var A=FCK.GetParentForm();if (A){FCKTools.AddEventListener(A,'submit',FCK.UpdateLinkedField);if (!A._FCKOriginalSubmit&&(typeof(A.submit)=='function'||(!A.submit.tagName&&!A.submit.length))){A._FCKOriginalSubmit=A.submit;A.submit=FCKeditorAPI._FormSubmit;}}};function FCKeditorAPI_Cleanup(){if (window.FCKConfig&&FCKConfig.MsWebBrowserControlCompat&&!window.FCKUnloadFlag) return;delete FCKeditorAPI.Instances[FCK.Name];};function FCKeditorAPI_ConfirmCleanup(){if (window.FCKConfig&&FCKConfig.MsWebBrowserControlCompat) window.FCKUnloadFlag=true;};FCKTools.AddEventListener(window,'unload',FCKeditorAPI_Cleanup);FCKTools.AddEventListener(window,'beforeunload',FCKeditorAPI_ConfirmCleanup);
var FCKImagePreloader=function(){this._Images=[];};FCKImagePreloader.prototype={AddImages:function(A){if (typeof(A)=='string') A=A.split(';');this._Images=this._Images.concat(A);},Start:function(){var A=this._Images;this._PreloadCount=A.length;for (var i=0;i<A.length;i++){var B=document.createElement('img');FCKTools.AddEventListenerEx(B,'load',_FCKImagePreloader_OnImage,this);FCKTools.AddEventListenerEx(B,'error',_FCKImagePreloader_OnImage,this);B.src=A[i];_FCKImagePreloader_ImageCache.push(B);}}};var _FCKImagePreloader_ImageCache=[];function _FCKImagePreloader_OnImage(A,B){if ((--B._PreloadCount)==0&&B.OnComplete) B.OnComplete();};
var FCKRegexLib={AposEntity:/'/gi,ObjectElements:/^(?:IMG|TABLE|TR|TD|TH|INPUT|SELECT|TEXTAREA|HR|OBJECT|A|UL|OL|LI)$/i,NamedCommands:/^(?:Cut|Copy|Paste|Print|SelectAll|RemoveFormat|Unlink|Undo|Redo|Bold|Italic|Underline|StrikeThrough|Subscript|Superscript|JustifyLeft|JustifyCenter|JustifyRight|JustifyFull|Outdent|Indent|InsertOrderedList|InsertUnorderedList|InsertHorizontalRule)$/i,BeforeBody:/(^[\s\S]*\<body[^\>]*\>)/i,AfterBody:/(\<\/body\>[\s\S]*$)/i,ToReplace:/___fcktoreplace:([\w]+)/ig,MetaHttpEquiv:/http-equiv\s*=\s*["']?([^"' ]+)/i,HasBaseTag:/<base /i,HasBodyTag:/<body[\s|>]/i,HtmlOpener:/<html\s?[^>]*>/i,HeadOpener:/<head\s?[^>]*>/i,HeadCloser:/<\/head\s*>/i,FCK_Class:/\s*FCK__[^ ]*(?=\s+|$)/,ElementName:/(^[a-z_:][\w.\-:]*\w$)|(^[a-z_]$)/,ForceSimpleAmpersand:/___FCKAmp___/g,SpaceNoClose:/\/>/g,EmptyParagraph:/^<(p|div|address|h\d|center)(?=[ >])[^>]*>\s*(<\/\1>)?$/,EmptyOutParagraph:/^<(p|div|address|h\d|center)(?=[ >])[^>]*>(?:\s*| )(<\/\1>)?$/,TagBody:/></,GeckoEntitiesMarker:/#\?-\:/g,ProtectUrlsImg:/<img(?=\s).*?\ssrc=((?:(?:\s*)("|').*?\2)|(?:[^"'][^ >]+))/gi,ProtectUrlsA:/<a(?=\s).*?\shref=((?:(?:\s*)("|').*?\2)|(?:[^"'][^ >]+))/gi,ProtectUrlsArea:/<area(?=\s).*?\shref=((?:(?:\s*)("|').*?\2)|(?:[^"'][^ >]+))/gi,Html4DocType:/HTML 4\.0 Transitional/i,DocTypeTag:/<!DOCTYPE[^>]*>/i,HtmlDocType:/DTD HTML/,TagsWithEvent:/<[^\>]+ on\w+[\s\r\n]*=[\s\r\n]*?('|")[\s\S]+?\>/g,EventAttributes:/\s(on\w+)[\s\r\n]*=[\s\r\n]*?('|")([\s\S]*?)\2/g,ProtectedEvents:/\s\w+_fckprotectedatt="([^"]+)"/g,StyleProperties:/\S+\s*:/g,InvalidSelfCloseTags:/(<(?!base|meta|link|hr|br|param|img|area|input)([a-zA-Z0-9:]+)[^>]*)\/>/gi,StyleVariableAttName:/#\(\s*("|')(.+?)\1[^\)]*\s*\)/g,RegExp:/^\/(.*)\/([gim]*)$/,HtmlTag:/<[^\s<>](?:"[^"]*"|'[^']*'|[^<])*>/};
var FCKListsLib={BlockElements:{ address:1,blockquote:1,center:1,div:1,dl:1,fieldset:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,marquee:1,noscript:1,ol:1,p:1,pre:1,script:1,table:1,ul:1 },NonEmptyBlockElements:{ p:1,div:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,address:1,pre:1,ol:1,ul:1,li:1,td:1,th:1 },InlineChildReqElements:{ abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1 },InlineNonEmptyElements:{ a:1,abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1 },EmptyElements:{ base:1,col:1,meta:1,link:1,hr:1,br:1,param:1,img:1,area:1,input:1 },PathBlockElements:{ address:1,blockquote:1,dl:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,li:1,dt:1,de:1 },PathBlockLimitElements:{ body:1,div:1,td:1,th:1,caption:1,form:1 },StyleBlockElements:{ address:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1 },StyleObjectElements:{ img:1,hr:1,li:1,table:1,tr:1,td:1,embed:1,object:1,ol:1,ul:1 },NonEditableElements:{ button:1,option:1,script:1,iframe:1,textarea:1,object:1,embed:1,map:1,applet:1 },BlockBoundaries:{ p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,address:1,pre:1,ol:1,ul:1,li:1,dt:1,de:1,table:1,thead:1,tbody:1,tfoot:1,tr:1,th:1,td:1,caption:1,col:1,colgroup:1,blockquote:1,body:1 },ListBoundaries:{ p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,address:1,pre:1,ol:1,ul:1,li:1,dt:1,de:1,table:1,thead:1,tbody:1,tfoot:1,tr:1,th:1,td:1,caption:1,col:1,colgroup:1,blockquote:1,body:1,br:1 }};
var FCKLanguageManager=FCK.Language={AvailableLanguages:{af:'Afrikaans',ar:'Arabic',bg:'Bulgarian',bn:'Bengali/Bangla',bs:'Bosnian',ca:'Catalan',cs:'Czech',da:'Danish',de:'German',el:'Greek',en:'English','en-au':'English (Australia)','en-ca':'English (Canadian)','en-uk':'English (United Kingdom)',eo:'Esperanto',es:'Spanish',et:'Estonian',eu:'Basque',fa:'Persian',fi:'Finnish',fo:'Faroese',fr:'French','fr-ca':'French (Canada)',gl:'Galician',gu:'Gujarati',he:'Hebrew',hi:'Hindi',hr:'Croatian',hu:'Hungarian',it:'Italian',ja:'Japanese',km:'Khmer',ko:'Korean',lt:'Lithuanian',lv:'Latvian',mn:'Mongolian',ms:'Malay',nb:'Norwegian Bokmal',nl:'Dutch',no:'Norwegian',pl:'Polish',pt:'Portuguese (Portugal)','pt-br':'Portuguese (Brazil)',ro:'Romanian',ru:'Russian',sk:'Slovak',sl:'Slovenian',sr:'Serbian (Cyrillic)','sr-latn':'Serbian (Latin)',sv:'Swedish',th:'Thai',tr:'Turkish',uk:'Ukrainian',vi:'Vietnamese',zh:'Chinese Traditional','zh-cn':'Chinese Simplified'},GetActiveLanguage:function(){if (FCKConfig.AutoDetectLanguage){var A;if (navigator.userLanguage) A=navigator.userLanguage.toLowerCase();else if (navigator.language) A=navigator.language.toLowerCase();else{return FCKConfig.DefaultLanguage;};if (A.length>=5){A=A.substr(0,5);if (this.AvailableLanguages[A]) return A;};if (A.length>=2){A=A.substr(0,2);if (this.AvailableLanguages[A]) return A;}};return this.DefaultLanguage;},TranslateElements:function(A,B,C,D){var e=A.getElementsByTagName(B);var E,s;for (var i=0;i<e.length;i++){if ((E=e[i].getAttribute('fckLang'))){if ((s=FCKLang[E])){if (D) s=FCKTools.HTMLEncode(s);e[i][C]=s;}}}},TranslatePage:function(A){this.TranslateElements(A,'INPUT','value');this.TranslateElements(A,'SPAN','innerHTML');this.TranslateElements(A,'LABEL','innerHTML');this.TranslateElements(A,'OPTION','innerHTML',true);this.TranslateElements(A,'LEGEND','innerHTML');},Initialize:function(){if (this.AvailableLanguages[FCKConfig.DefaultLanguage]) this.DefaultLanguage=FCKConfig.DefaultLanguage;else this.DefaultLanguage='en';this.ActiveLanguage={};this.ActiveLanguage.Code=this.GetActiveLanguage();this.ActiveLanguage.Name=this.AvailableLanguages[this.ActiveLanguage.Code];}};
var FCKXHtmlEntities={};FCKXHtmlEntities.Initialize=function(){if (FCKXHtmlEntities.Entities) return;var A='';var B,e;if (FCKConfig.ProcessHTMLEntities){FCKXHtmlEntities.Entities={' ':'nbsp','¡':'iexcl','¢':'cent','£':'pound','¤':'curren','¥':'yen','¦':'brvbar','§':'sect','¨':'uml','©':'copy','ª':'ordf','«':'laquo','¬':'not','':'shy','®':'reg','¯':'macr','°':'deg','±':'plusmn','²':'sup2','³':'sup3','´':'acute','µ':'micro','¶':'para','·':'middot','¸':'cedil','¹':'sup1','º':'ordm','»':'raquo','¼':'frac14','½':'frac12','¾':'frac34','¿':'iquest','×':'times','÷':'divide','ƒ':'fnof','•':'bull','…':'hellip','′':'prime','″':'Prime','‾':'oline','⁄':'frasl','℘':'weierp','ℑ':'image','ℜ':'real','™':'trade','ℵ':'alefsym','←':'larr','↑':'uarr','→':'rarr','↓':'darr','↔':'harr','↵':'crarr','⇐':'lArr','⇑':'uArr','⇒':'rArr','⇓':'dArr','⇔':'hArr','∀':'forall','∂':'part','∃':'exist','∅':'empty','∇':'nabla','∈':'isin','∉':'notin','∋':'ni','∏':'prod','∑':'sum','−':'minus','∗':'lowast','√':'radic','∝':'prop','∞':'infin','∠':'ang','∧':'and','∨':'or','∩':'cap','∪':'cup','∫':'int','∴':'there4','∼':'sim','≅':'cong','≈':'asymp','≠':'ne','≡':'equiv','≤':'le','≥':'ge','⊂':'sub','⊃':'sup','⊄':'nsub','⊆':'sube','⊇':'supe','⊕':'oplus','⊗':'otimes','⊥':'perp','⋅':'sdot','\u2308':'lceil','\u2309':'rceil','\u230a':'lfloor','\u230b':'rfloor','\u2329':'lang','\u232a':'rang','◊':'loz','♠':'spades','♣':'clubs','♥':'hearts','♦':'diams','"':'quot','ˆ':'circ','˜':'tilde',' ':'ensp',' ':'emsp',' ':'thinsp','':'zwnj','':'zwj','':'lrm','':'rlm','–':'ndash','—':'mdash','‘':'lsquo','’':'rsquo','‚':'sbquo','“':'ldquo','”':'rdquo','„':'bdquo','†':'dagger','‡':'Dagger','‰':'permil','‹':'lsaquo','›':'rsaquo','€':'euro'};for (e in FCKXHtmlEntities.Entities) A+=e;if (FCKConfig.IncludeLatinEntities){B={'À':'Agrave','Á':'Aacute','Â':'Acirc','Ã':'Atilde','Ä':'Auml','Å':'Aring','Æ':'AElig','Ç':'Ccedil','È':'Egrave','É':'Eacute','Ê':'Ecirc','Ë':'Euml','Ì':'Igrave','Í':'Iacute','Î':'Icirc','Ï':'Iuml','Ð':'ETH','Ñ':'Ntilde','Ò':'Ograve','Ó':'Oacute','Ô':'Ocirc','Õ':'Otilde','Ö':'Ouml','Ø':'Oslash','Ù':'Ugrave','Ú':'Uacute','Û':'Ucirc','Ü':'Uuml','Ý':'Yacute','Þ':'THORN','ß':'szlig','à':'agrave','á':'aacute','â':'acirc','ã':'atilde','ä':'auml','å':'aring','æ':'aelig','ç':'ccedil','è':'egrave','é':'eacute','ê':'ecirc','ë':'euml','ì':'igrave','í':'iacute','î':'icirc','ï':'iuml','ð':'eth','ñ':'ntilde','ò':'ograve','ó':'oacute','ô':'ocirc','õ':'otilde','ö':'ouml','ø':'oslash','ù':'ugrave','ú':'uacute','û':'ucirc','ü':'uuml','ý':'yacute','þ':'thorn','ÿ':'yuml','Œ':'OElig','œ':'oelig','Š':'Scaron','š':'scaron','Ÿ':'Yuml'};for (e in B){FCKXHtmlEntities.Entities[e]=B[e];A+=e;};B=null;};if (FCKConfig.IncludeGreekEntities){B={'Α':'Alpha','Β':'Beta','Γ':'Gamma','Δ':'Delta','Ε':'Epsilon','Ζ':'Zeta','Η':'Eta','Θ':'Theta','Ι':'Iota','Κ':'Kappa','Λ':'Lambda','Μ':'Mu','Ν':'Nu','Ξ':'Xi','Ο':'Omicron','Π':'Pi','Ρ':'Rho','Σ':'Sigma','Τ':'Tau','Υ':'Upsilon','Φ':'Phi','Χ':'Chi','Ψ':'Psi','Ω':'Omega','α':'alpha','β':'beta','γ':'gamma','δ':'delta','ε':'epsilon','ζ':'zeta','η':'eta','θ':'theta','ι':'iota','κ':'kappa','λ':'lambda','μ':'mu','ν':'nu','ξ':'xi','ο':'omicron','π':'pi','ρ':'rho','ς':'sigmaf','σ':'sigma','τ':'tau','υ':'upsilon','φ':'phi','χ':'chi','ψ':'psi','ω':'omega','\u03d1':'thetasym','\u03d2':'upsih','\u03d6':'piv'};for (e in B){FCKXHtmlEntities.Entities[e]=B[e];A+=e;};B=null;}}else{FCKXHtmlEntities.Entities={};A=' ';};var C='['+A+']';if (FCKConfig.ProcessNumericEntities) C='[^ -~]|'+C;var D=FCKConfig.AdditionalNumericEntities;if (D&&D.length>0) C+='|'+FCKConfig.AdditionalNumericEntities;FCKXHtmlEntities.EntitiesRegex=new RegExp(C,'g');};
-var FCKXHtml={};FCKXHtml.CurrentJobNum=0;FCKXHtml.GetXHTML=function(A,B,C){FCKDomTools.CheckAndRemovePaddingNode(FCKTools.GetElementDocument(A),FCKConfig.EnterMode);FCKXHtmlEntities.Initialize();this._NbspEntity=(FCKConfig.ProcessHTMLEntities?'nbsp':'#160');var D=FCK.IsDirty();FCKXHtml.SpecialBlocks=[];this.XML=FCKTools.CreateXmlObject('DOMDocument');this.MainNode=this.XML.appendChild(this.XML.createElement('xhtml'));FCKXHtml.CurrentJobNum++;if (B) this._AppendNode(this.MainNode,A);else this._AppendChildNodes(this.MainNode,A,false);var E=this._GetMainXmlString();this.XML=null;if (FCKBrowserInfo.IsSafari) E=E.replace(/^<xhtml.*?>/,'<xhtml>');E=E.substr(7,E.length-15).Trim();if (FCKConfig.DocType.length>0&&FCKRegexLib.HtmlDocType.test(FCKConfig.DocType)) E=E.replace(FCKRegexLib.SpaceNoClose,'>');else E=E.replace(FCKRegexLib.SpaceNoClose,' />');if (FCKConfig.ForceSimpleAmpersand) E=E.replace(FCKRegexLib.ForceSimpleAmpersand,'&');if (C) E=FCKCodeFormatter.Format(E);for (var i=0;i<FCKXHtml.SpecialBlocks.length;i++){var F=new RegExp('___FCKsi___'+i);E=E.replace(F,FCKXHtml.SpecialBlocks[i]);};E=E.replace(FCKRegexLib.GeckoEntitiesMarker,'&');if (!D) FCK.ResetIsDirty();FCKDomTools.EnforcePaddingNode(FCKTools.GetElementDocument(A),FCKConfig.EnterMode);return E;};FCKXHtml._AppendAttribute=function(A,B,C){try{if (C==undefined||C==null) C='';else if (C.replace){if (FCKConfig.ForceSimpleAmpersand) C=C.replace(/&/g,'___FCKAmp___');C=C.replace(FCKXHtmlEntities.EntitiesRegex,FCKXHtml_GetEntity);};var D=this.XML.createAttribute(B);D.value=C;A.attributes.setNamedItem(D);}catch (e){}};FCKXHtml._AppendChildNodes=function(A,B,C){var D=B.firstChild;while (D){this._AppendNode(A,D);D=D.nextSibling;};if (C&&B.tagName&&B.tagName.toLowerCase()!='pre'){FCKDomTools.TrimNode(A);if (FCKConfig.FillEmptyBlocks){var E=A.lastChild;if (E&&E.nodeType==1&&E.nodeName=='br') this._AppendEntity(A,this._NbspEntity);}};if (A.childNodes.length==0){if (C&&FCKConfig.FillEmptyBlocks){this._AppendEntity(A,this._NbspEntity);return A;};var F=A.nodeName;if (FCKListsLib.InlineChildReqElements[F]) return null;if (!FCKListsLib.EmptyElements[F]) A.appendChild(this.XML.createTextNode(''));};return A;};FCKXHtml._AppendNode=function(A,B){if (!B) return false;switch (B.nodeType){case 1:if (FCKBrowserInfo.IsGecko&&B.tagName.toLowerCase()=='br'&&B.parentNode.tagName.toLowerCase()=='pre'){var C='\r';if (B==B.parentNode.firstChild) C+='\r';return FCKXHtml._AppendNode(A,this.XML.createTextNode(C));};if (B.getAttribute('_fckfakelement')) return FCKXHtml._AppendNode(A,FCK.GetRealElement(B));if (FCKBrowserInfo.IsGecko&&B.nextSibling&&(B.hasAttribute('_moz_editor_bogus_node')||B.getAttribute('type')=='_moz')) return false;if (B.getAttribute('_fcktemp')) return false;var D=B.tagName.toLowerCase();if (FCKBrowserInfo.IsIE){if (B.scopeName&&B.scopeName!='HTML'&&B.scopeName!='FCK') D=B.scopeName.toLowerCase()+':'+D;}else{if (D.StartsWith('fck:')) D=D.Remove(0,4);};if (!FCKRegexLib.ElementName.test(D)) return false;if (B._fckxhtmljob&&B._fckxhtmljob==FCKXHtml.CurrentJobNum) return false;var E=this.XML.createElement(D);FCKXHtml._AppendAttributes(A,B,E,D);B._fckxhtmljob=FCKXHtml.CurrentJobNum;var F=FCKXHtml.TagProcessors[D];if (F) E=F(E,B,A);else E=this._AppendChildNodes(E,B,Boolean(FCKListsLib.NonEmptyBlockElements[D]));if (!E) return false;A.appendChild(E);break;case 3:if (B.parentNode&&B.parentNode.nodeName.IEquals('pre')) return this._AppendTextNode(A,B.nodeValue);return this._AppendTextNode(A,B.nodeValue.ReplaceNewLineChars(' '));case 8:if (FCKBrowserInfo.IsIE&&!B.innerHTML) break;try { A.appendChild(this.XML.createComment(B.nodeValue));}catch (e) {/*Do nothing... probably this is a wrong format comment.*/};break;default:A.appendChild(this.XML.createComment("Element not supported - Type: "+B.nodeType+" Name: "+B.nodeName));break;};return true;};FCKXHtml._AppendSpecialItem=function(A){return '___FCKsi___'+FCKXHtml.SpecialBlocks.AddItem(A);};FCKXHtml._AppendEntity=function(A,B){A.appendChild(this.XML.createTextNode('#?-:'+B+';'));};FCKXHtml._AppendTextNode=function(A,B){var C=B.length>0;if (C) A.appendChild(this.XML.createTextNode(B.replace(FCKXHtmlEntities.EntitiesRegex,FCKXHtml_GetEntity)));return C;};function FCKXHtml_GetEntity(A){var B=FCKXHtmlEntities.Entities[A]||('#'+A.charCodeAt(0));return '#?-:'+B+';';};FCKXHtml.TagProcessors={a:function(A,B){if (B.innerHTML.Trim().length==0&&!B.name) return false;var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'href',C);if (FCKBrowserInfo.IsIE){if (B.name) FCKXHtml._AppendAttribute(A,'name',B.name);};A=FCKXHtml._AppendChildNodes(A,B,false);return A;},area:function(A,B){var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'href',C);if (FCKBrowserInfo.IsIE){if (!A.attributes.getNamedItem('coords')){var D=B.getAttribute('coords',2);if (D&&D!='0,0,0') FCKXHtml._AppendAttribute(A,'coords',D);};if (!A.attributes.getNamedItem('shape')){var E=B.getAttribute('shape',2);if (E&&E.length>0) FCKXHtml._AppendAttribute(A,'shape',E.toLowerCase());}};return A;},body:function(A,B){A=FCKXHtml._AppendChildNodes(A,B,false);A.removeAttribute('spellcheck');return A;},iframe:function(A,B){var C=B.innerHTML;if (FCKBrowserInfo.IsGecko) C=FCKTools.HTMLDecode(C);C=C.replace(/\s_fcksavedurl="[^"]*"/g,'');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(C)));return A;},img:function(A,B){if (!A.attributes.getNamedItem('alt')) FCKXHtml._AppendAttribute(A,'alt','');var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'src',C);if (B.style.width) A.removeAttribute('width');if (B.style.height) A.removeAttribute('height');return A;},li:function(A,B,C){if (C.nodeName.IEquals(['ul','ol'])) return FCKXHtml._AppendChildNodes(A,B,true);var D=FCKXHtml.XML.createElement('ul');B._fckxhtmljob=null;do{FCKXHtml._AppendNode(D,B);do{B=FCKDomTools.GetNextSibling(B);} while (B&&B.nodeType==3&&B.nodeValue.Trim().length==0)} while (B&&B.nodeName.toLowerCase()=='li') return D;},ol:function(A,B,C){if (B.innerHTML.Trim().length==0) return false;var D=C.lastChild;if (D&&D.nodeType==3) D=D.previousSibling;if (D&&D.nodeName.toUpperCase()=='LI'){B._fckxhtmljob=null;FCKXHtml._AppendNode(D,B);return false;};A=FCKXHtml._AppendChildNodes(A,B);return A;},pre:function (A,B){var C=B.firstChild;if (C&&C.nodeType==3) A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem('\r\n')));FCKXHtml._AppendChildNodes(A,B,true);return A;},script:function(A,B){if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A,'type','text/javascript');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(B.text)));return A;},span:function(A,B){if (B.innerHTML.length==0) return false;A=FCKXHtml._AppendChildNodes(A,B,false);return A;},style:function(A,B){if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A,'type','text/css');var C=B.innerHTML;if (FCKBrowserInfo.IsIE) C=C.replace(/^(\r\n|\n|\r)/,'');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(C)));return A;},title:function(A,B){A.appendChild(FCKXHtml.XML.createTextNode(FCK.EditorDocument.title));return A;}};FCKXHtml.TagProcessors.ul=FCKXHtml.TagProcessors.ol;
+var FCKXHtml={};FCKXHtml.CurrentJobNum=0;FCKXHtml.GetXHTML=function(A,B,C){FCKDomTools.CheckAndRemovePaddingNode(FCKTools.GetElementDocument(A),FCKConfig.EnterMode);FCKXHtmlEntities.Initialize();this._NbspEntity=(FCKConfig.ProcessHTMLEntities?'nbsp':'#160');var D=FCK.IsDirty();FCKXHtml.SpecialBlocks=[];this.XML=FCKTools.CreateXmlObject('DOMDocument');this.MainNode=this.XML.appendChild(this.XML.createElement('xhtml'));FCKXHtml.CurrentJobNum++;if (B) this._AppendNode(this.MainNode,A);else this._AppendChildNodes(this.MainNode,A,false);var E=this._GetMainXmlString();this.XML=null;if (FCKBrowserInfo.IsSafari) E=E.replace(/^<xhtml.*?>/,'<xhtml>');E=E.substr(7,E.length-15).Trim();if (FCKConfig.DocType.length>0&&FCKRegexLib.HtmlDocType.test(FCKConfig.DocType)) E=E.replace(FCKRegexLib.SpaceNoClose,'>');else E=E.replace(FCKRegexLib.SpaceNoClose,' />');if (FCKConfig.ForceSimpleAmpersand) E=E.replace(FCKRegexLib.ForceSimpleAmpersand,'&');if (C) E=FCKCodeFormatter.Format(E);for (var i=0;i<FCKXHtml.SpecialBlocks.length;i++){var F=new RegExp('___FCKsi___'+i);E=E.replace(F,FCKXHtml.SpecialBlocks[i]);};E=E.replace(FCKRegexLib.GeckoEntitiesMarker,'&');if (!D) FCK.ResetIsDirty();FCKDomTools.EnforcePaddingNode(FCKTools.GetElementDocument(A),FCKConfig.EnterMode);return E;};FCKXHtml._AppendAttribute=function(A,B,C){try{if (C==undefined||C==null) C='';else if (C.replace){if (FCKConfig.ForceSimpleAmpersand) C=C.replace(/&/g,'___FCKAmp___');C=C.replace(FCKXHtmlEntities.EntitiesRegex,FCKXHtml_GetEntity);};var D=this.XML.createAttribute(B);D.value=C;A.attributes.setNamedItem(D);}catch (e){}};FCKXHtml._AppendChildNodes=function(A,B,C){var D=B.firstChild;while (D){this._AppendNode(A,D);D=D.nextSibling;};if (C&&B.tagName&&B.tagName.toLowerCase()!='pre'){FCKDomTools.TrimNode(A);if (FCKConfig.FillEmptyBlocks){var E=A.lastChild;if (E&&E.nodeType==1&&E.nodeName=='br') this._AppendEntity(A,this._NbspEntity);}};if (A.childNodes.length==0){if (C&&FCKConfig.FillEmptyBlocks){this._AppendEntity(A,this._NbspEntity);return A;};var F=A.nodeName;if (FCKListsLib.InlineChildReqElements[F]) return null;if (!FCKListsLib.EmptyElements[F]) A.appendChild(this.XML.createTextNode(''));};return A;};FCKXHtml._AppendNode=function(A,B){if (!B) return false;switch (B.nodeType){case 1:if (FCKBrowserInfo.IsGecko&&B.tagName.toLowerCase()=='br'&&B.parentNode.tagName.toLowerCase()=='pre'){var C='\r';if (B==B.parentNode.firstChild) C+='\r';return FCKXHtml._AppendNode(A,this.XML.createTextNode(C));};if (B.getAttribute('_fckfakelement')) return FCKXHtml._AppendNode(A,FCK.GetRealElement(B));if (FCKBrowserInfo.IsGecko&&(B.hasAttribute('_moz_editor_bogus_node')||B.getAttribute('type')=='_moz')){if (B.nextSibling) return false;else{B.removeAttribute('_moz_editor_bogus_node');B.removeAttribute('type');}};if (B.getAttribute('_fcktemp')) return false;var D=B.tagName.toLowerCase();if (FCKBrowserInfo.IsIE){if (B.scopeName&&B.scopeName!='HTML'&&B.scopeName!='FCK') D=B.scopeName.toLowerCase()+':'+D;}else{if (D.StartsWith('fck:')) D=D.Remove(0,4);};if (!FCKRegexLib.ElementName.test(D)) return false;if (B._fckxhtmljob&&B._fckxhtmljob==FCKXHtml.CurrentJobNum) return false;var E=this.XML.createElement(D);FCKXHtml._AppendAttributes(A,B,E,D);B._fckxhtmljob=FCKXHtml.CurrentJobNum;var F=FCKXHtml.TagProcessors[D];if (F) E=F(E,B,A);else E=this._AppendChildNodes(E,B,Boolean(FCKListsLib.NonEmptyBlockElements[D]));if (!E) return false;A.appendChild(E);break;case 3:if (B.parentNode&&B.parentNode.nodeName.IEquals('pre')) return this._AppendTextNode(A,B.nodeValue);return this._AppendTextNode(A,B.nodeValue.ReplaceNewLineChars(' '));case 8:if (FCKBrowserInfo.IsIE&&!B.innerHTML) break;try { A.appendChild(this.XML.createComment(B.nodeValue));}catch (e) {};break;default:A.appendChild(this.XML.createComment("Element not supported - Type: "+B.nodeType+" Name: "+B.nodeName));break;};return true;};FCKXHtml._AppendSpecialItem=function(A){return '___FCKsi___'+FCKXHtml.SpecialBlocks.AddItem(A);};FCKXHtml._AppendEntity=function(A,B){A.appendChild(this.XML.createTextNode('#?-:'+B+';'));};FCKXHtml._AppendTextNode=function(A,B){var C=B.length>0;if (C) A.appendChild(this.XML.createTextNode(B.replace(FCKXHtmlEntities.EntitiesRegex,FCKXHtml_GetEntity)));return C;};function FCKXHtml_GetEntity(A){var B=FCKXHtmlEntities.Entities[A]||('#'+A.charCodeAt(0));return '#?-:'+B+';';};FCKXHtml.TagProcessors={a:function(A,B){if (B.innerHTML.Trim().length==0&&!B.name) return false;var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'href',C);if (FCKBrowserInfo.IsIE){if (B.name) FCKXHtml._AppendAttribute(A,'name',B.name);};A=FCKXHtml._AppendChildNodes(A,B,false);return A;},area:function(A,B){var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'href',C);if (FCKBrowserInfo.IsIE){if (!A.attributes.getNamedItem('coords')){var D=B.getAttribute('coords',2);if (D&&D!='0,0,0') FCKXHtml._AppendAttribute(A,'coords',D);};if (!A.attributes.getNamedItem('shape')){var E=B.getAttribute('shape',2);if (E&&E.length>0) FCKXHtml._AppendAttribute(A,'shape',E.toLowerCase());}};return A;},body:function(A,B){A=FCKXHtml._AppendChildNodes(A,B,false);A.removeAttribute('spellcheck');return A;},iframe:function(A,B){var C=B.innerHTML;if (FCKBrowserInfo.IsGecko) C=FCKTools.HTMLDecode(C);C=C.replace(/\s_fcksavedurl="[^"]*"/g,'');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(C)));return A;},img:function(A,B){if (!A.attributes.getNamedItem('alt')) FCKXHtml._AppendAttribute(A,'alt','');var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'src',C);if (B.style.width) A.removeAttribute('width');if (B.style.height) A.removeAttribute('height');return A;},li:function(A,B,C){if (C.nodeName.IEquals(['ul','ol'])) return FCKXHtml._AppendChildNodes(A,B,true);var D=FCKXHtml.XML.createElement('ul');B._fckxhtmljob=null;do{FCKXHtml._AppendNode(D,B);do{B=FCKDomTools.GetNextSibling(B);} while (B&&B.nodeType==3&&B.nodeValue.Trim().length==0)} while (B&&B.nodeName.toLowerCase()=='li') return D;},ol:function(A,B,C){if (B.innerHTML.Trim().length==0) return false;var D=C.lastChild;if (D&&D.nodeType==3) D=D.previousSibling;if (D&&D.nodeName.toUpperCase()=='LI'){B._fckxhtmljob=null;FCKXHtml._AppendNode(D,B);return false;};A=FCKXHtml._AppendChildNodes(A,B);return A;},pre:function (A,B){var C=B.firstChild;if (C&&C.nodeType==3) A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem('\r\n')));FCKXHtml._AppendChildNodes(A,B,true);return A;},script:function(A,B){if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A,'type','text/javascript');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(B.text)));return A;},span:function(A,B){if (B.innerHTML.length==0) return false;A=FCKXHtml._AppendChildNodes(A,B,false);return A;},style:function(A,B){if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A,'type','text/css');var C=B.innerHTML;if (FCKBrowserInfo.IsIE) C=C.replace(/^(\r\n|\n|\r)/,'');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(C)));return A;},title:function(A,B){A.appendChild(FCKXHtml.XML.createTextNode(FCK.EditorDocument.title));return A;}};FCKXHtml.TagProcessors.ul=FCKXHtml.TagProcessors.ol;
FCKXHtml._GetMainXmlString=function(){return (new XMLSerializer()).serializeToString(this.MainNode);};FCKXHtml._AppendAttributes=function(A,B,C){var D=B.attributes;for (var n=0;n<D.length;n++){var E=D[n];if (E.specified){var F=E.nodeName.toLowerCase();var G;if (F.StartsWith('_fck')) continue;else if (F.indexOf('_moz')==0) continue;else if (F=='class'){G=E.nodeValue.replace(FCKRegexLib.FCK_Class,'');if (G.length==0) continue;}else if (E.nodeValue===true) G=F;else G=B.getAttribute(F,2);this._AppendAttribute(C,F,G);}}};if (FCKBrowserInfo.IsOpera){FCKXHtml.TagProcessors['head']=function(A,B){FCKXHtml.XML._HeadElement=A;A=FCKXHtml._AppendChildNodes(A,B,true);return A;};FCKXHtml.TagProcessors['meta']=function(A,B,C){if (B.parentNode.nodeName.toLowerCase()!='head'){var D=FCKXHtml.XML._HeadElement;if (D&&C!=D){delete B._fckxhtmljob;FCKXHtml._AppendNode(D,B);return null;}};return A;}};if (FCKBrowserInfo.IsGecko){FCKXHtml.TagProcessors['link']=function(A,B){if (B.href.substr(0,9).toLowerCase()=='chrome://') return false;return A;}};
var FCKCodeFormatter={};FCKCodeFormatter.Init=function(){var A=this.Regex={};A.BlocksOpener=/\<(P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|TITLE|META|LINK|BASE|SCRIPT|LINK|TD|TH|AREA|OPTION)[^\>]*\>/gi;A.BlocksCloser=/\<\/(P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|TITLE|META|LINK|BASE|SCRIPT|LINK|TD|TH|AREA|OPTION)[^\>]*\>/gi;A.NewLineTags=/\<(BR|HR)[^\>]*\>/gi;A.MainTags=/\<\/?(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR)[^\>]*\>/gi;A.LineSplitter=/\s*\n+\s*/g;A.IncreaseIndent=/^\<(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR|UL|OL)[ \/\>]/i;A.DecreaseIndent=/^\<\/(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR|UL|OL)[ \>]/i;A.FormatIndentatorRemove=new RegExp('^'+FCKConfig.FormatIndentator);A.ProtectedTags=/(<PRE[^>]*>)([\s\S]*?)(<\/PRE>)/gi;};FCKCodeFormatter._ProtectData=function(A,B,C,D){return B+'___FCKpd___'+FCKCodeFormatter.ProtectedData.AddItem(C)+D;};FCKCodeFormatter.Format=function(A){if (!this.Regex) this.Init();FCKCodeFormatter.ProtectedData=[];var B=A.replace(this.Regex.ProtectedTags,FCKCodeFormatter._ProtectData);B=B.replace(this.Regex.BlocksOpener,'\n$&');B=B.replace(this.Regex.BlocksCloser,'$&\n');B=B.replace(this.Regex.NewLineTags,'$&\n');B=B.replace(this.Regex.MainTags,'\n$&\n');var C='';var D=B.split(this.Regex.LineSplitter);B='';for (var i=0;i<D.length;i++){var E=D[i];if (E.length==0) continue;if (this.Regex.DecreaseIndent.test(E)) C=C.replace(this.Regex.FormatIndentatorRemove,'');B+=C+E+'\n';if (this.Regex.IncreaseIndent.test(E)) C+=FCKConfig.FormatIndentator;};for (var j=0;j<FCKCodeFormatter.ProtectedData.length;j++){var F=new RegExp('___FCKpd___'+j);B=B.replace(F,FCKCodeFormatter.ProtectedData[j].replace(/\$/g,'$$$$'));};return B.Trim();};
var FCKUndo={};FCKUndo.SavedData=[];FCKUndo.CurrentIndex=-1;FCKUndo.TypesCount=0;FCKUndo.Changed=false;FCKUndo.MaxTypes=25;FCKUndo.Typing=false;FCKUndo.SaveLocked=false;FCKUndo._GetBookmark=function(){FCKSelection.Restore();var A=new FCKDomRange(FCK.EditorWindow);try{A.MoveToSelection();}catch (e){return null;};if (FCKBrowserInfo.IsIE){var B=A.CreateBookmark();var C=FCK.EditorDocument.body.innerHTML;A.MoveToBookmark(B);return [B,C];};return A.CreateBookmark2();};FCKUndo._SelectBookmark=function(A){if (!A) return;var B=new FCKDomRange(FCK.EditorWindow);if (A instanceof Object){if (FCKBrowserInfo.IsIE) B.MoveToBookmark(A[0]);else B.MoveToBookmark2(A);try{B.Select();}catch (e){B.MoveToPosition(FCK.EditorDocument.body,4);B.Select();}}};FCKUndo._CompareCursors=function(A,B){for (var i=0;i<Math.min(A.length,B.length);i++){if (A[i]<B[i]) return-1;else if (A[i]>B[i]) return 1;};if (A.length<B.length) return-1;else if (A.length>B.length) return 1;return 0;};FCKUndo._CheckIsBookmarksEqual=function(A,B){if (!(A&&B)) return false;if (FCKBrowserInfo.IsIE){var C=A[1].search(A[0].StartId);var D=B[1].search(B[0].StartId);var E=A[1].search(A[0].EndId);var F=B[1].search(B[0].EndId);return C==D&&E==F;}else{return this._CompareCursors(A.Start,B.Start)==0&&this._CompareCursors(A.End,B.End)==0;}};FCKUndo.SaveUndoStep=function(){if (FCK.EditMode!=0||this.SaveLocked) return;if (this.SavedData.length) this.Changed=true;var A=FCK.EditorDocument.body.innerHTML;var B=this._GetBookmark();this.SavedData=this.SavedData.slice(0,this.CurrentIndex+1);if (this.CurrentIndex>0&&A==this.SavedData[this.CurrentIndex][0]&&this._CheckIsBookmarksEqual(B,this.SavedData[this.CurrentIndex][1])) return;else if (this.CurrentIndex==0&&this.SavedData.length&&A==this.SavedData[0][0]){this.SavedData[0][1]=B;return;};if (this.CurrentIndex+1>=FCKConfig.MaxUndoLevels) this.SavedData.shift();else this.CurrentIndex++;this.SavedData[this.CurrentIndex]=[A,B];FCK.Events.FireEvent("OnSelectionChange");};FCKUndo.CheckUndoState=function(){return (this.Changed||this.CurrentIndex>0);};FCKUndo.CheckRedoState=function(){return (this.CurrentIndex<(this.SavedData.length-1));};FCKUndo.Undo=function(){if (this.CheckUndoState()){if (this.CurrentIndex==(this.SavedData.length-1)){this.SaveUndoStep();};this._ApplyUndoLevel(--this.CurrentIndex);FCK.Events.FireEvent("OnSelectionChange");}};FCKUndo.Redo=function(){if (this.CheckRedoState()){this._ApplyUndoLevel(++this.CurrentIndex);FCK.Events.FireEvent("OnSelectionChange");}};FCKUndo._ApplyUndoLevel=function(A){var B=this.SavedData[A];if (!B) return;if (FCKBrowserInfo.IsIE){if (B[1]&&B[1][1]) FCK.SetInnerHtml(B[1][1]);else FCK.SetInnerHtml(B[0]);}else FCK.EditorDocument.body.innerHTML=B[0];this._SelectBookmark(B[1]);this.TypesCount=0;this.Changed=false;this.Typing=false;};
-var FCKEditingArea=function(A){this.TargetElement=A;this.Mode=0;if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKEditingArea_Cleanup);};FCKEditingArea.prototype.Start=function(A,B){var C=this.TargetElement;var D=FCKTools.GetElementDocument(C);while(C.firstChild) C.removeChild(C.firstChild);if (this.Mode==0){if (FCK_IS_CUSTOM_DOMAIN) A='<script>document.domain="'+FCK_RUNTIME_DOMAIN+'";</script>'+A;if (FCKBrowserInfo.IsIE) A=A.replace(/(<base[^>]*?)\s*\/?>(?!\s*<\/base>)/gi,'$1></base>');else if (!B){var E=A.match(FCKRegexLib.BeforeBody);var F=A.match(FCKRegexLib.AfterBody);if (E&&F){var G=A.substr(E[1].length,A.length-E[1].length-F[1].length);A=E[1]+' '+F[1];if (FCKBrowserInfo.IsGecko&&(G.length==0||FCKRegexLib.EmptyParagraph.test(G))) G='<br type="_moz">';this._BodyHTML=G;}else this._BodyHTML=A;};var H=this.IFrame=D.createElement('iframe');var I='<script type="text/javascript" _fcktemp="true">window.onerror=function(){return true;};</script>';H.frameBorder=0;H.style.width=H.style.height='100%';if (FCK_IS_CUSTOM_DOMAIN&&FCKBrowserInfo.IsIE){window._FCKHtmlToLoad=A.replace(/<head>/i,'<head>'+I);H.src='javascript:void( (function(){document.open() ;document.domain="'+document.domain+'" ;document.write( window.parent._FCKHtmlToLoad );document.close() ;window.parent._FCKHtmlToLoad = null ;})() )';}else if (!FCKBrowserInfo.IsGecko){H.src='javascript:void(0)';};C.appendChild(H);this.Window=H.contentWindow;if (!FCK_IS_CUSTOM_DOMAIN||!FCKBrowserInfo.IsIE){var J=this.Window.document;J.open();J.write(A.replace(/<head>/i,'<head>'+I));J.close();};if (FCKBrowserInfo.IsAIR) FCKAdobeAIR.EditingArea_Start(J,A);if (FCKBrowserInfo.IsGecko10&&!B){this.Start(A,true);return;};if (H.readyState&&H.readyState!='completed'){var K=this;(H.onreadystatechange=function(){if (H.readyState=='complete'){H.onreadystatechange=null;K.Window._FCKEditingArea=K;FCKEditingArea_CompleteStart.call(K.Window);}})();}else{this.Window._FCKEditingArea=this;if (FCKBrowserInfo.IsGecko10) this.Window.setTimeout(FCKEditingArea_CompleteStart,500);else FCKEditingArea_CompleteStart.call(this.Window);}}else{var L=this.Textarea=D.createElement('textarea');L.className='SourceField';L.dir='ltr';FCKDomTools.SetElementStyles(L,{width:'100%',height:'100%',border:'none',resize:'none',outline:'none'});C.appendChild(L);L.value=A;FCKTools.RunFunction(this.OnLoad);}};function FCKEditingArea_CompleteStart(){if (!this.document.body){this.setTimeout(FCKEditingArea_CompleteStart,50);return;};var A=this._FCKEditingArea;A.Document=A.Window.document;A.MakeEditable();FCKTools.RunFunction(A.OnLoad);};FCKEditingArea.prototype.MakeEditable=function(){var A=this.Document;if (FCKBrowserInfo.IsIE){A.body.disabled=true;A.body.contentEditable=true;A.body.removeAttribute("disabled");}else{try{A.body.spellcheck=(this.FFSpellChecker!==false);if (this._BodyHTML){A.body.innerHTML=this._BodyHTML;A.body.offsetLeft;this._BodyHTML=null;};A.designMode='on';A.execCommand('enableObjectResizing',false,!FCKConfig.DisableObjectResizing);A.execCommand('enableInlineTableEditing',false,!FCKConfig.DisableFFTableHandles);}catch (e){FCKTools.AddEventListener(this.Window.frameElement,'DOMAttrModified',FCKEditingArea_Document_AttributeNodeModified);}}};function FCKEditingArea_Document_AttributeNodeModified(A){var B=A.currentTarget.contentWindow._FCKEditingArea;if (B._timer) window.clearTimeout(B._timer);B._timer=FCKTools.SetTimeout(FCKEditingArea_MakeEditableByMutation,1000,B);};function FCKEditingArea_MakeEditableByMutation(){delete this._timer;FCKTools.RemoveEventListener(this.Window.frameElement,'DOMAttrModified',FCKEditingArea_Document_AttributeNodeModified);this.MakeEditable();};FCKEditingArea.prototype.Focus=function(){try{if (this.Mode==0){if (FCKBrowserInfo.IsIE) this._FocusIE();else this.Window.focus();}else{var A=FCKTools.GetElementDocument(this.Textarea);if ((!A.hasFocus||A.hasFocus())&&A.activeElement==this.Textarea) return;this.Textarea.focus();}}catch(e) {}};FCKEditingArea.prototype._FocusIE=function(){this.Document.body.setActive();this.Window.focus();var A=this.Document.selection.createRange();var B=A.parentElement();var C=B.nodeName.toLowerCase();if (B.childNodes.length>0||!(FCKListsLib.BlockElements[C]||FCKListsLib.NonEmptyBlockElements[C])){return;};A=new FCKDomRange(this.Window);A.MoveToElementEditStart(B);A.Select();};function FCKEditingArea_Cleanup(){if (this.Document) this.Document.body.innerHTML="";this.TargetElement=null;this.IFrame=null;this.Document=null;this.Textarea=null;if (this.Window){this.Window._FCKEditingArea=null;this.Window=null;}};
+var FCKEditingArea=function(A){this.TargetElement=A;this.Mode=0;if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKEditingArea_Cleanup);};FCKEditingArea.prototype.Start=function(A,B){var C=this.TargetElement;var D=FCKTools.GetElementDocument(C);while(C.firstChild) C.removeChild(C.firstChild);if (this.Mode==0){if (FCK_IS_CUSTOM_DOMAIN) A='<script>document.domain="'+FCK_RUNTIME_DOMAIN+'";</script>'+A;if (FCKBrowserInfo.IsIE) A=A.replace(/(<base[^>]*?)\s*\/?>(?!\s*<\/base>)/gi,'$1></base>');else if (!B){var E=A.match(FCKRegexLib.BeforeBody);var F=A.match(FCKRegexLib.AfterBody);if (E&&F){var G=A.substr(E[1].length,A.length-E[1].length-F[1].length);A=E[1]+' '+F[1];if (FCKBrowserInfo.IsGecko&&(G.length==0||FCKRegexLib.EmptyParagraph.test(G))) G='<br type="_moz">';this._BodyHTML=G;}else this._BodyHTML=A;};var H=this.IFrame=D.createElement('iframe');var I='<script type="text/javascript" _fcktemp="true">window.onerror=function(){return true;};</script>';H.frameBorder=0;H.style.width=H.style.height='100%';if (FCK_IS_CUSTOM_DOMAIN&&FCKBrowserInfo.IsIE){window._FCKHtmlToLoad=A.replace(/<head>/i,'<head>'+I);H.src='javascript:void( (function(){document.open() ;document.domain="'+document.domain+'" ;document.write( window.parent._FCKHtmlToLoad );document.close() ;window.parent._FCKHtmlToLoad = null ;})() )';}else if (!FCKBrowserInfo.IsGecko){H.src='javascript:void(0)';};C.appendChild(H);this.Window=H.contentWindow;if (!FCK_IS_CUSTOM_DOMAIN||!FCKBrowserInfo.IsIE){var J=this.Window.document;J.open();J.write(A.replace(/<head>/i,'<head>'+I));J.close();};if (FCKBrowserInfo.IsAIR) FCKAdobeAIR.EditingArea_Start(J,A);if (FCKBrowserInfo.IsGecko10&&!B){this.Start(A,true);return;};if (H.readyState&&H.readyState!='completed'){var K=this;setTimeout(function(){try{K.Window.document.documentElement.doScroll("left");}catch(e){setTimeout(arguments.callee,0);return;};K.Window._FCKEditingArea=K;FCKEditingArea_CompleteStart.call(K.Window);},0);}else{this.Window._FCKEditingArea=this;if (FCKBrowserInfo.IsGecko10) this.Window.setTimeout(FCKEditingArea_CompleteStart,500);else FCKEditingArea_CompleteStart.call(this.Window);}}else{var L=this.Textarea=D.createElement('textarea');L.className='SourceField';L.dir='ltr';FCKDomTools.SetElementStyles(L,{width:'100%',height:'100%',border:'none',resize:'none',outline:'none'});C.appendChild(L);L.value=A;FCKTools.RunFunction(this.OnLoad);}};function FCKEditingArea_CompleteStart(){if (!this.document.body){this.setTimeout(FCKEditingArea_CompleteStart,50);return;};var A=this._FCKEditingArea;A.Document=A.Window.document;A.MakeEditable();FCKTools.RunFunction(A.OnLoad);};FCKEditingArea.prototype.MakeEditable=function(){var A=this.Document;if (FCKBrowserInfo.IsIE){A.body.disabled=true;A.body.contentEditable=true;A.body.removeAttribute("disabled");}else{try{A.body.spellcheck=(this.FFSpellChecker!==false);if (this._BodyHTML){A.body.innerHTML=this._BodyHTML;A.body.offsetLeft;this._BodyHTML=null;};A.designMode='on';A.execCommand('enableObjectResizing',false,!FCKConfig.DisableObjectResizing);A.execCommand('enableInlineTableEditing',false,!FCKConfig.DisableFFTableHandles);}catch (e){FCKTools.AddEventListener(this.Window.frameElement,'DOMAttrModified',FCKEditingArea_Document_AttributeNodeModified);}}};function FCKEditingArea_Document_AttributeNodeModified(A){var B=A.currentTarget.contentWindow._FCKEditingArea;if (B._timer) window.clearTimeout(B._timer);B._timer=FCKTools.SetTimeout(FCKEditingArea_MakeEditableByMutation,1000,B);};function FCKEditingArea_MakeEditableByMutation(){delete this._timer;FCKTools.RemoveEventListener(this.Window.frameElement,'DOMAttrModified',FCKEditingArea_Document_AttributeNodeModified);this.MakeEditable();};FCKEditingArea.prototype.Focus=function(){try{if (this.Mode==0){if (FCKBrowserInfo.IsIE) this._FocusIE();else this.Window.focus();}else{var A=FCKTools.GetElementDocument(this.Textarea);if ((!A.hasFocus||A.hasFocus())&&A.activeElement==this.Textarea) return;this.Textarea.focus();}}catch(e) {}};FCKEditingArea.prototype._FocusIE=function(){this.Document.body.setActive();this.Window.focus();var A=this.Document.selection.createRange();var B=A.parentElement();var C=B.nodeName.toLowerCase();if (B.childNodes.length>0||!(FCKListsLib.BlockElements[C]||FCKListsLib.NonEmptyBlockElements[C])){return;};A=new FCKDomRange(this.Window);A.MoveToElementEditStart(B);A.Select();};function FCKEditingArea_Cleanup(){if (this.Document) this.Document.body.innerHTML="";this.TargetElement=null;this.IFrame=null;this.Document=null;this.Textarea=null;if (this.Window){this.Window._FCKEditingArea=null;this.Window=null;}};
var FCKKeystrokeHandler=function(A){this.Keystrokes={};this.CancelCtrlDefaults=(A!==false);};FCKKeystrokeHandler.prototype.AttachToElement=function(A){FCKTools.AddEventListenerEx(A,'keydown',_FCKKeystrokeHandler_OnKeyDown,this);if (FCKBrowserInfo.IsGecko10||FCKBrowserInfo.IsOpera||(FCKBrowserInfo.IsGecko&&FCKBrowserInfo.IsMac)) FCKTools.AddEventListenerEx(A,'keypress',_FCKKeystrokeHandler_OnKeyPress,this);};FCKKeystrokeHandler.prototype.SetKeystrokes=function(){for (var i=0;i<arguments.length;i++){var A=arguments[i];if (!A) continue;if (typeof(A[0])=='object') this.SetKeystrokes.apply(this,A);else{if (A.length==1) delete this.Keystrokes[A[0]];else this.Keystrokes[A[0]]=A[1]===true?true:A;}}};function _FCKKeystrokeHandler_OnKeyDown(A,B){var C=A.keyCode||A.which;var D=0;if (A.ctrlKey||A.metaKey) D+=CTRL;if (A.shiftKey) D+=SHIFT;if (A.altKey) D+=ALT;var E=C+D;var F=B._CancelIt=false;var G=B.Keystrokes[E];if (G){if (G===true||!(B.OnKeystroke&&B.OnKeystroke.apply(B,G))) return true;F=true;};if (F||(B.CancelCtrlDefaults&&D==CTRL&&(C<33||C>40))){B._CancelIt=true;if (A.preventDefault) return A.preventDefault();A.returnValue=false;A.cancelBubble=true;return false;};return true;};function _FCKKeystrokeHandler_OnKeyPress(A,B){if (B._CancelIt){if (A.preventDefault) return A.preventDefault();return false;};return true;};
FCK.DTD=(function(){var X=FCKTools.Merge;var A,L,J,M,N,O,D,H,P,K,Q,F,G,C,B,E,I;A={isindex:1,fieldset:1};B={input:1,button:1,select:1,textarea:1,label:1};C=X({a:1},B);D=X({iframe:1},C);E={hr:1,ul:1,menu:1,div:1,blockquote:1,noscript:1,table:1,center:1,address:1,dir:1,pre:1,h5:1,dl:1,h4:1,noframes:1,h6:1,ol:1,h1:1,h3:1,h2:1};F={ins:1,del:1,script:1};G=X({b:1,acronym:1,bdo:1,'var':1,'#':1,abbr:1,code:1,br:1,i:1,cite:1,kbd:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,dfn:1,span:1},F);H=X({sub:1,img:1,object:1,sup:1,basefont:1,map:1,applet:1,font:1,big:1,small:1},G);I=X({p:1},H);J=X({iframe:1},H,B);K={img:1,noscript:1,br:1,kbd:1,center:1,button:1,basefont:1,h5:1,h4:1,samp:1,h6:1,ol:1,h1:1,h3:1,h2:1,form:1,font:1,'#':1,select:1,menu:1,ins:1,abbr:1,label:1,code:1,table:1,script:1,cite:1,input:1,iframe:1,strong:1,textarea:1,noframes:1,big:1,small:1,span:1,hr:1,sub:1,bdo:1,'var':1,div:1,object:1,sup:1,strike:1,dir:1,map:1,dl:1,applet:1,del:1,isindex:1,fieldset:1,ul:1,b:1,acronym:1,a:1,blockquote:1,i:1,u:1,s:1,tt:1,address:1,q:1,pre:1,p:1,em:1,dfn:1};L=X({a:1},J);M={tr:1};N={'#':1};O=X({param:1},K);P=X({form:1},A,D,E,I);Q={li:1};return {col:{},tr:{td:1,th:1},img:{},colgroup:{col:1},noscript:P,td:P,br:{},th:P,center:P,kbd:L,button:X(I,E),basefont:{},h5:L,h4:L,samp:L,h6:L,ol:Q,h1:L,h3:L,option:N,h2:L,form:X(A,D,E,I),select:{optgroup:1,option:1},font:J,ins:P,menu:Q,abbr:L,label:L,table:{thead:1,col:1,tbody:1,tr:1,colgroup:1,caption:1,tfoot:1},code:L,script:N,tfoot:M,cite:L,li:P,input:{},iframe:P,strong:J,textarea:N,noframes:P,big:J,small:J,span:J,hr:{},dt:L,sub:J,optgroup:{option:1},param:{},bdo:L,'var':J,div:P,object:O,sup:J,dd:P,strike:J,area:{},dir:Q,map:X({area:1,form:1,p:1},A,F,E),applet:O,dl:{dt:1,dd:1},del:P,isindex:{},fieldset:X({legend:1},K),thead:M,ul:Q,acronym:L,b:J,a:J,blockquote:P,caption:L,i:J,u:J,tbody:M,s:L,address:X(D,I),tt:J,legend:L,q:L,pre:X(G,C),p:L,em:J,dfn:L};})();
-var FCKStyle=function(A){this.Element=(A.Element||'span').toLowerCase();this._StyleDesc=A;};FCKStyle.prototype={GetType:function(){var A=this.GetType_$;if (A!=undefined) return A;var B=this.Element;if (B=='#'||FCKListsLib.StyleBlockElements[B]) A=0;else if (FCKListsLib.StyleObjectElements[B]) A=2;else A=1;return (this.GetType_$=A);},ApplyToSelection:function(A){var B=new FCKDomRange(A);B.MoveToSelection();this.ApplyToRange(B,true);},ApplyToRange:function(A,B,C){switch (this.GetType()){case 0:this.ApplyToRange=this._ApplyBlockStyle;break;case 1:this.ApplyToRange=this._ApplyInlineStyle;break;default:return;};this.ApplyToRange(A,B,C);},ApplyToObject:function(A){if (!A) return;this.BuildElement(null,A);},RemoveFromSelection:function(A){var B=new FCKDomRange(A);B.MoveToSelection();this.RemoveFromRange(B,true);},RemoveFromRange:function(A,B,C){var D;var E=this._GetAttribsForComparison();var F=this._GetOverridesForComparison();if (A.CheckIsCollapsed()){var D=A.CreateBookmark(true);var H=A.GetBookmarkNode(D,true);var I=new FCKElementPath(H.parentNode);var J=[];var K=!FCKDomTools.GetNextSibling(H);var L=K||!FCKDomTools.GetPreviousSibling(H);var M;var N=-1;for (var i=0;i<I.Elements.length;i++){var O=I.Elements[i];if (this.CheckElementRemovable(O)){if (L&&!FCKDomTools.CheckIsEmptyElement(O,function(el){return (el!=H);})){M=O;N=J.length-1;}else{var P=O.nodeName.toLowerCase();if (P==this.Element){for (var Q in E){if (FCKDomTools.HasAttribute(O,Q)){switch (Q){case 'style':this._RemoveStylesFromElement(O);break;case 'class':if (FCKDomTools.GetAttributeValue(O,Q)!=this.GetFinalAttributeValue(Q)) continue;default:FCKDomTools.RemoveAttribute(O,Q);}}}};this._RemoveOverrides(O,F[P]);if (this.GetType()==1) this._RemoveNoAttribElement(O);}}else if (L) J.push(O);L=L&&((K&&!FCKDomTools.GetNextSibling(O))||(!K&&!FCKDomTools.GetPreviousSibling(O)));if (M&&(!L||(i==I.Elements.length-1))){var R=FCKDomTools.RemoveNode(H);for (var j=0;j<=N;j++){var S=FCKDomTools.CloneElement(J[j]);S.appendChild(R);R=S;};if (K) FCKDomTools.InsertAfterNode(M,R);else M.parentNode.insertBefore(R,M);L=false;M=null;}};if (B) A.SelectBookmark(D);if (C) A.MoveToBookmark(D);return;};A.Expand('inline_elements');D=A.CreateBookmark(true);var T=A.GetBookmarkNode(D,true);var U=A.GetBookmarkNode(D,false);A.Release(true);var I=new FCKElementPath(T);var X=I.Elements;var O;for (var i=1;i<X.length;i++){O=X[i];if (O==I.Block||O==I.BlockLimit) break;if (this.CheckElementRemovable(O)) FCKDomTools.BreakParent(T,O,A);};I=new FCKElementPath(U);X=I.Elements;for (var i=1;i<X.length;i++){O=X[i];if (O==I.Block||O==I.BlockLimit) break;b=O.nodeName.toLowerCase();if (this.CheckElementRemovable(O)) FCKDomTools.BreakParent(U,O,A);};var Z=FCKDomTools.GetNextSourceNode(T,true);while (Z){var a=FCKDomTools.GetNextSourceNode(Z);if (Z.nodeType==1){var b=Z.nodeName.toLowerCase();var c=(b==this.Element);if (c){for (var Q in E){if (FCKDomTools.HasAttribute(Z,Q)){switch (Q){case 'style':this._RemoveStylesFromElement(Z);break;case 'class':if (FCKDomTools.GetAttributeValue(Z,Q)!=this.GetFinalAttributeValue(Q)) continue;default:FCKDomTools.RemoveAttribute(Z,Q);}}}}else c=!!F[b];if (c){this._RemoveOverrides(Z,F[b]);this._RemoveNoAttribElement(Z);}};if (a==U) break;Z=a;};this._FixBookmarkStart(T);if (B) A.SelectBookmark(D);if (C) A.MoveToBookmark(D);},CheckElementRemovable:function(A,B){if (!A) return false;var C=A.nodeName.toLowerCase();if (C==this.Element){if (!B&&!FCKDomTools.HasAttributes(A)) return true;var D=this._GetAttribsForComparison();var E=(D._length==0);for (var F in D){if (F=='_length') continue;if (this._CompareAttributeValues(F,FCKDomTools.GetAttributeValue(A,F),(this.GetFinalAttributeValue(F)||''))){E=true;if (!B) break;}else{E=false;if (B) return false;}};if (E) return true;};var G=this._GetOverridesForComparison()[C];if (G){if (!(D=G.Attributes)) return true;for (var i=0;i<D.length;i++){var H=D[i][0];if (FCKDomTools.HasAttribute(A,H)){var I=D[i][1];if (I==null||(typeof I=='string'&&FCKDomTools.GetAttributeValue(A,H)==I)||I.test(FCKDomTools.GetAttributeValue(A,H))) return true;}}};return false;},CheckActive:function(A){switch (this.GetType()){case 0:return this.CheckElementRemovable(A.Block||A.BlockLimit,true);case 1:var B=A.Elements;for (var i=0;i<B.length;i++){var C=B[i];if (C==A.Block||C==A.BlockLimit) continue;if (this.CheckElementRemovable(C,true)) return true;}};return false;},RemoveFromElement:function(A){var B=this._GetAttribsForComparison();var C=this._GetOverridesForComparison();var D=A.getElementsByTagName(this.Element);for (var i=D.length-1;i>=0;i--){var E=D[i];for (var F in B){if (FCKDomTools.HasAttribute(E,F)){switch (F){case 'style':this._RemoveStylesFromElement(E);break;case 'class':if (FCKDomTools.GetAttributeValue(E,F)!=this.GetFinalAttributeValue(F)) continue;default:FCKDomTools.RemoveAttribute(E,F);}}};this._RemoveOverrides(E,C[this.Element]);this._RemoveNoAttribElement(E);};for (var G in C){if (G!=this.Element){D=A.getElementsByTagName(G);for (var i=D.length-1;i>=0;i--){var E=D[i];this._RemoveOverrides(E,C[G]);this._RemoveNoAttribElement(E);}}}},_RemoveStylesFromElement:function(A){var B=A.style.cssText;var C=this.GetFinalStyleValue();if (B.length>0&&C.length==0) return;C='(^|;)\\s*('+C.replace(/\s*([^ ]+):.*?(;|$)/g,'$1|').replace(/\|$/,'')+'):[^;]+';var D=new RegExp(C,'gi');B=B.replace(D,'').Trim();if (B.length==0||B==';') FCKDomTools.RemoveAttribute(A,'style');else A.style.cssText=B.replace(D,'');},_RemoveOverrides:function(A,B){var C=B&&B.Attributes;if (C){for (var i=0;i<C.length;i++){var D=C[i][0];if (FCKDomTools.HasAttribute(A,D)){var E=C[i][1];if (E==null||(E.test&&E.test(FCKDomTools.GetAttributeValue(A,D)))||(typeof E=='string'&&FCKDomTools.GetAttributeValue(A,D)==E)) FCKDomTools.RemoveAttribute(A,D);}}}},_RemoveNoAttribElement:function(A){if (!FCKDomTools.HasAttributes(A)){var B=A.firstChild;var C=A.lastChild;FCKDomTools.RemoveNode(A,true);this._MergeSiblings(B);if (B!=C) this._MergeSiblings(C);}},BuildElement:function(A,B){var C=B||A.createElement(this.Element);var D=this._StyleDesc.Attributes;var E;if (D){for (var F in D){E=this.GetFinalAttributeValue(F);if (F.toLowerCase()=='class') C.className=E;else C.setAttribute(F,E);}};if (this._GetStyleText().length>0) C.style.cssText=this.GetFinalStyleValue();return C;},_CompareAttributeValues:function(A,B,C){if (A=='style'&&B&&C){B=B.replace(/;$/,'').toLowerCase();C=C.replace(/;$/,'').toLowerCase();};return (B==C||((B===null||B==='')&&(C===null||C==='')))},GetFinalAttributeValue:function(A){var B=this._StyleDesc.Attributes;var B=B?B[A]:null;if (!B&&A=='style') return this.GetFinalStyleValue();if (B&&this._Variables) B=B.Replace(FCKRegexLib.StyleVariableAttName,this._GetVariableReplace,this);return B;},GetFinalStyleValue:function(){var A=this._GetStyleText();if (A.length>0&&this._Variables){A=A.Replace(FCKRegexLib.StyleVariableAttName,this._GetVariableReplace,this);A=FCKTools.NormalizeCssText(A);};return A;},_GetVariableReplace:function(){return this._Variables[arguments[2]]||arguments[0];},SetVariable:function(A,B){var C=this._Variables;if (!C) C=this._Variables={};this._Variables[A]=B;},_FromPre:function(A,B,C){var D=B.innerHTML;D=D.replace(/(\r\n|\r)/g,'\n');D=D.replace(/^[ \t]*\n/,'');D=D.replace(/\n$/,'');D=D.replace(/^[ \t]+|[ \t]+$/g,function(match,offset,s){if (match.length==1) return ' ';else if (offset==0) return new Array(match.length).join(' ')+' ';else return ' '+new Array(match.length).join(' ');});var E=new FCKHtmlIterator(D);var F=[];E.Each(function(isTag,value){if (!isTag){value=value.replace(/\n/g,'<BR>');value=value.replace(/[ \t]{2,}/g,function (match){return new Array(match.length).join(' ')+' ';});};F.push(value);});C.innerHTML=F.join('');return C;},_ToPre:function(A,B,C){var D=B.innerHTML.Trim();D=D.replace(/[ \t\r\n]*(<br[^>]*>)[ \t\r\n]*/gi,'<BR />');var E=new FCKHtmlIterator(D);var F=[];E.Each(function(isTag,value){if (!isTag) value=value.replace(/([ \t\n\r]+| )/g,' ');else if (isTag&&value=='<BR />') value='\n';F.push(value);});if (FCKBrowserInfo.IsIE){var G=A.createElement('div');G.appendChild(C);C.outerHTML='<PRE>\n'+F.join('')+'</PRE>';C=G.removeChild(G.firstChild);}else C.innerHTML=F.join('');return C;},_ApplyBlockStyle:function(A,B,C){var D;if (B) D=A.CreateBookmark();var E=new FCKDomRangeIterator(A);E.EnforceRealBlocks=true;var F;var G=A.Window.document;var H=[];var I=[];while((F=E.GetNextParagraph())){var J=this.BuildElement(G);var K=J.nodeName.IEquals('pre');var L=F.nodeName.IEquals('pre');if (K&&!L){J=this._ToPre(G,F,J);H.push(J);}else if (!K&&L){J=this._FromPre(G,F,J);I.push(J);}else FCKDomTools.MoveChildren(F,J);F.parentNode.insertBefore(J,F);FCKDomTools.RemoveNode(F);};for (var i=0;i<H.length-1;i++){if (FCKDomTools.GetNextSourceElement(H[i],true,[],[],true)!=H[i+1]) continue;H[i+1].innerHTML=H[i].innerHTML+'\n\n'+H[i+1].innerHTML;FCKDomTools.RemoveNode(H[i]);};for (var i=0;i<I.length;i++){var M=I[i];var N=null;for (var j=0;j<M.childNodes.length;j++){var O=M.childNodes[j];if (O.nodeName.IEquals('br')&&j!=0&&j!=M.childNodes.length-2&&O.nextSibling&&O.nextSibling.nodeName.IEquals('br')){FCKDomTools.RemoveNode(O.nextSibling);FCKDomTools.RemoveNode(O);j--;N=FCKDomTools.InsertAfterNode(N||M,G.createElement(M.nodeName));continue;};if (N){FCKDomTools.MoveNode(O,N);j--;}}};if (B) A.SelectBookmark(D);if (C) A.MoveToBookmark(D);},_ApplyInlineStyle:function(A,B,C){var D=A.Window.document;if (A.CheckIsCollapsed()){var E=this.BuildElement(D);A.InsertNode(E);A.MoveToPosition(E,2);A.Select();return;};var F=this.Element;var G=FCK.DTD[F]||FCK.DTD.span;var H=this._GetAttribsForComparison();var I;A.Expand('inline_elements');var J=A.CreateBookmark(true);var K=A.GetBookmarkNode(J,true);var L=A.GetBookmarkNode(J,false);A.Release(true);var M=FCKDomTools.GetNextSourceNode(K,true);while (M){var N=false;var O=M.nodeType;var P=O==1?M.nodeName.toLowerCase():null;if (!P||G[P]){if ((FCK.DTD[M.parentNode.nodeName.toLowerCase()]||FCK.DTD.span)[F]||!FCK.DTD[F]){if (!A.CheckHasRange()) A.SetStart(M,3);if (O!=1||M.childNodes.length==0){var Q=M;var R=Q.parentNode;while (Q==R.lastChild&&G[R.nodeName.toLowerCase()]){Q=R;};A.SetEnd(Q,4);if (Q==Q.parentNode.lastChild&&!G[Q.parentNode.nodeName.toLowerCase()]) N=true;}else{A.SetEnd(M,3);}}else N=true;}else N=true;M=FCKDomTools.GetNextSourceNode(M);if (M==L){M=null;N=true;};if (N&&A.CheckHasRange()&&!A.CheckIsCollapsed()){I=this.BuildElement(D);A.ExtractContents().AppendTo(I);if (I.innerHTML.RTrim().length>0){A.InsertNode(I);this.RemoveFromElement(I);this._MergeSiblings(I,this._GetAttribsForComparison());if (!FCKBrowserInfo.IsIE) I.normalize();};A.Release(true);}};this._FixBookmarkStart(K);if (B) A.SelectBookmark(J);if (C) A.MoveToBookmark(J);},_FixBookmarkStart:function(A){var B;while ((B=A.nextSibling)){if (B.nodeType==1&&FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){if (!B.firstChild) FCKDomTools.RemoveNode(B);else FCKDomTools.MoveNode(A,B,true);continue;};if (B.nodeType==3&&B.length==0){FCKDomTools.RemoveNode(B);continue;};break;}},_MergeSiblings:function(A,B){if (!A||A.nodeType!=1||!FCKListsLib.InlineNonEmptyElements[A.nodeName.toLowerCase()]) return;this._MergeNextSibling(A,B);this._MergePreviousSibling(A,B);},_MergeNextSibling:function(A,B){var C=A.nextSibling;var D=(C&&C.nodeType==1&&C.getAttribute('_fck_bookmark'));if (D) C=C.nextSibling;if (C&&C.nodeType==1&&C.nodeName==A.nodeName){if (!B) B=this._CreateElementAttribsForComparison(A);if (this._CheckAttributesMatch(C,B)){var E=A.lastChild;if (D) FCKDomTools.MoveNode(A.nextSibling,A);FCKDomTools.MoveChildren(C,A);FCKDomTools.RemoveNode(C);if (E) this._MergeNextSibling(E);}}},_MergePreviousSibling:function(A,B){var C=A.previousSibling;var D=(C&&C.nodeType==1&&C.getAttribute('_fck_bookmark'));if (D) C=C.previousSibling;if (C&&C.nodeType==1&&C.nodeName==A.nodeName){if (!B) B=this._CreateElementAttribsForComparison(A);if (this._CheckAttributesMatch(C,B)){var E=A.firstChild;if (D) FCKDomTools.MoveNode(A.previousSibling,A,true);FCKDomTools.MoveChildren(C,A,true);FCKDomTools.RemoveNode(C);if (E) this._MergePreviousSibling(E);}}},_GetStyleText:function(){var A=this._StyleDesc.Styles;var B=(this._StyleDesc.Attributes?this._StyleDesc.Attributes['style']||'':'');if (B.length>0) B+=';';for (var C in A) B+=C+':'+A[C]+';';if (B.length>0&&!(/#\(/.test(B))){B=FCKTools.NormalizeCssText(B);};return (this._GetStyleText=function() { return B;})();},_GetAttribsForComparison:function(){var A=this._GetAttribsForComparison_$;if (A) return A;A={};var B=this._StyleDesc.Attributes;if (B){for (var C in B){A[C.toLowerCase()]=B[C].toLowerCase();}};if (this._GetStyleText().length>0){A['style']=this._GetStyleText().toLowerCase();};FCKTools.AppendLengthProperty(A,'_length');return (this._GetAttribsForComparison_$=A);},_GetOverridesForComparison:function(){var A=this._GetOverridesForComparison_$;if (A) return A;A={};var B=this._StyleDesc.Overrides;if (B){if (!FCKTools.IsArray(B)) B=[B];for (var i=0;i<B.length;i++){var C=B[i];var D;var E;var F;if (typeof C=='string') D=C.toLowerCase();else{D=C.Element?C.Element.toLowerCase():this.Element;F=C.Attributes;};E=A[D]||(A[D]={});if (F){var G=(E.Attributes=E.Attributes||[]);for (var H in F){G.push([H.toLowerCase(),F[H]]);}}}};return (this._GetOverridesForComparison_$=A);},_CreateElementAttribsForComparison:function(A){var B={};var C=0;for (var i=0;i<A.attributes.length;i++){var D=A.attributes[i];if (D.specified){B[D.nodeName.toLowerCase()]=FCKDomTools.GetAttributeValue(A,D).toLowerCase();C++;}};B._length=C;return B;},_CheckAttributesMatch:function(A,B){var C=A.attributes;var D=0;for (var i=0;i<C.length;i++){var E=C[i];if (E.specified){var F=E.nodeName.toLowerCase();var G=B[F];if (!G) break;if (G!=FCKDomTools.GetAttributeValue(A,E).toLowerCase()) break;D++;}};return (D==B._length);}};
+var FCKStyle=function(A){this.Element=(A.Element||'span').toLowerCase();this._StyleDesc=A;};FCKStyle.prototype={GetType:function(){var A=this.GetType_$;if (A!=undefined) return A;var B=this.Element;if (B=='#'||FCKListsLib.StyleBlockElements[B]) A=0;else if (FCKListsLib.StyleObjectElements[B]) A=2;else A=1;return (this.GetType_$=A);},ApplyToSelection:function(A){var B=new FCKDomRange(A);B.MoveToSelection();this.ApplyToRange(B,true);},ApplyToRange:function(A,B,C){switch (this.GetType()){case 0:this.ApplyToRange=this._ApplyBlockStyle;break;case 1:this.ApplyToRange=this._ApplyInlineStyle;break;default:return;};this.ApplyToRange(A,B,C);},ApplyToObject:function(A){if (!A) return;this.BuildElement(null,A);},RemoveFromSelection:function(A){var B=new FCKDomRange(A);B.MoveToSelection();this.RemoveFromRange(B,true);},RemoveFromRange:function(A,B,C){var D;var E=this._GetAttribsForComparison();var F=this._GetOverridesForComparison();if (A.CheckIsCollapsed()){var D=A.CreateBookmark(true);var H=A.GetBookmarkNode(D,true);var I=new FCKElementPath(H.parentNode);var J=[];var K=!FCKDomTools.GetNextSibling(H);var L=K||!FCKDomTools.GetPreviousSibling(H);var M;var N=-1;for (var i=0;i<I.Elements.length;i++){var O=I.Elements[i];if (this.CheckElementRemovable(O)){if (L&&!FCKDomTools.CheckIsEmptyElement(O,function(el){return (el!=H);})){M=O;N=J.length-1;}else{var P=O.nodeName.toLowerCase();if (P==this.Element){for (var Q in E){if (FCKDomTools.HasAttribute(O,Q)){switch (Q){case 'style':this._RemoveStylesFromElement(O);break;case 'class':if (FCKDomTools.GetAttributeValue(O,Q)!=this.GetFinalAttributeValue(Q)) continue;default:FCKDomTools.RemoveAttribute(O,Q);}}}};this._RemoveOverrides(O,F[P]);if (this.GetType()==1) this._RemoveNoAttribElement(O);}}else if (L) J.push(O);L=L&&((K&&!FCKDomTools.GetNextSibling(O))||(!K&&!FCKDomTools.GetPreviousSibling(O)));if (M&&(!L||(i==I.Elements.length-1))){var R=FCKDomTools.RemoveNode(H);for (var j=0;j<=N;j++){var S=FCKDomTools.CloneElement(J[j]);S.appendChild(R);R=S;};if (K) FCKDomTools.InsertAfterNode(M,R);else M.parentNode.insertBefore(R,M);L=false;M=null;}};if (B) A.SelectBookmark(D);if (C) A.MoveToBookmark(D);return;};A.Expand('inline_elements');D=A.CreateBookmark(true);var T=A.GetBookmarkNode(D,true);var U=A.GetBookmarkNode(D,false);A.Release(true);var I=new FCKElementPath(T);var X=I.Elements;var O;for (var i=1;i<X.length;i++){O=X[i];if (O==I.Block||O==I.BlockLimit) break;if (this.CheckElementRemovable(O)) FCKDomTools.BreakParent(T,O,A);};I=new FCKElementPath(U);X=I.Elements;for (var i=1;i<X.length;i++){O=X[i];if (O==I.Block||O==I.BlockLimit) break;b=O.nodeName.toLowerCase();if (this.CheckElementRemovable(O)) FCKDomTools.BreakParent(U,O,A);};var Z=FCKDomTools.GetNextSourceNode(T,true);while (Z){var a=FCKDomTools.GetNextSourceNode(Z);if (Z.nodeType==1){var b=Z.nodeName.toLowerCase();var c=(b==this.Element);if (c){for (var Q in E){if (FCKDomTools.HasAttribute(Z,Q)){switch (Q){case 'style':this._RemoveStylesFromElement(Z);break;case 'class':if (FCKDomTools.GetAttributeValue(Z,Q)!=this.GetFinalAttributeValue(Q)) continue;default:FCKDomTools.RemoveAttribute(Z,Q);}}}}else c=!!F[b];if (c){this._RemoveOverrides(Z,F[b]);this._RemoveNoAttribElement(Z);}};if (a==U) break;Z=a;};this._FixBookmarkStart(T);if (B) A.SelectBookmark(D);if (C) A.MoveToBookmark(D);},CheckElementRemovable:function(A,B){if (!A) return false;var C=A.nodeName.toLowerCase();if (C==this.Element){if (!B&&!FCKDomTools.HasAttributes(A)) return true;var D=this._GetAttribsForComparison();var E=(D._length==0);for (var F in D){if (F=='_length') continue;if (this._CompareAttributeValues(F,FCKDomTools.GetAttributeValue(A,F),(this.GetFinalAttributeValue(F)||''))){E=true;if (!B) break;}else{E=false;if (B) return false;}};if (E) return true;};var G=this._GetOverridesForComparison()[C];if (G){if (!(D=G.Attributes)) return true;for (var i=0;i<D.length;i++){var H=D[i][0];if (FCKDomTools.HasAttribute(A,H)){var I=D[i][1];if (I==null||(typeof I=='string'&&FCKDomTools.GetAttributeValue(A,H)==I)||I.test(FCKDomTools.GetAttributeValue(A,H))) return true;}}};return false;},CheckActive:function(A){switch (this.GetType()){case 0:return this.CheckElementRemovable(A.Block||A.BlockLimit,true);case 1:var B=A.Elements;for (var i=0;i<B.length;i++){var C=B[i];if (C==A.Block||C==A.BlockLimit) continue;if (this.CheckElementRemovable(C,true)) return true;}};return false;},RemoveFromElement:function(A){var B=this._GetAttribsForComparison();var C=this._GetOverridesForComparison();var D=A.getElementsByTagName(this.Element);for (var i=D.length-1;i>=0;i--){var E=D[i];for (var F in B){if (FCKDomTools.HasAttribute(E,F)){switch (F){case 'style':this._RemoveStylesFromElement(E);break;case 'class':if (FCKDomTools.GetAttributeValue(E,F)!=this.GetFinalAttributeValue(F)) continue;default:FCKDomTools.RemoveAttribute(E,F);}}};this._RemoveOverrides(E,C[this.Element]);this._RemoveNoAttribElement(E);};for (var G in C){if (G!=this.Element){D=A.getElementsByTagName(G);for (var i=D.length-1;i>=0;i--){var E=D[i];this._RemoveOverrides(E,C[G]);this._RemoveNoAttribElement(E);}}}},_RemoveStylesFromElement:function(A){var B=A.style.cssText;var C=this.GetFinalStyleValue();if (B.length>0&&C.length==0) return;C='(^|;)\\s*('+C.replace(/\s*([^ ]+):.*?(;|$)/g,'$1|').replace(/\|$/,'')+'):[^;]+';var D=new RegExp(C,'gi');B=B.replace(D,'').Trim();if (B.length==0||B==';') FCKDomTools.RemoveAttribute(A,'style');else A.style.cssText=B.replace(D,'');},_RemoveOverrides:function(A,B){var C=B&&B.Attributes;if (C){for (var i=0;i<C.length;i++){var D=C[i][0];if (FCKDomTools.HasAttribute(A,D)){var E=C[i][1];if (E==null||(E.test&&E.test(FCKDomTools.GetAttributeValue(A,D)))||(typeof E=='string'&&FCKDomTools.GetAttributeValue(A,D)==E)) FCKDomTools.RemoveAttribute(A,D);}}}},_RemoveNoAttribElement:function(A){if (!FCKDomTools.HasAttributes(A)){var B=A.firstChild;var C=A.lastChild;FCKDomTools.RemoveNode(A,true);this._MergeSiblings(B);if (B!=C) this._MergeSiblings(C);}},BuildElement:function(A,B){var C=B||A.createElement(this.Element);var D=this._StyleDesc.Attributes;var E;if (D){for (var F in D){E=this.GetFinalAttributeValue(F);if (F.toLowerCase()=='class') C.className=E;else C.setAttribute(F,E);}};if (this._GetStyleText().length>0) C.style.cssText=this.GetFinalStyleValue();return C;},_CompareAttributeValues:function(A,B,C){if (A=='style'&&B&&C){B=B.replace(/;$/,'').toLowerCase();C=C.replace(/;$/,'').toLowerCase();};return (B==C||((B===null||B==='')&&(C===null||C==='')))},GetFinalAttributeValue:function(A){var B=this._StyleDesc.Attributes;var B=B?B[A]:null;if (!B&&A=='style') return this.GetFinalStyleValue();if (B&&this._Variables) B=B.Replace(FCKRegexLib.StyleVariableAttName,this._GetVariableReplace,this);return B;},GetFinalStyleValue:function(){var A=this._GetStyleText();if (A.length>0&&this._Variables){A=A.Replace(FCKRegexLib.StyleVariableAttName,this._GetVariableReplace,this);A=FCKTools.NormalizeCssText(A);};return A;},_GetVariableReplace:function(){return this._Variables[arguments[2]]||arguments[0];},SetVariable:function(A,B){var C=this._Variables;if (!C) C=this._Variables={};this._Variables[A]=B;},_FromPre:function(A,B,C){var D=B.innerHTML;D=D.replace(/(\r\n|\r)/g,'\n');D=D.replace(/^[ \t]*\n/,'');D=D.replace(/\n$/,'');D=D.replace(/^[ \t]+|[ \t]+$/g,function(match,offset,s){if (match.length==1) return ' ';else if (offset==0) return new Array(match.length).join(' ')+' ';else return ' '+new Array(match.length).join(' ');});var E=new FCKHtmlIterator(D);var F=[];E.Each(function(isTag,value){if (!isTag){value=value.replace(/\n/g,'<br>');value=value.replace(/[ \t]{2,}/g,function (match){return new Array(match.length).join(' ')+' ';});};F.push(value);});C.innerHTML=F.join('');return C;},_ToPre:function(A,B,C){var D=B.innerHTML.Trim();D=D.replace(/[ \t\r\n]*(<br[^>]*>)[ \t\r\n]*/gi,'<br />');var E=new FCKHtmlIterator(D);var F=[];E.Each(function(isTag,value){if (!isTag) value=value.replace(/([ \t\n\r]+| )/g,' ');else if (isTag&&value=='<br />') value='\n';F.push(value);});if (FCKBrowserInfo.IsIE){var G=A.createElement('div');G.appendChild(C);C.outerHTML='<pre>\n'+F.join('')+'</pre>';C=G.removeChild(G.firstChild);}else C.innerHTML=F.join('');return C;},_CheckAndMergePre:function(A,B){if (A!=FCKDomTools.GetPreviousSourceElement(B,true)) return;var C=A.innerHTML.replace(/\n$/,'')+'\n\n'+B.innerHTML.replace(/^\n/,'');if (FCKBrowserInfo.IsIE) B.outerHTML='<pre>'+C+'</pre>';else B.innerHTML=C;FCKDomTools.RemoveNode(A);},_CheckAndSplitPre:function(A){var B;var C=A.firstChild;C=C&&C.nextSibling;while (C){var D=C.nextSibling;if (D&&D.nextSibling&&C.nodeName.IEquals('br')&&D.nodeName.IEquals('br')){FCKDomTools.RemoveNode(C);C=D.nextSibling;FCKDomTools.RemoveNode(D);B=FCKDomTools.InsertAfterNode(B||A,FCKDomTools.CloneElement(A));continue;};if (B){C=C.previousSibling;FCKDomTools.MoveNode(C.nextSibling,B);};C=C.nextSibling;}},_ApplyBlockStyle:function(A,B,C){var D;if (B) D=A.CreateBookmark();var E=new FCKDomRangeIterator(A);E.EnforceRealBlocks=true;var F;var G=A.Window.document;var H;while((F=E.GetNextParagraph())){var I=this.BuildElement(G);var J=I.nodeName.IEquals('pre');var K=F.nodeName.IEquals('pre');var L=J&&!K;var M=!J&&K;if (L) I=this._ToPre(G,F,I);else if (M) I=this._FromPre(G,F,I);else FCKDomTools.MoveChildren(F,I);F.parentNode.insertBefore(I,F);FCKDomTools.RemoveNode(F);if (J){if (H) this._CheckAndMergePre(H,I);H=I;}else if (M) this._CheckAndSplitPre(I);};if (B) A.SelectBookmark(D);if (C) A.MoveToBookmark(D);},_ApplyInlineStyle:function(A,B,C){var D=A.Window.document;if (A.CheckIsCollapsed()){var E=this.BuildElement(D);A.InsertNode(E);A.MoveToPosition(E,2);A.Select();return;};var F=this.Element;var G=FCK.DTD[F]||FCK.DTD.span;var H=this._GetAttribsForComparison();var I;A.Expand('inline_elements');var J=A.CreateBookmark(true);var K=A.GetBookmarkNode(J,true);var L=A.GetBookmarkNode(J,false);A.Release(true);var M=FCKDomTools.GetNextSourceNode(K,true);while (M){var N=false;var O=M.nodeType;var P=O==1?M.nodeName.toLowerCase():null;if (!P||G[P]){if ((FCK.DTD[M.parentNode.nodeName.toLowerCase()]||FCK.DTD.span)[F]||!FCK.DTD[F]){if (!A.CheckHasRange()) A.SetStart(M,3);if (O!=1||M.childNodes.length==0){var Q=M;var R=Q.parentNode;while (Q==R.lastChild&&G[R.nodeName.toLowerCase()]){Q=R;};A.SetEnd(Q,4);if (Q==Q.parentNode.lastChild&&!G[Q.parentNode.nodeName.toLowerCase()]) N=true;}else{A.SetEnd(M,3);}}else N=true;}else N=true;M=FCKDomTools.GetNextSourceNode(M);if (M==L){M=null;N=true;};if (N&&A.CheckHasRange()&&!A.CheckIsCollapsed()){I=this.BuildElement(D);A.ExtractContents().AppendTo(I);if (I.innerHTML.RTrim().length>0){A.InsertNode(I);this.RemoveFromElement(I);this._MergeSiblings(I,this._GetAttribsForComparison());if (!FCKBrowserInfo.IsIE) I.normalize();};A.Release(true);}};this._FixBookmarkStart(K);if (B) A.SelectBookmark(J);if (C) A.MoveToBookmark(J);},_FixBookmarkStart:function(A){var B;while ((B=A.nextSibling)){if (B.nodeType==1&&FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){if (!B.firstChild) FCKDomTools.RemoveNode(B);else FCKDomTools.MoveNode(A,B,true);continue;};if (B.nodeType==3&&B.length==0){FCKDomTools.RemoveNode(B);continue;};break;}},_MergeSiblings:function(A,B){if (!A||A.nodeType!=1||!FCKListsLib.InlineNonEmptyElements[A.nodeName.toLowerCase()]) return;this._MergeNextSibling(A,B);this._MergePreviousSibling(A,B);},_MergeNextSibling:function(A,B){var C=A.nextSibling;var D=(C&&C.nodeType==1&&C.getAttribute('_fck_bookmark'));if (D) C=C.nextSibling;if (C&&C.nodeType==1&&C.nodeName==A.nodeName){if (!B) B=this._CreateElementAttribsForComparison(A);if (this._CheckAttributesMatch(C,B)){var E=A.lastChild;if (D) FCKDomTools.MoveNode(A.nextSibling,A);FCKDomTools.MoveChildren(C,A);FCKDomTools.RemoveNode(C);if (E) this._MergeNextSibling(E);}}},_MergePreviousSibling:function(A,B){var C=A.previousSibling;var D=(C&&C.nodeType==1&&C.getAttribute('_fck_bookmark'));if (D) C=C.previousSibling;if (C&&C.nodeType==1&&C.nodeName==A.nodeName){if (!B) B=this._CreateElementAttribsForComparison(A);if (this._CheckAttributesMatch(C,B)){var E=A.firstChild;if (D) FCKDomTools.MoveNode(A.previousSibling,A,true);FCKDomTools.MoveChildren(C,A,true);FCKDomTools.RemoveNode(C);if (E) this._MergePreviousSibling(E);}}},_GetStyleText:function(){var A=this._StyleDesc.Styles;var B=(this._StyleDesc.Attributes?this._StyleDesc.Attributes['style']||'':'');if (B.length>0) B+=';';for (var C in A) B+=C+':'+A[C]+';';if (B.length>0&&!(/#\(/.test(B))){B=FCKTools.NormalizeCssText(B);};return (this._GetStyleText=function() { return B;})();},_GetAttribsForComparison:function(){var A=this._GetAttribsForComparison_$;if (A) return A;A={};var B=this._StyleDesc.Attributes;if (B){for (var C in B){A[C.toLowerCase()]=B[C].toLowerCase();}};if (this._GetStyleText().length>0){A['style']=this._GetStyleText().toLowerCase();};FCKTools.AppendLengthProperty(A,'_length');return (this._GetAttribsForComparison_$=A);},_GetOverridesForComparison:function(){var A=this._GetOverridesForComparison_$;if (A) return A;A={};var B=this._StyleDesc.Overrides;if (B){if (!FCKTools.IsArray(B)) B=[B];for (var i=0;i<B.length;i++){var C=B[i];var D;var E;var F;if (typeof C=='string') D=C.toLowerCase();else{D=C.Element?C.Element.toLowerCase():this.Element;F=C.Attributes;};E=A[D]||(A[D]={});if (F){var G=(E.Attributes=E.Attributes||[]);for (var H in F){G.push([H.toLowerCase(),F[H]]);}}}};return (this._GetOverridesForComparison_$=A);},_CreateElementAttribsForComparison:function(A){var B={};var C=0;for (var i=0;i<A.attributes.length;i++){var D=A.attributes[i];if (D.specified){B[D.nodeName.toLowerCase()]=FCKDomTools.GetAttributeValue(A,D).toLowerCase();C++;}};B._length=C;return B;},_CheckAttributesMatch:function(A,B){var C=A.attributes;var D=0;for (var i=0;i<C.length;i++){var E=C[i];if (E.specified){var F=E.nodeName.toLowerCase();var G=B[F];if (!G) break;if (G!=FCKDomTools.GetAttributeValue(A,E).toLowerCase()) break;D++;}};return (D==B._length);}};
var FCKStyles=FCK.Styles={_Callbacks:{},_ObjectStyles:{},ApplyStyle:function(A){if (typeof A=='string') A=this.GetStyles()[A];if (A){if (A.GetType()==2) A.ApplyToObject(FCKSelection.GetSelectedElement());else A.ApplyToSelection(FCK.EditorWindow);FCK.Events.FireEvent('OnSelectionChange');}},RemoveStyle:function(A){if (typeof A=='string') A=this.GetStyles()[A];if (A){A.RemoveFromSelection(FCK.EditorWindow);FCK.Events.FireEvent('OnSelectionChange');}},AttachStyleStateChange:function(A,B,C){var D=this._Callbacks[A];if (!D) D=this._Callbacks[A]=[];D.push([B,C]);},CheckSelectionChanges:function(){var A=FCKSelection.GetBoundaryParentElement(true);if (!A) return;var B=new FCKElementPath(A);var C=this.GetStyles();for (var D in C){var E=this._Callbacks[D];if (E){var F=C[D];var G=F.CheckActive(B);if (G!=(F._LastState||null)){F._LastState=G;for (var i=0;i<E.length;i++){var H=E[i][0];var I=E[i][1];H.call(I||window,D,G);}}}}},CheckStyleInSelection:function(A){return false;},_GetRemoveFormatTagsRegex:function (){var A=new RegExp('^(?:'+FCKConfig.RemoveFormatTags.replace(/,/g,'|')+')$','i');return (this._GetRemoveFormatTagsRegex=function(){return A;})&&A;},RemoveAll:function(){var A=new FCKDomRange(FCK.EditorWindow);A.MoveToSelection();if (A.CheckIsCollapsed()) return;A.Expand('inline_elements');var B=A.CreateBookmark(true);var C=A.GetBookmarkNode(B,true);var D=A.GetBookmarkNode(B,false);A.Release(true);var E=this._GetRemoveFormatTagsRegex();var F=new FCKElementPath(C);var G=F.Elements;var H;for (var i=1;i<G.length;i++){H=G[i];if (H==F.Block||H==F.BlockLimit) break;if (E.test(H.nodeName)) FCKDomTools.BreakParent(C,H,A);};F=new FCKElementPath(D);G=F.Elements;for (var i=1;i<G.length;i++){H=G[i];if (H==F.Block||H==F.BlockLimit) break;elementName=H.nodeName.toLowerCase();if (E.test(H.nodeName)) FCKDomTools.BreakParent(D,H,A);};var I=FCKDomTools.GetNextSourceNode(C,true,1);while (I){if (I==D) break;var J=FCKDomTools.GetNextSourceNode(I,false,1);if (E.test(I.nodeName)) FCKDomTools.RemoveNode(I,true);else FCKDomTools.RemoveAttributes(I,FCKConfig.RemoveAttributesArray);I=J;};A.SelectBookmark(B);FCK.Events.FireEvent('OnSelectionChange');},GetStyle:function(A){return this.GetStyles()[A];},GetStyles:function(){var A=this._GetStyles;if (!A){A=this._GetStyles=FCKTools.Merge(this._LoadStylesCore(),this._LoadStylesCustom(),this._LoadStylesXml());};return A;},CheckHasObjectStyle:function(A){return!!this._ObjectStyles[A];},_LoadStylesCore:function(){var A={};var B=FCKConfig.CoreStyles;for (var C in B){var D=A['_FCK_'+C]=new FCKStyle(B[C]);D.IsCore=true;};return A;},_LoadStylesCustom:function(){var A={};var B=FCKConfig.CustomStyles;if (B){for (var C in B){var D=A[C]=new FCKStyle(B[C]);D.Name=C;}};return A;},_LoadStylesXml:function(){var A={};var B=FCKConfig.StylesXmlPath;if (!B||B.length==0) return A;var C=new FCKXml();C.LoadUrl(B);var D=FCKXml.TransformToObject(C.SelectSingleNode('Styles'));var E=D.$Style;if (!E) return A;for (var i=0;i<E.length;i++){var F=E[i];var G=(F.element||'').toLowerCase();if (G.length==0) throw('The element name is required. Error loading "'+B+'"');var H={Element:G,Attributes:{},Styles:{},Overrides:[]};var I=F.$Attribute||[];for (var j=0;j<I.length;j++){H.Attributes[I[j].name]=I[j].value;};var J=F.$Style||[];for (j=0;j<J.length;j++){H.Styles[J[j].name]=J[j].value;};var K=F.$Override;if (K){for (j=0;j<K.length;j++){var L=K[j];var M={Element:L.element};var N=L.$Attribute;if (N){M.Attributes={};for (var k=0;k<N.length;k++){var O=N[k].value||null;if (O){var P=O&&FCKRegexLib.RegExp.exec(O);if (P) O=new RegExp(P[1],P[2]||'');};M.Attributes[N[k].name]=O;}};H.Overrides.push(M);}};var Q=new FCKStyle(H);Q.Name=F.name||G;if (Q.GetType()==2) this._ObjectStyles[G]=true;A[Q.Name]=Q;};return A;}};
var FCKListHandler={OutdentListItem:function(A){var B=A.parentNode;if (B.tagName.toUpperCase().Equals('UL','OL')){var C=FCKTools.GetElementDocument(A);var D=new FCKDocumentFragment(C);var E=D.RootNode;var F=false;var G=FCKDomTools.GetFirstChild(A,['UL','OL']);if (G){F=true;var H;while ((H=G.firstChild)) E.appendChild(G.removeChild(H));FCKDomTools.RemoveNode(G);};var I;var J=false;while ((I=A.nextSibling)){if (!F&&I.nodeType==1&&I.nodeName.toUpperCase()=='LI') J=F=true;E.appendChild(I.parentNode.removeChild(I));if (!J&&I.nodeType==1&&I.nodeName.toUpperCase().Equals('UL','OL')) FCKDomTools.RemoveNode(I,true);};var K=B.parentNode.tagName.toUpperCase();var L=(K=='LI');if (L||K.Equals('UL','OL')){if (F){var G=B.cloneNode(false);D.AppendTo(G);A.appendChild(G);}else if (L) D.InsertAfterNode(B.parentNode);else D.InsertAfterNode(B);if (L) FCKDomTools.InsertAfterNode(B.parentNode,B.removeChild(A));else FCKDomTools.InsertAfterNode(B,B.removeChild(A));}else{if (F){var N=B.cloneNode(false);D.AppendTo(N);FCKDomTools.InsertAfterNode(B,N);};var O=C.createElement(FCKConfig.EnterMode=='p'?'p':'div');FCKDomTools.MoveChildren(B.removeChild(A),O);FCKDomTools.InsertAfterNode(B,O);if (FCKConfig.EnterMode=='br'){if (FCKBrowserInfo.IsGecko) O.parentNode.insertBefore(FCKTools.CreateBogusBR(C),O);else FCKDomTools.InsertAfterNode(O,FCKTools.CreateBogusBR(C));FCKDomTools.RemoveNode(O,true);}};if (this.CheckEmptyList(B)) FCKDomTools.RemoveNode(B,true);}},CheckEmptyList:function(A){return (FCKDomTools.GetFirstChild(A,'LI')==null);},CheckListHasContents:function(A){var B=A.firstChild;while (B){switch (B.nodeType){case 1:if (!B.nodeName.IEquals('UL','LI')) return true;break;case 3:if (B.nodeValue.Trim().length>0) return true;};B=B.nextSibling;};return false;}};
var FCKElementPath=function(A){var B=null;var C=null;var D=[];var e=A;while (e){if (e.nodeType==1){if (!this.LastElement) this.LastElement=e;var E=e.nodeName.toLowerCase();if (FCKBrowserInfo.IsIE&&e.scopeName!='HTML') E=e.scopeName.toLowerCase()+':'+E;if (!C){if (!B&&FCKListsLib.PathBlockElements[E]!=null) B=e;if (FCKListsLib.PathBlockLimitElements[E]!=null){if (!B&&E=='div'&&!FCKElementPath._CheckHasBlock(e)) B=e;else C=e;}};D.push(e);if (E=='body') break;};e=e.parentNode;};this.Block=B;this.BlockLimit=C;this.Elements=D;};FCKElementPath._CheckHasBlock=function(A){var B=A.childNodes;for (var i=0,count=B.length;i<count;i++){var C=B[i];if (C.nodeType==1&&FCKListsLib.BlockElements[C.nodeName.toLowerCase()]) return true;};return false;};
-var FCKDomRange=function(A){this.Window=A;this._Cache={};};FCKDomRange.prototype={_UpdateElementInfo:function(){var A=this._Range;if (!A) this.Release(true);else{var B=A.startContainer;var C=A.endContainer;var D=new FCKElementPath(B);this.StartNode=B.nodeType==3?B:B.childNodes[A.startOffset];this.StartContainer=B;this.StartBlock=D.Block;this.StartBlockLimit=D.BlockLimit;if (B!=C) D=new FCKElementPath(C);var E=C;if (A.endOffset==0){while (E&&!E.previousSibling) E=E.parentNode;if (E) E=E.previousSibling;}else if (E.nodeType==1) E=E.childNodes[A.endOffset-1];this.EndNode=E;this.EndContainer=C;this.EndBlock=D.Block;this.EndBlockLimit=D.BlockLimit;};this._Cache={};},CreateRange:function(){return new FCKW3CRange(this.Window.document);},DeleteContents:function(){if (this._Range){this._Range.deleteContents();this._UpdateElementInfo();}},ExtractContents:function(){if (this._Range){var A=this._Range.extractContents();this._UpdateElementInfo();return A;};return null;},CheckIsCollapsed:function(){if (this._Range) return this._Range.collapsed;return false;},Collapse:function(A){if (this._Range) this._Range.collapse(A);this._UpdateElementInfo();},Clone:function(){var A=FCKTools.CloneObject(this);if (this._Range) A._Range=this._Range.cloneRange();return A;},MoveToNodeContents:function(A){if (!this._Range) this._Range=this.CreateRange();this._Range.selectNodeContents(A);this._UpdateElementInfo();},MoveToElementStart:function(A){this.SetStart(A,1);this.SetEnd(A,1);},MoveToElementEditStart:function(A){var B;while (A&&A.nodeType==1){if (FCKDomTools.CheckIsEditable(A)) B=A;else if (B) break;A=A.firstChild;};if (B) this.MoveToElementStart(B);},InsertNode:function(A){if (this._Range) this._Range.insertNode(A);},CheckIsEmpty:function(){if (this.CheckIsCollapsed()) return true;var A=this.Window.document.createElement('div');this._Range.cloneContents().AppendTo(A);FCKDomTools.TrimNode(A);return (A.innerHTML.length==0);},CheckStartOfBlock:function(){var A=this._Cache;var B=A.IsStartOfBlock;if (B!=undefined) return B;var C=this.StartBlock||this.StartBlockLimit;var D=this._Range.startContainer;var E=this._Range.startOffset;var F;if (E>0){if (D.nodeType==3){var G=D.nodeValue.substr(0,E).Trim();if (G.length!=0) return A.IsStartOfBlock=false;}else F=D.childNodes[E-1];};if (!F) F=FCKDomTools.GetPreviousSourceNode(D,true,null,C);while (F){switch (F.nodeType){case 1:if (!FCKListsLib.InlineChildReqElements[F.nodeName.toLowerCase()]) return A.IsStartOfBlock=false;break;case 3:if (F.nodeValue.Trim().length>0) return A.IsStartOfBlock=false;};F=FCKDomTools.GetPreviousSourceNode(F,false,null,C);};return A.IsStartOfBlock=true;},CheckEndOfBlock:function(A){var B=this._Cache.IsEndOfBlock;if (B!=undefined) return B;var C=this.EndBlock||this.EndBlockLimit;var D=this._Range.endContainer;var E=this._Range.endOffset;var F;if (D.nodeType==3){var G=D.nodeValue;if (E<G.length){G=G.substr(E);if (G.Trim().length!=0) return this._Cache.IsEndOfBlock=false;}}else F=D.childNodes[E];if (!F) F=FCKDomTools.GetNextSourceNode(D,true,null,C);var H=false;while (F){switch (F.nodeType){case 1:var I=F.nodeName.toLowerCase();if (FCKListsLib.InlineChildReqElements[I]) break;if (I=='br'&&!H){H=true;break;};return this._Cache.IsEndOfBlock=false;case 3:if (F.nodeValue.Trim().length>0) return this._Cache.IsEndOfBlock=false;};F=FCKDomTools.GetNextSourceNode(F,false,null,C);};if (A) this.Select();return this._Cache.IsEndOfBlock=true;},CreateBookmark:function(A){var B={StartId:(new Date()).valueOf()+Math.floor(Math.random()*1000)+'S',EndId:(new Date()).valueOf()+Math.floor(Math.random()*1000)+'E'};var C=this.Window.document;var D;var E;var F;if (!this.CheckIsCollapsed()){E=C.createElement('span');E.style.display='none';E.id=B.EndId;E.setAttribute('_fck_bookmark',true);E.innerHTML=' ';F=this.Clone();F.Collapse(false);F.InsertNode(E);};D=C.createElement('span');D.style.display='none';D.id=B.StartId;D.setAttribute('_fck_bookmark',true);D.innerHTML=' ';F=this.Clone();F.Collapse(true);F.InsertNode(D);if (A){B.StartNode=D;B.EndNode=E;};if (E){this.SetStart(D,4);this.SetEnd(E,3);}else this.MoveToPosition(D,4);return B;},GetBookmarkNode:function(A,B){var C=this.Window.document;if (B) return A.StartNode||C.getElementById(A.StartId);else return A.EndNode||C.getElementById(A.EndId);},MoveToBookmark:function(A,B){var C=this.GetBookmarkNode(A,true);var D=this.GetBookmarkNode(A,false);this.SetStart(C,3);if (!B) FCKDomTools.RemoveNode(C);if (D){this.SetEnd(D,3);if (!B) FCKDomTools.RemoveNode(D);}else this.Collapse(true);this._UpdateElementInfo();},CreateBookmark2:function(){if (!this._Range) return { "Start":0,"End":0 };var A={"Start":[this._Range.startOffset],"End":[this._Range.endOffset]};var B=this._Range.startContainer.previousSibling;var C=this._Range.endContainer.previousSibling;var D=this._Range.startContainer;var E=this._Range.endContainer;while (B&&D.nodeType==3){A.Start[0]+=B.length;D=B;B=B.previousSibling;}while (C&&E.nodeType==3){A.End[0]+=C.length;E=C;C=C.previousSibling;};if (D.nodeType==1&&D.childNodes[A.Start[0]]&&D.childNodes[A.Start[0]].nodeType==3){var F=D.childNodes[A.Start[0]];var G=0;while (F.previousSibling&&F.previousSibling.nodeType==3){F=F.previousSibling;G+=F.length;};D=F;A.Start[0]=G;};if (E.nodeType==1&&E.childNodes[A.End[0]]&&E.childNodes[A.End[0]].nodeType==3){var F=E.childNodes[A.End[0]];var G=0;while (F.previousSibling&&F.previousSibling.nodeType==3){F=F.previousSibling;G+=F.length;};E=F;A.End[0]=G;};A.Start=FCKDomTools.GetNodeAddress(D,true).concat(A.Start);A.End=FCKDomTools.GetNodeAddress(E,true).concat(A.End);return A;},MoveToBookmark2:function(A){var B=FCKDomTools.GetNodeFromAddress(this.Window.document,A.Start.slice(0,-1),true);var C=FCKDomTools.GetNodeFromAddress(this.Window.document,A.End.slice(0,-1),true);this.Release(true);this._Range=new FCKW3CRange(this.Window.document);var D=A.Start[A.Start.length-1];var E=A.End[A.End.length-1];while (B.nodeType==3&&D>B.length){if (!B.nextSibling||B.nextSibling.nodeType!=3) break;D-=B.length;B=B.nextSibling;}while (C.nodeType==3&&E>C.length){if (!C.nextSibling||C.nextSibling.nodeType!=3) break;E-=C.length;C=C.nextSibling;};this._Range.setStart(B,D);this._Range.setEnd(C,E);this._UpdateElementInfo();},MoveToPosition:function(A,B){this.SetStart(A,B);this.Collapse(true);},SetStart:function(A,B,C){var D=this._Range;if (!D) D=this._Range=this.CreateRange();switch(B){case 1:D.setStart(A,0);break;case 2:D.setStart(A,A.childNodes.length);break;case 3:D.setStartBefore(A);break;case 4:D.setStartAfter(A);};if (!C) this._UpdateElementInfo();},SetEnd:function(A,B,C){var D=this._Range;if (!D) D=this._Range=this.CreateRange();switch(B){case 1:D.setEnd(A,0);break;case 2:D.setEnd(A,A.childNodes.length);break;case 3:D.setEndBefore(A);break;case 4:D.setEndAfter(A);};if (!C) this._UpdateElementInfo();},Expand:function(A){var B,oSibling;switch (A){case 'inline_elements':if (this._Range.startOffset==0){B=this._Range.startContainer;if (B.nodeType!=1) B=B.previousSibling?null:B.parentNode;if (B){while (FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){this._Range.setStartBefore(B);if (B!=B.parentNode.firstChild) break;B=B.parentNode;}}};B=this._Range.endContainer;var C=this._Range.endOffset;if ((B.nodeType==3&&C>=B.nodeValue.length)||(B.nodeType==1&&C>=B.childNodes.length)||(B.nodeType!=1&&B.nodeType!=3)){if (B.nodeType!=1) B=B.nextSibling?null:B.parentNode;if (B){while (FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){this._Range.setEndAfter(B);if (B!=B.parentNode.lastChild) break;B=B.parentNode;}}};break;case 'block_contents':case 'list_contents':var D=FCKListsLib.BlockBoundaries;if (A=='list_contents'||FCKConfig.EnterMode=='br') D=FCKListsLib.ListBoundaries;if (this.StartBlock&&FCKConfig.EnterMode!='br'&&A=='block_contents') this.SetStart(this.StartBlock,1);else{B=this._Range.startContainer;if (B.nodeType==1){var E=B.childNodes[this._Range.startOffset];if (E) B=FCKDomTools.GetPreviousSourceNode(E,true);else B=B.lastChild||B;}while (B&&(B.nodeType!=1||(B!=this.StartBlockLimit&&!D[B.nodeName.toLowerCase()]))){this._Range.setStartBefore(B);B=B.previousSibling||B.parentNode;}};if (this.EndBlock&&FCKConfig.EnterMode!='br'&&A=='block_contents'&&this.EndBlock.nodeName.toLowerCase()!='li') this.SetEnd(this.EndBlock,2);else{B=this._Range.endContainer;if (B.nodeType==1) B=B.childNodes[this._Range.endOffset]||B.lastChild;while (B&&(B.nodeType!=1||(B!=this.StartBlockLimit&&!D[B.nodeName.toLowerCase()]))){this._Range.setEndAfter(B);B=B.nextSibling||B.parentNode;};if (B&&B.nodeName.toLowerCase()=='br') this._Range.setEndAfter(B);};this._UpdateElementInfo();}},SplitBlock:function(A){var B=A||FCKConfig.EnterMode;if (!this._Range) this.MoveToSelection();if (this.StartBlockLimit==this.EndBlockLimit){var C=this.StartBlock;var D=this.EndBlock;var E=null;if (B!='br'){if (!C){C=this.FixBlock(true,B);D=this.EndBlock;};if (!D) D=this.FixBlock(false,B);};var F=(C!=null&&this.CheckStartOfBlock());var G=(D!=null&&this.CheckEndOfBlock());if (!this.CheckIsEmpty()) this.DeleteContents();if (C&&D&&C==D){if (G){E=new FCKElementPath(this.StartContainer);this.MoveToPosition(D,4);D=null;}else if (F){E=new FCKElementPath(this.StartContainer);this.MoveToPosition(C,3);C=null;}else{this.SetEnd(C,2);var H=this.ExtractContents();D=C.cloneNode(false);D.removeAttribute('id',false);H.AppendTo(D);FCKDomTools.InsertAfterNode(C,D);this.MoveToPosition(C,4);if (FCKBrowserInfo.IsGecko&&!C.nodeName.IEquals(['ul','ol'])) FCKTools.AppendBogusBr(C);}};return {PreviousBlock:C,NextBlock:D,WasStartOfBlock:F,WasEndOfBlock:G,ElementPath:E};};return null;},FixBlock:function(A,B){var C=this.CreateBookmark();this.Collapse(A);this.Expand('block_contents');var D=this.Window.document.createElement(B);this.ExtractContents().AppendTo(D);FCKDomTools.TrimNode(D);if (FCKDomTools.CheckIsEmptyElement(D,function(element) { return element.getAttribute('_fck_bookmark')!='true';})&&FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(D);this.InsertNode(D);this.MoveToBookmark(C);return D;},Release:function(A){if (!A) this.Window=null;this.StartNode=null;this.StartContainer=null;this.StartBlock=null;this.StartBlockLimit=null;this.EndNode=null;this.EndContainer=null;this.EndBlock=null;this.EndBlockLimit=null;this._Range=null;this._Cache=null;},CheckHasRange:function(){return!!this._Range;},GetTouchedStartNode:function(){var A=this._Range;var B=A.startContainer;if (A.collapsed||B.nodeType!=1) return B;return B.childNodes[A.startOffset]||B;},GetTouchedEndNode:function(){var A=this._Range;var B=A.endContainer;if (A.collapsed||B.nodeType!=1) return B;return B.childNodes[A.endOffset-1]||B;}};
+var FCKDomRange=function(A){this.Window=A;this._Cache={};};FCKDomRange.prototype={_UpdateElementInfo:function(){var A=this._Range;if (!A) this.Release(true);else{var B=A.startContainer;var C=new FCKElementPath(B);this.StartNode=B.nodeType==3?B:B.childNodes[A.startOffset];this.StartContainer=B;this.StartBlock=C.Block;this.StartBlockLimit=C.BlockLimit;if (A.collapsed){this.EndNode=this.StartNode;this.EndContainer=this.StartContainer;this.EndBlock=this.StartBlock;this.EndBlockLimit=this.StartBlockLimit;}else{var D=A.endContainer;if (B!=D) C=new FCKElementPath(D);var E=D;if (A.endOffset==0){while (E&&!E.previousSibling) E=E.parentNode;if (E) E=E.previousSibling;}else if (E.nodeType==1) E=E.childNodes[A.endOffset-1];this.EndNode=E;this.EndContainer=D;this.EndBlock=C.Block;this.EndBlockLimit=C.BlockLimit;}};this._Cache={};},CreateRange:function(){return new FCKW3CRange(this.Window.document);},DeleteContents:function(){if (this._Range){this._Range.deleteContents();this._UpdateElementInfo();}},ExtractContents:function(){if (this._Range){var A=this._Range.extractContents();this._UpdateElementInfo();return A;};return null;},CheckIsCollapsed:function(){if (this._Range) return this._Range.collapsed;return false;},Collapse:function(A){if (this._Range) this._Range.collapse(A);this._UpdateElementInfo();},Clone:function(){var A=FCKTools.CloneObject(this);if (this._Range) A._Range=this._Range.cloneRange();return A;},MoveToNodeContents:function(A){if (!this._Range) this._Range=this.CreateRange();this._Range.selectNodeContents(A);this._UpdateElementInfo();},MoveToElementStart:function(A){this.SetStart(A,1);this.SetEnd(A,1);},MoveToElementEditStart:function(A){var B;while (A&&A.nodeType==1){if (FCKDomTools.CheckIsEditable(A)) B=A;else if (B) break;A=A.firstChild;};if (B) this.MoveToElementStart(B);},InsertNode:function(A){if (this._Range) this._Range.insertNode(A);},CheckIsEmpty:function(){if (this.CheckIsCollapsed()) return true;var A=this.Window.document.createElement('div');this._Range.cloneContents().AppendTo(A);FCKDomTools.TrimNode(A);return (A.innerHTML.length==0);},CheckStartOfBlock:function(){var A=this._Cache;var B=A.IsStartOfBlock;if (B!=undefined) return B;var C=this.StartBlock||this.StartBlockLimit;var D=this._Range.startContainer;var E=this._Range.startOffset;var F;if (E>0){if (D.nodeType==3){var G=D.nodeValue.substr(0,E).Trim();if (G.length!=0) return A.IsStartOfBlock=false;}else F=D.childNodes[E-1];};if (!F) F=FCKDomTools.GetPreviousSourceNode(D,true,null,C);while (F){switch (F.nodeType){case 1:if (!FCKListsLib.InlineChildReqElements[F.nodeName.toLowerCase()]) return A.IsStartOfBlock=false;break;case 3:if (F.nodeValue.Trim().length>0) return A.IsStartOfBlock=false;};F=FCKDomTools.GetPreviousSourceNode(F,false,null,C);};return A.IsStartOfBlock=true;},CheckEndOfBlock:function(A){var B=this._Cache.IsEndOfBlock;if (B!=undefined) return B;var C=this.EndBlock||this.EndBlockLimit;var D=this._Range.endContainer;var E=this._Range.endOffset;var F;if (D.nodeType==3){var G=D.nodeValue;if (E<G.length){G=G.substr(E);if (G.Trim().length!=0) return this._Cache.IsEndOfBlock=false;}}else F=D.childNodes[E];if (!F) F=FCKDomTools.GetNextSourceNode(D,true,null,C);var H=false;while (F){switch (F.nodeType){case 1:var I=F.nodeName.toLowerCase();if (FCKListsLib.InlineChildReqElements[I]) break;if (I=='br'&&!H){H=true;break;};return this._Cache.IsEndOfBlock=false;case 3:if (F.nodeValue.Trim().length>0) return this._Cache.IsEndOfBlock=false;};F=FCKDomTools.GetNextSourceNode(F,false,null,C);};if (A) this.Select();return this._Cache.IsEndOfBlock=true;},CreateBookmark:function(A){var B={StartId:(new Date()).valueOf()+Math.floor(Math.random()*1000)+'S',EndId:(new Date()).valueOf()+Math.floor(Math.random()*1000)+'E'};var C=this.Window.document;var D;var E;var F;if (!this.CheckIsCollapsed()){E=C.createElement('span');E.style.display='none';E.id=B.EndId;E.setAttribute('_fck_bookmark',true);E.innerHTML=' ';F=this.Clone();F.Collapse(false);F.InsertNode(E);};D=C.createElement('span');D.style.display='none';D.id=B.StartId;D.setAttribute('_fck_bookmark',true);D.innerHTML=' ';F=this.Clone();F.Collapse(true);F.InsertNode(D);if (A){B.StartNode=D;B.EndNode=E;};if (E){this.SetStart(D,4);this.SetEnd(E,3);}else this.MoveToPosition(D,4);return B;},GetBookmarkNode:function(A,B){var C=this.Window.document;if (B) return A.StartNode||C.getElementById(A.StartId);else return A.EndNode||C.getElementById(A.EndId);},MoveToBookmark:function(A,B){var C=this.GetBookmarkNode(A,true);var D=this.GetBookmarkNode(A,false);this.SetStart(C,3);if (!B) FCKDomTools.RemoveNode(C);if (D){this.SetEnd(D,3);if (!B) FCKDomTools.RemoveNode(D);}else this.Collapse(true);this._UpdateElementInfo();},CreateBookmark2:function(){if (!this._Range) return { "Start":0,"End":0 };var A={"Start":[this._Range.startOffset],"End":[this._Range.endOffset]};var B=this._Range.startContainer.previousSibling;var C=this._Range.endContainer.previousSibling;var D=this._Range.startContainer;var E=this._Range.endContainer;while (B&&D.nodeType==3){A.Start[0]+=B.length;D=B;B=B.previousSibling;}while (C&&E.nodeType==3){A.End[0]+=C.length;E=C;C=C.previousSibling;};if (D.nodeType==1&&D.childNodes[A.Start[0]]&&D.childNodes[A.Start[0]].nodeType==3){var F=D.childNodes[A.Start[0]];var G=0;while (F.previousSibling&&F.previousSibling.nodeType==3){F=F.previousSibling;G+=F.length;};D=F;A.Start[0]=G;};if (E.nodeType==1&&E.childNodes[A.End[0]]&&E.childNodes[A.End[0]].nodeType==3){var F=E.childNodes[A.End[0]];var G=0;while (F.previousSibling&&F.previousSibling.nodeType==3){F=F.previousSibling;G+=F.length;};E=F;A.End[0]=G;};A.Start=FCKDomTools.GetNodeAddress(D,true).concat(A.Start);A.End=FCKDomTools.GetNodeAddress(E,true).concat(A.End);return A;},MoveToBookmark2:function(A){var B=FCKDomTools.GetNodeFromAddress(this.Window.document,A.Start.slice(0,-1),true);var C=FCKDomTools.GetNodeFromAddress(this.Window.document,A.End.slice(0,-1),true);this.Release(true);this._Range=new FCKW3CRange(this.Window.document);var D=A.Start[A.Start.length-1];var E=A.End[A.End.length-1];while (B.nodeType==3&&D>B.length){if (!B.nextSibling||B.nextSibling.nodeType!=3) break;D-=B.length;B=B.nextSibling;}while (C.nodeType==3&&E>C.length){if (!C.nextSibling||C.nextSibling.nodeType!=3) break;E-=C.length;C=C.nextSibling;};this._Range.setStart(B,D);this._Range.setEnd(C,E);this._UpdateElementInfo();},MoveToPosition:function(A,B){this.SetStart(A,B);this.Collapse(true);},SetStart:function(A,B,C){var D=this._Range;if (!D) D=this._Range=this.CreateRange();switch(B){case 1:D.setStart(A,0);break;case 2:D.setStart(A,A.childNodes.length);break;case 3:D.setStartBefore(A);break;case 4:D.setStartAfter(A);};if (!C) this._UpdateElementInfo();},SetEnd:function(A,B,C){var D=this._Range;if (!D) D=this._Range=this.CreateRange();switch(B){case 1:D.setEnd(A,0);break;case 2:D.setEnd(A,A.childNodes.length);break;case 3:D.setEndBefore(A);break;case 4:D.setEndAfter(A);};if (!C) this._UpdateElementInfo();},Expand:function(A){var B,oSibling;switch (A){case 'inline_elements':if (this._Range.startOffset==0){B=this._Range.startContainer;if (B.nodeType!=1) B=B.previousSibling?null:B.parentNode;if (B){while (FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){this._Range.setStartBefore(B);if (B!=B.parentNode.firstChild) break;B=B.parentNode;}}};B=this._Range.endContainer;var C=this._Range.endOffset;if ((B.nodeType==3&&C>=B.nodeValue.length)||(B.nodeType==1&&C>=B.childNodes.length)||(B.nodeType!=1&&B.nodeType!=3)){if (B.nodeType!=1) B=B.nextSibling?null:B.parentNode;if (B){while (FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){this._Range.setEndAfter(B);if (B!=B.parentNode.lastChild) break;B=B.parentNode;}}};break;case 'block_contents':case 'list_contents':var D=FCKListsLib.BlockBoundaries;if (A=='list_contents'||FCKConfig.EnterMode=='br') D=FCKListsLib.ListBoundaries;if (this.StartBlock&&FCKConfig.EnterMode!='br'&&A=='block_contents') this.SetStart(this.StartBlock,1);else{B=this._Range.startContainer;if (B.nodeType==1){var E=B.childNodes[this._Range.startOffset];if (E) B=FCKDomTools.GetPreviousSourceNode(E,true);else B=B.lastChild||B;}while (B&&(B.nodeType!=1||(B!=this.StartBlockLimit&&!D[B.nodeName.toLowerCase()]))){this._Range.setStartBefore(B);B=B.previousSibling||B.parentNode;}};if (this.EndBlock&&FCKConfig.EnterMode!='br'&&A=='block_contents'&&this.EndBlock.nodeName.toLowerCase()!='li') this.SetEnd(this.EndBlock,2);else{B=this._Range.endContainer;if (B.nodeType==1) B=B.childNodes[this._Range.endOffset]||B.lastChild;while (B&&(B.nodeType!=1||(B!=this.StartBlockLimit&&!D[B.nodeName.toLowerCase()]))){this._Range.setEndAfter(B);B=B.nextSibling||B.parentNode;};if (B&&B.nodeName.toLowerCase()=='br') this._Range.setEndAfter(B);};this._UpdateElementInfo();}},SplitBlock:function(A){var B=A||FCKConfig.EnterMode;if (!this._Range) this.MoveToSelection();if (this.StartBlockLimit==this.EndBlockLimit){var C=this.StartBlock;var D=this.EndBlock;var E=null;if (B!='br'){if (!C){C=this.FixBlock(true,B);D=this.EndBlock;};if (!D) D=this.FixBlock(false,B);};var F=(C!=null&&this.CheckStartOfBlock());var G=(D!=null&&this.CheckEndOfBlock());if (!this.CheckIsEmpty()) this.DeleteContents();if (C&&D&&C==D){if (G){E=new FCKElementPath(this.StartContainer);this.MoveToPosition(D,4);D=null;}else if (F){E=new FCKElementPath(this.StartContainer);this.MoveToPosition(C,3);C=null;}else{this.SetEnd(C,2);var H=this.ExtractContents();D=C.cloneNode(false);D.removeAttribute('id',false);H.AppendTo(D);FCKDomTools.InsertAfterNode(C,D);this.MoveToPosition(C,4);if (FCKBrowserInfo.IsGecko&&!C.nodeName.IEquals(['ul','ol'])) FCKTools.AppendBogusBr(C);}};return {PreviousBlock:C,NextBlock:D,WasStartOfBlock:F,WasEndOfBlock:G,ElementPath:E};};return null;},FixBlock:function(A,B){var C=this.CreateBookmark();this.Collapse(A);this.Expand('block_contents');var D=this.Window.document.createElement(B);this.ExtractContents().AppendTo(D);FCKDomTools.TrimNode(D);if (FCKDomTools.CheckIsEmptyElement(D,function(element) { return element.getAttribute('_fck_bookmark')!='true';})&&FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(D);this.InsertNode(D);this.MoveToBookmark(C);return D;},Release:function(A){if (!A) this.Window=null;this.StartNode=null;this.StartContainer=null;this.StartBlock=null;this.StartBlockLimit=null;this.EndNode=null;this.EndContainer=null;this.EndBlock=null;this.EndBlockLimit=null;this._Range=null;this._Cache=null;},CheckHasRange:function(){return!!this._Range;},GetTouchedStartNode:function(){var A=this._Range;var B=A.startContainer;if (A.collapsed||B.nodeType!=1) return B;return B.childNodes[A.startOffset]||B;},GetTouchedEndNode:function(){var A=this._Range;var B=A.endContainer;if (A.collapsed||B.nodeType!=1) return B;return B.childNodes[A.endOffset-1]||B;}};
FCKDomRange.prototype.MoveToSelection=function(){this.Release(true);var A=this.Window.getSelection();if (A&&A.rangeCount>0){this._Range=FCKW3CRange.CreateFromRange(this.Window.document,A.getRangeAt(0));this._UpdateElementInfo();}else if (this.Window.document) this.MoveToElementStart(this.Window.document.body);};FCKDomRange.prototype.Select=function(){var A=this._Range;if (A){var B=A.startContainer;if (A.collapsed&&B.nodeType==1&&B.childNodes.length==0) B.appendChild(A._Document.createTextNode(''));var C=this.Window.document.createRange();C.setStart(B,A.startOffset);try{C.setEnd(A.endContainer,A.endOffset);}catch (e){if (e.toString().Contains('NS_ERROR_ILLEGAL_VALUE')){A.collapse(true);C.setEnd(A.endContainer,A.endOffset);}else throw(e);};var D=this.Window.getSelection();D.removeAllRanges();D.addRange(C);}};FCKDomRange.prototype.SelectBookmark=function(A){var B=this.Window.document.createRange();var C=this.GetBookmarkNode(A,true);var D=this.GetBookmarkNode(A,false);B.setStart(C.parentNode,FCKDomTools.GetIndexOf(C));FCKDomTools.RemoveNode(C);if (D){B.setEnd(D.parentNode,FCKDomTools.GetIndexOf(D));FCKDomTools.RemoveNode(D);};var E=this.Window.getSelection();E.removeAllRanges();E.addRange(B);};
-var FCKDomRangeIterator=function(A){this.Range=A;this.ForceBrBreak=false;this.EnforceRealBlocks=false;};FCKDomRangeIterator.CreateFromSelection=function(A){var B=new FCKDomRange(A);B.MoveToSelection();return new FCKDomRangeIterator(B);};FCKDomRangeIterator.prototype={GetNextParagraph:function(){var A;var B;var C;var D;var E;var F=this.ForceBrBreak?FCKListsLib.ListBoundaries:FCKListsLib.BlockBoundaries;if (!this._LastNode){var B=this.Range.Clone();B.Expand(this.ForceBrBreak?'list_contents':'block_contents');this._NextNode=B.GetTouchedStartNode();this._LastNode=B.GetTouchedEndNode();B=null;};var H=this._NextNode;var I=this._LastNode;this._NextNode=null;while (H){var J=false;var K=(H.nodeType!=1);var L=false;if (!K){var M=H.nodeName.toLowerCase();if (F[M]&&(!FCKBrowserInfo.IsIE||H.scopeName=='HTML')){if (M=='br') K=true;else if (!B&&H.childNodes.length==0&&M!='hr'){A=H;C=H==I;break;};if (B){B.SetEnd(H,3,true);if (M!='br') this._NextNode=H;};J=true;}else{if (H.firstChild){if (!B){B=new FCKDomRange(this.Range.Window);B.SetStart(H,3,true);};H=H.firstChild;continue;};K=true;}}else if (H.nodeType==3){if (/^[\r\n\t ]+$/.test(H.nodeValue)) K=false;};if (K&&!B){B=new FCKDomRange(this.Range.Window);B.SetStart(H,3,true);};C=((!J||K)&&H==I);if (B&&!J){while (!H.nextSibling&&!C){var N=H.parentNode;if (F[N.nodeName.toLowerCase()]){J=true;C=C||(N==I);break;};H=N;K=true;C=(H==I);L=true;}};if (K) B.SetEnd(H,4,true);if ((J||C)&&B){B._UpdateElementInfo();if (B.StartNode==B.EndNode&&B.StartNode.parentNode==B.StartBlockLimit&&B.StartNode.getAttribute&&B.StartNode.getAttribute('_fck_bookmark')) B=null;else break;};if (C) break;H=FCKDomTools.GetNextSourceNode(H,L,null,I);};if (!A){if (!B){this._NextNode=null;return null;};A=B.StartBlock;if (!A&&!this.EnforceRealBlocks&&B.StartBlockLimit.nodeName.IEquals('DIV','TH','TD')&&B.CheckStartOfBlock()&&B.CheckEndOfBlock()){A=B.StartBlockLimit;}else if (!A||(this.EnforceRealBlocks&&A.nodeName.toLowerCase()=='li')){A=this.Range.Window.document.createElement(FCKConfig.EnterMode=='p'?'p':'div');B.ExtractContents().AppendTo(A);FCKDomTools.TrimNode(A);B.InsertNode(A);D=true;E=true;}else if (A.nodeName.toLowerCase()!='li'){if (!B.CheckStartOfBlock()||!B.CheckEndOfBlock()){A=A.cloneNode(false);B.ExtractContents().AppendTo(A);FCKDomTools.TrimNode(A);var O=B.SplitBlock();D=!O.WasStartOfBlock;E=!O.WasEndOfBlock;B.InsertNode(A);}}else if (!C){this._NextNode=A==I?null:FCKDomTools.GetNextSourceNode(B.EndNode,true,null,I);return A;}};if (D){var P=A.previousSibling;if (P&&P.nodeType==1){if (P.nodeName.toLowerCase()=='br') P.parentNode.removeChild(P);else if (P.lastChild&&P.lastChild.nodeName.IEquals('br')) P.removeChild(P.lastChild);}};if (E){var Q=A.lastChild;if (Q&&Q.nodeType==1&&Q.nodeName.toLowerCase()=='br') A.removeChild(Q);};if (!this._NextNode) this._NextNode=(C||A==I)?null:FCKDomTools.GetNextSourceNode(A,true,null,I);return A;}};
-var FCKDocumentFragment=function(A,B){this.RootNode=B||A.createDocumentFragment();};FCKDocumentFragment.prototype={AppendTo:function(A){A.appendChild(this.RootNode);},InsertAfterNode:function(A){FCKDomTools.InsertAfterNode(A,this.RootNode);}};
+var FCKDomRangeIterator=function(A){this.Range=A;this.ForceBrBreak=false;this.EnforceRealBlocks=false;};FCKDomRangeIterator.CreateFromSelection=function(A){var B=new FCKDomRange(A);B.MoveToSelection();return new FCKDomRangeIterator(B);};FCKDomRangeIterator.prototype={GetNextParagraph:function(){var A;var B;var C;var D;var E;var F=this.ForceBrBreak?FCKListsLib.ListBoundaries:FCKListsLib.BlockBoundaries;if (!this._LastNode){var B=this.Range.Clone();B.Expand(this.ForceBrBreak?'list_contents':'block_contents');this._NextNode=B.GetTouchedStartNode();this._LastNode=B.GetTouchedEndNode();B=null;};var H=this._NextNode;var I=this._LastNode;this._NextNode=null;while (H){var J=false;var K=(H.nodeType!=1);var L=false;if (!K){var M=H.nodeName.toLowerCase();if (F[M]&&(!FCKBrowserInfo.IsIE||H.scopeName=='HTML')){if (M=='br') K=true;else if (!B&&H.childNodes.length==0&&M!='hr'){A=H;C=H==I;break;};if (B){B.SetEnd(H,3,true);if (M!='br') this._NextNode=FCKDomTools.GetNextSourceNode(H,true,null,I);};J=true;}else{if (H.firstChild){if (!B){B=new FCKDomRange(this.Range.Window);B.SetStart(H,3,true);};H=H.firstChild;continue;};K=true;}}else if (H.nodeType==3){if (/^[\r\n\t ]+$/.test(H.nodeValue)) K=false;};if (K&&!B){B=new FCKDomRange(this.Range.Window);B.SetStart(H,3,true);};C=((!J||K)&&H==I);if (B&&!J){while (!H.nextSibling&&!C){var N=H.parentNode;if (F[N.nodeName.toLowerCase()]){J=true;C=C||(N==I);break;};H=N;K=true;C=(H==I);L=true;}};if (K) B.SetEnd(H,4,true);if ((J||C)&&B){B._UpdateElementInfo();if (B.StartNode==B.EndNode&&B.StartNode.parentNode==B.StartBlockLimit&&B.StartNode.getAttribute&&B.StartNode.getAttribute('_fck_bookmark')) B=null;else break;};if (C) break;H=FCKDomTools.GetNextSourceNode(H,L,null,I);};if (!A){if (!B){this._NextNode=null;return null;};A=B.StartBlock;if (!A&&!this.EnforceRealBlocks&&B.StartBlockLimit.nodeName.IEquals('DIV','TH','TD')&&B.CheckStartOfBlock()&&B.CheckEndOfBlock()){A=B.StartBlockLimit;}else if (!A||(this.EnforceRealBlocks&&A.nodeName.toLowerCase()=='li')){A=this.Range.Window.document.createElement(FCKConfig.EnterMode=='p'?'p':'div');B.ExtractContents().AppendTo(A);FCKDomTools.TrimNode(A);B.InsertNode(A);D=true;E=true;}else if (A.nodeName.toLowerCase()!='li'){if (!B.CheckStartOfBlock()||!B.CheckEndOfBlock()){A=A.cloneNode(false);B.ExtractContents().AppendTo(A);FCKDomTools.TrimNode(A);var O=B.SplitBlock();D=!O.WasStartOfBlock;E=!O.WasEndOfBlock;B.InsertNode(A);}}else if (!C){this._NextNode=A==I?null:FCKDomTools.GetNextSourceNode(B.EndNode,true,null,I);return A;}};if (D){var P=A.previousSibling;if (P&&P.nodeType==1){if (P.nodeName.toLowerCase()=='br') P.parentNode.removeChild(P);else if (P.lastChild&&P.lastChild.nodeName.IEquals('br')) P.removeChild(P.lastChild);}};if (E){var Q=A.lastChild;if (Q&&Q.nodeType==1&&Q.nodeName.toLowerCase()=='br') A.removeChild(Q);};if (!this._NextNode) this._NextNode=(C||A==I)?null:FCKDomTools.GetNextSourceNode(A,true,null,I);return A;}};
+var FCKDocumentFragment=function(A,B){this.RootNode=B||A.createDocumentFragment();};FCKDocumentFragment.prototype={AppendTo:function(A){A.appendChild(this.RootNode);},AppendHtml:function(A){var B=this.RootNode.ownerDocument.createElement('div');B.innerHTML=A;FCKDomTools.MoveChildren(B,this.RootNode);},InsertAfterNode:function(A){FCKDomTools.InsertAfterNode(A,this.RootNode);}};
var FCKW3CRange=function(A){this._Document=A;this.startContainer=null;this.startOffset=null;this.endContainer=null;this.endOffset=null;this.collapsed=true;};FCKW3CRange.CreateRange=function(A){return new FCKW3CRange(A);};FCKW3CRange.CreateFromRange=function(A,B){var C=FCKW3CRange.CreateRange(A);C.setStart(B.startContainer,B.startOffset);C.setEnd(B.endContainer,B.endOffset);return C;};FCKW3CRange.prototype={_UpdateCollapsed:function(){this.collapsed=(this.startContainer==this.endContainer&&this.startOffset==this.endOffset);},setStart:function(A,B){this.startContainer=A;this.startOffset=B;if (!this.endContainer){this.endContainer=A;this.endOffset=B;};this._UpdateCollapsed();},setEnd:function(A,B){this.endContainer=A;this.endOffset=B;if (!this.startContainer){this.startContainer=A;this.startOffset=B;};this._UpdateCollapsed();},setStartAfter:function(A){this.setStart(A.parentNode,FCKDomTools.GetIndexOf(A)+1);},setStartBefore:function(A){this.setStart(A.parentNode,FCKDomTools.GetIndexOf(A));},setEndAfter:function(A){this.setEnd(A.parentNode,FCKDomTools.GetIndexOf(A)+1);},setEndBefore:function(A){this.setEnd(A.parentNode,FCKDomTools.GetIndexOf(A));},collapse:function(A){if (A){this.endContainer=this.startContainer;this.endOffset=this.startOffset;}else{this.startContainer=this.endContainer;this.startOffset=this.endOffset;};this.collapsed=true;},selectNodeContents:function(A){this.setStart(A,0);this.setEnd(A,A.nodeType==3?A.data.length:A.childNodes.length);},insertNode:function(A){var B=this.startContainer;var C=this.startOffset;if (B.nodeType==3){B.splitText(C);if (B==this.endContainer) this.setEnd(B.nextSibling,this.endOffset-this.startOffset);FCKDomTools.InsertAfterNode(B,A);return;}else{B.insertBefore(A,B.childNodes[C]||null);if (B==this.endContainer){this.endOffset++;this.collapsed=false;}}},deleteContents:function(){if (this.collapsed) return;this._ExecContentsAction(0);},extractContents:function(){var A=new FCKDocumentFragment(this._Document);if (!this.collapsed) this._ExecContentsAction(1,A);return A;},cloneContents:function(){var A=new FCKDocumentFragment(this._Document);if (!this.collapsed) this._ExecContentsAction(2,A);return A;},_ExecContentsAction:function(A,B){var C=this.startContainer;var D=this.endContainer;var E=this.startOffset;var F=this.endOffset;var G=false;var H=false;if (D.nodeType==3) D=D.splitText(F);else{if (D.childNodes.length>0){if (F>D.childNodes.length-1){D=FCKDomTools.InsertAfterNode(D.lastChild,this._Document.createTextNode(''));H=true;}else D=D.childNodes[F];}};if (C.nodeType==3){C.splitText(E);if (C==D) D=C.nextSibling;}else{if (E==0){C=C.insertBefore(this._Document.createTextNode(''),C.firstChild);G=true;}else if (E>C.childNodes.length-1){C=C.appendChild(this._Document.createTextNode(''));G=true;}else C=C.childNodes[E].previousSibling;};var I=FCKDomTools.GetParents(C);var J=FCKDomTools.GetParents(D);var i,topStart,topEnd;for (i=0;i<I.length;i++){topStart=I[i];topEnd=J[i];if (topStart!=topEnd) break;};var K,levelStartNode,levelClone,currentNode,currentSibling;if (B) K=B.RootNode;for (var j=i;j<I.length;j++){levelStartNode=I[j];if (K&&levelStartNode!=C) levelClone=K.appendChild(levelStartNode.cloneNode(levelStartNode==C));currentNode=levelStartNode.nextSibling;while(currentNode){if (currentNode==J[j]||currentNode==D) break;currentSibling=currentNode.nextSibling;if (A==2) K.appendChild(currentNode.cloneNode(true));else{currentNode.parentNode.removeChild(currentNode);if (A==1) K.appendChild(currentNode);};currentNode=currentSibling;};if (K) K=levelClone;};if (B) K=B.RootNode;for (var k=i;k<J.length;k++){levelStartNode=J[k];if (A>0&&levelStartNode!=D) levelClone=K.appendChild(levelStartNode.cloneNode(levelStartNode==D));if (!I[k]||levelStartNode.parentNode!=I[k].parentNode){currentNode=levelStartNode.previousSibling;while(currentNode){if (currentNode==I[k]||currentNode==C) break;currentSibling=currentNode.previousSibling;if (A==2) K.insertBefore(currentNode.cloneNode(true),K.firstChild);else{currentNode.parentNode.removeChild(currentNode);if (A==1) K.insertBefore(currentNode,K.firstChild);};currentNode=currentSibling;}};if (K) K=levelClone;};if (A==2){var L=this.startContainer;if (L.nodeType==3){L.data+=L.nextSibling.data;L.parentNode.removeChild(L.nextSibling);};var M=this.endContainer;if (M.nodeType==3&&M.nextSibling){M.data+=M.nextSibling.data;M.parentNode.removeChild(M.nextSibling);}}else{if (topStart&&topEnd&&(C.parentNode!=topStart.parentNode||D.parentNode!=topEnd.parentNode)){var N=FCKDomTools.GetIndexOf(topEnd);if (G&&topEnd.parentNode==C.parentNode) N--;this.setStart(topEnd.parentNode,N);};this.collapse(true);};if(G) C.parentNode.removeChild(C);if(H&&D.parentNode) D.parentNode.removeChild(D);},cloneRange:function(){return FCKW3CRange.CreateFromRange(this._Document,this);}};
-var FCKEnterKey=function(A,B,C,D){this.Window=A;this.EnterMode=B||'p';this.ShiftEnterMode=C||'br';var E=new FCKKeystrokeHandler(false);E._EnterKey=this;E.OnKeystroke=FCKEnterKey_OnKeystroke;E.SetKeystrokes([[13,'Enter'],[SHIFT+13,'ShiftEnter'],[8,'Backspace'],[CTRL+8,'CtrlBackspace'],[46,'Delete']]);this.TabText='';if (D>0||FCKBrowserInfo.IsSafari){while (D--) this.TabText+='\xa0';E.SetKeystrokes([9,'Tab']);};E.AttachToElement(A.document);};function FCKEnterKey_OnKeystroke(A,B){var C=this._EnterKey;try{switch (B){case 'Enter':return C.DoEnter();break;case 'ShiftEnter':return C.DoShiftEnter();break;case 'Backspace':return C.DoBackspace();break;case 'Delete':return C.DoDelete();break;case 'Tab':return C.DoTab();break;case 'CtrlBackspace':return C.DoCtrlBackspace();break;}}catch (e){};return false;};FCKEnterKey.prototype.DoEnter=function(A,B){FCKUndo.SaveUndoStep();this._HasShift=(B===true);var C=FCKSelection.GetParentElement();var D=new FCKElementPath(C);var E=A||this.EnterMode;if (E=='br'||D.Block&&D.Block.tagName.toLowerCase()=='pre') return this._ExecuteEnterBr();else return this._ExecuteEnterBlock(E);};FCKEnterKey.prototype.DoShiftEnter=function(){return this.DoEnter(this.ShiftEnterMode,true);};FCKEnterKey.prototype.DoBackspace=function(){var A=false;var B=new FCKDomRange(this.Window);B.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(B,this.Window.document.body)){this._FixIESelectAllBug(B);return true;};var C=B.CheckIsCollapsed();if (!C){if (FCKBrowserInfo.IsIE&&this.Window.document.selection.type.toLowerCase()=="control"){var D=this.Window.document.selection.createRange();for (var i=D.length-1;i>=0;i--){var E=D.item(i);E.parentNode.removeChild(E);};return true;};return false;};if (FCKBrowserInfo.IsIE){var F=FCKDomTools.GetPreviousSourceElement(B.StartNode,true);if (F&&F.nodeName.toLowerCase()=='br'){var G=B.Clone();G.SetStart(F,4);if (G.CheckIsEmpty()){F.parentNode.removeChild(F);return true;}}};var H=B.StartBlock;var I=B.EndBlock;if (B.StartBlockLimit==B.EndBlockLimit&&H&&I){if (!C){var J=B.CheckEndOfBlock();B.DeleteContents();if (H!=I){B.SetStart(I,1);B.SetEnd(I,1);};B.Select();A=(H==I);};if (B.CheckStartOfBlock()){var K=B.StartBlock;var L=FCKDomTools.GetPreviousSourceElement(K,true,['BODY',B.StartBlockLimit.nodeName],['UL','OL']);A=this._ExecuteBackspace(B,L,K);}else if (FCKBrowserInfo.IsGeckoLike){B.Select();}};B.Release();return A;};FCKEnterKey.prototype.DoCtrlBackspace=function(){FCKUndo.SaveUndoStep();var A=new FCKDomRange(this.Window);A.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(A,this.Window.document.body)){this._FixIESelectAllBug(A);return true;};return false;};FCKEnterKey.prototype._ExecuteBackspace=function(A,B,C){var D=false;if (!B&&C&&C.nodeName.IEquals('LI')&&C.parentNode.parentNode.nodeName.IEquals('LI')){this._OutdentWithSelection(C,A);return true;};if (B&&B.nodeName.IEquals('LI')){var E=FCKDomTools.GetLastChild(B,['UL','OL']);while (E){B=FCKDomTools.GetLastChild(E,'LI');E=FCKDomTools.GetLastChild(B,['UL','OL']);}};if (B&&C){if (C.nodeName.IEquals('LI')&&!B.nodeName.IEquals('LI')){this._OutdentWithSelection(C,A);return true;};var F=C.parentNode;var G=B.nodeName.toLowerCase();if (FCKListsLib.EmptyElements[G]!=null||G=='table'){FCKDomTools.RemoveNode(B);D=true;}else{FCKDomTools.RemoveNode(C);while (F.innerHTML.Trim().length==0){var H=F.parentNode;H.removeChild(F);F=H;};FCKDomTools.LTrimNode(C);FCKDomTools.RTrimNode(B);A.SetStart(B,2,true);A.Collapse(true);var I=A.CreateBookmark(true);if (!C.tagName.IEquals(['TABLE'])) FCKDomTools.MoveChildren(C,B);A.SelectBookmark(I);D=true;}};return D;};FCKEnterKey.prototype.DoDelete=function(){FCKUndo.SaveUndoStep();var A=false;var B=new FCKDomRange(this.Window);B.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(B,this.Window.document.body)){this._FixIESelectAllBug(B);return true;};if (B.CheckIsCollapsed()&&B.CheckEndOfBlock(FCKBrowserInfo.IsGeckoLike)){var C=B.StartBlock;var D=FCKTools.GetElementAscensor(C,'td');var E=FCKDomTools.GetNextSourceElement(C,true,[B.StartBlockLimit.nodeName],['UL','OL','TR'],true);if (D){var F=FCKTools.GetElementAscensor(E,'td');if (F!=D) return true;};A=this._ExecuteBackspace(B,C,E);};B.Release();return A;};FCKEnterKey.prototype.DoTab=function(){var A=new FCKDomRange(this.Window);A.MoveToSelection();var B=A._Range.startContainer;while (B){if (B.nodeType==1){var C=B.tagName.toLowerCase();if (C=="tr"||C=="td"||C=="th"||C=="tbody"||C=="table") return false;else break;};B=B.parentNode;};if (this.TabText){A.DeleteContents();A.InsertNode(this.Window.document.createTextNode(this.TabText));A.Collapse(false);A.Select();};return true;};FCKEnterKey.prototype._ExecuteEnterBlock=function(A,B){var C=B||new FCKDomRange(this.Window);var D=C.SplitBlock(A);if (D){var E=D.PreviousBlock;var F=D.NextBlock;var G=D.WasStartOfBlock;var H=D.WasEndOfBlock;if (F){if (F.parentNode.nodeName.IEquals('li')){FCKDomTools.BreakParent(F,F.parentNode);FCKDomTools.MoveNode(F,F.nextSibling,true);}}else if (E&&E.parentNode.nodeName.IEquals('li')){FCKDomTools.BreakParent(E,E.parentNode);C.MoveToElementEditStart(E.nextSibling);FCKDomTools.MoveNode(E,E.previousSibling);};if (!G&&!H){if (F.nodeName.IEquals('li')&&F.firstChild&&F.firstChild.nodeName.IEquals(['ul','ol'])) F.insertBefore(FCKTools.GetElementDocument(F).createTextNode('\xa0'),F.firstChild);if (F) C.MoveToElementEditStart(F);}else{if (G&&H&&E.tagName.toUpperCase()=='LI'){C.MoveToElementStart(E);this._OutdentWithSelection(E,C);C.Release();return true;};var I;if (E){var J=E.tagName.toUpperCase();if (!this._HasShift&&!(/^H[1-6]$/).test(J)){I=FCKDomTools.CloneElement(E);}}else if (F) I=FCKDomTools.CloneElement(F);if (!I) I=this.Window.document.createElement(A);var K=D.ElementPath;if (K){for (var i=0,len=K.Elements.length;i<len;i++){var L=K.Elements[i];if (L==K.Block||L==K.BlockLimit) break;if (FCKListsLib.InlineChildReqElements[L.nodeName.toLowerCase()]){L=FCKDomTools.CloneElement(L);FCKDomTools.MoveChildren(I,L);I.appendChild(L);}}};if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(I);C.InsertNode(I);if (FCKBrowserInfo.IsIE){C.MoveToElementEditStart(I);C.Select();};C.MoveToElementEditStart(G&&!H?F:I);};if (FCKBrowserInfo.IsGeckoLike) FCKDomTools.ScrollIntoView(F||I,false);C.Select();};C.Release();return true;};FCKEnterKey.prototype._ExecuteEnterBr=function(A){var B=new FCKDomRange(this.Window);B.MoveToSelection();if (B.StartBlockLimit==B.EndBlockLimit){B.DeleteContents();B.MoveToSelection();var C=B.CheckStartOfBlock();var D=B.CheckEndOfBlock();var E=B.StartBlock?B.StartBlock.tagName.toUpperCase():'';var F=this._HasShift;var G=false;if (!F&&E=='LI') return this._ExecuteEnterBlock(null,B);if (!F&&D&&(/^H[1-6]$/).test(E)){FCKDomTools.InsertAfterNode(B.StartBlock,this.Window.document.createElement('br'));if (FCKBrowserInfo.IsGecko) FCKDomTools.InsertAfterNode(B.StartBlock,this.Window.document.createTextNode(''));B.SetStart(B.StartBlock.nextSibling,FCKBrowserInfo.IsIE?3:1);}else{var H;G=E.IEquals('pre');if (G) H=this.Window.document.createTextNode(FCKBrowserInfo.IsIE?'\r':'\n');else H=this.Window.document.createElement('br');B.InsertNode(H);if (FCKBrowserInfo.IsGecko) FCKDomTools.InsertAfterNode(H,this.Window.document.createTextNode(''));if (D&&FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(H.parentNode);if (FCKBrowserInfo.IsIE) B.SetStart(H,4);else B.SetStart(H.nextSibling,1);if (!FCKBrowserInfo.IsIE){var I=null;if (FCKBrowserInfo.IsOpera) I=this.Window.document.createElement('span');else I=this.Window.document.createElement('br');H.parentNode.insertBefore(I,H.nextSibling);if (FCKBrowserInfo.IsSafari) FCKDomTools.ScrollIntoView(I,false);else I.scrollIntoView(false);I.parentNode.removeChild(I);}};B.Collapse(true);B.Select(G);};B.Release();return true;};FCKEnterKey.prototype._OutdentWithSelection=function(A,B){var C=B.CreateBookmark();FCKListHandler.OutdentListItem(A);B.MoveToBookmark(C);B.Select();};FCKEnterKey.prototype._CheckIsAllContentsIncluded=function(A,B){var C=false;var D=false;if (A.StartContainer==B||A.StartContainer==B.firstChild) C=(A._Range.startOffset==0);if (A.EndContainer==B||A.EndContainer==B.lastChild){var E=A.EndContainer.nodeType==3?A.EndContainer.length:A.EndContainer.childNodes.length;D=(A._Range.endOffset==E);};return C&&D;};FCKEnterKey.prototype._FixIESelectAllBug=function(A){var B=this.Window.document;B.body.innerHTML='';var C;if (FCKConfig.EnterMode.IEquals(['div','p'])){C=B.createElement(FCKConfig.EnterMode);B.body.appendChild(C);}else C=B.body;A.MoveToNodeContents(C);A.Collapse(true);A.Select();A.Release();};
-var FCKDocumentProcessor={};FCKDocumentProcessor._Items=[];FCKDocumentProcessor.AppendNew=function(){var A={};this._Items.AddItem(A);return A;};FCKDocumentProcessor.Process=function(A){var B=FCK.IsDirty();var C,i=0;while((C=this._Items[i++])) C.ProcessDocument(A);if (!B) FCK.ResetIsDirty();};var FCKDocumentProcessor_CreateFakeImage=function(A,B){var C=FCKTools.GetElementDocument(B).createElement('IMG');C.className=A;C.src=FCKConfig.BasePath+'images/spacer.gif';C.setAttribute('_fckfakelement','true',0);C.setAttribute('_fckrealelement',FCKTempBin.AddElement(B),0);return C;};if (FCKBrowserInfo.IsIE||FCKBrowserInfo.IsOpera){var FCKAnchorsProcessor=FCKDocumentProcessor.AppendNew();FCKAnchorsProcessor.ProcessDocument=function(A){var B=A.getElementsByTagName('A');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){if (C.name.length>0){if (C.innerHTML!==''){if (FCKBrowserInfo.IsIE) C.className+=' FCK__AnchorC';}else{var D=FCKDocumentProcessor_CreateFakeImage('FCK__Anchor',C.cloneNode(true));D.setAttribute('_fckanchor','true',0);C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}}}};var FCKPageBreaksProcessor=FCKDocumentProcessor.AppendNew();FCKPageBreaksProcessor.ProcessDocument=function(A){var B=A.getElementsByTagName('DIV');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){if (C.style.pageBreakAfter=='always'&&C.childNodes.length==1&&C.childNodes[0].style&&C.childNodes[0].style.display=='none'){var D=FCKDocumentProcessor_CreateFakeImage('FCK__PageBreak',C.cloneNode(true));C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}};FCKEmbedAndObjectProcessor=(function(){var A=[];var B=function(el){var C=el.cloneNode(true);var D;var E=D=FCKDocumentProcessor_CreateFakeImage('FCK__UnknownObject',C);FCKEmbedAndObjectProcessor.RefreshView(E,el);for (var i=0;i<A.length;i++) D=A[i](el,D)||D;if (D!=E) FCKTempBin.RemoveElement(E.getAttribute('_fckrealelement'));el.parentNode.replaceChild(D,el);};return FCKTools.Merge(FCKDocumentProcessor.AppendNew(),{ProcessDocument:function(doc){FCKTools.RunFunction(function(){var F=doc.getElementsByTagName('object');for (var i=F.length-1;i>=0;i--) B(F[i]);var G=doc.getElementsByTagName('embed');for (var i=G.length-1;i>=0;i--) B(G[i]);});},RefreshView:function(placeHolder,original){if (original.getAttribute('width')>0) placeHolder.style.width=FCKTools.ConvertHtmlSizeToStyle(original.getAttribute('width'));if (original.getAttribute('height')>0) placeHolder.style.height=FCKTools.ConvertHtmlSizeToStyle(original.getAttribute('height'));},AddCustomHandler:function(func){A.push(func);}});})();FCK.GetRealElement=function(A){var e=FCKTempBin.Elements[A.getAttribute('_fckrealelement')];if (A.getAttribute('_fckflash')){if (A.style.width.length>0) e.width=FCKTools.ConvertStyleSizeToHtml(A.style.width);if (A.style.height.length>0) e.height=FCKTools.ConvertStyleSizeToHtml(A.style.height);};return e;};if (FCKBrowserInfo.IsIE){FCKDocumentProcessor.AppendNew().ProcessDocument=function(A){var B=A.getElementsByTagName('HR');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){var D=A.createElement('hr');D.mergeAttributes(C,true);FCKDomTools.InsertAfterNode(C,D);C.parentNode.removeChild(C);}}};FCKDocumentProcessor.AppendNew().ProcessDocument=function(A){var B=A.getElementsByTagName('INPUT');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){if (C.type=='hidden'){var D=FCKDocumentProcessor_CreateFakeImage('FCK__InputHidden',C.cloneNode(true));D.setAttribute('_fckinputhidden','true',0);C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}};FCKEmbedAndObjectProcessor.AddCustomHandler(function(A,B){if (!(A.nodeName.IEquals('embed')&&(A.type=='application/x-shockwave-flash'||/\.swf($|#|\?)/i.test(A.src)))) return;B.className='FCK__Flash';B.setAttribute('_fckflash','true',0);});if (FCKBrowserInfo.IsSafari){FCKDocumentProcessor.AppendNew().ProcessDocument=function(A){var B=A.getElementsByClassName?A.getElementsByClassName('Apple-style-span'):Array.prototype.filter.call(A.getElementsByTagName('span'),function(item){ return item.className=='Apple-style-span';});for (var i=B.length-1;i>=0;i--) FCKDomTools.RemoveNode(B[i],true);}};
+var FCKEnterKey=function(A,B,C,D){this.Window=A;this.EnterMode=B||'p';this.ShiftEnterMode=C||'br';var E=new FCKKeystrokeHandler(false);E._EnterKey=this;E.OnKeystroke=FCKEnterKey_OnKeystroke;E.SetKeystrokes([[13,'Enter'],[SHIFT+13,'ShiftEnter'],[8,'Backspace'],[CTRL+8,'CtrlBackspace'],[46,'Delete']]);this.TabText='';if (D>0||FCKBrowserInfo.IsSafari){while (D--) this.TabText+='\xa0';E.SetKeystrokes([9,'Tab']);};E.AttachToElement(A.document);};function FCKEnterKey_OnKeystroke(A,B){var C=this._EnterKey;try{switch (B){case 'Enter':return C.DoEnter();break;case 'ShiftEnter':return C.DoShiftEnter();break;case 'Backspace':return C.DoBackspace();break;case 'Delete':return C.DoDelete();break;case 'Tab':return C.DoTab();break;case 'CtrlBackspace':return C.DoCtrlBackspace();break;}}catch (e){};return false;};FCKEnterKey.prototype.DoEnter=function(A,B){FCKUndo.SaveUndoStep();this._HasShift=(B===true);var C=FCKSelection.GetParentElement();var D=new FCKElementPath(C);var E=A||this.EnterMode;if (E=='br'||D.Block&&D.Block.tagName.toLowerCase()=='pre') return this._ExecuteEnterBr();else return this._ExecuteEnterBlock(E);};FCKEnterKey.prototype.DoShiftEnter=function(){return this.DoEnter(this.ShiftEnterMode,true);};FCKEnterKey.prototype.DoBackspace=function(){var A=false;var B=new FCKDomRange(this.Window);B.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(B,this.Window.document.body)){this._FixIESelectAllBug(B);return true;};var C=B.CheckIsCollapsed();if (!C){if (FCKBrowserInfo.IsIE&&this.Window.document.selection.type.toLowerCase()=="control"){var D=this.Window.document.selection.createRange();for (var i=D.length-1;i>=0;i--){var E=D.item(i);E.parentNode.removeChild(E);};return true;};return false;};if (FCKBrowserInfo.IsIE){var F=FCKDomTools.GetPreviousSourceElement(B.StartNode,true);if (F&&F.nodeName.toLowerCase()=='br'){var G=B.Clone();G.SetStart(F,4);if (G.CheckIsEmpty()){F.parentNode.removeChild(F);return true;}}};var H=B.StartBlock;var I=B.EndBlock;if (B.StartBlockLimit==B.EndBlockLimit&&H&&I){if (!C){var J=B.CheckEndOfBlock();B.DeleteContents();if (H!=I){B.SetStart(I,1);B.SetEnd(I,1);};B.Select();A=(H==I);};if (B.CheckStartOfBlock()){var K=B.StartBlock;var L=FCKDomTools.GetPreviousSourceElement(K,true,['BODY',B.StartBlockLimit.nodeName],['UL','OL']);A=this._ExecuteBackspace(B,L,K);}else if (FCKBrowserInfo.IsGeckoLike){B.Select();}};B.Release();return A;};FCKEnterKey.prototype.DoCtrlBackspace=function(){FCKUndo.SaveUndoStep();var A=new FCKDomRange(this.Window);A.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(A,this.Window.document.body)){this._FixIESelectAllBug(A);return true;};return false;};FCKEnterKey.prototype._ExecuteBackspace=function(A,B,C){var D=false;if (!B&&C&&C.nodeName.IEquals('LI')&&C.parentNode.parentNode.nodeName.IEquals('LI')){this._OutdentWithSelection(C,A);return true;};if (B&&B.nodeName.IEquals('LI')){var E=FCKDomTools.GetLastChild(B,['UL','OL']);while (E){B=FCKDomTools.GetLastChild(E,'LI');E=FCKDomTools.GetLastChild(B,['UL','OL']);}};if (B&&C){if (C.nodeName.IEquals('LI')&&!B.nodeName.IEquals('LI')){this._OutdentWithSelection(C,A);return true;};var F=C.parentNode;var G=B.nodeName.toLowerCase();if (FCKListsLib.EmptyElements[G]!=null||G=='table'){FCKDomTools.RemoveNode(B);D=true;}else{FCKDomTools.RemoveNode(C);while (F.innerHTML.Trim().length==0){var H=F.parentNode;H.removeChild(F);F=H;};FCKDomTools.LTrimNode(C);FCKDomTools.RTrimNode(B);A.SetStart(B,2,true);A.Collapse(true);var I=A.CreateBookmark(true);if (!C.tagName.IEquals(['TABLE'])) FCKDomTools.MoveChildren(C,B);A.SelectBookmark(I);D=true;}};return D;};FCKEnterKey.prototype.DoDelete=function(){FCKUndo.SaveUndoStep();var A=false;var B=new FCKDomRange(this.Window);B.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(B,this.Window.document.body)){this._FixIESelectAllBug(B);return true;};if (B.CheckIsCollapsed()&&B.CheckEndOfBlock(FCKBrowserInfo.IsGeckoLike)){var C=B.StartBlock;var D=FCKTools.GetElementAscensor(C,'td');var E=FCKDomTools.GetNextSourceElement(C,true,[B.StartBlockLimit.nodeName],['UL','OL','TR'],true);if (D){var F=FCKTools.GetElementAscensor(E,'td');if (F!=D) return true;};A=this._ExecuteBackspace(B,C,E);};B.Release();return A;};FCKEnterKey.prototype.DoTab=function(){var A=new FCKDomRange(this.Window);A.MoveToSelection();var B=A._Range.startContainer;while (B){if (B.nodeType==1){var C=B.tagName.toLowerCase();if (C=="tr"||C=="td"||C=="th"||C=="tbody"||C=="table") return false;else break;};B=B.parentNode;};if (this.TabText){A.DeleteContents();A.InsertNode(this.Window.document.createTextNode(this.TabText));A.Collapse(false);A.Select();};return true;};FCKEnterKey.prototype._ExecuteEnterBlock=function(A,B){var C=B||new FCKDomRange(this.Window);var D=C.SplitBlock(A);if (D){var E=D.PreviousBlock;var F=D.NextBlock;var G=D.WasStartOfBlock;var H=D.WasEndOfBlock;if (F){if (F.parentNode.nodeName.IEquals('li')){FCKDomTools.BreakParent(F,F.parentNode);FCKDomTools.MoveNode(F,F.nextSibling,true);}}else if (E&&E.parentNode.nodeName.IEquals('li')){FCKDomTools.BreakParent(E,E.parentNode);C.MoveToElementEditStart(E.nextSibling);FCKDomTools.MoveNode(E,E.previousSibling);};if (!G&&!H){if (F.nodeName.IEquals('li')&&F.firstChild&&F.firstChild.nodeName.IEquals(['ul','ol'])) F.insertBefore(FCKTools.GetElementDocument(F).createTextNode('\xa0'),F.firstChild);if (F) C.MoveToElementEditStart(F);}else{if (G&&H&&E.tagName.toUpperCase()=='LI'){C.MoveToElementStart(E);this._OutdentWithSelection(E,C);C.Release();return true;};var I;if (E){var J=E.tagName.toUpperCase();if (!this._HasShift&&!(/^H[1-6]$/).test(J)){I=FCKDomTools.CloneElement(E);}}else if (F) I=FCKDomTools.CloneElement(F);if (!I) I=this.Window.document.createElement(A);var K=D.ElementPath;if (K){for (var i=0,len=K.Elements.length;i<len;i++){var L=K.Elements[i];if (L==K.Block||L==K.BlockLimit) break;if (FCKListsLib.InlineChildReqElements[L.nodeName.toLowerCase()]){L=FCKDomTools.CloneElement(L);FCKDomTools.MoveChildren(I,L);I.appendChild(L);}}};if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(I);C.InsertNode(I);if (FCKBrowserInfo.IsIE){C.MoveToElementEditStart(I);C.Select();};C.MoveToElementEditStart(G&&!H?F:I);};if (FCKBrowserInfo.IsGeckoLike) FCKDomTools.ScrollIntoView(F||I,false);C.Select();};C.Release();return true;};FCKEnterKey.prototype._ExecuteEnterBr=function(A){var B=new FCKDomRange(this.Window);B.MoveToSelection();if (B.StartBlockLimit==B.EndBlockLimit){B.DeleteContents();B.MoveToSelection();var C=B.CheckStartOfBlock();var D=B.CheckEndOfBlock();var E=B.StartBlock?B.StartBlock.tagName.toUpperCase():'';var F=this._HasShift;var G=false;if (!F&&E=='LI') return this._ExecuteEnterBlock(null,B);if (!F&&D&&(/^H[1-6]$/).test(E)){FCKDomTools.InsertAfterNode(B.StartBlock,this.Window.document.createElement('br'));if (FCKBrowserInfo.IsGecko) FCKDomTools.InsertAfterNode(B.StartBlock,this.Window.document.createTextNode(''));B.SetStart(B.StartBlock.nextSibling,FCKBrowserInfo.IsIE?3:1);}else{var H;G=E.IEquals('pre');if (G) H=this.Window.document.createTextNode(FCKBrowserInfo.IsIE?'\r':'\n');else H=this.Window.document.createElement('br');B.InsertNode(H);if (FCKBrowserInfo.IsGecko) FCKDomTools.InsertAfterNode(H,this.Window.document.createTextNode(''));if (D&&FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(H.parentNode);if (FCKBrowserInfo.IsIE) B.SetStart(H,4);else B.SetStart(H.nextSibling,1);if (!FCKBrowserInfo.IsIE){var I=null;if (FCKBrowserInfo.IsOpera) I=this.Window.document.createElement('span');else I=this.Window.document.createElement('br');H.parentNode.insertBefore(I,H.nextSibling);FCKDomTools.ScrollIntoView(I,false);I.parentNode.removeChild(I);}};B.Collapse(true);B.Select(G);};B.Release();return true;};FCKEnterKey.prototype._OutdentWithSelection=function(A,B){var C=B.CreateBookmark();FCKListHandler.OutdentListItem(A);B.MoveToBookmark(C);B.Select();};FCKEnterKey.prototype._CheckIsAllContentsIncluded=function(A,B){var C=false;var D=false;if (A.StartContainer==B||A.StartContainer==B.firstChild) C=(A._Range.startOffset==0);if (A.EndContainer==B||A.EndContainer==B.lastChild){var E=A.EndContainer.nodeType==3?A.EndContainer.length:A.EndContainer.childNodes.length;D=(A._Range.endOffset==E);};return C&&D;};FCKEnterKey.prototype._FixIESelectAllBug=function(A){var B=this.Window.document;B.body.innerHTML='';var C;if (FCKConfig.EnterMode.IEquals(['div','p'])){C=B.createElement(FCKConfig.EnterMode);B.body.appendChild(C);}else C=B.body;A.MoveToNodeContents(C);A.Collapse(true);A.Select();A.Release();};
+var FCKDocumentProcessor={};FCKDocumentProcessor._Items=[];FCKDocumentProcessor.AppendNew=function(){var A={};this._Items.AddItem(A);return A;};FCKDocumentProcessor.Process=function(A){var B=FCK.IsDirty();var C,i=0;while((C=this._Items[i++])) C.ProcessDocument(A);if (!B) FCK.ResetIsDirty();};var FCKDocumentProcessor_CreateFakeImage=function(A,B){var C=FCKTools.GetElementDocument(B).createElement('IMG');C.className=A;C.src=FCKConfig.BasePath+'images/spacer.gif';C.setAttribute('_fckfakelement','true',0);C.setAttribute('_fckrealelement',FCKTempBin.AddElement(B),0);return C;};if (FCKBrowserInfo.IsIE||FCKBrowserInfo.IsOpera){var FCKAnchorsProcessor=FCKDocumentProcessor.AppendNew();FCKAnchorsProcessor.ProcessDocument=function(A){var B=A.getElementsByTagName('A');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){if (C.name.length>0){if (C.innerHTML!==''){if (FCKBrowserInfo.IsIE) C.className+=' FCK__AnchorC';}else{var D=FCKDocumentProcessor_CreateFakeImage('FCK__Anchor',C.cloneNode(true));D.setAttribute('_fckanchor','true',0);C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}}}};var FCKPageBreaksProcessor=FCKDocumentProcessor.AppendNew();FCKPageBreaksProcessor.ProcessDocument=function(A){var B=A.getElementsByTagName('DIV');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){if (C.style.pageBreakAfter=='always'&&C.childNodes.length==1&&C.childNodes[0].style&&C.childNodes[0].style.display=='none'){var D=FCKDocumentProcessor_CreateFakeImage('FCK__PageBreak',C.cloneNode(true));C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}};FCKEmbedAndObjectProcessor=(function(){var A=[];var B=function(el){var C=el.cloneNode(true);var D;var E=D=FCKDocumentProcessor_CreateFakeImage('FCK__UnknownObject',C);FCKEmbedAndObjectProcessor.RefreshView(E,el);for (var i=0;i<A.length;i++) D=A[i](el,D)||D;if (D!=E) FCKTempBin.RemoveElement(E.getAttribute('_fckrealelement'));el.parentNode.replaceChild(D,el);};var F=function(elementName,doc){var G=doc.getElementsByTagName(elementName);for (var i=G.length-1;i>=0;i--) B(G[i]);};var H=function(doc){F('object',doc);F('embed',doc);};return FCKTools.Merge(FCKDocumentProcessor.AppendNew(),{ProcessDocument:function(doc){if (FCKBrowserInfo.IsGecko) FCKTools.RunFunction(H,this,[doc]);else H(doc);},RefreshView:function(placeHolder,original){if (original.getAttribute('width')>0) placeHolder.style.width=FCKTools.ConvertHtmlSizeToStyle(original.getAttribute('width'));if (original.getAttribute('height')>0) placeHolder.style.height=FCKTools.ConvertHtmlSizeToStyle(original.getAttribute('height'));},AddCustomHandler:function(func){A.push(func);}});})();FCK.GetRealElement=function(A){var e=FCKTempBin.Elements[A.getAttribute('_fckrealelement')];if (A.getAttribute('_fckflash')){if (A.style.width.length>0) e.width=FCKTools.ConvertStyleSizeToHtml(A.style.width);if (A.style.height.length>0) e.height=FCKTools.ConvertStyleSizeToHtml(A.style.height);};return e;};if (FCKBrowserInfo.IsIE){FCKDocumentProcessor.AppendNew().ProcessDocument=function(A){var B=A.getElementsByTagName('HR');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){var D=A.createElement('hr');D.mergeAttributes(C,true);FCKDomTools.InsertAfterNode(C,D);C.parentNode.removeChild(C);}}};FCKDocumentProcessor.AppendNew().ProcessDocument=function(A){var B=A.getElementsByTagName('INPUT');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){if (C.type=='hidden'){var D=FCKDocumentProcessor_CreateFakeImage('FCK__InputHidden',C.cloneNode(true));D.setAttribute('_fckinputhidden','true',0);C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}};FCKEmbedAndObjectProcessor.AddCustomHandler(function(A,B){if (!(A.nodeName.IEquals('embed')&&(A.type=='application/x-shockwave-flash'||/\.swf($|#|\?)/i.test(A.src)))) return;B.className='FCK__Flash';B.setAttribute('_fckflash','true',0);});if (FCKBrowserInfo.IsSafari){FCKDocumentProcessor.AppendNew().ProcessDocument=function(A){var B=A.getElementsByClassName?A.getElementsByClassName('Apple-style-span'):Array.prototype.filter.call(A.getElementsByTagName('span'),function(item){ return item.className=='Apple-style-span';});for (var i=B.length-1;i>=0;i--) FCKDomTools.RemoveNode(B[i],true);}};
var FCKSelection=FCK.Selection={GetParentBlock:function(){var A=this.GetParentElement();while (A){if (FCKListsLib.BlockBoundaries[A.nodeName.toLowerCase()]) break;A=A.parentNode;};return A;},ApplyStyle:function(A){FCKStyles.ApplyStyle(new FCKStyle(A));}};
-FCKSelection.GetType=function(){var A='Text';var B;try { B=this.GetSelection();} catch (e) {};if (B&&B.rangeCount==1){var C=B.getRangeAt(0);if (C.startContainer==C.endContainer&&(C.endOffset-C.startOffset)==1&&C.startContainer.nodeType==1&&FCKListsLib.StyleObjectElements[C.startContainer.childNodes[C.startOffset].nodeName.toLowerCase()]){A='Control';}};return A;};FCKSelection.GetSelectedElement=function(){var A=!!FCK.EditorWindow&&this.GetSelection();if (!A||A.rangeCount<1) return null;var B=A.getRangeAt(0);if (B.startContainer!=B.endContainer||B.startContainer.nodeType!=1||B.startOffset!=B.endOffset-1) return null;var C=B.startContainer.childNodes[B.startOffset];if (C.nodeType!=1) return null;return C;};FCKSelection.GetParentElement=function(){if (this.GetType()=='Control') return FCKSelection.GetSelectedElement().parentNode;else{var A=this.GetSelection();if (A){if (A.anchorNode&&A.anchorNode==A.focusNode) return A.anchorNode.parentNode;var B=new FCKElementPath(A.anchorNode);var C=new FCKElementPath(A.focusNode);var D=null;var E=null;if (B.Elements.length>C.Elements.length){D=B.Elements;E=C.Elements;}else{D=C.Elements;E=B.Elements;};var F=D.length-E.length;for(var i=0;i<E.length;i++){if (D[F+i]==E[i]) return E[i];};return null;}};return null;};FCKSelection.GetBoundaryParentElement=function(A){if (!FCK.EditorWindow) return null;if (this.GetType()=='Control') return FCKSelection.GetSelectedElement().parentNode;else{var B=this.GetSelection();if (B&&B.rangeCount>0){var C=B.getRangeAt(A?0:(B.rangeCount-1));var D=A?C.startContainer:C.endContainer;return (D.nodeType==1?D:D.parentNode);}};return null;};FCKSelection.SelectNode=function(A){var B=FCK.EditorDocument.createRange();B.selectNode(A);var C=this.GetSelection();C.removeAllRanges();C.addRange(B);};FCKSelection.Collapse=function(A){var B=this.GetSelection();if (A==null||A===true) B.collapseToStart();else B.collapseToEnd();};FCKSelection.HasAncestorNode=function(A){var B=this.GetSelectedElement();if (!B&&FCK.EditorWindow){try { B=this.GetSelection().getRangeAt(0).startContainer;}catch(e){}}while (B){if (B.nodeType==1&&B.nodeName.IEquals(A)) return true;B=B.parentNode;};return false;};FCKSelection.MoveToAncestorNode=function(A){var B;var C=this.GetSelectedElement();if (!C) C=this.GetSelection().getRangeAt(0).startContainer;while (C){if (C.nodeName.IEquals(A)) return C;C=C.parentNode;};return null;};FCKSelection.Delete=function(){var A=this.GetSelection();for (var i=0;i<A.rangeCount;i++){A.getRangeAt(i).deleteContents();};return A;};FCKSelection.GetSelection=function(){return FCK.EditorWindow.getSelection();};FCKSelection.Save=function(){};FCKSelection.Restore=function(){};FCKSelection.Release=function(){};
-var FCKTableHandler={};FCKTableHandler.InsertRow=function(A){var B=FCKSelection.MoveToAncestorNode('TR');if (!B) return;var C=B.cloneNode(true);B.parentNode.insertBefore(C,B);FCKTableHandler.ClearRow(A?C:B);};FCKTableHandler.DeleteRows=function(A){if (!A){var B=FCKTableHandler.GetSelectedCells();var C=[];for (var i=0;i<B.length;i++){var D=FCKTools.GetElementAscensor(B[i],'TR');C[D.rowIndex]=D;};for (var i=C.length;i>=0;i--){if (C[i]) FCKTableHandler.DeleteRows(C[i]);};return;};var E=FCKTools.GetElementAscensor(A,'TABLE');if (E.rows.length==1){FCKTableHandler.DeleteTable(E);return;};A.parentNode.removeChild(A);};FCKTableHandler.DeleteTable=function(A){if (!A){A=FCKSelection.GetSelectedElement();if (!A||A.tagName!='TABLE') A=FCKSelection.MoveToAncestorNode('TABLE');};if (!A) return;FCKSelection.SelectNode(A);FCKSelection.Collapse();if (A.parentNode.childNodes.length==1) A.parentNode.parentNode.removeChild(A.parentNode);else A.parentNode.removeChild(A);};FCKTableHandler.InsertColumn=function(A){var B=null;var C=this.GetSelectedCells();if (C&&C.length) B=C[A?0:(C.length-1)];if (!B) return;var D=FCKTools.GetElementAscensor(B,'TABLE');var E=B.cellIndex;for (var i=0;i<D.rows.length;i++){var F=D.rows[i];if (F.cells.length<(E+1)) continue;B=F.cells[E].cloneNode(false);if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(B);var G=F.cells[E];if (A) F.insertBefore(B,G);else if (G.nextSibling) F.insertBefore(B,G.nextSibling);else F.appendChild(B);}};FCKTableHandler.DeleteColumns=function(A){if (!A){var B=FCKTableHandler.GetSelectedCells();for (var i=B.length;i>=0;i--){if (B[i]) FCKTableHandler.DeleteColumns(B[i]);};return;};if (!A) return;var C=FCKTools.GetElementAscensor(A,'TABLE');var D=A.cellIndex;for (var i=C.rows.length-1;i>=0;i--){var E=C.rows[i];if (D==0&&E.cells.length==1){FCKTableHandler.DeleteRows(E);continue;};if (E.cells[D]) E.removeChild(E.cells[D]);}};FCKTableHandler.InsertCell=function(A,B){var C=null;var D=this.GetSelectedCells();if (D&&D.length) C=D[B?0:(D.length-1)];if (!C) return null;var E=FCK.EditorDocument.createElement('TD');if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(E);if (!B&&C.cellIndex==C.parentNode.cells.length-1) C.parentNode.appendChild(E);else C.parentNode.insertBefore(E,B?C:C.nextSibling);return E;};FCKTableHandler.DeleteCell=function(A){if (A.parentNode.cells.length==1){FCKTableHandler.DeleteRows(FCKTools.GetElementAscensor(A,'TR'));return;};A.parentNode.removeChild(A);};FCKTableHandler.DeleteCells=function(){var A=FCKTableHandler.GetSelectedCells();for (var i=A.length-1;i>=0;i--){FCKTableHandler.DeleteCell(A[i]);}};FCKTableHandler._MarkCells=function(A,B){for (var i=0;i<A.length;i++) A[i][B]=true;};FCKTableHandler._UnmarkCells=function(A,B){for (var i=0;i<A.length;i++){if (FCKBrowserInfo.IsIE) A[i].removeAttribute(B);else delete A[i][B];}};FCKTableHandler._ReplaceCellsByMarker=function(A,B,C){for (var i=0;i<A.length;i++){for (var j=0;j<A[i].length;j++){if (A[i][j][B]) A[i][j]=C;}}};FCKTableHandler._GetMarkerGeometry=function(A,B,C,D){var E=0;var F=0;var G=0;var H=0;for (var i=C;A[B][i]&&A[B][i][D];i++) E++;for (var i=C-1;A[B][i]&&A[B][i][D];i--){E++;G++;};for (var i=B;A[i]&&A[i][C]&&A[i][C][D];i++) F++;for (var i=B-1;A[i]&&A[i][C]&&A[i][C][D];i--){F++;H++;};return { 'width':E,'height':F,'x':G,'y':H };};FCKTableHandler.CheckIsSelectionRectangular=function(){var A=FCKTableHandler.GetSelectedCells();if (A.length<1) return false;this._MarkCells(A,'_CellSelected');var B=this._CreateTableMap(A[0].parentNode.parentNode);var C=A[0].parentNode.rowIndex;var D=this._GetCellIndexSpan(B,C,A[0]);var E=this._GetMarkerGeometry(B,C,D,'_CellSelected');var F=D-E.x;var G=C-E.y;if (E.width>=E.height){for (D=F;D<F+E.width;D++){C=G+(D-F) % E.height;if (!B[C]||!B[C][D]){this._UnmarkCells(A,'_CellSelected');return false;};var g=this._GetMarkerGeometry(B,C,D,'_CellSelected');if (g.width!=E.width||g.height!=E.height){this._UnmarkCells(A,'_CellSelected');return false;}}}else{for (C=G;C<G+E.height;C++){D=F+(C-G) % E.width;if (!B[C]||!B[C][D]){this._UnmarkCells(A,'_CellSelected');return false;};var g=this._GetMarkerGeometry(B,C,D,'_CellSelected');if (g.width!=E.width||g.height!=E.height){this._UnmarkCells(A,'_CellSelected');return false;}}};this._UnmarkCells(A,'_CellSelected');return true;};FCKTableHandler.MergeCells=function(){var A=this.GetSelectedCells();if (A.length<2) return;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=B.parentNode.rowIndex;var E=this._GetCellIndexSpan(C,D,B);this._MarkCells(A,'_SelectedCells');var F=this._GetMarkerGeometry(C,D,E,'_SelectedCells');var G=E-F.x;var H=D-F.y;var I=FCKTools.GetElementDocument(B).createDocumentFragment();for (var i=0;i<F.height;i++){var J=0;for (var j=0;j<F.width;j++){var K=C[H+i][G+j];while (K.childNodes.length>0){var L=K.removeChild(K.firstChild);if (L.nodeType!=1||(L.getAttribute('type',2)!='_moz'&&L.getAttribute('_moz_dirty')!=null)){I.appendChild(L);J++;}}};if (J>0) I.appendChild(FCKTools.GetElementDocument(B).createElement('br'));};this._ReplaceCellsByMarker(C,'_SelectedCells',B);this._UnmarkCells(A,'_SelectedCells');this._InstallTableMap(C,B.parentNode.parentNode);B.appendChild(I);if (FCKBrowserInfo.IsGeckoLike&&(!B.firstChild)) FCKTools.AppendBogusBr(B);this._MoveCaretToCell(B,false);};FCKTableHandler.MergeRight=function(){var A=this.GetMergeRightTarget();if (A==null) return;var B=A.refCell;var C=A.tableMap;var D=A.nextCell;var E=FCK.EditorDocument.createDocumentFragment();while (D&&D.childNodes&&D.childNodes.length>0) E.appendChild(D.removeChild(D.firstChild));D.parentNode.removeChild(D);B.appendChild(E);this._MarkCells([D],'_Replace');this._ReplaceCellsByMarker(C,'_Replace',B);this._InstallTableMap(C,B.parentNode.parentNode);this._MoveCaretToCell(B,false);};FCKTableHandler.MergeDown=function(){var A=this.GetMergeDownTarget();if (A==null) return;var B=A.refCell;var C=A.tableMap;var D=A.nextCell;var E=FCKTools.GetElementDocument(B).createDocumentFragment();while (D&&D.childNodes&&D.childNodes.length>0) E.appendChild(D.removeChild(D.firstChild));if (E.firstChild) E.insertBefore(FCKTools.GetElementDocument(D).createElement('br'),E.firstChild);B.appendChild(E);this._MarkCells([D],'_Replace');this._ReplaceCellsByMarker(C,'_Replace',B);this._InstallTableMap(C,B.parentNode.parentNode);this._MoveCaretToCell(B,false);};FCKTableHandler.HorizontalSplitCell=function(){var A=FCKTableHandler.GetSelectedCells();if (A.length!=1) return;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=B.parentNode.rowIndex;var E=FCKTableHandler._GetCellIndexSpan(C,D,B);var F=isNaN(B.colSpan)?1:B.colSpan;if (F>1){var G=Math.ceil(F/2);var H=FCKTools.GetElementDocument(B).createElement('td');if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(H);var I=E+G;var J=E+F;var K=isNaN(B.rowSpan)?1:B.rowSpan;for (var r=D;r<D+K;r++){for (var i=I;i<J;i++) C[r][i]=H;}}else{var L=[];for (var i=0;i<C.length;i++){var M=C[i].slice(0,E);if (C[i].length<=E){L.push(M);continue;};if (C[i][E]==B){M.push(B);M.push(FCKTools.GetElementDocument(B).createElement('td'));if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(M[M.length-1]);}else{M.push(C[i][E]);M.push(C[i][E]);};for (var j=E+1;j<C[i].length;j++) M.push(C[i][j]);L.push(M);};C=L;};this._InstallTableMap(C,B.parentNode.parentNode);};FCKTableHandler.VerticalSplitCell=function(){var A=FCKTableHandler.GetSelectedCells();if (A.length!=1) return;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=FCKTableHandler._GetCellIndexSpan(C,B.parentNode.rowIndex,B);var E=B.rowSpan;var F=B.parentNode.rowIndex;if (isNaN(E)) E=1;if (E>1){B.rowSpan=Math.ceil(E/2);var G=F+Math.ceil(E/2);var H=null;for (var i=D+1;i<C[G].length;i++){if (C[G][i].parentNode.rowIndex==G){H=C[G][i];break;}};var I=FCK.EditorDocument.createElement('td');I.rowSpan=Math.floor(E/2);if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(I);B.parentNode.parentNode.rows[G].insertBefore(I,H);}else{var G=F+1;var K=FCK.EditorDocument.createElement('tr');B.parentNode.parentNode.insertBefore(K,B.parentNode.parentNode.rows[G]);for (var i=0;i<C[F].length;){var L=C[F][i].colSpan;if (isNaN(L)||L<1) L=1;if (i==D){i+=L;continue;};var M=C[F][i].rowSpan;if (isNaN(M)) M=1;C[F][i].rowSpan=M+1;i+=L;};var I=FCK.EditorDocument.createElement('td');if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(I);K.appendChild(I);}};FCKTableHandler._GetCellIndexSpan=function(A,B,C){if (A.length<B+1) return null;var D=A[B];for (var c=0;c<D.length;c++){if (D[c]==C) return c;};return null;};FCKTableHandler._GetCellLocation=function(A,B){for (var i=0;i<A.length;i++){for (var c=0;c<A[i].length;c++){if (A[i][c]==B) return [i,c];}};return null;};FCKTableHandler._GetColumnCells=function(A,B){var C=[];for (var r=0;r<A.length;r++){var D=A[r][B];if (D&&(C.length==0||C[C.length-1]!=D)) C[C.length]=D;};return C;};FCKTableHandler._CreateTableMap=function(A){var B=A.rows;var r=-1;var C=[];for (var i=0;i<B.length;i++){r++;if (!C[r]) C[r]=[];var c=-1;for (var j=0;j<B[i].cells.length;j++){var D=B[i].cells[j];c++;while (C[r][c]) c++;var E=isNaN(D.colSpan)?1:D.colSpan;var F=isNaN(D.rowSpan)?1:D.rowSpan;for (var G=0;G<F;G++){if (!C[r+G]) C[r+G]=[];for (var H=0;H<E;H++){C[r+G][c+H]=B[i].cells[j];}};c+=E-1;}};return C;};FCKTableHandler._InstallTableMap=function(A,B){while (B.rows.length>0){var C=B.rows[0];C.parentNode.removeChild(C);};for (var i=0;i<A.length;i++){for (var j=0;j<A[i].length;j++){var D=A[i][j];if (D.parentNode) D.parentNode.removeChild(D);D.colSpan=D.rowSpan=1;}};var E=0;for (var i=0;i<A.length;i++){for (var j=0;j<A[i].length;j++){var D=A[i][j];if (!D) continue;if (j>E) E=j;if (D._colScanned===true) continue;if (A[i][j-1]==D) D.colSpan++;if (A[i][j+1]!=D) D._colScanned=true;}};for (var i=0;i<=E;i++){for (var j=0;j<A.length;j++){if (!A[j]) continue;var D=A[j][i];if (!D||D._rowScanned===true) continue;if (A[j-1]&&A[j-1][i]==D) D.rowSpan++;if (!A[j+1]||A[j+1][i]!=D) D._rowScanned=true;}};for (var i=0;i<A.length;i++){for (var j=0;j<A[i].length;j++){var D=A[i][j];if (FCKBrowserInfo.IsIE){D.removeAttribute('_colScanned');D.removeAttribute('_rowScanned');}else{delete D._colScanned;delete D._rowScanned;}}};for (var i=0;i<A.length;i++){var I=FCKTools.GetElementDocument(B).createElement('tr');for (var j=0;j<A[i].length;){var D=A[i][j];if (A[i-1]&&A[i-1][j]==D){j+=D.colSpan;continue;};I.appendChild(D);j+=D.colSpan;if (D.colSpan==1) D.removeAttribute('colspan');if (D.rowSpan==1) D.removeAttribute('rowspan');};B.appendChild(I);}};FCKTableHandler._MoveCaretToCell=function (A,B){var C=new FCKDomRange(FCK.EditorWindow);C.MoveToNodeContents(A);C.Collapse(B);C.Select();};FCKTableHandler.ClearRow=function(A){var B=A.cells;for (var i=0;i<B.length;i++){B[i].innerHTML='';if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(B[i]);}};FCKTableHandler.GetMergeRightTarget=function(){var A=this.GetSelectedCells();if (A.length!=1) return null;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=B.parentNode.rowIndex;var E=this._GetCellIndexSpan(C,D,B);var F=E+(isNaN(B.colSpan)?1:B.colSpan);var G=C[D][F];if (!G) return null;this._MarkCells([B,G],'_SizeTest');var H=this._GetMarkerGeometry(C,D,E,'_SizeTest');var I=this._GetMarkerGeometry(C,D,F,'_SizeTest');this._UnmarkCells([B,G],'_SizeTest');if (H.height!=I.height||H.y!=I.y) return null;return { 'refCell':B,'nextCell':G,'tableMap':C };};FCKTableHandler.GetMergeDownTarget=function(){var A=this.GetSelectedCells();if (A.length!=1) return null;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=B.parentNode.rowIndex;var E=this._GetCellIndexSpan(C,D,B);var F=D+(isNaN(B.rowSpan)?1:B.rowSpan);if (!C[F]) return null;var G=C[F][E];if (!G) return null;this._MarkCells([B,G],'_SizeTest');var H=this._GetMarkerGeometry(C,D,E,'_SizeTest');var I=this._GetMarkerGeometry(C,F,E,'_SizeTest');this._UnmarkCells([B,G],'_SizeTest');if (H.width!=I.width||H.x!=I.x) return null;return { 'refCell':B,'nextCell':G,'tableMap':C };};
+FCKSelection.GetType=function(){var A='Text';var B;try { B=this.GetSelection();} catch (e) {};if (B&&B.rangeCount==1){var C=B.getRangeAt(0);if (C.startContainer==C.endContainer&&(C.endOffset-C.startOffset)==1&&C.startContainer.nodeType==1&&FCKListsLib.StyleObjectElements[C.startContainer.childNodes[C.startOffset].nodeName.toLowerCase()]){A='Control';}};return A;};FCKSelection.GetSelectedElement=function(){var A=!!FCK.EditorWindow&&this.GetSelection();if (!A||A.rangeCount<1) return null;var B=A.getRangeAt(0);if (B.startContainer!=B.endContainer||B.startContainer.nodeType!=1||B.startOffset!=B.endOffset-1) return null;var C=B.startContainer.childNodes[B.startOffset];if (C.nodeType!=1) return null;return C;};FCKSelection.GetParentElement=function(){if (this.GetType()=='Control') return FCKSelection.GetSelectedElement().parentNode;else{var A=this.GetSelection();if (A){if (A.anchorNode&&A.anchorNode==A.focusNode){var B=A.getRangeAt(0);if (B.collapsed||B.startContainer.nodeType==3) return A.anchorNode.parentNode;else return A.anchorNode;};var C=new FCKElementPath(A.anchorNode);var D=new FCKElementPath(A.focusNode);var E=null;var F=null;if (C.Elements.length>D.Elements.length){E=C.Elements;F=D.Elements;}else{E=D.Elements;F=C.Elements;};var G=E.length-F.length;for(var i=0;i<F.length;i++){if (E[G+i]==F[i]) return F[i];};return null;}};return null;};FCKSelection.GetBoundaryParentElement=function(A){if (!FCK.EditorWindow) return null;if (this.GetType()=='Control') return FCKSelection.GetSelectedElement().parentNode;else{var B=this.GetSelection();if (B&&B.rangeCount>0){var C=B.getRangeAt(A?0:(B.rangeCount-1));var D=A?C.startContainer:C.endContainer;return (D.nodeType==1?D:D.parentNode);}};return null;};FCKSelection.SelectNode=function(A){var B=FCK.EditorDocument.createRange();B.selectNode(A);var C=this.GetSelection();C.removeAllRanges();C.addRange(B);};FCKSelection.Collapse=function(A){var B=this.GetSelection();if (A==null||A===true) B.collapseToStart();else B.collapseToEnd();};FCKSelection.HasAncestorNode=function(A){var B=this.GetSelectedElement();if (!B&&FCK.EditorWindow){try { B=this.GetSelection().getRangeAt(0).startContainer;}catch(e){}}while (B){if (B.nodeType==1&&B.nodeName.IEquals(A)) return true;B=B.parentNode;};return false;};FCKSelection.MoveToAncestorNode=function(A){var B;var C=this.GetSelectedElement();if (!C) C=this.GetSelection().getRangeAt(0).startContainer;while (C){if (C.nodeName.IEquals(A)) return C;C=C.parentNode;};return null;};FCKSelection.Delete=function(){var A=this.GetSelection();for (var i=0;i<A.rangeCount;i++){A.getRangeAt(i).deleteContents();};return A;};FCKSelection.GetSelection=function(){return FCK.EditorWindow.getSelection();};FCKSelection.Save=function(){};FCKSelection.Restore=function(){};FCKSelection.Release=function(){};
+var FCKTableHandler={};FCKTableHandler.InsertRow=function(A){var B=FCKSelection.MoveToAncestorNode('TR');if (!B) return;var C=B.cloneNode(true);B.parentNode.insertBefore(C,B);FCKTableHandler.ClearRow(A?C:B);};FCKTableHandler.DeleteRows=function(A){if (!A){var B=FCKTableHandler.GetSelectedCells();var C=[];for (var i=0;i<B.length;i++){var D=FCKTools.GetElementAscensor(B[i],'TR');C[D.rowIndex]=D;};for (var i=C.length;i>=0;i--){if (C[i]) FCKTableHandler.DeleteRows(C[i]);};return;};var E=FCKTools.GetElementAscensor(A,'TABLE');if (E.rows.length==1){FCKTableHandler.DeleteTable(E);return;};A.parentNode.removeChild(A);};FCKTableHandler.DeleteTable=function(A){if (!A){A=FCKSelection.GetSelectedElement();if (!A||A.tagName!='TABLE') A=FCKSelection.MoveToAncestorNode('TABLE');};if (!A) return;FCKSelection.SelectNode(A);FCKSelection.Collapse();if (A.parentNode.childNodes.length==1) A.parentNode.parentNode.removeChild(A.parentNode);else A.parentNode.removeChild(A);};FCKTableHandler.InsertColumn=function(A){var B=null;var C=this.GetSelectedCells();if (C&&C.length) B=C[A?0:(C.length-1)];if (!B) return;var D=FCKTools.GetElementAscensor(B,'TABLE');var E=B.cellIndex;for (var i=0;i<D.rows.length;i++){var F=D.rows[i];if (F.cells.length<(E+1)) continue;B=F.cells[E].cloneNode(false);if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(B);var G=F.cells[E];if (A) F.insertBefore(B,G);else if (G.nextSibling) F.insertBefore(B,G.nextSibling);else F.appendChild(B);}};FCKTableHandler.DeleteColumns=function(A){if (!A){var B=FCKTableHandler.GetSelectedCells();for (var i=B.length;i>=0;i--){if (B[i]) FCKTableHandler.DeleteColumns(B[i]);};return;};if (!A) return;var C=FCKTools.GetElementAscensor(A,'TABLE');var D=A.cellIndex;for (var i=C.rows.length-1;i>=0;i--){var E=C.rows[i];if (D==0&&E.cells.length==1){FCKTableHandler.DeleteRows(E);continue;};if (E.cells[D]) E.removeChild(E.cells[D]);}};FCKTableHandler.InsertCell=function(A,B){var C=null;var D=this.GetSelectedCells();if (D&&D.length) C=D[B?0:(D.length-1)];if (!C) return null;var E=FCK.EditorDocument.createElement('TD');if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(E);if (!B&&C.cellIndex==C.parentNode.cells.length-1) C.parentNode.appendChild(E);else C.parentNode.insertBefore(E,B?C:C.nextSibling);return E;};FCKTableHandler.DeleteCell=function(A){if (A.parentNode.cells.length==1){FCKTableHandler.DeleteRows(FCKTools.GetElementAscensor(A,'TR'));return;};A.parentNode.removeChild(A);};FCKTableHandler.DeleteCells=function(){var A=FCKTableHandler.GetSelectedCells();for (var i=A.length-1;i>=0;i--){FCKTableHandler.DeleteCell(A[i]);}};FCKTableHandler._MarkCells=function(A,B){for (var i=0;i<A.length;i++) A[i][B]=true;};FCKTableHandler._UnmarkCells=function(A,B){for (var i=0;i<A.length;i++){if (FCKBrowserInfo.IsIE) A[i].removeAttribute(B);else delete A[i][B];}};FCKTableHandler._ReplaceCellsByMarker=function(A,B,C){for (var i=0;i<A.length;i++){for (var j=0;j<A[i].length;j++){if (A[i][j][B]) A[i][j]=C;}}};FCKTableHandler._GetMarkerGeometry=function(A,B,C,D){var E=0;var F=0;var G=0;var H=0;for (var i=C;A[B][i]&&A[B][i][D];i++) E++;for (var i=C-1;A[B][i]&&A[B][i][D];i--){E++;G++;};for (var i=B;A[i]&&A[i][C]&&A[i][C][D];i++) F++;for (var i=B-1;A[i]&&A[i][C]&&A[i][C][D];i--){F++;H++;};return { 'width':E,'height':F,'x':G,'y':H };};FCKTableHandler.CheckIsSelectionRectangular=function(){var A=FCKTableHandler.GetSelectedCells();if (A.length<1) return false;this._MarkCells(A,'_CellSelected');var B=this._CreateTableMap(A[0].parentNode.parentNode);var C=A[0].parentNode.rowIndex;var D=this._GetCellIndexSpan(B,C,A[0]);var E=this._GetMarkerGeometry(B,C,D,'_CellSelected');var F=D-E.x;var G=C-E.y;if (E.width>=E.height){for (D=F;D<F+E.width;D++){C=G+(D-F) % E.height;if (!B[C]||!B[C][D]){this._UnmarkCells(A,'_CellSelected');return false;};var g=this._GetMarkerGeometry(B,C,D,'_CellSelected');if (g.width!=E.width||g.height!=E.height){this._UnmarkCells(A,'_CellSelected');return false;}}}else{for (C=G;C<G+E.height;C++){D=F+(C-G) % E.width;if (!B[C]||!B[C][D]){this._UnmarkCells(A,'_CellSelected');return false;};var g=this._GetMarkerGeometry(B,C,D,'_CellSelected');if (g.width!=E.width||g.height!=E.height){this._UnmarkCells(A,'_CellSelected');return false;}}};this._UnmarkCells(A,'_CellSelected');return true;};FCKTableHandler.MergeCells=function(){var A=this.GetSelectedCells();if (A.length<2) return;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=B.parentNode.rowIndex;var E=this._GetCellIndexSpan(C,D,B);this._MarkCells(A,'_SelectedCells');var F=this._GetMarkerGeometry(C,D,E,'_SelectedCells');var G=E-F.x;var H=D-F.y;var I=FCKTools.GetElementDocument(B).createDocumentFragment();for (var i=0;i<F.height;i++){var J=0;for (var j=0;j<F.width;j++){var K=C[H+i][G+j];while (K.childNodes.length>0){var L=K.removeChild(K.firstChild);if (L.nodeType!=1||(L.getAttribute('type',2)!='_moz'&&L.getAttribute('_moz_dirty')!=null)){I.appendChild(L);J++;}}};if (J>0) I.appendChild(FCKTools.GetElementDocument(B).createElement('br'));};this._ReplaceCellsByMarker(C,'_SelectedCells',B);this._UnmarkCells(A,'_SelectedCells');this._InstallTableMap(C,B.parentNode.parentNode);B.appendChild(I);if (FCKBrowserInfo.IsGeckoLike&&(!B.firstChild)) FCKTools.AppendBogusBr(B);this._MoveCaretToCell(B,false);};FCKTableHandler.MergeRight=function(){var A=this.GetMergeRightTarget();if (A==null) return;var B=A.refCell;var C=A.tableMap;var D=A.nextCell;var E=FCK.EditorDocument.createDocumentFragment();while (D&&D.childNodes&&D.childNodes.length>0) E.appendChild(D.removeChild(D.firstChild));D.parentNode.removeChild(D);B.appendChild(E);this._MarkCells([D],'_Replace');this._ReplaceCellsByMarker(C,'_Replace',B);this._InstallTableMap(C,B.parentNode.parentNode);this._MoveCaretToCell(B,false);};FCKTableHandler.MergeDown=function(){var A=this.GetMergeDownTarget();if (A==null) return;var B=A.refCell;var C=A.tableMap;var D=A.nextCell;var E=FCKTools.GetElementDocument(B).createDocumentFragment();while (D&&D.childNodes&&D.childNodes.length>0) E.appendChild(D.removeChild(D.firstChild));if (E.firstChild) E.insertBefore(FCKTools.GetElementDocument(D).createElement('br'),E.firstChild);B.appendChild(E);this._MarkCells([D],'_Replace');this._ReplaceCellsByMarker(C,'_Replace',B);this._InstallTableMap(C,B.parentNode.parentNode);this._MoveCaretToCell(B,false);};FCKTableHandler.HorizontalSplitCell=function(){var A=FCKTableHandler.GetSelectedCells();if (A.length!=1) return;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=B.parentNode.rowIndex;var E=FCKTableHandler._GetCellIndexSpan(C,D,B);var F=isNaN(B.colSpan)?1:B.colSpan;if (F>1){var G=Math.ceil(F/2);var H=FCKTools.GetElementDocument(B).createElement('td');if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(H);var I=E+G;var J=E+F;var K=isNaN(B.rowSpan)?1:B.rowSpan;for (var r=D;r<D+K;r++){for (var i=I;i<J;i++) C[r][i]=H;}}else{var L=[];for (var i=0;i<C.length;i++){var M=C[i].slice(0,E);if (C[i].length<=E){L.push(M);continue;};if (C[i][E]==B){M.push(B);M.push(FCKTools.GetElementDocument(B).createElement('td'));if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(M[M.length-1]);}else{M.push(C[i][E]);M.push(C[i][E]);};for (var j=E+1;j<C[i].length;j++) M.push(C[i][j]);L.push(M);};C=L;};this._InstallTableMap(C,B.parentNode.parentNode);};FCKTableHandler.VerticalSplitCell=function(){var A=FCKTableHandler.GetSelectedCells();if (A.length!=1) return;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=FCKTableHandler._GetCellIndexSpan(C,B.parentNode.rowIndex,B);var E=B.rowSpan;var F=B.parentNode.rowIndex;if (isNaN(E)) E=1;if (E>1){B.rowSpan=Math.ceil(E/2);var G=F+Math.ceil(E/2);var H=null;for (var i=D+1;i<C[G].length;i++){if (C[G][i].parentNode.rowIndex==G){H=C[G][i];break;}};var I=FCK.EditorDocument.createElement('td');I.rowSpan=Math.floor(E/2);if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(I);B.parentNode.parentNode.rows[G].insertBefore(I,H);}else{var G=F+1;var K=FCK.EditorDocument.createElement('tr');var L=B.parentNode.parentNode;if (L.rows.length>G) L.insertBefore(K,L.rows[G]);else L.appendChild(K);for (var i=0;i<C[F].length;){var M=C[F][i].colSpan;if (isNaN(M)||M<1) M=1;if (i==D){i+=M;continue;};var N=C[F][i].rowSpan;if (isNaN(N)) N=1;C[F][i].rowSpan=N+1;i+=M;};var I=FCK.EditorDocument.createElement('td');if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(I);K.appendChild(I);}};FCKTableHandler._GetCellIndexSpan=function(A,B,C){if (A.length<B+1) return null;var D=A[B];for (var c=0;c<D.length;c++){if (D[c]==C) return c;};return null;};FCKTableHandler._GetCellLocation=function(A,B){for (var i=0;i<A.length;i++){for (var c=0;c<A[i].length;c++){if (A[i][c]==B) return [i,c];}};return null;};FCKTableHandler._GetColumnCells=function(A,B){var C=[];for (var r=0;r<A.length;r++){var D=A[r][B];if (D&&(C.length==0||C[C.length-1]!=D)) C[C.length]=D;};return C;};FCKTableHandler._CreateTableMap=function(A){var B=A.rows;var r=-1;var C=[];for (var i=0;i<B.length;i++){r++;if (!C[r]) C[r]=[];var c=-1;for (var j=0;j<B[i].cells.length;j++){var D=B[i].cells[j];c++;while (C[r][c]) c++;var E=isNaN(D.colSpan)?1:D.colSpan;var F=isNaN(D.rowSpan)?1:D.rowSpan;for (var G=0;G<F;G++){if (!C[r+G]) C[r+G]=[];for (var H=0;H<E;H++){C[r+G][c+H]=B[i].cells[j];}};c+=E-1;}};return C;};FCKTableHandler._InstallTableMap=function(A,B){var C=FCKBrowserInfo.IsIE?"_fckrowspan":"rowSpan";while (B.rows.length>0){var D=B.rows[0];D.parentNode.removeChild(D);};for (var i=0;i<A.length;i++){for (var j=0;j<A[i].length;j++){var E=A[i][j];if (E.parentNode) E.parentNode.removeChild(E);E.colSpan=E[C]=1;}};var F=0;for (var i=0;i<A.length;i++){for (var j=0;j<A[i].length;j++){var E=A[i][j];if (!E) continue;if (j>F) F=j;if (E._colScanned===true) continue;if (A[i][j-1]==E) E.colSpan++;if (A[i][j+1]!=E) E._colScanned=true;}};for (var i=0;i<=F;i++){for (var j=0;j<A.length;j++){if (!A[j]) continue;var E=A[j][i];if (!E||E._rowScanned===true) continue;if (A[j-1]&&A[j-1][i]==E) E[C]++;if (!A[j+1]||A[j+1][i]!=E) E._rowScanned=true;}};for (var i=0;i<A.length;i++){for (var j=0;j<A[i].length;j++){var E=A[i][j];if (FCKBrowserInfo.IsIE){E.removeAttribute('_colScanned');E.removeAttribute('_rowScanned');}else{delete E._colScanned;delete E._rowScanned;}}};for (var i=0;i<A.length;i++){var J=FCKTools.GetElementDocument(B).createElement('tr');for (var j=0;j<A[i].length;){var E=A[i][j];if (A[i-1]&&A[i-1][j]==E){j+=E.colSpan;continue;};J.appendChild(E);if (C!='rowSpan'){E.rowSpan=E[C];E.removeAttribute(C);};j+=E.colSpan;if (E.colSpan==1) E.removeAttribute('colspan');if (E.rowSpan==1) E.removeAttribute('rowspan');};B.appendChild(J);}};FCKTableHandler._MoveCaretToCell=function (A,B){var C=new FCKDomRange(FCK.EditorWindow);C.MoveToNodeContents(A);C.Collapse(B);C.Select();};FCKTableHandler.ClearRow=function(A){var B=A.cells;for (var i=0;i<B.length;i++){B[i].innerHTML='';if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(B[i]);}};FCKTableHandler.GetMergeRightTarget=function(){var A=this.GetSelectedCells();if (A.length!=1) return null;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=B.parentNode.rowIndex;var E=this._GetCellIndexSpan(C,D,B);var F=E+(isNaN(B.colSpan)?1:B.colSpan);var G=C[D][F];if (!G) return null;this._MarkCells([B,G],'_SizeTest');var H=this._GetMarkerGeometry(C,D,E,'_SizeTest');var I=this._GetMarkerGeometry(C,D,F,'_SizeTest');this._UnmarkCells([B,G],'_SizeTest');if (H.height!=I.height||H.y!=I.y) return null;return { 'refCell':B,'nextCell':G,'tableMap':C };};FCKTableHandler.GetMergeDownTarget=function(){var A=this.GetSelectedCells();if (A.length!=1) return null;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=B.parentNode.rowIndex;var E=this._GetCellIndexSpan(C,D,B);var F=D+(isNaN(B.rowSpan)?1:B.rowSpan);if (!C[F]) return null;var G=C[F][E];if (!G) return null;this._MarkCells([B,G],'_SizeTest');var H=this._GetMarkerGeometry(C,D,E,'_SizeTest');var I=this._GetMarkerGeometry(C,F,E,'_SizeTest');this._UnmarkCells([B,G],'_SizeTest');if (H.width!=I.width||H.x!=I.x) return null;return { 'refCell':B,'nextCell':G,'tableMap':C };};
FCKTableHandler.GetSelectedCells=function(){var A=[];var B=FCKSelection.GetSelection();if (B.rangeCount==1&&B.anchorNode.nodeType==3){var C=FCKTools.GetElementAscensor(B.anchorNode,'TD,TH');if (C) A[0]=C;return A;};for (var i=0;i<B.rangeCount;i++){var D=B.getRangeAt(i);var E;if (D.startContainer.tagName.Equals('TD','TH')) E=D.startContainer;else E=D.startContainer.childNodes[D.startOffset];if (E.tagName.Equals('TD','TH')) A[A.length]=E;};return A;};
var FCKXml=function(){this.Error=false;};FCKXml.GetAttribute=function(A,B,C){var D=A.attributes.getNamedItem(B);return D?D.value:C;};FCKXml.TransformToObject=function(A){if (!A) return null;var B={};var C=A.attributes;for (var i=0;i<C.length;i++){var D=C[i];B[D.name]=D.value;};var E=A.childNodes;for (i=0;i<E.length;i++){var F=E[i];if (F.nodeType==1){var G='$'+F.nodeName;var H=B[G];if (!H) H=B[G]=[];H.push(this.TransformToObject(F));}};return B;};
FCKXml.prototype={LoadUrl:function(A){this.Error=false;var B;var C=FCKTools.CreateXmlObject('XmlHttp');C.open('GET',A,false);C.send(null);if (C.status==200||C.status==304||(C.status==0&&C.readyState==4)){B=C.responseXML;if (!B) B=(new DOMParser()).parseFromString(C.responseText,'text/xml');}else B=null;if (B){try{var D=B.firstChild;}catch (e){B=(new DOMParser()).parseFromString(C.responseText,'text/xml');}};if (!B||!B.firstChild){this.Error=true;if (window.confirm('Error loading "'+A+'" (HTTP Status: '+C.status+').\r\nDo you want to see the server response dump?')) alert(C.responseText);};this.DOMDocument=B;},SelectNodes:function(A,B){if (this.Error) return [];var C=[];var D=this.DOMDocument.evaluate(A,B?B:this.DOMDocument,this.DOMDocument.createNSResolver(this.DOMDocument.documentElement),XPathResult.ORDERED_NODE_ITERATOR_TYPE,null);if (D){var E=D.iterateNext();while(E){C[C.length]=E;E=D.iterateNext();}};return C;},SelectSingleNode:function(A,B){if (this.Error) return null;var C=this.DOMDocument.evaluate(A,B?B:this.DOMDocument,this.DOMDocument.createNSResolver(this.DOMDocument.documentElement),9,null);if (C&&C.singleNodeValue) return C.singleNodeValue;else return null;}};
var FCKNamedCommand=function(A){this.Name=A;};FCKNamedCommand.prototype.Execute=function(){FCK.ExecuteNamedCommand(this.Name);};FCKNamedCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState(this.Name);};
var FCKStyleCommand=function(){};FCKStyleCommand.prototype={Name:'Style',Execute:function(A,B){FCKUndo.SaveUndoStep();if (B.Selected) FCK.Styles.RemoveStyle(B.Style);else FCK.Styles.ApplyStyle(B.Style);FCKUndo.SaveUndoStep();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');},GetState:function(){if (FCK.EditMode!=0||!FCK.EditorDocument) return -1;if (FCKSelection.GetType()=='Control'){var A=FCKSelection.GetSelectedElement();if (!A||!FCKStyles.CheckHasObjectStyle(A.nodeName.toLowerCase())) return -1;};return 0;}};
-var FCKDialogCommand=function(A,B,C,D,E,F,G,H){this.Name=A;this.Title=B;this.Url=C;this.Width=D;this.Height=E;this.CustomValue=H;this.GetStateFunction=F;this.GetStateParam=G;this.Resizable=false;};FCKDialogCommand.prototype.Execute=function(){FCKDialog.OpenDialog('FCKDialog_'+this.Name,this.Title,this.Url,this.Width,this.Height,this.CustomValue,null,this.Resizable);};FCKDialogCommand.prototype.GetState=function(){if (this.GetStateFunction) return this.GetStateFunction(this.GetStateParam);else return FCK.EditMode==0?0:-1;};var FCKUndefinedCommand=function(){this.Name='Undefined';};FCKUndefinedCommand.prototype.Execute=function(){alert(FCKLang.NotImplemented);};FCKUndefinedCommand.prototype.GetState=function(){return 0;};var FCKFormatBlockCommand=function(){};FCKFormatBlockCommand.prototype={Name:'FormatBlock',Execute:FCKStyleCommand.prototype.Execute,GetState:function(){return FCK.EditorDocument?0:-1;}};var FCKFontNameCommand=function(){};FCKFontNameCommand.prototype={Name:'FontName',Execute:FCKStyleCommand.prototype.Execute,GetState:FCKFormatBlockCommand.prototype.GetState};var FCKFontSizeCommand=function(){};FCKFontSizeCommand.prototype={Name:'FontSize',Execute:FCKStyleCommand.prototype.Execute,GetState:FCKFormatBlockCommand.prototype.GetState};var FCKPreviewCommand=function(){this.Name='Preview';};FCKPreviewCommand.prototype.Execute=function(){FCK.Preview();};FCKPreviewCommand.prototype.GetState=function(){return 0;};var FCKSaveCommand=function(){this.Name='Save';};FCKSaveCommand.prototype.Execute=function(){var A=FCK.GetParentForm();if (typeof(A.onsubmit)=='function'){var B=A.onsubmit();if (B!=null&&B===false) return;};if (typeof(A.submit)=='function') A.submit();else A.submit.click();};FCKSaveCommand.prototype.GetState=function(){return 0;};var FCKNewPageCommand=function(){this.Name='NewPage';};FCKNewPageCommand.prototype.Execute=function(){FCKUndo.SaveUndoStep();FCK.SetData('');FCKUndo.Typing=true;FCK.Focus();};FCKNewPageCommand.prototype.GetState=function(){return 0;};var FCKSourceCommand=function(){this.Name='Source';};FCKSourceCommand.prototype.Execute=function(){if (FCKConfig.SourcePopup){var A=FCKConfig.ScreenWidth*0.65;var B=FCKConfig.ScreenHeight*0.65;FCKDialog.OpenDialog('FCKDialog_Source',FCKLang.Source,'dialog/fck_source.html',A,B,null,null,true);}else FCK.SwitchEditMode();};FCKSourceCommand.prototype.GetState=function(){return (FCK.EditMode==0?0:1);};var FCKUndoCommand=function(){this.Name='Undo';};FCKUndoCommand.prototype.Execute=function(){FCKUndo.Undo();};FCKUndoCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return (FCKUndo.CheckUndoState()?0:-1);};var FCKRedoCommand=function(){this.Name='Redo';};FCKRedoCommand.prototype.Execute=function(){FCKUndo.Redo();};FCKRedoCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return (FCKUndo.CheckRedoState()?0:-1);};var FCKPageBreakCommand=function(){this.Name='PageBreak';};FCKPageBreakCommand.prototype.Execute=function(){FCKUndo.SaveUndoStep();var e=FCK.EditorDocument.createElement('DIV');e.style.pageBreakAfter='always';e.innerHTML='<span style="DISPLAY:none"> </span>';var A=FCKDocumentProcessor_CreateFakeImage('FCK__PageBreak',e);var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=B.SplitBlock();B.InsertNode(A);FCK.Events.FireEvent('OnSelectionChange');};FCKPageBreakCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return 0;};var FCKUnlinkCommand=function(){this.Name='Unlink';};FCKUnlinkCommand.prototype.Execute=function(){FCKUndo.SaveUndoStep();if (FCKBrowserInfo.IsGeckoLike){var A=FCK.Selection.MoveToAncestorNode('A');if (A) FCKTools.RemoveOuterTags(A);return;};FCK.ExecuteNamedCommand(this.Name);};FCKUnlinkCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;var A=FCK.GetNamedCommandState(this.Name);if (A==0&&FCK.EditMode==0){var B=FCKSelection.MoveToAncestorNode('A');var C=(B&&B.name.length>0&&B.href.length==0);if (C) A=-1;};return A;};var FCKSelectAllCommand=function(){this.Name='SelectAll';};FCKSelectAllCommand.prototype.Execute=function(){if (FCK.EditMode==0){FCK.ExecuteNamedCommand('SelectAll');}else{var A=FCK.EditingArea.Textarea;if (FCKBrowserInfo.IsIE){A.createTextRange().execCommand('SelectAll');}else{A.selectionStart=0;A.selectionEnd=A.value.length;};A.focus();}};FCKSelectAllCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return 0;};var FCKPasteCommand=function(){this.Name='Paste';};FCKPasteCommand.prototype={Execute:function(){if (FCKBrowserInfo.IsIE) FCK.Paste();else FCK.ExecuteNamedCommand('Paste');},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('Paste');}};var FCKRuleCommand=function(){this.Name='Rule';};FCKRuleCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();FCK.InsertElement('hr');},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('InsertHorizontalRule');}};var FCKCutCopyCommand=function(A){this.Name=A?'Cut':'Copy';};FCKCutCopyCommand.prototype={Execute:function(){var A=false;if (FCKBrowserInfo.IsIE){var B=function(){A=true;};var C='on'+this.Name.toLowerCase();FCK.EditorDocument.body.attachEvent(C,B);FCK.ExecuteNamedCommand(this.Name);FCK.EditorDocument.body.detachEvent(C,B);}else{try{FCK.ExecuteNamedCommand(this.Name);A=true;}catch(e){}};if (!A) alert(FCKLang['PasteError'+this.Name]);},GetState:function(){return FCK.EditMode!=0?-1:FCK.GetNamedCommandState('Cut');}};var FCKAnchorDeleteCommand=function(){this.Name='AnchorDelete';};FCKAnchorDeleteCommand.prototype={Execute:function(){if (FCK.Selection.GetType()=='Control'){FCK.Selection.Delete();}else{var A=FCK.Selection.GetSelectedElement();if (A){if (A.tagName=='IMG'&&A.getAttribute('_fckanchor')) oAnchor=FCK.GetRealElement(A);else A=null;};if (!A){oAnchor=FCK.Selection.MoveToAncestorNode('A');if (oAnchor) FCK.Selection.SelectNode(oAnchor);};if (oAnchor.href.length!=0){oAnchor.removeAttribute('name');if (FCKBrowserInfo.IsIE) oAnchor.className=oAnchor.className.replace(FCKRegexLib.FCK_Class,'');return;};if (A){A.parentNode.removeChild(A);return;};if (oAnchor.innerHTML.length==0){oAnchor.parentNode.removeChild(oAnchor);return;};FCKTools.RemoveOuterTags(oAnchor);};if (FCKBrowserInfo.IsGecko) FCK.Selection.Collapse(true);},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('Unlink');}};
-var FCKShowBlockCommand=function(A,B){this.Name=A;if (B!=undefined) this._SavedState=B;else this._SavedState=null;};FCKShowBlockCommand.prototype.Execute=function(){var A=this.GetState();if (A==-1) return;var B=FCK.EditorDocument.body;if (A==1) B.className=B.className.replace(/(^| )FCK__ShowBlocks/g,'');else B.className+=' FCK__ShowBlocks';FCK.Events.FireEvent('OnSelectionChange');};FCKShowBlockCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;if (!FCK.EditorDocument) return 0;if (/FCK__ShowBlocks(?:\s|$)/.test(FCK.EditorDocument.body.className)) return 1;return 0;};FCKShowBlockCommand.prototype.SaveState=function(){this._SavedState=this.GetState();};FCKShowBlockCommand.prototype.RestoreState=function(){if (this._SavedState!=null&&this.GetState()!=this._SavedState) this.Execute();};
+var FCKDialogCommand=function(A,B,C,D,E,F,G,H){this.Name=A;this.Title=B;this.Url=C;this.Width=D;this.Height=E;this.CustomValue=H;this.GetStateFunction=F;this.GetStateParam=G;this.Resizable=false;};FCKDialogCommand.prototype.Execute=function(){FCKDialog.OpenDialog('FCKDialog_'+this.Name,this.Title,this.Url,this.Width,this.Height,this.CustomValue,null,this.Resizable);};FCKDialogCommand.prototype.GetState=function(){if (this.GetStateFunction) return this.GetStateFunction(this.GetStateParam);else return FCK.EditMode==0?0:-1;};var FCKUndefinedCommand=function(){this.Name='Undefined';};FCKUndefinedCommand.prototype.Execute=function(){alert(FCKLang.NotImplemented);};FCKUndefinedCommand.prototype.GetState=function(){return 0;};var FCKFormatBlockCommand=function(){};FCKFormatBlockCommand.prototype={Name:'FormatBlock',Execute:FCKStyleCommand.prototype.Execute,GetState:function(){return FCK.EditorDocument?0:-1;}};var FCKFontNameCommand=function(){};FCKFontNameCommand.prototype={Name:'FontName',Execute:FCKStyleCommand.prototype.Execute,GetState:FCKFormatBlockCommand.prototype.GetState};var FCKFontSizeCommand=function(){};FCKFontSizeCommand.prototype={Name:'FontSize',Execute:FCKStyleCommand.prototype.Execute,GetState:FCKFormatBlockCommand.prototype.GetState};var FCKPreviewCommand=function(){this.Name='Preview';};FCKPreviewCommand.prototype.Execute=function(){FCK.Preview();};FCKPreviewCommand.prototype.GetState=function(){return 0;};var FCKSaveCommand=function(){this.Name='Save';};FCKSaveCommand.prototype.Execute=function(){var A=FCK.GetParentForm();if (typeof(A.onsubmit)=='function'){var B=A.onsubmit();if (B!=null&&B===false) return;};if (typeof(A.submit)=='function') A.submit();else A.submit.click();};FCKSaveCommand.prototype.GetState=function(){return 0;};var FCKNewPageCommand=function(){this.Name='NewPage';};FCKNewPageCommand.prototype.Execute=function(){FCKUndo.SaveUndoStep();FCK.SetData('');FCKUndo.Typing=true;FCK.Focus();};FCKNewPageCommand.prototype.GetState=function(){return 0;};var FCKSourceCommand=function(){this.Name='Source';};FCKSourceCommand.prototype.Execute=function(){if (FCKConfig.SourcePopup){var A=FCKConfig.ScreenWidth*0.65;var B=FCKConfig.ScreenHeight*0.65;FCKDialog.OpenDialog('FCKDialog_Source',FCKLang.Source,'dialog/fck_source.html',A,B,null,null,true);}else FCK.SwitchEditMode();};FCKSourceCommand.prototype.GetState=function(){return (FCK.EditMode==0?0:1);};var FCKUndoCommand=function(){this.Name='Undo';};FCKUndoCommand.prototype.Execute=function(){FCKUndo.Undo();};FCKUndoCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return (FCKUndo.CheckUndoState()?0:-1);};var FCKRedoCommand=function(){this.Name='Redo';};FCKRedoCommand.prototype.Execute=function(){FCKUndo.Redo();};FCKRedoCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return (FCKUndo.CheckRedoState()?0:-1);};var FCKPageBreakCommand=function(){this.Name='PageBreak';};FCKPageBreakCommand.prototype.Execute=function(){FCKUndo.SaveUndoStep();var e=FCK.EditorDocument.createElement('DIV');e.style.pageBreakAfter='always';e.innerHTML='<span style="DISPLAY:none"> </span>';var A=FCKDocumentProcessor_CreateFakeImage('FCK__PageBreak',e);var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=B.SplitBlock();B.InsertNode(A);FCK.Events.FireEvent('OnSelectionChange');};FCKPageBreakCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return 0;};var FCKUnlinkCommand=function(){this.Name='Unlink';};FCKUnlinkCommand.prototype.Execute=function(){FCKUndo.SaveUndoStep();if (FCKBrowserInfo.IsGeckoLike){var A=FCK.Selection.MoveToAncestorNode('A');if (A) FCKTools.RemoveOuterTags(A);return;};FCK.ExecuteNamedCommand(this.Name);};FCKUnlinkCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;var A=FCK.GetNamedCommandState(this.Name);if (A==0&&FCK.EditMode==0){var B=FCKSelection.MoveToAncestorNode('A');var C=(B&&B.name.length>0&&B.href.length==0);if (C) A=-1;};return A;};FCKVisitLinkCommand=function(){this.Name='VisitLink';};FCKVisitLinkCommand.prototype={GetState:function(){if (FCK.EditMode!=0) return -1;var A=FCK.GetNamedCommandState('Unlink');if (A==0){var B=FCKSelection.MoveToAncestorNode('A');if (!B.href) A=-1;};return A;},Execute:function(){var A=FCKSelection.MoveToAncestorNode('A');var B=A.getAttribute('_fcksavedurl')||A.getAttribute('href',2);if (!/:\/\//.test(B)){var C=FCKConfig.BaseHref;var D=FCK.GetInstanceObject('parent');if (!C){C=D.document.location.href;C=C.substring(0,C.lastIndexOf('/')+1);};if (/^\//.test(B)){try{C=C.match(/^.*:\/\/+[^\/]+/)[0];}catch (e){C=D.document.location.protocol+'://'+D.parent.document.location.host;}};B=C+B;};if (!window.open(B,'_blank')) alert(FCKLang.VisitLinkBlocked);}};var FCKSelectAllCommand=function(){this.Name='SelectAll';};FCKSelectAllCommand.prototype.Execute=function(){if (FCK.EditMode==0){FCK.ExecuteNamedCommand('SelectAll');}else{var A=FCK.EditingArea.Textarea;if (FCKBrowserInfo.IsIE){A.createTextRange().execCommand('SelectAll');}else{A.selectionStart=0;A.selectionEnd=A.value.length;};A.focus();}};FCKSelectAllCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return 0;};var FCKPasteCommand=function(){this.Name='Paste';};FCKPasteCommand.prototype={Execute:function(){if (FCKBrowserInfo.IsIE) FCK.Paste();else FCK.ExecuteNamedCommand('Paste');},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('Paste');}};var FCKRuleCommand=function(){this.Name='Rule';};FCKRuleCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();FCK.InsertElement('hr');},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('InsertHorizontalRule');}};var FCKCutCopyCommand=function(A){this.Name=A?'Cut':'Copy';};FCKCutCopyCommand.prototype={Execute:function(){var A=false;if (FCKBrowserInfo.IsIE){var B=function(){A=true;};var C='on'+this.Name.toLowerCase();FCK.EditorDocument.body.attachEvent(C,B);FCK.ExecuteNamedCommand(this.Name);FCK.EditorDocument.body.detachEvent(C,B);}else{try{FCK.ExecuteNamedCommand(this.Name);A=true;}catch(e){}};if (!A) alert(FCKLang['PasteError'+this.Name]);},GetState:function(){return FCK.EditMode!=0?-1:FCK.GetNamedCommandState('Cut');}};var FCKAnchorDeleteCommand=function(){this.Name='AnchorDelete';};FCKAnchorDeleteCommand.prototype={Execute:function(){if (FCK.Selection.GetType()=='Control'){FCK.Selection.Delete();}else{var A=FCK.Selection.GetSelectedElement();if (A){if (A.tagName=='IMG'&&A.getAttribute('_fckanchor')) oAnchor=FCK.GetRealElement(A);else A=null;};if (!A){oAnchor=FCK.Selection.MoveToAncestorNode('A');if (oAnchor) FCK.Selection.SelectNode(oAnchor);};if (oAnchor.href.length!=0){oAnchor.removeAttribute('name');if (FCKBrowserInfo.IsIE) oAnchor.className=oAnchor.className.replace(FCKRegexLib.FCK_Class,'');return;};if (A){A.parentNode.removeChild(A);return;};if (oAnchor.innerHTML.length==0){oAnchor.parentNode.removeChild(oAnchor);return;};FCKTools.RemoveOuterTags(oAnchor);};if (FCKBrowserInfo.IsGecko) FCK.Selection.Collapse(true);},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('Unlink');}};var FCKDeleteDivCommand=function(){};FCKDeleteDivCommand.prototype={GetState:function(){if (FCK.EditMode!=0) return -1;var A=FCKSelection.GetParentElement();var B=new FCKElementPath(A);return B.BlockLimit&&B.BlockLimit.nodeName.IEquals('div')?0:-1;},Execute:function(){FCKUndo.SaveUndoStep();var A=FCKDomTools.GetSelectedDivContainers();var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=B.CreateBookmark();for (var i=0;i<A.length;i++) FCKDomTools.RemoveNode(A[i],true);B.MoveToBookmark(C);B.Select();}};var FCKNbsp=function(){this.Name='Non Breaking Space';};FCKNbsp.prototype={Execute:function(){FCK.InsertHtml(' ');},GetState:function(){return (FCK.EditMode!=0?-1:0);}};
+var FCKShowBlockCommand=function(A,B){this.Name=A;if (B!=undefined) this._SavedState=B;else this._SavedState=null;};FCKShowBlockCommand.prototype.Execute=function(){var A=this.GetState();if (A==-1) return;var B=FCK.EditorDocument.body;if (A==1) B.className=B.className.replace(/(^| )FCK__ShowBlocks/g,'');else B.className+=' FCK__ShowBlocks';if (FCKBrowserInfo.IsIE){try{FCK.EditorDocument.selection.createRange().select();}catch (e){}}else{var C=FCK.EditorWindow.getSelection().focusNode;if (C.nodeType!=1) C=C.parentNode;FCKDomTools.ScrollIntoView(C,false);};FCK.Events.FireEvent('OnSelectionChange');};FCKShowBlockCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;if (!FCK.EditorDocument) return 0;if (/FCK__ShowBlocks(?:\s|$)/.test(FCK.EditorDocument.body.className)) return 1;return 0;};FCKShowBlockCommand.prototype.SaveState=function(){this._SavedState=this.GetState();};FCKShowBlockCommand.prototype.RestoreState=function(){if (this._SavedState!=null&&this.GetState()!=this._SavedState) this.Execute();};
var FCKSpellCheckCommand=function(){this.Name='SpellCheck';this.IsEnabled=(FCKConfig.SpellChecker=='SpellerPages');};FCKSpellCheckCommand.prototype.Execute=function(){FCKDialog.OpenDialog('FCKDialog_SpellCheck','Spell Check','dialog/fck_spellerpages.html',440,480);};FCKSpellCheckCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return this.IsEnabled?0:-1;};
var FCKTextColorCommand=function(A){this.Name=A=='ForeColor'?'TextColor':'BGColor';this.Type=A;var B;if (FCKBrowserInfo.IsIE) B=window;else if (FCK.ToolbarSet._IFrame) B=FCKTools.GetElementWindow(FCK.ToolbarSet._IFrame);else B=window.parent;this._Panel=new FCKPanel(B);this._Panel.AppendStyleSheet(FCKConfig.SkinEditorCSS);this._Panel.MainNode.className='FCK_Panel';this._CreatePanelBody(this._Panel.Document,this._Panel.MainNode);FCK.ToolbarSet.ToolbarItems.GetItem(this.Name).RegisterPanel(this._Panel);FCKTools.DisableSelection(this._Panel.Document.body);};FCKTextColorCommand.prototype.Execute=function(A,B,C){this._Panel.Show(A,B,C);};FCKTextColorCommand.prototype.SetColor=function(A){FCKUndo.SaveUndoStep();var B=FCKStyles.GetStyle('_FCK_'+(this.Type=='ForeColor'?'Color':'BackColor'));if (!A||A.length==0) FCK.Styles.RemoveStyle(B);else{B.SetVariable('Color',A);FCKStyles.ApplyStyle(B);};FCKUndo.SaveUndoStep();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');};FCKTextColorCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return 0;};function FCKTextColorCommand_OnMouseOver(){this.className='ColorSelected';};function FCKTextColorCommand_OnMouseOut(){this.className='ColorDeselected';};function FCKTextColorCommand_OnClick(A,B,C){this.className='ColorDeselected';B.SetColor(C);B._Panel.Hide();};function FCKTextColorCommand_AutoOnClick(A,B){this.className='ColorDeselected';B.SetColor('');B._Panel.Hide();};function FCKTextColorCommand_MoreOnClick(A,B){this.className='ColorDeselected';B._Panel.Hide();FCKDialog.OpenDialog('FCKDialog_Color',FCKLang.DlgColorTitle,'dialog/fck_colorselector.html',410,320,FCKTools.Bind(B,B.SetColor));};FCKTextColorCommand.prototype._CreatePanelBody=function(A,B){function CreateSelectionDiv(){var C=A.createElement("DIV");C.className='ColorDeselected';FCKTools.AddEventListenerEx(C,'mouseover',FCKTextColorCommand_OnMouseOver);FCKTools.AddEventListenerEx(C,'mouseout',FCKTextColorCommand_OnMouseOut);return C;};var D=B.appendChild(A.createElement("TABLE"));D.className='ForceBaseFont';D.style.tableLayout='fixed';D.cellPadding=0;D.cellSpacing=0;D.border=0;D.width=150;var E=D.insertRow(-1).insertCell(-1);E.colSpan=8;var C=E.appendChild(CreateSelectionDiv());C.innerHTML='<table cellspacing="0" cellpadding="0" width="100%" border="0">\n <tr>\n <td><div class="ColorBoxBorder"><div class="ColorBox" style="background-color: #000000"></div></div></td>\n <td nowrap width="100%" align="center">'+FCKLang.ColorAutomatic+'</td>\n </tr>\n </table>';FCKTools.AddEventListenerEx(C,'click',FCKTextColorCommand_AutoOnClick,this);if (!FCKBrowserInfo.IsIE) C.style.width='96%';var G=FCKConfig.FontColors.toString().split(',');var H=0;while (H<G.length){var I=D.insertRow(-1);for (var i=0;i<8;i++,H++){if (H<G.length){var J=G[H].split('/');var K='#'+J[0];var L=J[1]||K;};C=I.insertCell(-1).appendChild(CreateSelectionDiv());C.innerHTML='<div class="ColorBoxBorder"><div class="ColorBox" style="background-color: '+K+'"></div></div>';if (H>=G.length) C.style.visibility='hidden';else FCKTools.AddEventListenerEx(C,'click',FCKTextColorCommand_OnClick,[this,L]);}};if (FCKConfig.EnableMoreFontColors){E=D.insertRow(-1).insertCell(-1);E.colSpan=8;C=E.appendChild(CreateSelectionDiv());C.innerHTML='<table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td nowrap align="center">'+FCKLang.ColorMoreColors+'</td></tr></table>';FCKTools.AddEventListenerEx(C,'click',FCKTextColorCommand_MoreOnClick,this);};if (!FCKBrowserInfo.IsIE) C.style.width='96%';};
var FCKPastePlainTextCommand=function(){this.Name='PasteText';};FCKPastePlainTextCommand.prototype.Execute=function(){FCK.PasteAsPlainText();};FCKPastePlainTextCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('Paste');};
var FCKPasteWordCommand=function(){this.Name='PasteWord';};FCKPasteWordCommand.prototype.Execute=function(){FCK.PasteFromWord();};FCKPasteWordCommand.prototype.GetState=function(){if (FCK.EditMode!=0||FCKConfig.ForcePasteAsPlainText) return -1;else return FCK.GetNamedCommandState('Paste');};
var FCKTableCommand=function(A){this.Name=A;};FCKTableCommand.prototype.Execute=function(){FCKUndo.SaveUndoStep();if (!FCKBrowserInfo.IsGecko){switch (this.Name){case 'TableMergeRight':return FCKTableHandler.MergeRight();case 'TableMergeDown':return FCKTableHandler.MergeDown();}};switch (this.Name){case 'TableInsertRowAfter':return FCKTableHandler.InsertRow(false);case 'TableInsertRowBefore':return FCKTableHandler.InsertRow(true);case 'TableDeleteRows':return FCKTableHandler.DeleteRows();case 'TableInsertColumnAfter':return FCKTableHandler.InsertColumn(false);case 'TableInsertColumnBefore':return FCKTableHandler.InsertColumn(true);case 'TableDeleteColumns':return FCKTableHandler.DeleteColumns();case 'TableInsertCellAfter':return FCKTableHandler.InsertCell(null,false);case 'TableInsertCellBefore':return FCKTableHandler.InsertCell(null,true);case 'TableDeleteCells':return FCKTableHandler.DeleteCells();case 'TableMergeCells':return FCKTableHandler.MergeCells();case 'TableHorizontalSplitCell':return FCKTableHandler.HorizontalSplitCell();case 'TableVerticalSplitCell':return FCKTableHandler.VerticalSplitCell();case 'TableDelete':return FCKTableHandler.DeleteTable();default:return alert(FCKLang.UnknownCommand.replace(/%1/g,this.Name));}};FCKTableCommand.prototype.GetState=function(){if (FCK.EditorDocument!=null&&FCKSelection.HasAncestorNode('TABLE')){switch (this.Name){case 'TableHorizontalSplitCell':case 'TableVerticalSplitCell':if (FCKTableHandler.GetSelectedCells().length==1) return 0;else return -1;case 'TableMergeCells':if (FCKTableHandler.CheckIsSelectionRectangular()&&FCKTableHandler.GetSelectedCells().length>1) return 0;else return -1;case 'TableMergeRight':return FCKTableHandler.GetMergeRightTarget()?0:-1;case 'TableMergeDown':return FCKTableHandler.GetMergeDownTarget()?0:-1;default:return 0;}}else return -1;};
-var FCKFitWindow=function(){this.Name='FitWindow';};FCKFitWindow.prototype.Execute=function(){var A=window.frameElement;var B=A.style;var C=parent;var D=C.document.documentElement;var E=C.document.body;var F=E.style;var G;if (!this.IsMaximized){if(FCKBrowserInfo.IsIE) C.attachEvent('onresize',FCKFitWindow_Resize);else C.addEventListener('resize',FCKFitWindow_Resize,true);this._ScrollPos=FCKTools.GetScrollPosition(C);G=A;while((G=G.parentNode)){if (G.nodeType==1){G._fckSavedStyles=FCKTools.SaveStyles(G);G.style.zIndex=FCKConfig.FloatingPanelsZIndex-1;}};if (FCKBrowserInfo.IsIE){this.documentElementOverflow=D.style.overflow;D.style.overflow='hidden';F.overflow='hidden';}else{F.overflow='hidden';F.width='0px';F.height='0px';};this._EditorFrameStyles=FCKTools.SaveStyles(A);var H=FCKTools.GetViewPaneSize(C);B.position="absolute";A.offsetLeft;B.zIndex=FCKConfig.FloatingPanelsZIndex-1;B.left="0px";B.top="0px";B.width=H.Width+"px";B.height=H.Height+"px";if (!FCKBrowserInfo.IsIE){B.borderRight=B.borderBottom="9999px solid white";B.backgroundColor="white";};C.scrollTo(0,0);var I=FCKTools.GetWindowPosition(C,A);if (I.x!=0) B.left=(-1*I.x)+"px";if (I.y!=0) B.top=(-1*I.y)+"px";this.IsMaximized=true;}else{if(FCKBrowserInfo.IsIE) C.detachEvent("onresize",FCKFitWindow_Resize);else C.removeEventListener("resize",FCKFitWindow_Resize,true);G=A;while((G=G.parentNode)){if (G._fckSavedStyles){FCKTools.RestoreStyles(G,G._fckSavedStyles);G._fckSavedStyles=null;}};if (FCKBrowserInfo.IsIE) D.style.overflow=this.documentElementOverflow;FCKTools.RestoreStyles(A,this._EditorFrameStyles);C.scrollTo(this._ScrollPos.X,this._ScrollPos.Y);this.IsMaximized=false;};FCKToolbarItems.GetItem('FitWindow').RefreshState();if (FCK.EditMode==0) FCK.EditingArea.MakeEditable();FCK.Focus();};FCKFitWindow.prototype.GetState=function(){if (FCKConfig.ToolbarLocation!='In') return -1;else return (this.IsMaximized?1:0);};function FCKFitWindow_Resize(){var A=FCKTools.GetViewPaneSize(parent);var B=window.frameElement.style;B.width=A.Width+'px';B.height=A.Height+'px';};
+var FCKFitWindow=function(){this.Name='FitWindow';};FCKFitWindow.prototype.Execute=function(){var A=window.frameElement;var B=A.style;var C=parent;var D=C.document.documentElement;var E=C.document.body;var F=E.style;var G;var H=new FCKDomRange(FCK.EditorWindow);H.MoveToSelection();var I=FCKTools.GetScrollPosition(FCK.EditorWindow);if (!this.IsMaximized){if(FCKBrowserInfo.IsIE) C.attachEvent('onresize',FCKFitWindow_Resize);else C.addEventListener('resize',FCKFitWindow_Resize,true);this._ScrollPos=FCKTools.GetScrollPosition(C);G=A;while((G=G.parentNode)){if (G.nodeType==1){G._fckSavedStyles=FCKTools.SaveStyles(G);G.style.zIndex=FCKConfig.FloatingPanelsZIndex-1;}};if (FCKBrowserInfo.IsIE){this.documentElementOverflow=D.style.overflow;D.style.overflow='hidden';F.overflow='hidden';}else{F.overflow='hidden';F.width='0px';F.height='0px';};this._EditorFrameStyles=FCKTools.SaveStyles(A);var J=FCKTools.GetViewPaneSize(C);B.position="absolute";A.offsetLeft;B.zIndex=FCKConfig.FloatingPanelsZIndex-1;B.left="0px";B.top="0px";B.width=J.Width+"px";B.height=J.Height+"px";if (!FCKBrowserInfo.IsIE){B.borderRight=B.borderBottom="9999px solid white";B.backgroundColor="white";};C.scrollTo(0,0);var K=FCKTools.GetWindowPosition(C,A);if (K.x!=0) B.left=(-1*K.x)+"px";if (K.y!=0) B.top=(-1*K.y)+"px";this.IsMaximized=true;}else{if(FCKBrowserInfo.IsIE) C.detachEvent("onresize",FCKFitWindow_Resize);else C.removeEventListener("resize",FCKFitWindow_Resize,true);G=A;while((G=G.parentNode)){if (G._fckSavedStyles){FCKTools.RestoreStyles(G,G._fckSavedStyles);G._fckSavedStyles=null;}};if (FCKBrowserInfo.IsIE) D.style.overflow=this.documentElementOverflow;FCKTools.RestoreStyles(A,this._EditorFrameStyles);C.scrollTo(this._ScrollPos.X,this._ScrollPos.Y);this.IsMaximized=false;};FCKToolbarItems.GetItem('FitWindow').RefreshState();if (FCK.EditMode==0) FCK.EditingArea.MakeEditable();FCK.Focus();H.Select();FCK.EditorWindow.scrollTo(I.X,I.Y);};FCKFitWindow.prototype.GetState=function(){if (FCKConfig.ToolbarLocation!='In') return -1;else return (this.IsMaximized?1:0);};function FCKFitWindow_Resize(){var A=FCKTools.GetViewPaneSize(parent);var B=window.frameElement.style;B.width=A.Width+'px';B.height=A.Height+'px';};
var FCKListCommand=function(A,B){this.Name=A;this.TagName=B;};FCKListCommand.prototype={GetState:function(){if (FCK.EditMode!=0||!FCK.EditorWindow) return -1;var A=FCKSelection.GetBoundaryParentElement(true);var B=A;while (B){if (B.nodeName.IEquals(['ul','ol'])) break;B=B.parentNode;};if (B&&B.nodeName.IEquals(this.TagName)) return 1;else return 0;},Execute:function(){FCKUndo.SaveUndoStep();var A=FCK.EditorDocument;var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=this.GetState();if (C==0){FCKDomTools.TrimNode(A.body);if (!A.body.firstChild){var D=A.createElement('p');A.body.appendChild(D);B.MoveToNodeContents(D);}};var E=B.CreateBookmark();var F=[];var G={};var H=new FCKDomRangeIterator(B);var I;H.ForceBrBreak=(C==0);var J=true;var K=null;while (J){while ((I=H.GetNextParagraph())){var L=new FCKElementPath(I);var M=null;var N=false;var O=L.BlockLimit;for (var i=L.Elements.length-1;i>=0;i--){var P=L.Elements[i];if (P.nodeName.IEquals(['ol','ul'])){if (O._FCK_ListGroupObject) O._FCK_ListGroupObject=null;var Q=P._FCK_ListGroupObject;if (Q) Q.contents.push(I);else{Q={ 'root':P,'contents':[I] };F.push(Q);FCKDomTools.SetElementMarker(G,P,'_FCK_ListGroupObject',Q);};N=true;break;}};if (N) continue;var R=O;if (R._FCK_ListGroupObject) R._FCK_ListGroupObject.contents.push(I);else{var Q={ 'root':R,'contents':[I] };FCKDomTools.SetElementMarker(G,R,'_FCK_ListGroupObject',Q);F.push(Q);}};if (FCKBrowserInfo.IsIE) J=false;else{if (K==null){K=[];var T=FCKSelection.GetSelection();if (T&&F.length==0) K.push(T.getRangeAt(0));for (var i=1;T&&i<T.rangeCount;i++) K.push(T.getRangeAt(i));};if (K.length<1) J=false;else{var U=FCKW3CRange.CreateFromRange(A,K.shift());B._Range=U;B._UpdateElementInfo();if (B.StartNode.nodeName.IEquals('td')) B.SetStart(B.StartNode,1);if (B.EndNode.nodeName.IEquals('td')) B.SetEnd(B.EndNode,2);H=new FCKDomRangeIterator(B);H.ForceBrBreak=(C==0);}}};var W=[];while (F.length>0){var Q=F.shift();if (C==0){if (Q.root.nodeName.IEquals(['ul','ol'])) this._ChangeListType(Q,G,W);else this._CreateList(Q,W);}else if (C==1&&Q.root.nodeName.IEquals(['ul','ol'])) this._RemoveList(Q,G);};for (var i=0;i<W.length;i++){var M=W[i];var Z=false;var a=M;while (!Z){a=a.nextSibling;if (a&&a.nodeType==3&&a.nodeValue.search(/^[\n\r\t ]*$/)==0) continue;Z=true;};if (a&&a.nodeName.IEquals(this.TagName)){a.parentNode.removeChild(a);while (a.firstChild) M.appendChild(a.removeChild(a.firstChild));};Z=false;a=M;while (!Z){a=a.previousSibling;if (a&&a.nodeType==3&&a.nodeValue.search(/^[\n\r\t ]*$/)==0) continue;Z=true;};if (a&&a.nodeName.IEquals(this.TagName)){a.parentNode.removeChild(a);while (a.lastChild) M.insertBefore(a.removeChild(a.lastChild),M.firstChild);}};FCKDomTools.ClearAllMarkers(G);B.MoveToBookmark(E);B.Select();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');},_ChangeListType:function(A,B,C){var D=FCKDomTools.ListToArray(A.root,B);var E=[];for (var i=0;i<A.contents.length;i++){var F=A.contents[i];F=FCKTools.GetElementAscensor(F,'li');if (!F||F._FCK_ListItem_Processed) continue;E.push(F);FCKDomTools.SetElementMarker(B,F,'_FCK_ListItem_Processed',true);};var G=FCKTools.GetElementDocument(A.root).createElement(this.TagName);for (var i=0;i<E.length;i++){var H=E[i]._FCK_ListArray_Index;D[H].parent=G;};var I=FCKDomTools.ArrayToList(D,B);for (var i=0;i<I.listNode.childNodes.length;i++){if (I.listNode.childNodes[i].nodeName.IEquals(this.TagName)) C.push(I.listNode.childNodes[i]);};A.root.parentNode.replaceChild(I.listNode,A.root);},_CreateList:function(A,B){var C=A.contents;var D=FCKTools.GetElementDocument(A.root);var E=[];if (C.length==1&&C[0]==A.root){var F=D.createElement('div');while (C[0].firstChild) F.appendChild(C[0].removeChild(C[0].firstChild));C[0].appendChild(F);C[0]=F;};var G=A.contents[0].parentNode;for (var i=0;i<C.length;i++) G=FCKDomTools.GetCommonParents(G,C[i].parentNode).pop();for (var i=0;i<C.length;i++){var H=C[i];while (H.parentNode){if (H.parentNode==G){E.push(H);break;};H=H.parentNode;}};if (E.length<1) return;var I=E[E.length-1].nextSibling;var J=D.createElement(this.TagName);B.push(J);while (E.length){var K=E.shift();var L=D.createDocumentFragment();while (K.firstChild) L.appendChild(K.removeChild(K.firstChild));K.parentNode.removeChild(K);var M=D.createElement('li');M.appendChild(L);J.appendChild(M);};G.insertBefore(J,I);},_RemoveList:function(A,B){var C=FCKDomTools.ListToArray(A.root,B);var D=[];for (var i=0;i<A.contents.length;i++){var E=A.contents[i];E=FCKTools.GetElementAscensor(E,'li');if (!E||E._FCK_ListItem_Processed) continue;D.push(E);FCKDomTools.SetElementMarker(B,E,'_FCK_ListItem_Processed',true);};var F=null;for (var i=0;i<D.length;i++){var G=D[i]._FCK_ListArray_Index;C[G].indent=-1;F=G;};for (var i=F+1;i<C.length;i++){if (C[i].indent>C[i-1].indent+1){var H=C[i-1].indent+1-C[i].indent;var I=C[i].indent;while (C[i]&&C[i].indent>=I){C[i].indent+=H;i++;};i--;}};var J=FCKDomTools.ArrayToList(C,B);if (A.root.nextSibling==null||A.root.nextSibling.nodeName.IEquals('br')){if (J.listNode.lastChild.nodeName.IEquals('br')) J.listNode.removeChild(J.listNode.lastChild);};A.root.parentNode.replaceChild(J.listNode,A.root);}};
var FCKJustifyCommand=function(A){this.AlignValue=A;var B=FCKConfig.ContentLangDirection.toLowerCase();this.IsDefaultAlign=(A=='left'&&B=='ltr')||(A=='right'&&B=='rtl');var C=this._CssClassName=(function(){var D=FCKConfig.JustifyClasses;if (D){switch (A){case 'left':return D[0]||null;case 'center':return D[1]||null;case 'right':return D[2]||null;case 'justify':return D[3]||null;}};return null;})();if (C&&C.length>0) this._CssClassRegex=new RegExp('(?:^|\\s+)'+C+'(?=$|\\s)');};FCKJustifyCommand._GetClassNameRegex=function(){var A=FCKJustifyCommand._ClassRegex;if (A!=undefined) return A;var B=[];var C=FCKConfig.JustifyClasses;if (C){for (var i=0;i<4;i++){var D=C[i];if (D&&D.length>0) B.push(D);}};if (B.length>0) A=new RegExp('(?:^|\\s+)(?:'+B.join('|')+')(?=$|\\s)');else A=null;return FCKJustifyCommand._ClassRegex=A;};FCKJustifyCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();var A=new FCKDomRange(FCK.EditorWindow);A.MoveToSelection();var B=this.GetState();if (B==-1) return;var C=A.CreateBookmark();var D=this._CssClassName;var E=new FCKDomRangeIterator(A);var F;while ((F=E.GetNextParagraph())){F.removeAttribute('align');if (D){var G=F.className.replace(FCKJustifyCommand._GetClassNameRegex(),'');if (B==0){if (G.length>0) G+=' ';F.className=G+D;}else if (G.length==0) FCKDomTools.RemoveAttribute(F,'class');}else{var H=F.style;if (B==0) H.textAlign=this.AlignValue;else{H.textAlign='';if (H.cssText.length==0) F.removeAttribute('style');}}};A.MoveToBookmark(C);A.Select();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');},GetState:function(){if (FCK.EditMode!=0||!FCK.EditorWindow) return -1;var A=new FCKElementPath(FCKSelection.GetBoundaryParentElement(true));var B=A.Block||A.BlockLimit;if (!B||B.nodeName.toLowerCase()=='body') return 0;var C;if (FCKBrowserInfo.IsIE) C=B.currentStyle.textAlign;else C=FCK.EditorWindow.getComputedStyle(B,'').getPropertyValue('text-align');C=C.replace(/(-moz-|-webkit-|start|auto)/i,'');if ((!C&&this.IsDefaultAlign)||C==this.AlignValue) return 1;return 0;}};
var FCKIndentCommand=function(A,B){this.Name=A;this.Offset=B;this.IndentCSSProperty=FCKConfig.ContentLangDirection.IEquals('ltr')?'marginLeft':'marginRight';};FCKIndentCommand._InitIndentModeParameters=function(){if (FCKConfig.IndentClasses&&FCKConfig.IndentClasses.length>0){this._UseIndentClasses=true;this._IndentClassMap={};for (var i=0;i<FCKConfig.IndentClasses.length;i++) this._IndentClassMap[FCKConfig.IndentClasses[i]]=i+1;this._ClassNameRegex=new RegExp('(?:^|\\s+)('+FCKConfig.IndentClasses.join('|')+')(?=$|\\s)');}else this._UseIndentClasses=false;};FCKIndentCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();var A=new FCKDomRange(FCK.EditorWindow);A.MoveToSelection();var B=A.CreateBookmark();var C=FCKDomTools.GetCommonParentNode(A.StartNode||A.StartContainer,A.EndNode||A.EndContainer,['ul','ol']);if (C) this._IndentList(A,C);else this._IndentBlock(A);A.MoveToBookmark(B);A.Select();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');},GetState:function(){if (FCK.EditMode!=0||!FCK.EditorWindow) return -1;if (FCKIndentCommand._UseIndentClasses==undefined) FCKIndentCommand._InitIndentModeParameters();var A=FCKSelection.GetBoundaryParentElement(true);var B=FCKSelection.GetBoundaryParentElement(false);var C=FCKDomTools.GetCommonParentNode(A,B,['ul','ol']);if (C){if (this.Name.IEquals('outdent')) return 0;var D=FCKTools.GetElementAscensor(A,'li');if (!D||!D.previousSibling) return -1;return 0;};if (!FCKIndentCommand._UseIndentClasses&&this.Name.IEquals('indent')) return 0;var E=new FCKElementPath(A);var F=E.Block||E.BlockLimit;if (!F) return -1;if (FCKIndentCommand._UseIndentClasses){var G=F.className.match(FCKIndentCommand._ClassNameRegex);var H=0;if (G!=null){G=G[1];H=FCKIndentCommand._IndentClassMap[G];};if ((this.Name=='outdent'&&H==0)||(this.Name=='indent'&&H==FCKConfig.IndentClasses.length)) return -1;return 0;}else{var I=parseInt(F.style[this.IndentCSSProperty],10);if (isNaN(I)) I=0;if (I<=0) return -1;return 0;}},_IndentBlock:function(A){var B=new FCKDomRangeIterator(A);B.EnforceRealBlocks=true;A.Expand('block_contents');var C=FCKDomTools.GetCommonParents(A.StartContainer,A.EndContainer);var D=C[C.length-1];var E;while ((E=B.GetNextParagraph())){if (!(E==D||E.parentNode==D)) continue;if (FCKIndentCommand._UseIndentClasses){var F=E.className.match(FCKIndentCommand._ClassNameRegex);var G=0;if (F!=null){F=F[1];G=FCKIndentCommand._IndentClassMap[F];};if (this.Name.IEquals('outdent')) G--;else if (this.Name.IEquals('indent')) G++;G=Math.min(G,FCKConfig.IndentClasses.length);G=Math.max(G,0);var H=E.className.replace(FCKIndentCommand._ClassNameRegex,'');if (G<1) E.className=H;else E.className=(H.length>0?H+' ':'')+FCKConfig.IndentClasses[G-1];}else{var I=parseInt(E.style[this.IndentCSSProperty],10);if (isNaN(I)) I=0;I+=this.Offset;I=Math.max(I,0);I=Math.ceil(I/this.Offset)*this.Offset;E.style[this.IndentCSSProperty]=I?I+FCKConfig.IndentUnit:'';if (E.getAttribute('style')=='') E.removeAttribute('style');}}},_IndentList:function(A,B){var C=A.StartContainer;var D=A.EndContainer;while (C&&C.parentNode!=B) C=C.parentNode;while (D&&D.parentNode!=B) D=D.parentNode;if (!C||!D) return;var E=C;var F=[];var G=false;while (G==false){if (E==D) G=true;F.push(E);E=E.nextSibling;};if (F.length<1) return;var H=FCKDomTools.GetParents(B);for (var i=0;i<H.length;i++){if (H[i].nodeName.IEquals(['ul','ol'])){B=H[i];break;}};var I=this.Name.IEquals('indent')?1:-1;var J=F[0];var K=F[F.length-1];var L={};var M=FCKDomTools.ListToArray(B,L);var N=M[K._FCK_ListArray_Index].indent;for (var i=J._FCK_ListArray_Index;i<=K._FCK_ListArray_Index;i++) M[i].indent+=I;for (var i=K._FCK_ListArray_Index+1;i<M.length&&M[i].indent>N;i++) M[i].indent+=I;var O=FCKDomTools.ArrayToList(M);if (O) B.parentNode.replaceChild(O.listNode,B);FCKDomTools.ClearAllMarkers(L);}};
var FCKBlockQuoteCommand=function(){};FCKBlockQuoteCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();var A=this.GetState();var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=B.CreateBookmark();if (FCKBrowserInfo.IsIE){var D=B.GetBookmarkNode(C,true);var E=B.GetBookmarkNode(C,false);var F;if (D&&D.parentNode.nodeName.IEquals('blockquote')&&!D.previousSibling){F=D;while ((F=F.nextSibling)){if (FCKListsLib.BlockElements[F.nodeName.toLowerCase()]) FCKDomTools.MoveNode(D,F,true);}};if (E&&E.parentNode.nodeName.IEquals('blockquote')&&!E.previousSibling){F=E;while ((F=F.nextSibling)){if (FCKListsLib.BlockElements[F.nodeName.toLowerCase()]){if (F.firstChild==D) FCKDomTools.InsertAfterNode(D,E);else FCKDomTools.MoveNode(E,F,true);}}}};var G=new FCKDomRangeIterator(B);var H;if (A==0){G.EnforceRealBlocks=true;var I=[];while ((H=G.GetNextParagraph())) I.push(H);if (I.length<1){para=B.Window.document.createElement(FCKConfig.EnterMode.IEquals('p')?'p':'div');B.InsertNode(para);para.appendChild(B.Window.document.createTextNode('\ufeff'));B.MoveToBookmark(C);B.MoveToNodeContents(para);B.Collapse(true);C=B.CreateBookmark();I.push(para);};var J=I[0].parentNode;var K=[];for (var i=0;i<I.length;i++){H=I[i];J=FCKDomTools.GetCommonParents(H.parentNode,J).pop();};var L=null;while (I.length>0){H=I.shift();while (H.parentNode!=J) H=H.parentNode;if (H!=L) K.push(H);L=H;}while (K.length>0){H=K.shift();if (H.nodeName.IEquals('blockquote')){var M=FCKTools.GetElementDocument(H).createDocumentFragment();while (H.firstChild){M.appendChild(H.removeChild(H.firstChild));I.push(M.lastChild);};H.parentNode.replaceChild(M,H);}else I.push(H);};var N=B.Window.document.createElement('blockquote');J.insertBefore(N,I[0]);while (I.length>0){H=I.shift();N.appendChild(H);}}else if (A==1){var O=[];while ((H=G.GetNextParagraph())){var P=null;var Q=null;while (H.parentNode){if (H.parentNode.nodeName.IEquals('blockquote')){P=H.parentNode;Q=H;break;};H=H.parentNode;};if (P&&Q) O.push(Q);};var R=[];while (O.length>0){var S=O.shift();var N=S.parentNode;if (S==S.parentNode.firstChild){N.parentNode.insertBefore(N.removeChild(S),N);if (!N.firstChild) N.parentNode.removeChild(N);}else if (S==S.parentNode.lastChild){N.parentNode.insertBefore(N.removeChild(S),N.nextSibling);if (!N.firstChild) N.parentNode.removeChild(N);}else FCKDomTools.BreakParent(S,S.parentNode,B);R.push(S);};if (FCKConfig.EnterMode.IEquals('br')){while (R.length){var S=R.shift();var W=true;if (S.nodeName.IEquals('div')){var M=FCKTools.GetElementDocument(S).createDocumentFragment();var Y=W&&S.previousSibling&&!FCKListsLib.BlockBoundaries[S.previousSibling.nodeName.toLowerCase()];if (W&&Y) M.appendChild(FCKTools.GetElementDocument(S).createElement('br'));var Z=S.nextSibling&&!FCKListsLib.BlockBoundaries[S.nextSibling.nodeName.toLowerCase()];while (S.firstChild) M.appendChild(S.removeChild(S.firstChild));if (Z) M.appendChild(FCKTools.GetElementDocument(S).createElement('br'));S.parentNode.replaceChild(M,S);W=false;}}}};B.MoveToBookmark(C);B.Select();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');},GetState:function(){if (FCK.EditMode!=0||!FCK.EditorWindow) return -1;var A=new FCKElementPath(FCKSelection.GetBoundaryParentElement(true));var B=A.Block||A.BlockLimit;if (!B||B.nodeName.toLowerCase()=='body') return 0;for (var i=0;i<A.Elements.length;i++){if (A.Elements[i].nodeName.IEquals('blockquote')) return 1;};return 0;}};
var FCKCoreStyleCommand=function(A){this.Name='CoreStyle';this.StyleName='_FCK_'+A;this.IsActive=false;FCKStyles.AttachStyleStateChange(this.StyleName,this._OnStyleStateChange,this);};FCKCoreStyleCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();if (this.IsActive) FCKStyles.RemoveStyle(this.StyleName);else FCKStyles.ApplyStyle(this.StyleName);FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');},GetState:function(){if (FCK.EditMode!=0) return -1;return this.IsActive?1:0;},_OnStyleStateChange:function(A,B){this.IsActive=B;}};
var FCKRemoveFormatCommand=function(){this.Name='RemoveFormat';};FCKRemoveFormatCommand.prototype={Execute:function(){FCKStyles.RemoveAll();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');},GetState:function(){return FCK.EditorWindow?0:-1;}};
-var FCKCommands=FCK.Commands={};FCKCommands.LoadedCommands={};FCKCommands.RegisterCommand=function(A,B){this.LoadedCommands[A]=B;};FCKCommands.GetCommand=function(A){var B=FCKCommands.LoadedCommands[A];if (B) return B;switch (A){case 'Bold':case 'Italic':case 'Underline':case 'StrikeThrough':case 'Subscript':case 'Superscript':B=new FCKCoreStyleCommand(A);break;case 'RemoveFormat':B=new FCKRemoveFormatCommand();break;case 'DocProps':B=new FCKDialogCommand('DocProps',FCKLang.DocProps,'dialog/fck_docprops.html',400,380,FCKCommands.GetFullPageState);break;case 'Templates':B=new FCKDialogCommand('Templates',FCKLang.DlgTemplatesTitle,'dialog/fck_template.html',380,450);break;case 'Link':B=new FCKDialogCommand('Link',FCKLang.DlgLnkWindowTitle,'dialog/fck_link.html',400,300);break;case 'Unlink':B=new FCKUnlinkCommand();break;case 'Anchor':B=new FCKDialogCommand('Anchor',FCKLang.DlgAnchorTitle,'dialog/fck_anchor.html',370,160);break;case 'AnchorDelete':B=new FCKAnchorDeleteCommand();break;case 'BulletedList':B=new FCKDialogCommand('BulletedList',FCKLang.BulletedListProp,'dialog/fck_listprop.html?UL',370,160);break;case 'NumberedList':B=new FCKDialogCommand('NumberedList',FCKLang.NumberedListProp,'dialog/fck_listprop.html?OL',370,160);break;case 'About':B=new FCKDialogCommand('About',FCKLang.About,'dialog/fck_about.html',420,330,function(){ return 0;});break;case 'Find':B=new FCKDialogCommand('Find',FCKLang.DlgFindAndReplaceTitle,'dialog/fck_replace.html',340,230,null,null,'Find');break;case 'Replace':B=new FCKDialogCommand('Replace',FCKLang.DlgFindAndReplaceTitle,'dialog/fck_replace.html',340,230,null,null,'Replace');break;case 'Image':B=new FCKDialogCommand('Image',FCKLang.DlgImgTitle,'dialog/fck_image.html',450,390);break;case 'Flash':B=new FCKDialogCommand('Flash',FCKLang.DlgFlashTitle,'dialog/fck_flash.html',450,390);break;case 'SpecialChar':B=new FCKDialogCommand('SpecialChar',FCKLang.DlgSpecialCharTitle,'dialog/fck_specialchar.html',400,290);break;case 'Smiley':B=new FCKDialogCommand('Smiley',FCKLang.DlgSmileyTitle,'dialog/fck_smiley.html',FCKConfig.SmileyWindowWidth,FCKConfig.SmileyWindowHeight);break;case 'Table':B=new FCKDialogCommand('Table',FCKLang.DlgTableTitle,'dialog/fck_table.html',480,250);break;case 'TableProp':B=new FCKDialogCommand('Table',FCKLang.DlgTableTitle,'dialog/fck_table.html?Parent',480,250);break;case 'TableCellProp':B=new FCKDialogCommand('TableCell',FCKLang.DlgCellTitle,'dialog/fck_tablecell.html',550,240);break;case 'Style':B=new FCKStyleCommand();break;case 'FontName':B=new FCKFontNameCommand();break;case 'FontSize':B=new FCKFontSizeCommand();break;case 'FontFormat':B=new FCKFormatBlockCommand();break;case 'Source':B=new FCKSourceCommand();break;case 'Preview':B=new FCKPreviewCommand();break;case 'Save':B=new FCKSaveCommand();break;case 'NewPage':B=new FCKNewPageCommand();break;case 'PageBreak':B=new FCKPageBreakCommand();break;case 'Rule':B=new FCKRuleCommand();break;case 'TextColor':B=new FCKTextColorCommand('ForeColor');break;case 'BGColor':B=new FCKTextColorCommand('BackColor');break;case 'Paste':B=new FCKPasteCommand();break;case 'PasteText':B=new FCKPastePlainTextCommand();break;case 'PasteWord':B=new FCKPasteWordCommand();break;case 'JustifyLeft':B=new FCKJustifyCommand('left');break;case 'JustifyCenter':B=new FCKJustifyCommand('center');break;case 'JustifyRight':B=new FCKJustifyCommand('right');break;case 'JustifyFull':B=new FCKJustifyCommand('justify');break;case 'Indent':B=new FCKIndentCommand('indent',FCKConfig.IndentLength);break;case 'Outdent':B=new FCKIndentCommand('outdent',FCKConfig.IndentLength*-1);break;case 'Blockquote':B=new FCKBlockQuoteCommand();break;case 'TableInsertRowAfter':B=new FCKTableCommand('TableInsertRowAfter');break;case 'TableInsertRowBefore':B=new FCKTableCommand('TableInsertRowBefore');break;case 'TableDeleteRows':B=new FCKTableCommand('TableDeleteRows');break;case 'TableInsertColumnAfter':B=new FCKTableCommand('TableInsertColumnAfter');break;case 'TableInsertColumnBefore':B=new FCKTableCommand('TableInsertColumnBefore');break;case 'TableDeleteColumns':B=new FCKTableCommand('TableDeleteColumns');break;case 'TableInsertCellAfter':B=new FCKTableCommand('TableInsertCellAfter');break;case 'TableInsertCellBefore':B=new FCKTableCommand('TableInsertCellBefore');break;case 'TableDeleteCells':B=new FCKTableCommand('TableDeleteCells');break;case 'TableMergeCells':B=new FCKTableCommand('TableMergeCells');break;case 'TableMergeRight':B=new FCKTableCommand('TableMergeRight');break;case 'TableMergeDown':B=new FCKTableCommand('TableMergeDown');break;case 'TableHorizontalSplitCell':B=new FCKTableCommand('TableHorizontalSplitCell');break;case 'TableVerticalSplitCell':B=new FCKTableCommand('TableVerticalSplitCell');break;case 'TableDelete':B=new FCKTableCommand('TableDelete');break;case 'Form':B=new FCKDialogCommand('Form',FCKLang.Form,'dialog/fck_form.html',380,210);break;case 'Checkbox':B=new FCKDialogCommand('Checkbox',FCKLang.Checkbox,'dialog/fck_checkbox.html',380,200);break;case 'Radio':B=new FCKDialogCommand('Radio',FCKLang.RadioButton,'dialog/fck_radiobutton.html',380,200);break;case 'TextField':B=new FCKDialogCommand('TextField',FCKLang.TextField,'dialog/fck_textfield.html',380,210);break;case 'Textarea':B=new FCKDialogCommand('Textarea',FCKLang.Textarea,'dialog/fck_textarea.html',380,210);break;case 'HiddenField':B=new FCKDialogCommand('HiddenField',FCKLang.HiddenField,'dialog/fck_hiddenfield.html',380,190);break;case 'Button':B=new FCKDialogCommand('Button',FCKLang.Button,'dialog/fck_button.html',380,210);break;case 'Select':B=new FCKDialogCommand('Select',FCKLang.SelectionField,'dialog/fck_select.html',400,340);break;case 'ImageButton':B=new FCKDialogCommand('ImageButton',FCKLang.ImageButton,'dialog/fck_image.html?ImageButton',450,390);break;case 'SpellCheck':B=new FCKSpellCheckCommand();break;case 'FitWindow':B=new FCKFitWindow();break;case 'Undo':B=new FCKUndoCommand();break;case 'Redo':B=new FCKRedoCommand();break;case 'Copy':B=new FCKCutCopyCommand(false);break;case 'Cut':B=new FCKCutCopyCommand(true);break;case 'SelectAll':B=new FCKSelectAllCommand();break;case 'InsertOrderedList':B=new FCKListCommand('insertorderedlist','ol');break;case 'InsertUnorderedList':B=new FCKListCommand('insertunorderedlist','ul');break;case 'ShowBlocks':B=new FCKShowBlockCommand('ShowBlocks',FCKConfig.StartupShowBlocks?1:0);break;case 'Undefined':B=new FCKUndefinedCommand();break;default:if (FCKRegexLib.NamedCommands.test(A)) B=new FCKNamedCommand(A);else{alert(FCKLang.UnknownCommand.replace(/%1/g,A));return null;}};FCKCommands.LoadedCommands[A]=B;return B;};FCKCommands.GetFullPageState=function(){return FCKConfig.FullPage?0:-1;};FCKCommands.GetBooleanState=function(A){return A?-1:0;};
+var FCKCommands=FCK.Commands={};FCKCommands.LoadedCommands={};FCKCommands.RegisterCommand=function(A,B){this.LoadedCommands[A]=B;};FCKCommands.GetCommand=function(A){var B=FCKCommands.LoadedCommands[A];if (B) return B;switch (A){case 'Bold':case 'Italic':case 'Underline':case 'StrikeThrough':case 'Subscript':case 'Superscript':B=new FCKCoreStyleCommand(A);break;case 'RemoveFormat':B=new FCKRemoveFormatCommand();break;case 'DocProps':B=new FCKDialogCommand('DocProps',FCKLang.DocProps,'dialog/fck_docprops.html',400,380,FCKCommands.GetFullPageState);break;case 'Templates':B=new FCKDialogCommand('Templates',FCKLang.DlgTemplatesTitle,'dialog/fck_template.html',380,450);break;case 'Link':B=new FCKDialogCommand('Link',FCKLang.DlgLnkWindowTitle,'dialog/fck_link.html',400,300);break;case 'Unlink':B=new FCKUnlinkCommand();break;case 'VisitLink':B=new FCKVisitLinkCommand();break;case 'Anchor':B=new FCKDialogCommand('Anchor',FCKLang.DlgAnchorTitle,'dialog/fck_anchor.html',370,160);break;case 'AnchorDelete':B=new FCKAnchorDeleteCommand();break;case 'BulletedList':B=new FCKDialogCommand('BulletedList',FCKLang.BulletedListProp,'dialog/fck_listprop.html?UL',370,160);break;case 'NumberedList':B=new FCKDialogCommand('NumberedList',FCKLang.NumberedListProp,'dialog/fck_listprop.html?OL',370,160);break;case 'About':B=new FCKDialogCommand('About',FCKLang.About,'dialog/fck_about.html',420,330,function(){ return 0;});break;case 'Find':B=new FCKDialogCommand('Find',FCKLang.DlgFindAndReplaceTitle,'dialog/fck_replace.html',340,230,null,null,'Find');break;case 'Replace':B=new FCKDialogCommand('Replace',FCKLang.DlgFindAndReplaceTitle,'dialog/fck_replace.html',340,230,null,null,'Replace');break;case 'Image':B=new FCKDialogCommand('Image',FCKLang.DlgImgTitle,'dialog/fck_image.html',450,390);break;case 'Flash':B=new FCKDialogCommand('Flash',FCKLang.DlgFlashTitle,'dialog/fck_flash.html',450,390);break;case 'SpecialChar':B=new FCKDialogCommand('SpecialChar',FCKLang.DlgSpecialCharTitle,'dialog/fck_specialchar.html',400,290);break;case 'Smiley':B=new FCKDialogCommand('Smiley',FCKLang.DlgSmileyTitle,'dialog/fck_smiley.html',FCKConfig.SmileyWindowWidth,FCKConfig.SmileyWindowHeight);break;case 'Table':B=new FCKDialogCommand('Table',FCKLang.DlgTableTitle,'dialog/fck_table.html',480,250);break;case 'TableProp':B=new FCKDialogCommand('Table',FCKLang.DlgTableTitle,'dialog/fck_table.html?Parent',480,250);break;case 'TableCellProp':B=new FCKDialogCommand('TableCell',FCKLang.DlgCellTitle,'dialog/fck_tablecell.html',550,240);break;case 'Style':B=new FCKStyleCommand();break;case 'FontName':B=new FCKFontNameCommand();break;case 'FontSize':B=new FCKFontSizeCommand();break;case 'FontFormat':B=new FCKFormatBlockCommand();break;case 'Source':B=new FCKSourceCommand();break;case 'Preview':B=new FCKPreviewCommand();break;case 'Save':B=new FCKSaveCommand();break;case 'NewPage':B=new FCKNewPageCommand();break;case 'PageBreak':B=new FCKPageBreakCommand();break;case 'Rule':B=new FCKRuleCommand();break;case 'Nbsp':B=new FCKNbsp();break;case 'TextColor':B=new FCKTextColorCommand('ForeColor');break;case 'BGColor':B=new FCKTextColorCommand('BackColor');break;case 'Paste':B=new FCKPasteCommand();break;case 'PasteText':B=new FCKPastePlainTextCommand();break;case 'PasteWord':B=new FCKPasteWordCommand();break;case 'JustifyLeft':B=new FCKJustifyCommand('left');break;case 'JustifyCenter':B=new FCKJustifyCommand('center');break;case 'JustifyRight':B=new FCKJustifyCommand('right');break;case 'JustifyFull':B=new FCKJustifyCommand('justify');break;case 'Indent':B=new FCKIndentCommand('indent',FCKConfig.IndentLength);break;case 'Outdent':B=new FCKIndentCommand('outdent',FCKConfig.IndentLength*-1);break;case 'Blockquote':B=new FCKBlockQuoteCommand();break;case 'CreateDiv':B=new FCKDialogCommand('CreateDiv',FCKLang.CreateDiv,'dialog/fck_div.html',380,210,null,null,true);break;case 'EditDiv':B=new FCKDialogCommand('EditDiv',FCKLang.EditDiv,'dialog/fck_div.html',380,210,null,null,false);break;case 'DeleteDiv':B=new FCKDeleteDivCommand();break;case 'TableInsertRowAfter':B=new FCKTableCommand('TableInsertRowAfter');break;case 'TableInsertRowBefore':B=new FCKTableCommand('TableInsertRowBefore');break;case 'TableDeleteRows':B=new FCKTableCommand('TableDeleteRows');break;case 'TableInsertColumnAfter':B=new FCKTableCommand('TableInsertColumnAfter');break;case 'TableInsertColumnBefore':B=new FCKTableCommand('TableInsertColumnBefore');break;case 'TableDeleteColumns':B=new FCKTableCommand('TableDeleteColumns');break;case 'TableInsertCellAfter':B=new FCKTableCommand('TableInsertCellAfter');break;case 'TableInsertCellBefore':B=new FCKTableCommand('TableInsertCellBefore');break;case 'TableDeleteCells':B=new FCKTableCommand('TableDeleteCells');break;case 'TableMergeCells':B=new FCKTableCommand('TableMergeCells');break;case 'TableMergeRight':B=new FCKTableCommand('TableMergeRight');break;case 'TableMergeDown':B=new FCKTableCommand('TableMergeDown');break;case 'TableHorizontalSplitCell':B=new FCKTableCommand('TableHorizontalSplitCell');break;case 'TableVerticalSplitCell':B=new FCKTableCommand('TableVerticalSplitCell');break;case 'TableDelete':B=new FCKTableCommand('TableDelete');break;case 'Form':B=new FCKDialogCommand('Form',FCKLang.Form,'dialog/fck_form.html',380,210);break;case 'Checkbox':B=new FCKDialogCommand('Checkbox',FCKLang.Checkbox,'dialog/fck_checkbox.html',380,200);break;case 'Radio':B=new FCKDialogCommand('Radio',FCKLang.RadioButton,'dialog/fck_radiobutton.html',380,200);break;case 'TextField':B=new FCKDialogCommand('TextField',FCKLang.TextField,'dialog/fck_textfield.html',380,210);break;case 'Textarea':B=new FCKDialogCommand('Textarea',FCKLang.Textarea,'dialog/fck_textarea.html',380,210);break;case 'HiddenField':B=new FCKDialogCommand('HiddenField',FCKLang.HiddenField,'dialog/fck_hiddenfield.html',380,190);break;case 'Button':B=new FCKDialogCommand('Button',FCKLang.Button,'dialog/fck_button.html',380,210);break;case 'Select':B=new FCKDialogCommand('Select',FCKLang.SelectionField,'dialog/fck_select.html',400,340);break;case 'ImageButton':B=new FCKDialogCommand('ImageButton',FCKLang.ImageButton,'dialog/fck_image.html?ImageButton',450,390);break;case 'SpellCheck':B=new FCKSpellCheckCommand();break;case 'FitWindow':B=new FCKFitWindow();break;case 'Undo':B=new FCKUndoCommand();break;case 'Redo':B=new FCKRedoCommand();break;case 'Copy':B=new FCKCutCopyCommand(false);break;case 'Cut':B=new FCKCutCopyCommand(true);break;case 'SelectAll':B=new FCKSelectAllCommand();break;case 'InsertOrderedList':B=new FCKListCommand('insertorderedlist','ol');break;case 'InsertUnorderedList':B=new FCKListCommand('insertunorderedlist','ul');break;case 'ShowBlocks':B=new FCKShowBlockCommand('ShowBlocks',FCKConfig.StartupShowBlocks?1:0);break;case 'Undefined':B=new FCKUndefinedCommand();break;default:if (FCKRegexLib.NamedCommands.test(A)) B=new FCKNamedCommand(A);else{alert(FCKLang.UnknownCommand.replace(/%1/g,A));return null;}};FCKCommands.LoadedCommands[A]=B;return B;};FCKCommands.GetFullPageState=function(){return FCKConfig.FullPage?0:-1;};FCKCommands.GetBooleanState=function(A){return A?-1:0;};
var FCKPanel=function(A){this.IsRTL=(FCKLang.Dir=='rtl');this.IsContextMenu=false;this._LockCounter=0;this._Window=A||window;var B;if (FCKBrowserInfo.IsIE){this._Popup=this._Window.createPopup();var C=this._Window.document;if (FCK_IS_CUSTOM_DOMAIN&&!FCKBrowserInfo.IsIE7){C.domain=FCK_ORIGINAL_DOMAIN;document.domain=FCK_ORIGINAL_DOMAIN;};B=this.Document=this._Popup.document;if (FCK_IS_CUSTOM_DOMAIN){B.domain=FCK_RUNTIME_DOMAIN;C.domain=FCK_RUNTIME_DOMAIN;document.domain=FCK_RUNTIME_DOMAIN;};FCK.IECleanup.AddItem(this,FCKPanel_Cleanup);}else{var D=this._IFrame=this._Window.document.createElement('iframe');FCKTools.ResetStyles(D);D.src='javascript:void(0)';D.allowTransparency=true;D.frameBorder='0';D.scrolling='no';D.style.width=D.style.height='0px';FCKDomTools.SetElementStyles(D,{position:'absolute',zIndex:FCKConfig.FloatingPanelsZIndex});this._Window.document.body.appendChild(D);var E=D.contentWindow;B=this.Document=E.document;var F='';if (FCKBrowserInfo.IsSafari) F='<base href="'+window.document.location+'">';B.open();B.write('<html><head>'+F+'<\/head><body style="margin:0px;padding:0px;"><\/body><\/html>');B.close();if(FCKBrowserInfo.IsAIR) FCKAdobeAIR.Panel_Contructor(B,window.document.location);FCKTools.AddEventListenerEx(E,'focus',FCKPanel_Window_OnFocus,this);FCKTools.AddEventListenerEx(E,'blur',FCKPanel_Window_OnBlur,this);};B.dir=FCKLang.Dir;FCKTools.AddEventListener(B,'contextmenu',FCKTools.CancelEvent);this.MainNode=B.body.appendChild(B.createElement('DIV'));this.MainNode.style.cssFloat=this.IsRTL?'right':'left';};FCKPanel.prototype.AppendStyleSheet=function(A){FCKTools.AppendStyleSheet(this.Document,A);};FCKPanel.prototype.Preload=function(x,y,A){if (this._Popup) this._Popup.show(x,y,0,0,A);};FCKPanel.prototype.Show=function(x,y,A,B,C){var D;var E=this.MainNode;if (this._Popup){this._Popup.show(x,y,0,0,A);FCKDomTools.SetElementStyles(E,{B:B?B+'px':'',C:C?C+'px':''});D=E.offsetWidth;if (this.IsRTL){if (this.IsContextMenu) x=x-D+1;else if (A) x=(x*-1)+A.offsetWidth-D;};this._Popup.show(x,y,D,E.offsetHeight,A);if (this.OnHide){if (this._Timer) CheckPopupOnHide.call(this,true);this._Timer=FCKTools.SetInterval(CheckPopupOnHide,100,this);}}else{if (typeof(FCK.ToolbarSet.CurrentInstance.FocusManager)!='undefined') FCK.ToolbarSet.CurrentInstance.FocusManager.Lock();if (this.ParentPanel){this.ParentPanel.Lock();FCKPanel_Window_OnBlur(null,this.ParentPanel);};if (FCKBrowserInfo.IsGecko&&FCKBrowserInfo.IsMac){this._IFrame.scrolling='';FCKTools.RunFunction(function(){ this._IFrame.scrolling='no';},this);};if (FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel&&FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel!=this) FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel.Hide(false,true);FCKDomTools.SetElementStyles(E,{B:B?B+'px':'',C:C?C+'px':''});D=E.offsetWidth;if (!B) this._IFrame.width=1;if (!C) this._IFrame.height=1;D=E.offsetWidth||E.firstChild.offsetWidth;var F=FCKTools.GetDocumentPosition(this._Window,A.nodeType==9?(FCKTools.IsStrictMode(A)?A.documentElement:A.body):A);var G=FCKDomTools.GetPositionedAncestor(this._IFrame.parentNode);if (G){var H=FCKTools.GetDocumentPosition(FCKTools.GetElementWindow(G),G);F.x-=H.x;F.y-=H.y;};if (this.IsRTL&&!this.IsContextMenu) x=(x*-1);x+=F.x;y+=F.y;if (this.IsRTL){if (this.IsContextMenu) x=x-D+1;else if (A) x=x+A.offsetWidth-D;}else{var I=FCKTools.GetViewPaneSize(this._Window);var J=FCKTools.GetScrollPosition(this._Window);var K=I.Height+J.Y;var L=I.Width+J.X;if ((x+D)>L) x-=x+D-L;if ((y+E.offsetHeight)>K) y-=y+E.offsetHeight-K;};FCKDomTools.SetElementStyles(this._IFrame,{left:x+'px',top:y+'px'});this._IFrame.contentWindow.focus();this._IsOpened=true;var M=this;this._resizeTimer=setTimeout(function(){var N=E.offsetWidth||E.firstChild.offsetWidth;var O=E.offsetHeight;M._IFrame.style.width=N+'px';M._IFrame.style.height=O+'px';},0);FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel=this;};FCKTools.RunFunction(this.OnShow,this);};FCKPanel.prototype.Hide=function(A,B){if (this._Popup) this._Popup.hide();else{if (!this._IsOpened||this._LockCounter>0) return;if (typeof(FCKFocusManager)!='undefined'&&!B) FCKFocusManager.Unlock();this._IFrame.style.width=this._IFrame.style.height='0px';this._IsOpened=false;if (this._resizeTimer){clearTimeout(this._resizeTimer);this._resizeTimer=null;};if (this.ParentPanel) this.ParentPanel.Unlock();if (!A) FCKTools.RunFunction(this.OnHide,this);}};FCKPanel.prototype.CheckIsOpened=function(){if (this._Popup) return this._Popup.isOpen;else return this._IsOpened;};FCKPanel.prototype.CreateChildPanel=function(){var A=this._Popup?FCKTools.GetDocumentWindow(this.Document):this._Window;var B=new FCKPanel(A);B.ParentPanel=this;return B;};FCKPanel.prototype.Lock=function(){this._LockCounter++;};FCKPanel.prototype.Unlock=function(){if (--this._LockCounter==0&&!this.HasFocus) this.Hide();};function FCKPanel_Window_OnFocus(e,A){A.HasFocus=true;};function FCKPanel_Window_OnBlur(e,A){A.HasFocus=false;if (A._LockCounter==0) FCKTools.RunFunction(A.Hide,A);};function CheckPopupOnHide(A){if (A||!this._Popup.isOpen){window.clearInterval(this._Timer);this._Timer=null;FCKTools.RunFunction(this.OnHide,this);}};function FCKPanel_Cleanup(){this._Popup=null;this._Window=null;this.Document=null;this.MainNode=null;};
var FCKIcon=function(A){var B=A?typeof(A):'undefined';switch (B){case 'number':this.Path=FCKConfig.SkinPath+'fck_strip.gif';this.Size=16;this.Position=A;break;case 'undefined':this.Path=FCK_SPACER_PATH;break;case 'string':this.Path=A;break;default:this.Path=A[0];this.Size=A[1];this.Position=A[2];}};FCKIcon.prototype.CreateIconElement=function(A){var B,eIconImage;if (this.Position){var C='-'+((this.Position-1)*this.Size)+'px';if (FCKBrowserInfo.IsIE){B=A.createElement('DIV');eIconImage=B.appendChild(A.createElement('IMG'));eIconImage.src=this.Path;eIconImage.style.top=C;}else{B=A.createElement('IMG');B.src=FCK_SPACER_PATH;B.style.backgroundPosition='0px '+C;B.style.backgroundImage='url("'+this.Path+'")';}}else{if (FCKBrowserInfo.IsIE){B=A.createElement('DIV');eIconImage=B.appendChild(A.createElement('IMG'));eIconImage.src=this.Path?this.Path:FCK_SPACER_PATH;}else{B=A.createElement('IMG');B.src=this.Path?this.Path:FCK_SPACER_PATH;}};B.className='TB_Button_Image';return B;};
var FCKToolbarButtonUI=function(A,B,C,D,E,F){this.Name=A;this.Label=B||A;this.Tooltip=C||this.Label;this.Style=E||0;this.State=F||0;this.Icon=new FCKIcon(D);if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKToolbarButtonUI_Cleanup);};FCKToolbarButtonUI.prototype._CreatePaddingElement=function(A){var B=A.createElement('IMG');B.className='TB_Button_Padding';B.src=FCK_SPACER_PATH;return B;};FCKToolbarButtonUI.prototype.Create=function(A){var B=FCKTools.GetElementDocument(A);var C=this.MainElement=B.createElement('DIV');C.title=this.Tooltip;if (FCKBrowserInfo.IsGecko) C.onmousedown=FCKTools.CancelEvent;FCKTools.AddEventListenerEx(C,'mouseover',FCKToolbarButtonUI_OnMouseOver,this);FCKTools.AddEventListenerEx(C,'mouseout',FCKToolbarButtonUI_OnMouseOut,this);FCKTools.AddEventListenerEx(C,'click',FCKToolbarButtonUI_OnClick,this);this.ChangeState(this.State,true);if (this.Style==0&&!this.ShowArrow){C.appendChild(this.Icon.CreateIconElement(B));}else{var D=C.appendChild(B.createElement('TABLE'));D.cellPadding=0;D.cellSpacing=0;var E=D.insertRow(-1);var F=E.insertCell(-1);if (this.Style==0||this.Style==2) F.appendChild(this.Icon.CreateIconElement(B));else F.appendChild(this._CreatePaddingElement(B));if (this.Style==1||this.Style==2){F=E.insertCell(-1);F.className='TB_Button_Text';F.noWrap=true;F.appendChild(B.createTextNode(this.Label));};if (this.ShowArrow){if (this.Style!=0){E.insertCell(-1).appendChild(this._CreatePaddingElement(B));};F=E.insertCell(-1);var G=F.appendChild(B.createElement('IMG'));G.src=FCKConfig.SkinPath+'images/toolbar.buttonarrow.gif';G.width=5;G.height=3;};F=E.insertCell(-1);F.appendChild(this._CreatePaddingElement(B));};A.appendChild(C);};FCKToolbarButtonUI.prototype.ChangeState=function(A,B){if (!B&&this.State==A) return;var e=this.MainElement;if (!e) return;switch (parseInt(A,10)){case 0:e.className='TB_Button_Off';break;case 1:e.className='TB_Button_On';break;case -1:e.className='TB_Button_Disabled';break;};this.State=A;};function FCKToolbarButtonUI_OnMouseOver(A,B){if (B.State==0) this.className='TB_Button_Off_Over';else if (B.State==1) this.className='TB_Button_On_Over';};function FCKToolbarButtonUI_OnMouseOut(A,B){if (B.State==0) this.className='TB_Button_Off';else if (B.State==1) this.className='TB_Button_On';};function FCKToolbarButtonUI_OnClick(A,B){if (B.OnClick&&B.State!=-1) B.OnClick(B);};function FCKToolbarButtonUI_Cleanup(){this.MainElement=null;};
@@ -93,7 +93,7 @@
var FCKToolbarFontsCombo=function(A,B){this.CommandName='FontName';this.Label=this.GetLabel();this.Tooltip=A?A:this.Label;this.Style=B?B:2;this.DefaultLabel=FCKConfig.DefaultFontLabel||'';};FCKToolbarFontsCombo.prototype=new FCKToolbarFontFormatCombo(false);FCKToolbarFontsCombo.prototype.GetLabel=function(){return FCKLang.Font;};FCKToolbarFontsCombo.prototype.GetStyles=function(){var A=FCKStyles.GetStyle('_FCK_FontFace');if (!A){alert("The FCKConfig.CoreStyles['Size'] setting was not found. Please check the fckconfig.js file");return {};};var B={};var C=FCKConfig.FontNames.split(';');for (var i=0;i<C.length;i++){var D=C[i].split('/');var E=D[0];var F=D[1]||E;var G=FCKTools.CloneObject(A);G.SetVariable('Font',E);G.Label=F;B[F]=G;};return B;};FCKToolbarFontsCombo.prototype.RefreshActiveItems=FCKToolbarStyleCombo.prototype.RefreshActiveItems;FCKToolbarFontsCombo.prototype.StyleCombo_OnBeforeClick=function(A){A.DeselectAll();var B=FCKSelection.GetBoundaryParentElement(true);if (B){var C=new FCKElementPath(B);for (var i in A.Items){var D=A.Items[i];var E=D.Style;if (E.CheckActive(C)){A.SelectItem(D);return;}}}};
var FCKToolbarFontSizeCombo=function(A,B){this.CommandName='FontSize';this.Label=this.GetLabel();this.Tooltip=A?A:this.Label;this.Style=B?B:2;this.DefaultLabel=FCKConfig.DefaultFontSizeLabel||'';this.FieldWidth=70;};FCKToolbarFontSizeCombo.prototype=new FCKToolbarFontFormatCombo(false);FCKToolbarFontSizeCombo.prototype.GetLabel=function(){return FCKLang.FontSize;};FCKToolbarFontSizeCombo.prototype.GetStyles=function(){var A=FCKStyles.GetStyle('_FCK_Size');if (!A){alert("The FCKConfig.CoreStyles['FontFace'] setting was not found. Please check the fckconfig.js file");return {};};var B={};var C=FCKConfig.FontSizes.split(';');for (var i=0;i<C.length;i++){var D=C[i].split('/');var E=D[0];var F=D[1]||E;var G=FCKTools.CloneObject(A);G.SetVariable('Size',E);G.Label=F;B[F]=G;};return B;};FCKToolbarFontSizeCombo.prototype.RefreshActiveItems=FCKToolbarStyleCombo.prototype.RefreshActiveItems;FCKToolbarFontSizeCombo.prototype.StyleCombo_OnBeforeClick=FCKToolbarFontsCombo.prototype.StyleCombo_OnBeforeClick;
var FCKToolbarPanelButton=function(A,B,C,D,E){this.CommandName=A;var F;if (E==null) F=FCKConfig.SkinPath+'toolbar/'+A.toLowerCase()+'.gif';else if (typeof(E)=='number') F=[FCKConfig.SkinPath+'fck_strip.gif',16,E];var G=this._UIButton=new FCKToolbarButtonUI(A,B,C,F,D);G._FCKToolbarPanelButton=this;G.ShowArrow=true;G.OnClick=FCKToolbarPanelButton_OnButtonClick;};FCKToolbarPanelButton.prototype.TypeName='FCKToolbarPanelButton';FCKToolbarPanelButton.prototype.Create=function(A){A.className+='Menu';this._UIButton.Create(A);var B=FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(this.CommandName)._Panel;this.RegisterPanel(B);};FCKToolbarPanelButton.prototype.RegisterPanel=function(A){if (A._FCKToolbarPanelButton) return;A._FCKToolbarPanelButton=this;var B=A.Document.body.appendChild(A.Document.createElement('div'));B.style.position='absolute';B.style.top='0px';var C=A._FCKToolbarPanelButtonLineDiv=B.appendChild(A.Document.createElement('IMG'));C.className='TB_ConnectionLine';C.style.position='absolute';C.src=FCK_SPACER_PATH;A.OnHide=FCKToolbarPanelButton_OnPanelHide;};function FCKToolbarPanelButton_OnButtonClick(A){var B=this._FCKToolbarPanelButton;var e=B._UIButton.MainElement;B._UIButton.ChangeState(1);var C=FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(B.CommandName);var D=C._Panel;D._FCKToolbarPanelButtonLineDiv.style.width=(e.offsetWidth-2)+'px';C.Execute(0,e.offsetHeight-1,e);};function FCKToolbarPanelButton_OnPanelHide(){var A=this._FCKToolbarPanelButton;A._UIButton.ChangeState(0);};FCKToolbarPanelButton.prototype.RefreshState=FCKToolbarButton.prototype.RefreshState;FCKToolbarPanelButton.prototype.Enable=FCKToolbarButton.prototype.Enable;FCKToolbarPanelButton.prototype.Disable=FCKToolbarButton.prototype.Disable;
-var FCKToolbarItems={};FCKToolbarItems.LoadedItems={};FCKToolbarItems.RegisterItem=function(A,B){this.LoadedItems[A]=B;};FCKToolbarItems.GetItem=function(A){var B=FCKToolbarItems.LoadedItems[A];if (B) return B;switch (A){case 'Source':B=new FCKToolbarButton('Source',FCKLang.Source,null,2,true,true,1);break;case 'DocProps':B=new FCKToolbarButton('DocProps',FCKLang.DocProps,null,null,null,null,2);break;case 'Save':B=new FCKToolbarButton('Save',FCKLang.Save,null,null,true,null,3);break;case 'NewPage':B=new FCKToolbarButton('NewPage',FCKLang.NewPage,null,null,true,null,4);break;case 'Preview':B=new FCKToolbarButton('Preview',FCKLang.Preview,null,null,true,null,5);break;case 'Templates':B=new FCKToolbarButton('Templates',FCKLang.Templates,null,null,null,null,6);break;case 'About':B=new FCKToolbarButton('About',FCKLang.About,null,null,true,null,47);break;case 'Cut':B=new FCKToolbarButton('Cut',FCKLang.Cut,null,null,false,true,7);break;case 'Copy':B=new FCKToolbarButton('Copy',FCKLang.Copy,null,null,false,true,8);break;case 'Paste':B=new FCKToolbarButton('Paste',FCKLang.Paste,null,null,false,true,9);break;case 'PasteText':B=new FCKToolbarButton('PasteText',FCKLang.PasteText,null,null,false,true,10);break;case 'PasteWord':B=new FCKToolbarButton('PasteWord',FCKLang.PasteWord,null,null,false,true,11);break;case 'Print':B=new FCKToolbarButton('Print',FCKLang.Print,null,null,false,true,12);break;case 'SpellCheck':B=new FCKToolbarButton('SpellCheck',FCKLang.SpellCheck,null,null,null,null,13);break;case 'Undo':B=new FCKToolbarButton('Undo',FCKLang.Undo,null,null,false,true,14);break;case 'Redo':B=new FCKToolbarButton('Redo',FCKLang.Redo,null,null,false,true,15);break;case 'SelectAll':B=new FCKToolbarButton('SelectAll',FCKLang.SelectAll,null,null,true,null,18);break;case 'RemoveFormat':B=new FCKToolbarButton('RemoveFormat',FCKLang.RemoveFormat,null,null,false,true,19);break;case 'FitWindow':B=new FCKToolbarButton('FitWindow',FCKLang.FitWindow,null,null,true,true,66);break;case 'Bold':B=new FCKToolbarButton('Bold',FCKLang.Bold,null,null,false,true,20);break;case 'Italic':B=new FCKToolbarButton('Italic',FCKLang.Italic,null,null,false,true,21);break;case 'Underline':B=new FCKToolbarButton('Underline',FCKLang.Underline,null,null,false,true,22);break;case 'StrikeThrough':B=new FCKToolbarButton('StrikeThrough',FCKLang.StrikeThrough,null,null,false,true,23);break;case 'Subscript':B=new FCKToolbarButton('Subscript',FCKLang.Subscript,null,null,false,true,24);break;case 'Superscript':B=new FCKToolbarButton('Superscript',FCKLang.Superscript,null,null,false,true,25);break;case 'OrderedList':B=new FCKToolbarButton('InsertOrderedList',FCKLang.NumberedListLbl,FCKLang.NumberedList,null,false,true,26);break;case 'UnorderedList':B=new FCKToolbarButton('InsertUnorderedList',FCKLang.BulletedListLbl,FCKLang.BulletedList,null,false,true,27);break;case 'Outdent':B=new FCKToolbarButton('Outdent',FCKLang.DecreaseIndent,null,null,false,true,28);break;case 'Indent':B=new FCKToolbarButton('Indent',FCKLang.IncreaseIndent,null,null,false,true,29);break;case 'Blockquote':B=new FCKToolbarButton('Blockquote',FCKLang.Blockquote,null,null,false,true,73);break;case 'Link':B=new FCKToolbarButton('Link',FCKLang.InsertLinkLbl,FCKLang.InsertLink,null,false,true,34);break;case 'Unlink':B=new FCKToolbarButton('Unlink',FCKLang.RemoveLink,null,null,false,true,35);break;case 'Anchor':B=new FCKToolbarButton('Anchor',FCKLang.Anchor,null,null,null,null,36);break;case 'Image':B=new FCKToolbarButton('Image',FCKLang.InsertImageLbl,FCKLang.InsertImage,null,false,true,37);break;case 'Flash':B=new FCKToolbarButton('Flash',FCKLang.InsertFlashLbl,FCKLang.InsertFlash,null,false,true,38);break;case 'Table':B=new FCKToolbarButton('Table',FCKLang.InsertTableLbl,FCKLang.InsertTable,null,false,true,39);break;case 'SpecialChar':B=new FCKToolbarButton('SpecialChar',FCKLang.InsertSpecialCharLbl,FCKLang.InsertSpecialChar,null,false,true,42);break;case 'Smiley':B=new FCKToolbarButton('Smiley',FCKLang.InsertSmileyLbl,FCKLang.InsertSmiley,null,false,true,41);break;case 'PageBreak':B=new FCKToolbarButton('PageBreak',FCKLang.PageBreakLbl,FCKLang.PageBreak,null,false,true,43);break;case 'Rule':B=new FCKToolbarButton('Rule',FCKLang.InsertLineLbl,FCKLang.InsertLine,null,false,true,40);break;case 'JustifyLeft':B=new FCKToolbarButton('JustifyLeft',FCKLang.LeftJustify,null,null,false,true,30);break;case 'JustifyCenter':B=new FCKToolbarButton('JustifyCenter',FCKLang.CenterJustify,null,null,false,true,31);break;case 'JustifyRight':B=new FCKToolbarButton('JustifyRight',FCKLang.RightJustify,null,null,false,true,32);break;case 'JustifyFull':B=new FCKToolbarButton('JustifyFull',FCKLang.BlockJustify,null,null,false,true,33);break;case 'Style':B=new FCKToolbarStyleCombo();break;case 'FontName':B=new FCKToolbarFontsCombo();break;case 'FontSize':B=new FCKToolbarFontSizeCombo();break;case 'FontFormat':B=new FCKToolbarFontFormatCombo();break;case 'TextColor':B=new FCKToolbarPanelButton('TextColor',FCKLang.TextColor,null,null,45);break;case 'BGColor':B=new FCKToolbarPanelButton('BGColor',FCKLang.BGColor,null,null,46);break;case 'Find':B=new FCKToolbarButton('Find',FCKLang.Find,null,null,null,null,16);break;case 'Replace':B=new FCKToolbarButton('Replace',FCKLang.Replace,null,null,null,null,17);break;case 'Form':B=new FCKToolbarButton('Form',FCKLang.Form,null,null,null,null,48);break;case 'Checkbox':B=new FCKToolbarButton('Checkbox',FCKLang.Checkbox,null,null,null,null,49);break;case 'Radio':B=new FCKToolbarButton('Radio',FCKLang.RadioButton,null,null,null,null,50);break;case 'TextField':B=new FCKToolbarButton('TextField',FCKLang.TextField,null,null,null,null,51);break;case 'Textarea':B=new FCKToolbarButton('Textarea',FCKLang.Textarea,null,null,null,null,52);break;case 'HiddenField':B=new FCKToolbarButton('HiddenField',FCKLang.HiddenField,null,null,null,null,56);break;case 'Button':B=new FCKToolbarButton('Button',FCKLang.Button,null,null,null,null,54);break;case 'Select':B=new FCKToolbarButton('Select',FCKLang.SelectionField,null,null,null,null,53);break;case 'ImageButton':B=new FCKToolbarButton('ImageButton',FCKLang.ImageButton,null,null,null,null,55);break;case 'ShowBlocks':B=new FCKToolbarButton('ShowBlocks',FCKLang.ShowBlocks,null,null,null,true,72);break;default:alert(FCKLang.UnknownToolbarItem.replace(/%1/g,A));return null;};FCKToolbarItems.LoadedItems[A]=B;return B;};
+var FCKToolbarItems={};FCKToolbarItems.LoadedItems={};FCKToolbarItems.RegisterItem=function(A,B){this.LoadedItems[A]=B;};FCKToolbarItems.GetItem=function(A){var B=FCKToolbarItems.LoadedItems[A];if (B) return B;switch (A){case 'Source':B=new FCKToolbarButton('Source',FCKLang.Source,null,2,true,true,1);break;case 'DocProps':B=new FCKToolbarButton('DocProps',FCKLang.DocProps,null,null,null,null,2);break;case 'Save':B=new FCKToolbarButton('Save',FCKLang.Save,null,null,true,null,3);break;case 'NewPage':B=new FCKToolbarButton('NewPage',FCKLang.NewPage,null,null,true,null,4);break;case 'Preview':B=new FCKToolbarButton('Preview',FCKLang.Preview,null,null,true,null,5);break;case 'Templates':B=new FCKToolbarButton('Templates',FCKLang.Templates,null,null,null,null,6);break;case 'About':B=new FCKToolbarButton('About',FCKLang.About,null,null,true,null,47);break;case 'Cut':B=new FCKToolbarButton('Cut',FCKLang.Cut,null,null,false,true,7);break;case 'Copy':B=new FCKToolbarButton('Copy',FCKLang.Copy,null,null,false,true,8);break;case 'Paste':B=new FCKToolbarButton('Paste',FCKLang.Paste,null,null,false,true,9);break;case 'PasteText':B=new FCKToolbarButton('PasteText',FCKLang.PasteText,null,null,false,true,10);break;case 'PasteWord':B=new FCKToolbarButton('PasteWord',FCKLang.PasteWord,null,null,false,true,11);break;case 'Print':B=new FCKToolbarButton('Print',FCKLang.Print,null,null,false,true,12);break;case 'SpellCheck':B=new FCKToolbarButton('SpellCheck',FCKLang.SpellCheck,null,null,null,null,13);break;case 'Undo':B=new FCKToolbarButton('Undo',FCKLang.Undo,null,null,false,true,14);break;case 'Redo':B=new FCKToolbarButton('Redo',FCKLang.Redo,null,null,false,true,15);break;case 'SelectAll':B=new FCKToolbarButton('SelectAll',FCKLang.SelectAll,null,null,true,null,18);break;case 'RemoveFormat':B=new FCKToolbarButton('RemoveFormat',FCKLang.RemoveFormat,null,null,false,true,19);break;case 'FitWindow':B=new FCKToolbarButton('FitWindow',FCKLang.FitWindow,null,null,true,true,66);break;case 'Bold':B=new FCKToolbarButton('Bold',FCKLang.Bold,null,null,false,true,20);break;case 'Italic':B=new FCKToolbarButton('Italic',FCKLang.Italic,null,null,false,true,21);break;case 'Underline':B=new FCKToolbarButton('Underline',FCKLang.Underline,null,null,false,true,22);break;case 'StrikeThrough':B=new FCKToolbarButton('StrikeThrough',FCKLang.StrikeThrough,null,null,false,true,23);break;case 'Subscript':B=new FCKToolbarButton('Subscript',FCKLang.Subscript,null,null,false,true,24);break;case 'Superscript':B=new FCKToolbarButton('Superscript',FCKLang.Superscript,null,null,false,true,25);break;case 'OrderedList':B=new FCKToolbarButton('InsertOrderedList',FCKLang.NumberedListLbl,FCKLang.NumberedList,null,false,true,26);break;case 'UnorderedList':B=new FCKToolbarButton('InsertUnorderedList',FCKLang.BulletedListLbl,FCKLang.BulletedList,null,false,true,27);break;case 'Outdent':B=new FCKToolbarButton('Outdent',FCKLang.DecreaseIndent,null,null,false,true,28);break;case 'Indent':B=new FCKToolbarButton('Indent',FCKLang.IncreaseIndent,null,null,false,true,29);break;case 'Blockquote':B=new FCKToolbarButton('Blockquote',FCKLang.Blockquote,null,null,false,true,73);break;case 'CreateDiv':B=new FCKToolbarButton('CreateDiv',FCKLang.CreateDiv,null,null,false,true,74);break;case 'Link':B=new FCKToolbarButton('Link',FCKLang.InsertLinkLbl,FCKLang.InsertLink,null,false,true,34);break;case 'Unlink':B=new FCKToolbarButton('Unlink',FCKLang.RemoveLink,null,null,false,true,35);break;case 'Anchor':B=new FCKToolbarButton('Anchor',FCKLang.Anchor,null,null,null,null,36);break;case 'Image':B=new FCKToolbarButton('Image',FCKLang.InsertImageLbl,FCKLang.InsertImage,null,false,true,37);break;case 'Flash':B=new FCKToolbarButton('Flash',FCKLang.InsertFlashLbl,FCKLang.InsertFlash,null,false,true,38);break;case 'Table':B=new FCKToolbarButton('Table',FCKLang.InsertTableLbl,FCKLang.InsertTable,null,false,true,39);break;case 'SpecialChar':B=new FCKToolbarButton('SpecialChar',FCKLang.InsertSpecialCharLbl,FCKLang.InsertSpecialChar,null,false,true,42);break;case 'Smiley':B=new FCKToolbarButton('Smiley',FCKLang.InsertSmileyLbl,FCKLang.InsertSmiley,null,false,true,41);break;case 'PageBreak':B=new FCKToolbarButton('PageBreak',FCKLang.PageBreakLbl,FCKLang.PageBreak,null,false,true,43);break;case 'Rule':B=new FCKToolbarButton('Rule',FCKLang.InsertLineLbl,FCKLang.InsertLine,null,false,true,40);break;case 'JustifyLeft':B=new FCKToolbarButton('JustifyLeft',FCKLang.LeftJustify,null,null,false,true,30);break;case 'JustifyCenter':B=new FCKToolbarButton('JustifyCenter',FCKLang.CenterJustify,null,null,false,true,31);break;case 'JustifyRight':B=new FCKToolbarButton('JustifyRight',FCKLang.RightJustify,null,null,false,true,32);break;case 'JustifyFull':B=new FCKToolbarButton('JustifyFull',FCKLang.BlockJustify,null,null,false,true,33);break;case 'Style':B=new FCKToolbarStyleCombo();break;case 'FontName':B=new FCKToolbarFontsCombo();break;case 'FontSize':B=new FCKToolbarFontSizeCombo();break;case 'FontFormat':B=new FCKToolbarFontFormatCombo();break;case 'TextColor':B=new FCKToolbarPanelButton('TextColor',FCKLang.TextColor,null,null,45);break;case 'BGColor':B=new FCKToolbarPanelButton('BGColor',FCKLang.BGColor,null,null,46);break;case 'Find':B=new FCKToolbarButton('Find',FCKLang.Find,null,null,null,null,16);break;case 'Replace':B=new FCKToolbarButton('Replace',FCKLang.Replace,null,null,null,null,17);break;case 'Form':B=new FCKToolbarButton('Form',FCKLang.Form,null,null,null,null,48);break;case 'Checkbox':B=new FCKToolbarButton('Checkbox',FCKLang.Checkbox,null,null,null,null,49);break;case 'Radio':B=new FCKToolbarButton('Radio',FCKLang.RadioButton,null,null,null,null,50);break;case 'TextField':B=new FCKToolbarButton('TextField',FCKLang.TextField,null,null,null,null,51);break;case 'Textarea':B=new FCKToolbarButton('Textarea',FCKLang.Textarea,null,null,null,null,52);break;case 'HiddenField':B=new FCKToolbarButton('HiddenField',FCKLang.HiddenField,null,null,null,null,56);break;case 'Button':B=new FCKToolbarButton('Button',FCKLang.Button,null,null,null,null,54);break;case 'Select':B=new FCKToolbarButton('Select',FCKLang.SelectionField,null,null,null,null,53);break;case 'ImageButton':B=new FCKToolbarButton('ImageButton',FCKLang.ImageButton,null,null,null,null,55);break;case 'ShowBlocks':B=new FCKToolbarButton('ShowBlocks',FCKLang.ShowBlocks,null,null,null,true,72);break;default:alert(FCKLang.UnknownToolbarItem.replace(/%1/g,A));return null;};FCKToolbarItems.LoadedItems[A]=B;return B;};
var FCKToolbar=function(){this.Items=[];};FCKToolbar.prototype.AddItem=function(A){return this.Items[this.Items.length]=A;};FCKToolbar.prototype.AddButton=function(A,B,C,D,E,F){if (typeof(D)=='number') D=[this.DefaultIconsStrip,this.DefaultIconSize,D];var G=new FCKToolbarButtonUI(A,B,C,D,E,F);G._FCKToolbar=this;G.OnClick=FCKToolbar_OnItemClick;return this.AddItem(G);};function FCKToolbar_OnItemClick(A){var B=A._FCKToolbar;if (B.OnItemClick) B.OnItemClick(B,A);};FCKToolbar.prototype.AddSeparator=function(){this.AddItem(new FCKToolbarSeparator());};FCKToolbar.prototype.Create=function(A){var B=FCKTools.GetElementDocument(A);var e=B.createElement('table');e.className='TB_Toolbar';e.style.styleFloat=e.style.cssFloat=(FCKLang.Dir=='ltr'?'left':'right');e.dir=FCKLang.Dir;e.cellPadding=0;e.cellSpacing=0;var C=e.insertRow(-1);var D;if (!this.HideStart){D=C.insertCell(-1);D.appendChild(B.createElement('div')).className='TB_Start';};for (var i=0;i<this.Items.length;i++){this.Items[i].Create(C.insertCell(-1));};if (!this.HideEnd){D=C.insertCell(-1);D.appendChild(B.createElement('div')).className='TB_End';};A.appendChild(e);};var FCKToolbarSeparator=function(){};FCKToolbarSeparator.prototype.Create=function(A){FCKTools.AppendElement(A,'div').className='TB_Separator';};
var FCKToolbarBreak=function(){};FCKToolbarBreak.prototype.Create=function(A){var B=A.ownerDocument.createElement('div');B.style.clear=B.style.cssFloat=FCKLang.Dir=='rtl'?'right':'left';A.appendChild(B);};
function FCKToolbarSet_Create(A){var B;var C=A||FCKConfig.ToolbarLocation;switch (C){case 'In':document.getElementById('xToolbarRow').style.display='';B=new FCKToolbarSet(document);break;case 'None':B=new FCKToolbarSet(document);break;default:FCK.Events.AttachEvent('OnBlur',FCK_OnBlur);FCK.Events.AttachEvent('OnFocus',FCK_OnFocus);var D;var E=C.match(/^Out:(.+)\((\w+)\)$/);if (E){if (FCKBrowserInfo.IsAIR) FCKAdobeAIR.ToolbarSet_GetOutElement(window,E);else D=eval('parent.'+E[1]).document.getElementById(E[2]);}else{E=C.match(/^Out:(\w+)$/);if (E) D=parent.document.getElementById(E[1]);};if (!D){alert('Invalid value for "ToolbarLocation"');return arguments.callee('In');};B=D.__FCKToolbarSet;if (B) break;var F=FCKTools.GetElementDocument(D).createElement('iframe');F.src='javascript:void(0)';F.frameBorder=0;F.width='100%';F.height='10';D.appendChild(F);F.unselectable='on';var G=F.contentWindow.document;var H='';if (FCKBrowserInfo.IsSafari) H='<base href="'+window.document.location+'">';G.open();G.write('<html><head>'+H+'<script type="text/javascript"> var adjust = function() { window.frameElement.height = document.body.scrollHeight ; }; window.onresize = window.onload = function(){var timer = null;var lastHeight = -1;var lastChange = 0;var poller = function(){var currentHeight = document.body.scrollHeight || 0;var currentTime = (new Date()).getTime();if (currentHeight != lastHeight){lastChange = currentTime;adjust();lastHeight = document.body.scrollHeight;}if (lastChange < currentTime - 1000) clearInterval(timer);};timer = setInterval(poller, 100);}</script></head><body style="overflow: hidden">'+document.getElementById('xToolbarSpace').innerHTML+'</body></html>');G.close();if(FCKBrowserInfo.IsAIR) FCKAdobeAIR.ToolbarSet_InitOutFrame(G);FCKTools.AddEventListener(G,'contextmenu',FCKTools.CancelEvent);FCKTools.AppendStyleSheet(G,FCKConfig.SkinEditorCSS);B=D.__FCKToolbarSet=new FCKToolbarSet(G);B._IFrame=F;if (FCK.IECleanup) FCK.IECleanup.AddItem(D,FCKToolbarSet_Target_Cleanup);};B.CurrentInstance=FCK;if (!B.ToolbarItems) B.ToolbarItems=FCKToolbarItems;FCK.AttachToOnSelectionChange(B.RefreshItemsState);return B;};function FCK_OnBlur(A){var B=A.ToolbarSet;if (B.CurrentInstance==A) B.Disable();};function FCK_OnFocus(A){var B=A.ToolbarSet;var C=A||FCK;B.CurrentInstance.FocusManager.RemoveWindow(B._IFrame.contentWindow);B.CurrentInstance=C;C.FocusManager.AddWindow(B._IFrame.contentWindow,true);B.Enable();};function FCKToolbarSet_Cleanup(){this._TargetElement=null;this._IFrame=null;};function FCKToolbarSet_Target_Cleanup(){this.__FCKToolbarSet=null;};var FCKToolbarSet=function(A){this._Document=A;this._TargetElement=A.getElementById('xToolbar');var B=A.getElementById('xExpandHandle');var C=A.getElementById('xCollapseHandle');B.title=FCKLang.ToolbarExpand;FCKTools.AddEventListener(B,'click',FCKToolbarSet_Expand_OnClick);C.title=FCKLang.ToolbarCollapse;FCKTools.AddEventListener(C,'click',FCKToolbarSet_Collapse_OnClick);if (!FCKConfig.ToolbarCanCollapse||FCKConfig.ToolbarStartExpanded) this.Expand();else this.Collapse();C.style.display=FCKConfig.ToolbarCanCollapse?'':'none';if (FCKConfig.ToolbarCanCollapse) C.style.display='';else A.getElementById('xTBLeftBorder').style.display='';this.Toolbars=[];this.IsLoaded=false;if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKToolbarSet_Cleanup);};function FCKToolbarSet_Expand_OnClick(){FCK.ToolbarSet.Expand();};function FCKToolbarSet_Collapse_OnClick(){FCK.ToolbarSet.Collapse();};FCKToolbarSet.prototype.Expand=function(){this._ChangeVisibility(false);};FCKToolbarSet.prototype.Collapse=function(){this._ChangeVisibility(true);};FCKToolbarSet.prototype._ChangeVisibility=function(A){this._Document.getElementById('xCollapsed').style.display=A?'':'none';this._Document.getElementById('xExpanded').style.display=A?'none':'';if (FCKBrowserInfo.IsGecko){FCKTools.RunFunction(window.onresize);}};FCKToolbarSet.prototype.Load=function(A){this.Name=A;this.Items=[];this.ItemsWysiwygOnly=[];this.ItemsContextSensitive=[];this._TargetElement.innerHTML='';var B=FCKConfig.ToolbarSets[A];if (!B){alert(FCKLang.UnknownToolbarSet.replace(/%1/g,A));return;};this.Toolbars=[];for (var x=0;x<B.length;x++){var C=B[x];if (!C) continue;var D;if (typeof(C)=='string'){if (C=='/') D=new FCKToolbarBreak();}else{D=new FCKToolbar();for (var j=0;j<C.length;j++){var E=C[j];if (E=='-') D.AddSeparator();else{var F=FCKToolbarItems.GetItem(E);if (F){D.AddItem(F);this.Items.push(F);if (!F.SourceView) this.ItemsWysiwygOnly.push(F);if (F.ContextSensitive) this.ItemsContextSensitive.push(F);}}}};D.Create(this._TargetElement);this.Toolbars[this.Toolbars.length]=D;};FCKTools.DisableSelection(this._Document.getElementById('xCollapseHandle').parentNode);if (FCK.Status!=2) FCK.Events.AttachEvent('OnStatusChange',this.RefreshModeState);else this.RefreshModeState();this.IsLoaded=true;this.IsEnabled=true;FCKTools.RunFunction(this.OnLoad);};FCKToolbarSet.prototype.Enable=function(){if (this.IsEnabled) return;this.IsEnabled=true;var A=this.Items;for (var i=0;i<A.length;i++) A[i].RefreshState();};FCKToolbarSet.prototype.Disable=function(){if (!this.IsEnabled) return;this.IsEnabled=false;var A=this.Items;for (var i=0;i<A.length;i++) A[i].Disable();};FCKToolbarSet.prototype.RefreshModeState=function(A){if (FCK.Status!=2) return;var B=A?A.ToolbarSet:this;var C=B.ItemsWysiwygOnly;if (FCK.EditMode==0){for (var i=0;i<C.length;i++) C[i].Enable();B.RefreshItemsState(A);}else{B.RefreshItemsState(A);for (var j=0;j<C.length;j++) C[j].Disable();}};FCKToolbarSet.prototype.RefreshItemsState=function(A){var B=(A?A.ToolbarSet:this).ItemsContextSensitive;for (var i=0;i<B.length;i++) B[i].RefreshState();};
@@ -101,8 +101,8 @@
var FCKMenuItem=function(A,B,C,D,E,F){this.Name=B;this.Label=C||B;this.IsDisabled=E;this.Icon=new FCKIcon(D);this.SubMenu=new FCKMenuBlockPanel();this.SubMenu.Parent=A;this.SubMenu.OnClick=FCKTools.CreateEventListener(FCKMenuItem_SubMenu_OnClick,this);this.CustomData=F;if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKMenuItem_Cleanup);};FCKMenuItem.prototype.AddItem=function(A,B,C,D,E){this.HasSubMenu=true;return this.SubMenu.AddItem(A,B,C,D,E);};FCKMenuItem.prototype.AddSeparator=function(){this.SubMenu.AddSeparator();};FCKMenuItem.prototype.Create=function(A){var B=this.HasSubMenu;var C=FCKTools.GetElementDocument(A);var r=this.MainElement=A.insertRow(-1);r.className=this.IsDisabled?'MN_Item_Disabled':'MN_Item';if (!this.IsDisabled){FCKTools.AddEventListenerEx(r,'mouseover',FCKMenuItem_OnMouseOver,[this]);FCKTools.AddEventListenerEx(r,'click',FCKMenuItem_OnClick,[this]);if (!B) FCKTools.AddEventListenerEx(r,'mouseout',FCKMenuItem_OnMouseOut,[this]);};var D=r.insertCell(-1);D.className='MN_Icon';D.appendChild(this.Icon.CreateIconElement(C));D=r.insertCell(-1);D.className='MN_Label';D.noWrap=true;D.appendChild(C.createTextNode(this.Label));D=r.insertCell(-1);if (B){D.className='MN_Arrow';var E=D.appendChild(C.createElement('IMG'));E.src=FCK_IMAGES_PATH+'arrow_'+FCKLang.Dir+'.gif';E.width=4;E.height=7;this.SubMenu.Create();this.SubMenu.Panel.OnHide=FCKTools.CreateEventListener(FCKMenuItem_SubMenu_OnHide,this);}};FCKMenuItem.prototype.Activate=function(){this.MainElement.className='MN_Item_Over';if (this.HasSubMenu){this.SubMenu.Show(this.MainElement.offsetWidth+2,-2,this.MainElement);};FCKTools.RunFunction(this.OnActivate,this);};FCKMenuItem.prototype.Deactivate=function(){this.MainElement.className='MN_Item';if (this.HasSubMenu) this.SubMenu.Hide();};function FCKMenuItem_SubMenu_OnClick(A,B){FCKTools.RunFunction(B.OnClick,B,[A]);};function FCKMenuItem_SubMenu_OnHide(A){A.Deactivate();};function FCKMenuItem_OnClick(A,B){if (B.HasSubMenu) B.Activate();else{B.Deactivate();FCKTools.RunFunction(B.OnClick,B,[B]);}};function FCKMenuItem_OnMouseOver(A,B){B.Activate();};function FCKMenuItem_OnMouseOut(A,B){B.Deactivate();};function FCKMenuItem_Cleanup(){this.MainElement=null;};
var FCKMenuBlock=function(){this._Items=[];};FCKMenuBlock.prototype.Count=function(){return this._Items.length;};FCKMenuBlock.prototype.AddItem=function(A,B,C,D,E){var F=new FCKMenuItem(this,A,B,C,D,E);F.OnClick=FCKTools.CreateEventListener(FCKMenuBlock_Item_OnClick,this);F.OnActivate=FCKTools.CreateEventListener(FCKMenuBlock_Item_OnActivate,this);this._Items.push(F);return F;};FCKMenuBlock.prototype.AddSeparator=function(){this._Items.push(new FCKMenuSeparator());};FCKMenuBlock.prototype.RemoveAllItems=function(){this._Items=[];var A=this._ItemsTable;if (A){while (A.rows.length>0) A.deleteRow(0);}};FCKMenuBlock.prototype.Create=function(A){if (!this._ItemsTable){if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKMenuBlock_Cleanup);this._Window=FCKTools.GetElementWindow(A);var B=FCKTools.GetElementDocument(A);var C=A.appendChild(B.createElement('table'));C.cellPadding=0;C.cellSpacing=0;FCKTools.DisableSelection(C);var D=C.insertRow(-1).insertCell(-1);D.className='MN_Menu';var E=this._ItemsTable=D.appendChild(B.createElement('table'));E.cellPadding=0;E.cellSpacing=0;};for (var i=0;i<this._Items.length;i++) this._Items[i].Create(this._ItemsTable);};function FCKMenuBlock_Item_OnClick(A,B){if (B.Hide) B.Hide();FCKTools.RunFunction(B.OnClick,B,[A]);};function FCKMenuBlock_Item_OnActivate(A){var B=A._ActiveItem;if (B&&B!=this){if (!FCKBrowserInfo.IsIE&&B.HasSubMenu&&!this.HasSubMenu){A._Window.focus();A.Panel.HasFocus=true;};B.Deactivate();};A._ActiveItem=this;};function FCKMenuBlock_Cleanup(){this._Window=null;this._ItemsTable=null;};var FCKMenuSeparator=function(){};FCKMenuSeparator.prototype.Create=function(A){var B=FCKTools.GetElementDocument(A);var r=A.insertRow(-1);var C=r.insertCell(-1);C.className='MN_Separator MN_Icon';C=r.insertCell(-1);C.className='MN_Separator';C.appendChild(B.createElement('DIV')).className='MN_Separator_Line';C=r.insertCell(-1);C.className='MN_Separator';C.appendChild(B.createElement('DIV')).className='MN_Separator_Line';};
var FCKMenuBlockPanel=function(){FCKMenuBlock.call(this);};FCKMenuBlockPanel.prototype=new FCKMenuBlock();FCKMenuBlockPanel.prototype.Create=function(){var A=this.Panel=(this.Parent&&this.Parent.Panel?this.Parent.Panel.CreateChildPanel():new FCKPanel());A.AppendStyleSheet(FCKConfig.SkinEditorCSS);FCKMenuBlock.prototype.Create.call(this,A.MainNode);};FCKMenuBlockPanel.prototype.Show=function(x,y,A){if (!this.Panel.CheckIsOpened()) this.Panel.Show(x,y,A);};FCKMenuBlockPanel.prototype.Hide=function(){if (this.Panel.CheckIsOpened()) this.Panel.Hide();};
-var FCKContextMenu=function(A,B){this.CtrlDisable=false;var C=this._Panel=new FCKPanel(A);C.AppendStyleSheet(FCKConfig.SkinEditorCSS);C.IsContextMenu=true;if (FCKBrowserInfo.IsGecko) C.Document.addEventListener('draggesture',function(e) {e.preventDefault();return false;},true);var D=this._MenuBlock=new FCKMenuBlock();D.Panel=C;D.OnClick=FCKTools.CreateEventListener(FCKContextMenu_MenuBlock_OnClick,this);this._Redraw=true;};FCKContextMenu.prototype.SetMouseClickWindow=function(A){if (!FCKBrowserInfo.IsIE){this._Document=A.document;if (FCKBrowserInfo.IsOpera&&!('oncontextmenu' in document.createElement('foo'))){this._Document.addEventListener('mousedown',FCKContextMenu_Document_OnMouseDown,false);this._Document.addEventListener('mouseup',FCKContextMenu_Document_OnMouseUp,false);};this._Document.addEventListener('contextmenu',FCKContextMenu_Document_OnContextMenu,false);}};FCKContextMenu.prototype.AddItem=function(A,B,C,D,E){var F=this._MenuBlock.AddItem(A,B,C,D,E);this._Redraw=true;return F;};FCKContextMenu.prototype.AddSeparator=function(){this._MenuBlock.AddSeparator();this._Redraw=true;};FCKContextMenu.prototype.RemoveAllItems=function(){this._MenuBlock.RemoveAllItems();this._Redraw=true;};FCKContextMenu.prototype.AttachToElement=function(A){if (FCKBrowserInfo.IsIE) FCKTools.AddEventListenerEx(A,'contextmenu',FCKContextMenu_AttachedElement_OnContextMenu,this);else A._FCKContextMenu=this;};function FCKContextMenu_Document_OnContextMenu(e){var A=e.target;while (A){if (A._FCKContextMenu){if (A._FCKContextMenu.CtrlDisable&&(e.ctrlKey||e.metaKey)) return true;FCKTools.CancelEvent(e);FCKContextMenu_AttachedElement_OnContextMenu(e,A._FCKContextMenu,A);return false;};A=A.parentNode;};return true;};var FCKContextMenu_OverrideButton;function FCKContextMenu_Document_OnMouseDown(e){if(!e||e.button!=2) return false;var A=e.target;while (A){if (A._FCKContextMenu){if (A._FCKContextMenu.CtrlDisable&&(e.ctrlKey||e.metaKey)) return true;var B=FCKContextMenu_OverrideButton;if(!B){var C=FCKTools.GetElementDocument(e.target);B=FCKContextMenu_OverrideButton=C.createElement('input');B.type='button';var D=C.createElement('p');C.body.appendChild(D);D.appendChild(B);};B.style.cssText='position:absolute;top:'+(e.clientY-2)+'px;left:'+(e.clientX-2)+'px;width:5px;height:5px;opacity:0.01';};A=A.parentNode;};return false;};function FCKContextMenu_Document_OnMouseUp(e){var A=FCKContextMenu_OverrideButton;if (A){var B=A.parentNode;B.parentNode.removeChild(B);FCKContextMenu_OverrideButton=undefined;if(e&&e.button==2){FCKContextMenu_Document_OnContextMenu(e);return false;}};return true;};function FCKContextMenu_AttachedElement_OnContextMenu(A,B,C){if (B.CtrlDisable&&(A.ctrlKey||A.metaKey)) return true;var D=C||this;if (B.OnBeforeOpen) B.OnBeforeOpen.call(B,D);if (B._MenuBlock.Count()==0) return false;if (B._Redraw){B._MenuBlock.Create(B._Panel.MainNode);B._Redraw=false;};FCKTools.DisableSelection(B._Panel.Document.body);var x=0;var y=0;if (FCKBrowserInfo.IsIE){x=A.screenX;y=A.screenY;}else if (FCKBrowserInfo.IsSafari){x=A.clientX;y=A.clientY;}else{x=A.pageX;y=A.pageY;};B._Panel.Show(x,y,A.currentTarget||null);return false;};function FCKContextMenu_MenuBlock_OnClick(A,B){B._Panel.Hide();FCKTools.RunFunction(B.OnItemClick,B,A);};
-FCK.ContextMenu={};FCK.ContextMenu.Listeners=[];FCK.ContextMenu.RegisterListener=function(A){if (A) this.Listeners.push(A);};function FCK_ContextMenu_Init(){var A=FCK.ContextMenu._InnerContextMenu=new FCKContextMenu(FCKBrowserInfo.IsIE?window:window.parent,FCKLang.Dir);A.CtrlDisable=FCKConfig.BrowserContextMenuOnCtrl;A.OnBeforeOpen=FCK_ContextMenu_OnBeforeOpen;A.OnItemClick=FCK_ContextMenu_OnItemClick;var B=FCK.ContextMenu;for (var i=0;i<FCKConfig.ContextMenu.length;i++) B.RegisterListener(FCK_ContextMenu_GetListener(FCKConfig.ContextMenu[i]));};function FCK_ContextMenu_GetListener(A){switch (A){case 'Generic':return {AddItems:function(menu,tag,tagName){menu.AddItem('Cut',FCKLang.Cut,7,FCKCommands.GetCommand('Cut').GetState()==-1);menu.AddItem('Copy',FCKLang.Copy,8,FCKCommands.GetCommand('Copy').GetState()==-1);menu.AddItem('Paste',FCKLang.Paste,9,FCKCommands.GetCommand('Paste').GetState()==-1);}};case 'Table':return {AddItems:function(menu,tag,tagName){var B=(tagName=='TABLE');var C=(!B&&FCKSelection.HasAncestorNode('TABLE'));if (C){menu.AddSeparator();var D=menu.AddItem('Cell',FCKLang.CellCM);D.AddItem('TableInsertCellBefore',FCKLang.InsertCellBefore,69);D.AddItem('TableInsertCellAfter',FCKLang.InsertCellAfter,58);D.AddItem('TableDeleteCells',FCKLang.DeleteCells,59);if (FCKBrowserInfo.IsGecko) D.AddItem('TableMergeCells',FCKLang.MergeCells,60,FCKCommands.GetCommand('TableMergeCells').GetState()==-1);else{D.AddItem('TableMergeRight',FCKLang.MergeRight,60,FCKCommands.GetCommand('TableMergeRight').GetState()==-1);D.AddItem('TableMergeDown',FCKLang.MergeDown,60,FCKCommands.GetCommand('TableMergeDown').GetState()==-1);};D.AddItem('TableHorizontalSplitCell',FCKLang.HorizontalSplitCell,61,FCKCommands.GetCommand('TableHorizontalSplitCell').GetState()==-1);D.AddItem('TableVerticalSplitCell',FCKLang.VerticalSplitCell,61,FCKCommands.GetCommand('TableVerticalSplitCell').GetState()==-1);D.AddSeparator();D.AddItem('TableCellProp',FCKLang.CellProperties,57,FCKCommands.GetCommand('TableCellProp').GetState()==-1);menu.AddSeparator();D=menu.AddItem('Row',FCKLang.RowCM);D.AddItem('TableInsertRowBefore',FCKLang.InsertRowBefore,70);D.AddItem('TableInsertRowAfter',FCKLang.InsertRowAfter,62);D.AddItem('TableDeleteRows',FCKLang.DeleteRows,63);menu.AddSeparator();D=menu.AddItem('Column',FCKLang.ColumnCM);D.AddItem('TableInsertColumnBefore',FCKLang.InsertColumnBefore,71);D.AddItem('TableInsertColumnAfter',FCKLang.InsertColumnAfter,64);D.AddItem('TableDeleteColumns',FCKLang.DeleteColumns,65);};if (B||C){menu.AddSeparator();menu.AddItem('TableDelete',FCKLang.TableDelete);menu.AddItem('TableProp',FCKLang.TableProperties,39);}}};case 'Link':return {AddItems:function(menu,tag,tagName){var E=(tagName=='A'||FCKSelection.HasAncestorNode('A'));if (E||FCK.GetNamedCommandState('Unlink')!=-1){var F=FCKSelection.MoveToAncestorNode('A');var G=(F&&F.name.length>0&&F.href.length==0);if (G) return;menu.AddSeparator();if (E) menu.AddItem('Link',FCKLang.EditLink,34);menu.AddItem('Unlink',FCKLang.RemoveLink,35);}}};case 'Image':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&!tag.getAttribute('_fckfakelement')){menu.AddSeparator();menu.AddItem('Image',FCKLang.ImageProperties,37);}}};case 'Anchor':return {AddItems:function(menu,tag,tagName){var F=FCKSelection.MoveToAncestorNode('A');var G=(F&&F.name.length>0);if (G||(tagName=='IMG'&&tag.getAttribute('_fckanchor'))){menu.AddSeparator();menu.AddItem('Anchor',FCKLang.AnchorProp,36);menu.AddItem('AnchorDelete',FCKLang.AnchorDelete);}}};case 'Flash':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&tag.getAttribute('_fckflash')){menu.AddSeparator();menu.AddItem('Flash',FCKLang.FlashProperties,38);}}};case 'Form':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('FORM')){menu.AddSeparator();menu.AddItem('Form',FCKLang.FormProp,48);}}};case 'Checkbox':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='checkbox'){menu.AddSeparator();menu.AddItem('Checkbox',FCKLang.CheckboxProp,49);}}};case 'Radio':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='radio'){menu.AddSeparator();menu.AddItem('Radio',FCKLang.RadioButtonProp,50);}}};case 'TextField':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&(tag.type=='text'||tag.type=='password')){menu.AddSeparator();menu.AddItem('TextField',FCKLang.TextFieldProp,51);}}};case 'HiddenField':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&tag.getAttribute('_fckinputhidden')){menu.AddSeparator();menu.AddItem('HiddenField',FCKLang.HiddenFieldProp,56);}}};case 'ImageButton':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='image'){menu.AddSeparator();menu.AddItem('ImageButton',FCKLang.ImageButtonProp,55);}}};case 'Button':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&(tag.type=='button'||tag.type=='submit'||tag.type=='reset')){menu.AddSeparator();menu.AddItem('Button',FCKLang.ButtonProp,54);}}};case 'Select':return {AddItems:function(menu,tag,tagName){if (tagName=='SELECT'){menu.AddSeparator();menu.AddItem('Select',FCKLang.SelectionFieldProp,53);}}};case 'Textarea':return {AddItems:function(menu,tag,tagName){if (tagName=='TEXTAREA'){menu.AddSeparator();menu.AddItem('Textarea',FCKLang.TextareaProp,52);}}};case 'BulletedList':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('UL')){menu.AddSeparator();menu.AddItem('BulletedList',FCKLang.BulletedListProp,27);}}};case 'NumberedList':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('OL')){menu.AddSeparator();menu.AddItem('NumberedList',FCKLang.NumberedListProp,26);}}};};return null;};function FCK_ContextMenu_OnBeforeOpen(){FCK.Events.FireEvent('OnSelectionChange');var A,sTagName;if ((A=FCKSelection.GetSelectedElement())) sTagName=A.tagName;var B=FCK.ContextMenu._InnerContextMenu;B.RemoveAllItems();var C=FCK.ContextMenu.Listeners;for (var i=0;i<C.length;i++) C[i].AddItems(B,A,sTagName);};function FCK_ContextMenu_OnItemClick(A){FCK.Focus();FCKCommands.GetCommand(A.Name).Execute(A.CustomData);};
+var FCKContextMenu=function(A,B){this.CtrlDisable=false;var C=this._Panel=new FCKPanel(A);C.AppendStyleSheet(FCKConfig.SkinEditorCSS);C.IsContextMenu=true;if (FCKBrowserInfo.IsGecko) C.Document.addEventListener('draggesture',function(e) {e.preventDefault();return false;},true);var D=this._MenuBlock=new FCKMenuBlock();D.Panel=C;D.OnClick=FCKTools.CreateEventListener(FCKContextMenu_MenuBlock_OnClick,this);this._Redraw=true;};FCKContextMenu.prototype.SetMouseClickWindow=function(A){if (!FCKBrowserInfo.IsIE){this._Document=A.document;if (FCKBrowserInfo.IsOpera&&!('oncontextmenu' in document.createElement('foo'))){this._Document.addEventListener('mousedown',FCKContextMenu_Document_OnMouseDown,false);this._Document.addEventListener('mouseup',FCKContextMenu_Document_OnMouseUp,false);};this._Document.addEventListener('contextmenu',FCKContextMenu_Document_OnContextMenu,false);}};FCKContextMenu.prototype.AddItem=function(A,B,C,D,E){var F=this._MenuBlock.AddItem(A,B,C,D,E);this._Redraw=true;return F;};FCKContextMenu.prototype.AddSeparator=function(){this._MenuBlock.AddSeparator();this._Redraw=true;};FCKContextMenu.prototype.RemoveAllItems=function(){this._MenuBlock.RemoveAllItems();this._Redraw=true;};FCKContextMenu.prototype.AttachToElement=function(A){if (FCKBrowserInfo.IsIE) FCKTools.AddEventListenerEx(A,'contextmenu',FCKContextMenu_AttachedElement_OnContextMenu,this);else A._FCKContextMenu=this;};function FCKContextMenu_Document_OnContextMenu(e){if (FCKConfig.BrowserContextMenu) return true;var A=e.target;while (A){if (A._FCKContextMenu){if (A._FCKContextMenu.CtrlDisable&&(e.ctrlKey||e.metaKey)) return true;FCKTools.CancelEvent(e);FCKContextMenu_AttachedElement_OnContextMenu(e,A._FCKContextMenu,A);return false;};A=A.parentNode;};return true;};var FCKContextMenu_OverrideButton;function FCKContextMenu_Document_OnMouseDown(e){if(!e||e.button!=2) return false;if (FCKConfig.BrowserContextMenu) return true;var A=e.target;while (A){if (A._FCKContextMenu){if (A._FCKContextMenu.CtrlDisable&&(e.ctrlKey||e.metaKey)) return true;var B=FCKContextMenu_OverrideButton;if(!B){var C=FCKTools.GetElementDocument(e.target);B=FCKContextMenu_OverrideButton=C.createElement('input');B.type='button';var D=C.createElement('p');C.body.appendChild(D);D.appendChild(B);};B.style.cssText='position:absolute;top:'+(e.clientY-2)+'px;left:'+(e.clientX-2)+'px;width:5px;height:5px;opacity:0.01';};A=A.parentNode;};return false;};function FCKContextMenu_Document_OnMouseUp(e){if (FCKConfig.BrowserContextMenu) return true;var A=FCKContextMenu_OverrideButton;if (A){var B=A.parentNode;B.parentNode.removeChild(B);FCKContextMenu_OverrideButton=undefined;if(e&&e.button==2){FCKContextMenu_Document_OnContextMenu(e);return false;}};return true;};function FCKContextMenu_AttachedElement_OnContextMenu(A,B,C){if ((B.CtrlDisable&&(A.ctrlKey||A.metaKey))||FCKConfig.BrowserContextMenu) return true;var D=C||this;if (B.OnBeforeOpen) B.OnBeforeOpen.call(B,D);if (B._MenuBlock.Count()==0) return false;if (B._Redraw){B._MenuBlock.Create(B._Panel.MainNode);B._Redraw=false;};FCKTools.DisableSelection(B._Panel.Document.body);var x=0;var y=0;if (FCKBrowserInfo.IsIE){x=A.screenX;y=A.screenY;}else if (FCKBrowserInfo.IsSafari){x=A.clientX;y=A.clientY;}else{x=A.pageX;y=A.pageY;};B._Panel.Show(x,y,A.currentTarget||null);return false;};function FCKContextMenu_MenuBlock_OnClick(A,B){B._Panel.Hide();FCKTools.RunFunction(B.OnItemClick,B,A);};
+FCK.ContextMenu={};FCK.ContextMenu.Listeners=[];FCK.ContextMenu.RegisterListener=function(A){if (A) this.Listeners.push(A);};function FCK_ContextMenu_Init(){var A=FCK.ContextMenu._InnerContextMenu=new FCKContextMenu(FCKBrowserInfo.IsIE?window:window.parent,FCKLang.Dir);A.CtrlDisable=FCKConfig.BrowserContextMenuOnCtrl;A.OnBeforeOpen=FCK_ContextMenu_OnBeforeOpen;A.OnItemClick=FCK_ContextMenu_OnItemClick;var B=FCK.ContextMenu;for (var i=0;i<FCKConfig.ContextMenu.length;i++) B.RegisterListener(FCK_ContextMenu_GetListener(FCKConfig.ContextMenu[i]));};function FCK_ContextMenu_GetListener(A){switch (A){case 'Generic':return {AddItems:function(menu,tag,tagName){menu.AddItem('Cut',FCKLang.Cut,7,FCKCommands.GetCommand('Cut').GetState()==-1);menu.AddItem('Copy',FCKLang.Copy,8,FCKCommands.GetCommand('Copy').GetState()==-1);menu.AddItem('Paste',FCKLang.Paste,9,FCKCommands.GetCommand('Paste').GetState()==-1);}};case 'Table':return {AddItems:function(menu,tag,tagName){var B=(tagName=='TABLE');var C=(!B&&FCKSelection.HasAncestorNode('TABLE'));if (C){menu.AddSeparator();var D=menu.AddItem('Cell',FCKLang.CellCM);D.AddItem('TableInsertCellBefore',FCKLang.InsertCellBefore,69);D.AddItem('TableInsertCellAfter',FCKLang.InsertCellAfter,58);D.AddItem('TableDeleteCells',FCKLang.DeleteCells,59);if (FCKBrowserInfo.IsGecko) D.AddItem('TableMergeCells',FCKLang.MergeCells,60,FCKCommands.GetCommand('TableMergeCells').GetState()==-1);else{D.AddItem('TableMergeRight',FCKLang.MergeRight,60,FCKCommands.GetCommand('TableMergeRight').GetState()==-1);D.AddItem('TableMergeDown',FCKLang.MergeDown,60,FCKCommands.GetCommand('TableMergeDown').GetState()==-1);};D.AddItem('TableHorizontalSplitCell',FCKLang.HorizontalSplitCell,61,FCKCommands.GetCommand('TableHorizontalSplitCell').GetState()==-1);D.AddItem('TableVerticalSplitCell',FCKLang.VerticalSplitCell,61,FCKCommands.GetCommand('TableVerticalSplitCell').GetState()==-1);D.AddSeparator();D.AddItem('TableCellProp',FCKLang.CellProperties,57,FCKCommands.GetCommand('TableCellProp').GetState()==-1);menu.AddSeparator();D=menu.AddItem('Row',FCKLang.RowCM);D.AddItem('TableInsertRowBefore',FCKLang.InsertRowBefore,70);D.AddItem('TableInsertRowAfter',FCKLang.InsertRowAfter,62);D.AddItem('TableDeleteRows',FCKLang.DeleteRows,63);menu.AddSeparator();D=menu.AddItem('Column',FCKLang.ColumnCM);D.AddItem('TableInsertColumnBefore',FCKLang.InsertColumnBefore,71);D.AddItem('TableInsertColumnAfter',FCKLang.InsertColumnAfter,64);D.AddItem('TableDeleteColumns',FCKLang.DeleteColumns,65);};if (B||C){menu.AddSeparator();menu.AddItem('TableDelete',FCKLang.TableDelete);menu.AddItem('TableProp',FCKLang.TableProperties,39);}}};case 'Link':return {AddItems:function(menu,tag,tagName){var E=(tagName=='A'||FCKSelection.HasAncestorNode('A'));if (E||FCK.GetNamedCommandState('Unlink')!=-1){var F=FCKSelection.MoveToAncestorNode('A');var G=(F&&F.name.length>0&&F.href.length==0);if (G) return;menu.AddSeparator();menu.AddItem('VisitLink',FCKLang.VisitLink);menu.AddSeparator();if (E) menu.AddItem('Link',FCKLang.EditLink,34);menu.AddItem('Unlink',FCKLang.RemoveLink,35);}}};case 'Image':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&!tag.getAttribute('_fckfakelement')){menu.AddSeparator();menu.AddItem('Image',FCKLang.ImageProperties,37);}}};case 'Anchor':return {AddItems:function(menu,tag,tagName){var F=FCKSelection.MoveToAncestorNode('A');var G=(F&&F.name.length>0);if (G||(tagName=='IMG'&&tag.getAttribute('_fckanchor'))){menu.AddSeparator();menu.AddItem('Anchor',FCKLang.AnchorProp,36);menu.AddItem('AnchorDelete',FCKLang.AnchorDelete);}}};case 'Flash':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&tag.getAttribute('_fckflash')){menu.AddSeparator();menu.AddItem('Flash',FCKLang.FlashProperties,38);}}};case 'Form':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('FORM')){menu.AddSeparator();menu.AddItem('Form',FCKLang.FormProp,48);}}};case 'Checkbox':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='checkbox'){menu.AddSeparator();menu.AddItem('Checkbox',FCKLang.CheckboxProp,49);}}};case 'Radio':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='radio'){menu.AddSeparator();menu.AddItem('Radio',FCKLang.RadioButtonProp,50);}}};case 'TextField':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&(tag.type=='text'||tag.type=='password')){menu.AddSeparator();menu.AddItem('TextField',FCKLang.TextFieldProp,51);}}};case 'HiddenField':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&tag.getAttribute('_fckinputhidden')){menu.AddSeparator();menu.AddItem('HiddenField',FCKLang.HiddenFieldProp,56);}}};case 'ImageButton':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='image'){menu.AddSeparator();menu.AddItem('ImageButton',FCKLang.ImageButtonProp,55);}}};case 'Button':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&(tag.type=='button'||tag.type=='submit'||tag.type=='reset')){menu.AddSeparator();menu.AddItem('Button',FCKLang.ButtonProp,54);}}};case 'Select':return {AddItems:function(menu,tag,tagName){if (tagName=='SELECT'){menu.AddSeparator();menu.AddItem('Select',FCKLang.SelectionFieldProp,53);}}};case 'Textarea':return {AddItems:function(menu,tag,tagName){if (tagName=='TEXTAREA'){menu.AddSeparator();menu.AddItem('Textarea',FCKLang.TextareaProp,52);}}};case 'BulletedList':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('UL')){menu.AddSeparator();menu.AddItem('BulletedList',FCKLang.BulletedListProp,27);}}};case 'NumberedList':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('OL')){menu.AddSeparator();menu.AddItem('NumberedList',FCKLang.NumberedListProp,26);}}};case 'DivContainer':return {AddItems:function(menu,tag,tagName){var J=FCKDomTools.GetSelectedDivContainers();if (J.length>0){menu.AddSeparator();menu.AddItem('EditDiv',FCKLang.EditDiv,75);menu.AddItem('DeleteDiv',FCKLang.DeleteDiv,76);}}};};return null;};function FCK_ContextMenu_OnBeforeOpen(){FCK.Events.FireEvent('OnSelectionChange');var A,sTagName;if ((A=FCKSelection.GetSelectedElement())) sTagName=A.tagName;var B=FCK.ContextMenu._InnerContextMenu;B.RemoveAllItems();var C=FCK.ContextMenu.Listeners;for (var i=0;i<C.length;i++) C[i].AddItems(B,A,sTagName);};function FCK_ContextMenu_OnItemClick(A){FCK.Focus();FCKCommands.GetCommand(A.Name).Execute(A.CustomData);};
var FCKHtmlIterator=function(A){this._sourceHtml=A;};FCKHtmlIterator.prototype={Next:function(){var A=this._sourceHtml;if (A==null) return null;var B=FCKRegexLib.HtmlTag.exec(A);var C=false;var D="";if (B){if (B.index>0){D=A.substr(0,B.index);this._sourceHtml=A.substr(B.index);}else{C=true;D=B[0];this._sourceHtml=A.substr(B[0].length);}}else{D=A;this._sourceHtml=null;};return { 'isTag':C,'value':D };},Each:function(A){var B;while ((B=this.Next())) A(B.isTag,B.value);}};var FCKHtmlIterator=function(A){this._sourceHtml=A;};FCKHtmlIterator.prototype={Next:function(){var A=this._sourceHtml;if (A==null) return null;var B=FCKRegexLib.HtmlTag.exec(A);var C=false;var D="";if (B){if (B.index>0){D=A.substr(0,B.index);this._sourceHtml=A.substr(B.index);}else{C=true;D=B[0];this._sourceHtml=A.substr(B[0].length);}}else{D=A;this._sourceHtml=null;};return { 'isTag':C,'value':D };},Each:function(A){var B;while ((B=this.Next())) A(B.isTag,B.value);}};
var FCKPlugin=function(A,B,C){this.Name=A;this.BasePath=C?C:FCKConfig.PluginsPath;this.Path=this.BasePath+A+'/';if (!B||B.length==0) this.AvailableLangs=[];else this.AvailableLangs=B.split(',');};FCKPlugin.prototype.Load=function(){if (this.AvailableLangs.length>0){var A;if (this.AvailableLangs.IndexOf(FCKLanguageManager.ActiveLanguage.Code)>=0) A=FCKLanguageManager.ActiveLanguage.Code;else A=this.AvailableLangs[0];LoadScript(this.Path+'lang/'+A+'.js');};LoadScript(this.Path+'fckplugin.js');};
var FCKPlugins=FCK.Plugins={};FCKPlugins.ItemsCount=0;FCKPlugins.Items={};FCKPlugins.Load=function(){var A=FCKPlugins.Items;for (var i=0;i<FCKConfig.Plugins.Items.length;i++){var B=FCKConfig.Plugins.Items[i];var C=A[B[0]]=new FCKPlugin(B[0],B[1],B[2]);FCKPlugins.ItemsCount++;};for (var s in A) A[s].Load();FCKPlugins.Load=null;};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/js/fckeditorcode_ie.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/js/fckeditorcode_ie.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/js/fckeditorcode_ie.js Thu Aug 28 18:47:59 2008
@@ -25,64 +25,64 @@
var FCK_STATUS_NOTLOADED=window.parent.FCK_STATUS_NOTLOADED=0;var FCK_STATUS_ACTIVE=window.parent.FCK_STATUS_ACTIVE=1;var FCK_STATUS_COMPLETE=window.parent.FCK_STATUS_COMPLETE=2;var FCK_TRISTATE_OFF=window.parent.FCK_TRISTATE_OFF=0;var FCK_TRISTATE_ON=window.parent.FCK_TRISTATE_ON=1;var FCK_TRISTATE_DISABLED=window.parent.FCK_TRISTATE_DISABLED=-1;var FCK_UNKNOWN=window.parent.FCK_UNKNOWN=-9;var FCK_TOOLBARITEM_ONLYICON=window.parent.FCK_TOOLBARITEM_ONLYICON=0;var FCK_TOOLBARITEM_ONLYTEXT=window.parent.FCK_TOOLBARITEM_ONLYTEXT=1;var FCK_TOOLBARITEM_ICONTEXT=window.parent.FCK_TOOLBARITEM_ICONTEXT=2;var FCK_EDITMODE_WYSIWYG=window.parent.FCK_EDITMODE_WYSIWYG=0;var FCK_EDITMODE_SOURCE=window.parent.FCK_EDITMODE_SOURCE=1;var FCK_IMAGES_PATH='images/';var FCK_SPACER_PATH='images/spacer.gif';var CTRL=1000;var SHIFT=2000;var ALT=4000;var FCK_STYLE_BLOCK=0;var FCK_STYLE_INLINE=1;var FCK_STYLE_OBJECT=2;
String.prototype.Contains=function(A){return (this.indexOf(A)>-1);};String.prototype.Equals=function(){var A=arguments;if (A.length==1&&A[0].pop) A=A[0];for (var i=0;i<A.length;i++){if (this==A[i]) return true;};return false;};String.prototype.IEquals=function(){var A=this.toUpperCase();var B=arguments;if (B.length==1&&B[0].pop) B=B[0];for (var i=0;i<B.length;i++){if (A==B[i].toUpperCase()) return true;};return false;};String.prototype.ReplaceAll=function(A,B){var C=this;for (var i=0;i<A.length;i++){C=C.replace(A[i],B[i]);};return C;};String.prototype.StartsWith=function(A){return (this.substr(0,A.length)==A);};String.prototype.EndsWith=function(A,B){var C=this.length;var D=A.length;if (D>C) return false;if (B){var E=new RegExp(A+'$','i');return E.test(this);}else return (D==0||this.substr(C-D,D)==A);};String.prototype.Remove=function(A,B){var s='';if (A>0) s=this.substring(0,A);if (A+B<this.length) s+=this.substring(A+B,this.length);return s;};String.prototype.Trim=function(){return this.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g,'');};String.prototype.LTrim=function(){return this.replace(/^[ \t\n\r]*/g,'');};String.prototype.RTrim=function(){return this.replace(/[ \t\n\r]*$/g,'');};String.prototype.ReplaceNewLineChars=function(A){return this.replace(/\n/g,A);};String.prototype.Replace=function(A,B,C){if (typeof B=='function'){return this.replace(A,function(){return B.apply(C||this,arguments);});}else return this.replace(A,B);};Array.prototype.AddItem=function(A){var i=this.length;this[i]=A;return i;};Array.prototype.IndexOf=function(A){for (var i=0;i<this.length;i++){if (this[i]==A) return i;};return-1;};
var FCKIECleanup=function(A){if (A._FCKCleanupObj) this.Items=A._FCKCleanupObj.Items;else{this.Items=[];A._FCKCleanupObj=this;FCKTools.AddEventListenerEx(A,'unload',FCKIECleanup_Cleanup);}};FCKIECleanup.prototype.AddItem=function(A,B){this.Items.push([A,B]);};function FCKIECleanup_Cleanup(){if (!this._FCKCleanupObj||(FCKConfig.MsWebBrowserControlCompat&&!window.FCKUnloadFlag)) return;var A=this._FCKCleanupObj.Items;while (A.length>0){var B=A.pop();if (B) B[1].call(B[0]);};this._FCKCleanupObj=null;if (CollectGarbage) CollectGarbage();};
-var s=navigator.userAgent.toLowerCase();var FCKBrowserInfo={IsIE:/*@cc_on!@*/false,IsIE7:/*@cc_on!@*/false && ( parseInt( s.match( /msie (\d+)/)[1],10)>=7),IsIE6:/*@cc_on!@*/false && ( parseInt( s.match( /msie (\d+)/)[1],10)>=6),IsSafari:s.Contains(' applewebkit/'),IsOpera:!!window.opera,IsAIR:s.Contains(' adobeair/'),IsMac:s.Contains('macintosh')};(function(A){A.IsGecko=(navigator.product=='Gecko')&&!A.IsSafari&&!A.IsOpera;A.IsGeckoLike=(A.IsGecko||A.IsSafari||A.IsOpera);if (A.IsGecko){var B=s.match(/rv:(\d+\.\d+)/);var C=B&&parseFloat(B[1]);if (C){A.IsGecko10=(C<1.8);A.IsGecko19=(C>1.8);}}})(FCKBrowserInfo);
+var s=navigator.userAgent.toLowerCase();var FCKBrowserInfo={IsIE:/*@cc_on!@*/false,IsIE7:/*@cc_on!@*/false&&(parseInt(s.match(/msie (\d+)/)[1],10)>=7),IsIE6:/*@cc_on!@*/false&&(parseInt(s.match(/msie (\d+)/)[1],10)>=6),IsSafari:s.Contains(' applewebkit/'),IsOpera:!!window.opera,IsAIR:s.Contains(' adobeair/'),IsMac:s.Contains('macintosh')};(function(A){A.IsGecko=(navigator.product=='Gecko')&&!A.IsSafari&&!A.IsOpera;A.IsGeckoLike=(A.IsGecko||A.IsSafari||A.IsOpera);if (A.IsGecko){var B=s.match(/rv:(\d+\.\d+)/);var C=B&&parseFloat(B[1]);if (C){A.IsGecko10=(C<1.8);A.IsGecko19=(C>1.8);}}})(FCKBrowserInfo);
var FCKURLParams={};(function(){var A=document.location.search.substr(1).split('&');for (var i=0;i<A.length;i++){var B=A[i].split('=');var C=decodeURIComponent(B[0]);var D=decodeURIComponent(B[1]);FCKURLParams[C]=D;}})();
var FCKEvents=function(A){this.Owner=A;this._RegisteredEvents={};};FCKEvents.prototype.AttachEvent=function(A,B){var C;if (!(C=this._RegisteredEvents[A])) this._RegisteredEvents[A]=[B];else{if (C.IndexOf(B)==-1) C.push(B);}};FCKEvents.prototype.FireEvent=function(A,B){var C=true;var D=this._RegisteredEvents[A];if (D){for (var i=0;i<D.length;i++){try{C=(D[i](this.Owner,B)&&C);}catch(e){if (e.number!=-2146823277) throw e;}}};return C;};
var FCKDataProcessor=function(){};FCKDataProcessor.prototype={ConvertToHtml:function(A){if (FCKConfig.FullPage){FCK.DocTypeDeclaration=A.match(FCKRegexLib.DocTypeTag);if (!FCKRegexLib.HasBodyTag.test(A)) A='<body>'+A+'</body>';if (!FCKRegexLib.HtmlOpener.test(A)) A='<html dir="'+FCKConfig.ContentLangDirection+'">'+A+'</html>';if (!FCKRegexLib.HeadOpener.test(A)) A=A.replace(FCKRegexLib.HtmlOpener,'$&<head><title></title></head>');return A;}else{var B=FCKConfig.DocType+'<html dir="'+FCKConfig.ContentLangDirection+'"';if (FCKBrowserInfo.IsIE&&FCKConfig.DocType.length>0&&!FCKRegexLib.Html4DocType.test(FCKConfig.DocType)) B+=' style="overflow-y: scroll"';B+='><head><title></title></head><body'+FCKConfig.GetBodyAttributes()+'>'+A+'</body></html>';return B;}},ConvertToDataFormat:function(A,B,C,D){var E=FCKXHtml.GetXHTML(A,!B,D);if (C&&FCKRegexLib.EmptyOutParagraph.test(E)) return '';return E;},FixHtml:function(A){return A;}};
-var FCK={Name:FCKURLParams['InstanceName'],Status:0,EditMode:0,Toolbar:null,HasFocus:false,DataProcessor:new FCKDataProcessor(),GetInstanceObject:(function(){var w=window;return function(name){return w[name];}})(),AttachToOnSelectionChange:function(A){this.Events.AttachEvent('OnSelectionChange',A);},GetLinkedFieldValue:function(){return this.LinkedField.value;},GetParentForm:function(){return this.LinkedField.form;},StartupValue:'',IsDirty:function(){if (this.EditMode==1) return (this.StartupValue!=this.EditingArea.Textarea.value);else{if (!this.EditorDocument) return false;return (this.StartupValue!=this.EditorDocument.body.innerHTML);}},ResetIsDirty:function(){if (this.EditMode==1) this.StartupValue=this.EditingArea.Textarea.value;else if (this.EditorDocument.body) this.StartupValue=this.EditorDocument.body.innerHTML;},StartEditor:function(){this.TempBaseTag=FCKConfig.BaseHref.length>0?'<base href="'+FCKConfig.BaseHref+'" _fcktemp="true"></base>':'';var A=FCK.KeystrokeHandler=new FCKKeystrokeHandler();A.OnKeystroke=_FCK_KeystrokeHandler_OnKeystroke;A.SetKeystrokes(FCKConfig.Keystrokes);if (FCKBrowserInfo.IsIE7){if ((CTRL+86/*V*/) in A.Keystrokes) A.SetKeystrokes([CTRL+86,true]);if ((SHIFT+45/*INS*/) in A.Keystrokes) A.SetKeystrokes([SHIFT+45,true]);};A.SetKeystrokes([CTRL+8,true]);this.EditingArea=new FCKEditingArea(document.getElementById('xEditingArea'));this.EditingArea.FFSpellChecker=FCKConfig.FirefoxSpellChecker;this.SetData(this.GetLinkedFieldValue(),true);FCKTools.AddEventListener(document,"keydown",this._TabKeyHandler);this.AttachToOnSelectionChange(_FCK_PaddingNodeListener);if (FCKBrowserInfo.IsGecko) this.AttachToOnSelectionChange(this._ExecCheckEmptyBlock);},Focus:function(){FCK.EditingArea.Focus();},SetStatus:function(A){this.Status=A;if (A==1){FCKFocusManager.AddWindow(window,true);if (FCKBrowserInfo.IsIE) FCKFocusManager.AddWindow(window.frameElement,true);if (FCKConfig.StartupFocus) FCK.Focus();};this.Events.FireEvent('OnStatusChange',A);},FixBody:function(){var A=FCKConfig.EnterMode;if (A!='p'&&A!='div') return;var B=this.EditorDocument;if (!B) return;var C=B.body;if (!C) return;FCKDomTools.TrimNode(C);var D=C.firstChild;var E;while (D){var F=false;switch (D.nodeType){case 1:var G=D.nodeName.toLowerCase();if (!FCKListsLib.BlockElements[G]&&G!='li'&&!D.getAttribute('_fckfakelement')&&D.getAttribute('_moz_dirty')==null) F=true;break;case 3:if (E||D.nodeValue.Trim().length>0) F=true;break;case 8:if (E) F=true;break;};if (F){var H=D.parentNode;if (!E) E=H.insertBefore(B.createElement(A),D);E.appendChild(H.removeChild(D));D=E.nextSibling;}else{if (E){FCKDomTools.TrimNode(E);E=null;};D=D.nextSibling;}};if (E) FCKDomTools.TrimNode(E);},GetData:function(A){if (FCK.EditMode==1) return FCK.EditingArea.Textarea.value;this.FixBody();var B=FCK.EditorDocument;if (!B) return null;var C=FCKConfig.FullPage;var D=FCK.DataProcessor.ConvertToDataFormat(C?B.documentElement:B.body,!C,FCKConfig.IgnoreEmptyParagraphValue,A);D=FCK.ProtectEventsRestore(D);if (FCKBrowserInfo.IsIE) D=D.replace(FCKRegexLib.ToReplace,'$1');if (C){if (FCK.DocTypeDeclaration&&FCK.DocTypeDeclaration.length>0) D=FCK.DocTypeDeclaration+'\n'+D;if (FCK.XmlDeclaration&&FCK.XmlDeclaration.length>0) D=FCK.XmlDeclaration+'\n'+D;};return FCKConfig.ProtectedSource.Revert(D);},UpdateLinkedField:function(){var A=FCK.GetXHTML(FCKConfig.FormatOutput);if (FCKConfig.HtmlEncodeOutput) A=FCKTools.HTMLEncode(A);FCK.LinkedField.value=A;FCK.Events.FireEvent('OnAfterLinkedFieldUpdate');},RegisteredDoubleClickHandlers:{},OnDoubleClick:function(A){var B=FCK.RegisteredDoubleClickHandlers[A.tagName.toUpperCase()];if (B){for (var i=0;i<B.length;i++) B[i](A);};B=FCK.RegisteredDoubleClickHandlers['*'];if (B){for (var i=0;i<B.length;i++) B[i](A);}},RegisterDoubleClickHandler:function(A,B){var C=B||'*';C=C.toUpperCase();var D;if (!(D=FCK.RegisteredDoubleClickHandlers[C])) FCK.RegisteredDoubleClickHandlers[C]=[A];else{if (D.IndexOf(A)==-1) D.push(A);}},OnAfterSetHTML:function(){FCKDocumentProcessor.Process(FCK.EditorDocument);FCKUndo.SaveUndoStep();FCK.Events.FireEvent('OnSelectionChange');FCK.Events.FireEvent('OnAfterSetHTML');},ProtectUrls:function(A){A=A.replace(FCKRegexLib.ProtectUrlsA,'$& _fcksavedurl=$1');A=A.replace(FCKRegexLib.ProtectUrlsImg,'$& _fcksavedurl=$1');A=A.replace(FCKRegexLib.ProtectUrlsArea,'$& _fcksavedurl=$1');return A;},ProtectEvents:function(A){return A.replace(FCKRegexLib.TagsWithEvent,_FCK_ProtectEvents_ReplaceTags);},ProtectEventsRestore:function(A){return A.replace(FCKRegexLib.ProtectedEvents,_FCK_ProtectEvents_RestoreEvents);},ProtectTags:function(A){var B=FCKConfig.ProtectedTags;if (FCKBrowserInfo.IsIE) B+=B.length>0?'|ABBR|XML|EMBED|OBJECT':'ABBR|XML|EMBED|OBJECT';var C;if (B.length>0){C=new RegExp('<('+B+')(?!\w|:)','gi');A=A.replace(C,'<FCK:$1');C=new RegExp('<\/('+B+')>','gi');A=A.replace(C,'<\/FCK:$1>');};B='META';if (FCKBrowserInfo.IsIE) B+='|HR';C=new RegExp('<(('+B+')(?=\\s|>|/)[\\s\\S]*?)/?>','gi');A=A.replace(C,'<FCK:$1 />');return A;},SetData:function(A,B){this.EditingArea.Mode=FCK.EditMode;if (FCKBrowserInfo.IsIE&&FCK.EditorDocument){FCK.EditorDocument.detachEvent("onselectionchange",Doc_OnSelectionChange);};if (FCK.EditMode==0){this._ForceResetIsDirty=(B===true);A=FCKConfig.ProtectedSource.Protect(A);A=FCK.DataProcessor.ConvertToHtml(A);A=A.replace(FCKRegexLib.InvalidSelfCloseTags,'$1></$2>');A=FCK.ProtectEvents(A);A=FCK.ProtectUrls(A);A=FCK.ProtectTags(A);if (FCK.TempBaseTag.length>0&&!FCKRegexLib.HasBaseTag.test(A)) A=A.replace(FCKRegexLib.HeadOpener,'$&'+FCK.TempBaseTag);var C='';if (!FCKConfig.FullPage) C+=_FCK_GetEditorAreaStyleTags();if (FCKBrowserInfo.IsIE) C+=FCK._GetBehaviorsStyle();else if (FCKConfig.ShowBorders) C+=FCKTools.GetStyleHtml(FCK_ShowTableBordersCSS,true);C+=FCKTools.GetStyleHtml(FCK_InternalCSS,true);A=A.replace(FCKRegexLib.HeadCloser,C+'$&');this.EditingArea.OnLoad=_FCK_EditingArea_OnLoad;this.EditingArea.Start(A);}else{FCK.EditorWindow=null;FCK.EditorDocument=null;FCKDomTools.PaddingNode=null;this.EditingArea.OnLoad=null;this.EditingArea.Start(A);this.EditingArea.Textarea._FCKShowContextMenu=true;FCK.EnterKeyHandler=null;if (B) this.ResetIsDirty();FCK.KeystrokeHandler.AttachToElement(this.EditingArea.Textarea);this.EditingArea.Textarea.focus();FCK.Events.FireEvent('OnAfterSetHTML');};if (FCKBrowserInfo.IsGecko) window.onresize();},RedirectNamedCommands:{},ExecuteNamedCommand:function(A,B,C,D){if (!D) FCKUndo.SaveUndoStep();if (!C&&FCK.RedirectNamedCommands[A]!=null) FCK.ExecuteRedirectedNamedCommand(A,B);else{FCK.Focus();FCK.EditorDocument.execCommand(A,false,B);FCK.Events.FireEvent('OnSelectionChange');};if (!D) FCKUndo.SaveUndoStep();},GetNamedCommandState:function(A){try{if (FCKBrowserInfo.IsSafari&&FCK.EditorWindow&&A.IEquals('Paste')) return 0;if (!FCK.EditorDocument.queryCommandEnabled(A)) return -1;else{return FCK.EditorDocument.queryCommandState(A)?1:0;}}catch (e){return 0;}},GetNamedCommandValue:function(A){var B='';var C=FCK.GetNamedCommandState(A);if (C==-1) return null;try{B=this.EditorDocument.queryCommandValue(A);}catch(e) {};return B?B:'';},Paste:function(A){if (FCK.Status!=2||!FCK.Events.FireEvent('OnPaste')) return false;return A||FCK._ExecPaste();},PasteFromWord:function(){FCKDialog.OpenDialog('FCKDialog_Paste',FCKLang.PasteFromWord,'dialog/fck_paste.html',400,330,'Word');},Preview:function(){var A;if (FCKConfig.FullPage){if (FCK.TempBaseTag.length>0) A=FCK.TempBaseTag+FCK.GetXHTML();else A=FCK.GetXHTML();}else{A=FCKConfig.DocType+'<html dir="'+FCKConfig.ContentLangDirection+'"><head>'+FCK.TempBaseTag+'<title>'+FCKLang.Preview+'</title>'+_FCK_GetEditorAreaStyleTags()+'</head><body'+FCKConfig.GetBodyAttributes()+'>'+FCK.GetXHTML()+'</body></html>';};var B=FCKConfig.ScreenWidth*0.8;var C=FCKConfig.ScreenHeight*0.7;var D=(FCKConfig.ScreenWidth-B)/2;var E='';if (FCK_IS_CUSTOM_DOMAIN&&FCKBrowserInfo.IsIE){window._FCKHtmlToLoad=A;E='javascript:void( (function(){document.open() ;document.domain="'+document.domain+'" ;document.write( window.opener._FCKHtmlToLoad );document.close() ;window.opener._FCKHtmlToLoad = null ;})() )';};var F=window.open(E,null,'toolbar=yes,location=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width='+B+',height='+C+',left='+D);if (!FCK_IS_CUSTOM_DOMAIN||!FCKBrowserInfo.IsIE){F.document.write(A);F.document.close();}},SwitchEditMode:function(A){var B=(FCK.EditMode==0);var C=FCK.IsDirty();var D;if (B){FCKCommands.GetCommand('ShowBlocks').SaveState();if (!A&&FCKBrowserInfo.IsIE) FCKUndo.SaveUndoStep();D=FCK.GetXHTML(FCKConfig.FormatSource);if (D==null) return false;}else D=this.EditingArea.Textarea.value;FCK.EditMode=B?1:0;FCK.SetData(D,!C);FCK.Focus();FCKTools.RunFunction(FCK.ToolbarSet.RefreshModeState,FCK.ToolbarSet);return true;},InsertElement:function(A){if (typeof A=='string') A=this.EditorDocument.createElement(A);var B=A.nodeName.toLowerCase();FCKSelection.Restore();var C=new FCKDomRange(this.EditorWindow);C.MoveToSelection();C.DeleteContents();if (FCKListsLib.BlockElements[B]!=null){if (C.StartBlock){if (C.CheckStartOfBlock()) C.MoveToPosition(C.StartBlock,3);else if (C.CheckEndOfBlock()) C.MoveToPosition(C.StartBlock,4);else C.SplitBlock();};C.InsertNode(A);var D=FCKDomTools.GetNextSourceElement(A,false,null,['hr','br','param','img','area','input'],true);if (!D&&FCKConfig.EnterMode!='br'){D=this.EditorDocument.body.appendChild(this.EditorDocument.createElement(FCKConfig.EnterMode));if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(D);};if (FCKListsLib.EmptyElements[B]==null) C.MoveToElementEditStart(A);else if (D) C.MoveToElementEditStart(D);else C.MoveToPosition(A,4);if (FCKBrowserInfo.IsGecko){if (D) D.scrollIntoView(false);A.scrollIntoView(false);}}else{C.InsertNode(A);C.SetStart(A,4);C.SetEnd(A,4);};C.Select();C.Release();this.Focus();return A;},_InsertBlockElement:function(A){},_IsFunctionKey:function(A){if (A>=16&&A<=20) return true;if (A==27||(A>=33&&A<=40)) return true;if (A==45) return true;return false;},_KeyDownListener:function(A){if (!A) A=FCK.EditorWindow.event;if (FCK.EditorWindow){if (!FCK._IsFunctionKey(A.keyCode)&&!(A.ctrlKey||A.metaKey)&&!(A.keyCode==46)) FCK._KeyDownUndo();};return true;},_KeyDownUndo:function(){if (!FCKUndo.Typing){FCKUndo.SaveUndoStep();FCKUndo.Typing=true;FCK.Events.FireEvent("OnSelectionChange");};FCKUndo.TypesCount++;FCKUndo.Changed=1;if (FCKUndo.TypesCount>FCKUndo.MaxTypes){FCKUndo.TypesCount=0;FCKUndo.SaveUndoStep();}},_TabKeyHandler:function(A){if (!A) A=window.event;var B=A.keyCode;if (B==9&&FCK.EditMode!=0){if (FCKBrowserInfo.IsIE){var C=document.selection.createRange();if (C.parentElement()!=FCK.EditingArea.Textarea) return true;C.text='\t';C.select();}else{var a=[];var D=FCK.EditingArea.Textarea;var E=D.selectionStart;var F=D.selectionEnd;a.push(D.value.substr(0,E));a.push('\t');a.push(D.value.substr(F));D.value=a.join('');D.setSelectionRange(E+1,E+1);};if (A.preventDefault) return A.preventDefault();return A.returnValue=false;};return true;}};FCK.Events=new FCKEvents(FCK);FCK.GetHTML=FCK.GetXHTML=FCK.GetData;FCK.SetHTML=FCK.SetData;FCK.InsertElementAndGetIt=FCK.CreateElement=FCK.InsertElement;function _FCK_ProtectEvents_ReplaceTags(A){return A.replace(FCKRegexLib.EventAttributes,_FCK_ProtectEvents_ReplaceEvents);};function _FCK_ProtectEvents_ReplaceEvents(A,B){return ' '+B+'_fckprotectedatt="'+encodeURIComponent(A)+'"';};function _FCK_ProtectEvents_RestoreEvents(A,B){return decodeURIComponent(B);};function _FCK_MouseEventsListener(A){if (!A) A=window.event;if (A.type=='mousedown') FCK.MouseDownFlag=true;else if (A.type=='mouseup') FCK.MouseDownFlag=false;else if (A.type=='mousemove') FCK.Events.FireEvent('OnMouseMove',A);};function _FCK_PaddingNodeListener(){if (FCKConfig.EnterMode.IEquals('br')) return;FCKDomTools.EnforcePaddingNode(FCK.EditorDocument,FCKConfig.EnterMode);if (!FCKBrowserInfo.IsIE&&FCKDomTools.PaddingNode){var A=FCKSelection.GetSelection();if (A&&A.rangeCount==1){var B=A.getRangeAt(0);if (B.collapsed&&B.startContainer==FCK.EditorDocument.body&&B.startOffset==0){B.selectNodeContents(FCKDomTools.PaddingNode);B.collapse(true);A.removeAllRanges();A.addRange(B);}}}else if (FCKDomTools.PaddingNode){var C=FCKSelection.GetParentElement();var D=FCKDomTools.PaddingNode;if (C&&C.nodeName.IEquals('body')){if (FCK.EditorDocument.body.childNodes.length==1&&FCK.EditorDocument.body.firstChild==D){if (FCKSelection._GetSelectionDocument(FCK.EditorDocument.selection)!=FCK.EditorDocument) return;var B=FCK.EditorDocument.body.createTextRange();var F=false;if (!D.childNodes.firstChild){D.appendChild(FCKTools.GetElementDocument(D).createTextNode('\ufeff'));F=true;};B.moveToElementText(D);B.select();if (F) B.pasteHTML('');}}}};function _FCK_EditingArea_OnLoad(){FCK.EditorWindow=FCK.EditingArea.Window;FCK.EditorDocument=FCK.EditingArea.Document;FCK.InitializeBehaviors();FCK.MouseDownFlag=false;FCKTools.AddEventListener(FCK.EditorDocument,'mousemove',_FCK_MouseEventsListener);FCKTools.AddEventListener(FCK.EditorDocument,'mousedown',_FCK_MouseEventsListener);FCKTools.AddEventListener(FCK.EditorDocument,'mouseup',_FCK_MouseEventsListener);if (FCKBrowserInfo.IsSafari){var A=function(evt){if (!(evt.ctrlKey||evt.metaKey)) return;if (FCK.EditMode!=0) return;switch (evt.keyCode){case 89:FCKUndo.Redo();break;case 90:FCKUndo.Undo();break;}};FCKTools.AddEventListener(FCK.EditorDocument,'keyup',A);};FCK.EnterKeyHandler=new FCKEnterKey(FCK.EditorWindow,FCKConfig.EnterMode,FCKConfig.ShiftEnterMode,FCKConfig.TabSpaces);FCK.KeystrokeHandler.AttachToElement(FCK.EditorDocument);if (FCK._ForceResetIsDirty) FCK.ResetIsDirty();if (FCKBrowserInfo.IsIE&&FCK.HasFocus) FCK.EditorDocument.body.setActive();FCK.OnAfterSetHTML();FCKCommands.GetCommand('ShowBlocks').RestoreState();if (FCK.Status!=0) return;FCK.SetStatus(1);};function _FCK_GetEditorAreaStyleTags(){return FCKTools.GetStyleHtml(FCKConfig.EditorAreaCSS)+FCKTools.GetStyleHtml(FCKConfig.EditorAreaStyles);};function _FCK_KeystrokeHandler_OnKeystroke(A,B){if (FCK.Status!=2) return false;if (FCK.EditMode==0){switch (B){case 'Paste':return!FCK.Paste();case 'Cut':FCKUndo.SaveUndoStep();return false;}}else{if (B.Equals('Paste','Undo','Redo','SelectAll','Cut')) return false;};var C=FCK.Commands.GetCommand(B);if (C.GetState()==-1) return false;return (C.Execute.apply(C,FCKTools.ArgumentsToArray(arguments,2))!==false);};(function(){var A=window.parent.document;var B=A.getElementById(FCK.Name);var i=0;while (B||i==0){if (B&&B.tagName.toLowerCase().Equals('input','textarea')){FCK.LinkedField=B;break;};B=A.getElementsByName(FCK.Name)[i++];}})();var FCKTempBin={Elements:[],AddElement:function(A){var B=this.Elements.length;this.Elements[B]=A;return B;},RemoveElement:function(A){var e=this.Elements[A];this.Elements[A]=null;return e;},Reset:function(){var i=0;while (i<this.Elements.length) this.Elements[i++]=null;this.Elements.length=0;}};var FCKFocusManager=FCK.FocusManager={IsLocked:false,AddWindow:function(A,B){var C;if (FCKBrowserInfo.IsIE) C=A.nodeType==1?A:A.frameElement?A.frameElement:A.document;else if (FCKBrowserInfo.IsSafari) C=A;else C=A.document;FCKTools.AddEventListener(C,'blur',FCKFocusManager_Win_OnBlur);FCKTools.AddEventListener(C,'focus',B?FCKFocusManager_Win_OnFocus_Area:FCKFocusManager_Win_OnFocus);},RemoveWindow:function(A){if (FCKBrowserInfo.IsIE) oTarget=A.nodeType==1?A:A.frameElement?A.frameElement:A.document;else oTarget=A.document;FCKTools.RemoveEventListener(oTarget,'blur',FCKFocusManager_Win_OnBlur);FCKTools.RemoveEventListener(oTarget,'focus',FCKFocusManager_Win_OnFocus_Area);FCKTools.RemoveEventListener(oTarget,'focus',FCKFocusManager_Win_OnFocus);},Lock:function(){this.IsLocked=true;},Unlock:function(){if (this._HasPendingBlur) FCKFocusManager._Timer=window.setTimeout(FCKFocusManager_FireOnBlur,100);this.IsLocked=false;},_ResetTimer:function(){this._HasPendingBlur=false;if (this._Timer){window.clearTimeout(this._Timer);delete this._Timer;}}};function FCKFocusManager_Win_OnBlur(){if (typeof(FCK)!='undefined'&&FCK.HasFocus){FCKFocusManager._ResetTimer();FCKFocusManager._Timer=window.setTimeout(FCKFocusManager_FireOnBlur,100);}};function FCKFocusManager_FireOnBlur(){if (FCKFocusManager.IsLocked) FCKFocusManager._HasPendingBlur=true;else{FCK.HasFocus=false;FCK.Events.FireEvent("OnBlur");}};function FCKFocusManager_Win_OnFocus_Area(){if (FCKFocusManager._IsFocusing) return;FCKFocusManager._IsFocusing=true;FCK.Focus();FCKFocusManager_Win_OnFocus();FCKTools.RunFunction(function(){delete FCKFocusManager._IsFocusing;});};function FCKFocusManager_Win_OnFocus(){FCKFocusManager._ResetTimer();if (!FCK.HasFocus&&!FCKFocusManager.IsLocked){FCK.HasFocus=true;FCK.Events.FireEvent("OnFocus");}};(function(){var A=window.frameElement;var B=A.width;var C=A.height;if (/^\d+$/.test(B)) B+='px';if (/^\d+$/.test(C)) C+='px';var D=A.style;D.border=D.padding=D.margin=0;D.backgroundColor='transparent';D.backgroundImage='none';D.width=B;D.height=C;})();
-FCK.Description="FCKeditor for Internet Explorer 5.5+";FCK._GetBehaviorsStyle=function(){if (!FCK._BehaviorsStyle){var A=FCKConfig.BasePath;var B='';var C;C='<style type="text/css" _fcktemp="true">';if (FCKConfig.ShowBorders) B='url('+A+'css/behaviors/showtableborders.htc)';C+='INPUT,TEXTAREA,SELECT,.FCK__Anchor,.FCK__PageBreak,.FCK__InputHidden';if (FCKConfig.DisableObjectResizing){C+=',IMG';B+=' url('+A+'css/behaviors/disablehandles.htc)';};C+=' { behavior: url('+A+'css/behaviors/disablehandles.htc) ; }';if (B.length>0) C+='TABLE { behavior: '+B+' ; }';C+='</style>';FCK._BehaviorsStyle=C;};return FCK._BehaviorsStyle;};function Doc_OnMouseUp(){if (FCK.EditorWindow.event.srcElement.tagName=='HTML'){FCK.Focus();FCK.EditorWindow.event.cancelBubble=true;FCK.EditorWindow.event.returnValue=false;}};function Doc_OnPaste(){var A=FCK.EditorDocument.body;A.detachEvent('onpaste',Doc_OnPaste);var B=FCK.Paste(!FCKConfig.ForcePasteAsPlainText&&!FCKConfig.AutoDetectPasteFromWord);A.attachEvent('onpaste',Doc_OnPaste);return B;};function Doc_OnDblClick(){FCK.OnDoubleClick(FCK.EditorWindow.event.srcElement);FCK.EditorWindow.event.cancelBubble=true;};function Doc_OnSelectionChange(){if (!FCK.IsSelectionChangeLocked&&FCK.EditorDocument) FCK.Events.FireEvent("OnSelectionChange");};function Doc_OnDrop(){if (FCK.MouseDownFlag){FCK.MouseDownFlag=false;return;};if (FCKConfig.ForcePasteAsPlainText){var A=FCK.EditorWindow.event;if (FCK._CheckIsPastingEnabled()||FCKConfig.ShowDropDialog) FCK.PasteAsPlainText(A.dataTransfer.getData('Text'));A.returnValue=false;A.cancelBubble=true;}};FCK.InitializeBehaviors=function(A){this.EditorDocument.attachEvent('onmouseup',Doc_OnMouseUp);this.EditorDocument.body.attachEvent('onpaste',Doc_OnPaste);this.EditorDocument.body.attachEvent('ondrop',Doc_OnDrop);FCK.ContextMenu._InnerContextMenu.AttachToElement(FCK.EditorDocument.body);this.EditorDocument.attachEvent("onkeydown",FCK._KeyDownListener);this.EditorDocument.attachEvent("ondblclick",Doc_OnDblClick);this.EditorDocument.attachEvent("onselectionchange",Doc_OnSelectionChange);FCKTools.AddEventListener(FCK.EditorDocument,'mousedown',Doc_OnMouseDown);};FCK.InsertHtml=function(A){A=FCKConfig.ProtectedSource.Protect(A);A=FCK.ProtectEvents(A);A=FCK.ProtectUrls(A);A=FCK.ProtectTags(A);FCKSelection.Restore();FCK.EditorWindow.focus();FCKUndo.SaveUndoStep();var B=FCKSelection.GetSelection();if (B.type.toLowerCase()=='control') B.clear();A='<span id="__fakeFCKRemove__" style="display:none;">fakeFCKRemove</span>'+A;B.createRange().pasteHTML(A);FCK.EditorDocument.getElementById('__fakeFCKRemove__').removeNode(true);FCKDocumentProcessor.Process(FCK.EditorDocument);this.Events.FireEvent("OnSelectionChange");};FCK.SetInnerHtml=function(A){var B=FCK.EditorDocument;B.body.innerHTML='<div id="__fakeFCKRemove__"> </div>'+A;B.getElementById('__fakeFCKRemove__').removeNode(true);};function FCK_PreloadImages(){var A=new FCKImagePreloader();A.AddImages(FCKConfig.PreloadImages);A.AddImages(FCKConfig.SkinPath+'fck_strip.gif');A.OnComplete=LoadToolbarSetup;A.Start();};function Document_OnContextMenu(){return (event.srcElement._FCKShowContextMenu==true);};document.oncontextmenu=Document_OnContextMenu;function FCK_Cleanup(){this.LinkedField=null;this.EditorWindow=null;this.EditorDocument=null;};FCK._ExecPaste=function(){if (FCK._PasteIsRunning) return true;if (FCKConfig.ForcePasteAsPlainText){FCK.PasteAsPlainText();return false;};var A=FCK._CheckIsPastingEnabled(true);if (A===false) FCKTools.RunFunction(FCKDialog.OpenDialog,FCKDialog,['FCKDialog_Paste',FCKLang.Paste,'dialog/fck_paste.html',400,330,'Security']);else{if (FCKConfig.AutoDetectPasteFromWord&&A.length>0){var B=/<\w[^>]*(( class="?MsoNormal"?)|(="mso-))/gi;if (B.test(A)){if (confirm(FCKLang.PasteWordConfirm)){FCK.PasteFromWord();return false;}}};FCK._PasteIsRunning=true;FCK.ExecuteNamedCommand('Paste');delete FCK._PasteIsRunning;};return false;};FCK.PasteAsPlainText=function(A){if (!FCK._CheckIsPastingEnabled()){FCKDialog.OpenDialog('FCKDialog_Paste',FCKLang.PasteAsText,'dialog/fck_paste.html',400,330,'PlainText');return;};var B=null;if (!A) B=clipboardData.getData("Text");else B=A;if (B&&B.length>0){B=FCKTools.HTMLEncode(B);B=FCKTools.ProcessLineBreaks(window,FCKConfig,B);var C=B.search('</p>');var D=B.search('<p>');if ((C!=-1&&D!=-1&&C<D)||(C!=-1&&D==-1)){var E=B.substr(0,C);B=B.substr(C+4);this.InsertHtml(E);};FCKUndo.SaveLocked=true;this.InsertHtml(B);FCKUndo.SaveLocked=false;}};FCK._CheckIsPastingEnabled=function(A){FCK._PasteIsEnabled=false;document.body.attachEvent('onpaste',FCK_CheckPasting_Listener);var B=FCK.GetClipboardHTML();document.body.detachEvent('onpaste',FCK_CheckPasting_Listener);if (FCK._PasteIsEnabled){if (!A) B=true;}else B=false;delete FCK._PasteIsEnabled;return B;};function FCK_CheckPasting_Listener(){FCK._PasteIsEnabled=true;};FCK.GetClipboardHTML=function(){var A=document.getElementById('___FCKHiddenDiv');if (!A){A=document.createElement('DIV');A.id='___FCKHiddenDiv';var B=A.style;B.position='absolute';B.visibility=B.overflow='hidden';B.width=B.height=1;document.body.appendChild(A);};A.innerHTML='';var C=document.body.createTextRange();C.moveToElementText(A);C.execCommand('Paste');var D=A.innerHTML;A.innerHTML='';return D;};FCK.CreateLink=function(A,B){var C=[];FCK.ExecuteNamedCommand('Unlink',null,false,!!B);if (A.length>0){if (FCKSelection.GetType()=='Control'){var D=this.EditorDocument.createElement('A');D.href=A;var E=FCKSelection.GetSelectedElement();E.parentNode.insertBefore(D,E);E.parentNode.removeChild(E);D.appendChild(E);return [D];};var F='javascript:void(0);/*'+(new Date().getTime())+'*/';FCK.ExecuteNamedCommand('CreateLink',F,false,!!B);var G=this.EditorDocument.links;for (i=0;i<G.length;i++){var D=G[i];if (D.getAttribute('href',2)==F){var I=D.innerHTML;D.href=A;D.innerHTML=I;var J=D.lastChild;if (J&&J.nodeName=='BR'){FCKDomTools.InsertAfterNode(D,D.removeChild(J));};C.push(D);}}};return C;};function _FCK_RemoveDisabledAtt(){this.removeAttribute('disabled');};function Doc_OnMouseDown(A){var e=A.srcElement;if (e.nodeName.IEquals('input')&&e.type.IEquals(['radio','checkbox'])&&!e.disabled){e.disabled=true;FCKTools.SetTimeout(_FCK_RemoveDisabledAtt,1,e);}};
-var FCKConfig=FCK.Config={};if (document.location.protocol=='file:'){FCKConfig.BasePath=decodeURIComponent(document.location.pathname.substr(1));FCKConfig.BasePath=FCKConfig.BasePath.replace(/\\/gi, '/');var sFullProtocol=document.location.href.match(/^(file\:\/{2,3})/)[1];if (FCKBrowserInfo.IsOpera) sFullProtocol+='localhost/';FCKConfig.BasePath=sFullProtocol+FCKConfig.BasePath.substring(0,FCKConfig.BasePath.lastIndexOf('/')+1);}else FCKConfig.BasePath=document.location.protocol+'//'+document.location.host+document.location.pathname.substring(0,document.location.pathname.lastIndexOf('/')+1);FCKConfig.FullBasePath=FCKConfig.BasePath;FCKConfig.EditorPath=FCKConfig.BasePath.replace(/editor\/$/,'');try{FCKConfig.ScreenWidth=screen.width;FCKConfig.ScreenHeight=screen.height;}catch (e){FCKConfig.ScreenWidth=800;FCKConfig.ScreenHeight=600;};FCKConfig.ProcessHiddenField=function(){this.PageConfig={};var A=window.parent.document.getElementById(FCK.Name+'___Config');if (!A) return;var B=A.value.split('&');for (var i=0;i<B.length;i++){if (B[i].length==0) continue;var C=B[i].split('=');var D=decodeURIComponent(C[0]);var E=decodeURIComponent(C[1]);if (D=='CustomConfigurationsPath') FCKConfig[D]=E;else if (E.toLowerCase()=="true") this.PageConfig[D]=true;else if (E.toLowerCase()=="false") this.PageConfig[D]=false;else if (E.length>0&&!isNaN(E)) this.PageConfig[D]=parseInt(E,10);else this.PageConfig[D]=E;}};function FCKConfig_LoadPageConfig(){var A=FCKConfig.PageConfig;for (var B in A) FCKConfig[B]=A[B];};function FCKConfig_PreProcess(){var A=FCKConfig;if (A.AllowQueryStringDebug){try{if ((/fckdebug=true/i).test(window.top.location.search)) A.Debug=true;}catch (e) {/*Ignore it. Much probably we are inside a FRAME where the "top" is in another domain (security error).*/}};if (!A.PluginsPath.EndsWith('/')) A.PluginsPath+='/';var B=A.ToolbarComboPreviewCSS;if (!B||B.length==0) A.ToolbarComboPreviewCSS=A.EditorAreaCSS;A.RemoveAttributesArray=(A.RemoveAttributes||'').split(',');if (!FCKConfig.SkinEditorCSS||FCKConfig.SkinEditorCSS.length==0) FCKConfig.SkinEditorCSS=FCKConfig.SkinPath+'fck_editor.css';if (!FCKConfig.SkinDialogCSS||FCKConfig.SkinDialogCSS.length==0) FCKConfig.SkinDialogCSS=FCKConfig.SkinPath+'fck_dialog.css';};FCKConfig.ToolbarSets={};FCKConfig.Plugins={};FCKConfig.Plugins.Items=[];FCKConfig.Plugins.Add=function(A,B,C){FCKConfig.Plugins.Items.AddItem([A,B,C]);};FCKConfig.ProtectedSource={};FCKConfig.ProtectedSource._CodeTag=(new Date()).valueOf();FCKConfig.ProtectedSource.RegexEntries=[/<!--[\s\S]*?-->/g,/<script[\s\S]*?<\/script>/gi,/<noscript[\s\S]*?<\/noscript>/gi];FCKConfig.ProtectedSource.Add=function(A){this.RegexEntries.AddItem(A);};FCKConfig.ProtectedSource.Protect=function(A){var B=this._CodeTag;function _Replace(protectedSource){var C=FCKTempBin.AddElement(protectedSource);return '<!--{'+B+C+'}-->';};for (var i=0;i<this.RegexEntries.length;i++){A=A.replace(this.RegexEntries[i],_Replace);};return A;};FCKConfig.ProtectedSource.Revert=function(A,B){function _Replace(m,opener,index){var C=B?FCKTempBin.RemoveElement(index):FCKTempBin.Elements[index];return FCKConfig.ProtectedSource.Revert(C,B);};var D=new RegExp("(<|<)!--\\{"+this._CodeTag+"(\\d+)\\}--(>|>)","g");return A.replace(D,_Replace);};FCKConfig.GetBodyAttributes=function(){var A='';if (this.BodyId&&this.BodyId.length>0) A+=' id="'+this.BodyId+'"';if (this.BodyClass&&this.BodyClass.length>0) A+=' class="'+this.BodyClass+'"';return A;};FCKConfig.ApplyBodyAttributes=function(A){if (this.BodyId&&this.BodyId.length>0) A.id=FCKConfig.BodyId;if (this.BodyClass&&this.BodyClass.length>0) A.className+=' '+FCKConfig.BodyClass;};
+var FCK={Name:FCKURLParams['InstanceName'],Status:0,EditMode:0,Toolbar:null,HasFocus:false,DataProcessor:new FCKDataProcessor(),GetInstanceObject:(function(){var w=window;return function(name){return w[name];}})(),AttachToOnSelectionChange:function(A){this.Events.AttachEvent('OnSelectionChange',A);},GetLinkedFieldValue:function(){return this.LinkedField.value;},GetParentForm:function(){return this.LinkedField.form;},StartupValue:'',IsDirty:function(){if (this.EditMode==1) return (this.StartupValue!=this.EditingArea.Textarea.value);else{if (!this.EditorDocument) return false;return (this.StartupValue!=this.EditorDocument.body.innerHTML);}},ResetIsDirty:function(){if (this.EditMode==1) this.StartupValue=this.EditingArea.Textarea.value;else if (this.EditorDocument.body) this.StartupValue=this.EditorDocument.body.innerHTML;},StartEditor:function(){this.TempBaseTag=FCKConfig.BaseHref.length>0?'<base href="'+FCKConfig.BaseHref+'" _fcktemp="true"></base>':'';var A=FCK.KeystrokeHandler=new FCKKeystrokeHandler();A.OnKeystroke=_FCK_KeystrokeHandler_OnKeystroke;A.SetKeystrokes(FCKConfig.Keystrokes);if (FCKBrowserInfo.IsIE7){if ((CTRL+86) in A.Keystrokes) A.SetKeystrokes([CTRL+86,true]);if ((SHIFT+45) in A.Keystrokes) A.SetKeystrokes([SHIFT+45,true]);};A.SetKeystrokes([CTRL+8,true]);this.EditingArea=new FCKEditingArea(document.getElementById('xEditingArea'));this.EditingArea.FFSpellChecker=FCKConfig.FirefoxSpellChecker;this.SetData(this.GetLinkedFieldValue(),true);FCKTools.AddEventListener(document,"keydown",this._TabKeyHandler);this.AttachToOnSelectionChange(_FCK_PaddingNodeListener);if (FCKBrowserInfo.IsGecko) this.AttachToOnSelectionChange(this._ExecCheckEmptyBlock);},Focus:function(){FCK.EditingArea.Focus();},SetStatus:function(A){this.Status=A;if (A==1){FCKFocusManager.AddWindow(window,true);if (FCKBrowserInfo.IsIE) FCKFocusManager.AddWindow(window.frameElement,true);if (FCKConfig.StartupFocus) FCK.Focus();};this.Events.FireEvent('OnStatusChange',A);},FixBody:function(){var A=FCKConfig.EnterMode;if (A!='p'&&A!='div') return;var B=this.EditorDocument;if (!B) return;var C=B.body;if (!C) return;FCKDomTools.TrimNode(C);var D=C.firstChild;var E;while (D){var F=false;switch (D.nodeType){case 1:var G=D.nodeName.toLowerCase();if (!FCKListsLib.BlockElements[G]&&G!='li'&&!D.getAttribute('_fckfakelement')&&D.getAttribute('_moz_dirty')==null) F=true;break;case 3:if (E||D.nodeValue.Trim().length>0) F=true;break;case 8:if (E) F=true;break;};if (F){var H=D.parentNode;if (!E) E=H.insertBefore(B.createElement(A),D);E.appendChild(H.removeChild(D));D=E.nextSibling;}else{if (E){FCKDomTools.TrimNode(E);E=null;};D=D.nextSibling;}};if (E) FCKDomTools.TrimNode(E);},GetData:function(A){if (FCK.EditMode==1) return FCK.EditingArea.Textarea.value;this.FixBody();var B=FCK.EditorDocument;if (!B) return null;var C=FCKConfig.FullPage;var D=FCK.DataProcessor.ConvertToDataFormat(C?B.documentElement:B.body,!C,FCKConfig.IgnoreEmptyParagraphValue,A);D=FCK.ProtectEventsRestore(D);if (FCKBrowserInfo.IsIE) D=D.replace(FCKRegexLib.ToReplace,'$1');if (C){if (FCK.DocTypeDeclaration&&FCK.DocTypeDeclaration.length>0) D=FCK.DocTypeDeclaration+'\n'+D;if (FCK.XmlDeclaration&&FCK.XmlDeclaration.length>0) D=FCK.XmlDeclaration+'\n'+D;};return FCKConfig.ProtectedSource.Revert(D);},UpdateLinkedField:function(){var A=FCK.GetXHTML(FCKConfig.FormatOutput);if (FCKConfig.HtmlEncodeOutput) A=FCKTools.HTMLEncode(A);FCK.LinkedField.value=A;FCK.Events.FireEvent('OnAfterLinkedFieldUpdate');},RegisteredDoubleClickHandlers:{},OnDoubleClick:function(A){var B=FCK.RegisteredDoubleClickHandlers[A.tagName.toUpperCase()];if (B){for (var i=0;i<B.length;i++) B[i](A);};B=FCK.RegisteredDoubleClickHandlers['*'];if (B){for (var i=0;i<B.length;i++) B[i](A);}},RegisterDoubleClickHandler:function(A,B){var C=B||'*';C=C.toUpperCase();var D;if (!(D=FCK.RegisteredDoubleClickHandlers[C])) FCK.RegisteredDoubleClickHandlers[C]=[A];else{if (D.IndexOf(A)==-1) D.push(A);}},OnAfterSetHTML:function(){FCKDocumentProcessor.Process(FCK.EditorDocument);FCKUndo.SaveUndoStep();FCK.Events.FireEvent('OnSelectionChange');FCK.Events.FireEvent('OnAfterSetHTML');},ProtectUrls:function(A){A=A.replace(FCKRegexLib.ProtectUrlsA,'$& _fcksavedurl=$1');A=A.replace(FCKRegexLib.ProtectUrlsImg,'$& _fcksavedurl=$1');A=A.replace(FCKRegexLib.ProtectUrlsArea,'$& _fcksavedurl=$1');return A;},ProtectEvents:function(A){return A.replace(FCKRegexLib.TagsWithEvent,_FCK_ProtectEvents_ReplaceTags);},ProtectEventsRestore:function(A){return A.replace(FCKRegexLib.ProtectedEvents,_FCK_ProtectEvents_RestoreEvents);},ProtectTags:function(A){var B=FCKConfig.ProtectedTags;if (FCKBrowserInfo.IsIE) B+=B.length>0?'|ABBR|XML|EMBED|OBJECT':'ABBR|XML|EMBED|OBJECT';var C;if (B.length>0){C=new RegExp('<('+B+')(?!\w|:)','gi');A=A.replace(C,'<FCK:$1');C=new RegExp('<\/('+B+')>','gi');A=A.replace(C,'<\/FCK:$1>');};B='META';if (FCKBrowserInfo.IsIE) B+='|HR';C=new RegExp('<(('+B+')(?=\\s|>|/)[\\s\\S]*?)/?>','gi');A=A.replace(C,'<FCK:$1 />');return A;},SetData:function(A,B){this.EditingArea.Mode=FCK.EditMode;if (FCKBrowserInfo.IsIE&&FCK.EditorDocument){FCK.EditorDocument.detachEvent("onselectionchange",Doc_OnSelectionChange);};FCKTempBin.Reset();if (FCK.EditMode==0){this._ForceResetIsDirty=(B===true);A=FCKConfig.ProtectedSource.Protect(A);A=FCK.DataProcessor.ConvertToHtml(A);A=A.replace(FCKRegexLib.InvalidSelfCloseTags,'$1></$2>');A=FCK.ProtectEvents(A);A=FCK.ProtectUrls(A);A=FCK.ProtectTags(A);if (FCK.TempBaseTag.length>0&&!FCKRegexLib.HasBaseTag.test(A)) A=A.replace(FCKRegexLib.HeadOpener,'$&'+FCK.TempBaseTag);var C='';if (!FCKConfig.FullPage) C+=_FCK_GetEditorAreaStyleTags();if (FCKBrowserInfo.IsIE) C+=FCK._GetBehaviorsStyle();else if (FCKConfig.ShowBorders) C+=FCKTools.GetStyleHtml(FCK_ShowTableBordersCSS,true);C+=FCKTools.GetStyleHtml(FCK_InternalCSS,true);A=A.replace(FCKRegexLib.HeadCloser,C+'$&');this.EditingArea.OnLoad=_FCK_EditingArea_OnLoad;this.EditingArea.Start(A);}else{FCK.EditorWindow=null;FCK.EditorDocument=null;FCKDomTools.PaddingNode=null;this.EditingArea.OnLoad=null;this.EditingArea.Start(A);this.EditingArea.Textarea._FCKShowContextMenu=true;FCK.EnterKeyHandler=null;if (B) this.ResetIsDirty();FCK.KeystrokeHandler.AttachToElement(this.EditingArea.Textarea);this.EditingArea.Textarea.focus();FCK.Events.FireEvent('OnAfterSetHTML');};if (FCKBrowserInfo.IsGecko) window.onresize();},RedirectNamedCommands:{},ExecuteNamedCommand:function(A,B,C,D){if (!D) FCKUndo.SaveUndoStep();if (!C&&FCK.RedirectNamedCommands[A]!=null) FCK.ExecuteRedirectedNamedCommand(A,B);else{FCK.Focus();FCK.EditorDocument.execCommand(A,false,B);FCK.Events.FireEvent('OnSelectionChange');};if (!D) FCKUndo.SaveUndoStep();},GetNamedCommandState:function(A){try{if (FCKBrowserInfo.IsSafari&&FCK.EditorWindow&&A.IEquals('Paste')) return 0;if (!FCK.EditorDocument.queryCommandEnabled(A)) return -1;else{return FCK.EditorDocument.queryCommandState(A)?1:0;}}catch (e){return 0;}},GetNamedCommandValue:function(A){var B='';var C=FCK.GetNamedCommandState(A);if (C==-1) return null;try{B=this.EditorDocument.queryCommandValue(A);}catch(e) {};return B?B:'';},Paste:function(A){if (FCK.Status!=2||!FCK.Events.FireEvent('OnPaste')) return false;return A||FCK._ExecPaste();},PasteFromWord:function(){FCKDialog.OpenDialog('FCKDialog_Paste',FCKLang.PasteFromWord,'dialog/fck_paste.html',400,330,'Word');},Preview:function(){var A;if (FCKConfig.FullPage){if (FCK.TempBaseTag.length>0) A=FCK.TempBaseTag+FCK.GetXHTML();else A=FCK.GetXHTML();}else{A=FCKConfig.DocType+'<html dir="'+FCKConfig.ContentLangDirection+'"><head>'+FCK.TempBaseTag+'<title>'+FCKLang.Preview+'</title>'+_FCK_GetEditorAreaStyleTags()+'</head><body'+FCKConfig.GetBodyAttributes()+'>'+FCK.GetXHTML()+'</body></html>';};var B=FCKConfig.ScreenWidth*0.8;var C=FCKConfig.ScreenHeight*0.7;var D=(FCKConfig.ScreenWidth-B)/2;var E='';if (FCK_IS_CUSTOM_DOMAIN&&FCKBrowserInfo.IsIE){window._FCKHtmlToLoad=A;E='javascript:void( (function(){document.open() ;document.domain="'+document.domain+'" ;document.write( window.opener._FCKHtmlToLoad );document.close() ;window.opener._FCKHtmlToLoad = null ;})() )';};var F=window.open(E,null,'toolbar=yes,location=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width='+B+',height='+C+',left='+D);if (!FCK_IS_CUSTOM_DOMAIN||!FCKBrowserInfo.IsIE){F.document.write(A);F.document.close();}},SwitchEditMode:function(A){var B=(FCK.EditMode==0);var C=FCK.IsDirty();var D;if (B){FCKCommands.GetCommand('ShowBlocks').SaveState();if (!A&&FCKBrowserInfo.IsIE) FCKUndo.SaveUndoStep();D=FCK.GetXHTML(FCKConfig.FormatSource);if (FCKBrowserInfo.IsIE) FCKTempBin.ToHtml();if (D==null) return false;}else D=this.EditingArea.Textarea.value;FCK.EditMode=B?1:0;FCK.SetData(D,!C);FCK.Focus();FCKTools.RunFunction(FCK.ToolbarSet.RefreshModeState,FCK.ToolbarSet);return true;},InsertElement:function(A){if (typeof A=='string') A=this.EditorDocument.createElement(A);var B=A.nodeName.toLowerCase();FCKSelection.Restore();var C=new FCKDomRange(this.EditorWindow);C.MoveToSelection();C.DeleteContents();if (FCKListsLib.BlockElements[B]!=null){if (C.StartBlock){if (C.CheckStartOfBlock()) C.MoveToPosition(C.StartBlock,3);else if (C.CheckEndOfBlock()) C.MoveToPosition(C.StartBlock,4);else C.SplitBlock();};C.InsertNode(A);var D=FCKDomTools.GetNextSourceElement(A,false,null,['hr','br','param','img','area','input'],true);if (!D&&FCKConfig.EnterMode!='br'){D=this.EditorDocument.body.appendChild(this.EditorDocument.createElement(FCKConfig.EnterMode));if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(D);};if (FCKListsLib.EmptyElements[B]==null) C.MoveToElementEditStart(A);else if (D) C.MoveToElementEditStart(D);else C.MoveToPosition(A,4);if (FCKBrowserInfo.IsGeckoLike){if (D) FCKDomTools.ScrollIntoView(D,false);FCKDomTools.ScrollIntoView(A,false);}}else{C.InsertNode(A);C.SetStart(A,4);C.SetEnd(A,4);};C.Select();C.Release();this.Focus();return A;},_InsertBlockElement:function(A){},_IsFunctionKey:function(A){if (A>=16&&A<=20) return true;if (A==27||(A>=33&&A<=40)) return true;if (A==45) return true;return false;},_KeyDownListener:function(A){if (!A) A=FCK.EditorWindow.event;if (FCK.EditorWindow){if (!FCK._IsFunctionKey(A.keyCode)&&!(A.ctrlKey||A.metaKey)&&!(A.keyCode==46)) FCK._KeyDownUndo();};return true;},_KeyDownUndo:function(){if (!FCKUndo.Typing){FCKUndo.SaveUndoStep();FCKUndo.Typing=true;FCK.Events.FireEvent("OnSelectionChange");};FCKUndo.TypesCount++;FCKUndo.Changed=1;if (FCKUndo.TypesCount>FCKUndo.MaxTypes){FCKUndo.TypesCount=0;FCKUndo.SaveUndoStep();}},_TabKeyHandler:function(A){if (!A) A=window.event;var B=A.keyCode;if (B==9&&FCK.EditMode!=0){if (FCKBrowserInfo.IsIE){var C=document.selection.createRange();if (C.parentElement()!=FCK.EditingArea.Textarea) return true;C.text='\t';C.select();}else{var a=[];var D=FCK.EditingArea.Textarea;var E=D.selectionStart;var F=D.selectionEnd;a.push(D.value.substr(0,E));a.push('\t');a.push(D.value.substr(F));D.value=a.join('');D.setSelectionRange(E+1,E+1);};if (A.preventDefault) return A.preventDefault();return A.returnValue=false;};return true;}};FCK.Events=new FCKEvents(FCK);FCK.GetHTML=FCK.GetXHTML=FCK.GetData;FCK.SetHTML=FCK.SetData;FCK.InsertElementAndGetIt=FCK.CreateElement=FCK.InsertElement;function _FCK_ProtectEvents_ReplaceTags(A){return A.replace(FCKRegexLib.EventAttributes,_FCK_ProtectEvents_ReplaceEvents);};function _FCK_ProtectEvents_ReplaceEvents(A,B){return ' '+B+'_fckprotectedatt="'+encodeURIComponent(A)+'"';};function _FCK_ProtectEvents_RestoreEvents(A,B){return decodeURIComponent(B);};function _FCK_MouseEventsListener(A){if (!A) A=window.event;if (A.type=='mousedown') FCK.MouseDownFlag=true;else if (A.type=='mouseup') FCK.MouseDownFlag=false;else if (A.type=='mousemove') FCK.Events.FireEvent('OnMouseMove',A);};function _FCK_PaddingNodeListener(){if (FCKConfig.EnterMode.IEquals('br')) return;FCKDomTools.EnforcePaddingNode(FCK.EditorDocument,FCKConfig.EnterMode);if (!FCKBrowserInfo.IsIE&&FCKDomTools.PaddingNode){var A=FCKSelection.GetSelection();if (A&&A.rangeCount==1){var B=A.getRangeAt(0);if (B.collapsed&&B.startContainer==FCK.EditorDocument.body&&B.startOffset==0){B.selectNodeContents(FCKDomTools.PaddingNode);B.collapse(true);A.removeAllRanges();A.addRange(B);}}}else if (FCKDomTools.PaddingNode){var C=FCKSelection.GetParentElement();var D=FCKDomTools.PaddingNode;if (C&&C.nodeName.IEquals('body')){if (FCK.EditorDocument.body.childNodes.length==1&&FCK.EditorDocument.body.firstChild==D){if (FCKSelection._GetSelectionDocument(FCK.EditorDocument.selection)!=FCK.EditorDocument) return;var B=FCK.EditorDocument.body.createTextRange();var F=false;if (!D.childNodes.firstChild){D.appendChild(FCKTools.GetElementDocument(D).createTextNode('\ufeff'));F=true;};B.moveToElementText(D);B.select();if (F) B.pasteHTML('');}}}};function _FCK_EditingArea_OnLoad(){FCK.EditorWindow=FCK.EditingArea.Window;FCK.EditorDocument=FCK.EditingArea.Document;if (FCKBrowserInfo.IsIE) FCKTempBin.ToElements();FCK.InitializeBehaviors();FCK.MouseDownFlag=false;FCKTools.AddEventListener(FCK.EditorDocument,'mousemove',_FCK_MouseEventsListener);FCKTools.AddEventListener(FCK.EditorDocument,'mousedown',_FCK_MouseEventsListener);FCKTools.AddEventListener(FCK.EditorDocument,'mouseup',_FCK_MouseEventsListener);if (FCKBrowserInfo.IsSafari){var A=function(evt){if (!(evt.ctrlKey||evt.metaKey)) return;if (FCK.EditMode!=0) return;switch (evt.keyCode){case 89:FCKUndo.Redo();break;case 90:FCKUndo.Undo();break;}};FCKTools.AddEventListener(FCK.EditorDocument,'keyup',A);};FCK.EnterKeyHandler=new FCKEnterKey(FCK.EditorWindow,FCKConfig.EnterMode,FCKConfig.ShiftEnterMode,FCKConfig.TabSpaces);FCK.KeystrokeHandler.AttachToElement(FCK.EditorDocument);if (FCK._ForceResetIsDirty) FCK.ResetIsDirty();if (FCKBrowserInfo.IsIE&&FCK.HasFocus) FCK.EditorDocument.body.setActive();FCK.OnAfterSetHTML();FCKCommands.GetCommand('ShowBlocks').RestoreState();if (FCK.Status!=0) return;FCK.SetStatus(1);};function _FCK_GetEditorAreaStyleTags(){return FCKTools.GetStyleHtml(FCKConfig.EditorAreaCSS)+FCKTools.GetStyleHtml(FCKConfig.EditorAreaStyles);};function _FCK_KeystrokeHandler_OnKeystroke(A,B){if (FCK.Status!=2) return false;if (FCK.EditMode==0){switch (B){case 'Paste':return!FCK.Paste();case 'Cut':FCKUndo.SaveUndoStep();return false;}}else{if (B.Equals('Paste','Undo','Redo','SelectAll','Cut')) return false;};var C=FCK.Commands.GetCommand(B);if (C.GetState()==-1) return false;return (C.Execute.apply(C,FCKTools.ArgumentsToArray(arguments,2))!==false);};(function(){var A=window.parent.document;var B=A.getElementById(FCK.Name);var i=0;while (B||i==0){if (B&&B.tagName.toLowerCase().Equals('input','textarea')){FCK.LinkedField=B;break;};B=A.getElementsByName(FCK.Name)[i++];}})();var FCKTempBin={Elements:[],AddElement:function(A){var B=this.Elements.length;this.Elements[B]=A;return B;},RemoveElement:function(A){var e=this.Elements[A];this.Elements[A]=null;return e;},Reset:function(){var i=0;while (i<this.Elements.length) this.Elements[i++]=null;this.Elements.length=0;},ToHtml:function(){for (var i=0;i<this.Elements.length;i++){this.Elements[i]='<div> '+this.Elements[i].outerHTML+'</div>';this.Elements[i].isHtml=true;}},ToElements:function(){var A=FCK.EditorDocument.createElement('div');for (var i=0;i<this.Elements.length;i++){if (this.Elements[i].isHtml){A.innerHTML=this.Elements[i];this.Elements[i]=A.firstChild.removeChild(A.firstChild.lastChild);}}}};var FCKFocusManager=FCK.FocusManager={IsLocked:false,AddWindow:function(A,B){var C;if (FCKBrowserInfo.IsIE) C=A.nodeType==1?A:A.frameElement?A.frameElement:A.document;else if (FCKBrowserInfo.IsSafari) C=A;else C=A.document;FCKTools.AddEventListener(C,'blur',FCKFocusManager_Win_OnBlur);FCKTools.AddEventListener(C,'focus',B?FCKFocusManager_Win_OnFocus_Area:FCKFocusManager_Win_OnFocus);},RemoveWindow:function(A){if (FCKBrowserInfo.IsIE) oTarget=A.nodeType==1?A:A.frameElement?A.frameElement:A.document;else oTarget=A.document;FCKTools.RemoveEventListener(oTarget,'blur',FCKFocusManager_Win_OnBlur);FCKTools.RemoveEventListener(oTarget,'focus',FCKFocusManager_Win_OnFocus_Area);FCKTools.RemoveEventListener(oTarget,'focus',FCKFocusManager_Win_OnFocus);},Lock:function(){this.IsLocked=true;},Unlock:function(){if (this._HasPendingBlur) FCKFocusManager._Timer=window.setTimeout(FCKFocusManager_FireOnBlur,100);this.IsLocked=false;},_ResetTimer:function(){this._HasPendingBlur=false;if (this._Timer){window.clearTimeout(this._Timer);delete this._Timer;}}};function FCKFocusManager_Win_OnBlur(){if (typeof(FCK)!='undefined'&&FCK.HasFocus){FCKFocusManager._ResetTimer();FCKFocusManager._Timer=window.setTimeout(FCKFocusManager_FireOnBlur,100);}};function FCKFocusManager_FireOnBlur(){if (FCKFocusManager.IsLocked) FCKFocusManager._HasPendingBlur=true;else{FCK.HasFocus=false;FCK.Events.FireEvent("OnBlur");}};function FCKFocusManager_Win_OnFocus_Area(){if (FCKFocusManager._IsFocusing) return;FCKFocusManager._IsFocusing=true;FCK.Focus();FCKFocusManager_Win_OnFocus();FCKTools.RunFunction(function(){delete FCKFocusManager._IsFocusing;});};function FCKFocusManager_Win_OnFocus(){FCKFocusManager._ResetTimer();if (!FCK.HasFocus&&!FCKFocusManager.IsLocked){FCK.HasFocus=true;FCK.Events.FireEvent("OnFocus");}};(function(){var A=window.frameElement;var B=A.width;var C=A.height;if (/^\d+$/.test(B)) B+='px';if (/^\d+$/.test(C)) C+='px';var D=A.style;D.border=D.padding=D.margin=0;D.backgroundColor='transparent';D.backgroundImage='none';D.width=B;D.height=C;})();
+FCK.Description="FCKeditor for Internet Explorer 5.5+";FCK._GetBehaviorsStyle=function(){if (!FCK._BehaviorsStyle){var A=FCKConfig.BasePath;var B='';var C;C='<style type="text/css" _fcktemp="true">';if (FCKConfig.ShowBorders) B='url('+A+'css/behaviors/showtableborders.htc)';C+='INPUT,TEXTAREA,SELECT,.FCK__Anchor,.FCK__PageBreak,.FCK__InputHidden';if (FCKConfig.DisableObjectResizing){C+=',IMG';B+=' url('+A+'css/behaviors/disablehandles.htc)';};C+=' { behavior: url('+A+'css/behaviors/disablehandles.htc) ; }';if (B.length>0) C+='TABLE { behavior: '+B+' ; }';C+='</style>';FCK._BehaviorsStyle=C;};return FCK._BehaviorsStyle;};function Doc_OnMouseUp(){if (FCK.EditorWindow.event.srcElement.tagName=='HTML'){FCK.Focus();FCK.EditorWindow.event.cancelBubble=true;FCK.EditorWindow.event.returnValue=false;}};function Doc_OnPaste(){var A=FCK.EditorDocument.body;A.detachEvent('onpaste',Doc_OnPaste);var B=FCK.Paste(!FCKConfig.ForcePasteAsPlainText&&!FCKConfig.AutoDetectPasteFromWord);A.attachEvent('onpaste',Doc_OnPaste);return B;};function Doc_OnDblClick(){FCK.OnDoubleClick(FCK.EditorWindow.event.srcElement);FCK.EditorWindow.event.cancelBubble=true;};function Doc_OnSelectionChange(){if (!FCK.IsSelectionChangeLocked&&FCK.EditorDocument) FCK.Events.FireEvent("OnSelectionChange");};function Doc_OnDrop(){if (FCK.MouseDownFlag){FCK.MouseDownFlag=false;return;};if (FCKConfig.ForcePasteAsPlainText){var A=FCK.EditorWindow.event;if (FCK._CheckIsPastingEnabled()||FCKConfig.ShowDropDialog) FCK.PasteAsPlainText(A.dataTransfer.getData('Text'));A.returnValue=false;A.cancelBubble=true;}};FCK.InitializeBehaviors=function(A){this.EditorDocument.attachEvent('onmouseup',Doc_OnMouseUp);this.EditorDocument.body.attachEvent('onpaste',Doc_OnPaste);this.EditorDocument.body.attachEvent('ondrop',Doc_OnDrop);FCK.ContextMenu._InnerContextMenu.AttachToElement(FCK.EditorDocument.body);this.EditorDocument.attachEvent("onkeydown",FCK._KeyDownListener);this.EditorDocument.attachEvent("ondblclick",Doc_OnDblClick);this.EditorDocument.attachEvent("onbeforedeactivate",function(){ FCKSelection.Save(true);});this.EditorDocument.attachEvent("onselectionchange",Doc_OnSelectionChange);FCKTools.AddEventListener(FCK.EditorDocument,'mousedown',Doc_OnMouseDown);};FCK.InsertHtml=function(A){A=FCKConfig.ProtectedSource.Protect(A);A=FCK.ProtectEvents(A);A=FCK.ProtectUrls(A);A=FCK.ProtectTags(A);FCKSelection.Restore();FCK.EditorWindow.focus();FCKUndo.SaveUndoStep();var B=FCKSelection.GetSelection();if (B.type.toLowerCase()=='control') B.clear();A='<span id="__fakeFCKRemove__" style="display:none;">fakeFCKRemove</span>'+A;B.createRange().pasteHTML(A);FCK.EditorDocument.getElementById('__fakeFCKRemove__').removeNode(true);FCKDocumentProcessor.Process(FCK.EditorDocument);this.Events.FireEvent("OnSelectionChange");};FCK.SetInnerHtml=function(A){var B=FCK.EditorDocument;B.body.innerHTML='<div id="__fakeFCKRemove__"> </div>'+A;B.getElementById('__fakeFCKRemove__').removeNode(true);};function FCK_PreloadImages(){var A=new FCKImagePreloader();A.AddImages(FCKConfig.PreloadImages);A.AddImages(FCKConfig.SkinPath+'fck_strip.gif');A.OnComplete=LoadToolbarSetup;A.Start();};function Document_OnContextMenu(){return (event.srcElement._FCKShowContextMenu==true);};document.oncontextmenu=Document_OnContextMenu;function FCK_Cleanup(){this.LinkedField=null;this.EditorWindow=null;this.EditorDocument=null;};FCK._ExecPaste=function(){if (FCK._PasteIsRunning) return true;if (FCKConfig.ForcePasteAsPlainText){FCK.PasteAsPlainText();return false;};var A=FCK._CheckIsPastingEnabled(true);if (A===false) FCKTools.RunFunction(FCKDialog.OpenDialog,FCKDialog,['FCKDialog_Paste',FCKLang.Paste,'dialog/fck_paste.html',400,330,'Security']);else{if (FCKConfig.AutoDetectPasteFromWord&&A.length>0){var B=/<\w[^>]*(( class="?MsoNormal"?)|(="mso-))/gi;if (B.test(A)){if (confirm(FCKLang.PasteWordConfirm)){FCK.PasteFromWord();return false;}}};FCK._PasteIsRunning=true;FCK.ExecuteNamedCommand('Paste');delete FCK._PasteIsRunning;};return false;};FCK.PasteAsPlainText=function(A){if (!FCK._CheckIsPastingEnabled()){FCKDialog.OpenDialog('FCKDialog_Paste',FCKLang.PasteAsText,'dialog/fck_paste.html',400,330,'PlainText');return;};var B=null;if (!A) B=clipboardData.getData("Text");else B=A;if (B&&B.length>0){B=FCKTools.HTMLEncode(B);B=FCKTools.ProcessLineBreaks(window,FCKConfig,B);var C=B.search('</p>');var D=B.search('<p>');if ((C!=-1&&D!=-1&&C<D)||(C!=-1&&D==-1)){var E=B.substr(0,C);B=B.substr(C+4);this.InsertHtml(E);};FCKUndo.SaveLocked=true;this.InsertHtml(B);FCKUndo.SaveLocked=false;}};FCK._CheckIsPastingEnabled=function(A){FCK._PasteIsEnabled=false;document.body.attachEvent('onpaste',FCK_CheckPasting_Listener);var B=FCK.GetClipboardHTML();document.body.detachEvent('onpaste',FCK_CheckPasting_Listener);if (FCK._PasteIsEnabled){if (!A) B=true;}else B=false;delete FCK._PasteIsEnabled;return B;};function FCK_CheckPasting_Listener(){FCK._PasteIsEnabled=true;};FCK.GetClipboardHTML=function(){var A=document.getElementById('___FCKHiddenDiv');if (!A){A=document.createElement('DIV');A.id='___FCKHiddenDiv';var B=A.style;B.position='absolute';B.visibility=B.overflow='hidden';B.width=B.height=1;document.body.appendChild(A);};A.innerHTML='';var C=document.body.createTextRange();C.moveToElementText(A);C.execCommand('Paste');var D=A.innerHTML;A.innerHTML='';return D;};FCK.CreateLink=function(A,B){var C=[];FCK.ExecuteNamedCommand('Unlink',null,false,!!B);if (A.length>0){if (FCKSelection.GetType()=='Control'){var D=this.EditorDocument.createElement('A');D.href=A;var E=FCKSelection.GetSelectedElement();E.parentNode.insertBefore(D,E);E.parentNode.removeChild(E);D.appendChild(E);return [D];};var F='javascript:void(0);/*'+(new Date().getTime())+'*/';FCK.ExecuteNamedCommand('CreateLink',F,false,!!B);var G=this.EditorDocument.links;for (i=0;i<G.length;i++){var D=G[i];if (D.getAttribute('href',2)==F){var I=D.innerHTML;D.href=A;D.innerHTML=I;var J=D.lastChild;if (J&&J.nodeName=='BR'){FCKDomTools.InsertAfterNode(D,D.removeChild(J));};C.push(D);}}};return C;};function _FCK_RemoveDisabledAtt(){this.removeAttribute('disabled');};function Doc_OnMouseDown(A){var e=A.srcElement;if (e.nodeName.IEquals('input')&&e.type.IEquals(['radio','checkbox'])&&!e.disabled){e.disabled=true;FCKTools.SetTimeout(_FCK_RemoveDisabledAtt,1,e);}};
+var FCKConfig=FCK.Config={};if (document.location.protocol=='file:'){FCKConfig.BasePath=decodeURIComponent(document.location.pathname.substr(1));FCKConfig.BasePath=FCKConfig.BasePath.replace(/\\/gi,'/');var sFullProtocol=document.location.href.match(/^(file\:\/{2,3})/)[1];if (FCKBrowserInfo.IsOpera) sFullProtocol+='localhost/';FCKConfig.BasePath=sFullProtocol+FCKConfig.BasePath.substring(0,FCKConfig.BasePath.lastIndexOf('/')+1);}else FCKConfig.BasePath=document.location.protocol+'//'+document.location.host+document.location.pathname.substring(0,document.location.pathname.lastIndexOf('/')+1);FCKConfig.FullBasePath=FCKConfig.BasePath;FCKConfig.EditorPath=FCKConfig.BasePath.replace(/editor\/$/,'');try{FCKConfig.ScreenWidth=screen.width;FCKConfig.ScreenHeight=screen.height;}catch (e){FCKConfig.ScreenWidth=800;FCKConfig.ScreenHeight=600;};FCKConfig.ProcessHiddenField=function(){this.PageConfig={};var A=window.parent.document.getElementById(FCK.Name+'___Config');if (!A) return;var B=A.value.split('&');for (var i=0;i<B.length;i++){if (B[i].length==0) continue;var C=B[i].split('=');var D=decodeURIComponent(C[0]);var E=decodeURIComponent(C[1]);if (D=='CustomConfigurationsPath') FCKConfig[D]=E;else if (E.toLowerCase()=="true") this.PageConfig[D]=true;else if (E.toLowerCase()=="false") this.PageConfig[D]=false;else if (E.length>0&&!isNaN(E)) this.PageConfig[D]=parseInt(E,10);else this.PageConfig[D]=E;}};function FCKConfig_LoadPageConfig(){var A=FCKConfig.PageConfig;for (var B in A) FCKConfig[B]=A[B];};function FCKConfig_PreProcess(){var A=FCKConfig;if (A.AllowQueryStringDebug){try{if ((/fckdebug=true/i).test(window.top.location.search)) A.Debug=true;}catch (e) { }};if (!A.PluginsPath.EndsWith('/')) A.PluginsPath+='/';var B=A.ToolbarComboPreviewCSS;if (!B||B.length==0) A.ToolbarComboPreviewCSS=A.EditorAreaCSS;A.RemoveAttributesArray=(A.RemoveAttributes||'').split(',');if (!FCKConfig.SkinEditorCSS||FCKConfig.SkinEditorCSS.length==0) FCKConfig.SkinEditorCSS=FCKConfig.SkinPath+'fck_editor.css';if (!FCKConfig.SkinDialogCSS||FCKConfig.SkinDialogCSS.length==0) FCKConfig.SkinDialogCSS=FCKConfig.SkinPath+'fck_dialog.css';};FCKConfig.ToolbarSets={};FCKConfig.Plugins={};FCKConfig.Plugins.Items=[];FCKConfig.Plugins.Add=function(A,B,C){FCKConfig.Plugins.Items.AddItem([A,B,C]);};FCKConfig.ProtectedSource={};FCKConfig.ProtectedSource._CodeTag=(new Date()).valueOf();FCKConfig.ProtectedSource.RegexEntries=[/<!--[\s\S]*?-->/g,/<script[\s\S]*?<\/script>/gi,/<noscript[\s\S]*?<\/noscript>/gi];FCKConfig.ProtectedSource.Add=function(A){this.RegexEntries.AddItem(A);};FCKConfig.ProtectedSource.Protect=function(A){var B=this._CodeTag;function _Replace(protectedSource){var C=FCKTempBin.AddElement(protectedSource);return '<!--{'+B+C+'}-->';};for (var i=0;i<this.RegexEntries.length;i++){A=A.replace(this.RegexEntries[i],_Replace);};return A;};FCKConfig.ProtectedSource.Revert=function(A,B){function _Replace(m,opener,index){var C=B?FCKTempBin.RemoveElement(index):FCKTempBin.Elements[index];return FCKConfig.ProtectedSource.Revert(C,B);};var D=new RegExp("(<|<)!--\\{"+this._CodeTag+"(\\d+)\\}--(>|>)","g");return A.replace(D,_Replace);};FCKConfig.GetBodyAttributes=function(){var A='';if (this.BodyId&&this.BodyId.length>0) A+=' id="'+this.BodyId+'"';if (this.BodyClass&&this.BodyClass.length>0) A+=' class="'+this.BodyClass+'"';return A;};FCKConfig.ApplyBodyAttributes=function(A){if (this.BodyId&&this.BodyId.length>0) A.id=FCKConfig.BodyId;if (this.BodyClass&&this.BodyClass.length>0) A.className+=' '+FCKConfig.BodyClass;};
var FCKDebug={Output:function(){},OutputObject:function(){}};
-var FCKDomTools={MoveChildren:function(A,B,C){if (A==B) return;var D;if (C){while ((D=A.lastChild)) B.insertBefore(A.removeChild(D),B.firstChild);}else{while ((D=A.firstChild)) B.appendChild(A.removeChild(D));}},MoveNode:function(A,B,C){if (C) B.insertBefore(FCKDomTools.RemoveNode(A),B.firstChild);else B.appendChild(FCKDomTools.RemoveNode(A));},TrimNode:function(A){this.LTrimNode(A);this.RTrimNode(A);},LTrimNode:function(A){var B;while ((B=A.firstChild)){if (B.nodeType==3){var C=B.nodeValue.LTrim();var D=B.nodeValue.length;if (C.length==0){A.removeChild(B);continue;}else if (C.length<D){B.splitText(D-C.length);A.removeChild(A.firstChild);}};break;}},RTrimNode:function(A){var B;while ((B=A.lastChild)){if (B.nodeType==3){var C=B.nodeValue.RTrim();var D=B.nodeValue.length;if (C.length==0){B.parentNode.removeChild(B);continue;}else if (C.length<D){B.splitText(C.length);A.lastChild.parentNode.removeChild(A.lastChild);}};break;};if (!FCKBrowserInfo.IsIE&&!FCKBrowserInfo.IsOpera){B=A.lastChild;if (B&&B.nodeType==1&&B.nodeName.toLowerCase()=='br'){B.parentNode.removeChild(B);}}},RemoveNode:function(A,B){if (B){var C;while ((C=A.firstChild)) A.parentNode.insertBefore(A.removeChild(C),A);};return A.parentNode.removeChild(A);},GetFirstChild:function(A,B){if (typeof (B)=='string') B=[B];var C=A.firstChild;while(C){if (C.nodeType==1&&C.tagName.Equals.apply(C.tagName,B)) return C;C=C.nextSibling;};return null;},GetLastChild:function(A,B){if (typeof (B)=='string') B=[B];var C=A.lastChild;while(C){if (C.nodeType==1&&(!B||C.tagName.Equals(B))) return C;C=C.previousSibling;};return null;},GetPreviousSourceElement:function(A,B,C,D){if (!A) return null;if (C&&A.nodeType==1&&A.nodeName.IEquals(C)) return null;if (A.previousSibling) A=A.previousSibling;else return this.GetPreviousSourceElement(A.parentNode,B,C,D);while (A){if (A.nodeType==1){if (C&&A.nodeName.IEquals(C)) break;if (!D||!A.nodeName.IEquals(D)) return A;}else if (B&&A.nodeType==3&&A.nodeValue.RTrim().length>0) break;if (A.lastChild) A=A.lastChild;else return this.GetPreviousSourceElement(A,B,C,D);};return null;},GetNextSourceElement:function(A,B,C,D,E){while((A=this.GetNextSourceNode(A,E))){if (A.nodeType==1){if (C&&A.nodeName.IEquals(C)) break;if (D&&A.nodeName.IEquals(D)) return this.GetNextSourceElement(A,B,C,D);return A;}else if (B&&A.nodeType==3&&A.nodeValue.RTrim().length>0) break;};return null;},GetNextSourceNode:function(A,B,C,D){if (!A) return null;var E;if (!B&&A.firstChild) E=A.firstChild;else{if (D&&A==D) return null;E=A.nextSibling;if (!E&&(!D||D!=A.parentNode)) return this.GetNextSourceNode(A.parentNode,true,C,D);};if (C&&E&&E.nodeType!=C) return this.GetNextSourceNode(E,false,C,D);return E;},GetPreviousSourceNode:function(A,B,C,D){if (!A) return null;var E;if (!B&&A.lastChild) E=A.lastChild;else{if (D&&A==D) return null;E=A.previousSibling;if (!E&&(!D||D!=A.parentNode)) return this.GetPreviousSourceNode(A.parentNode,true,C,D);};if (C&&E&&E.nodeType!=C) return this.GetPreviousSourceNode(E,false,C,D);return E;},InsertAfterNode:function(A,B){return A.parentNode.insertBefore(B,A.nextSibling);},GetParents:function(A){var B=[];while (A){B.unshift(A);A=A.parentNode;};return B;},GetCommonParents:function(A,B){var C=this.GetParents(A);var D=this.GetParents(B);var E=[];for (var i=0;i<C.length;i++){if (C[i]==D[i]) E.push(C[i]);};return E;},GetCommonParentNode:function(A,B,C){var D={};if (!C.pop) C=[C];while (C.length>0) D[C.pop().toLowerCase()]=1;var E=this.GetCommonParents(A,B);var F=null;while ((F=E.pop())){if (D[F.nodeName.toLowerCase()]) return F;};return null;},GetIndexOf:function(A){var B=A.parentNode?A.parentNode.firstChild:null;var C=-1;while (B){C++;if (B==A) return C;B=B.nextSibling;};return-1;},PaddingNode:null,EnforcePaddingNode:function(A,B){try{if (!A||!A.body) return;}catch (e){return;};this.CheckAndRemovePaddingNode(A,B,true);try{if (A.body.lastChild&&(A.body.lastChild.nodeType!=1||A.body.lastChild.tagName.toLowerCase()==B.toLowerCase())) return;}catch (e){return;};var C=A.createElement(B);if (FCKBrowserInfo.IsGecko&&FCKListsLib.NonEmptyBlockElements[B]) FCKTools.AppendBogusBr(C);this.PaddingNode=C;if (A.body.childNodes.length==1&&A.body.firstChild.nodeType==1&&A.body.firstChild.tagName.toLowerCase()=='br'&&(A.body.firstChild.getAttribute('_moz_dirty')!=null||A.body.firstChild.getAttribute('type')=='_moz')) A.body.replaceChild(C,A.body.firstChild);else A.body.appendChild(C);},CheckAndRemovePaddingNode:function(A,B,C){var D=this.PaddingNode;if (!D) return;try{if (D.parentNode!=A.body||D.tagName.toLowerCase()!=B||(D.childNodes.length>1)||(D.firstChild&&D.firstChild.nodeValue!='\xa0'&&String(D.firstChild.tagName).toLowerCase()!='br')){this.PaddingNode=null;return;}}catch (e){this.PaddingNode=null;return;};if (!C){if (D.parentNode.childNodes.length>1) D.parentNode.removeChild(D);this.PaddingNode=null;}},HasAttribute:function(A,B){if (A.hasAttribute) return A.hasAttribute(B);else{var C=A.attributes[B];return (C!=undefined&&C.specified);}},HasAttributes:function(A){var B=A.attributes;for (var i=0;i<B.length;i++){if (FCKBrowserInfo.IsIE&&B[i].nodeName=='class'){if (A.className.length>0) return true;}else if (B[i].specified) return true;};return false;},RemoveAttribute:function(A,B){if (FCKBrowserInfo.IsIE&&B.toLowerCase()=='class') B='className';return A.removeAttribute(B,0);},RemoveAttributes:function (A,B){for (var i=0;i<B.length;i++) this.RemoveAttribute(A,B[i]);},GetAttributeValue:function(A,B){var C=B;if (typeof B=='string') B=A.attributes[B];else C=B.nodeName;if (B&&B.specified){if (C=='style') return A.style.cssText;else if (C=='class'||C.indexOf('on')==0) return B.nodeValue;else{return A.getAttribute(C,2);}};return null;},Contains:function(A,B){if (A.contains&&B.nodeType==1) return A.contains(B);while ((B=B.parentNode)){if (B==A) return true;};return false;},BreakParent:function(A,B,C){var D=C||new FCKDomRange(FCKTools.GetElementWindow(A));D.SetStart(A,4);D.SetEnd(B,4);var E=D.ExtractContents();D.InsertNode(A.parentNode.removeChild(A));E.InsertAfterNode(A);D.Release(!!C);},GetNodeAddress:function(A,B){var C=[];while (A&&A!=FCKTools.GetElementDocument(A).documentElement){var D=A.parentNode;var E=-1;for(var i=0;i<D.childNodes.length;i++){var F=D.childNodes[i];if (B===true&&F.nodeType==3&&F.previousSibling&&F.previousSibling.nodeType==3) continue;E++;if (D.childNodes[i]==A) break;};C.unshift(E);A=A.parentNode;};return C;},GetNodeFromAddress:function(A,B,C){var D=A.documentElement;for (var i=0;i<B.length;i++){var E=B[i];if (!C){D=D.childNodes[E];continue;};var F=-1;for (var j=0;j<D.childNodes.length;j++){var G=D.childNodes[j];if (C===true&&G.nodeType==3&&G.previousSibling&&G.previousSibling.nodeType==3) continue;F++;if (F==E){D=G;break;}}};return D;},CloneElement:function(A){A=A.cloneNode(false);A.removeAttribute('id',false);return A;},ClearElementJSProperty:function(A,B){if (FCKBrowserInfo.IsIE) A.removeAttribute(B);else delete A[B];},SetElementMarker:function (A,B,C,D){var E=String(parseInt(Math.random()*0xfffffff,10));B._FCKMarkerId=E;B[C]=D;if (!A[E]) A[E]={ 'element':B,'markers':{} };A[E]['markers'][C]=D;},ClearElementMarkers:function(A,B,C){var D=B._FCKMarkerId;if (!D) return;this.ClearElementJSProperty(B,'_FCKMarkerId');for (var j in A[D]['markers']) this.ClearElementJSProperty(B,j);if (C) delete A[D];},ClearAllMarkers:function(A){for (var i in A) this.ClearElementMarkers(A,A[i]['element'],true);},ListToArray:function(A,B,C,D,E){if (!A.nodeName.IEquals(['ul','ol'])) return [];if (!D) D=0;if (!C) C=[];for (var i=0;i<A.childNodes.length;i++){var F=A.childNodes[i];if (!F.nodeName.IEquals('li')) continue;var G={ 'parent':A,'indent':D,'contents':[] };if (!E){G.grandparent=A.parentNode;if (G.grandparent&&G.grandparent.nodeName.IEquals('li')) G.grandparent=G.grandparent.parentNode;}else G.grandparent=E;if (B) this.SetElementMarker(B,F,'_FCK_ListArray_Index',C.length);C.push(G);for (var j=0;j<F.childNodes.length;j++){var H=F.childNodes[j];if (H.nodeName.IEquals(['ul','ol'])) this.ListToArray(H,B,C,D+1,G.grandparent);else G.contents.push(H);}};return C;},ArrayToList:function(A,B,C){if (C==undefined) C=0;if (!A||A.length<C+1) return null;var D=FCKTools.GetElementDocument(A[C].parent);var E=D.createDocumentFragment();var F=null;var G=C;var H=Math.max(A[C].indent,0);var I=null;while (true){var J=A[G];if (J.indent==H){if (!F||A[G].parent.nodeName!=F.nodeName){F=A[G].parent.cloneNode(false);E.appendChild(F);};I=D.createElement('li');F.appendChild(I);for (var i=0;i<J.contents.length;i++) I.appendChild(J.contents[i].cloneNode(true));G++;}else if (J.indent==Math.max(H,0)+1){var K=this.ArrayToList(A,null,G);I.appendChild(K.listNode);G=K.nextIndex;}else if (J.indent==-1&&C==0&&J.grandparent){var I;if (J.grandparent.nodeName.IEquals(['ul','ol'])) I=D.createElement('li');else{if (FCKConfig.EnterMode.IEquals(['div','p'])&&!J.grandparent.nodeName.IEquals('td')) I=D.createElement(FCKConfig.EnterMode);else I=D.createDocumentFragment();};for (var i=0;i<J.contents.length;i++) I.appendChild(J.contents[i].cloneNode(true));if (I.nodeType==11){if (I.lastChild&&I.lastChild.getAttribute&&I.lastChild.getAttribute('type')=='_moz') I.removeChild(I.lastChild);I.appendChild(D.createElement('br'));};if (I.nodeName.IEquals(FCKConfig.EnterMode)&&I.firstChild){this.TrimNode(I);if (FCKListsLib.BlockBoundaries[I.firstChild.nodeName.toLowerCase()]){var M=D.createDocumentFragment();while (I.firstChild) M.appendChild(I.removeChild(I.firstChild));I=M;}};if (FCKBrowserInfo.IsGeckoLike&&I.nodeName.IEquals(['div','p'])) FCKTools.AppendBogusBr(I);E.appendChild(I);F=null;G++;}else return null;if (A.length<=G||Math.max(A[G].indent,0)<H){break;}};if (B){var N=E.firstChild;while (N){if (N.nodeType==1) this.ClearElementMarkers(B,N);N=this.GetNextSourceNode(N);}};return { 'listNode':E,'nextIndex':G };},GetNextSibling:function(A,B){A=A.nextSibling;while (A&&!B&&A.nodeType!=1&&(A.nodeType!=3||A.nodeValue.length==0)) A=A.nextSibling;return A;},GetPreviousSibling:function(A,B){A=A.previousSibling;while (A&&!B&&A.nodeType!=1&&(A.nodeType!=3||A.nodeValue.length==0)) A=A.previousSibling;return A;},CheckIsEmptyElement:function(A,B){var C=A.firstChild;var D;while (C){if (C.nodeType==1){if (D||!FCKListsLib.InlineNonEmptyElements[C.nodeName.toLowerCase()]) return false;if (!B||B(C)===true) D=C;}else if (C.nodeType==3&&C.nodeValue.length>0) return false;C=C.nextSibling;};return D?this.CheckIsEmptyElement(D,B):true;},SetElementStyles:function(A,B){var C=A.style;for (var D in B) C[D]=B[D];},SetOpacity:function(A,B){if (FCKBrowserInfo.IsIE){B=Math.round(B*100);A.style.filter=(B>100?'':'progid:DXImageTransform.Microsoft.Alpha(opacity='+B+')');}else A.style.opacity=B;},GetCurrentElementStyle:function(A,B){if (FCKBrowserInfo.IsIE) return A.currentStyle[B];else return A.ownerDocument.defaultView.getComputedStyle(A,'').getPropertyValue(B);},GetPositionedAncestor:function(A){var B=A;while (B!=FCKTools.GetElementDocument(B).documentElement){if (this.GetCurrentElementStyle(B,'position')!='static') return B;if (B==FCKTools.GetElementDocument(B).documentElement&¤tWindow!=w) B=currentWindow.frameElement;else B=B.parentNode;};return null;},ScrollIntoView:function(A,B){var C=FCKTools.GetElementWindow(A);var D=FCKTools.GetViewPaneSize(C).Height;var E=D*-1;if (B===false){E+=A.offsetHeight;E+=parseInt(this.GetCurrentElementStyle(A,'marginBottom')||0,10);};E+=A.offsetTop;while ((A=A.offsetParent)) E+=A.offsetTop||0;var F=FCKTools.GetScrollPosition(C).Y;if (E>0&&E>F) C.scrollTo(0,E);},CheckIsEditable:function(A){var B=A.nodeName.toLowerCase();var C=FCK.DTD[B]||FCK.DTD.span;return (C['#']&&!FCKListsLib.NonEditableElements[B]);}};
+var FCKDomTools={MoveChildren:function(A,B,C){if (A==B) return;var D;if (C){while ((D=A.lastChild)) B.insertBefore(A.removeChild(D),B.firstChild);}else{while ((D=A.firstChild)) B.appendChild(A.removeChild(D));}},MoveNode:function(A,B,C){if (C) B.insertBefore(FCKDomTools.RemoveNode(A),B.firstChild);else B.appendChild(FCKDomTools.RemoveNode(A));},TrimNode:function(A){this.LTrimNode(A);this.RTrimNode(A);},LTrimNode:function(A){var B;while ((B=A.firstChild)){if (B.nodeType==3){var C=B.nodeValue.LTrim();var D=B.nodeValue.length;if (C.length==0){A.removeChild(B);continue;}else if (C.length<D){B.splitText(D-C.length);A.removeChild(A.firstChild);}};break;}},RTrimNode:function(A){var B;while ((B=A.lastChild)){if (B.nodeType==3){var C=B.nodeValue.RTrim();var D=B.nodeValue.length;if (C.length==0){B.parentNode.removeChild(B);continue;}else if (C.length<D){B.splitText(C.length);A.lastChild.parentNode.removeChild(A.lastChild);}};break;};if (!FCKBrowserInfo.IsIE&&!FCKBrowserInfo.IsOpera){B=A.lastChild;if (B&&B.nodeType==1&&B.nodeName.toLowerCase()=='br'){B.parentNode.removeChild(B);}}},RemoveNode:function(A,B){if (B){var C;while ((C=A.firstChild)) A.parentNode.insertBefore(A.removeChild(C),A);};return A.parentNode.removeChild(A);},GetFirstChild:function(A,B){if (typeof (B)=='string') B=[B];var C=A.firstChild;while(C){if (C.nodeType==1&&C.tagName.Equals.apply(C.tagName,B)) return C;C=C.nextSibling;};return null;},GetLastChild:function(A,B){if (typeof (B)=='string') B=[B];var C=A.lastChild;while(C){if (C.nodeType==1&&(!B||C.tagName.Equals(B))) return C;C=C.previousSibling;};return null;},GetPreviousSourceElement:function(A,B,C,D){if (!A) return null;if (C&&A.nodeType==1&&A.nodeName.IEquals(C)) return null;if (A.previousSibling) A=A.previousSibling;else return this.GetPreviousSourceElement(A.parentNode,B,C,D);while (A){if (A.nodeType==1){if (C&&A.nodeName.IEquals(C)) break;if (!D||!A.nodeName.IEquals(D)) return A;}else if (B&&A.nodeType==3&&A.nodeValue.RTrim().length>0) break;if (A.lastChild) A=A.lastChild;else return this.GetPreviousSourceElement(A,B,C,D);};return null;},GetNextSourceElement:function(A,B,C,D,E){while((A=this.GetNextSourceNode(A,E))){if (A.nodeType==1){if (C&&A.nodeName.IEquals(C)) break;if (D&&A.nodeName.IEquals(D)) return this.GetNextSourceElement(A,B,C,D);return A;}else if (B&&A.nodeType==3&&A.nodeValue.RTrim().length>0) break;};return null;},GetNextSourceNode:function(A,B,C,D){if (!A) return null;var E;if (!B&&A.firstChild) E=A.firstChild;else{if (D&&A==D) return null;E=A.nextSibling;if (!E&&(!D||D!=A.parentNode)) return this.GetNextSourceNode(A.parentNode,true,C,D);};if (C&&E&&E.nodeType!=C) return this.GetNextSourceNode(E,false,C,D);return E;},GetPreviousSourceNode:function(A,B,C,D){if (!A) return null;var E;if (!B&&A.lastChild) E=A.lastChild;else{if (D&&A==D) return null;E=A.previousSibling;if (!E&&(!D||D!=A.parentNode)) return this.GetPreviousSourceNode(A.parentNode,true,C,D);};if (C&&E&&E.nodeType!=C) return this.GetPreviousSourceNode(E,false,C,D);return E;},InsertAfterNode:function(A,B){return A.parentNode.insertBefore(B,A.nextSibling);},GetParents:function(A){var B=[];while (A){B.unshift(A);A=A.parentNode;};return B;},GetCommonParents:function(A,B){var C=this.GetParents(A);var D=this.GetParents(B);var E=[];for (var i=0;i<C.length;i++){if (C[i]==D[i]) E.push(C[i]);};return E;},GetCommonParentNode:function(A,B,C){var D={};if (!C.pop) C=[C];while (C.length>0) D[C.pop().toLowerCase()]=1;var E=this.GetCommonParents(A,B);var F=null;while ((F=E.pop())){if (D[F.nodeName.toLowerCase()]) return F;};return null;},GetIndexOf:function(A){var B=A.parentNode?A.parentNode.firstChild:null;var C=-1;while (B){C++;if (B==A) return C;B=B.nextSibling;};return-1;},PaddingNode:null,EnforcePaddingNode:function(A,B){try{if (!A||!A.body) return;}catch (e){return;};this.CheckAndRemovePaddingNode(A,B,true);try{if (A.body.lastChild&&(A.body.lastChild.nodeType!=1||A.body.lastChild.tagName.toLowerCase()==B.toLowerCase())) return;}catch (e){return;};var C=A.createElement(B);if (FCKBrowserInfo.IsGecko&&FCKListsLib.NonEmptyBlockElements[B]) FCKTools.AppendBogusBr(C);this.PaddingNode=C;if (A.body.childNodes.length==1&&A.body.firstChild.nodeType==1&&A.body.firstChild.tagName.toLowerCase()=='br'&&(A.body.firstChild.getAttribute('_moz_dirty')!=null||A.body.firstChild.getAttribute('type')=='_moz')) A.body.replaceChild(C,A.body.firstChild);else A.body.appendChild(C);},CheckAndRemovePaddingNode:function(A,B,C){var D=this.PaddingNode;if (!D) return;try{if (D.parentNode!=A.body||D.tagName.toLowerCase()!=B||(D.childNodes.length>1)||(D.firstChild&&D.firstChild.nodeValue!='\xa0'&&String(D.firstChild.tagName).toLowerCase()!='br')){this.PaddingNode=null;return;}}catch (e){this.PaddingNode=null;return;};if (!C){if (D.parentNode.childNodes.length>1) D.parentNode.removeChild(D);this.PaddingNode=null;}},HasAttribute:function(A,B){if (A.hasAttribute) return A.hasAttribute(B);else{var C=A.attributes[B];return (C!=undefined&&C.specified);}},HasAttributes:function(A){var B=A.attributes;for (var i=0;i<B.length;i++){if (FCKBrowserInfo.IsIE&&B[i].nodeName=='class'){if (A.className.length>0) return true;}else if (B[i].specified) return true;};return false;},RemoveAttribute:function(A,B){if (FCKBrowserInfo.IsIE&&B.toLowerCase()=='class') B='className';return A.removeAttribute(B,0);},RemoveAttributes:function (A,B){for (var i=0;i<B.length;i++) this.RemoveAttribute(A,B[i]);},GetAttributeValue:function(A,B){var C=B;if (typeof B=='string') B=A.attributes[B];else C=B.nodeName;if (B&&B.specified){if (C=='style') return A.style.cssText;else if (C=='class'||C.indexOf('on')==0) return B.nodeValue;else{return A.getAttribute(C,2);}};return null;},Contains:function(A,B){if (A.contains&&B.nodeType==1) return A.contains(B);while ((B=B.parentNode)){if (B==A) return true;};return false;},BreakParent:function(A,B,C){var D=C||new FCKDomRange(FCKTools.GetElementWindow(A));D.SetStart(A,4);D.SetEnd(B,4);var E=D.ExtractContents();D.InsertNode(A.parentNode.removeChild(A));E.InsertAfterNode(A);D.Release(!!C);},GetNodeAddress:function(A,B){var C=[];while (A&&A!=FCKTools.GetElementDocument(A).documentElement){var D=A.parentNode;var E=-1;for(var i=0;i<D.childNodes.length;i++){var F=D.childNodes[i];if (B===true&&F.nodeType==3&&F.previousSibling&&F.previousSibling.nodeType==3) continue;E++;if (D.childNodes[i]==A) break;};C.unshift(E);A=A.parentNode;};return C;},GetNodeFromAddress:function(A,B,C){var D=A.documentElement;for (var i=0;i<B.length;i++){var E=B[i];if (!C){D=D.childNodes[E];continue;};var F=-1;for (var j=0;j<D.childNodes.length;j++){var G=D.childNodes[j];if (C===true&&G.nodeType==3&&G.previousSibling&&G.previousSibling.nodeType==3) continue;F++;if (F==E){D=G;break;}}};return D;},CloneElement:function(A){A=A.cloneNode(false);A.removeAttribute('id',false);return A;},ClearElementJSProperty:function(A,B){if (FCKBrowserInfo.IsIE) A.removeAttribute(B);else delete A[B];},SetElementMarker:function (A,B,C,D){var E=String(parseInt(Math.random()*0xffffffff,10));B._FCKMarkerId=E;B[C]=D;if (!A[E]) A[E]={ 'element':B,'markers':{} };A[E]['markers'][C]=D;},ClearElementMarkers:function(A,B,C){var D=B._FCKMarkerId;if (!D) return;this.ClearElementJSProperty(B,'_FCKMarkerId');for (var j in A[D]['markers']) this.ClearElementJSProperty(B,j);if (C) delete A[D];},ClearAllMarkers:function(A){for (var i in A) this.ClearElementMarkers(A,A[i]['element'],true);},ListToArray:function(A,B,C,D,E){if (!A.nodeName.IEquals(['ul','ol'])) return [];if (!D) D=0;if (!C) C=[];for (var i=0;i<A.childNodes.length;i++){var F=A.childNodes[i];if (!F.nodeName.IEquals('li')) continue;var G={ 'parent':A,'indent':D,'contents':[] };if (!E){G.grandparent=A.parentNode;if (G.grandparent&&G.grandparent.nodeName.IEquals('li')) G.grandparent=G.grandparent.parentNode;}else G.grandparent=E;if (B) this.SetElementMarker(B,F,'_FCK_ListArray_Index',C.length);C.push(G);for (var j=0;j<F.childNodes.length;j++){var H=F.childNodes[j];if (H.nodeName.IEquals(['ul','ol'])) this.ListToArray(H,B,C,D+1,G.grandparent);else G.contents.push(H);}};return C;},ArrayToList:function(A,B,C){if (C==undefined) C=0;if (!A||A.length<C+1) return null;var D=FCKTools.GetElementDocument(A[C].parent);var E=D.createDocumentFragment();var F=null;var G=C;var H=Math.max(A[C].indent,0);var I=null;while (true){var J=A[G];if (J.indent==H){if (!F||A[G].parent.nodeName!=F.nodeName){F=A[G].parent.cloneNode(false);E.appendChild(F);};I=D.createElement('li');F.appendChild(I);for (var i=0;i<J.contents.length;i++) I.appendChild(J.contents[i].cloneNode(true));G++;}else if (J.indent==Math.max(H,0)+1){var K=this.ArrayToList(A,null,G);I.appendChild(K.listNode);G=K.nextIndex;}else if (J.indent==-1&&C==0&&J.grandparent){var I;if (J.grandparent.nodeName.IEquals(['ul','ol'])) I=D.createElement('li');else{if (FCKConfig.EnterMode.IEquals(['div','p'])&&!J.grandparent.nodeName.IEquals('td')) I=D.createElement(FCKConfig.EnterMode);else I=D.createDocumentFragment();};for (var i=0;i<J.contents.length;i++) I.appendChild(J.contents[i].cloneNode(true));if (I.nodeType==11){if (I.lastChild&&I.lastChild.getAttribute&&I.lastChild.getAttribute('type')=='_moz') I.removeChild(I.lastChild);I.appendChild(D.createElement('br'));};if (I.nodeName.IEquals(FCKConfig.EnterMode)&&I.firstChild){this.TrimNode(I);if (FCKListsLib.BlockBoundaries[I.firstChild.nodeName.toLowerCase()]){var M=D.createDocumentFragment();while (I.firstChild) M.appendChild(I.removeChild(I.firstChild));I=M;}};if (FCKBrowserInfo.IsGeckoLike&&I.nodeName.IEquals(['div','p'])) FCKTools.AppendBogusBr(I);E.appendChild(I);F=null;G++;}else return null;if (A.length<=G||Math.max(A[G].indent,0)<H){break;}};if (B){var N=E.firstChild;while (N){if (N.nodeType==1) this.ClearElementMarkers(B,N);N=this.GetNextSourceNode(N);}};return { 'listNode':E,'nextIndex':G };},GetNextSibling:function(A,B){A=A.nextSibling;while (A&&!B&&A.nodeType!=1&&(A.nodeType!=3||A.nodeValue.length==0)) A=A.nextSibling;return A;},GetPreviousSibling:function(A,B){A=A.previousSibling;while (A&&!B&&A.nodeType!=1&&(A.nodeType!=3||A.nodeValue.length==0)) A=A.previousSibling;return A;},CheckIsEmptyElement:function(A,B){var C=A.firstChild;var D;while (C){if (C.nodeType==1){if (D||!FCKListsLib.InlineNonEmptyElements[C.nodeName.toLowerCase()]) return false;if (!B||B(C)===true) D=C;}else if (C.nodeType==3&&C.nodeValue.length>0) return false;C=C.nextSibling;};return D?this.CheckIsEmptyElement(D,B):true;},SetElementStyles:function(A,B){var C=A.style;for (var D in B) C[D]=B[D];},SetOpacity:function(A,B){if (FCKBrowserInfo.IsIE){B=Math.round(B*100);A.style.filter=(B>100?'':'progid:DXImageTransform.Microsoft.Alpha(opacity='+B+')');}else A.style.opacity=B;},GetCurrentElementStyle:function(A,B){if (FCKBrowserInfo.IsIE) return A.currentStyle[B];else return A.ownerDocument.defaultView.getComputedStyle(A,'').getPropertyValue(B);},GetPositionedAncestor:function(A){var B=A;while (B!=FCKTools.GetElementDocument(B).documentElement){if (this.GetCurrentElementStyle(B,'position')!='static') return B;if (B==FCKTools.GetElementDocument(B).documentElement&¤tWindow!=w) B=currentWindow.frameElement;else B=B.parentNode;};return null;},ScrollIntoView:function(A,B){var C=FCKTools.GetElementWindow(A);var D=FCKTools.GetViewPaneSize(C).Height;var E=D*-1;if (B===false){E+=A.offsetHeight||0;E+=parseInt(this.GetCurrentElementStyle(A,'marginBottom')||0,10)||0;};var F=FCKTools.GetDocumentPosition(C,A);E+=F.y;var G=FCKTools.GetScrollPosition(C).Y;if (E>0&&(E>G||E<G-D)) C.scrollTo(0,E);},CheckIsEditable:function(A){var B=A.nodeName.toLowerCase();var C=FCK.DTD[B]||FCK.DTD.span;return (C['#']&&!FCKListsLib.NonEditableElements[B]);},GetSelectedDivContainers:function(){var A=[];var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=B.GetTouchedStartNode();var D=B.GetTouchedEndNode();var E=C;if (C==D){while (D.nodeType==1&&D.lastChild) D=D.lastChild;D=FCKDomTools.GetNextSourceNode(D);}while (E&&E!=D){if (E.nodeType!=3||!/^[ \t\n]*$/.test(E.nodeValue)){var F=new FCKElementPath(E);var G=F.BlockLimit;if (G&&G.nodeName.IEquals('div')&&A.IndexOf(G)==-1) A.push(G);};E=FCKDomTools.GetNextSourceNode(E);};return A;}};
var FCKTools={};FCKTools.CreateBogusBR=function(A){var B=A.createElement('br');B.setAttribute('type','_moz');return B;};FCKTools.FixCssUrls=function(A,B){if (!A||A.length==0) return B;return B.replace(/url\s*\(([\s'"]*)(.*?)([\s"']*)\)/g,function(match,opener,path,closer){if (/^\/|^\w?:/.test(path)) return match;else return 'url('+opener+A+path+closer+')';});};FCKTools._GetUrlFixedCss=function(A,B){var C=A.match(/^([^|]+)\|([\s\S]*)/);if (C) return FCKTools.FixCssUrls(C[1],C[2]);else return A;};FCKTools.AppendStyleSheet=function(A,B){if (!B) return [];if (typeof(B)=='string'){if (/[\\\/\.][^{}]*$/.test(B)){return this.AppendStyleSheet(A,B.split(','));}else return [this.AppendStyleString(A,FCKTools._GetUrlFixedCss(B))];}else{var C=[];for (var i=0;i<B.length;i++) C.push(this._AppendStyleSheet(A,B[i]));return C;}};FCKTools.GetStyleHtml=(function(){var A=function(styleDef,markTemp){if (styleDef.length==0) return '';var B=markTemp?' _fcktemp="true"':'';return '<style type="text/css"'+B+'>'+styleDef+'</style>';};var C=function(cssFileUrl,markTemp){if (cssFileUrl.length==0) return '';var B=markTemp?' _fcktemp="true"':'';return '<link href="'+cssFileUrl+'" type="text/css" rel="stylesheet" '+B+'/>';};return function(cssFileOrArrayOrDef,markTemp){if (!cssFileOrArrayOrDef) return '';if (typeof(cssFileOrArrayOrDef)=='string'){if (/[\\\/\.][^{}]*$/.test(cssFileOrArrayOrDef)){return this.GetStyleHtml(cssFileOrArrayOrDef.split(','),markTemp);}else return A(this._GetUrlFixedCss(cssFileOrArrayOrDef),markTemp);}else{var E='';for (var i=0;i<cssFileOrArrayOrDef.length;i++) E+=C(cssFileOrArrayOrDef[i],markTemp);return E;}}})();FCKTools.GetElementDocument=function (A){return A.ownerDocument||A.document;};FCKTools.GetElementWindow=function(A){return this.GetDocumentWindow(this.GetElementDocument(A));};FCKTools.GetDocumentWindow=function(A){if (FCKBrowserInfo.IsSafari&&!A.parentWindow) this.FixDocumentParentWindow(window.top);return A.parentWindow||A.defaultView;};FCKTools.FixDocumentParentWindow=function(A){if (A.document) A.document.parentWindow=A;for (var i=0;i<A.frames.length;i++) FCKTools.FixDocumentParentWindow(A.frames[i]);};FCKTools.HTMLEncode=function(A){if (!A) return '';A=A.replace(/&/g,'&');A=A.replace(/</g,'<');A=A.replace(/>/g,'>');return A;};FCKTools.HTMLDecode=function(A){if (!A) return '';A=A.replace(/>/g,'>');A=A.replace(/</g,'<');A=A.replace(/&/g,'&');return A;};FCKTools._ProcessLineBreaksForPMode=function(A,B,C,D,E){var F=0;var G="<p>";var H="</p>";var I="<br />";if (C){G="<li>";H="</li>";F=1;}while (D&&D!=A.FCK.EditorDocument.body){if (D.tagName.toLowerCase()=='p'){F=1;break;};D=D.parentNode;};for (var i=0;i<B.length;i++){var c=B.charAt(i);if (c=='\r') continue;if (c!='\n'){E.push(c);continue;};var n=B.charAt(i+1);if (n=='\r'){i++;n=B.charAt(i+1);};if (n=='\n'){i++;if (F) E.push(H);E.push(G);F=1;}else E.push(I);}};FCKTools._ProcessLineBreaksForDivMode=function(A,B,C,D,E){var F=0;var G="<div>";var H="</div>";if (C){G="<li>";H="</li>";F=1;}while (D&&D!=A.FCK.EditorDocument.body){if (D.tagName.toLowerCase()=='div'){F=1;break;};D=D.parentNode;};for (var i=0;i<B.length;i++){var c=B.charAt(i);if (c=='\r') continue;if (c!='\n'){E.push(c);continue;};if (F){if (E[E.length-1]==G){E.push(" ");};E.push(H);};E.push(G);F=1;};if (F) E.push(H);};FCKTools._ProcessLineBreaksForBrMode=function(A,B,C,D,E){var F=0;var G="<br />";var H="";if (C){G="<li>";H="</li>";F=1;};for (var i=0;i<B.length;i++){var c=B.charAt(i);if (c=='\r') continue;if (c!='\n'){E.push(c);continue;};if (F&&H.length) E.push (H);E.push(G);F=1;}};FCKTools.ProcessLineBreaks=function(A,B,C){var D=B.EnterMode.toLowerCase();var E=[];var F=0;var G=new A.FCKDomRange(A.FCK.EditorWindow);G.MoveToSelection();var H=G._Range.startContainer;while (H&&H.nodeType!=1) H=H.parentNode;if (H&&H.tagName.toLowerCase()=='li') F=1;if (D=='p') this._ProcessLineBreaksForPMode(A,C,F,H,E);else if (D=='div') this._ProcessLineBreaksForDivMode(A,C,F,H,E);else if (D=='br') this._ProcessLineBreaksForBrMode(A,C,F,H,E);return E.join("");};FCKTools.AddSelectOption=function(A,B,C){var D=FCKTools.GetElementDocument(A).createElement("OPTION");D.text=B;D.value=C;A.options.add(D);return D;};FCKTools.RunFunction=function(A,B,C,D){if (A) this.SetTimeout(A,0,B,C,D);};FCKTools.SetTimeout=function(A,B,C,D,E){return (E||window).setTimeout(function(){if (D) A.apply(C,[].concat(D));else A.apply(C);},B);};FCKTools.SetInterval=function(A,B,C,D,E){return (E||window).setInterval(function(){A.apply(C,D||[]);},B);};FCKTools.ConvertStyleSizeToHtml=function(A){return A.EndsWith('%')?A:parseInt(A,10);};FCKTools.ConvertHtmlSizeToStyle=function(A){return A.EndsWith('%')?A:(A+'px');};FCKTools.GetElementAscensor=function(A,B){var e=A;var C=","+B.toUpperCase()+",";while (e){if (C.indexOf(","+e.nodeName.toUpperCase()+",")!=-1) return e;e=e.parentNode;};return null;};FCKTools.CreateEventListener=function(A,B){var f=function(){var C=[];for (var i=0;i<arguments.length;i++) C.push(arguments[i]);A.apply(this,C.concat(B));};return f;};FCKTools.IsStrictMode=function(A){return ('CSS1Compat'==(A.compatMode||(FCKBrowserInfo.IsSafari?'CSS1Compat':null)));};FCKTools.ArgumentsToArray=function(A,B,C){B=B||0;C=C||A.length;var D=[];for (var i=B;i<B+C&&i<A.length;i++) D.push(A[i]);return D;};FCKTools.CloneObject=function(A){var B=function() {};B.prototype=A;return new B;};FCKTools.AppendBogusBr=function(A){if (!A) return;var B=this.GetLastItem(A.getElementsByTagName('br'));if (!B||(B.getAttribute('type',2)!='_moz'&&B.getAttribute('_moz_dirty')==null)){var C=this.GetElementDocument(A);if (FCKBrowserInfo.IsOpera) A.appendChild(C.createTextNode(''));else A.appendChild(this.CreateBogusBR(C));}};FCKTools.GetLastItem=function(A){if (A.length>0) return A[A.length-1];return null;};FCKTools.GetDocumentPosition=function(w,A){var x=0;var y=0;var B=A;var C=null;var D=FCKTools.GetElementWindow(B);while (B&&!(D==w&&(B==w.document.body||B==w.document.documentElement))){x+=B.offsetLeft-B.scrollLeft;y+=B.offsetTop-B.scrollTop;if (!FCKBrowserInfo.IsOpera){var E=C;while (E&&E!=B){x-=E.scrollLeft;y-=E.scrollTop;E=E.parentNode;}};C=B;if (B.offsetParent) B=B.offsetParent;else{if (D!=w){B=D.frameElement;C=null;if (B) D=B.contentWindow.parent;}else B=null;}};if (FCKDomTools.GetCurrentElementStyle(w.document.body,'position')!='static'||(FCKBrowserInfo.IsIE&&FCKDomTools.GetPositionedAncestor(A)==null)){x+=w.document.body.offsetLeft;y+=w.document.body.offsetTop;};return { "x":x,"y":y };};FCKTools.GetWindowPosition=function(w,A){var B=this.GetDocumentPosition(w,A);var C=FCKTools.GetScrollPosition(w);B.x-=C.X;B.y-=C.Y;return B;};FCKTools.ProtectFormStyles=function(A){if (!A||A.nodeType!=1||A.tagName.toLowerCase()!='form') return [];var B=[];var C=['style','className'];for (var i=0;i<C.length;i++){var D=C[i];if (A.elements.namedItem(D)){var E=A.elements.namedItem(D);B.push([E,E.nextSibling]);A.removeChild(E);}};return B;};FCKTools.RestoreFormStyles=function(A,B){if (!A||A.nodeType!=1||A.tagName.toLowerCase()!='form') return;if (B.length>0){for (var i=B.length-1;i>=0;i--){var C=B[i][0];var D=B[i][1];if (D) A.insertBefore(C,D);else A.appendChild(C);}}};FCKTools.GetNextNode=function(A,B){if (A.firstChild) return A.firstChild;else if (A.nextSibling) return A.nextSibling;else{var C=A.parentNode;while (C){if (C==B) return null;if (C.nextSibling) return C.nextSibling;else C=C.parentNode;}};return null;};FCKTools.GetNextTextNode=function(A,B,C){node=this.GetNextNode(A,B);if (C&&node&&C(node)) return null;while (node&&node.nodeType!=3){node=this.GetNextNode(node,B);if (C&&node&&C(node)) return null;};return node;};FCKTools.Merge=function(){var A=arguments;var o=A[0];for (var i=1;i<A.length;i++){var B=A[i];for (var p in B) o[p]=B[p];};return o;};FCKTools.IsArray=function(A){return (A instanceof Array);};FCKTools.AppendLengthProperty=function(A,B){var C=0;for (var n in A) C++;return A[B||'length']=C;};FCKTools.NormalizeCssText=function(A){var B=document.createElement('span');B.style.cssText=A;return B.style.cssText;};FCKTools.Bind=function(A,B){return function(){ return B.apply(A,arguments);};};FCKTools.GetVoidUrl=function(){if (FCK_IS_CUSTOM_DOMAIN) return "javascript: void( function(){document.open();document.write('<html><head><title></title></head><body></body></html>');document.domain = '"+FCK_RUNTIME_DOMAIN+"';document.close();}() ) ;";if (FCKBrowserInfo.IsIE){if (FCKBrowserInfo.IsIE7||!FCKBrowserInfo.IsIE6) return "";else return "javascript: '';";};return "javascript: void(0);";};FCKTools.ResetStyles=function(A){A.style.cssText='margin:0;padding:0;border:0;background-color:transparent;background-image:none;';};
-FCKTools.CancelEvent=function(e){return false;};FCKTools._AppendStyleSheet=function(A,B){return A.createStyleSheet(B).owningElement;};FCKTools.AppendStyleString=function(A,B){if (!B) return null;var s=A.createStyleSheet("");s.cssText=B;return s;};FCKTools.ClearElementAttributes=function(A){A.clearAttributes();};FCKTools.GetAllChildrenIds=function(A){var B=[];for (var i=0;i<A.all.length;i++){var C=A.all[i].id;if (C&&C.length>0) B[B.length]=C;};return B;};FCKTools.RemoveOuterTags=function(e){e.insertAdjacentHTML('beforeBegin',e.innerHTML);e.parentNode.removeChild(e);};FCKTools.CreateXmlObject=function(A){var B;switch (A){case 'XmlHttp':try { return new XMLHttpRequest();} catch (e) {};B=['MSXML2.XmlHttp','Microsoft.XmlHttp'];break;case 'DOMDocument':B=['MSXML2.DOMDocument','Microsoft.XmlDom'];break;};for (var i=0;i<2;i++){try { return new ActiveXObject(B[i]);}catch (e){}};if (FCKLang.NoActiveX){alert(FCKLang.NoActiveX);FCKLang.NoActiveX=null;};return null;};FCKTools.DisableSelection=function(A){A.unselectable='on';var e,i=0;while ((e=A.all[i++])){switch (e.tagName){case 'IFRAME':case 'TEXTAREA':case 'INPUT':case 'SELECT':break;default:e.unselectable='on';}}};FCKTools.GetScrollPosition=function(A){var B=A.document;var C={ X:B.documentElement.scrollLeft,Y:B.documentElement.scrollTop };if (C.X>0||C.Y>0) return C;return { X:B.body.scrollLeft,Y:B.body.scrollTop };};FCKTools.AddEventListener=function(A,B,C){A.attachEvent('on'+B,C);};FCKTools.RemoveEventListener=function(A,B,C){A.detachEvent('on'+B,C);};FCKTools.AddEventListenerEx=function(A,B,C,D){var o={};o.Source=A;o.Params=D||[];o.Listener=function(ev){return C.apply(o.Source,[ev].concat(o.Params));};if (FCK.IECleanup) FCK.IECleanup.AddItem(null,function() { o.Source=null;o.Params=null;});A.attachEvent('on'+B,o.Listener);A=null;D=null;};FCKTools.GetViewPaneSize=function(A){var B;var C=A.document.documentElement;if (C&&C.clientWidth) B=C;else B=A.document.body;if (B) return { Width:B.clientWidth,Height:B.clientHeight };else return { Width:0,Height:0 };};FCKTools.SaveStyles=function(A){var B=FCKTools.ProtectFormStyles(A);var C={};if (A.className.length>0){C.Class=A.className;A.className='';};var D=A.style.cssText;if (D.length>0){C.Inline=D;A.style.cssText='';};FCKTools.RestoreFormStyles(A,B);return C;};FCKTools.RestoreStyles=function(A,B){var C=FCKTools.ProtectFormStyles(A);A.className=B.Class||'';A.style.cssText=B.Inline||'';FCKTools.RestoreFormStyles(A,C);};FCKTools.RegisterDollarFunction=function(A){A.$=A.document.getElementById;};FCKTools.AppendElement=function(A,B){return A.appendChild(this.GetElementDocument(A).createElement(B));};FCKTools.ToLowerCase=function(A){return A.toLowerCase();};
-var FCKeditorAPI;function InitializeAPI(){var A=window.parent;if (!(FCKeditorAPI=A.FCKeditorAPI)){var B='window.FCKeditorAPI = {Version : "2.6.2",VersionBuild : "19417",Instances : new Object(),GetInstance : function( name ){return this.Instances[ name ];},_FormSubmit : function(){for ( var name in FCKeditorAPI.Instances ){var oEditor = FCKeditorAPI.Instances[ name ] ;if ( oEditor.GetParentForm && oEditor.GetParentForm() == this )oEditor.UpdateLinkedField() ;}this._FCKOriginalSubmit() ;},_FunctionQueue : {Functions : new Array(),IsRunning : false,Add : function( f ){this.Functions.push( f );if ( !this.IsRunning )this.StartNext();},StartNext : function(){var aQueue = this.Functions ;if ( aQueue.length > 0 ){this.IsRunning = true;aQueue[0].call();}else this.IsRunning = false;},Remove : function( f ){var aQueue = this.Functions;var i = 0, fFunc;while( (fFunc = aQueue[ i ]) ){if ( fFunc == f )aQueue.splice( i,1 );i++ ;}this.StartNext();}}}';if (A.execScript) A.execScript(B,'JavaScript');else{if (FCKBrowserInfo.IsGecko10){eval.call(A,B);}else if(FCKBrowserInfo.IsAIR){FCKAdobeAIR.FCKeditorAPI_Evaluate(A,B);}else if (FCKBrowserInfo.IsSafari||FCKBrowserInfo.IsGecko19){var C=A.document;var D=C.createElement('script');D.appendChild(C.createTextNode(B));C.documentElement.appendChild(D);}else A.eval(B);};FCKeditorAPI=A.FCKeditorAPI;FCKeditorAPI.__Instances=FCKeditorAPI.Instances;};FCKeditorAPI.Instances[FCK.Name]=FCK;};function _AttachFormSubmitToAPI(){var A=FCK.GetParentForm();if (A){FCKTools.AddEventListener(A,'submit',FCK.UpdateLinkedField);if (!A._FCKOriginalSubmit&&(typeof(A.submit)=='function'||(!A.submit.tagName&&!A.submit.length))){A._FCKOriginalSubmit=A.submit;A.submit=FCKeditorAPI._FormSubmit;}}};function FCKeditorAPI_Cleanup(){if (window.FCKConfig&&FCKConfig.MsWebBrowserControlCompat&&!window.FCKUnloadFlag) return;delete FCKeditorAPI.Instances[FCK.Name];};function FCKeditorAPI_ConfirmCleanup(){if (window.FCKConfig&&FCKConfig.MsWebBrowserControlCompat) window.FCKUnloadFlag=true;};FCKTools.AddEventListener(window,'unload',FCKeditorAPI_Cleanup);FCKTools.AddEventListener(window,'beforeunload',FCKeditorAPI_ConfirmCleanup);
+FCKTools.CancelEvent=function(e){return false;};FCKTools._AppendStyleSheet=function(A,B){return A.createStyleSheet(B).owningElement;};FCKTools.AppendStyleString=function(A,B){if (!B) return null;var s=A.createStyleSheet("");s.cssText=B;return s;};FCKTools.ClearElementAttributes=function(A){A.clearAttributes();};FCKTools.GetAllChildrenIds=function(A){var B=[];for (var i=0;i<A.all.length;i++){var C=A.all[i].id;if (C&&C.length>0) B[B.length]=C;};return B;};FCKTools.RemoveOuterTags=function(e){e.insertAdjacentHTML('beforeBegin',e.innerHTML);e.parentNode.removeChild(e);};FCKTools.CreateXmlObject=function(A){var B;switch (A){case 'XmlHttp':if (document.location.protocol!='file:') try { return new XMLHttpRequest();} catch (e) {};B=['MSXML2.XmlHttp','Microsoft.XmlHttp'];break;case 'DOMDocument':B=['MSXML2.DOMDocument','Microsoft.XmlDom'];break;};for (var i=0;i<2;i++){try { return new ActiveXObject(B[i]);}catch (e){}};if (FCKLang.NoActiveX){alert(FCKLang.NoActiveX);FCKLang.NoActiveX=null;};return null;};FCKTools.DisableSelection=function(A){A.unselectable='on';var e,i=0;while ((e=A.all[i++])){switch (e.tagName){case 'IFRAME':case 'TEXTAREA':case 'INPUT':case 'SELECT':break;default:e.unselectable='on';}}};FCKTools.GetScrollPosition=function(A){var B=A.document;var C={ X:B.documentElement.scrollLeft,Y:B.documentElement.scrollTop };if (C.X>0||C.Y>0) return C;return { X:B.body.scrollLeft,Y:B.body.scrollTop };};FCKTools.AddEventListener=function(A,B,C){A.attachEvent('on'+B,C);};FCKTools.RemoveEventListener=function(A,B,C){A.detachEvent('on'+B,C);};FCKTools.AddEventListenerEx=function(A,B,C,D){var o={};o.Source=A;o.Params=D||[];o.Listener=function(ev){return C.apply(o.Source,[ev].concat(o.Params));};if (FCK.IECleanup) FCK.IECleanup.AddItem(null,function() { o.Source=null;o.Params=null;});A.attachEvent('on'+B,o.Listener);A=null;D=null;};FCKTools.GetViewPaneSize=function(A){var B;var C=A.document.documentElement;if (C&&C.clientWidth) B=C;else B=A.document.body;if (B) return { Width:B.clientWidth,Height:B.clientHeight };else return { Width:0,Height:0 };};FCKTools.SaveStyles=function(A){var B=FCKTools.ProtectFormStyles(A);var C={};if (A.className.length>0){C.Class=A.className;A.className='';};var D=A.style.cssText;if (D.length>0){C.Inline=D;A.style.cssText='';};FCKTools.RestoreFormStyles(A,B);return C;};FCKTools.RestoreStyles=function(A,B){var C=FCKTools.ProtectFormStyles(A);A.className=B.Class||'';A.style.cssText=B.Inline||'';FCKTools.RestoreFormStyles(A,C);};FCKTools.RegisterDollarFunction=function(A){A.$=A.document.getElementById;};FCKTools.AppendElement=function(A,B){return A.appendChild(this.GetElementDocument(A).createElement(B));};FCKTools.ToLowerCase=function(A){return A.toLowerCase();};
+var FCKeditorAPI;function InitializeAPI(){var A=window.parent;if (!(FCKeditorAPI=A.FCKeditorAPI)){var B='window.FCKeditorAPI = {Version : "2.6.3",VersionBuild : "19836",Instances : new Object(),GetInstance : function( name ){return this.Instances[ name ];},_FormSubmit : function(){for ( var name in FCKeditorAPI.Instances ){var oEditor = FCKeditorAPI.Instances[ name ] ;if ( oEditor.GetParentForm && oEditor.GetParentForm() == this )oEditor.UpdateLinkedField() ;}this._FCKOriginalSubmit() ;},_FunctionQueue : {Functions : new Array(),IsRunning : false,Add : function( f ){this.Functions.push( f );if ( !this.IsRunning )this.StartNext();},StartNext : function(){var aQueue = this.Functions ;if ( aQueue.length > 0 ){this.IsRunning = true;aQueue[0].call();}else this.IsRunning = false;},Remove : function( f ){var aQueue = this.Functions;var i = 0, fFunc;while( (fFunc = aQueue[ i ]) ){if ( fFunc == f )aQueue.splice( i,1 );i++ ;}this.StartNext();}}}';if (A.execScript) A.execScript(B,'JavaScript');else{if (FCKBrowserInfo.IsGecko10){eval.call(A,B);}else if(FCKBrowserInfo.IsAIR){FCKAdobeAIR.FCKeditorAPI_Evaluate(A,B);}else if (FCKBrowserInfo.IsSafari){var C=A.document;var D=C.createElement('script');D.appendChild(C.createTextNode(B));C.documentElement.appendChild(D);}else A.eval(B);};FCKeditorAPI=A.FCKeditorAPI;FCKeditorAPI.__Instances=FCKeditorAPI.Instances;};FCKeditorAPI.Instances[FCK.Name]=FCK;};function _AttachFormSubmitToAPI(){var A=FCK.GetParentForm();if (A){FCKTools.AddEventListener(A,'submit',FCK.UpdateLinkedField);if (!A._FCKOriginalSubmit&&(typeof(A.submit)=='function'||(!A.submit.tagName&&!A.submit.length))){A._FCKOriginalSubmit=A.submit;A.submit=FCKeditorAPI._FormSubmit;}}};function FCKeditorAPI_Cleanup(){if (window.FCKConfig&&FCKConfig.MsWebBrowserControlCompat&&!window.FCKUnloadFlag) return;delete FCKeditorAPI.Instances[FCK.Name];};function FCKeditorAPI_ConfirmCleanup(){if (window.FCKConfig&&FCKConfig.MsWebBrowserControlCompat) window.FCKUnloadFlag=true;};FCKTools.AddEventListener(window,'unload',FCKeditorAPI_Cleanup);FCKTools.AddEventListener(window,'beforeunload',FCKeditorAPI_ConfirmCleanup);
var FCKImagePreloader=function(){this._Images=[];};FCKImagePreloader.prototype={AddImages:function(A){if (typeof(A)=='string') A=A.split(';');this._Images=this._Images.concat(A);},Start:function(){var A=this._Images;this._PreloadCount=A.length;for (var i=0;i<A.length;i++){var B=document.createElement('img');FCKTools.AddEventListenerEx(B,'load',_FCKImagePreloader_OnImage,this);FCKTools.AddEventListenerEx(B,'error',_FCKImagePreloader_OnImage,this);B.src=A[i];_FCKImagePreloader_ImageCache.push(B);}}};var _FCKImagePreloader_ImageCache=[];function _FCKImagePreloader_OnImage(A,B){if ((--B._PreloadCount)==0&&B.OnComplete) B.OnComplete();};
var FCKRegexLib={AposEntity:/'/gi,ObjectElements:/^(?:IMG|TABLE|TR|TD|TH|INPUT|SELECT|TEXTAREA|HR|OBJECT|A|UL|OL|LI)$/i,NamedCommands:/^(?:Cut|Copy|Paste|Print|SelectAll|RemoveFormat|Unlink|Undo|Redo|Bold|Italic|Underline|StrikeThrough|Subscript|Superscript|JustifyLeft|JustifyCenter|JustifyRight|JustifyFull|Outdent|Indent|InsertOrderedList|InsertUnorderedList|InsertHorizontalRule)$/i,BeforeBody:/(^[\s\S]*\<body[^\>]*\>)/i,AfterBody:/(\<\/body\>[\s\S]*$)/i,ToReplace:/___fcktoreplace:([\w]+)/ig,MetaHttpEquiv:/http-equiv\s*=\s*["']?([^"' ]+)/i,HasBaseTag:/<base /i,HasBodyTag:/<body[\s|>]/i,HtmlOpener:/<html\s?[^>]*>/i,HeadOpener:/<head\s?[^>]*>/i,HeadCloser:/<\/head\s*>/i,FCK_Class:/\s*FCK__[^ ]*(?=\s+|$)/,ElementName:/(^[a-z_:][\w.\-:]*\w$)|(^[a-z_]$)/,ForceSimpleAmpersand:/___FCKAmp___/g,SpaceNoClose:/\/>/g,EmptyParagraph:/^<(p|div|address|h\d|center)(?=[ >])[^>]*>\s*(<\/\1>)?$/,EmptyOutParagraph:/^<(p|div|address|h\d|center)(?=[ >])[^>]*>(?:\s*| )(<\/\1>)?$/,TagBody:/></,GeckoEntitiesMarker:/#\?-\:/g,ProtectUrlsImg:/<img(?=\s).*?\ssrc=((?:(?:\s*)("|').*?\2)|(?:[^"'][^ >]+))/gi,ProtectUrlsA:/<a(?=\s).*?\shref=((?:(?:\s*)("|').*?\2)|(?:[^"'][^ >]+))/gi,ProtectUrlsArea:/<area(?=\s).*?\shref=((?:(?:\s*)("|').*?\2)|(?:[^"'][^ >]+))/gi,Html4DocType:/HTML 4\.0 Transitional/i,DocTypeTag:/<!DOCTYPE[^>]*>/i,HtmlDocType:/DTD HTML/,TagsWithEvent:/<[^\>]+ on\w+[\s\r\n]*=[\s\r\n]*?('|")[\s\S]+?\>/g,EventAttributes:/\s(on\w+)[\s\r\n]*=[\s\r\n]*?('|")([\s\S]*?)\2/g,ProtectedEvents:/\s\w+_fckprotectedatt="([^"]+)"/g,StyleProperties:/\S+\s*:/g,InvalidSelfCloseTags:/(<(?!base|meta|link|hr|br|param|img|area|input)([a-zA-Z0-9:]+)[^>]*)\/>/gi,StyleVariableAttName:/#\(\s*("|')(.+?)\1[^\)]*\s*\)/g,RegExp:/^\/(.*)\/([gim]*)$/,HtmlTag:/<[^\s<>](?:"[^"]*"|'[^']*'|[^<])*>/};
var FCKListsLib={BlockElements:{ address:1,blockquote:1,center:1,div:1,dl:1,fieldset:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,marquee:1,noscript:1,ol:1,p:1,pre:1,script:1,table:1,ul:1 },NonEmptyBlockElements:{ p:1,div:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,address:1,pre:1,ol:1,ul:1,li:1,td:1,th:1 },InlineChildReqElements:{ abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1 },InlineNonEmptyElements:{ a:1,abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1 },EmptyElements:{ base:1,col:1,meta:1,link:1,hr:1,br:1,param:1,img:1,area:1,input:1 },PathBlockElements:{ address:1,blockquote:1,dl:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,li:1,dt:1,de:1 },PathBlockLimitElements:{ body:1,div:1,td:1,th:1,caption:1,form:1 },StyleBlockElements:{ address:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1 },StyleObjectElements:{ img:1,hr:1,li:1,table:1,tr:1,td:1,embed:1,object:1,ol:1,ul:1 },NonEditableElements:{ button:1,option:1,script:1,iframe:1,textarea:1,object:1,embed:1,map:1,applet:1 },BlockBoundaries:{ p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,address:1,pre:1,ol:1,ul:1,li:1,dt:1,de:1,table:1,thead:1,tbody:1,tfoot:1,tr:1,th:1,td:1,caption:1,col:1,colgroup:1,blockquote:1,body:1 },ListBoundaries:{ p:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,address:1,pre:1,ol:1,ul:1,li:1,dt:1,de:1,table:1,thead:1,tbody:1,tfoot:1,tr:1,th:1,td:1,caption:1,col:1,colgroup:1,blockquote:1,body:1,br:1 }};
var FCKLanguageManager=FCK.Language={AvailableLanguages:{af:'Afrikaans',ar:'Arabic',bg:'Bulgarian',bn:'Bengali/Bangla',bs:'Bosnian',ca:'Catalan',cs:'Czech',da:'Danish',de:'German',el:'Greek',en:'English','en-au':'English (Australia)','en-ca':'English (Canadian)','en-uk':'English (United Kingdom)',eo:'Esperanto',es:'Spanish',et:'Estonian',eu:'Basque',fa:'Persian',fi:'Finnish',fo:'Faroese',fr:'French','fr-ca':'French (Canada)',gl:'Galician',gu:'Gujarati',he:'Hebrew',hi:'Hindi',hr:'Croatian',hu:'Hungarian',it:'Italian',ja:'Japanese',km:'Khmer',ko:'Korean',lt:'Lithuanian',lv:'Latvian',mn:'Mongolian',ms:'Malay',nb:'Norwegian Bokmal',nl:'Dutch',no:'Norwegian',pl:'Polish',pt:'Portuguese (Portugal)','pt-br':'Portuguese (Brazil)',ro:'Romanian',ru:'Russian',sk:'Slovak',sl:'Slovenian',sr:'Serbian (Cyrillic)','sr-latn':'Serbian (Latin)',sv:'Swedish',th:'Thai',tr:'Turkish',uk:'Ukrainian',vi:'Vietnamese',zh:'Chinese Traditional','zh-cn':'Chinese Simplified'},GetActiveLanguage:function(){if (FCKConfig.AutoDetectLanguage){var A;if (navigator.userLanguage) A=navigator.userLanguage.toLowerCase();else if (navigator.language) A=navigator.language.toLowerCase();else{return FCKConfig.DefaultLanguage;};if (A.length>=5){A=A.substr(0,5);if (this.AvailableLanguages[A]) return A;};if (A.length>=2){A=A.substr(0,2);if (this.AvailableLanguages[A]) return A;}};return this.DefaultLanguage;},TranslateElements:function(A,B,C,D){var e=A.getElementsByTagName(B);var E,s;for (var i=0;i<e.length;i++){if ((E=e[i].getAttribute('fckLang'))){if ((s=FCKLang[E])){if (D) s=FCKTools.HTMLEncode(s);e[i][C]=s;}}}},TranslatePage:function(A){this.TranslateElements(A,'INPUT','value');this.TranslateElements(A,'SPAN','innerHTML');this.TranslateElements(A,'LABEL','innerHTML');this.TranslateElements(A,'OPTION','innerHTML',true);this.TranslateElements(A,'LEGEND','innerHTML');},Initialize:function(){if (this.AvailableLanguages[FCKConfig.DefaultLanguage]) this.DefaultLanguage=FCKConfig.DefaultLanguage;else this.DefaultLanguage='en';this.ActiveLanguage={};this.ActiveLanguage.Code=this.GetActiveLanguage();this.ActiveLanguage.Name=this.AvailableLanguages[this.ActiveLanguage.Code];}};
var FCKXHtmlEntities={};FCKXHtmlEntities.Initialize=function(){if (FCKXHtmlEntities.Entities) return;var A='';var B,e;if (FCKConfig.ProcessHTMLEntities){FCKXHtmlEntities.Entities={' ':'nbsp','¡':'iexcl','¢':'cent','£':'pound','¤':'curren','¥':'yen','¦':'brvbar','§':'sect','¨':'uml','©':'copy','ª':'ordf','«':'laquo','¬':'not','':'shy','®':'reg','¯':'macr','°':'deg','±':'plusmn','²':'sup2','³':'sup3','´':'acute','µ':'micro','¶':'para','·':'middot','¸':'cedil','¹':'sup1','º':'ordm','»':'raquo','¼':'frac14','½':'frac12','¾':'frac34','¿':'iquest','×':'times','÷':'divide','ƒ':'fnof','•':'bull','…':'hellip','′':'prime','″':'Prime','‾':'oline','⁄':'frasl','℘':'weierp','ℑ':'image','ℜ':'real','™':'trade','ℵ':'alefsym','←':'larr','↑':'uarr','→':'rarr','↓':'darr','↔':'harr','↵':'crarr','⇐':'lArr','⇑':'uArr','⇒':'rArr','⇓':'dArr','⇔':'hArr','∀':'forall','∂':'part','∃':'exist','∅':'empty','∇':'nabla','∈':'isin','∉':'notin','∋':'ni','∏':'prod','∑':'sum','−':'minus','∗':'lowast','√':'radic','∝':'prop','∞':'infin','∠':'ang','∧':'and','∨':'or','∩':'cap','∪':'cup','∫':'int','∴':'there4','∼':'sim','≅':'cong','≈':'asymp','≠':'ne','≡':'equiv','≤':'le','≥':'ge','⊂':'sub','⊃':'sup','⊄':'nsub','⊆':'sube','⊇':'supe','⊕':'oplus','⊗':'otimes','⊥':'perp','⋅':'sdot','\u2308':'lceil','\u2309':'rceil','\u230a':'lfloor','\u230b':'rfloor','\u2329':'lang','\u232a':'rang','◊':'loz','♠':'spades','♣':'clubs','♥':'hearts','♦':'diams','"':'quot','ˆ':'circ','˜':'tilde',' ':'ensp',' ':'emsp',' ':'thinsp','':'zwnj','':'zwj','':'lrm','':'rlm','–':'ndash','—':'mdash','‘':'lsquo','’':'rsquo','‚':'sbquo','“':'ldquo','”':'rdquo','„':'bdquo','†':'dagger','‡':'Dagger','‰':'permil','‹':'lsaquo','›':'rsaquo','€':'euro'};for (e in FCKXHtmlEntities.Entities) A+=e;if (FCKConfig.IncludeLatinEntities){B={'À':'Agrave','Á':'Aacute','Â':'Acirc','Ã':'Atilde','Ä':'Auml','Å':'Aring','Æ':'AElig','Ç':'Ccedil','È':'Egrave','É':'Eacute','Ê':'Ecirc','Ë':'Euml','Ì':'Igrave','Í':'Iacute','Î':'Icirc','Ï':'Iuml','Ð':'ETH','Ñ':'Ntilde','Ò':'Ograve','Ó':'Oacute','Ô':'Ocirc','Õ':'Otilde','Ö':'Ouml','Ø':'Oslash','Ù':'Ugrave','Ú':'Uacute','Û':'Ucirc','Ü':'Uuml','Ý':'Yacute','Þ':'THORN','ß':'szlig','à':'agrave','á':'aacute','â':'acirc','ã':'atilde','ä':'auml','å':'aring','æ':'aelig','ç':'ccedil','è':'egrave','é':'eacute','ê':'ecirc','ë':'euml','ì':'igrave','í':'iacute','î':'icirc','ï':'iuml','ð':'eth','ñ':'ntilde','ò':'ograve','ó':'oacute','ô':'ocirc','õ':'otilde','ö':'ouml','ø':'oslash','ù':'ugrave','ú':'uacute','û':'ucirc','ü':'uuml','ý':'yacute','þ':'thorn','ÿ':'yuml','Œ':'OElig','œ':'oelig','Š':'Scaron','š':'scaron','Ÿ':'Yuml'};for (e in B){FCKXHtmlEntities.Entities[e]=B[e];A+=e;};B=null;};if (FCKConfig.IncludeGreekEntities){B={'Α':'Alpha','Β':'Beta','Γ':'Gamma','Δ':'Delta','Ε':'Epsilon','Ζ':'Zeta','Η':'Eta','Θ':'Theta','Ι':'Iota','Κ':'Kappa','Λ':'Lambda','Μ':'Mu','Ν':'Nu','Ξ':'Xi','Ο':'Omicron','Π':'Pi','Ρ':'Rho','Σ':'Sigma','Τ':'Tau','Υ':'Upsilon','Φ':'Phi','Χ':'Chi','Ψ':'Psi','Ω':'Omega','α':'alpha','β':'beta','γ':'gamma','δ':'delta','ε':'epsilon','ζ':'zeta','η':'eta','θ':'theta','ι':'iota','κ':'kappa','λ':'lambda','μ':'mu','ν':'nu','ξ':'xi','ο':'omicron','π':'pi','ρ':'rho','ς':'sigmaf','σ':'sigma','τ':'tau','υ':'upsilon','φ':'phi','χ':'chi','ψ':'psi','ω':'omega','\u03d1':'thetasym','\u03d2':'upsih','\u03d6':'piv'};for (e in B){FCKXHtmlEntities.Entities[e]=B[e];A+=e;};B=null;}}else{FCKXHtmlEntities.Entities={};A=' ';};var C='['+A+']';if (FCKConfig.ProcessNumericEntities) C='[^ -~]|'+C;var D=FCKConfig.AdditionalNumericEntities;if (D&&D.length>0) C+='|'+FCKConfig.AdditionalNumericEntities;FCKXHtmlEntities.EntitiesRegex=new RegExp(C,'g');};
-var FCKXHtml={};FCKXHtml.CurrentJobNum=0;FCKXHtml.GetXHTML=function(A,B,C){FCKDomTools.CheckAndRemovePaddingNode(FCKTools.GetElementDocument(A),FCKConfig.EnterMode);FCKXHtmlEntities.Initialize();this._NbspEntity=(FCKConfig.ProcessHTMLEntities?'nbsp':'#160');var D=FCK.IsDirty();FCKXHtml.SpecialBlocks=[];this.XML=FCKTools.CreateXmlObject('DOMDocument');this.MainNode=this.XML.appendChild(this.XML.createElement('xhtml'));FCKXHtml.CurrentJobNum++;if (B) this._AppendNode(this.MainNode,A);else this._AppendChildNodes(this.MainNode,A,false);var E=this._GetMainXmlString();this.XML=null;if (FCKBrowserInfo.IsSafari) E=E.replace(/^<xhtml.*?>/,'<xhtml>');E=E.substr(7,E.length-15).Trim();if (FCKConfig.DocType.length>0&&FCKRegexLib.HtmlDocType.test(FCKConfig.DocType)) E=E.replace(FCKRegexLib.SpaceNoClose,'>');else E=E.replace(FCKRegexLib.SpaceNoClose,' />');if (FCKConfig.ForceSimpleAmpersand) E=E.replace(FCKRegexLib.ForceSimpleAmpersand,'&');if (C) E=FCKCodeFormatter.Format(E);for (var i=0;i<FCKXHtml.SpecialBlocks.length;i++){var F=new RegExp('___FCKsi___'+i);E=E.replace(F,FCKXHtml.SpecialBlocks[i]);};E=E.replace(FCKRegexLib.GeckoEntitiesMarker,'&');if (!D) FCK.ResetIsDirty();FCKDomTools.EnforcePaddingNode(FCKTools.GetElementDocument(A),FCKConfig.EnterMode);return E;};FCKXHtml._AppendAttribute=function(A,B,C){try{if (C==undefined||C==null) C='';else if (C.replace){if (FCKConfig.ForceSimpleAmpersand) C=C.replace(/&/g,'___FCKAmp___');C=C.replace(FCKXHtmlEntities.EntitiesRegex,FCKXHtml_GetEntity);};var D=this.XML.createAttribute(B);D.value=C;A.attributes.setNamedItem(D);}catch (e){}};FCKXHtml._AppendChildNodes=function(A,B,C){var D=B.firstChild;while (D){this._AppendNode(A,D);D=D.nextSibling;};if (C&&B.tagName&&B.tagName.toLowerCase()!='pre'){FCKDomTools.TrimNode(A);if (FCKConfig.FillEmptyBlocks){var E=A.lastChild;if (E&&E.nodeType==1&&E.nodeName=='br') this._AppendEntity(A,this._NbspEntity);}};if (A.childNodes.length==0){if (C&&FCKConfig.FillEmptyBlocks){this._AppendEntity(A,this._NbspEntity);return A;};var F=A.nodeName;if (FCKListsLib.InlineChildReqElements[F]) return null;if (!FCKListsLib.EmptyElements[F]) A.appendChild(this.XML.createTextNode(''));};return A;};FCKXHtml._AppendNode=function(A,B){if (!B) return false;switch (B.nodeType){case 1:if (FCKBrowserInfo.IsGecko&&B.tagName.toLowerCase()=='br'&&B.parentNode.tagName.toLowerCase()=='pre'){var C='\r';if (B==B.parentNode.firstChild) C+='\r';return FCKXHtml._AppendNode(A,this.XML.createTextNode(C));};if (B.getAttribute('_fckfakelement')) return FCKXHtml._AppendNode(A,FCK.GetRealElement(B));if (FCKBrowserInfo.IsGecko&&B.nextSibling&&(B.hasAttribute('_moz_editor_bogus_node')||B.getAttribute('type')=='_moz')) return false;if (B.getAttribute('_fcktemp')) return false;var D=B.tagName.toLowerCase();if (FCKBrowserInfo.IsIE){if (B.scopeName&&B.scopeName!='HTML'&&B.scopeName!='FCK') D=B.scopeName.toLowerCase()+':'+D;}else{if (D.StartsWith('fck:')) D=D.Remove(0,4);};if (!FCKRegexLib.ElementName.test(D)) return false;if (B._fckxhtmljob&&B._fckxhtmljob==FCKXHtml.CurrentJobNum) return false;var E=this.XML.createElement(D);FCKXHtml._AppendAttributes(A,B,E,D);B._fckxhtmljob=FCKXHtml.CurrentJobNum;var F=FCKXHtml.TagProcessors[D];if (F) E=F(E,B,A);else E=this._AppendChildNodes(E,B,Boolean(FCKListsLib.NonEmptyBlockElements[D]));if (!E) return false;A.appendChild(E);break;case 3:if (B.parentNode&&B.parentNode.nodeName.IEquals('pre')) return this._AppendTextNode(A,B.nodeValue);return this._AppendTextNode(A,B.nodeValue.ReplaceNewLineChars(' '));case 8:if (FCKBrowserInfo.IsIE&&!B.innerHTML) break;try { A.appendChild(this.XML.createComment(B.nodeValue));}catch (e) {/*Do nothing... probably this is a wrong format comment.*/};break;default:A.appendChild(this.XML.createComment("Element not supported - Type: "+B.nodeType+" Name: "+B.nodeName));break;};return true;};FCKXHtml._AppendSpecialItem=function(A){return '___FCKsi___'+FCKXHtml.SpecialBlocks.AddItem(A);};FCKXHtml._AppendEntity=function(A,B){A.appendChild(this.XML.createTextNode('#?-:'+B+';'));};FCKXHtml._AppendTextNode=function(A,B){var C=B.length>0;if (C) A.appendChild(this.XML.createTextNode(B.replace(FCKXHtmlEntities.EntitiesRegex,FCKXHtml_GetEntity)));return C;};function FCKXHtml_GetEntity(A){var B=FCKXHtmlEntities.Entities[A]||('#'+A.charCodeAt(0));return '#?-:'+B+';';};FCKXHtml.TagProcessors={a:function(A,B){if (B.innerHTML.Trim().length==0&&!B.name) return false;var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'href',C);if (FCKBrowserInfo.IsIE){if (B.name) FCKXHtml._AppendAttribute(A,'name',B.name);};A=FCKXHtml._AppendChildNodes(A,B,false);return A;},area:function(A,B){var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'href',C);if (FCKBrowserInfo.IsIE){if (!A.attributes.getNamedItem('coords')){var D=B.getAttribute('coords',2);if (D&&D!='0,0,0') FCKXHtml._AppendAttribute(A,'coords',D);};if (!A.attributes.getNamedItem('shape')){var E=B.getAttribute('shape',2);if (E&&E.length>0) FCKXHtml._AppendAttribute(A,'shape',E.toLowerCase());}};return A;},body:function(A,B){A=FCKXHtml._AppendChildNodes(A,B,false);A.removeAttribute('spellcheck');return A;},iframe:function(A,B){var C=B.innerHTML;if (FCKBrowserInfo.IsGecko) C=FCKTools.HTMLDecode(C);C=C.replace(/\s_fcksavedurl="[^"]*"/g,'');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(C)));return A;},img:function(A,B){if (!A.attributes.getNamedItem('alt')) FCKXHtml._AppendAttribute(A,'alt','');var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'src',C);if (B.style.width) A.removeAttribute('width');if (B.style.height) A.removeAttribute('height');return A;},li:function(A,B,C){if (C.nodeName.IEquals(['ul','ol'])) return FCKXHtml._AppendChildNodes(A,B,true);var D=FCKXHtml.XML.createElement('ul');B._fckxhtmljob=null;do{FCKXHtml._AppendNode(D,B);do{B=FCKDomTools.GetNextSibling(B);} while (B&&B.nodeType==3&&B.nodeValue.Trim().length==0)} while (B&&B.nodeName.toLowerCase()=='li') return D;},ol:function(A,B,C){if (B.innerHTML.Trim().length==0) return false;var D=C.lastChild;if (D&&D.nodeType==3) D=D.previousSibling;if (D&&D.nodeName.toUpperCase()=='LI'){B._fckxhtmljob=null;FCKXHtml._AppendNode(D,B);return false;};A=FCKXHtml._AppendChildNodes(A,B);return A;},pre:function (A,B){var C=B.firstChild;if (C&&C.nodeType==3) A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem('\r\n')));FCKXHtml._AppendChildNodes(A,B,true);return A;},script:function(A,B){if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A,'type','text/javascript');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(B.text)));return A;},span:function(A,B){if (B.innerHTML.length==0) return false;A=FCKXHtml._AppendChildNodes(A,B,false);return A;},style:function(A,B){if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A,'type','text/css');var C=B.innerHTML;if (FCKBrowserInfo.IsIE) C=C.replace(/^(\r\n|\n|\r)/,'');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(C)));return A;},title:function(A,B){A.appendChild(FCKXHtml.XML.createTextNode(FCK.EditorDocument.title));return A;}};FCKXHtml.TagProcessors.ul=FCKXHtml.TagProcessors.ol;
-FCKXHtml._GetMainXmlString=function(){return this.MainNode.xml;};FCKXHtml._AppendAttributes=function(A,B,C,D){var E=B.attributes;for (var n=0;n<E.length;n++){var F=E[n];if (F.specified){var G=F.nodeName.toLowerCase();var H;if (G.StartsWith('_fck')) continue;else if (G=='style'){var I=FCKTools.ProtectFormStyles(B);H=B.style.cssText.replace(FCKRegexLib.StyleProperties,FCKTools.ToLowerCase);FCKTools.RestoreFormStyles(B,I);}else if (G=='class'){H=F.nodeValue.replace(FCKRegexLib.FCK_Class,'');if (H.length==0) continue;}else if (G.indexOf('on')==0) H=F.nodeValue;else if (D=='body'&&G=='contenteditable') continue;else if (F.nodeValue===true) H=G;else{try{H=B.getAttribute(G,2);}catch (e) {}};this._AppendAttribute(C,G,H||F.nodeValue);}}};FCKXHtml.TagProcessors['div']=function(A,B){if (B.align.length>0) FCKXHtml._AppendAttribute(A,'align',B.align);A=FCKXHtml._AppendChildNodes(A,B,true);return A;};FCKXHtml.TagProcessors['font']=function(A,B){if (A.attributes.length==0) A=FCKXHtml.XML.createDocumentFragment();A=FCKXHtml._AppendChildNodes(A,B);return A;};FCKXHtml.TagProcessors['form']=function(A,B){if (B.acceptCharset&&B.acceptCharset.length>0&&B.acceptCharset!='UNKNOWN') FCKXHtml._AppendAttribute(A,'accept-charset',B.acceptCharset);var C=B.attributes['name'];if (C&&C.value.length>0) FCKXHtml._AppendAttribute(A,'name',C.value);A=FCKXHtml._AppendChildNodes(A,B,true);return A;};FCKXHtml.TagProcessors['input']=function(A,B){if (B.name) FCKXHtml._AppendAttribute(A,'name',B.name);if (B.value&&!A.attributes.getNamedItem('value')) FCKXHtml._AppendAttribute(A,'value',B.value);if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A,'type','text');return A;};FCKXHtml.TagProcessors['label']=function(A,B){if (B.htmlFor.length>0) FCKXHtml._AppendAttribute(A,'for',B.htmlFor);A=FCKXHtml._AppendChildNodes(A,B);return A;};FCKXHtml.TagProcessors['map']=function(A,B){if (!A.attributes.getNamedItem('name')){var C=B.name;if (C) FCKXHtml._AppendAttribute(A,'name',C);};A=FCKXHtml._AppendChildNodes(A,B,true);return A;};FCKXHtml.TagProcessors['meta']=function(A,B){var C=A.attributes.getNamedItem('http-equiv');if (C==null||C.value.length==0){var D=B.outerHTML.match(FCKRegexLib.MetaHttpEquiv);if (D){D=D[1];FCKXHtml._AppendAttribute(A,'http-equiv',D);}};return A;};FCKXHtml.TagProcessors['option']=function(A,B){if (B.selected&&!A.attributes.getNamedItem('selected')) FCKXHtml._AppendAttribute(A,'selected','selected');A=FCKXHtml._AppendChildNodes(A,B);return A;};FCKXHtml.TagProcessors['textarea']=FCKXHtml.TagProcessors['select']=function(A,B){if (B.name) FCKXHtml._AppendAttribute(A,'name',B.name);A=FCKXHtml._AppendChildNodes(A,B);return A;};
+var FCKXHtml={};FCKXHtml.CurrentJobNum=0;FCKXHtml.GetXHTML=function(A,B,C){FCKDomTools.CheckAndRemovePaddingNode(FCKTools.GetElementDocument(A),FCKConfig.EnterMode);FCKXHtmlEntities.Initialize();this._NbspEntity=(FCKConfig.ProcessHTMLEntities?'nbsp':'#160');var D=FCK.IsDirty();FCKXHtml.SpecialBlocks=[];this.XML=FCKTools.CreateXmlObject('DOMDocument');this.MainNode=this.XML.appendChild(this.XML.createElement('xhtml'));FCKXHtml.CurrentJobNum++;if (B) this._AppendNode(this.MainNode,A);else this._AppendChildNodes(this.MainNode,A,false);var E=this._GetMainXmlString();this.XML=null;if (FCKBrowserInfo.IsSafari) E=E.replace(/^<xhtml.*?>/,'<xhtml>');E=E.substr(7,E.length-15).Trim();if (FCKConfig.DocType.length>0&&FCKRegexLib.HtmlDocType.test(FCKConfig.DocType)) E=E.replace(FCKRegexLib.SpaceNoClose,'>');else E=E.replace(FCKRegexLib.SpaceNoClose,' />');if (FCKConfig.ForceSimpleAmpersand) E=E.replace(FCKRegexLib.ForceSimpleAmpersand,'&');if (C) E=FCKCodeFormatter.Format(E);for (var i=0;i<FCKXHtml.SpecialBlocks.length;i++){var F=new RegExp('___FCKsi___'+i);E=E.replace(F,FCKXHtml.SpecialBlocks[i]);};E=E.replace(FCKRegexLib.GeckoEntitiesMarker,'&');if (!D) FCK.ResetIsDirty();FCKDomTools.EnforcePaddingNode(FCKTools.GetElementDocument(A),FCKConfig.EnterMode);return E;};FCKXHtml._AppendAttribute=function(A,B,C){try{if (C==undefined||C==null) C='';else if (C.replace){if (FCKConfig.ForceSimpleAmpersand) C=C.replace(/&/g,'___FCKAmp___');C=C.replace(FCKXHtmlEntities.EntitiesRegex,FCKXHtml_GetEntity);};var D=this.XML.createAttribute(B);D.value=C;A.attributes.setNamedItem(D);}catch (e){}};FCKXHtml._AppendChildNodes=function(A,B,C){var D=B.firstChild;while (D){this._AppendNode(A,D);D=D.nextSibling;};if (C&&B.tagName&&B.tagName.toLowerCase()!='pre'){FCKDomTools.TrimNode(A);if (FCKConfig.FillEmptyBlocks){var E=A.lastChild;if (E&&E.nodeType==1&&E.nodeName=='br') this._AppendEntity(A,this._NbspEntity);}};if (A.childNodes.length==0){if (C&&FCKConfig.FillEmptyBlocks){this._AppendEntity(A,this._NbspEntity);return A;};var F=A.nodeName;if (FCKListsLib.InlineChildReqElements[F]) return null;if (!FCKListsLib.EmptyElements[F]) A.appendChild(this.XML.createTextNode(''));};return A;};FCKXHtml._AppendNode=function(A,B){if (!B) return false;switch (B.nodeType){case 1:if (FCKBrowserInfo.IsGecko&&B.tagName.toLowerCase()=='br'&&B.parentNode.tagName.toLowerCase()=='pre'){var C='\r';if (B==B.parentNode.firstChild) C+='\r';return FCKXHtml._AppendNode(A,this.XML.createTextNode(C));};if (B.getAttribute('_fckfakelement')) return FCKXHtml._AppendNode(A,FCK.GetRealElement(B));if (FCKBrowserInfo.IsGecko&&(B.hasAttribute('_moz_editor_bogus_node')||B.getAttribute('type')=='_moz')){if (B.nextSibling) return false;else{B.removeAttribute('_moz_editor_bogus_node');B.removeAttribute('type');}};if (B.getAttribute('_fcktemp')) return false;var D=B.tagName.toLowerCase();if (FCKBrowserInfo.IsIE){if (B.scopeName&&B.scopeName!='HTML'&&B.scopeName!='FCK') D=B.scopeName.toLowerCase()+':'+D;}else{if (D.StartsWith('fck:')) D=D.Remove(0,4);};if (!FCKRegexLib.ElementName.test(D)) return false;if (B._fckxhtmljob&&B._fckxhtmljob==FCKXHtml.CurrentJobNum) return false;var E=this.XML.createElement(D);FCKXHtml._AppendAttributes(A,B,E,D);B._fckxhtmljob=FCKXHtml.CurrentJobNum;var F=FCKXHtml.TagProcessors[D];if (F) E=F(E,B,A);else E=this._AppendChildNodes(E,B,Boolean(FCKListsLib.NonEmptyBlockElements[D]));if (!E) return false;A.appendChild(E);break;case 3:if (B.parentNode&&B.parentNode.nodeName.IEquals('pre')) return this._AppendTextNode(A,B.nodeValue);return this._AppendTextNode(A,B.nodeValue.ReplaceNewLineChars(' '));case 8:if (FCKBrowserInfo.IsIE&&!B.innerHTML) break;try { A.appendChild(this.XML.createComment(B.nodeValue));}catch (e) {};break;default:A.appendChild(this.XML.createComment("Element not supported - Type: "+B.nodeType+" Name: "+B.nodeName));break;};return true;};FCKXHtml._AppendSpecialItem=function(A){return '___FCKsi___'+FCKXHtml.SpecialBlocks.AddItem(A);};FCKXHtml._AppendEntity=function(A,B){A.appendChild(this.XML.createTextNode('#?-:'+B+';'));};FCKXHtml._AppendTextNode=function(A,B){var C=B.length>0;if (C) A.appendChild(this.XML.createTextNode(B.replace(FCKXHtmlEntities.EntitiesRegex,FCKXHtml_GetEntity)));return C;};function FCKXHtml_GetEntity(A){var B=FCKXHtmlEntities.Entities[A]||('#'+A.charCodeAt(0));return '#?-:'+B+';';};FCKXHtml.TagProcessors={a:function(A,B){if (B.innerHTML.Trim().length==0&&!B.name) return false;var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'href',C);if (FCKBrowserInfo.IsIE){if (B.name) FCKXHtml._AppendAttribute(A,'name',B.name);};A=FCKXHtml._AppendChildNodes(A,B,false);return A;},area:function(A,B){var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'href',C);if (FCKBrowserInfo.IsIE){if (!A.attributes.getNamedItem('coords')){var D=B.getAttribute('coords',2);if (D&&D!='0,0,0') FCKXHtml._AppendAttribute(A,'coords',D);};if (!A.attributes.getNamedItem('shape')){var E=B.getAttribute('shape',2);if (E&&E.length>0) FCKXHtml._AppendAttribute(A,'shape',E.toLowerCase());}};return A;},body:function(A,B){A=FCKXHtml._AppendChildNodes(A,B,false);A.removeAttribute('spellcheck');return A;},iframe:function(A,B){var C=B.innerHTML;if (FCKBrowserInfo.IsGecko) C=FCKTools.HTMLDecode(C);C=C.replace(/\s_fcksavedurl="[^"]*"/g,'');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(C)));return A;},img:function(A,B){if (!A.attributes.getNamedItem('alt')) FCKXHtml._AppendAttribute(A,'alt','');var C=B.getAttribute('_fcksavedurl');if (C!=null) FCKXHtml._AppendAttribute(A,'src',C);if (B.style.width) A.removeAttribute('width');if (B.style.height) A.removeAttribute('height');return A;},li:function(A,B,C){if (C.nodeName.IEquals(['ul','ol'])) return FCKXHtml._AppendChildNodes(A,B,true);var D=FCKXHtml.XML.createElement('ul');B._fckxhtmljob=null;do{FCKXHtml._AppendNode(D,B);do{B=FCKDomTools.GetNextSibling(B);} while (B&&B.nodeType==3&&B.nodeValue.Trim().length==0)} while (B&&B.nodeName.toLowerCase()=='li') return D;},ol:function(A,B,C){if (B.innerHTML.Trim().length==0) return false;var D=C.lastChild;if (D&&D.nodeType==3) D=D.previousSibling;if (D&&D.nodeName.toUpperCase()=='LI'){B._fckxhtmljob=null;FCKXHtml._AppendNode(D,B);return false;};A=FCKXHtml._AppendChildNodes(A,B);return A;},pre:function (A,B){var C=B.firstChild;if (C&&C.nodeType==3) A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem('\r\n')));FCKXHtml._AppendChildNodes(A,B,true);return A;},script:function(A,B){if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A,'type','text/javascript');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(B.text)));return A;},span:function(A,B){if (B.innerHTML.length==0) return false;A=FCKXHtml._AppendChildNodes(A,B,false);return A;},style:function(A,B){if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A,'type','text/css');var C=B.innerHTML;if (FCKBrowserInfo.IsIE) C=C.replace(/^(\r\n|\n|\r)/,'');A.appendChild(FCKXHtml.XML.createTextNode(FCKXHtml._AppendSpecialItem(C)));return A;},title:function(A,B){A.appendChild(FCKXHtml.XML.createTextNode(FCK.EditorDocument.title));return A;}};FCKXHtml.TagProcessors.ul=FCKXHtml.TagProcessors.ol;
+FCKXHtml._GetMainXmlString=function(){return this.MainNode.xml;};FCKXHtml._AppendAttributes=function(A,B,C,D){var E=B.attributes,bHasStyle;for (var n=0;n<E.length;n++){var F=E[n];if (F.specified){var G=F.nodeName.toLowerCase();var H;if (G.StartsWith('_fck')) continue;else if (G=='style'){bHasStyle=true;continue;}else if (G=='class'){H=F.nodeValue.replace(FCKRegexLib.FCK_Class,'');if (H.length==0) continue;}else if (G.indexOf('on')==0) H=F.nodeValue;else if (D=='body'&&G=='contenteditable') continue;else if (F.nodeValue===true) H=G;else{try{H=B.getAttribute(G,2);}catch (e) {}};this._AppendAttribute(C,G,H||F.nodeValue);}};if (bHasStyle||B.style.cssText.length>0){var I=FCKTools.ProtectFormStyles(B);var J=B.style.cssText.replace(FCKRegexLib.StyleProperties,FCKTools.ToLowerCase);FCKTools.RestoreFormStyles(B,I);this._AppendAttribute(C,'style',J);}};FCKXHtml.TagProcessors['div']=function(A,B){if (B.align.length>0) FCKXHtml._AppendAttribute(A,'align',B.align);A=FCKXHtml._AppendChildNodes(A,B,true);return A;};FCKXHtml.TagProcessors['font']=function(A,B){if (A.attributes.length==0) A=FCKXHtml.XML.createDocumentFragment();A=FCKXHtml._AppendChildNodes(A,B);return A;};FCKXHtml.TagProcessors['form']=function(A,B){if (B.acceptCharset&&B.acceptCharset.length>0&&B.acceptCharset!='UNKNOWN') FCKXHtml._AppendAttribute(A,'accept-charset',B.acceptCharset);var C=B.attributes['name'];if (C&&C.value.length>0) FCKXHtml._AppendAttribute(A,'name',C.value);A=FCKXHtml._AppendChildNodes(A,B,true);return A;};FCKXHtml.TagProcessors['input']=function(A,B){if (B.name) FCKXHtml._AppendAttribute(A,'name',B.name);if (B.value&&!A.attributes.getNamedItem('value')) FCKXHtml._AppendAttribute(A,'value',B.value);if (!A.attributes.getNamedItem('type')) FCKXHtml._AppendAttribute(A,'type','text');return A;};FCKXHtml.TagProcessors['label']=function(A,B){if (B.htmlFor.length>0) FCKXHtml._AppendAttribute(A,'for',B.htmlFor);A=FCKXHtml._AppendChildNodes(A,B);return A;};FCKXHtml.TagProcessors['map']=function(A,B){if (!A.attributes.getNamedItem('name')){var C=B.name;if (C) FCKXHtml._AppendAttribute(A,'name',C);};A=FCKXHtml._AppendChildNodes(A,B,true);return A;};FCKXHtml.TagProcessors['meta']=function(A,B){var C=A.attributes.getNamedItem('http-equiv');if (C==null||C.value.length==0){var D=B.outerHTML.match(FCKRegexLib.MetaHttpEquiv);if (D){D=D[1];FCKXHtml._AppendAttribute(A,'http-equiv',D);}};return A;};FCKXHtml.TagProcessors['option']=function(A,B){if (B.selected&&!A.attributes.getNamedItem('selected')) FCKXHtml._AppendAttribute(A,'selected','selected');A=FCKXHtml._AppendChildNodes(A,B);return A;};FCKXHtml.TagProcessors['textarea']=FCKXHtml.TagProcessors['select']=function(A,B){if (B.name) FCKXHtml._AppendAttribute(A,'name',B.name);A=FCKXHtml._AppendChildNodes(A,B);return A;};
var FCKCodeFormatter={};FCKCodeFormatter.Init=function(){var A=this.Regex={};A.BlocksOpener=/\<(P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|TITLE|META|LINK|BASE|SCRIPT|LINK|TD|TH|AREA|OPTION)[^\>]*\>/gi;A.BlocksCloser=/\<\/(P|DIV|H1|H2|H3|H4|H5|H6|ADDRESS|PRE|OL|UL|LI|TITLE|META|LINK|BASE|SCRIPT|LINK|TD|TH|AREA|OPTION)[^\>]*\>/gi;A.NewLineTags=/\<(BR|HR)[^\>]*\>/gi;A.MainTags=/\<\/?(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR)[^\>]*\>/gi;A.LineSplitter=/\s*\n+\s*/g;A.IncreaseIndent=/^\<(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR|UL|OL)[ \/\>]/i;A.DecreaseIndent=/^\<\/(HTML|HEAD|BODY|FORM|TABLE|TBODY|THEAD|TR|UL|OL)[ \>]/i;A.FormatIndentatorRemove=new RegExp('^'+FCKConfig.FormatIndentator);A.ProtectedTags=/(<PRE[^>]*>)([\s\S]*?)(<\/PRE>)/gi;};FCKCodeFormatter._ProtectData=function(A,B,C,D){return B+'___FCKpd___'+FCKCodeFormatter.ProtectedData.AddItem(C)+D;};FCKCodeFormatter.Format=function(A){if (!this.Regex) this.Init();FCKCodeFormatter.ProtectedData=[];var B=A.replace(this.Regex.ProtectedTags,FCKCodeFormatter._ProtectData);B=B.replace(this.Regex.BlocksOpener,'\n$&');B=B.replace(this.Regex.BlocksCloser,'$&\n');B=B.replace(this.Regex.NewLineTags,'$&\n');B=B.replace(this.Regex.MainTags,'\n$&\n');var C='';var D=B.split(this.Regex.LineSplitter);B='';for (var i=0;i<D.length;i++){var E=D[i];if (E.length==0) continue;if (this.Regex.DecreaseIndent.test(E)) C=C.replace(this.Regex.FormatIndentatorRemove,'');B+=C+E+'\n';if (this.Regex.IncreaseIndent.test(E)) C+=FCKConfig.FormatIndentator;};for (var j=0;j<FCKCodeFormatter.ProtectedData.length;j++){var F=new RegExp('___FCKpd___'+j);B=B.replace(F,FCKCodeFormatter.ProtectedData[j].replace(/\$/g,'$$$$'));};return B.Trim();};
var FCKUndo={};FCKUndo.SavedData=[];FCKUndo.CurrentIndex=-1;FCKUndo.TypesCount=0;FCKUndo.Changed=false;FCKUndo.MaxTypes=25;FCKUndo.Typing=false;FCKUndo.SaveLocked=false;FCKUndo._GetBookmark=function(){FCKSelection.Restore();var A=new FCKDomRange(FCK.EditorWindow);try{A.MoveToSelection();}catch (e){return null;};if (FCKBrowserInfo.IsIE){var B=A.CreateBookmark();var C=FCK.EditorDocument.body.innerHTML;A.MoveToBookmark(B);return [B,C];};return A.CreateBookmark2();};FCKUndo._SelectBookmark=function(A){if (!A) return;var B=new FCKDomRange(FCK.EditorWindow);if (A instanceof Object){if (FCKBrowserInfo.IsIE) B.MoveToBookmark(A[0]);else B.MoveToBookmark2(A);try{B.Select();}catch (e){B.MoveToPosition(FCK.EditorDocument.body,4);B.Select();}}};FCKUndo._CompareCursors=function(A,B){for (var i=0;i<Math.min(A.length,B.length);i++){if (A[i]<B[i]) return-1;else if (A[i]>B[i]) return 1;};if (A.length<B.length) return-1;else if (A.length>B.length) return 1;return 0;};FCKUndo._CheckIsBookmarksEqual=function(A,B){if (!(A&&B)) return false;if (FCKBrowserInfo.IsIE){var C=A[1].search(A[0].StartId);var D=B[1].search(B[0].StartId);var E=A[1].search(A[0].EndId);var F=B[1].search(B[0].EndId);return C==D&&E==F;}else{return this._CompareCursors(A.Start,B.Start)==0&&this._CompareCursors(A.End,B.End)==0;}};FCKUndo.SaveUndoStep=function(){if (FCK.EditMode!=0||this.SaveLocked) return;if (this.SavedData.length) this.Changed=true;var A=FCK.EditorDocument.body.innerHTML;var B=this._GetBookmark();this.SavedData=this.SavedData.slice(0,this.CurrentIndex+1);if (this.CurrentIndex>0&&A==this.SavedData[this.CurrentIndex][0]&&this._CheckIsBookmarksEqual(B,this.SavedData[this.CurrentIndex][1])) return;else if (this.CurrentIndex==0&&this.SavedData.length&&A==this.SavedData[0][0]){this.SavedData[0][1]=B;return;};if (this.CurrentIndex+1>=FCKConfig.MaxUndoLevels) this.SavedData.shift();else this.CurrentIndex++;this.SavedData[this.CurrentIndex]=[A,B];FCK.Events.FireEvent("OnSelectionChange");};FCKUndo.CheckUndoState=function(){return (this.Changed||this.CurrentIndex>0);};FCKUndo.CheckRedoState=function(){return (this.CurrentIndex<(this.SavedData.length-1));};FCKUndo.Undo=function(){if (this.CheckUndoState()){if (this.CurrentIndex==(this.SavedData.length-1)){this.SaveUndoStep();};this._ApplyUndoLevel(--this.CurrentIndex);FCK.Events.FireEvent("OnSelectionChange");}};FCKUndo.Redo=function(){if (this.CheckRedoState()){this._ApplyUndoLevel(++this.CurrentIndex);FCK.Events.FireEvent("OnSelectionChange");}};FCKUndo._ApplyUndoLevel=function(A){var B=this.SavedData[A];if (!B) return;if (FCKBrowserInfo.IsIE){if (B[1]&&B[1][1]) FCK.SetInnerHtml(B[1][1]);else FCK.SetInnerHtml(B[0]);}else FCK.EditorDocument.body.innerHTML=B[0];this._SelectBookmark(B[1]);this.TypesCount=0;this.Changed=false;this.Typing=false;};
-var FCKEditingArea=function(A){this.TargetElement=A;this.Mode=0;if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKEditingArea_Cleanup);};FCKEditingArea.prototype.Start=function(A,B){var C=this.TargetElement;var D=FCKTools.GetElementDocument(C);while(C.firstChild) C.removeChild(C.firstChild);if (this.Mode==0){if (FCK_IS_CUSTOM_DOMAIN) A='<script>document.domain="'+FCK_RUNTIME_DOMAIN+'";</script>'+A;if (FCKBrowserInfo.IsIE) A=A.replace(/(<base[^>]*?)\s*\/?>(?!\s*<\/base>)/gi,'$1></base>');else if (!B){var E=A.match(FCKRegexLib.BeforeBody);var F=A.match(FCKRegexLib.AfterBody);if (E&&F){var G=A.substr(E[1].length,A.length-E[1].length-F[1].length);A=E[1]+' '+F[1];if (FCKBrowserInfo.IsGecko&&(G.length==0||FCKRegexLib.EmptyParagraph.test(G))) G='<br type="_moz">';this._BodyHTML=G;}else this._BodyHTML=A;};var H=this.IFrame=D.createElement('iframe');var I='<script type="text/javascript" _fcktemp="true">window.onerror=function(){return true;};</script>';H.frameBorder=0;H.style.width=H.style.height='100%';if (FCK_IS_CUSTOM_DOMAIN&&FCKBrowserInfo.IsIE){window._FCKHtmlToLoad=A.replace(/<head>/i,'<head>'+I);H.src='javascript:void( (function(){document.open() ;document.domain="'+document.domain+'" ;document.write( window.parent._FCKHtmlToLoad );document.close() ;window.parent._FCKHtmlToLoad = null ;})() )';}else if (!FCKBrowserInfo.IsGecko){H.src='javascript:void(0)';};C.appendChild(H);this.Window=H.contentWindow;if (!FCK_IS_CUSTOM_DOMAIN||!FCKBrowserInfo.IsIE){var J=this.Window.document;J.open();J.write(A.replace(/<head>/i,'<head>'+I));J.close();};if (FCKBrowserInfo.IsAIR) FCKAdobeAIR.EditingArea_Start(J,A);if (FCKBrowserInfo.IsGecko10&&!B){this.Start(A,true);return;};if (H.readyState&&H.readyState!='completed'){var K=this;(H.onreadystatechange=function(){if (H.readyState=='complete'){H.onreadystatechange=null;K.Window._FCKEditingArea=K;FCKEditingArea_CompleteStart.call(K.Window);}})();}else{this.Window._FCKEditingArea=this;if (FCKBrowserInfo.IsGecko10) this.Window.setTimeout(FCKEditingArea_CompleteStart,500);else FCKEditingArea_CompleteStart.call(this.Window);}}else{var L=this.Textarea=D.createElement('textarea');L.className='SourceField';L.dir='ltr';FCKDomTools.SetElementStyles(L,{width:'100%',height:'100%',border:'none',resize:'none',outline:'none'});C.appendChild(L);L.value=A;FCKTools.RunFunction(this.OnLoad);}};function FCKEditingArea_CompleteStart(){if (!this.document.body){this.setTimeout(FCKEditingArea_CompleteStart,50);return;};var A=this._FCKEditingArea;A.Document=A.Window.document;A.MakeEditable();FCKTools.RunFunction(A.OnLoad);};FCKEditingArea.prototype.MakeEditable=function(){var A=this.Document;if (FCKBrowserInfo.IsIE){A.body.disabled=true;A.body.contentEditable=true;A.body.removeAttribute("disabled");}else{try{A.body.spellcheck=(this.FFSpellChecker!==false);if (this._BodyHTML){A.body.innerHTML=this._BodyHTML;A.body.offsetLeft;this._BodyHTML=null;};A.designMode='on';A.execCommand('enableObjectResizing',false,!FCKConfig.DisableObjectResizing);A.execCommand('enableInlineTableEditing',false,!FCKConfig.DisableFFTableHandles);}catch (e){FCKTools.AddEventListener(this.Window.frameElement,'DOMAttrModified',FCKEditingArea_Document_AttributeNodeModified);}}};function FCKEditingArea_Document_AttributeNodeModified(A){var B=A.currentTarget.contentWindow._FCKEditingArea;if (B._timer) window.clearTimeout(B._timer);B._timer=FCKTools.SetTimeout(FCKEditingArea_MakeEditableByMutation,1000,B);};function FCKEditingArea_MakeEditableByMutation(){delete this._timer;FCKTools.RemoveEventListener(this.Window.frameElement,'DOMAttrModified',FCKEditingArea_Document_AttributeNodeModified);this.MakeEditable();};FCKEditingArea.prototype.Focus=function(){try{if (this.Mode==0){if (FCKBrowserInfo.IsIE) this._FocusIE();else this.Window.focus();}else{var A=FCKTools.GetElementDocument(this.Textarea);if ((!A.hasFocus||A.hasFocus())&&A.activeElement==this.Textarea) return;this.Textarea.focus();}}catch(e) {}};FCKEditingArea.prototype._FocusIE=function(){this.Document.body.setActive();this.Window.focus();var A=this.Document.selection.createRange();var B=A.parentElement();var C=B.nodeName.toLowerCase();if (B.childNodes.length>0||!(FCKListsLib.BlockElements[C]||FCKListsLib.NonEmptyBlockElements[C])){return;};A=new FCKDomRange(this.Window);A.MoveToElementEditStart(B);A.Select();};function FCKEditingArea_Cleanup(){if (this.Document) this.Document.body.innerHTML="";this.TargetElement=null;this.IFrame=null;this.Document=null;this.Textarea=null;if (this.Window){this.Window._FCKEditingArea=null;this.Window=null;}};
+var FCKEditingArea=function(A){this.TargetElement=A;this.Mode=0;if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKEditingArea_Cleanup);};FCKEditingArea.prototype.Start=function(A,B){var C=this.TargetElement;var D=FCKTools.GetElementDocument(C);while(C.firstChild) C.removeChild(C.firstChild);if (this.Mode==0){if (FCK_IS_CUSTOM_DOMAIN) A='<script>document.domain="'+FCK_RUNTIME_DOMAIN+'";</script>'+A;if (FCKBrowserInfo.IsIE) A=A.replace(/(<base[^>]*?)\s*\/?>(?!\s*<\/base>)/gi,'$1></base>');else if (!B){var E=A.match(FCKRegexLib.BeforeBody);var F=A.match(FCKRegexLib.AfterBody);if (E&&F){var G=A.substr(E[1].length,A.length-E[1].length-F[1].length);A=E[1]+' '+F[1];if (FCKBrowserInfo.IsGecko&&(G.length==0||FCKRegexLib.EmptyParagraph.test(G))) G='<br type="_moz">';this._BodyHTML=G;}else this._BodyHTML=A;};var H=this.IFrame=D.createElement('iframe');var I='<script type="text/javascript" _fcktemp="true">window.onerror=function(){return true;};</script>';H.frameBorder=0;H.style.width=H.style.height='100%';if (FCK_IS_CUSTOM_DOMAIN&&FCKBrowserInfo.IsIE){window._FCKHtmlToLoad=A.replace(/<head>/i,'<head>'+I);H.src='javascript:void( (function(){document.open() ;document.domain="'+document.domain+'" ;document.write( window.parent._FCKHtmlToLoad );document.close() ;window.parent._FCKHtmlToLoad = null ;})() )';}else if (!FCKBrowserInfo.IsGecko){H.src='javascript:void(0)';};C.appendChild(H);this.Window=H.contentWindow;if (!FCK_IS_CUSTOM_DOMAIN||!FCKBrowserInfo.IsIE){var J=this.Window.document;J.open();J.write(A.replace(/<head>/i,'<head>'+I));J.close();};if (FCKBrowserInfo.IsAIR) FCKAdobeAIR.EditingArea_Start(J,A);if (FCKBrowserInfo.IsGecko10&&!B){this.Start(A,true);return;};if (H.readyState&&H.readyState!='completed'){var K=this;setTimeout(function(){try{K.Window.document.documentElement.doScroll("left");}catch(e){setTimeout(arguments.callee,0);return;};K.Window._FCKEditingArea=K;FCKEditingArea_CompleteStart.call(K.Window);},0);}else{this.Window._FCKEditingArea=this;if (FCKBrowserInfo.IsGecko10) this.Window.setTimeout(FCKEditingArea_CompleteStart,500);else FCKEditingArea_CompleteStart.call(this.Window);}}else{var L=this.Textarea=D.createElement('textarea');L.className='SourceField';L.dir='ltr';FCKDomTools.SetElementStyles(L,{width:'100%',height:'100%',border:'none',resize:'none',outline:'none'});C.appendChild(L);L.value=A;FCKTools.RunFunction(this.OnLoad);}};function FCKEditingArea_CompleteStart(){if (!this.document.body){this.setTimeout(FCKEditingArea_CompleteStart,50);return;};var A=this._FCKEditingArea;A.Document=A.Window.document;A.MakeEditable();FCKTools.RunFunction(A.OnLoad);};FCKEditingArea.prototype.MakeEditable=function(){var A=this.Document;if (FCKBrowserInfo.IsIE){A.body.disabled=true;A.body.contentEditable=true;A.body.removeAttribute("disabled");}else{try{A.body.spellcheck=(this.FFSpellChecker!==false);if (this._BodyHTML){A.body.innerHTML=this._BodyHTML;A.body.offsetLeft;this._BodyHTML=null;};A.designMode='on';A.execCommand('enableObjectResizing',false,!FCKConfig.DisableObjectResizing);A.execCommand('enableInlineTableEditing',false,!FCKConfig.DisableFFTableHandles);}catch (e){FCKTools.AddEventListener(this.Window.frameElement,'DOMAttrModified',FCKEditingArea_Document_AttributeNodeModified);}}};function FCKEditingArea_Document_AttributeNodeModified(A){var B=A.currentTarget.contentWindow._FCKEditingArea;if (B._timer) window.clearTimeout(B._timer);B._timer=FCKTools.SetTimeout(FCKEditingArea_MakeEditableByMutation,1000,B);};function FCKEditingArea_MakeEditableByMutation(){delete this._timer;FCKTools.RemoveEventListener(this.Window.frameElement,'DOMAttrModified',FCKEditingArea_Document_AttributeNodeModified);this.MakeEditable();};FCKEditingArea.prototype.Focus=function(){try{if (this.Mode==0){if (FCKBrowserInfo.IsIE) this._FocusIE();else this.Window.focus();}else{var A=FCKTools.GetElementDocument(this.Textarea);if ((!A.hasFocus||A.hasFocus())&&A.activeElement==this.Textarea) return;this.Textarea.focus();}}catch(e) {}};FCKEditingArea.prototype._FocusIE=function(){this.Document.body.setActive();this.Window.focus();var A=this.Document.selection.createRange();var B=A.parentElement();var C=B.nodeName.toLowerCase();if (B.childNodes.length>0||!(FCKListsLib.BlockElements[C]||FCKListsLib.NonEmptyBlockElements[C])){return;};A=new FCKDomRange(this.Window);A.MoveToElementEditStart(B);A.Select();};function FCKEditingArea_Cleanup(){if (this.Document) this.Document.body.innerHTML="";this.TargetElement=null;this.IFrame=null;this.Document=null;this.Textarea=null;if (this.Window){this.Window._FCKEditingArea=null;this.Window=null;}};
var FCKKeystrokeHandler=function(A){this.Keystrokes={};this.CancelCtrlDefaults=(A!==false);};FCKKeystrokeHandler.prototype.AttachToElement=function(A){FCKTools.AddEventListenerEx(A,'keydown',_FCKKeystrokeHandler_OnKeyDown,this);if (FCKBrowserInfo.IsGecko10||FCKBrowserInfo.IsOpera||(FCKBrowserInfo.IsGecko&&FCKBrowserInfo.IsMac)) FCKTools.AddEventListenerEx(A,'keypress',_FCKKeystrokeHandler_OnKeyPress,this);};FCKKeystrokeHandler.prototype.SetKeystrokes=function(){for (var i=0;i<arguments.length;i++){var A=arguments[i];if (!A) continue;if (typeof(A[0])=='object') this.SetKeystrokes.apply(this,A);else{if (A.length==1) delete this.Keystrokes[A[0]];else this.Keystrokes[A[0]]=A[1]===true?true:A;}}};function _FCKKeystrokeHandler_OnKeyDown(A,B){var C=A.keyCode||A.which;var D=0;if (A.ctrlKey||A.metaKey) D+=CTRL;if (A.shiftKey) D+=SHIFT;if (A.altKey) D+=ALT;var E=C+D;var F=B._CancelIt=false;var G=B.Keystrokes[E];if (G){if (G===true||!(B.OnKeystroke&&B.OnKeystroke.apply(B,G))) return true;F=true;};if (F||(B.CancelCtrlDefaults&&D==CTRL&&(C<33||C>40))){B._CancelIt=true;if (A.preventDefault) return A.preventDefault();A.returnValue=false;A.cancelBubble=true;return false;};return true;};function _FCKKeystrokeHandler_OnKeyPress(A,B){if (B._CancelIt){if (A.preventDefault) return A.preventDefault();return false;};return true;};
FCK.DTD=(function(){var X=FCKTools.Merge;var A,L,J,M,N,O,D,H,P,K,Q,F,G,C,B,E,I;A={isindex:1,fieldset:1};B={input:1,button:1,select:1,textarea:1,label:1};C=X({a:1},B);D=X({iframe:1},C);E={hr:1,ul:1,menu:1,div:1,blockquote:1,noscript:1,table:1,center:1,address:1,dir:1,pre:1,h5:1,dl:1,h4:1,noframes:1,h6:1,ol:1,h1:1,h3:1,h2:1};F={ins:1,del:1,script:1};G=X({b:1,acronym:1,bdo:1,'var':1,'#':1,abbr:1,code:1,br:1,i:1,cite:1,kbd:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,dfn:1,span:1},F);H=X({sub:1,img:1,object:1,sup:1,basefont:1,map:1,applet:1,font:1,big:1,small:1},G);I=X({p:1},H);J=X({iframe:1},H,B);K={img:1,noscript:1,br:1,kbd:1,center:1,button:1,basefont:1,h5:1,h4:1,samp:1,h6:1,ol:1,h1:1,h3:1,h2:1,form:1,font:1,'#':1,select:1,menu:1,ins:1,abbr:1,label:1,code:1,table:1,script:1,cite:1,input:1,iframe:1,strong:1,textarea:1,noframes:1,big:1,small:1,span:1,hr:1,sub:1,bdo:1,'var':1,div:1,object:1,sup:1,strike:1,dir:1,map:1,dl:1,applet:1,del:1,isindex:1,fieldset:1,ul:1,b:1,acronym:1,a:1,blockquote:1,i:1,u:1,s:1,tt:1,address:1,q:1,pre:1,p:1,em:1,dfn:1};L=X({a:1},J);M={tr:1};N={'#':1};O=X({param:1},K);P=X({form:1},A,D,E,I);Q={li:1};return {col:{},tr:{td:1,th:1},img:{},colgroup:{col:1},noscript:P,td:P,br:{},th:P,center:P,kbd:L,button:X(I,E),basefont:{},h5:L,h4:L,samp:L,h6:L,ol:Q,h1:L,h3:L,option:N,h2:L,form:X(A,D,E,I),select:{optgroup:1,option:1},font:J,ins:P,menu:Q,abbr:L,label:L,table:{thead:1,col:1,tbody:1,tr:1,colgroup:1,caption:1,tfoot:1},code:L,script:N,tfoot:M,cite:L,li:P,input:{},iframe:P,strong:J,textarea:N,noframes:P,big:J,small:J,span:J,hr:{},dt:L,sub:J,optgroup:{option:1},param:{},bdo:L,'var':J,div:P,object:O,sup:J,dd:P,strike:J,area:{},dir:Q,map:X({area:1,form:1,p:1},A,F,E),applet:O,dl:{dt:1,dd:1},del:P,isindex:{},fieldset:X({legend:1},K),thead:M,ul:Q,acronym:L,b:J,a:J,blockquote:P,caption:L,i:J,u:J,tbody:M,s:L,address:X(D,I),tt:J,legend:L,q:L,pre:X(G,C),p:L,em:J,dfn:L};})();
-var FCKStyle=function(A){this.Element=(A.Element||'span').toLowerCase();this._StyleDesc=A;};FCKStyle.prototype={GetType:function(){var A=this.GetType_$;if (A!=undefined) return A;var B=this.Element;if (B=='#'||FCKListsLib.StyleBlockElements[B]) A=0;else if (FCKListsLib.StyleObjectElements[B]) A=2;else A=1;return (this.GetType_$=A);},ApplyToSelection:function(A){var B=new FCKDomRange(A);B.MoveToSelection();this.ApplyToRange(B,true);},ApplyToRange:function(A,B,C){switch (this.GetType()){case 0:this.ApplyToRange=this._ApplyBlockStyle;break;case 1:this.ApplyToRange=this._ApplyInlineStyle;break;default:return;};this.ApplyToRange(A,B,C);},ApplyToObject:function(A){if (!A) return;this.BuildElement(null,A);},RemoveFromSelection:function(A){var B=new FCKDomRange(A);B.MoveToSelection();this.RemoveFromRange(B,true);},RemoveFromRange:function(A,B,C){var D;var E=this._GetAttribsForComparison();var F=this._GetOverridesForComparison();if (A.CheckIsCollapsed()){var D=A.CreateBookmark(true);var H=A.GetBookmarkNode(D,true);var I=new FCKElementPath(H.parentNode);var J=[];var K=!FCKDomTools.GetNextSibling(H);var L=K||!FCKDomTools.GetPreviousSibling(H);var M;var N=-1;for (var i=0;i<I.Elements.length;i++){var O=I.Elements[i];if (this.CheckElementRemovable(O)){if (L&&!FCKDomTools.CheckIsEmptyElement(O,function(el){return (el!=H);})){M=O;N=J.length-1;}else{var P=O.nodeName.toLowerCase();if (P==this.Element){for (var Q in E){if (FCKDomTools.HasAttribute(O,Q)){switch (Q){case 'style':this._RemoveStylesFromElement(O);break;case 'class':if (FCKDomTools.GetAttributeValue(O,Q)!=this.GetFinalAttributeValue(Q)) continue;default:FCKDomTools.RemoveAttribute(O,Q);}}}};this._RemoveOverrides(O,F[P]);if (this.GetType()==1) this._RemoveNoAttribElement(O);}}else if (L) J.push(O);L=L&&((K&&!FCKDomTools.GetNextSibling(O))||(!K&&!FCKDomTools.GetPreviousSibling(O)));if (M&&(!L||(i==I.Elements.length-1))){var R=FCKDomTools.RemoveNode(H);for (var j=0;j<=N;j++){var S=FCKDomTools.CloneElement(J[j]);S.appendChild(R);R=S;};if (K) FCKDomTools.InsertAfterNode(M,R);else M.parentNode.insertBefore(R,M);L=false;M=null;}};if (B) A.SelectBookmark(D);if (C) A.MoveToBookmark(D);return;};A.Expand('inline_elements');D=A.CreateBookmark(true);var T=A.GetBookmarkNode(D,true);var U=A.GetBookmarkNode(D,false);A.Release(true);var I=new FCKElementPath(T);var X=I.Elements;var O;for (var i=1;i<X.length;i++){O=X[i];if (O==I.Block||O==I.BlockLimit) break;if (this.CheckElementRemovable(O)) FCKDomTools.BreakParent(T,O,A);};I=new FCKElementPath(U);X=I.Elements;for (var i=1;i<X.length;i++){O=X[i];if (O==I.Block||O==I.BlockLimit) break;b=O.nodeName.toLowerCase();if (this.CheckElementRemovable(O)) FCKDomTools.BreakParent(U,O,A);};var Z=FCKDomTools.GetNextSourceNode(T,true);while (Z){var a=FCKDomTools.GetNextSourceNode(Z);if (Z.nodeType==1){var b=Z.nodeName.toLowerCase();var c=(b==this.Element);if (c){for (var Q in E){if (FCKDomTools.HasAttribute(Z,Q)){switch (Q){case 'style':this._RemoveStylesFromElement(Z);break;case 'class':if (FCKDomTools.GetAttributeValue(Z,Q)!=this.GetFinalAttributeValue(Q)) continue;default:FCKDomTools.RemoveAttribute(Z,Q);}}}}else c=!!F[b];if (c){this._RemoveOverrides(Z,F[b]);this._RemoveNoAttribElement(Z);}};if (a==U) break;Z=a;};this._FixBookmarkStart(T);if (B) A.SelectBookmark(D);if (C) A.MoveToBookmark(D);},CheckElementRemovable:function(A,B){if (!A) return false;var C=A.nodeName.toLowerCase();if (C==this.Element){if (!B&&!FCKDomTools.HasAttributes(A)) return true;var D=this._GetAttribsForComparison();var E=(D._length==0);for (var F in D){if (F=='_length') continue;if (this._CompareAttributeValues(F,FCKDomTools.GetAttributeValue(A,F),(this.GetFinalAttributeValue(F)||''))){E=true;if (!B) break;}else{E=false;if (B) return false;}};if (E) return true;};var G=this._GetOverridesForComparison()[C];if (G){if (!(D=G.Attributes)) return true;for (var i=0;i<D.length;i++){var H=D[i][0];if (FCKDomTools.HasAttribute(A,H)){var I=D[i][1];if (I==null||(typeof I=='string'&&FCKDomTools.GetAttributeValue(A,H)==I)||I.test(FCKDomTools.GetAttributeValue(A,H))) return true;}}};return false;},CheckActive:function(A){switch (this.GetType()){case 0:return this.CheckElementRemovable(A.Block||A.BlockLimit,true);case 1:var B=A.Elements;for (var i=0;i<B.length;i++){var C=B[i];if (C==A.Block||C==A.BlockLimit) continue;if (this.CheckElementRemovable(C,true)) return true;}};return false;},RemoveFromElement:function(A){var B=this._GetAttribsForComparison();var C=this._GetOverridesForComparison();var D=A.getElementsByTagName(this.Element);for (var i=D.length-1;i>=0;i--){var E=D[i];for (var F in B){if (FCKDomTools.HasAttribute(E,F)){switch (F){case 'style':this._RemoveStylesFromElement(E);break;case 'class':if (FCKDomTools.GetAttributeValue(E,F)!=this.GetFinalAttributeValue(F)) continue;default:FCKDomTools.RemoveAttribute(E,F);}}};this._RemoveOverrides(E,C[this.Element]);this._RemoveNoAttribElement(E);};for (var G in C){if (G!=this.Element){D=A.getElementsByTagName(G);for (var i=D.length-1;i>=0;i--){var E=D[i];this._RemoveOverrides(E,C[G]);this._RemoveNoAttribElement(E);}}}},_RemoveStylesFromElement:function(A){var B=A.style.cssText;var C=this.GetFinalStyleValue();if (B.length>0&&C.length==0) return;C='(^|;)\\s*('+C.replace(/\s*([^ ]+):.*?(;|$)/g,'$1|').replace(/\|$/,'')+'):[^;]+';var D=new RegExp(C,'gi');B=B.replace(D,'').Trim();if (B.length==0||B==';') FCKDomTools.RemoveAttribute(A,'style');else A.style.cssText=B.replace(D,'');},_RemoveOverrides:function(A,B){var C=B&&B.Attributes;if (C){for (var i=0;i<C.length;i++){var D=C[i][0];if (FCKDomTools.HasAttribute(A,D)){var E=C[i][1];if (E==null||(E.test&&E.test(FCKDomTools.GetAttributeValue(A,D)))||(typeof E=='string'&&FCKDomTools.GetAttributeValue(A,D)==E)) FCKDomTools.RemoveAttribute(A,D);}}}},_RemoveNoAttribElement:function(A){if (!FCKDomTools.HasAttributes(A)){var B=A.firstChild;var C=A.lastChild;FCKDomTools.RemoveNode(A,true);this._MergeSiblings(B);if (B!=C) this._MergeSiblings(C);}},BuildElement:function(A,B){var C=B||A.createElement(this.Element);var D=this._StyleDesc.Attributes;var E;if (D){for (var F in D){E=this.GetFinalAttributeValue(F);if (F.toLowerCase()=='class') C.className=E;else C.setAttribute(F,E);}};if (this._GetStyleText().length>0) C.style.cssText=this.GetFinalStyleValue();return C;},_CompareAttributeValues:function(A,B,C){if (A=='style'&&B&&C){B=B.replace(/;$/,'').toLowerCase();C=C.replace(/;$/,'').toLowerCase();};return (B==C||((B===null||B==='')&&(C===null||C==='')))},GetFinalAttributeValue:function(A){var B=this._StyleDesc.Attributes;var B=B?B[A]:null;if (!B&&A=='style') return this.GetFinalStyleValue();if (B&&this._Variables) B=B.Replace(FCKRegexLib.StyleVariableAttName,this._GetVariableReplace,this);return B;},GetFinalStyleValue:function(){var A=this._GetStyleText();if (A.length>0&&this._Variables){A=A.Replace(FCKRegexLib.StyleVariableAttName,this._GetVariableReplace,this);A=FCKTools.NormalizeCssText(A);};return A;},_GetVariableReplace:function(){return this._Variables[arguments[2]]||arguments[0];},SetVariable:function(A,B){var C=this._Variables;if (!C) C=this._Variables={};this._Variables[A]=B;},_FromPre:function(A,B,C){var D=B.innerHTML;D=D.replace(/(\r\n|\r)/g,'\n');D=D.replace(/^[ \t]*\n/,'');D=D.replace(/\n$/,'');D=D.replace(/^[ \t]+|[ \t]+$/g,function(match,offset,s){if (match.length==1) return ' ';else if (offset==0) return new Array(match.length).join(' ')+' ';else return ' '+new Array(match.length).join(' ');});var E=new FCKHtmlIterator(D);var F=[];E.Each(function(isTag,value){if (!isTag){value=value.replace(/\n/g,'<BR>');value=value.replace(/[ \t]{2,}/g,function (match){return new Array(match.length).join(' ')+' ';});};F.push(value);});C.innerHTML=F.join('');return C;},_ToPre:function(A,B,C){var D=B.innerHTML.Trim();D=D.replace(/[ \t\r\n]*(<br[^>]*>)[ \t\r\n]*/gi,'<BR />');var E=new FCKHtmlIterator(D);var F=[];E.Each(function(isTag,value){if (!isTag) value=value.replace(/([ \t\n\r]+| )/g,' ');else if (isTag&&value=='<BR />') value='\n';F.push(value);});if (FCKBrowserInfo.IsIE){var G=A.createElement('div');G.appendChild(C);C.outerHTML='<PRE>\n'+F.join('')+'</PRE>';C=G.removeChild(G.firstChild);}else C.innerHTML=F.join('');return C;},_ApplyBlockStyle:function(A,B,C){var D;if (B) D=A.CreateBookmark();var E=new FCKDomRangeIterator(A);E.EnforceRealBlocks=true;var F;var G=A.Window.document;var H=[];var I=[];while((F=E.GetNextParagraph())){var J=this.BuildElement(G);var K=J.nodeName.IEquals('pre');var L=F.nodeName.IEquals('pre');if (K&&!L){J=this._ToPre(G,F,J);H.push(J);}else if (!K&&L){J=this._FromPre(G,F,J);I.push(J);}else FCKDomTools.MoveChildren(F,J);F.parentNode.insertBefore(J,F);FCKDomTools.RemoveNode(F);};for (var i=0;i<H.length-1;i++){if (FCKDomTools.GetNextSourceElement(H[i],true,[],[],true)!=H[i+1]) continue;H[i+1].innerHTML=H[i].innerHTML+'\n\n'+H[i+1].innerHTML;FCKDomTools.RemoveNode(H[i]);};for (var i=0;i<I.length;i++){var M=I[i];var N=null;for (var j=0;j<M.childNodes.length;j++){var O=M.childNodes[j];if (O.nodeName.IEquals('br')&&j!=0&&j!=M.childNodes.length-2&&O.nextSibling&&O.nextSibling.nodeName.IEquals('br')){FCKDomTools.RemoveNode(O.nextSibling);FCKDomTools.RemoveNode(O);j--;N=FCKDomTools.InsertAfterNode(N||M,G.createElement(M.nodeName));continue;};if (N){FCKDomTools.MoveNode(O,N);j--;}}};if (B) A.SelectBookmark(D);if (C) A.MoveToBookmark(D);},_ApplyInlineStyle:function(A,B,C){var D=A.Window.document;if (A.CheckIsCollapsed()){var E=this.BuildElement(D);A.InsertNode(E);A.MoveToPosition(E,2);A.Select();return;};var F=this.Element;var G=FCK.DTD[F]||FCK.DTD.span;var H=this._GetAttribsForComparison();var I;A.Expand('inline_elements');var J=A.CreateBookmark(true);var K=A.GetBookmarkNode(J,true);var L=A.GetBookmarkNode(J,false);A.Release(true);var M=FCKDomTools.GetNextSourceNode(K,true);while (M){var N=false;var O=M.nodeType;var P=O==1?M.nodeName.toLowerCase():null;if (!P||G[P]){if ((FCK.DTD[M.parentNode.nodeName.toLowerCase()]||FCK.DTD.span)[F]||!FCK.DTD[F]){if (!A.CheckHasRange()) A.SetStart(M,3);if (O!=1||M.childNodes.length==0){var Q=M;var R=Q.parentNode;while (Q==R.lastChild&&G[R.nodeName.toLowerCase()]){Q=R;};A.SetEnd(Q,4);if (Q==Q.parentNode.lastChild&&!G[Q.parentNode.nodeName.toLowerCase()]) N=true;}else{A.SetEnd(M,3);}}else N=true;}else N=true;M=FCKDomTools.GetNextSourceNode(M);if (M==L){M=null;N=true;};if (N&&A.CheckHasRange()&&!A.CheckIsCollapsed()){I=this.BuildElement(D);A.ExtractContents().AppendTo(I);if (I.innerHTML.RTrim().length>0){A.InsertNode(I);this.RemoveFromElement(I);this._MergeSiblings(I,this._GetAttribsForComparison());if (!FCKBrowserInfo.IsIE) I.normalize();};A.Release(true);}};this._FixBookmarkStart(K);if (B) A.SelectBookmark(J);if (C) A.MoveToBookmark(J);},_FixBookmarkStart:function(A){var B;while ((B=A.nextSibling)){if (B.nodeType==1&&FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){if (!B.firstChild) FCKDomTools.RemoveNode(B);else FCKDomTools.MoveNode(A,B,true);continue;};if (B.nodeType==3&&B.length==0){FCKDomTools.RemoveNode(B);continue;};break;}},_MergeSiblings:function(A,B){if (!A||A.nodeType!=1||!FCKListsLib.InlineNonEmptyElements[A.nodeName.toLowerCase()]) return;this._MergeNextSibling(A,B);this._MergePreviousSibling(A,B);},_MergeNextSibling:function(A,B){var C=A.nextSibling;var D=(C&&C.nodeType==1&&C.getAttribute('_fck_bookmark'));if (D) C=C.nextSibling;if (C&&C.nodeType==1&&C.nodeName==A.nodeName){if (!B) B=this._CreateElementAttribsForComparison(A);if (this._CheckAttributesMatch(C,B)){var E=A.lastChild;if (D) FCKDomTools.MoveNode(A.nextSibling,A);FCKDomTools.MoveChildren(C,A);FCKDomTools.RemoveNode(C);if (E) this._MergeNextSibling(E);}}},_MergePreviousSibling:function(A,B){var C=A.previousSibling;var D=(C&&C.nodeType==1&&C.getAttribute('_fck_bookmark'));if (D) C=C.previousSibling;if (C&&C.nodeType==1&&C.nodeName==A.nodeName){if (!B) B=this._CreateElementAttribsForComparison(A);if (this._CheckAttributesMatch(C,B)){var E=A.firstChild;if (D) FCKDomTools.MoveNode(A.previousSibling,A,true);FCKDomTools.MoveChildren(C,A,true);FCKDomTools.RemoveNode(C);if (E) this._MergePreviousSibling(E);}}},_GetStyleText:function(){var A=this._StyleDesc.Styles;var B=(this._StyleDesc.Attributes?this._StyleDesc.Attributes['style']||'':'');if (B.length>0) B+=';';for (var C in A) B+=C+':'+A[C]+';';if (B.length>0&&!(/#\(/.test(B))){B=FCKTools.NormalizeCssText(B);};return (this._GetStyleText=function() { return B;})();},_GetAttribsForComparison:function(){var A=this._GetAttribsForComparison_$;if (A) return A;A={};var B=this._StyleDesc.Attributes;if (B){for (var C in B){A[C.toLowerCase()]=B[C].toLowerCase();}};if (this._GetStyleText().length>0){A['style']=this._GetStyleText().toLowerCase();};FCKTools.AppendLengthProperty(A,'_length');return (this._GetAttribsForComparison_$=A);},_GetOverridesForComparison:function(){var A=this._GetOverridesForComparison_$;if (A) return A;A={};var B=this._StyleDesc.Overrides;if (B){if (!FCKTools.IsArray(B)) B=[B];for (var i=0;i<B.length;i++){var C=B[i];var D;var E;var F;if (typeof C=='string') D=C.toLowerCase();else{D=C.Element?C.Element.toLowerCase():this.Element;F=C.Attributes;};E=A[D]||(A[D]={});if (F){var G=(E.Attributes=E.Attributes||[]);for (var H in F){G.push([H.toLowerCase(),F[H]]);}}}};return (this._GetOverridesForComparison_$=A);},_CreateElementAttribsForComparison:function(A){var B={};var C=0;for (var i=0;i<A.attributes.length;i++){var D=A.attributes[i];if (D.specified){B[D.nodeName.toLowerCase()]=FCKDomTools.GetAttributeValue(A,D).toLowerCase();C++;}};B._length=C;return B;},_CheckAttributesMatch:function(A,B){var C=A.attributes;var D=0;for (var i=0;i<C.length;i++){var E=C[i];if (E.specified){var F=E.nodeName.toLowerCase();var G=B[F];if (!G) break;if (G!=FCKDomTools.GetAttributeValue(A,E).toLowerCase()) break;D++;}};return (D==B._length);}};
+var FCKStyle=function(A){this.Element=(A.Element||'span').toLowerCase();this._StyleDesc=A;};FCKStyle.prototype={GetType:function(){var A=this.GetType_$;if (A!=undefined) return A;var B=this.Element;if (B=='#'||FCKListsLib.StyleBlockElements[B]) A=0;else if (FCKListsLib.StyleObjectElements[B]) A=2;else A=1;return (this.GetType_$=A);},ApplyToSelection:function(A){var B=new FCKDomRange(A);B.MoveToSelection();this.ApplyToRange(B,true);},ApplyToRange:function(A,B,C){switch (this.GetType()){case 0:this.ApplyToRange=this._ApplyBlockStyle;break;case 1:this.ApplyToRange=this._ApplyInlineStyle;break;default:return;};this.ApplyToRange(A,B,C);},ApplyToObject:function(A){if (!A) return;this.BuildElement(null,A);},RemoveFromSelection:function(A){var B=new FCKDomRange(A);B.MoveToSelection();this.RemoveFromRange(B,true);},RemoveFromRange:function(A,B,C){var D;var E=this._GetAttribsForComparison();var F=this._GetOverridesForComparison();if (A.CheckIsCollapsed()){var D=A.CreateBookmark(true);var H=A.GetBookmarkNode(D,true);var I=new FCKElementPath(H.parentNode);var J=[];var K=!FCKDomTools.GetNextSibling(H);var L=K||!FCKDomTools.GetPreviousSibling(H);var M;var N=-1;for (var i=0;i<I.Elements.length;i++){var O=I.Elements[i];if (this.CheckElementRemovable(O)){if (L&&!FCKDomTools.CheckIsEmptyElement(O,function(el){return (el!=H);})){M=O;N=J.length-1;}else{var P=O.nodeName.toLowerCase();if (P==this.Element){for (var Q in E){if (FCKDomTools.HasAttribute(O,Q)){switch (Q){case 'style':this._RemoveStylesFromElement(O);break;case 'class':if (FCKDomTools.GetAttributeValue(O,Q)!=this.GetFinalAttributeValue(Q)) continue;default:FCKDomTools.RemoveAttribute(O,Q);}}}};this._RemoveOverrides(O,F[P]);if (this.GetType()==1) this._RemoveNoAttribElement(O);}}else if (L) J.push(O);L=L&&((K&&!FCKDomTools.GetNextSibling(O))||(!K&&!FCKDomTools.GetPreviousSibling(O)));if (M&&(!L||(i==I.Elements.length-1))){var R=FCKDomTools.RemoveNode(H);for (var j=0;j<=N;j++){var S=FCKDomTools.CloneElement(J[j]);S.appendChild(R);R=S;};if (K) FCKDomTools.InsertAfterNode(M,R);else M.parentNode.insertBefore(R,M);L=false;M=null;}};if (B) A.SelectBookmark(D);if (C) A.MoveToBookmark(D);return;};A.Expand('inline_elements');D=A.CreateBookmark(true);var T=A.GetBookmarkNode(D,true);var U=A.GetBookmarkNode(D,false);A.Release(true);var I=new FCKElementPath(T);var X=I.Elements;var O;for (var i=1;i<X.length;i++){O=X[i];if (O==I.Block||O==I.BlockLimit) break;if (this.CheckElementRemovable(O)) FCKDomTools.BreakParent(T,O,A);};I=new FCKElementPath(U);X=I.Elements;for (var i=1;i<X.length;i++){O=X[i];if (O==I.Block||O==I.BlockLimit) break;b=O.nodeName.toLowerCase();if (this.CheckElementRemovable(O)) FCKDomTools.BreakParent(U,O,A);};var Z=FCKDomTools.GetNextSourceNode(T,true);while (Z){var a=FCKDomTools.GetNextSourceNode(Z);if (Z.nodeType==1){var b=Z.nodeName.toLowerCase();var c=(b==this.Element);if (c){for (var Q in E){if (FCKDomTools.HasAttribute(Z,Q)){switch (Q){case 'style':this._RemoveStylesFromElement(Z);break;case 'class':if (FCKDomTools.GetAttributeValue(Z,Q)!=this.GetFinalAttributeValue(Q)) continue;default:FCKDomTools.RemoveAttribute(Z,Q);}}}}else c=!!F[b];if (c){this._RemoveOverrides(Z,F[b]);this._RemoveNoAttribElement(Z);}};if (a==U) break;Z=a;};this._FixBookmarkStart(T);if (B) A.SelectBookmark(D);if (C) A.MoveToBookmark(D);},CheckElementRemovable:function(A,B){if (!A) return false;var C=A.nodeName.toLowerCase();if (C==this.Element){if (!B&&!FCKDomTools.HasAttributes(A)) return true;var D=this._GetAttribsForComparison();var E=(D._length==0);for (var F in D){if (F=='_length') continue;if (this._CompareAttributeValues(F,FCKDomTools.GetAttributeValue(A,F),(this.GetFinalAttributeValue(F)||''))){E=true;if (!B) break;}else{E=false;if (B) return false;}};if (E) return true;};var G=this._GetOverridesForComparison()[C];if (G){if (!(D=G.Attributes)) return true;for (var i=0;i<D.length;i++){var H=D[i][0];if (FCKDomTools.HasAttribute(A,H)){var I=D[i][1];if (I==null||(typeof I=='string'&&FCKDomTools.GetAttributeValue(A,H)==I)||I.test(FCKDomTools.GetAttributeValue(A,H))) return true;}}};return false;},CheckActive:function(A){switch (this.GetType()){case 0:return this.CheckElementRemovable(A.Block||A.BlockLimit,true);case 1:var B=A.Elements;for (var i=0;i<B.length;i++){var C=B[i];if (C==A.Block||C==A.BlockLimit) continue;if (this.CheckElementRemovable(C,true)) return true;}};return false;},RemoveFromElement:function(A){var B=this._GetAttribsForComparison();var C=this._GetOverridesForComparison();var D=A.getElementsByTagName(this.Element);for (var i=D.length-1;i>=0;i--){var E=D[i];for (var F in B){if (FCKDomTools.HasAttribute(E,F)){switch (F){case 'style':this._RemoveStylesFromElement(E);break;case 'class':if (FCKDomTools.GetAttributeValue(E,F)!=this.GetFinalAttributeValue(F)) continue;default:FCKDomTools.RemoveAttribute(E,F);}}};this._RemoveOverrides(E,C[this.Element]);this._RemoveNoAttribElement(E);};for (var G in C){if (G!=this.Element){D=A.getElementsByTagName(G);for (var i=D.length-1;i>=0;i--){var E=D[i];this._RemoveOverrides(E,C[G]);this._RemoveNoAttribElement(E);}}}},_RemoveStylesFromElement:function(A){var B=A.style.cssText;var C=this.GetFinalStyleValue();if (B.length>0&&C.length==0) return;C='(^|;)\\s*('+C.replace(/\s*([^ ]+):.*?(;|$)/g,'$1|').replace(/\|$/,'')+'):[^;]+';var D=new RegExp(C,'gi');B=B.replace(D,'').Trim();if (B.length==0||B==';') FCKDomTools.RemoveAttribute(A,'style');else A.style.cssText=B.replace(D,'');},_RemoveOverrides:function(A,B){var C=B&&B.Attributes;if (C){for (var i=0;i<C.length;i++){var D=C[i][0];if (FCKDomTools.HasAttribute(A,D)){var E=C[i][1];if (E==null||(E.test&&E.test(FCKDomTools.GetAttributeValue(A,D)))||(typeof E=='string'&&FCKDomTools.GetAttributeValue(A,D)==E)) FCKDomTools.RemoveAttribute(A,D);}}}},_RemoveNoAttribElement:function(A){if (!FCKDomTools.HasAttributes(A)){var B=A.firstChild;var C=A.lastChild;FCKDomTools.RemoveNode(A,true);this._MergeSiblings(B);if (B!=C) this._MergeSiblings(C);}},BuildElement:function(A,B){var C=B||A.createElement(this.Element);var D=this._StyleDesc.Attributes;var E;if (D){for (var F in D){E=this.GetFinalAttributeValue(F);if (F.toLowerCase()=='class') C.className=E;else C.setAttribute(F,E);}};if (this._GetStyleText().length>0) C.style.cssText=this.GetFinalStyleValue();return C;},_CompareAttributeValues:function(A,B,C){if (A=='style'&&B&&C){B=B.replace(/;$/,'').toLowerCase();C=C.replace(/;$/,'').toLowerCase();};return (B==C||((B===null||B==='')&&(C===null||C==='')))},GetFinalAttributeValue:function(A){var B=this._StyleDesc.Attributes;var B=B?B[A]:null;if (!B&&A=='style') return this.GetFinalStyleValue();if (B&&this._Variables) B=B.Replace(FCKRegexLib.StyleVariableAttName,this._GetVariableReplace,this);return B;},GetFinalStyleValue:function(){var A=this._GetStyleText();if (A.length>0&&this._Variables){A=A.Replace(FCKRegexLib.StyleVariableAttName,this._GetVariableReplace,this);A=FCKTools.NormalizeCssText(A);};return A;},_GetVariableReplace:function(){return this._Variables[arguments[2]]||arguments[0];},SetVariable:function(A,B){var C=this._Variables;if (!C) C=this._Variables={};this._Variables[A]=B;},_FromPre:function(A,B,C){var D=B.innerHTML;D=D.replace(/(\r\n|\r)/g,'\n');D=D.replace(/^[ \t]*\n/,'');D=D.replace(/\n$/,'');D=D.replace(/^[ \t]+|[ \t]+$/g,function(match,offset,s){if (match.length==1) return ' ';else if (offset==0) return new Array(match.length).join(' ')+' ';else return ' '+new Array(match.length).join(' ');});var E=new FCKHtmlIterator(D);var F=[];E.Each(function(isTag,value){if (!isTag){value=value.replace(/\n/g,'<br>');value=value.replace(/[ \t]{2,}/g,function (match){return new Array(match.length).join(' ')+' ';});};F.push(value);});C.innerHTML=F.join('');return C;},_ToPre:function(A,B,C){var D=B.innerHTML.Trim();D=D.replace(/[ \t\r\n]*(<br[^>]*>)[ \t\r\n]*/gi,'<br />');var E=new FCKHtmlIterator(D);var F=[];E.Each(function(isTag,value){if (!isTag) value=value.replace(/([ \t\n\r]+| )/g,' ');else if (isTag&&value=='<br />') value='\n';F.push(value);});if (FCKBrowserInfo.IsIE){var G=A.createElement('div');G.appendChild(C);C.outerHTML='<pre>\n'+F.join('')+'</pre>';C=G.removeChild(G.firstChild);}else C.innerHTML=F.join('');return C;},_CheckAndMergePre:function(A,B){if (A!=FCKDomTools.GetPreviousSourceElement(B,true)) return;var C=A.innerHTML.replace(/\n$/,'')+'\n\n'+B.innerHTML.replace(/^\n/,'');if (FCKBrowserInfo.IsIE) B.outerHTML='<pre>'+C+'</pre>';else B.innerHTML=C;FCKDomTools.RemoveNode(A);},_CheckAndSplitPre:function(A){var B;var C=A.firstChild;C=C&&C.nextSibling;while (C){var D=C.nextSibling;if (D&&D.nextSibling&&C.nodeName.IEquals('br')&&D.nodeName.IEquals('br')){FCKDomTools.RemoveNode(C);C=D.nextSibling;FCKDomTools.RemoveNode(D);B=FCKDomTools.InsertAfterNode(B||A,FCKDomTools.CloneElement(A));continue;};if (B){C=C.previousSibling;FCKDomTools.MoveNode(C.nextSibling,B);};C=C.nextSibling;}},_ApplyBlockStyle:function(A,B,C){var D;if (B) D=A.CreateBookmark();var E=new FCKDomRangeIterator(A);E.EnforceRealBlocks=true;var F;var G=A.Window.document;var H;while((F=E.GetNextParagraph())){var I=this.BuildElement(G);var J=I.nodeName.IEquals('pre');var K=F.nodeName.IEquals('pre');var L=J&&!K;var M=!J&&K;if (L) I=this._ToPre(G,F,I);else if (M) I=this._FromPre(G,F,I);else FCKDomTools.MoveChildren(F,I);F.parentNode.insertBefore(I,F);FCKDomTools.RemoveNode(F);if (J){if (H) this._CheckAndMergePre(H,I);H=I;}else if (M) this._CheckAndSplitPre(I);};if (B) A.SelectBookmark(D);if (C) A.MoveToBookmark(D);},_ApplyInlineStyle:function(A,B,C){var D=A.Window.document;if (A.CheckIsCollapsed()){var E=this.BuildElement(D);A.InsertNode(E);A.MoveToPosition(E,2);A.Select();return;};var F=this.Element;var G=FCK.DTD[F]||FCK.DTD.span;var H=this._GetAttribsForComparison();var I;A.Expand('inline_elements');var J=A.CreateBookmark(true);var K=A.GetBookmarkNode(J,true);var L=A.GetBookmarkNode(J,false);A.Release(true);var M=FCKDomTools.GetNextSourceNode(K,true);while (M){var N=false;var O=M.nodeType;var P=O==1?M.nodeName.toLowerCase():null;if (!P||G[P]){if ((FCK.DTD[M.parentNode.nodeName.toLowerCase()]||FCK.DTD.span)[F]||!FCK.DTD[F]){if (!A.CheckHasRange()) A.SetStart(M,3);if (O!=1||M.childNodes.length==0){var Q=M;var R=Q.parentNode;while (Q==R.lastChild&&G[R.nodeName.toLowerCase()]){Q=R;};A.SetEnd(Q,4);if (Q==Q.parentNode.lastChild&&!G[Q.parentNode.nodeName.toLowerCase()]) N=true;}else{A.SetEnd(M,3);}}else N=true;}else N=true;M=FCKDomTools.GetNextSourceNode(M);if (M==L){M=null;N=true;};if (N&&A.CheckHasRange()&&!A.CheckIsCollapsed()){I=this.BuildElement(D);A.ExtractContents().AppendTo(I);if (I.innerHTML.RTrim().length>0){A.InsertNode(I);this.RemoveFromElement(I);this._MergeSiblings(I,this._GetAttribsForComparison());if (!FCKBrowserInfo.IsIE) I.normalize();};A.Release(true);}};this._FixBookmarkStart(K);if (B) A.SelectBookmark(J);if (C) A.MoveToBookmark(J);},_FixBookmarkStart:function(A){var B;while ((B=A.nextSibling)){if (B.nodeType==1&&FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){if (!B.firstChild) FCKDomTools.RemoveNode(B);else FCKDomTools.MoveNode(A,B,true);continue;};if (B.nodeType==3&&B.length==0){FCKDomTools.RemoveNode(B);continue;};break;}},_MergeSiblings:function(A,B){if (!A||A.nodeType!=1||!FCKListsLib.InlineNonEmptyElements[A.nodeName.toLowerCase()]) return;this._MergeNextSibling(A,B);this._MergePreviousSibling(A,B);},_MergeNextSibling:function(A,B){var C=A.nextSibling;var D=(C&&C.nodeType==1&&C.getAttribute('_fck_bookmark'));if (D) C=C.nextSibling;if (C&&C.nodeType==1&&C.nodeName==A.nodeName){if (!B) B=this._CreateElementAttribsForComparison(A);if (this._CheckAttributesMatch(C,B)){var E=A.lastChild;if (D) FCKDomTools.MoveNode(A.nextSibling,A);FCKDomTools.MoveChildren(C,A);FCKDomTools.RemoveNode(C);if (E) this._MergeNextSibling(E);}}},_MergePreviousSibling:function(A,B){var C=A.previousSibling;var D=(C&&C.nodeType==1&&C.getAttribute('_fck_bookmark'));if (D) C=C.previousSibling;if (C&&C.nodeType==1&&C.nodeName==A.nodeName){if (!B) B=this._CreateElementAttribsForComparison(A);if (this._CheckAttributesMatch(C,B)){var E=A.firstChild;if (D) FCKDomTools.MoveNode(A.previousSibling,A,true);FCKDomTools.MoveChildren(C,A,true);FCKDomTools.RemoveNode(C);if (E) this._MergePreviousSibling(E);}}},_GetStyleText:function(){var A=this._StyleDesc.Styles;var B=(this._StyleDesc.Attributes?this._StyleDesc.Attributes['style']||'':'');if (B.length>0) B+=';';for (var C in A) B+=C+':'+A[C]+';';if (B.length>0&&!(/#\(/.test(B))){B=FCKTools.NormalizeCssText(B);};return (this._GetStyleText=function() { return B;})();},_GetAttribsForComparison:function(){var A=this._GetAttribsForComparison_$;if (A) return A;A={};var B=this._StyleDesc.Attributes;if (B){for (var C in B){A[C.toLowerCase()]=B[C].toLowerCase();}};if (this._GetStyleText().length>0){A['style']=this._GetStyleText().toLowerCase();};FCKTools.AppendLengthProperty(A,'_length');return (this._GetAttribsForComparison_$=A);},_GetOverridesForComparison:function(){var A=this._GetOverridesForComparison_$;if (A) return A;A={};var B=this._StyleDesc.Overrides;if (B){if (!FCKTools.IsArray(B)) B=[B];for (var i=0;i<B.length;i++){var C=B[i];var D;var E;var F;if (typeof C=='string') D=C.toLowerCase();else{D=C.Element?C.Element.toLowerCase():this.Element;F=C.Attributes;};E=A[D]||(A[D]={});if (F){var G=(E.Attributes=E.Attributes||[]);for (var H in F){G.push([H.toLowerCase(),F[H]]);}}}};return (this._GetOverridesForComparison_$=A);},_CreateElementAttribsForComparison:function(A){var B={};var C=0;for (var i=0;i<A.attributes.length;i++){var D=A.attributes[i];if (D.specified){B[D.nodeName.toLowerCase()]=FCKDomTools.GetAttributeValue(A,D).toLowerCase();C++;}};B._length=C;return B;},_CheckAttributesMatch:function(A,B){var C=A.attributes;var D=0;for (var i=0;i<C.length;i++){var E=C[i];if (E.specified){var F=E.nodeName.toLowerCase();var G=B[F];if (!G) break;if (G!=FCKDomTools.GetAttributeValue(A,E).toLowerCase()) break;D++;}};return (D==B._length);}};
var FCKStyles=FCK.Styles={_Callbacks:{},_ObjectStyles:{},ApplyStyle:function(A){if (typeof A=='string') A=this.GetStyles()[A];if (A){if (A.GetType()==2) A.ApplyToObject(FCKSelection.GetSelectedElement());else A.ApplyToSelection(FCK.EditorWindow);FCK.Events.FireEvent('OnSelectionChange');}},RemoveStyle:function(A){if (typeof A=='string') A=this.GetStyles()[A];if (A){A.RemoveFromSelection(FCK.EditorWindow);FCK.Events.FireEvent('OnSelectionChange');}},AttachStyleStateChange:function(A,B,C){var D=this._Callbacks[A];if (!D) D=this._Callbacks[A]=[];D.push([B,C]);},CheckSelectionChanges:function(){var A=FCKSelection.GetBoundaryParentElement(true);if (!A) return;var B=new FCKElementPath(A);var C=this.GetStyles();for (var D in C){var E=this._Callbacks[D];if (E){var F=C[D];var G=F.CheckActive(B);if (G!=(F._LastState||null)){F._LastState=G;for (var i=0;i<E.length;i++){var H=E[i][0];var I=E[i][1];H.call(I||window,D,G);}}}}},CheckStyleInSelection:function(A){return false;},_GetRemoveFormatTagsRegex:function (){var A=new RegExp('^(?:'+FCKConfig.RemoveFormatTags.replace(/,/g,'|')+')$','i');return (this._GetRemoveFormatTagsRegex=function(){return A;})&&A;},RemoveAll:function(){var A=new FCKDomRange(FCK.EditorWindow);A.MoveToSelection();if (A.CheckIsCollapsed()) return;A.Expand('inline_elements');var B=A.CreateBookmark(true);var C=A.GetBookmarkNode(B,true);var D=A.GetBookmarkNode(B,false);A.Release(true);var E=this._GetRemoveFormatTagsRegex();var F=new FCKElementPath(C);var G=F.Elements;var H;for (var i=1;i<G.length;i++){H=G[i];if (H==F.Block||H==F.BlockLimit) break;if (E.test(H.nodeName)) FCKDomTools.BreakParent(C,H,A);};F=new FCKElementPath(D);G=F.Elements;for (var i=1;i<G.length;i++){H=G[i];if (H==F.Block||H==F.BlockLimit) break;elementName=H.nodeName.toLowerCase();if (E.test(H.nodeName)) FCKDomTools.BreakParent(D,H,A);};var I=FCKDomTools.GetNextSourceNode(C,true,1);while (I){if (I==D) break;var J=FCKDomTools.GetNextSourceNode(I,false,1);if (E.test(I.nodeName)) FCKDomTools.RemoveNode(I,true);else FCKDomTools.RemoveAttributes(I,FCKConfig.RemoveAttributesArray);I=J;};A.SelectBookmark(B);FCK.Events.FireEvent('OnSelectionChange');},GetStyle:function(A){return this.GetStyles()[A];},GetStyles:function(){var A=this._GetStyles;if (!A){A=this._GetStyles=FCKTools.Merge(this._LoadStylesCore(),this._LoadStylesCustom(),this._LoadStylesXml());};return A;},CheckHasObjectStyle:function(A){return!!this._ObjectStyles[A];},_LoadStylesCore:function(){var A={};var B=FCKConfig.CoreStyles;for (var C in B){var D=A['_FCK_'+C]=new FCKStyle(B[C]);D.IsCore=true;};return A;},_LoadStylesCustom:function(){var A={};var B=FCKConfig.CustomStyles;if (B){for (var C in B){var D=A[C]=new FCKStyle(B[C]);D.Name=C;}};return A;},_LoadStylesXml:function(){var A={};var B=FCKConfig.StylesXmlPath;if (!B||B.length==0) return A;var C=new FCKXml();C.LoadUrl(B);var D=FCKXml.TransformToObject(C.SelectSingleNode('Styles'));var E=D.$Style;if (!E) return A;for (var i=0;i<E.length;i++){var F=E[i];var G=(F.element||'').toLowerCase();if (G.length==0) throw('The element name is required. Error loading "'+B+'"');var H={Element:G,Attributes:{},Styles:{},Overrides:[]};var I=F.$Attribute||[];for (var j=0;j<I.length;j++){H.Attributes[I[j].name]=I[j].value;};var J=F.$Style||[];for (j=0;j<J.length;j++){H.Styles[J[j].name]=J[j].value;};var K=F.$Override;if (K){for (j=0;j<K.length;j++){var L=K[j];var M={Element:L.element};var N=L.$Attribute;if (N){M.Attributes={};for (var k=0;k<N.length;k++){var O=N[k].value||null;if (O){var P=O&&FCKRegexLib.RegExp.exec(O);if (P) O=new RegExp(P[1],P[2]||'');};M.Attributes[N[k].name]=O;}};H.Overrides.push(M);}};var Q=new FCKStyle(H);Q.Name=F.name||G;if (Q.GetType()==2) this._ObjectStyles[G]=true;A[Q.Name]=Q;};return A;}};
var FCKListHandler={OutdentListItem:function(A){var B=A.parentNode;if (B.tagName.toUpperCase().Equals('UL','OL')){var C=FCKTools.GetElementDocument(A);var D=new FCKDocumentFragment(C);var E=D.RootNode;var F=false;var G=FCKDomTools.GetFirstChild(A,['UL','OL']);if (G){F=true;var H;while ((H=G.firstChild)) E.appendChild(G.removeChild(H));FCKDomTools.RemoveNode(G);};var I;var J=false;while ((I=A.nextSibling)){if (!F&&I.nodeType==1&&I.nodeName.toUpperCase()=='LI') J=F=true;E.appendChild(I.parentNode.removeChild(I));if (!J&&I.nodeType==1&&I.nodeName.toUpperCase().Equals('UL','OL')) FCKDomTools.RemoveNode(I,true);};var K=B.parentNode.tagName.toUpperCase();var L=(K=='LI');if (L||K.Equals('UL','OL')){if (F){var G=B.cloneNode(false);D.AppendTo(G);A.appendChild(G);}else if (L) D.InsertAfterNode(B.parentNode);else D.InsertAfterNode(B);if (L) FCKDomTools.InsertAfterNode(B.parentNode,B.removeChild(A));else FCKDomTools.InsertAfterNode(B,B.removeChild(A));}else{if (F){var N=B.cloneNode(false);D.AppendTo(N);FCKDomTools.InsertAfterNode(B,N);};var O=C.createElement(FCKConfig.EnterMode=='p'?'p':'div');FCKDomTools.MoveChildren(B.removeChild(A),O);FCKDomTools.InsertAfterNode(B,O);if (FCKConfig.EnterMode=='br'){if (FCKBrowserInfo.IsGecko) O.parentNode.insertBefore(FCKTools.CreateBogusBR(C),O);else FCKDomTools.InsertAfterNode(O,FCKTools.CreateBogusBR(C));FCKDomTools.RemoveNode(O,true);}};if (this.CheckEmptyList(B)) FCKDomTools.RemoveNode(B,true);}},CheckEmptyList:function(A){return (FCKDomTools.GetFirstChild(A,'LI')==null);},CheckListHasContents:function(A){var B=A.firstChild;while (B){switch (B.nodeType){case 1:if (!B.nodeName.IEquals('UL','LI')) return true;break;case 3:if (B.nodeValue.Trim().length>0) return true;};B=B.nextSibling;};return false;}};
var FCKElementPath=function(A){var B=null;var C=null;var D=[];var e=A;while (e){if (e.nodeType==1){if (!this.LastElement) this.LastElement=e;var E=e.nodeName.toLowerCase();if (FCKBrowserInfo.IsIE&&e.scopeName!='HTML') E=e.scopeName.toLowerCase()+':'+E;if (!C){if (!B&&FCKListsLib.PathBlockElements[E]!=null) B=e;if (FCKListsLib.PathBlockLimitElements[E]!=null){if (!B&&E=='div'&&!FCKElementPath._CheckHasBlock(e)) B=e;else C=e;}};D.push(e);if (E=='body') break;};e=e.parentNode;};this.Block=B;this.BlockLimit=C;this.Elements=D;};FCKElementPath._CheckHasBlock=function(A){var B=A.childNodes;for (var i=0,count=B.length;i<count;i++){var C=B[i];if (C.nodeType==1&&FCKListsLib.BlockElements[C.nodeName.toLowerCase()]) return true;};return false;};
-var FCKDomRange=function(A){this.Window=A;this._Cache={};};FCKDomRange.prototype={_UpdateElementInfo:function(){var A=this._Range;if (!A) this.Release(true);else{var B=A.startContainer;var C=A.endContainer;var D=new FCKElementPath(B);this.StartNode=B.nodeType==3?B:B.childNodes[A.startOffset];this.StartContainer=B;this.StartBlock=D.Block;this.StartBlockLimit=D.BlockLimit;if (B!=C) D=new FCKElementPath(C);var E=C;if (A.endOffset==0){while (E&&!E.previousSibling) E=E.parentNode;if (E) E=E.previousSibling;}else if (E.nodeType==1) E=E.childNodes[A.endOffset-1];this.EndNode=E;this.EndContainer=C;this.EndBlock=D.Block;this.EndBlockLimit=D.BlockLimit;};this._Cache={};},CreateRange:function(){return new FCKW3CRange(this.Window.document);},DeleteContents:function(){if (this._Range){this._Range.deleteContents();this._UpdateElementInfo();}},ExtractContents:function(){if (this._Range){var A=this._Range.extractContents();this._UpdateElementInfo();return A;};return null;},CheckIsCollapsed:function(){if (this._Range) return this._Range.collapsed;return false;},Collapse:function(A){if (this._Range) this._Range.collapse(A);this._UpdateElementInfo();},Clone:function(){var A=FCKTools.CloneObject(this);if (this._Range) A._Range=this._Range.cloneRange();return A;},MoveToNodeContents:function(A){if (!this._Range) this._Range=this.CreateRange();this._Range.selectNodeContents(A);this._UpdateElementInfo();},MoveToElementStart:function(A){this.SetStart(A,1);this.SetEnd(A,1);},MoveToElementEditStart:function(A){var B;while (A&&A.nodeType==1){if (FCKDomTools.CheckIsEditable(A)) B=A;else if (B) break;A=A.firstChild;};if (B) this.MoveToElementStart(B);},InsertNode:function(A){if (this._Range) this._Range.insertNode(A);},CheckIsEmpty:function(){if (this.CheckIsCollapsed()) return true;var A=this.Window.document.createElement('div');this._Range.cloneContents().AppendTo(A);FCKDomTools.TrimNode(A);return (A.innerHTML.length==0);},CheckStartOfBlock:function(){var A=this._Cache;var B=A.IsStartOfBlock;if (B!=undefined) return B;var C=this.StartBlock||this.StartBlockLimit;var D=this._Range.startContainer;var E=this._Range.startOffset;var F;if (E>0){if (D.nodeType==3){var G=D.nodeValue.substr(0,E).Trim();if (G.length!=0) return A.IsStartOfBlock=false;}else F=D.childNodes[E-1];};if (!F) F=FCKDomTools.GetPreviousSourceNode(D,true,null,C);while (F){switch (F.nodeType){case 1:if (!FCKListsLib.InlineChildReqElements[F.nodeName.toLowerCase()]) return A.IsStartOfBlock=false;break;case 3:if (F.nodeValue.Trim().length>0) return A.IsStartOfBlock=false;};F=FCKDomTools.GetPreviousSourceNode(F,false,null,C);};return A.IsStartOfBlock=true;},CheckEndOfBlock:function(A){var B=this._Cache.IsEndOfBlock;if (B!=undefined) return B;var C=this.EndBlock||this.EndBlockLimit;var D=this._Range.endContainer;var E=this._Range.endOffset;var F;if (D.nodeType==3){var G=D.nodeValue;if (E<G.length){G=G.substr(E);if (G.Trim().length!=0) return this._Cache.IsEndOfBlock=false;}}else F=D.childNodes[E];if (!F) F=FCKDomTools.GetNextSourceNode(D,true,null,C);var H=false;while (F){switch (F.nodeType){case 1:var I=F.nodeName.toLowerCase();if (FCKListsLib.InlineChildReqElements[I]) break;if (I=='br'&&!H){H=true;break;};return this._Cache.IsEndOfBlock=false;case 3:if (F.nodeValue.Trim().length>0) return this._Cache.IsEndOfBlock=false;};F=FCKDomTools.GetNextSourceNode(F,false,null,C);};if (A) this.Select();return this._Cache.IsEndOfBlock=true;},CreateBookmark:function(A){var B={StartId:(new Date()).valueOf()+Math.floor(Math.random()*1000)+'S',EndId:(new Date()).valueOf()+Math.floor(Math.random()*1000)+'E'};var C=this.Window.document;var D;var E;var F;if (!this.CheckIsCollapsed()){E=C.createElement('span');E.style.display='none';E.id=B.EndId;E.setAttribute('_fck_bookmark',true);E.innerHTML=' ';F=this.Clone();F.Collapse(false);F.InsertNode(E);};D=C.createElement('span');D.style.display='none';D.id=B.StartId;D.setAttribute('_fck_bookmark',true);D.innerHTML=' ';F=this.Clone();F.Collapse(true);F.InsertNode(D);if (A){B.StartNode=D;B.EndNode=E;};if (E){this.SetStart(D,4);this.SetEnd(E,3);}else this.MoveToPosition(D,4);return B;},GetBookmarkNode:function(A,B){var C=this.Window.document;if (B) return A.StartNode||C.getElementById(A.StartId);else return A.EndNode||C.getElementById(A.EndId);},MoveToBookmark:function(A,B){var C=this.GetBookmarkNode(A,true);var D=this.GetBookmarkNode(A,false);this.SetStart(C,3);if (!B) FCKDomTools.RemoveNode(C);if (D){this.SetEnd(D,3);if (!B) FCKDomTools.RemoveNode(D);}else this.Collapse(true);this._UpdateElementInfo();},CreateBookmark2:function(){if (!this._Range) return { "Start":0,"End":0 };var A={"Start":[this._Range.startOffset],"End":[this._Range.endOffset]};var B=this._Range.startContainer.previousSibling;var C=this._Range.endContainer.previousSibling;var D=this._Range.startContainer;var E=this._Range.endContainer;while (B&&D.nodeType==3){A.Start[0]+=B.length;D=B;B=B.previousSibling;}while (C&&E.nodeType==3){A.End[0]+=C.length;E=C;C=C.previousSibling;};if (D.nodeType==1&&D.childNodes[A.Start[0]]&&D.childNodes[A.Start[0]].nodeType==3){var F=D.childNodes[A.Start[0]];var G=0;while (F.previousSibling&&F.previousSibling.nodeType==3){F=F.previousSibling;G+=F.length;};D=F;A.Start[0]=G;};if (E.nodeType==1&&E.childNodes[A.End[0]]&&E.childNodes[A.End[0]].nodeType==3){var F=E.childNodes[A.End[0]];var G=0;while (F.previousSibling&&F.previousSibling.nodeType==3){F=F.previousSibling;G+=F.length;};E=F;A.End[0]=G;};A.Start=FCKDomTools.GetNodeAddress(D,true).concat(A.Start);A.End=FCKDomTools.GetNodeAddress(E,true).concat(A.End);return A;},MoveToBookmark2:function(A){var B=FCKDomTools.GetNodeFromAddress(this.Window.document,A.Start.slice(0,-1),true);var C=FCKDomTools.GetNodeFromAddress(this.Window.document,A.End.slice(0,-1),true);this.Release(true);this._Range=new FCKW3CRange(this.Window.document);var D=A.Start[A.Start.length-1];var E=A.End[A.End.length-1];while (B.nodeType==3&&D>B.length){if (!B.nextSibling||B.nextSibling.nodeType!=3) break;D-=B.length;B=B.nextSibling;}while (C.nodeType==3&&E>C.length){if (!C.nextSibling||C.nextSibling.nodeType!=3) break;E-=C.length;C=C.nextSibling;};this._Range.setStart(B,D);this._Range.setEnd(C,E);this._UpdateElementInfo();},MoveToPosition:function(A,B){this.SetStart(A,B);this.Collapse(true);},SetStart:function(A,B,C){var D=this._Range;if (!D) D=this._Range=this.CreateRange();switch(B){case 1:D.setStart(A,0);break;case 2:D.setStart(A,A.childNodes.length);break;case 3:D.setStartBefore(A);break;case 4:D.setStartAfter(A);};if (!C) this._UpdateElementInfo();},SetEnd:function(A,B,C){var D=this._Range;if (!D) D=this._Range=this.CreateRange();switch(B){case 1:D.setEnd(A,0);break;case 2:D.setEnd(A,A.childNodes.length);break;case 3:D.setEndBefore(A);break;case 4:D.setEndAfter(A);};if (!C) this._UpdateElementInfo();},Expand:function(A){var B,oSibling;switch (A){case 'inline_elements':if (this._Range.startOffset==0){B=this._Range.startContainer;if (B.nodeType!=1) B=B.previousSibling?null:B.parentNode;if (B){while (FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){this._Range.setStartBefore(B);if (B!=B.parentNode.firstChild) break;B=B.parentNode;}}};B=this._Range.endContainer;var C=this._Range.endOffset;if ((B.nodeType==3&&C>=B.nodeValue.length)||(B.nodeType==1&&C>=B.childNodes.length)||(B.nodeType!=1&&B.nodeType!=3)){if (B.nodeType!=1) B=B.nextSibling?null:B.parentNode;if (B){while (FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){this._Range.setEndAfter(B);if (B!=B.parentNode.lastChild) break;B=B.parentNode;}}};break;case 'block_contents':case 'list_contents':var D=FCKListsLib.BlockBoundaries;if (A=='list_contents'||FCKConfig.EnterMode=='br') D=FCKListsLib.ListBoundaries;if (this.StartBlock&&FCKConfig.EnterMode!='br'&&A=='block_contents') this.SetStart(this.StartBlock,1);else{B=this._Range.startContainer;if (B.nodeType==1){var E=B.childNodes[this._Range.startOffset];if (E) B=FCKDomTools.GetPreviousSourceNode(E,true);else B=B.lastChild||B;}while (B&&(B.nodeType!=1||(B!=this.StartBlockLimit&&!D[B.nodeName.toLowerCase()]))){this._Range.setStartBefore(B);B=B.previousSibling||B.parentNode;}};if (this.EndBlock&&FCKConfig.EnterMode!='br'&&A=='block_contents'&&this.EndBlock.nodeName.toLowerCase()!='li') this.SetEnd(this.EndBlock,2);else{B=this._Range.endContainer;if (B.nodeType==1) B=B.childNodes[this._Range.endOffset]||B.lastChild;while (B&&(B.nodeType!=1||(B!=this.StartBlockLimit&&!D[B.nodeName.toLowerCase()]))){this._Range.setEndAfter(B);B=B.nextSibling||B.parentNode;};if (B&&B.nodeName.toLowerCase()=='br') this._Range.setEndAfter(B);};this._UpdateElementInfo();}},SplitBlock:function(A){var B=A||FCKConfig.EnterMode;if (!this._Range) this.MoveToSelection();if (this.StartBlockLimit==this.EndBlockLimit){var C=this.StartBlock;var D=this.EndBlock;var E=null;if (B!='br'){if (!C){C=this.FixBlock(true,B);D=this.EndBlock;};if (!D) D=this.FixBlock(false,B);};var F=(C!=null&&this.CheckStartOfBlock());var G=(D!=null&&this.CheckEndOfBlock());if (!this.CheckIsEmpty()) this.DeleteContents();if (C&&D&&C==D){if (G){E=new FCKElementPath(this.StartContainer);this.MoveToPosition(D,4);D=null;}else if (F){E=new FCKElementPath(this.StartContainer);this.MoveToPosition(C,3);C=null;}else{this.SetEnd(C,2);var H=this.ExtractContents();D=C.cloneNode(false);D.removeAttribute('id',false);H.AppendTo(D);FCKDomTools.InsertAfterNode(C,D);this.MoveToPosition(C,4);if (FCKBrowserInfo.IsGecko&&!C.nodeName.IEquals(['ul','ol'])) FCKTools.AppendBogusBr(C);}};return {PreviousBlock:C,NextBlock:D,WasStartOfBlock:F,WasEndOfBlock:G,ElementPath:E};};return null;},FixBlock:function(A,B){var C=this.CreateBookmark();this.Collapse(A);this.Expand('block_contents');var D=this.Window.document.createElement(B);this.ExtractContents().AppendTo(D);FCKDomTools.TrimNode(D);if (FCKDomTools.CheckIsEmptyElement(D,function(element) { return element.getAttribute('_fck_bookmark')!='true';})&&FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(D);this.InsertNode(D);this.MoveToBookmark(C);return D;},Release:function(A){if (!A) this.Window=null;this.StartNode=null;this.StartContainer=null;this.StartBlock=null;this.StartBlockLimit=null;this.EndNode=null;this.EndContainer=null;this.EndBlock=null;this.EndBlockLimit=null;this._Range=null;this._Cache=null;},CheckHasRange:function(){return!!this._Range;},GetTouchedStartNode:function(){var A=this._Range;var B=A.startContainer;if (A.collapsed||B.nodeType!=1) return B;return B.childNodes[A.startOffset]||B;},GetTouchedEndNode:function(){var A=this._Range;var B=A.endContainer;if (A.collapsed||B.nodeType!=1) return B;return B.childNodes[A.endOffset-1]||B;}};
+var FCKDomRange=function(A){this.Window=A;this._Cache={};};FCKDomRange.prototype={_UpdateElementInfo:function(){var A=this._Range;if (!A) this.Release(true);else{var B=A.startContainer;var C=new FCKElementPath(B);this.StartNode=B.nodeType==3?B:B.childNodes[A.startOffset];this.StartContainer=B;this.StartBlock=C.Block;this.StartBlockLimit=C.BlockLimit;if (A.collapsed){this.EndNode=this.StartNode;this.EndContainer=this.StartContainer;this.EndBlock=this.StartBlock;this.EndBlockLimit=this.StartBlockLimit;}else{var D=A.endContainer;if (B!=D) C=new FCKElementPath(D);var E=D;if (A.endOffset==0){while (E&&!E.previousSibling) E=E.parentNode;if (E) E=E.previousSibling;}else if (E.nodeType==1) E=E.childNodes[A.endOffset-1];this.EndNode=E;this.EndContainer=D;this.EndBlock=C.Block;this.EndBlockLimit=C.BlockLimit;}};this._Cache={};},CreateRange:function(){return new FCKW3CRange(this.Window.document);},DeleteContents:function(){if (this._Range){this._Range.deleteContents();this._UpdateElementInfo();}},ExtractContents:function(){if (this._Range){var A=this._Range.extractContents();this._UpdateElementInfo();return A;};return null;},CheckIsCollapsed:function(){if (this._Range) return this._Range.collapsed;return false;},Collapse:function(A){if (this._Range) this._Range.collapse(A);this._UpdateElementInfo();},Clone:function(){var A=FCKTools.CloneObject(this);if (this._Range) A._Range=this._Range.cloneRange();return A;},MoveToNodeContents:function(A){if (!this._Range) this._Range=this.CreateRange();this._Range.selectNodeContents(A);this._UpdateElementInfo();},MoveToElementStart:function(A){this.SetStart(A,1);this.SetEnd(A,1);},MoveToElementEditStart:function(A){var B;while (A&&A.nodeType==1){if (FCKDomTools.CheckIsEditable(A)) B=A;else if (B) break;A=A.firstChild;};if (B) this.MoveToElementStart(B);},InsertNode:function(A){if (this._Range) this._Range.insertNode(A);},CheckIsEmpty:function(){if (this.CheckIsCollapsed()) return true;var A=this.Window.document.createElement('div');this._Range.cloneContents().AppendTo(A);FCKDomTools.TrimNode(A);return (A.innerHTML.length==0);},CheckStartOfBlock:function(){var A=this._Cache;var B=A.IsStartOfBlock;if (B!=undefined) return B;var C=this.StartBlock||this.StartBlockLimit;var D=this._Range.startContainer;var E=this._Range.startOffset;var F;if (E>0){if (D.nodeType==3){var G=D.nodeValue.substr(0,E).Trim();if (G.length!=0) return A.IsStartOfBlock=false;}else F=D.childNodes[E-1];};if (!F) F=FCKDomTools.GetPreviousSourceNode(D,true,null,C);while (F){switch (F.nodeType){case 1:if (!FCKListsLib.InlineChildReqElements[F.nodeName.toLowerCase()]) return A.IsStartOfBlock=false;break;case 3:if (F.nodeValue.Trim().length>0) return A.IsStartOfBlock=false;};F=FCKDomTools.GetPreviousSourceNode(F,false,null,C);};return A.IsStartOfBlock=true;},CheckEndOfBlock:function(A){var B=this._Cache.IsEndOfBlock;if (B!=undefined) return B;var C=this.EndBlock||this.EndBlockLimit;var D=this._Range.endContainer;var E=this._Range.endOffset;var F;if (D.nodeType==3){var G=D.nodeValue;if (E<G.length){G=G.substr(E);if (G.Trim().length!=0) return this._Cache.IsEndOfBlock=false;}}else F=D.childNodes[E];if (!F) F=FCKDomTools.GetNextSourceNode(D,true,null,C);var H=false;while (F){switch (F.nodeType){case 1:var I=F.nodeName.toLowerCase();if (FCKListsLib.InlineChildReqElements[I]) break;if (I=='br'&&!H){H=true;break;};return this._Cache.IsEndOfBlock=false;case 3:if (F.nodeValue.Trim().length>0) return this._Cache.IsEndOfBlock=false;};F=FCKDomTools.GetNextSourceNode(F,false,null,C);};if (A) this.Select();return this._Cache.IsEndOfBlock=true;},CreateBookmark:function(A){var B={StartId:(new Date()).valueOf()+Math.floor(Math.random()*1000)+'S',EndId:(new Date()).valueOf()+Math.floor(Math.random()*1000)+'E'};var C=this.Window.document;var D;var E;var F;if (!this.CheckIsCollapsed()){E=C.createElement('span');E.style.display='none';E.id=B.EndId;E.setAttribute('_fck_bookmark',true);E.innerHTML=' ';F=this.Clone();F.Collapse(false);F.InsertNode(E);};D=C.createElement('span');D.style.display='none';D.id=B.StartId;D.setAttribute('_fck_bookmark',true);D.innerHTML=' ';F=this.Clone();F.Collapse(true);F.InsertNode(D);if (A){B.StartNode=D;B.EndNode=E;};if (E){this.SetStart(D,4);this.SetEnd(E,3);}else this.MoveToPosition(D,4);return B;},GetBookmarkNode:function(A,B){var C=this.Window.document;if (B) return A.StartNode||C.getElementById(A.StartId);else return A.EndNode||C.getElementById(A.EndId);},MoveToBookmark:function(A,B){var C=this.GetBookmarkNode(A,true);var D=this.GetBookmarkNode(A,false);this.SetStart(C,3);if (!B) FCKDomTools.RemoveNode(C);if (D){this.SetEnd(D,3);if (!B) FCKDomTools.RemoveNode(D);}else this.Collapse(true);this._UpdateElementInfo();},CreateBookmark2:function(){if (!this._Range) return { "Start":0,"End":0 };var A={"Start":[this._Range.startOffset],"End":[this._Range.endOffset]};var B=this._Range.startContainer.previousSibling;var C=this._Range.endContainer.previousSibling;var D=this._Range.startContainer;var E=this._Range.endContainer;while (B&&D.nodeType==3){A.Start[0]+=B.length;D=B;B=B.previousSibling;}while (C&&E.nodeType==3){A.End[0]+=C.length;E=C;C=C.previousSibling;};if (D.nodeType==1&&D.childNodes[A.Start[0]]&&D.childNodes[A.Start[0]].nodeType==3){var F=D.childNodes[A.Start[0]];var G=0;while (F.previousSibling&&F.previousSibling.nodeType==3){F=F.previousSibling;G+=F.length;};D=F;A.Start[0]=G;};if (E.nodeType==1&&E.childNodes[A.End[0]]&&E.childNodes[A.End[0]].nodeType==3){var F=E.childNodes[A.End[0]];var G=0;while (F.previousSibling&&F.previousSibling.nodeType==3){F=F.previousSibling;G+=F.length;};E=F;A.End[0]=G;};A.Start=FCKDomTools.GetNodeAddress(D,true).concat(A.Start);A.End=FCKDomTools.GetNodeAddress(E,true).concat(A.End);return A;},MoveToBookmark2:function(A){var B=FCKDomTools.GetNodeFromAddress(this.Window.document,A.Start.slice(0,-1),true);var C=FCKDomTools.GetNodeFromAddress(this.Window.document,A.End.slice(0,-1),true);this.Release(true);this._Range=new FCKW3CRange(this.Window.document);var D=A.Start[A.Start.length-1];var E=A.End[A.End.length-1];while (B.nodeType==3&&D>B.length){if (!B.nextSibling||B.nextSibling.nodeType!=3) break;D-=B.length;B=B.nextSibling;}while (C.nodeType==3&&E>C.length){if (!C.nextSibling||C.nextSibling.nodeType!=3) break;E-=C.length;C=C.nextSibling;};this._Range.setStart(B,D);this._Range.setEnd(C,E);this._UpdateElementInfo();},MoveToPosition:function(A,B){this.SetStart(A,B);this.Collapse(true);},SetStart:function(A,B,C){var D=this._Range;if (!D) D=this._Range=this.CreateRange();switch(B){case 1:D.setStart(A,0);break;case 2:D.setStart(A,A.childNodes.length);break;case 3:D.setStartBefore(A);break;case 4:D.setStartAfter(A);};if (!C) this._UpdateElementInfo();},SetEnd:function(A,B,C){var D=this._Range;if (!D) D=this._Range=this.CreateRange();switch(B){case 1:D.setEnd(A,0);break;case 2:D.setEnd(A,A.childNodes.length);break;case 3:D.setEndBefore(A);break;case 4:D.setEndAfter(A);};if (!C) this._UpdateElementInfo();},Expand:function(A){var B,oSibling;switch (A){case 'inline_elements':if (this._Range.startOffset==0){B=this._Range.startContainer;if (B.nodeType!=1) B=B.previousSibling?null:B.parentNode;if (B){while (FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){this._Range.setStartBefore(B);if (B!=B.parentNode.firstChild) break;B=B.parentNode;}}};B=this._Range.endContainer;var C=this._Range.endOffset;if ((B.nodeType==3&&C>=B.nodeValue.length)||(B.nodeType==1&&C>=B.childNodes.length)||(B.nodeType!=1&&B.nodeType!=3)){if (B.nodeType!=1) B=B.nextSibling?null:B.parentNode;if (B){while (FCKListsLib.InlineNonEmptyElements[B.nodeName.toLowerCase()]){this._Range.setEndAfter(B);if (B!=B.parentNode.lastChild) break;B=B.parentNode;}}};break;case 'block_contents':case 'list_contents':var D=FCKListsLib.BlockBoundaries;if (A=='list_contents'||FCKConfig.EnterMode=='br') D=FCKListsLib.ListBoundaries;if (this.StartBlock&&FCKConfig.EnterMode!='br'&&A=='block_contents') this.SetStart(this.StartBlock,1);else{B=this._Range.startContainer;if (B.nodeType==1){var E=B.childNodes[this._Range.startOffset];if (E) B=FCKDomTools.GetPreviousSourceNode(E,true);else B=B.lastChild||B;}while (B&&(B.nodeType!=1||(B!=this.StartBlockLimit&&!D[B.nodeName.toLowerCase()]))){this._Range.setStartBefore(B);B=B.previousSibling||B.parentNode;}};if (this.EndBlock&&FCKConfig.EnterMode!='br'&&A=='block_contents'&&this.EndBlock.nodeName.toLowerCase()!='li') this.SetEnd(this.EndBlock,2);else{B=this._Range.endContainer;if (B.nodeType==1) B=B.childNodes[this._Range.endOffset]||B.lastChild;while (B&&(B.nodeType!=1||(B!=this.StartBlockLimit&&!D[B.nodeName.toLowerCase()]))){this._Range.setEndAfter(B);B=B.nextSibling||B.parentNode;};if (B&&B.nodeName.toLowerCase()=='br') this._Range.setEndAfter(B);};this._UpdateElementInfo();}},SplitBlock:function(A){var B=A||FCKConfig.EnterMode;if (!this._Range) this.MoveToSelection();if (this.StartBlockLimit==this.EndBlockLimit){var C=this.StartBlock;var D=this.EndBlock;var E=null;if (B!='br'){if (!C){C=this.FixBlock(true,B);D=this.EndBlock;};if (!D) D=this.FixBlock(false,B);};var F=(C!=null&&this.CheckStartOfBlock());var G=(D!=null&&this.CheckEndOfBlock());if (!this.CheckIsEmpty()) this.DeleteContents();if (C&&D&&C==D){if (G){E=new FCKElementPath(this.StartContainer);this.MoveToPosition(D,4);D=null;}else if (F){E=new FCKElementPath(this.StartContainer);this.MoveToPosition(C,3);C=null;}else{this.SetEnd(C,2);var H=this.ExtractContents();D=C.cloneNode(false);D.removeAttribute('id',false);H.AppendTo(D);FCKDomTools.InsertAfterNode(C,D);this.MoveToPosition(C,4);if (FCKBrowserInfo.IsGecko&&!C.nodeName.IEquals(['ul','ol'])) FCKTools.AppendBogusBr(C);}};return {PreviousBlock:C,NextBlock:D,WasStartOfBlock:F,WasEndOfBlock:G,ElementPath:E};};return null;},FixBlock:function(A,B){var C=this.CreateBookmark();this.Collapse(A);this.Expand('block_contents');var D=this.Window.document.createElement(B);this.ExtractContents().AppendTo(D);FCKDomTools.TrimNode(D);if (FCKDomTools.CheckIsEmptyElement(D,function(element) { return element.getAttribute('_fck_bookmark')!='true';})&&FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(D);this.InsertNode(D);this.MoveToBookmark(C);return D;},Release:function(A){if (!A) this.Window=null;this.StartNode=null;this.StartContainer=null;this.StartBlock=null;this.StartBlockLimit=null;this.EndNode=null;this.EndContainer=null;this.EndBlock=null;this.EndBlockLimit=null;this._Range=null;this._Cache=null;},CheckHasRange:function(){return!!this._Range;},GetTouchedStartNode:function(){var A=this._Range;var B=A.startContainer;if (A.collapsed||B.nodeType!=1) return B;return B.childNodes[A.startOffset]||B;},GetTouchedEndNode:function(){var A=this._Range;var B=A.endContainer;if (A.collapsed||B.nodeType!=1) return B;return B.childNodes[A.endOffset-1]||B;}};
FCKDomRange.prototype.MoveToSelection=function(){this.Release(true);this._Range=new FCKW3CRange(this.Window.document);var A=this.Window.document.selection;if (A.type!='Control'){var B=this._GetSelectionMarkerTag(true);var C=this._GetSelectionMarkerTag(false);if (!B&&!C){this._Range.setStart(this.Window.document.body,0);this._UpdateElementInfo();return;};this._Range.setStart(B.parentNode,FCKDomTools.GetIndexOf(B));B.parentNode.removeChild(B);this._Range.setEnd(C.parentNode,FCKDomTools.GetIndexOf(C));C.parentNode.removeChild(C);this._UpdateElementInfo();}else{var D=A.createRange().item(0);if (D){this._Range.setStartBefore(D);this._Range.setEndAfter(D);this._UpdateElementInfo();}}};FCKDomRange.prototype.Select=function(A){if (this._Range) this.SelectBookmark(this.CreateBookmark(true),A);};FCKDomRange.prototype.SelectBookmark=function(A,B){var C=this.CheckIsCollapsed();var D;var E;var F=this.GetBookmarkNode(A,true);if (!F) return;var G;if (!C) G=this.GetBookmarkNode(A,false);var H=this.Window.document.body.createTextRange();H.moveToElementText(F);H.moveStart('character',1);if (G){var I=this.Window.document.body.createTextRange();I.moveToElementText(G);H.setEndPoint('EndToEnd',I);H.moveEnd('character',-1);}else{D=(B||!F.previousSibling||F.previousSibling.nodeName.toLowerCase()=='br')&&!F.nextSibing;E=this.Window.document.createElement('span');E.innerHTML='';F.parentNode.insertBefore(E,F);if (D){F.parentNode.insertBefore(this.Window.document.createTextNode('\ufeff'),F);}};if (!this._Range) this._Range=this.CreateRange();this._Range.setStartBefore(F);F.parentNode.removeChild(F);if (C){if (D){H.moveStart('character',-1);H.select();this.Window.document.selection.clear();}else H.select();FCKDomTools.RemoveNode(E);}else{this._Range.setEndBefore(G);G.parentNode.removeChild(G);H.select();}};FCKDomRange.prototype._GetSelectionMarkerTag=function(A){var B=this.Window.document;var C=B.selection;var D;try{D=C.createRange();}catch (e){return null;};if (D.parentElement().document!=B) return null;D.collapse(A===true);var E='fck_dom_range_temp_'+(new Date()).valueOf()+'_'+Math.floor(Math.random()*1000);D.pasteHTML('<span id="'+E+'"></span>');return B.getElementById(E);};
-var FCKDomRangeIterator=function(A){this.Range=A;this.ForceBrBreak=false;this.EnforceRealBlocks=false;};FCKDomRangeIterator.CreateFromSelection=function(A){var B=new FCKDomRange(A);B.MoveToSelection();return new FCKDomRangeIterator(B);};FCKDomRangeIterator.prototype={GetNextParagraph:function(){var A;var B;var C;var D;var E;var F=this.ForceBrBreak?FCKListsLib.ListBoundaries:FCKListsLib.BlockBoundaries;if (!this._LastNode){var B=this.Range.Clone();B.Expand(this.ForceBrBreak?'list_contents':'block_contents');this._NextNode=B.GetTouchedStartNode();this._LastNode=B.GetTouchedEndNode();B=null;};var H=this._NextNode;var I=this._LastNode;this._NextNode=null;while (H){var J=false;var K=(H.nodeType!=1);var L=false;if (!K){var M=H.nodeName.toLowerCase();if (F[M]&&(!FCKBrowserInfo.IsIE||H.scopeName=='HTML')){if (M=='br') K=true;else if (!B&&H.childNodes.length==0&&M!='hr'){A=H;C=H==I;break;};if (B){B.SetEnd(H,3,true);if (M!='br') this._NextNode=H;};J=true;}else{if (H.firstChild){if (!B){B=new FCKDomRange(this.Range.Window);B.SetStart(H,3,true);};H=H.firstChild;continue;};K=true;}}else if (H.nodeType==3){if (/^[\r\n\t ]+$/.test(H.nodeValue)) K=false;};if (K&&!B){B=new FCKDomRange(this.Range.Window);B.SetStart(H,3,true);};C=((!J||K)&&H==I);if (B&&!J){while (!H.nextSibling&&!C){var N=H.parentNode;if (F[N.nodeName.toLowerCase()]){J=true;C=C||(N==I);break;};H=N;K=true;C=(H==I);L=true;}};if (K) B.SetEnd(H,4,true);if ((J||C)&&B){B._UpdateElementInfo();if (B.StartNode==B.EndNode&&B.StartNode.parentNode==B.StartBlockLimit&&B.StartNode.getAttribute&&B.StartNode.getAttribute('_fck_bookmark')) B=null;else break;};if (C) break;H=FCKDomTools.GetNextSourceNode(H,L,null,I);};if (!A){if (!B){this._NextNode=null;return null;};A=B.StartBlock;if (!A&&!this.EnforceRealBlocks&&B.StartBlockLimit.nodeName.IEquals('DIV','TH','TD')&&B.CheckStartOfBlock()&&B.CheckEndOfBlock()){A=B.StartBlockLimit;}else if (!A||(this.EnforceRealBlocks&&A.nodeName.toLowerCase()=='li')){A=this.Range.Window.document.createElement(FCKConfig.EnterMode=='p'?'p':'div');B.ExtractContents().AppendTo(A);FCKDomTools.TrimNode(A);B.InsertNode(A);D=true;E=true;}else if (A.nodeName.toLowerCase()!='li'){if (!B.CheckStartOfBlock()||!B.CheckEndOfBlock()){A=A.cloneNode(false);B.ExtractContents().AppendTo(A);FCKDomTools.TrimNode(A);var O=B.SplitBlock();D=!O.WasStartOfBlock;E=!O.WasEndOfBlock;B.InsertNode(A);}}else if (!C){this._NextNode=A==I?null:FCKDomTools.GetNextSourceNode(B.EndNode,true,null,I);return A;}};if (D){var P=A.previousSibling;if (P&&P.nodeType==1){if (P.nodeName.toLowerCase()=='br') P.parentNode.removeChild(P);else if (P.lastChild&&P.lastChild.nodeName.IEquals('br')) P.removeChild(P.lastChild);}};if (E){var Q=A.lastChild;if (Q&&Q.nodeType==1&&Q.nodeName.toLowerCase()=='br') A.removeChild(Q);};if (!this._NextNode) this._NextNode=(C||A==I)?null:FCKDomTools.GetNextSourceNode(A,true,null,I);return A;}};
+var FCKDomRangeIterator=function(A){this.Range=A;this.ForceBrBreak=false;this.EnforceRealBlocks=false;};FCKDomRangeIterator.CreateFromSelection=function(A){var B=new FCKDomRange(A);B.MoveToSelection();return new FCKDomRangeIterator(B);};FCKDomRangeIterator.prototype={GetNextParagraph:function(){var A;var B;var C;var D;var E;var F=this.ForceBrBreak?FCKListsLib.ListBoundaries:FCKListsLib.BlockBoundaries;if (!this._LastNode){var B=this.Range.Clone();B.Expand(this.ForceBrBreak?'list_contents':'block_contents');this._NextNode=B.GetTouchedStartNode();this._LastNode=B.GetTouchedEndNode();B=null;};var H=this._NextNode;var I=this._LastNode;this._NextNode=null;while (H){var J=false;var K=(H.nodeType!=1);var L=false;if (!K){var M=H.nodeName.toLowerCase();if (F[M]&&(!FCKBrowserInfo.IsIE||H.scopeName=='HTML')){if (M=='br') K=true;else if (!B&&H.childNodes.length==0&&M!='hr'){A=H;C=H==I;break;};if (B){B.SetEnd(H,3,true);if (M!='br') this._NextNode=FCKDomTools.GetNextSourceNode(H,true,null,I);};J=true;}else{if (H.firstChild){if (!B){B=new FCKDomRange(this.Range.Window);B.SetStart(H,3,true);};H=H.firstChild;continue;};K=true;}}else if (H.nodeType==3){if (/^[\r\n\t ]+$/.test(H.nodeValue)) K=false;};if (K&&!B){B=new FCKDomRange(this.Range.Window);B.SetStart(H,3,true);};C=((!J||K)&&H==I);if (B&&!J){while (!H.nextSibling&&!C){var N=H.parentNode;if (F[N.nodeName.toLowerCase()]){J=true;C=C||(N==I);break;};H=N;K=true;C=(H==I);L=true;}};if (K) B.SetEnd(H,4,true);if ((J||C)&&B){B._UpdateElementInfo();if (B.StartNode==B.EndNode&&B.StartNode.parentNode==B.StartBlockLimit&&B.StartNode.getAttribute&&B.StartNode.getAttribute('_fck_bookmark')) B=null;else break;};if (C) break;H=FCKDomTools.GetNextSourceNode(H,L,null,I);};if (!A){if (!B){this._NextNode=null;return null;};A=B.StartBlock;if (!A&&!this.EnforceRealBlocks&&B.StartBlockLimit.nodeName.IEquals('DIV','TH','TD')&&B.CheckStartOfBlock()&&B.CheckEndOfBlock()){A=B.StartBlockLimit;}else if (!A||(this.EnforceRealBlocks&&A.nodeName.toLowerCase()=='li')){A=this.Range.Window.document.createElement(FCKConfig.EnterMode=='p'?'p':'div');B.ExtractContents().AppendTo(A);FCKDomTools.TrimNode(A);B.InsertNode(A);D=true;E=true;}else if (A.nodeName.toLowerCase()!='li'){if (!B.CheckStartOfBlock()||!B.CheckEndOfBlock()){A=A.cloneNode(false);B.ExtractContents().AppendTo(A);FCKDomTools.TrimNode(A);var O=B.SplitBlock();D=!O.WasStartOfBlock;E=!O.WasEndOfBlock;B.InsertNode(A);}}else if (!C){this._NextNode=A==I?null:FCKDomTools.GetNextSourceNode(B.EndNode,true,null,I);return A;}};if (D){var P=A.previousSibling;if (P&&P.nodeType==1){if (P.nodeName.toLowerCase()=='br') P.parentNode.removeChild(P);else if (P.lastChild&&P.lastChild.nodeName.IEquals('br')) P.removeChild(P.lastChild);}};if (E){var Q=A.lastChild;if (Q&&Q.nodeType==1&&Q.nodeName.toLowerCase()=='br') A.removeChild(Q);};if (!this._NextNode) this._NextNode=(C||A==I)?null:FCKDomTools.GetNextSourceNode(A,true,null,I);return A;}};
var FCKDocumentFragment=function(A){this._Document=A;this.RootNode=A.createElement('div');};FCKDocumentFragment.prototype={AppendTo:function(A){FCKDomTools.MoveChildren(this.RootNode,A);},AppendHtml:function(A){var B=this._Document.createElement('div');B.innerHTML=A;FCKDomTools.MoveChildren(B,this.RootNode);},InsertAfterNode:function(A){var B=this.RootNode;var C;while((C=B.lastChild)) FCKDomTools.InsertAfterNode(A,B.removeChild(C));}};
var FCKW3CRange=function(A){this._Document=A;this.startContainer=null;this.startOffset=null;this.endContainer=null;this.endOffset=null;this.collapsed=true;};FCKW3CRange.CreateRange=function(A){return new FCKW3CRange(A);};FCKW3CRange.CreateFromRange=function(A,B){var C=FCKW3CRange.CreateRange(A);C.setStart(B.startContainer,B.startOffset);C.setEnd(B.endContainer,B.endOffset);return C;};FCKW3CRange.prototype={_UpdateCollapsed:function(){this.collapsed=(this.startContainer==this.endContainer&&this.startOffset==this.endOffset);},setStart:function(A,B){this.startContainer=A;this.startOffset=B;if (!this.endContainer){this.endContainer=A;this.endOffset=B;};this._UpdateCollapsed();},setEnd:function(A,B){this.endContainer=A;this.endOffset=B;if (!this.startContainer){this.startContainer=A;this.startOffset=B;};this._UpdateCollapsed();},setStartAfter:function(A){this.setStart(A.parentNode,FCKDomTools.GetIndexOf(A)+1);},setStartBefore:function(A){this.setStart(A.parentNode,FCKDomTools.GetIndexOf(A));},setEndAfter:function(A){this.setEnd(A.parentNode,FCKDomTools.GetIndexOf(A)+1);},setEndBefore:function(A){this.setEnd(A.parentNode,FCKDomTools.GetIndexOf(A));},collapse:function(A){if (A){this.endContainer=this.startContainer;this.endOffset=this.startOffset;}else{this.startContainer=this.endContainer;this.startOffset=this.endOffset;};this.collapsed=true;},selectNodeContents:function(A){this.setStart(A,0);this.setEnd(A,A.nodeType==3?A.data.length:A.childNodes.length);},insertNode:function(A){var B=this.startContainer;var C=this.startOffset;if (B.nodeType==3){B.splitText(C);if (B==this.endContainer) this.setEnd(B.nextSibling,this.endOffset-this.startOffset);FCKDomTools.InsertAfterNode(B,A);return;}else{B.insertBefore(A,B.childNodes[C]||null);if (B==this.endContainer){this.endOffset++;this.collapsed=false;}}},deleteContents:function(){if (this.collapsed) return;this._ExecContentsAction(0);},extractContents:function(){var A=new FCKDocumentFragment(this._Document);if (!this.collapsed) this._ExecContentsAction(1,A);return A;},cloneContents:function(){var A=new FCKDocumentFragment(this._Document);if (!this.collapsed) this._ExecContentsAction(2,A);return A;},_ExecContentsAction:function(A,B){var C=this.startContainer;var D=this.endContainer;var E=this.startOffset;var F=this.endOffset;var G=false;var H=false;if (D.nodeType==3) D=D.splitText(F);else{if (D.childNodes.length>0){if (F>D.childNodes.length-1){D=FCKDomTools.InsertAfterNode(D.lastChild,this._Document.createTextNode(''));H=true;}else D=D.childNodes[F];}};if (C.nodeType==3){C.splitText(E);if (C==D) D=C.nextSibling;}else{if (E==0){C=C.insertBefore(this._Document.createTextNode(''),C.firstChild);G=true;}else if (E>C.childNodes.length-1){C=C.appendChild(this._Document.createTextNode(''));G=true;}else C=C.childNodes[E].previousSibling;};var I=FCKDomTools.GetParents(C);var J=FCKDomTools.GetParents(D);var i,topStart,topEnd;for (i=0;i<I.length;i++){topStart=I[i];topEnd=J[i];if (topStart!=topEnd) break;};var K,levelStartNode,levelClone,currentNode,currentSibling;if (B) K=B.RootNode;for (var j=i;j<I.length;j++){levelStartNode=I[j];if (K&&levelStartNode!=C) levelClone=K.appendChild(levelStartNode.cloneNode(levelStartNode==C));currentNode=levelStartNode.nextSibling;while(currentNode){if (currentNode==J[j]||currentNode==D) break;currentSibling=currentNode.nextSibling;if (A==2) K.appendChild(currentNode.cloneNode(true));else{currentNode.parentNode.removeChild(currentNode);if (A==1) K.appendChild(currentNode);};currentNode=currentSibling;};if (K) K=levelClone;};if (B) K=B.RootNode;for (var k=i;k<J.length;k++){levelStartNode=J[k];if (A>0&&levelStartNode!=D) levelClone=K.appendChild(levelStartNode.cloneNode(levelStartNode==D));if (!I[k]||levelStartNode.parentNode!=I[k].parentNode){currentNode=levelStartNode.previousSibling;while(currentNode){if (currentNode==I[k]||currentNode==C) break;currentSibling=currentNode.previousSibling;if (A==2) K.insertBefore(currentNode.cloneNode(true),K.firstChild);else{currentNode.parentNode.removeChild(currentNode);if (A==1) K.insertBefore(currentNode,K.firstChild);};currentNode=currentSibling;}};if (K) K=levelClone;};if (A==2){var L=this.startContainer;if (L.nodeType==3){L.data+=L.nextSibling.data;L.parentNode.removeChild(L.nextSibling);};var M=this.endContainer;if (M.nodeType==3&&M.nextSibling){M.data+=M.nextSibling.data;M.parentNode.removeChild(M.nextSibling);}}else{if (topStart&&topEnd&&(C.parentNode!=topStart.parentNode||D.parentNode!=topEnd.parentNode)){var N=FCKDomTools.GetIndexOf(topEnd);if (G&&topEnd.parentNode==C.parentNode) N--;this.setStart(topEnd.parentNode,N);};this.collapse(true);};if(G) C.parentNode.removeChild(C);if(H&&D.parentNode) D.parentNode.removeChild(D);},cloneRange:function(){return FCKW3CRange.CreateFromRange(this._Document,this);}};
-var FCKEnterKey=function(A,B,C,D){this.Window=A;this.EnterMode=B||'p';this.ShiftEnterMode=C||'br';var E=new FCKKeystrokeHandler(false);E._EnterKey=this;E.OnKeystroke=FCKEnterKey_OnKeystroke;E.SetKeystrokes([[13,'Enter'],[SHIFT+13,'ShiftEnter'],[8,'Backspace'],[CTRL+8,'CtrlBackspace'],[46,'Delete']]);this.TabText='';if (D>0||FCKBrowserInfo.IsSafari){while (D--) this.TabText+='\xa0';E.SetKeystrokes([9,'Tab']);};E.AttachToElement(A.document);};function FCKEnterKey_OnKeystroke(A,B){var C=this._EnterKey;try{switch (B){case 'Enter':return C.DoEnter();break;case 'ShiftEnter':return C.DoShiftEnter();break;case 'Backspace':return C.DoBackspace();break;case 'Delete':return C.DoDelete();break;case 'Tab':return C.DoTab();break;case 'CtrlBackspace':return C.DoCtrlBackspace();break;}}catch (e){};return false;};FCKEnterKey.prototype.DoEnter=function(A,B){FCKUndo.SaveUndoStep();this._HasShift=(B===true);var C=FCKSelection.GetParentElement();var D=new FCKElementPath(C);var E=A||this.EnterMode;if (E=='br'||D.Block&&D.Block.tagName.toLowerCase()=='pre') return this._ExecuteEnterBr();else return this._ExecuteEnterBlock(E);};FCKEnterKey.prototype.DoShiftEnter=function(){return this.DoEnter(this.ShiftEnterMode,true);};FCKEnterKey.prototype.DoBackspace=function(){var A=false;var B=new FCKDomRange(this.Window);B.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(B,this.Window.document.body)){this._FixIESelectAllBug(B);return true;};var C=B.CheckIsCollapsed();if (!C){if (FCKBrowserInfo.IsIE&&this.Window.document.selection.type.toLowerCase()=="control"){var D=this.Window.document.selection.createRange();for (var i=D.length-1;i>=0;i--){var E=D.item(i);E.parentNode.removeChild(E);};return true;};return false;};if (FCKBrowserInfo.IsIE){var F=FCKDomTools.GetPreviousSourceElement(B.StartNode,true);if (F&&F.nodeName.toLowerCase()=='br'){var G=B.Clone();G.SetStart(F,4);if (G.CheckIsEmpty()){F.parentNode.removeChild(F);return true;}}};var H=B.StartBlock;var I=B.EndBlock;if (B.StartBlockLimit==B.EndBlockLimit&&H&&I){if (!C){var J=B.CheckEndOfBlock();B.DeleteContents();if (H!=I){B.SetStart(I,1);B.SetEnd(I,1);};B.Select();A=(H==I);};if (B.CheckStartOfBlock()){var K=B.StartBlock;var L=FCKDomTools.GetPreviousSourceElement(K,true,['BODY',B.StartBlockLimit.nodeName],['UL','OL']);A=this._ExecuteBackspace(B,L,K);}else if (FCKBrowserInfo.IsGeckoLike){B.Select();}};B.Release();return A;};FCKEnterKey.prototype.DoCtrlBackspace=function(){FCKUndo.SaveUndoStep();var A=new FCKDomRange(this.Window);A.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(A,this.Window.document.body)){this._FixIESelectAllBug(A);return true;};return false;};FCKEnterKey.prototype._ExecuteBackspace=function(A,B,C){var D=false;if (!B&&C&&C.nodeName.IEquals('LI')&&C.parentNode.parentNode.nodeName.IEquals('LI')){this._OutdentWithSelection(C,A);return true;};if (B&&B.nodeName.IEquals('LI')){var E=FCKDomTools.GetLastChild(B,['UL','OL']);while (E){B=FCKDomTools.GetLastChild(E,'LI');E=FCKDomTools.GetLastChild(B,['UL','OL']);}};if (B&&C){if (C.nodeName.IEquals('LI')&&!B.nodeName.IEquals('LI')){this._OutdentWithSelection(C,A);return true;};var F=C.parentNode;var G=B.nodeName.toLowerCase();if (FCKListsLib.EmptyElements[G]!=null||G=='table'){FCKDomTools.RemoveNode(B);D=true;}else{FCKDomTools.RemoveNode(C);while (F.innerHTML.Trim().length==0){var H=F.parentNode;H.removeChild(F);F=H;};FCKDomTools.LTrimNode(C);FCKDomTools.RTrimNode(B);A.SetStart(B,2,true);A.Collapse(true);var I=A.CreateBookmark(true);if (!C.tagName.IEquals(['TABLE'])) FCKDomTools.MoveChildren(C,B);A.SelectBookmark(I);D=true;}};return D;};FCKEnterKey.prototype.DoDelete=function(){FCKUndo.SaveUndoStep();var A=false;var B=new FCKDomRange(this.Window);B.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(B,this.Window.document.body)){this._FixIESelectAllBug(B);return true;};if (B.CheckIsCollapsed()&&B.CheckEndOfBlock(FCKBrowserInfo.IsGeckoLike)){var C=B.StartBlock;var D=FCKTools.GetElementAscensor(C,'td');var E=FCKDomTools.GetNextSourceElement(C,true,[B.StartBlockLimit.nodeName],['UL','OL','TR'],true);if (D){var F=FCKTools.GetElementAscensor(E,'td');if (F!=D) return true;};A=this._ExecuteBackspace(B,C,E);};B.Release();return A;};FCKEnterKey.prototype.DoTab=function(){var A=new FCKDomRange(this.Window);A.MoveToSelection();var B=A._Range.startContainer;while (B){if (B.nodeType==1){var C=B.tagName.toLowerCase();if (C=="tr"||C=="td"||C=="th"||C=="tbody"||C=="table") return false;else break;};B=B.parentNode;};if (this.TabText){A.DeleteContents();A.InsertNode(this.Window.document.createTextNode(this.TabText));A.Collapse(false);A.Select();};return true;};FCKEnterKey.prototype._ExecuteEnterBlock=function(A,B){var C=B||new FCKDomRange(this.Window);var D=C.SplitBlock(A);if (D){var E=D.PreviousBlock;var F=D.NextBlock;var G=D.WasStartOfBlock;var H=D.WasEndOfBlock;if (F){if (F.parentNode.nodeName.IEquals('li')){FCKDomTools.BreakParent(F,F.parentNode);FCKDomTools.MoveNode(F,F.nextSibling,true);}}else if (E&&E.parentNode.nodeName.IEquals('li')){FCKDomTools.BreakParent(E,E.parentNode);C.MoveToElementEditStart(E.nextSibling);FCKDomTools.MoveNode(E,E.previousSibling);};if (!G&&!H){if (F.nodeName.IEquals('li')&&F.firstChild&&F.firstChild.nodeName.IEquals(['ul','ol'])) F.insertBefore(FCKTools.GetElementDocument(F).createTextNode('\xa0'),F.firstChild);if (F) C.MoveToElementEditStart(F);}else{if (G&&H&&E.tagName.toUpperCase()=='LI'){C.MoveToElementStart(E);this._OutdentWithSelection(E,C);C.Release();return true;};var I;if (E){var J=E.tagName.toUpperCase();if (!this._HasShift&&!(/^H[1-6]$/).test(J)){I=FCKDomTools.CloneElement(E);}}else if (F) I=FCKDomTools.CloneElement(F);if (!I) I=this.Window.document.createElement(A);var K=D.ElementPath;if (K){for (var i=0,len=K.Elements.length;i<len;i++){var L=K.Elements[i];if (L==K.Block||L==K.BlockLimit) break;if (FCKListsLib.InlineChildReqElements[L.nodeName.toLowerCase()]){L=FCKDomTools.CloneElement(L);FCKDomTools.MoveChildren(I,L);I.appendChild(L);}}};if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(I);C.InsertNode(I);if (FCKBrowserInfo.IsIE){C.MoveToElementEditStart(I);C.Select();};C.MoveToElementEditStart(G&&!H?F:I);};if (FCKBrowserInfo.IsGeckoLike) FCKDomTools.ScrollIntoView(F||I,false);C.Select();};C.Release();return true;};FCKEnterKey.prototype._ExecuteEnterBr=function(A){var B=new FCKDomRange(this.Window);B.MoveToSelection();if (B.StartBlockLimit==B.EndBlockLimit){B.DeleteContents();B.MoveToSelection();var C=B.CheckStartOfBlock();var D=B.CheckEndOfBlock();var E=B.StartBlock?B.StartBlock.tagName.toUpperCase():'';var F=this._HasShift;var G=false;if (!F&&E=='LI') return this._ExecuteEnterBlock(null,B);if (!F&&D&&(/^H[1-6]$/).test(E)){FCKDomTools.InsertAfterNode(B.StartBlock,this.Window.document.createElement('br'));if (FCKBrowserInfo.IsGecko) FCKDomTools.InsertAfterNode(B.StartBlock,this.Window.document.createTextNode(''));B.SetStart(B.StartBlock.nextSibling,FCKBrowserInfo.IsIE?3:1);}else{var H;G=E.IEquals('pre');if (G) H=this.Window.document.createTextNode(FCKBrowserInfo.IsIE?'\r':'\n');else H=this.Window.document.createElement('br');B.InsertNode(H);if (FCKBrowserInfo.IsGecko) FCKDomTools.InsertAfterNode(H,this.Window.document.createTextNode(''));if (D&&FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(H.parentNode);if (FCKBrowserInfo.IsIE) B.SetStart(H,4);else B.SetStart(H.nextSibling,1);if (!FCKBrowserInfo.IsIE){var I=null;if (FCKBrowserInfo.IsOpera) I=this.Window.document.createElement('span');else I=this.Window.document.createElement('br');H.parentNode.insertBefore(I,H.nextSibling);if (FCKBrowserInfo.IsSafari) FCKDomTools.ScrollIntoView(I,false);else I.scrollIntoView(false);I.parentNode.removeChild(I);}};B.Collapse(true);B.Select(G);};B.Release();return true;};FCKEnterKey.prototype._OutdentWithSelection=function(A,B){var C=B.CreateBookmark();FCKListHandler.OutdentListItem(A);B.MoveToBookmark(C);B.Select();};FCKEnterKey.prototype._CheckIsAllContentsIncluded=function(A,B){var C=false;var D=false;if (A.StartContainer==B||A.StartContainer==B.firstChild) C=(A._Range.startOffset==0);if (A.EndContainer==B||A.EndContainer==B.lastChild){var E=A.EndContainer.nodeType==3?A.EndContainer.length:A.EndContainer.childNodes.length;D=(A._Range.endOffset==E);};return C&&D;};FCKEnterKey.prototype._FixIESelectAllBug=function(A){var B=this.Window.document;B.body.innerHTML='';var C;if (FCKConfig.EnterMode.IEquals(['div','p'])){C=B.createElement(FCKConfig.EnterMode);B.body.appendChild(C);}else C=B.body;A.MoveToNodeContents(C);A.Collapse(true);A.Select();A.Release();};
-var FCKDocumentProcessor={};FCKDocumentProcessor._Items=[];FCKDocumentProcessor.AppendNew=function(){var A={};this._Items.AddItem(A);return A;};FCKDocumentProcessor.Process=function(A){var B=FCK.IsDirty();var C,i=0;while((C=this._Items[i++])) C.ProcessDocument(A);if (!B) FCK.ResetIsDirty();};var FCKDocumentProcessor_CreateFakeImage=function(A,B){var C=FCKTools.GetElementDocument(B).createElement('IMG');C.className=A;C.src=FCKConfig.BasePath+'images/spacer.gif';C.setAttribute('_fckfakelement','true',0);C.setAttribute('_fckrealelement',FCKTempBin.AddElement(B),0);return C;};if (FCKBrowserInfo.IsIE||FCKBrowserInfo.IsOpera){var FCKAnchorsProcessor=FCKDocumentProcessor.AppendNew();FCKAnchorsProcessor.ProcessDocument=function(A){var B=A.getElementsByTagName('A');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){if (C.name.length>0){if (C.innerHTML!==''){if (FCKBrowserInfo.IsIE) C.className+=' FCK__AnchorC';}else{var D=FCKDocumentProcessor_CreateFakeImage('FCK__Anchor',C.cloneNode(true));D.setAttribute('_fckanchor','true',0);C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}}}};var FCKPageBreaksProcessor=FCKDocumentProcessor.AppendNew();FCKPageBreaksProcessor.ProcessDocument=function(A){var B=A.getElementsByTagName('DIV');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){if (C.style.pageBreakAfter=='always'&&C.childNodes.length==1&&C.childNodes[0].style&&C.childNodes[0].style.display=='none'){var D=FCKDocumentProcessor_CreateFakeImage('FCK__PageBreak',C.cloneNode(true));C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}};FCKEmbedAndObjectProcessor=(function(){var A=[];var B=function(el){var C=el.cloneNode(true);var D;var E=D=FCKDocumentProcessor_CreateFakeImage('FCK__UnknownObject',C);FCKEmbedAndObjectProcessor.RefreshView(E,el);for (var i=0;i<A.length;i++) D=A[i](el,D)||D;if (D!=E) FCKTempBin.RemoveElement(E.getAttribute('_fckrealelement'));el.parentNode.replaceChild(D,el);};return FCKTools.Merge(FCKDocumentProcessor.AppendNew(),{ProcessDocument:function(doc){FCKTools.RunFunction(function(){var F=doc.getElementsByTagName('object');for (var i=F.length-1;i>=0;i--) B(F[i]);var G=doc.getElementsByTagName('embed');for (var i=G.length-1;i>=0;i--) B(G[i]);});},RefreshView:function(placeHolder,original){if (original.getAttribute('width')>0) placeHolder.style.width=FCKTools.ConvertHtmlSizeToStyle(original.getAttribute('width'));if (original.getAttribute('height')>0) placeHolder.style.height=FCKTools.ConvertHtmlSizeToStyle(original.getAttribute('height'));},AddCustomHandler:function(func){A.push(func);}});})();FCK.GetRealElement=function(A){var e=FCKTempBin.Elements[A.getAttribute('_fckrealelement')];if (A.getAttribute('_fckflash')){if (A.style.width.length>0) e.width=FCKTools.ConvertStyleSizeToHtml(A.style.width);if (A.style.height.length>0) e.height=FCKTools.ConvertStyleSizeToHtml(A.style.height);};return e;};if (FCKBrowserInfo.IsIE){FCKDocumentProcessor.AppendNew().ProcessDocument=function(A){var B=A.getElementsByTagName('HR');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){var D=A.createElement('hr');D.mergeAttributes(C,true);FCKDomTools.InsertAfterNode(C,D);C.parentNode.removeChild(C);}}};FCKDocumentProcessor.AppendNew().ProcessDocument=function(A){var B=A.getElementsByTagName('INPUT');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){if (C.type=='hidden'){var D=FCKDocumentProcessor_CreateFakeImage('FCK__InputHidden',C.cloneNode(true));D.setAttribute('_fckinputhidden','true',0);C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}};FCKEmbedAndObjectProcessor.AddCustomHandler(function(A,B){if (!(A.nodeName.IEquals('embed')&&(A.type=='application/x-shockwave-flash'||/\.swf($|#|\?)/i.test(A.src)))) return;B.className='FCK__Flash';B.setAttribute('_fckflash','true',0);});if (FCKBrowserInfo.IsSafari){FCKDocumentProcessor.AppendNew().ProcessDocument=function(A){var B=A.getElementsByClassName?A.getElementsByClassName('Apple-style-span'):Array.prototype.filter.call(A.getElementsByTagName('span'),function(item){ return item.className=='Apple-style-span';});for (var i=B.length-1;i>=0;i--) FCKDomTools.RemoveNode(B[i],true);}};
+var FCKEnterKey=function(A,B,C,D){this.Window=A;this.EnterMode=B||'p';this.ShiftEnterMode=C||'br';var E=new FCKKeystrokeHandler(false);E._EnterKey=this;E.OnKeystroke=FCKEnterKey_OnKeystroke;E.SetKeystrokes([[13,'Enter'],[SHIFT+13,'ShiftEnter'],[8,'Backspace'],[CTRL+8,'CtrlBackspace'],[46,'Delete']]);this.TabText='';if (D>0||FCKBrowserInfo.IsSafari){while (D--) this.TabText+='\xa0';E.SetKeystrokes([9,'Tab']);};E.AttachToElement(A.document);};function FCKEnterKey_OnKeystroke(A,B){var C=this._EnterKey;try{switch (B){case 'Enter':return C.DoEnter();break;case 'ShiftEnter':return C.DoShiftEnter();break;case 'Backspace':return C.DoBackspace();break;case 'Delete':return C.DoDelete();break;case 'Tab':return C.DoTab();break;case 'CtrlBackspace':return C.DoCtrlBackspace();break;}}catch (e){};return false;};FCKEnterKey.prototype.DoEnter=function(A,B){FCKUndo.SaveUndoStep();this._HasShift=(B===true);var C=FCKSelection.GetParentElement();var D=new FCKElementPath(C);var E=A||this.EnterMode;if (E=='br'||D.Block&&D.Block.tagName.toLowerCase()=='pre') return this._ExecuteEnterBr();else return this._ExecuteEnterBlock(E);};FCKEnterKey.prototype.DoShiftEnter=function(){return this.DoEnter(this.ShiftEnterMode,true);};FCKEnterKey.prototype.DoBackspace=function(){var A=false;var B=new FCKDomRange(this.Window);B.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(B,this.Window.document.body)){this._FixIESelectAllBug(B);return true;};var C=B.CheckIsCollapsed();if (!C){if (FCKBrowserInfo.IsIE&&this.Window.document.selection.type.toLowerCase()=="control"){var D=this.Window.document.selection.createRange();for (var i=D.length-1;i>=0;i--){var E=D.item(i);E.parentNode.removeChild(E);};return true;};return false;};if (FCKBrowserInfo.IsIE){var F=FCKDomTools.GetPreviousSourceElement(B.StartNode,true);if (F&&F.nodeName.toLowerCase()=='br'){var G=B.Clone();G.SetStart(F,4);if (G.CheckIsEmpty()){F.parentNode.removeChild(F);return true;}}};var H=B.StartBlock;var I=B.EndBlock;if (B.StartBlockLimit==B.EndBlockLimit&&H&&I){if (!C){var J=B.CheckEndOfBlock();B.DeleteContents();if (H!=I){B.SetStart(I,1);B.SetEnd(I,1);};B.Select();A=(H==I);};if (B.CheckStartOfBlock()){var K=B.StartBlock;var L=FCKDomTools.GetPreviousSourceElement(K,true,['BODY',B.StartBlockLimit.nodeName],['UL','OL']);A=this._ExecuteBackspace(B,L,K);}else if (FCKBrowserInfo.IsGeckoLike){B.Select();}};B.Release();return A;};FCKEnterKey.prototype.DoCtrlBackspace=function(){FCKUndo.SaveUndoStep();var A=new FCKDomRange(this.Window);A.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(A,this.Window.document.body)){this._FixIESelectAllBug(A);return true;};return false;};FCKEnterKey.prototype._ExecuteBackspace=function(A,B,C){var D=false;if (!B&&C&&C.nodeName.IEquals('LI')&&C.parentNode.parentNode.nodeName.IEquals('LI')){this._OutdentWithSelection(C,A);return true;};if (B&&B.nodeName.IEquals('LI')){var E=FCKDomTools.GetLastChild(B,['UL','OL']);while (E){B=FCKDomTools.GetLastChild(E,'LI');E=FCKDomTools.GetLastChild(B,['UL','OL']);}};if (B&&C){if (C.nodeName.IEquals('LI')&&!B.nodeName.IEquals('LI')){this._OutdentWithSelection(C,A);return true;};var F=C.parentNode;var G=B.nodeName.toLowerCase();if (FCKListsLib.EmptyElements[G]!=null||G=='table'){FCKDomTools.RemoveNode(B);D=true;}else{FCKDomTools.RemoveNode(C);while (F.innerHTML.Trim().length==0){var H=F.parentNode;H.removeChild(F);F=H;};FCKDomTools.LTrimNode(C);FCKDomTools.RTrimNode(B);A.SetStart(B,2,true);A.Collapse(true);var I=A.CreateBookmark(true);if (!C.tagName.IEquals(['TABLE'])) FCKDomTools.MoveChildren(C,B);A.SelectBookmark(I);D=true;}};return D;};FCKEnterKey.prototype.DoDelete=function(){FCKUndo.SaveUndoStep();var A=false;var B=new FCKDomRange(this.Window);B.MoveToSelection();if (FCKBrowserInfo.IsIE&&this._CheckIsAllContentsIncluded(B,this.Window.document.body)){this._FixIESelectAllBug(B);return true;};if (B.CheckIsCollapsed()&&B.CheckEndOfBlock(FCKBrowserInfo.IsGeckoLike)){var C=B.StartBlock;var D=FCKTools.GetElementAscensor(C,'td');var E=FCKDomTools.GetNextSourceElement(C,true,[B.StartBlockLimit.nodeName],['UL','OL','TR'],true);if (D){var F=FCKTools.GetElementAscensor(E,'td');if (F!=D) return true;};A=this._ExecuteBackspace(B,C,E);};B.Release();return A;};FCKEnterKey.prototype.DoTab=function(){var A=new FCKDomRange(this.Window);A.MoveToSelection();var B=A._Range.startContainer;while (B){if (B.nodeType==1){var C=B.tagName.toLowerCase();if (C=="tr"||C=="td"||C=="th"||C=="tbody"||C=="table") return false;else break;};B=B.parentNode;};if (this.TabText){A.DeleteContents();A.InsertNode(this.Window.document.createTextNode(this.TabText));A.Collapse(false);A.Select();};return true;};FCKEnterKey.prototype._ExecuteEnterBlock=function(A,B){var C=B||new FCKDomRange(this.Window);var D=C.SplitBlock(A);if (D){var E=D.PreviousBlock;var F=D.NextBlock;var G=D.WasStartOfBlock;var H=D.WasEndOfBlock;if (F){if (F.parentNode.nodeName.IEquals('li')){FCKDomTools.BreakParent(F,F.parentNode);FCKDomTools.MoveNode(F,F.nextSibling,true);}}else if (E&&E.parentNode.nodeName.IEquals('li')){FCKDomTools.BreakParent(E,E.parentNode);C.MoveToElementEditStart(E.nextSibling);FCKDomTools.MoveNode(E,E.previousSibling);};if (!G&&!H){if (F.nodeName.IEquals('li')&&F.firstChild&&F.firstChild.nodeName.IEquals(['ul','ol'])) F.insertBefore(FCKTools.GetElementDocument(F).createTextNode('\xa0'),F.firstChild);if (F) C.MoveToElementEditStart(F);}else{if (G&&H&&E.tagName.toUpperCase()=='LI'){C.MoveToElementStart(E);this._OutdentWithSelection(E,C);C.Release();return true;};var I;if (E){var J=E.tagName.toUpperCase();if (!this._HasShift&&!(/^H[1-6]$/).test(J)){I=FCKDomTools.CloneElement(E);}}else if (F) I=FCKDomTools.CloneElement(F);if (!I) I=this.Window.document.createElement(A);var K=D.ElementPath;if (K){for (var i=0,len=K.Elements.length;i<len;i++){var L=K.Elements[i];if (L==K.Block||L==K.BlockLimit) break;if (FCKListsLib.InlineChildReqElements[L.nodeName.toLowerCase()]){L=FCKDomTools.CloneElement(L);FCKDomTools.MoveChildren(I,L);I.appendChild(L);}}};if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(I);C.InsertNode(I);if (FCKBrowserInfo.IsIE){C.MoveToElementEditStart(I);C.Select();};C.MoveToElementEditStart(G&&!H?F:I);};if (FCKBrowserInfo.IsGeckoLike) FCKDomTools.ScrollIntoView(F||I,false);C.Select();};C.Release();return true;};FCKEnterKey.prototype._ExecuteEnterBr=function(A){var B=new FCKDomRange(this.Window);B.MoveToSelection();if (B.StartBlockLimit==B.EndBlockLimit){B.DeleteContents();B.MoveToSelection();var C=B.CheckStartOfBlock();var D=B.CheckEndOfBlock();var E=B.StartBlock?B.StartBlock.tagName.toUpperCase():'';var F=this._HasShift;var G=false;if (!F&&E=='LI') return this._ExecuteEnterBlock(null,B);if (!F&&D&&(/^H[1-6]$/).test(E)){FCKDomTools.InsertAfterNode(B.StartBlock,this.Window.document.createElement('br'));if (FCKBrowserInfo.IsGecko) FCKDomTools.InsertAfterNode(B.StartBlock,this.Window.document.createTextNode(''));B.SetStart(B.StartBlock.nextSibling,FCKBrowserInfo.IsIE?3:1);}else{var H;G=E.IEquals('pre');if (G) H=this.Window.document.createTextNode(FCKBrowserInfo.IsIE?'\r':'\n');else H=this.Window.document.createElement('br');B.InsertNode(H);if (FCKBrowserInfo.IsGecko) FCKDomTools.InsertAfterNode(H,this.Window.document.createTextNode(''));if (D&&FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(H.parentNode);if (FCKBrowserInfo.IsIE) B.SetStart(H,4);else B.SetStart(H.nextSibling,1);if (!FCKBrowserInfo.IsIE){var I=null;if (FCKBrowserInfo.IsOpera) I=this.Window.document.createElement('span');else I=this.Window.document.createElement('br');H.parentNode.insertBefore(I,H.nextSibling);FCKDomTools.ScrollIntoView(I,false);I.parentNode.removeChild(I);}};B.Collapse(true);B.Select(G);};B.Release();return true;};FCKEnterKey.prototype._OutdentWithSelection=function(A,B){var C=B.CreateBookmark();FCKListHandler.OutdentListItem(A);B.MoveToBookmark(C);B.Select();};FCKEnterKey.prototype._CheckIsAllContentsIncluded=function(A,B){var C=false;var D=false;if (A.StartContainer==B||A.StartContainer==B.firstChild) C=(A._Range.startOffset==0);if (A.EndContainer==B||A.EndContainer==B.lastChild){var E=A.EndContainer.nodeType==3?A.EndContainer.length:A.EndContainer.childNodes.length;D=(A._Range.endOffset==E);};return C&&D;};FCKEnterKey.prototype._FixIESelectAllBug=function(A){var B=this.Window.document;B.body.innerHTML='';var C;if (FCKConfig.EnterMode.IEquals(['div','p'])){C=B.createElement(FCKConfig.EnterMode);B.body.appendChild(C);}else C=B.body;A.MoveToNodeContents(C);A.Collapse(true);A.Select();A.Release();};
+var FCKDocumentProcessor={};FCKDocumentProcessor._Items=[];FCKDocumentProcessor.AppendNew=function(){var A={};this._Items.AddItem(A);return A;};FCKDocumentProcessor.Process=function(A){var B=FCK.IsDirty();var C,i=0;while((C=this._Items[i++])) C.ProcessDocument(A);if (!B) FCK.ResetIsDirty();};var FCKDocumentProcessor_CreateFakeImage=function(A,B){var C=FCKTools.GetElementDocument(B).createElement('IMG');C.className=A;C.src=FCKConfig.BasePath+'images/spacer.gif';C.setAttribute('_fckfakelement','true',0);C.setAttribute('_fckrealelement',FCKTempBin.AddElement(B),0);return C;};if (FCKBrowserInfo.IsIE||FCKBrowserInfo.IsOpera){var FCKAnchorsProcessor=FCKDocumentProcessor.AppendNew();FCKAnchorsProcessor.ProcessDocument=function(A){var B=A.getElementsByTagName('A');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){if (C.name.length>0){if (C.innerHTML!==''){if (FCKBrowserInfo.IsIE) C.className+=' FCK__AnchorC';}else{var D=FCKDocumentProcessor_CreateFakeImage('FCK__Anchor',C.cloneNode(true));D.setAttribute('_fckanchor','true',0);C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}}}};var FCKPageBreaksProcessor=FCKDocumentProcessor.AppendNew();FCKPageBreaksProcessor.ProcessDocument=function(A){var B=A.getElementsByTagName('DIV');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){if (C.style.pageBreakAfter=='always'&&C.childNodes.length==1&&C.childNodes[0].style&&C.childNodes[0].style.display=='none'){var D=FCKDocumentProcessor_CreateFakeImage('FCK__PageBreak',C.cloneNode(true));C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}};FCKEmbedAndObjectProcessor=(function(){var A=[];var B=function(el){var C=el.cloneNode(true);var D;var E=D=FCKDocumentProcessor_CreateFakeImage('FCK__UnknownObject',C);FCKEmbedAndObjectProcessor.RefreshView(E,el);for (var i=0;i<A.length;i++) D=A[i](el,D)||D;if (D!=E) FCKTempBin.RemoveElement(E.getAttribute('_fckrealelement'));el.parentNode.replaceChild(D,el);};var F=function(elementName,doc){var G=doc.getElementsByTagName(elementName);for (var i=G.length-1;i>=0;i--) B(G[i]);};var H=function(doc){F('object',doc);F('embed',doc);};return FCKTools.Merge(FCKDocumentProcessor.AppendNew(),{ProcessDocument:function(doc){if (FCKBrowserInfo.IsGecko) FCKTools.RunFunction(H,this,[doc]);else H(doc);},RefreshView:function(placeHolder,original){if (original.getAttribute('width')>0) placeHolder.style.width=FCKTools.ConvertHtmlSizeToStyle(original.getAttribute('width'));if (original.getAttribute('height')>0) placeHolder.style.height=FCKTools.ConvertHtmlSizeToStyle(original.getAttribute('height'));},AddCustomHandler:function(func){A.push(func);}});})();FCK.GetRealElement=function(A){var e=FCKTempBin.Elements[A.getAttribute('_fckrealelement')];if (A.getAttribute('_fckflash')){if (A.style.width.length>0) e.width=FCKTools.ConvertStyleSizeToHtml(A.style.width);if (A.style.height.length>0) e.height=FCKTools.ConvertStyleSizeToHtml(A.style.height);};return e;};if (FCKBrowserInfo.IsIE){FCKDocumentProcessor.AppendNew().ProcessDocument=function(A){var B=A.getElementsByTagName('HR');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){var D=A.createElement('hr');D.mergeAttributes(C,true);FCKDomTools.InsertAfterNode(C,D);C.parentNode.removeChild(C);}}};FCKDocumentProcessor.AppendNew().ProcessDocument=function(A){var B=A.getElementsByTagName('INPUT');var C;var i=B.length-1;while (i>=0&&(C=B[i--])){if (C.type=='hidden'){var D=FCKDocumentProcessor_CreateFakeImage('FCK__InputHidden',C.cloneNode(true));D.setAttribute('_fckinputhidden','true',0);C.parentNode.insertBefore(D,C);C.parentNode.removeChild(C);}}};FCKEmbedAndObjectProcessor.AddCustomHandler(function(A,B){if (!(A.nodeName.IEquals('embed')&&(A.type=='application/x-shockwave-flash'||/\.swf($|#|\?)/i.test(A.src)))) return;B.className='FCK__Flash';B.setAttribute('_fckflash','true',0);});if (FCKBrowserInfo.IsSafari){FCKDocumentProcessor.AppendNew().ProcessDocument=function(A){var B=A.getElementsByClassName?A.getElementsByClassName('Apple-style-span'):Array.prototype.filter.call(A.getElementsByTagName('span'),function(item){ return item.className=='Apple-style-span';});for (var i=B.length-1;i>=0;i--) FCKDomTools.RemoveNode(B[i],true);}};
var FCKSelection=FCK.Selection={GetParentBlock:function(){var A=this.GetParentElement();while (A){if (FCKListsLib.BlockBoundaries[A.nodeName.toLowerCase()]) break;A=A.parentNode;};return A;},ApplyStyle:function(A){FCKStyles.ApplyStyle(new FCKStyle(A));}};
-FCKSelection.GetType=function(){try{var A=FCKSelection.GetSelection().type;if (A=='Control'||A=='Text') return A;if (this.GetSelection().createRange().parentElement) return 'Text';}catch(e){};return 'None';};FCKSelection.GetSelectedElement=function(){if (this.GetType()=='Control'){var A=this.GetSelection().createRange();if (A&&A.item) return this.GetSelection().createRange().item(0);};return null;};FCKSelection.GetParentElement=function(){switch (this.GetType()){case 'Control':var A=FCKSelection.GetSelectedElement();return A?A.parentElement:null;case 'None':return null;default:return this.GetSelection().createRange().parentElement();}};FCKSelection.GetBoundaryParentElement=function(A){switch (this.GetType()){case 'Control':var B=FCKSelection.GetSelectedElement();return B?B.parentElement:null;case 'None':return null;default:var C=FCK.EditorDocument;var D=C.selection.createRange();D.collapse(A!==false);var B=D.parentElement();return FCKTools.GetElementDocument(B)==C?B:null;}};FCKSelection.SelectNode=function(A){FCK.Focus();this.GetSelection().empty();var B;try{B=FCK.EditorDocument.body.createControlRange();B.addElement(A);}catch(e){B=FCK.EditorDocument.body.createTextRange();B.moveToElementText(A);};B.select();};FCKSelection.Collapse=function(A){FCK.Focus();if (this.GetType()=='Text'){var B=this.GetSelection().createRange();B.collapse(A==null||A===true);B.select();}};FCKSelection.HasAncestorNode=function(A){var B;if (this.GetSelection().type=="Control"){B=this.GetSelectedElement();}else{var C=this.GetSelection().createRange();B=C.parentElement();}while (B){if (B.nodeName.IEquals(A)) return true;B=B.parentNode;};return false;};FCKSelection.MoveToAncestorNode=function(A){var B,oRange;if (!FCK.EditorDocument) return null;if (this.GetSelection().type=="Control"){oRange=this.GetSelection().createRange();for (i=0;i<oRange.length;i++){if (oRange(i).parentNode){B=oRange(i).parentNode;break;}}}else{oRange=this.GetSelection().createRange();B=oRange.parentElement();}while (B&&B.nodeName!=A) B=B.parentNode;return B;};FCKSelection.Delete=function(){var A=this.GetSelection();if (A.type.toLowerCase()!="none"){A.clear();};return A;};FCKSelection.GetSelection=function(){this.Restore();return FCK.EditorDocument.selection;};FCKSelection.Save=function(){FCK.Focus();var A=FCK.EditorDocument;if (!A) return;var B=A.selection;var C;if (B){C=B.createRange();if (C){if (C.parentElement&&FCKTools.GetElementDocument(C.parentElement())!=A) C=null;else if (C.item&&FCKTools.GetElementDocument(C.item(0))!=A) C=null;}};this.SelectionData=C;};FCKSelection._GetSelectionDocument=function(A){var B=A.createRange();if (!B) return null;else if (B.item) return FCKTools.GetElementDocument(B.item(0));else return FCKTools.GetElementDocument(B.parentElement());};FCKSelection.Restore=function(){if (this.SelectionData){FCK.IsSelectionChangeLocked=true;try{if (this._GetSelectionDocument(FCK.EditorDocument.selection)==FCK.EditorDocument){FCK.IsSelectionChangeLocked=false;return;};this.SelectionData.select();}catch (e) {};FCK.IsSelectionChangeLocked=false;}};FCKSelection.Release=function(){delete this.SelectionData;};
-var FCKTableHandler={};FCKTableHandler.InsertRow=function(A){var B=FCKSelection.MoveToAncestorNode('TR');if (!B) return;var C=B.cloneNode(true);B.parentNode.insertBefore(C,B);FCKTableHandler.ClearRow(A?C:B);};FCKTableHandler.DeleteRows=function(A){if (!A){var B=FCKTableHandler.GetSelectedCells();var C=[];for (var i=0;i<B.length;i++){var D=FCKTools.GetElementAscensor(B[i],'TR');C[D.rowIndex]=D;};for (var i=C.length;i>=0;i--){if (C[i]) FCKTableHandler.DeleteRows(C[i]);};return;};var E=FCKTools.GetElementAscensor(A,'TABLE');if (E.rows.length==1){FCKTableHandler.DeleteTable(E);return;};A.parentNode.removeChild(A);};FCKTableHandler.DeleteTable=function(A){if (!A){A=FCKSelection.GetSelectedElement();if (!A||A.tagName!='TABLE') A=FCKSelection.MoveToAncestorNode('TABLE');};if (!A) return;FCKSelection.SelectNode(A);FCKSelection.Collapse();if (A.parentNode.childNodes.length==1) A.parentNode.parentNode.removeChild(A.parentNode);else A.parentNode.removeChild(A);};FCKTableHandler.InsertColumn=function(A){var B=null;var C=this.GetSelectedCells();if (C&&C.length) B=C[A?0:(C.length-1)];if (!B) return;var D=FCKTools.GetElementAscensor(B,'TABLE');var E=B.cellIndex;for (var i=0;i<D.rows.length;i++){var F=D.rows[i];if (F.cells.length<(E+1)) continue;B=F.cells[E].cloneNode(false);if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(B);var G=F.cells[E];if (A) F.insertBefore(B,G);else if (G.nextSibling) F.insertBefore(B,G.nextSibling);else F.appendChild(B);}};FCKTableHandler.DeleteColumns=function(A){if (!A){var B=FCKTableHandler.GetSelectedCells();for (var i=B.length;i>=0;i--){if (B[i]) FCKTableHandler.DeleteColumns(B[i]);};return;};if (!A) return;var C=FCKTools.GetElementAscensor(A,'TABLE');var D=A.cellIndex;for (var i=C.rows.length-1;i>=0;i--){var E=C.rows[i];if (D==0&&E.cells.length==1){FCKTableHandler.DeleteRows(E);continue;};if (E.cells[D]) E.removeChild(E.cells[D]);}};FCKTableHandler.InsertCell=function(A,B){var C=null;var D=this.GetSelectedCells();if (D&&D.length) C=D[B?0:(D.length-1)];if (!C) return null;var E=FCK.EditorDocument.createElement('TD');if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(E);if (!B&&C.cellIndex==C.parentNode.cells.length-1) C.parentNode.appendChild(E);else C.parentNode.insertBefore(E,B?C:C.nextSibling);return E;};FCKTableHandler.DeleteCell=function(A){if (A.parentNode.cells.length==1){FCKTableHandler.DeleteRows(FCKTools.GetElementAscensor(A,'TR'));return;};A.parentNode.removeChild(A);};FCKTableHandler.DeleteCells=function(){var A=FCKTableHandler.GetSelectedCells();for (var i=A.length-1;i>=0;i--){FCKTableHandler.DeleteCell(A[i]);}};FCKTableHandler._MarkCells=function(A,B){for (var i=0;i<A.length;i++) A[i][B]=true;};FCKTableHandler._UnmarkCells=function(A,B){for (var i=0;i<A.length;i++){if (FCKBrowserInfo.IsIE) A[i].removeAttribute(B);else delete A[i][B];}};FCKTableHandler._ReplaceCellsByMarker=function(A,B,C){for (var i=0;i<A.length;i++){for (var j=0;j<A[i].length;j++){if (A[i][j][B]) A[i][j]=C;}}};FCKTableHandler._GetMarkerGeometry=function(A,B,C,D){var E=0;var F=0;var G=0;var H=0;for (var i=C;A[B][i]&&A[B][i][D];i++) E++;for (var i=C-1;A[B][i]&&A[B][i][D];i--){E++;G++;};for (var i=B;A[i]&&A[i][C]&&A[i][C][D];i++) F++;for (var i=B-1;A[i]&&A[i][C]&&A[i][C][D];i--){F++;H++;};return { 'width':E,'height':F,'x':G,'y':H };};FCKTableHandler.CheckIsSelectionRectangular=function(){var A=FCKTableHandler.GetSelectedCells();if (A.length<1) return false;this._MarkCells(A,'_CellSelected');var B=this._CreateTableMap(A[0].parentNode.parentNode);var C=A[0].parentNode.rowIndex;var D=this._GetCellIndexSpan(B,C,A[0]);var E=this._GetMarkerGeometry(B,C,D,'_CellSelected');var F=D-E.x;var G=C-E.y;if (E.width>=E.height){for (D=F;D<F+E.width;D++){C=G+(D-F) % E.height;if (!B[C]||!B[C][D]){this._UnmarkCells(A,'_CellSelected');return false;};var g=this._GetMarkerGeometry(B,C,D,'_CellSelected');if (g.width!=E.width||g.height!=E.height){this._UnmarkCells(A,'_CellSelected');return false;}}}else{for (C=G;C<G+E.height;C++){D=F+(C-G) % E.width;if (!B[C]||!B[C][D]){this._UnmarkCells(A,'_CellSelected');return false;};var g=this._GetMarkerGeometry(B,C,D,'_CellSelected');if (g.width!=E.width||g.height!=E.height){this._UnmarkCells(A,'_CellSelected');return false;}}};this._UnmarkCells(A,'_CellSelected');return true;};FCKTableHandler.MergeCells=function(){var A=this.GetSelectedCells();if (A.length<2) return;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=B.parentNode.rowIndex;var E=this._GetCellIndexSpan(C,D,B);this._MarkCells(A,'_SelectedCells');var F=this._GetMarkerGeometry(C,D,E,'_SelectedCells');var G=E-F.x;var H=D-F.y;var I=FCKTools.GetElementDocument(B).createDocumentFragment();for (var i=0;i<F.height;i++){var J=0;for (var j=0;j<F.width;j++){var K=C[H+i][G+j];while (K.childNodes.length>0){var L=K.removeChild(K.firstChild);if (L.nodeType!=1||(L.getAttribute('type',2)!='_moz'&&L.getAttribute('_moz_dirty')!=null)){I.appendChild(L);J++;}}};if (J>0) I.appendChild(FCKTools.GetElementDocument(B).createElement('br'));};this._ReplaceCellsByMarker(C,'_SelectedCells',B);this._UnmarkCells(A,'_SelectedCells');this._InstallTableMap(C,B.parentNode.parentNode);B.appendChild(I);if (FCKBrowserInfo.IsGeckoLike&&(!B.firstChild)) FCKTools.AppendBogusBr(B);this._MoveCaretToCell(B,false);};FCKTableHandler.MergeRight=function(){var A=this.GetMergeRightTarget();if (A==null) return;var B=A.refCell;var C=A.tableMap;var D=A.nextCell;var E=FCK.EditorDocument.createDocumentFragment();while (D&&D.childNodes&&D.childNodes.length>0) E.appendChild(D.removeChild(D.firstChild));D.parentNode.removeChild(D);B.appendChild(E);this._MarkCells([D],'_Replace');this._ReplaceCellsByMarker(C,'_Replace',B);this._InstallTableMap(C,B.parentNode.parentNode);this._MoveCaretToCell(B,false);};FCKTableHandler.MergeDown=function(){var A=this.GetMergeDownTarget();if (A==null) return;var B=A.refCell;var C=A.tableMap;var D=A.nextCell;var E=FCKTools.GetElementDocument(B).createDocumentFragment();while (D&&D.childNodes&&D.childNodes.length>0) E.appendChild(D.removeChild(D.firstChild));if (E.firstChild) E.insertBefore(FCKTools.GetElementDocument(D).createElement('br'),E.firstChild);B.appendChild(E);this._MarkCells([D],'_Replace');this._ReplaceCellsByMarker(C,'_Replace',B);this._InstallTableMap(C,B.parentNode.parentNode);this._MoveCaretToCell(B,false);};FCKTableHandler.HorizontalSplitCell=function(){var A=FCKTableHandler.GetSelectedCells();if (A.length!=1) return;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=B.parentNode.rowIndex;var E=FCKTableHandler._GetCellIndexSpan(C,D,B);var F=isNaN(B.colSpan)?1:B.colSpan;if (F>1){var G=Math.ceil(F/2);var H=FCKTools.GetElementDocument(B).createElement('td');if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(H);var I=E+G;var J=E+F;var K=isNaN(B.rowSpan)?1:B.rowSpan;for (var r=D;r<D+K;r++){for (var i=I;i<J;i++) C[r][i]=H;}}else{var L=[];for (var i=0;i<C.length;i++){var M=C[i].slice(0,E);if (C[i].length<=E){L.push(M);continue;};if (C[i][E]==B){M.push(B);M.push(FCKTools.GetElementDocument(B).createElement('td'));if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(M[M.length-1]);}else{M.push(C[i][E]);M.push(C[i][E]);};for (var j=E+1;j<C[i].length;j++) M.push(C[i][j]);L.push(M);};C=L;};this._InstallTableMap(C,B.parentNode.parentNode);};FCKTableHandler.VerticalSplitCell=function(){var A=FCKTableHandler.GetSelectedCells();if (A.length!=1) return;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=FCKTableHandler._GetCellIndexSpan(C,B.parentNode.rowIndex,B);var E=B.rowSpan;var F=B.parentNode.rowIndex;if (isNaN(E)) E=1;if (E>1){B.rowSpan=Math.ceil(E/2);var G=F+Math.ceil(E/2);var H=null;for (var i=D+1;i<C[G].length;i++){if (C[G][i].parentNode.rowIndex==G){H=C[G][i];break;}};var I=FCK.EditorDocument.createElement('td');I.rowSpan=Math.floor(E/2);if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(I);B.parentNode.parentNode.rows[G].insertBefore(I,H);}else{var G=F+1;var K=FCK.EditorDocument.createElement('tr');B.parentNode.parentNode.insertBefore(K,B.parentNode.parentNode.rows[G]);for (var i=0;i<C[F].length;){var L=C[F][i].colSpan;if (isNaN(L)||L<1) L=1;if (i==D){i+=L;continue;};var M=C[F][i].rowSpan;if (isNaN(M)) M=1;C[F][i].rowSpan=M+1;i+=L;};var I=FCK.EditorDocument.createElement('td');if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(I);K.appendChild(I);}};FCKTableHandler._GetCellIndexSpan=function(A,B,C){if (A.length<B+1) return null;var D=A[B];for (var c=0;c<D.length;c++){if (D[c]==C) return c;};return null;};FCKTableHandler._GetCellLocation=function(A,B){for (var i=0;i<A.length;i++){for (var c=0;c<A[i].length;c++){if (A[i][c]==B) return [i,c];}};return null;};FCKTableHandler._GetColumnCells=function(A,B){var C=[];for (var r=0;r<A.length;r++){var D=A[r][B];if (D&&(C.length==0||C[C.length-1]!=D)) C[C.length]=D;};return C;};FCKTableHandler._CreateTableMap=function(A){var B=A.rows;var r=-1;var C=[];for (var i=0;i<B.length;i++){r++;if (!C[r]) C[r]=[];var c=-1;for (var j=0;j<B[i].cells.length;j++){var D=B[i].cells[j];c++;while (C[r][c]) c++;var E=isNaN(D.colSpan)?1:D.colSpan;var F=isNaN(D.rowSpan)?1:D.rowSpan;for (var G=0;G<F;G++){if (!C[r+G]) C[r+G]=[];for (var H=0;H<E;H++){C[r+G][c+H]=B[i].cells[j];}};c+=E-1;}};return C;};FCKTableHandler._InstallTableMap=function(A,B){while (B.rows.length>0){var C=B.rows[0];C.parentNode.removeChild(C);};for (var i=0;i<A.length;i++){for (var j=0;j<A[i].length;j++){var D=A[i][j];if (D.parentNode) D.parentNode.removeChild(D);D.colSpan=D.rowSpan=1;}};var E=0;for (var i=0;i<A.length;i++){for (var j=0;j<A[i].length;j++){var D=A[i][j];if (!D) continue;if (j>E) E=j;if (D._colScanned===true) continue;if (A[i][j-1]==D) D.colSpan++;if (A[i][j+1]!=D) D._colScanned=true;}};for (var i=0;i<=E;i++){for (var j=0;j<A.length;j++){if (!A[j]) continue;var D=A[j][i];if (!D||D._rowScanned===true) continue;if (A[j-1]&&A[j-1][i]==D) D.rowSpan++;if (!A[j+1]||A[j+1][i]!=D) D._rowScanned=true;}};for (var i=0;i<A.length;i++){for (var j=0;j<A[i].length;j++){var D=A[i][j];if (FCKBrowserInfo.IsIE){D.removeAttribute('_colScanned');D.removeAttribute('_rowScanned');}else{delete D._colScanned;delete D._rowScanned;}}};for (var i=0;i<A.length;i++){var I=FCKTools.GetElementDocument(B).createElement('tr');for (var j=0;j<A[i].length;){var D=A[i][j];if (A[i-1]&&A[i-1][j]==D){j+=D.colSpan;continue;};I.appendChild(D);j+=D.colSpan;if (D.colSpan==1) D.removeAttribute('colspan');if (D.rowSpan==1) D.removeAttribute('rowspan');};B.appendChild(I);}};FCKTableHandler._MoveCaretToCell=function (A,B){var C=new FCKDomRange(FCK.EditorWindow);C.MoveToNodeContents(A);C.Collapse(B);C.Select();};FCKTableHandler.ClearRow=function(A){var B=A.cells;for (var i=0;i<B.length;i++){B[i].innerHTML='';if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(B[i]);}};FCKTableHandler.GetMergeRightTarget=function(){var A=this.GetSelectedCells();if (A.length!=1) return null;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=B.parentNode.rowIndex;var E=this._GetCellIndexSpan(C,D,B);var F=E+(isNaN(B.colSpan)?1:B.colSpan);var G=C[D][F];if (!G) return null;this._MarkCells([B,G],'_SizeTest');var H=this._GetMarkerGeometry(C,D,E,'_SizeTest');var I=this._GetMarkerGeometry(C,D,F,'_SizeTest');this._UnmarkCells([B,G],'_SizeTest');if (H.height!=I.height||H.y!=I.y) return null;return { 'refCell':B,'nextCell':G,'tableMap':C };};FCKTableHandler.GetMergeDownTarget=function(){var A=this.GetSelectedCells();if (A.length!=1) return null;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=B.parentNode.rowIndex;var E=this._GetCellIndexSpan(C,D,B);var F=D+(isNaN(B.rowSpan)?1:B.rowSpan);if (!C[F]) return null;var G=C[F][E];if (!G) return null;this._MarkCells([B,G],'_SizeTest');var H=this._GetMarkerGeometry(C,D,E,'_SizeTest');var I=this._GetMarkerGeometry(C,F,E,'_SizeTest');this._UnmarkCells([B,G],'_SizeTest');if (H.width!=I.width||H.x!=I.x) return null;return { 'refCell':B,'nextCell':G,'tableMap':C };};
+FCKSelection.GetType=function(){try{var A=FCKSelection.GetSelection().type;if (A=='Control'||A=='Text') return A;if (this.GetSelection().createRange().parentElement) return 'Text';}catch(e){};return 'None';};FCKSelection.GetSelectedElement=function(){if (this.GetType()=='Control'){var A=this.GetSelection().createRange();if (A&&A.item) return this.GetSelection().createRange().item(0);};return null;};FCKSelection.GetParentElement=function(){switch (this.GetType()){case 'Control':var A=FCKSelection.GetSelectedElement();return A?A.parentElement:null;case 'None':return null;default:return this.GetSelection().createRange().parentElement();}};FCKSelection.GetBoundaryParentElement=function(A){switch (this.GetType()){case 'Control':var B=FCKSelection.GetSelectedElement();return B?B.parentElement:null;case 'None':return null;default:var C=FCK.EditorDocument;var D=C.selection.createRange();D.collapse(A!==false);var B=D.parentElement();return FCKTools.GetElementDocument(B)==C?B:null;}};FCKSelection.SelectNode=function(A){FCK.Focus();this.GetSelection().empty();var B;try{B=FCK.EditorDocument.body.createControlRange();B.addElement(A);}catch(e){B=FCK.EditorDocument.body.createTextRange();B.moveToElementText(A);};B.select();};FCKSelection.Collapse=function(A){FCK.Focus();if (this.GetType()=='Text'){var B=this.GetSelection().createRange();B.collapse(A==null||A===true);B.select();}};FCKSelection.HasAncestorNode=function(A){var B;if (this.GetSelection().type=="Control"){B=this.GetSelectedElement();}else{var C=this.GetSelection().createRange();B=C.parentElement();}while (B){if (B.nodeName.IEquals(A)) return true;B=B.parentNode;};return false;};FCKSelection.MoveToAncestorNode=function(A){var B,oRange;if (!FCK.EditorDocument) return null;if (this.GetSelection().type=="Control"){oRange=this.GetSelection().createRange();for (i=0;i<oRange.length;i++){if (oRange(i).parentNode){B=oRange(i).parentNode;break;}}}else{oRange=this.GetSelection().createRange();B=oRange.parentElement();}while (B&&B.nodeName!=A) B=B.parentNode;return B;};FCKSelection.Delete=function(){var A=this.GetSelection();if (A.type.toLowerCase()!="none"){A.clear();};return A;};FCKSelection.GetSelection=function(){this.Restore();return FCK.EditorDocument.selection;};FCKSelection.Save=function(A){if (!A) FCK.Focus();var B=FCK.EditorDocument;if (!B) return;var C=B.selection;var D;if (C){D=C.createRange();if (D){if (D.parentElement&&FCKTools.GetElementDocument(D.parentElement())!=B) D=null;else if (D.item&&FCKTools.GetElementDocument(D.item(0))!=B) D=null;}};this.SelectionData=D;};FCKSelection._GetSelectionDocument=function(A){var B=A.createRange();if (!B) return null;else if (B.item) return FCKTools.GetElementDocument(B.item(0));else return FCKTools.GetElementDocument(B.parentElement());};FCKSelection.Restore=function(){if (this.SelectionData){FCK.IsSelectionChangeLocked=true;try{if (String(this._GetSelectionDocument(FCK.EditorDocument.selection).body.contentEditable)=='true'){FCK.IsSelectionChangeLocked=false;return;};this.SelectionData.select();}catch (e) {};FCK.IsSelectionChangeLocked=false;}};FCKSelection.Release=function(){delete this.SelectionData;};
+var FCKTableHandler={};FCKTableHandler.InsertRow=function(A){var B=FCKSelection.MoveToAncestorNode('TR');if (!B) return;var C=B.cloneNode(true);B.parentNode.insertBefore(C,B);FCKTableHandler.ClearRow(A?C:B);};FCKTableHandler.DeleteRows=function(A){if (!A){var B=FCKTableHandler.GetSelectedCells();var C=[];for (var i=0;i<B.length;i++){var D=FCKTools.GetElementAscensor(B[i],'TR');C[D.rowIndex]=D;};for (var i=C.length;i>=0;i--){if (C[i]) FCKTableHandler.DeleteRows(C[i]);};return;};var E=FCKTools.GetElementAscensor(A,'TABLE');if (E.rows.length==1){FCKTableHandler.DeleteTable(E);return;};A.parentNode.removeChild(A);};FCKTableHandler.DeleteTable=function(A){if (!A){A=FCKSelection.GetSelectedElement();if (!A||A.tagName!='TABLE') A=FCKSelection.MoveToAncestorNode('TABLE');};if (!A) return;FCKSelection.SelectNode(A);FCKSelection.Collapse();if (A.parentNode.childNodes.length==1) A.parentNode.parentNode.removeChild(A.parentNode);else A.parentNode.removeChild(A);};FCKTableHandler.InsertColumn=function(A){var B=null;var C=this.GetSelectedCells();if (C&&C.length) B=C[A?0:(C.length-1)];if (!B) return;var D=FCKTools.GetElementAscensor(B,'TABLE');var E=B.cellIndex;for (var i=0;i<D.rows.length;i++){var F=D.rows[i];if (F.cells.length<(E+1)) continue;B=F.cells[E].cloneNode(false);if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(B);var G=F.cells[E];if (A) F.insertBefore(B,G);else if (G.nextSibling) F.insertBefore(B,G.nextSibling);else F.appendChild(B);}};FCKTableHandler.DeleteColumns=function(A){if (!A){var B=FCKTableHandler.GetSelectedCells();for (var i=B.length;i>=0;i--){if (B[i]) FCKTableHandler.DeleteColumns(B[i]);};return;};if (!A) return;var C=FCKTools.GetElementAscensor(A,'TABLE');var D=A.cellIndex;for (var i=C.rows.length-1;i>=0;i--){var E=C.rows[i];if (D==0&&E.cells.length==1){FCKTableHandler.DeleteRows(E);continue;};if (E.cells[D]) E.removeChild(E.cells[D]);}};FCKTableHandler.InsertCell=function(A,B){var C=null;var D=this.GetSelectedCells();if (D&&D.length) C=D[B?0:(D.length-1)];if (!C) return null;var E=FCK.EditorDocument.createElement('TD');if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(E);if (!B&&C.cellIndex==C.parentNode.cells.length-1) C.parentNode.appendChild(E);else C.parentNode.insertBefore(E,B?C:C.nextSibling);return E;};FCKTableHandler.DeleteCell=function(A){if (A.parentNode.cells.length==1){FCKTableHandler.DeleteRows(FCKTools.GetElementAscensor(A,'TR'));return;};A.parentNode.removeChild(A);};FCKTableHandler.DeleteCells=function(){var A=FCKTableHandler.GetSelectedCells();for (var i=A.length-1;i>=0;i--){FCKTableHandler.DeleteCell(A[i]);}};FCKTableHandler._MarkCells=function(A,B){for (var i=0;i<A.length;i++) A[i][B]=true;};FCKTableHandler._UnmarkCells=function(A,B){for (var i=0;i<A.length;i++){if (FCKBrowserInfo.IsIE) A[i].removeAttribute(B);else delete A[i][B];}};FCKTableHandler._ReplaceCellsByMarker=function(A,B,C){for (var i=0;i<A.length;i++){for (var j=0;j<A[i].length;j++){if (A[i][j][B]) A[i][j]=C;}}};FCKTableHandler._GetMarkerGeometry=function(A,B,C,D){var E=0;var F=0;var G=0;var H=0;for (var i=C;A[B][i]&&A[B][i][D];i++) E++;for (var i=C-1;A[B][i]&&A[B][i][D];i--){E++;G++;};for (var i=B;A[i]&&A[i][C]&&A[i][C][D];i++) F++;for (var i=B-1;A[i]&&A[i][C]&&A[i][C][D];i--){F++;H++;};return { 'width':E,'height':F,'x':G,'y':H };};FCKTableHandler.CheckIsSelectionRectangular=function(){var A=FCKTableHandler.GetSelectedCells();if (A.length<1) return false;this._MarkCells(A,'_CellSelected');var B=this._CreateTableMap(A[0].parentNode.parentNode);var C=A[0].parentNode.rowIndex;var D=this._GetCellIndexSpan(B,C,A[0]);var E=this._GetMarkerGeometry(B,C,D,'_CellSelected');var F=D-E.x;var G=C-E.y;if (E.width>=E.height){for (D=F;D<F+E.width;D++){C=G+(D-F) % E.height;if (!B[C]||!B[C][D]){this._UnmarkCells(A,'_CellSelected');return false;};var g=this._GetMarkerGeometry(B,C,D,'_CellSelected');if (g.width!=E.width||g.height!=E.height){this._UnmarkCells(A,'_CellSelected');return false;}}}else{for (C=G;C<G+E.height;C++){D=F+(C-G) % E.width;if (!B[C]||!B[C][D]){this._UnmarkCells(A,'_CellSelected');return false;};var g=this._GetMarkerGeometry(B,C,D,'_CellSelected');if (g.width!=E.width||g.height!=E.height){this._UnmarkCells(A,'_CellSelected');return false;}}};this._UnmarkCells(A,'_CellSelected');return true;};FCKTableHandler.MergeCells=function(){var A=this.GetSelectedCells();if (A.length<2) return;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=B.parentNode.rowIndex;var E=this._GetCellIndexSpan(C,D,B);this._MarkCells(A,'_SelectedCells');var F=this._GetMarkerGeometry(C,D,E,'_SelectedCells');var G=E-F.x;var H=D-F.y;var I=FCKTools.GetElementDocument(B).createDocumentFragment();for (var i=0;i<F.height;i++){var J=0;for (var j=0;j<F.width;j++){var K=C[H+i][G+j];while (K.childNodes.length>0){var L=K.removeChild(K.firstChild);if (L.nodeType!=1||(L.getAttribute('type',2)!='_moz'&&L.getAttribute('_moz_dirty')!=null)){I.appendChild(L);J++;}}};if (J>0) I.appendChild(FCKTools.GetElementDocument(B).createElement('br'));};this._ReplaceCellsByMarker(C,'_SelectedCells',B);this._UnmarkCells(A,'_SelectedCells');this._InstallTableMap(C,B.parentNode.parentNode);B.appendChild(I);if (FCKBrowserInfo.IsGeckoLike&&(!B.firstChild)) FCKTools.AppendBogusBr(B);this._MoveCaretToCell(B,false);};FCKTableHandler.MergeRight=function(){var A=this.GetMergeRightTarget();if (A==null) return;var B=A.refCell;var C=A.tableMap;var D=A.nextCell;var E=FCK.EditorDocument.createDocumentFragment();while (D&&D.childNodes&&D.childNodes.length>0) E.appendChild(D.removeChild(D.firstChild));D.parentNode.removeChild(D);B.appendChild(E);this._MarkCells([D],'_Replace');this._ReplaceCellsByMarker(C,'_Replace',B);this._InstallTableMap(C,B.parentNode.parentNode);this._MoveCaretToCell(B,false);};FCKTableHandler.MergeDown=function(){var A=this.GetMergeDownTarget();if (A==null) return;var B=A.refCell;var C=A.tableMap;var D=A.nextCell;var E=FCKTools.GetElementDocument(B).createDocumentFragment();while (D&&D.childNodes&&D.childNodes.length>0) E.appendChild(D.removeChild(D.firstChild));if (E.firstChild) E.insertBefore(FCKTools.GetElementDocument(D).createElement('br'),E.firstChild);B.appendChild(E);this._MarkCells([D],'_Replace');this._ReplaceCellsByMarker(C,'_Replace',B);this._InstallTableMap(C,B.parentNode.parentNode);this._MoveCaretToCell(B,false);};FCKTableHandler.HorizontalSplitCell=function(){var A=FCKTableHandler.GetSelectedCells();if (A.length!=1) return;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=B.parentNode.rowIndex;var E=FCKTableHandler._GetCellIndexSpan(C,D,B);var F=isNaN(B.colSpan)?1:B.colSpan;if (F>1){var G=Math.ceil(F/2);var H=FCKTools.GetElementDocument(B).createElement('td');if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(H);var I=E+G;var J=E+F;var K=isNaN(B.rowSpan)?1:B.rowSpan;for (var r=D;r<D+K;r++){for (var i=I;i<J;i++) C[r][i]=H;}}else{var L=[];for (var i=0;i<C.length;i++){var M=C[i].slice(0,E);if (C[i].length<=E){L.push(M);continue;};if (C[i][E]==B){M.push(B);M.push(FCKTools.GetElementDocument(B).createElement('td'));if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(M[M.length-1]);}else{M.push(C[i][E]);M.push(C[i][E]);};for (var j=E+1;j<C[i].length;j++) M.push(C[i][j]);L.push(M);};C=L;};this._InstallTableMap(C,B.parentNode.parentNode);};FCKTableHandler.VerticalSplitCell=function(){var A=FCKTableHandler.GetSelectedCells();if (A.length!=1) return;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=FCKTableHandler._GetCellIndexSpan(C,B.parentNode.rowIndex,B);var E=B.rowSpan;var F=B.parentNode.rowIndex;if (isNaN(E)) E=1;if (E>1){B.rowSpan=Math.ceil(E/2);var G=F+Math.ceil(E/2);var H=null;for (var i=D+1;i<C[G].length;i++){if (C[G][i].parentNode.rowIndex==G){H=C[G][i];break;}};var I=FCK.EditorDocument.createElement('td');I.rowSpan=Math.floor(E/2);if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(I);B.parentNode.parentNode.rows[G].insertBefore(I,H);}else{var G=F+1;var K=FCK.EditorDocument.createElement('tr');var L=B.parentNode.parentNode;if (L.rows.length>G) L.insertBefore(K,L.rows[G]);else L.appendChild(K);for (var i=0;i<C[F].length;){var M=C[F][i].colSpan;if (isNaN(M)||M<1) M=1;if (i==D){i+=M;continue;};var N=C[F][i].rowSpan;if (isNaN(N)) N=1;C[F][i].rowSpan=N+1;i+=M;};var I=FCK.EditorDocument.createElement('td');if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(I);K.appendChild(I);}};FCKTableHandler._GetCellIndexSpan=function(A,B,C){if (A.length<B+1) return null;var D=A[B];for (var c=0;c<D.length;c++){if (D[c]==C) return c;};return null;};FCKTableHandler._GetCellLocation=function(A,B){for (var i=0;i<A.length;i++){for (var c=0;c<A[i].length;c++){if (A[i][c]==B) return [i,c];}};return null;};FCKTableHandler._GetColumnCells=function(A,B){var C=[];for (var r=0;r<A.length;r++){var D=A[r][B];if (D&&(C.length==0||C[C.length-1]!=D)) C[C.length]=D;};return C;};FCKTableHandler._CreateTableMap=function(A){var B=A.rows;var r=-1;var C=[];for (var i=0;i<B.length;i++){r++;if (!C[r]) C[r]=[];var c=-1;for (var j=0;j<B[i].cells.length;j++){var D=B[i].cells[j];c++;while (C[r][c]) c++;var E=isNaN(D.colSpan)?1:D.colSpan;var F=isNaN(D.rowSpan)?1:D.rowSpan;for (var G=0;G<F;G++){if (!C[r+G]) C[r+G]=[];for (var H=0;H<E;H++){C[r+G][c+H]=B[i].cells[j];}};c+=E-1;}};return C;};FCKTableHandler._InstallTableMap=function(A,B){var C=FCKBrowserInfo.IsIE?"_fckrowspan":"rowSpan";while (B.rows.length>0){var D=B.rows[0];D.parentNode.removeChild(D);};for (var i=0;i<A.length;i++){for (var j=0;j<A[i].length;j++){var E=A[i][j];if (E.parentNode) E.parentNode.removeChild(E);E.colSpan=E[C]=1;}};var F=0;for (var i=0;i<A.length;i++){for (var j=0;j<A[i].length;j++){var E=A[i][j];if (!E) continue;if (j>F) F=j;if (E._colScanned===true) continue;if (A[i][j-1]==E) E.colSpan++;if (A[i][j+1]!=E) E._colScanned=true;}};for (var i=0;i<=F;i++){for (var j=0;j<A.length;j++){if (!A[j]) continue;var E=A[j][i];if (!E||E._rowScanned===true) continue;if (A[j-1]&&A[j-1][i]==E) E[C]++;if (!A[j+1]||A[j+1][i]!=E) E._rowScanned=true;}};for (var i=0;i<A.length;i++){for (var j=0;j<A[i].length;j++){var E=A[i][j];if (FCKBrowserInfo.IsIE){E.removeAttribute('_colScanned');E.removeAttribute('_rowScanned');}else{delete E._colScanned;delete E._rowScanned;}}};for (var i=0;i<A.length;i++){var J=FCKTools.GetElementDocument(B).createElement('tr');for (var j=0;j<A[i].length;){var E=A[i][j];if (A[i-1]&&A[i-1][j]==E){j+=E.colSpan;continue;};J.appendChild(E);if (C!='rowSpan'){E.rowSpan=E[C];E.removeAttribute(C);};j+=E.colSpan;if (E.colSpan==1) E.removeAttribute('colspan');if (E.rowSpan==1) E.removeAttribute('rowspan');};B.appendChild(J);}};FCKTableHandler._MoveCaretToCell=function (A,B){var C=new FCKDomRange(FCK.EditorWindow);C.MoveToNodeContents(A);C.Collapse(B);C.Select();};FCKTableHandler.ClearRow=function(A){var B=A.cells;for (var i=0;i<B.length;i++){B[i].innerHTML='';if (FCKBrowserInfo.IsGeckoLike) FCKTools.AppendBogusBr(B[i]);}};FCKTableHandler.GetMergeRightTarget=function(){var A=this.GetSelectedCells();if (A.length!=1) return null;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=B.parentNode.rowIndex;var E=this._GetCellIndexSpan(C,D,B);var F=E+(isNaN(B.colSpan)?1:B.colSpan);var G=C[D][F];if (!G) return null;this._MarkCells([B,G],'_SizeTest');var H=this._GetMarkerGeometry(C,D,E,'_SizeTest');var I=this._GetMarkerGeometry(C,D,F,'_SizeTest');this._UnmarkCells([B,G],'_SizeTest');if (H.height!=I.height||H.y!=I.y) return null;return { 'refCell':B,'nextCell':G,'tableMap':C };};FCKTableHandler.GetMergeDownTarget=function(){var A=this.GetSelectedCells();if (A.length!=1) return null;var B=A[0];var C=this._CreateTableMap(B.parentNode.parentNode);var D=B.parentNode.rowIndex;var E=this._GetCellIndexSpan(C,D,B);var F=D+(isNaN(B.rowSpan)?1:B.rowSpan);if (!C[F]) return null;var G=C[F][E];if (!G) return null;this._MarkCells([B,G],'_SizeTest');var H=this._GetMarkerGeometry(C,D,E,'_SizeTest');var I=this._GetMarkerGeometry(C,F,E,'_SizeTest');this._UnmarkCells([B,G],'_SizeTest');if (H.width!=I.width||H.x!=I.x) return null;return { 'refCell':B,'nextCell':G,'tableMap':C };};
FCKTableHandler.GetSelectedCells=function(){if (FCKSelection.GetType()=='Control'){var A=FCKSelection.MoveToAncestorNode('TD');return A?[A]:[];};var B=[];var C=FCKSelection.GetSelection().createRange();var D=FCKSelection.GetParentElement();if (D&&D.tagName.Equals('TD','TH')) B[0]=D;else{D=FCKSelection.MoveToAncestorNode('TABLE');if (D){for (var i=0;i<D.cells.length;i++){var E=FCK.EditorDocument.body.createTextRange();E.moveToElementText(D.cells[i]);if (C.inRange(E)||(C.compareEndPoints('StartToStart',E)>=0&&C.compareEndPoints('StartToEnd',E)<=0)||(C.compareEndPoints('EndToStart',E)>=0&&C.compareEndPoints('EndToEnd',E)<=0)){B[B.length]=D.cells[i];}}}};return B;};
var FCKXml=function(){this.Error=false;};FCKXml.GetAttribute=function(A,B,C){var D=A.attributes.getNamedItem(B);return D?D.value:C;};FCKXml.TransformToObject=function(A){if (!A) return null;var B={};var C=A.attributes;for (var i=0;i<C.length;i++){var D=C[i];B[D.name]=D.value;};var E=A.childNodes;for (i=0;i<E.length;i++){var F=E[i];if (F.nodeType==1){var G='$'+F.nodeName;var H=B[G];if (!H) H=B[G]=[];H.push(this.TransformToObject(F));}};return B;};
FCKXml.prototype={LoadUrl:function(A){this.Error=false;var B=FCKTools.CreateXmlObject('XmlHttp');if (!B){this.Error=true;return;};B.open("GET",A,false);B.send(null);if (B.status==200||B.status==304||(B.status==0&&B.readyState==4)){this.DOMDocument=B.responseXML;if (!this.DOMDocument||this.DOMDocument.firstChild==null){this.DOMDocument=FCKTools.CreateXmlObject('DOMDocument');this.DOMDocument.async=false;this.DOMDocument.resolveExternals=false;this.DOMDocument.loadXML(B.responseText);}}else{this.DOMDocument=null;};if (this.DOMDocument==null||this.DOMDocument.firstChild==null){this.Error=true;if (window.confirm('Error loading "'+A+'"\r\nDo you want to see more info?')) alert('URL requested: "'+A+'"\r\nServer response:\r\nStatus: '+B.status+'\r\nResponse text:\r\n'+B.responseText);}},SelectNodes:function(A,B){if (this.Error) return [];if (B) return B.selectNodes(A);else return this.DOMDocument.selectNodes(A);},SelectSingleNode:function(A,B){if (this.Error) return null;if (B) return B.selectSingleNode(A);else return this.DOMDocument.selectSingleNode(A);}};
var FCKNamedCommand=function(A){this.Name=A;};FCKNamedCommand.prototype.Execute=function(){FCK.ExecuteNamedCommand(this.Name);};FCKNamedCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState(this.Name);};
var FCKStyleCommand=function(){};FCKStyleCommand.prototype={Name:'Style',Execute:function(A,B){FCKUndo.SaveUndoStep();if (B.Selected) FCK.Styles.RemoveStyle(B.Style);else FCK.Styles.ApplyStyle(B.Style);FCKUndo.SaveUndoStep();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');},GetState:function(){if (FCK.EditMode!=0||!FCK.EditorDocument) return -1;if (FCKSelection.GetType()=='Control'){var A=FCKSelection.GetSelectedElement();if (!A||!FCKStyles.CheckHasObjectStyle(A.nodeName.toLowerCase())) return -1;};return 0;}};
-var FCKDialogCommand=function(A,B,C,D,E,F,G,H){this.Name=A;this.Title=B;this.Url=C;this.Width=D;this.Height=E;this.CustomValue=H;this.GetStateFunction=F;this.GetStateParam=G;this.Resizable=false;};FCKDialogCommand.prototype.Execute=function(){FCKDialog.OpenDialog('FCKDialog_'+this.Name,this.Title,this.Url,this.Width,this.Height,this.CustomValue,null,this.Resizable);};FCKDialogCommand.prototype.GetState=function(){if (this.GetStateFunction) return this.GetStateFunction(this.GetStateParam);else return FCK.EditMode==0?0:-1;};var FCKUndefinedCommand=function(){this.Name='Undefined';};FCKUndefinedCommand.prototype.Execute=function(){alert(FCKLang.NotImplemented);};FCKUndefinedCommand.prototype.GetState=function(){return 0;};var FCKFormatBlockCommand=function(){};FCKFormatBlockCommand.prototype={Name:'FormatBlock',Execute:FCKStyleCommand.prototype.Execute,GetState:function(){return FCK.EditorDocument?0:-1;}};var FCKFontNameCommand=function(){};FCKFontNameCommand.prototype={Name:'FontName',Execute:FCKStyleCommand.prototype.Execute,GetState:FCKFormatBlockCommand.prototype.GetState};var FCKFontSizeCommand=function(){};FCKFontSizeCommand.prototype={Name:'FontSize',Execute:FCKStyleCommand.prototype.Execute,GetState:FCKFormatBlockCommand.prototype.GetState};var FCKPreviewCommand=function(){this.Name='Preview';};FCKPreviewCommand.prototype.Execute=function(){FCK.Preview();};FCKPreviewCommand.prototype.GetState=function(){return 0;};var FCKSaveCommand=function(){this.Name='Save';};FCKSaveCommand.prototype.Execute=function(){var A=FCK.GetParentForm();if (typeof(A.onsubmit)=='function'){var B=A.onsubmit();if (B!=null&&B===false) return;};if (typeof(A.submit)=='function') A.submit();else A.submit.click();};FCKSaveCommand.prototype.GetState=function(){return 0;};var FCKNewPageCommand=function(){this.Name='NewPage';};FCKNewPageCommand.prototype.Execute=function(){FCKUndo.SaveUndoStep();FCK.SetData('');FCKUndo.Typing=true;FCK.Focus();};FCKNewPageCommand.prototype.GetState=function(){return 0;};var FCKSourceCommand=function(){this.Name='Source';};FCKSourceCommand.prototype.Execute=function(){if (FCKConfig.SourcePopup){var A=FCKConfig.ScreenWidth*0.65;var B=FCKConfig.ScreenHeight*0.65;FCKDialog.OpenDialog('FCKDialog_Source',FCKLang.Source,'dialog/fck_source.html',A,B,null,null,true);}else FCK.SwitchEditMode();};FCKSourceCommand.prototype.GetState=function(){return (FCK.EditMode==0?0:1);};var FCKUndoCommand=function(){this.Name='Undo';};FCKUndoCommand.prototype.Execute=function(){FCKUndo.Undo();};FCKUndoCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return (FCKUndo.CheckUndoState()?0:-1);};var FCKRedoCommand=function(){this.Name='Redo';};FCKRedoCommand.prototype.Execute=function(){FCKUndo.Redo();};FCKRedoCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return (FCKUndo.CheckRedoState()?0:-1);};var FCKPageBreakCommand=function(){this.Name='PageBreak';};FCKPageBreakCommand.prototype.Execute=function(){FCKUndo.SaveUndoStep();var e=FCK.EditorDocument.createElement('DIV');e.style.pageBreakAfter='always';e.innerHTML='<span style="DISPLAY:none"> </span>';var A=FCKDocumentProcessor_CreateFakeImage('FCK__PageBreak',e);var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=B.SplitBlock();B.InsertNode(A);FCK.Events.FireEvent('OnSelectionChange');};FCKPageBreakCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return 0;};var FCKUnlinkCommand=function(){this.Name='Unlink';};FCKUnlinkCommand.prototype.Execute=function(){FCKUndo.SaveUndoStep();if (FCKBrowserInfo.IsGeckoLike){var A=FCK.Selection.MoveToAncestorNode('A');if (A) FCKTools.RemoveOuterTags(A);return;};FCK.ExecuteNamedCommand(this.Name);};FCKUnlinkCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;var A=FCK.GetNamedCommandState(this.Name);if (A==0&&FCK.EditMode==0){var B=FCKSelection.MoveToAncestorNode('A');var C=(B&&B.name.length>0&&B.href.length==0);if (C) A=-1;};return A;};var FCKSelectAllCommand=function(){this.Name='SelectAll';};FCKSelectAllCommand.prototype.Execute=function(){if (FCK.EditMode==0){FCK.ExecuteNamedCommand('SelectAll');}else{var A=FCK.EditingArea.Textarea;if (FCKBrowserInfo.IsIE){A.createTextRange().execCommand('SelectAll');}else{A.selectionStart=0;A.selectionEnd=A.value.length;};A.focus();}};FCKSelectAllCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return 0;};var FCKPasteCommand=function(){this.Name='Paste';};FCKPasteCommand.prototype={Execute:function(){if (FCKBrowserInfo.IsIE) FCK.Paste();else FCK.ExecuteNamedCommand('Paste');},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('Paste');}};var FCKRuleCommand=function(){this.Name='Rule';};FCKRuleCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();FCK.InsertElement('hr');},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('InsertHorizontalRule');}};var FCKCutCopyCommand=function(A){this.Name=A?'Cut':'Copy';};FCKCutCopyCommand.prototype={Execute:function(){var A=false;if (FCKBrowserInfo.IsIE){var B=function(){A=true;};var C='on'+this.Name.toLowerCase();FCK.EditorDocument.body.attachEvent(C,B);FCK.ExecuteNamedCommand(this.Name);FCK.EditorDocument.body.detachEvent(C,B);}else{try{FCK.ExecuteNamedCommand(this.Name);A=true;}catch(e){}};if (!A) alert(FCKLang['PasteError'+this.Name]);},GetState:function(){return FCK.EditMode!=0?-1:FCK.GetNamedCommandState('Cut');}};var FCKAnchorDeleteCommand=function(){this.Name='AnchorDelete';};FCKAnchorDeleteCommand.prototype={Execute:function(){if (FCK.Selection.GetType()=='Control'){FCK.Selection.Delete();}else{var A=FCK.Selection.GetSelectedElement();if (A){if (A.tagName=='IMG'&&A.getAttribute('_fckanchor')) oAnchor=FCK.GetRealElement(A);else A=null;};if (!A){oAnchor=FCK.Selection.MoveToAncestorNode('A');if (oAnchor) FCK.Selection.SelectNode(oAnchor);};if (oAnchor.href.length!=0){oAnchor.removeAttribute('name');if (FCKBrowserInfo.IsIE) oAnchor.className=oAnchor.className.replace(FCKRegexLib.FCK_Class,'');return;};if (A){A.parentNode.removeChild(A);return;};if (oAnchor.innerHTML.length==0){oAnchor.parentNode.removeChild(oAnchor);return;};FCKTools.RemoveOuterTags(oAnchor);};if (FCKBrowserInfo.IsGecko) FCK.Selection.Collapse(true);},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('Unlink');}};
-var FCKShowBlockCommand=function(A,B){this.Name=A;if (B!=undefined) this._SavedState=B;else this._SavedState=null;};FCKShowBlockCommand.prototype.Execute=function(){var A=this.GetState();if (A==-1) return;var B=FCK.EditorDocument.body;if (A==1) B.className=B.className.replace(/(^| )FCK__ShowBlocks/g,'');else B.className+=' FCK__ShowBlocks';FCK.Events.FireEvent('OnSelectionChange');};FCKShowBlockCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;if (!FCK.EditorDocument) return 0;if (/FCK__ShowBlocks(?:\s|$)/.test(FCK.EditorDocument.body.className)) return 1;return 0;};FCKShowBlockCommand.prototype.SaveState=function(){this._SavedState=this.GetState();};FCKShowBlockCommand.prototype.RestoreState=function(){if (this._SavedState!=null&&this.GetState()!=this._SavedState) this.Execute();};
+var FCKDialogCommand=function(A,B,C,D,E,F,G,H){this.Name=A;this.Title=B;this.Url=C;this.Width=D;this.Height=E;this.CustomValue=H;this.GetStateFunction=F;this.GetStateParam=G;this.Resizable=false;};FCKDialogCommand.prototype.Execute=function(){FCKDialog.OpenDialog('FCKDialog_'+this.Name,this.Title,this.Url,this.Width,this.Height,this.CustomValue,null,this.Resizable);};FCKDialogCommand.prototype.GetState=function(){if (this.GetStateFunction) return this.GetStateFunction(this.GetStateParam);else return FCK.EditMode==0?0:-1;};var FCKUndefinedCommand=function(){this.Name='Undefined';};FCKUndefinedCommand.prototype.Execute=function(){alert(FCKLang.NotImplemented);};FCKUndefinedCommand.prototype.GetState=function(){return 0;};var FCKFormatBlockCommand=function(){};FCKFormatBlockCommand.prototype={Name:'FormatBlock',Execute:FCKStyleCommand.prototype.Execute,GetState:function(){return FCK.EditorDocument?0:-1;}};var FCKFontNameCommand=function(){};FCKFontNameCommand.prototype={Name:'FontName',Execute:FCKStyleCommand.prototype.Execute,GetState:FCKFormatBlockCommand.prototype.GetState};var FCKFontSizeCommand=function(){};FCKFontSizeCommand.prototype={Name:'FontSize',Execute:FCKStyleCommand.prototype.Execute,GetState:FCKFormatBlockCommand.prototype.GetState};var FCKPreviewCommand=function(){this.Name='Preview';};FCKPreviewCommand.prototype.Execute=function(){FCK.Preview();};FCKPreviewCommand.prototype.GetState=function(){return 0;};var FCKSaveCommand=function(){this.Name='Save';};FCKSaveCommand.prototype.Execute=function(){var A=FCK.GetParentForm();if (typeof(A.onsubmit)=='function'){var B=A.onsubmit();if (B!=null&&B===false) return;};if (typeof(A.submit)=='function') A.submit();else A.submit.click();};FCKSaveCommand.prototype.GetState=function(){return 0;};var FCKNewPageCommand=function(){this.Name='NewPage';};FCKNewPageCommand.prototype.Execute=function(){FCKUndo.SaveUndoStep();FCK.SetData('');FCKUndo.Typing=true;FCK.Focus();};FCKNewPageCommand.prototype.GetState=function(){return 0;};var FCKSourceCommand=function(){this.Name='Source';};FCKSourceCommand.prototype.Execute=function(){if (FCKConfig.SourcePopup){var A=FCKConfig.ScreenWidth*0.65;var B=FCKConfig.ScreenHeight*0.65;FCKDialog.OpenDialog('FCKDialog_Source',FCKLang.Source,'dialog/fck_source.html',A,B,null,null,true);}else FCK.SwitchEditMode();};FCKSourceCommand.prototype.GetState=function(){return (FCK.EditMode==0?0:1);};var FCKUndoCommand=function(){this.Name='Undo';};FCKUndoCommand.prototype.Execute=function(){FCKUndo.Undo();};FCKUndoCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return (FCKUndo.CheckUndoState()?0:-1);};var FCKRedoCommand=function(){this.Name='Redo';};FCKRedoCommand.prototype.Execute=function(){FCKUndo.Redo();};FCKRedoCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return (FCKUndo.CheckRedoState()?0:-1);};var FCKPageBreakCommand=function(){this.Name='PageBreak';};FCKPageBreakCommand.prototype.Execute=function(){FCKUndo.SaveUndoStep();var e=FCK.EditorDocument.createElement('DIV');e.style.pageBreakAfter='always';e.innerHTML='<span style="DISPLAY:none"> </span>';var A=FCKDocumentProcessor_CreateFakeImage('FCK__PageBreak',e);var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=B.SplitBlock();B.InsertNode(A);FCK.Events.FireEvent('OnSelectionChange');};FCKPageBreakCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return 0;};var FCKUnlinkCommand=function(){this.Name='Unlink';};FCKUnlinkCommand.prototype.Execute=function(){FCKUndo.SaveUndoStep();if (FCKBrowserInfo.IsGeckoLike){var A=FCK.Selection.MoveToAncestorNode('A');if (A) FCKTools.RemoveOuterTags(A);return;};FCK.ExecuteNamedCommand(this.Name);};FCKUnlinkCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;var A=FCK.GetNamedCommandState(this.Name);if (A==0&&FCK.EditMode==0){var B=FCKSelection.MoveToAncestorNode('A');var C=(B&&B.name.length>0&&B.href.length==0);if (C) A=-1;};return A;};FCKVisitLinkCommand=function(){this.Name='VisitLink';};FCKVisitLinkCommand.prototype={GetState:function(){if (FCK.EditMode!=0) return -1;var A=FCK.GetNamedCommandState('Unlink');if (A==0){var B=FCKSelection.MoveToAncestorNode('A');if (!B.href) A=-1;};return A;},Execute:function(){var A=FCKSelection.MoveToAncestorNode('A');var B=A.getAttribute('_fcksavedurl')||A.getAttribute('href',2);if (!/:\/\//.test(B)){var C=FCKConfig.BaseHref;var D=FCK.GetInstanceObject('parent');if (!C){C=D.document.location.href;C=C.substring(0,C.lastIndexOf('/')+1);};if (/^\//.test(B)){try{C=C.match(/^.*:\/\/+[^\/]+/)[0];}catch (e){C=D.document.location.protocol+'://'+D.parent.document.location.host;}};B=C+B;};if (!window.open(B,'_blank')) alert(FCKLang.VisitLinkBlocked);}};var FCKSelectAllCommand=function(){this.Name='SelectAll';};FCKSelectAllCommand.prototype.Execute=function(){if (FCK.EditMode==0){FCK.ExecuteNamedCommand('SelectAll');}else{var A=FCK.EditingArea.Textarea;if (FCKBrowserInfo.IsIE){A.createTextRange().execCommand('SelectAll');}else{A.selectionStart=0;A.selectionEnd=A.value.length;};A.focus();}};FCKSelectAllCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return 0;};var FCKPasteCommand=function(){this.Name='Paste';};FCKPasteCommand.prototype={Execute:function(){if (FCKBrowserInfo.IsIE) FCK.Paste();else FCK.ExecuteNamedCommand('Paste');},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('Paste');}};var FCKRuleCommand=function(){this.Name='Rule';};FCKRuleCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();FCK.InsertElement('hr');},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('InsertHorizontalRule');}};var FCKCutCopyCommand=function(A){this.Name=A?'Cut':'Copy';};FCKCutCopyCommand.prototype={Execute:function(){var A=false;if (FCKBrowserInfo.IsIE){var B=function(){A=true;};var C='on'+this.Name.toLowerCase();FCK.EditorDocument.body.attachEvent(C,B);FCK.ExecuteNamedCommand(this.Name);FCK.EditorDocument.body.detachEvent(C,B);}else{try{FCK.ExecuteNamedCommand(this.Name);A=true;}catch(e){}};if (!A) alert(FCKLang['PasteError'+this.Name]);},GetState:function(){return FCK.EditMode!=0?-1:FCK.GetNamedCommandState('Cut');}};var FCKAnchorDeleteCommand=function(){this.Name='AnchorDelete';};FCKAnchorDeleteCommand.prototype={Execute:function(){if (FCK.Selection.GetType()=='Control'){FCK.Selection.Delete();}else{var A=FCK.Selection.GetSelectedElement();if (A){if (A.tagName=='IMG'&&A.getAttribute('_fckanchor')) oAnchor=FCK.GetRealElement(A);else A=null;};if (!A){oAnchor=FCK.Selection.MoveToAncestorNode('A');if (oAnchor) FCK.Selection.SelectNode(oAnchor);};if (oAnchor.href.length!=0){oAnchor.removeAttribute('name');if (FCKBrowserInfo.IsIE) oAnchor.className=oAnchor.className.replace(FCKRegexLib.FCK_Class,'');return;};if (A){A.parentNode.removeChild(A);return;};if (oAnchor.innerHTML.length==0){oAnchor.parentNode.removeChild(oAnchor);return;};FCKTools.RemoveOuterTags(oAnchor);};if (FCKBrowserInfo.IsGecko) FCK.Selection.Collapse(true);},GetState:function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('Unlink');}};var FCKDeleteDivCommand=function(){};FCKDeleteDivCommand.prototype={GetState:function(){if (FCK.EditMode!=0) return -1;var A=FCKSelection.GetParentElement();var B=new FCKElementPath(A);return B.BlockLimit&&B.BlockLimit.nodeName.IEquals('div')?0:-1;},Execute:function(){FCKUndo.SaveUndoStep();var A=FCKDomTools.GetSelectedDivContainers();var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=B.CreateBookmark();for (var i=0;i<A.length;i++) FCKDomTools.RemoveNode(A[i],true);B.MoveToBookmark(C);B.Select();}};var FCKNbsp=function(){this.Name='Non Breaking Space';};FCKNbsp.prototype={Execute:function(){FCK.InsertHtml(' ');},GetState:function(){return (FCK.EditMode!=0?-1:0);}};
+var FCKShowBlockCommand=function(A,B){this.Name=A;if (B!=undefined) this._SavedState=B;else this._SavedState=null;};FCKShowBlockCommand.prototype.Execute=function(){var A=this.GetState();if (A==-1) return;var B=FCK.EditorDocument.body;if (A==1) B.className=B.className.replace(/(^| )FCK__ShowBlocks/g,'');else B.className+=' FCK__ShowBlocks';if (FCKBrowserInfo.IsIE){try{FCK.EditorDocument.selection.createRange().select();}catch (e){}}else{var C=FCK.EditorWindow.getSelection().focusNode;if (C.nodeType!=1) C=C.parentNode;FCKDomTools.ScrollIntoView(C,false);};FCK.Events.FireEvent('OnSelectionChange');};FCKShowBlockCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;if (!FCK.EditorDocument) return 0;if (/FCK__ShowBlocks(?:\s|$)/.test(FCK.EditorDocument.body.className)) return 1;return 0;};FCKShowBlockCommand.prototype.SaveState=function(){this._SavedState=this.GetState();};FCKShowBlockCommand.prototype.RestoreState=function(){if (this._SavedState!=null&&this.GetState()!=this._SavedState) this.Execute();};
var FCKSpellCheckCommand=function(){this.Name='SpellCheck';this.IsEnabled=(FCKConfig.SpellChecker=='ieSpell'||FCKConfig.SpellChecker=='SpellerPages');};FCKSpellCheckCommand.prototype.Execute=function(){switch (FCKConfig.SpellChecker){case 'ieSpell':this._RunIeSpell();break;case 'SpellerPages':FCKDialog.OpenDialog('FCKDialog_SpellCheck','Spell Check','dialog/fck_spellerpages.html',440,480);break;}};FCKSpellCheckCommand.prototype._RunIeSpell=function(){try{var A=new ActiveXObject("ieSpell.ieSpellExtension");A.CheckAllLinkedDocuments(FCK.EditorDocument);}catch(e){if(e.number==-2146827859){if (confirm(FCKLang.IeSpellDownload)) window.open(FCKConfig.IeSpellDownloadUrl,'IeSpellDownload');}else alert('Error Loading ieSpell: '+e.message+' ('+e.number+')');}};FCKSpellCheckCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return this.IsEnabled?0:-1;};
var FCKTextColorCommand=function(A){this.Name=A=='ForeColor'?'TextColor':'BGColor';this.Type=A;var B;if (FCKBrowserInfo.IsIE) B=window;else if (FCK.ToolbarSet._IFrame) B=FCKTools.GetElementWindow(FCK.ToolbarSet._IFrame);else B=window.parent;this._Panel=new FCKPanel(B);this._Panel.AppendStyleSheet(FCKConfig.SkinEditorCSS);this._Panel.MainNode.className='FCK_Panel';this._CreatePanelBody(this._Panel.Document,this._Panel.MainNode);FCK.ToolbarSet.ToolbarItems.GetItem(this.Name).RegisterPanel(this._Panel);FCKTools.DisableSelection(this._Panel.Document.body);};FCKTextColorCommand.prototype.Execute=function(A,B,C){this._Panel.Show(A,B,C);};FCKTextColorCommand.prototype.SetColor=function(A){FCKUndo.SaveUndoStep();var B=FCKStyles.GetStyle('_FCK_'+(this.Type=='ForeColor'?'Color':'BackColor'));if (!A||A.length==0) FCK.Styles.RemoveStyle(B);else{B.SetVariable('Color',A);FCKStyles.ApplyStyle(B);};FCKUndo.SaveUndoStep();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');};FCKTextColorCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return 0;};function FCKTextColorCommand_OnMouseOver(){this.className='ColorSelected';};function FCKTextColorCommand_OnMouseOut(){this.className='ColorDeselected';};function FCKTextColorCommand_OnClick(A,B,C){this.className='ColorDeselected';B.SetColor(C);B._Panel.Hide();};function FCKTextColorCommand_AutoOnClick(A,B){this.className='ColorDeselected';B.SetColor('');B._Panel.Hide();};function FCKTextColorCommand_MoreOnClick(A,B){this.className='ColorDeselected';B._Panel.Hide();FCKDialog.OpenDialog('FCKDialog_Color',FCKLang.DlgColorTitle,'dialog/fck_colorselector.html',410,320,FCKTools.Bind(B,B.SetColor));};FCKTextColorCommand.prototype._CreatePanelBody=function(A,B){function CreateSelectionDiv(){var C=A.createElement("DIV");C.className='ColorDeselected';FCKTools.AddEventListenerEx(C,'mouseover',FCKTextColorCommand_OnMouseOver);FCKTools.AddEventListenerEx(C,'mouseout',FCKTextColorCommand_OnMouseOut);return C;};var D=B.appendChild(A.createElement("TABLE"));D.className='ForceBaseFont';D.style.tableLayout='fixed';D.cellPadding=0;D.cellSpacing=0;D.border=0;D.width=150;var E=D.insertRow(-1).insertCell(-1);E.colSpan=8;var C=E.appendChild(CreateSelectionDiv());C.innerHTML='<table cellspacing="0" cellpadding="0" width="100%" border="0">\n <tr>\n <td><div class="ColorBoxBorder"><div class="ColorBox" style="background-color: #000000"></div></div></td>\n <td nowrap width="100%" align="center">'+FCKLang.ColorAutomatic+'</td>\n </tr>\n </table>';FCKTools.AddEventListenerEx(C,'click',FCKTextColorCommand_AutoOnClick,this);if (!FCKBrowserInfo.IsIE) C.style.width='96%';var G=FCKConfig.FontColors.toString().split(',');var H=0;while (H<G.length){var I=D.insertRow(-1);for (var i=0;i<8;i++,H++){if (H<G.length){var J=G[H].split('/');var K='#'+J[0];var L=J[1]||K;};C=I.insertCell(-1).appendChild(CreateSelectionDiv());C.innerHTML='<div class="ColorBoxBorder"><div class="ColorBox" style="background-color: '+K+'"></div></div>';if (H>=G.length) C.style.visibility='hidden';else FCKTools.AddEventListenerEx(C,'click',FCKTextColorCommand_OnClick,[this,L]);}};if (FCKConfig.EnableMoreFontColors){E=D.insertRow(-1).insertCell(-1);E.colSpan=8;C=E.appendChild(CreateSelectionDiv());C.innerHTML='<table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td nowrap align="center">'+FCKLang.ColorMoreColors+'</td></tr></table>';FCKTools.AddEventListenerEx(C,'click',FCKTextColorCommand_MoreOnClick,this);};if (!FCKBrowserInfo.IsIE) C.style.width='96%';};
var FCKPastePlainTextCommand=function(){this.Name='PasteText';};FCKPastePlainTextCommand.prototype.Execute=function(){FCK.PasteAsPlainText();};FCKPastePlainTextCommand.prototype.GetState=function(){if (FCK.EditMode!=0) return -1;return FCK.GetNamedCommandState('Paste');};
var FCKPasteWordCommand=function(){this.Name='PasteWord';};FCKPasteWordCommand.prototype.Execute=function(){FCK.PasteFromWord();};FCKPasteWordCommand.prototype.GetState=function(){if (FCK.EditMode!=0||FCKConfig.ForcePasteAsPlainText) return -1;else return FCK.GetNamedCommandState('Paste');};
var FCKTableCommand=function(A){this.Name=A;};FCKTableCommand.prototype.Execute=function(){FCKUndo.SaveUndoStep();if (!FCKBrowserInfo.IsGecko){switch (this.Name){case 'TableMergeRight':return FCKTableHandler.MergeRight();case 'TableMergeDown':return FCKTableHandler.MergeDown();}};switch (this.Name){case 'TableInsertRowAfter':return FCKTableHandler.InsertRow(false);case 'TableInsertRowBefore':return FCKTableHandler.InsertRow(true);case 'TableDeleteRows':return FCKTableHandler.DeleteRows();case 'TableInsertColumnAfter':return FCKTableHandler.InsertColumn(false);case 'TableInsertColumnBefore':return FCKTableHandler.InsertColumn(true);case 'TableDeleteColumns':return FCKTableHandler.DeleteColumns();case 'TableInsertCellAfter':return FCKTableHandler.InsertCell(null,false);case 'TableInsertCellBefore':return FCKTableHandler.InsertCell(null,true);case 'TableDeleteCells':return FCKTableHandler.DeleteCells();case 'TableMergeCells':return FCKTableHandler.MergeCells();case 'TableHorizontalSplitCell':return FCKTableHandler.HorizontalSplitCell();case 'TableVerticalSplitCell':return FCKTableHandler.VerticalSplitCell();case 'TableDelete':return FCKTableHandler.DeleteTable();default:return alert(FCKLang.UnknownCommand.replace(/%1/g,this.Name));}};FCKTableCommand.prototype.GetState=function(){if (FCK.EditorDocument!=null&&FCKSelection.HasAncestorNode('TABLE')){switch (this.Name){case 'TableHorizontalSplitCell':case 'TableVerticalSplitCell':if (FCKTableHandler.GetSelectedCells().length==1) return 0;else return -1;case 'TableMergeCells':if (FCKTableHandler.CheckIsSelectionRectangular()&&FCKTableHandler.GetSelectedCells().length>1) return 0;else return -1;case 'TableMergeRight':return FCKTableHandler.GetMergeRightTarget()?0:-1;case 'TableMergeDown':return FCKTableHandler.GetMergeDownTarget()?0:-1;default:return 0;}}else return -1;};
-var FCKFitWindow=function(){this.Name='FitWindow';};FCKFitWindow.prototype.Execute=function(){var A=window.frameElement;var B=A.style;var C=parent;var D=C.document.documentElement;var E=C.document.body;var F=E.style;var G;if (!this.IsMaximized){if(FCKBrowserInfo.IsIE) C.attachEvent('onresize',FCKFitWindow_Resize);else C.addEventListener('resize',FCKFitWindow_Resize,true);this._ScrollPos=FCKTools.GetScrollPosition(C);G=A;while((G=G.parentNode)){if (G.nodeType==1){G._fckSavedStyles=FCKTools.SaveStyles(G);G.style.zIndex=FCKConfig.FloatingPanelsZIndex-1;}};if (FCKBrowserInfo.IsIE){this.documentElementOverflow=D.style.overflow;D.style.overflow='hidden';F.overflow='hidden';}else{F.overflow='hidden';F.width='0px';F.height='0px';};this._EditorFrameStyles=FCKTools.SaveStyles(A);var H=FCKTools.GetViewPaneSize(C);B.position="absolute";A.offsetLeft;B.zIndex=FCKConfig.FloatingPanelsZIndex-1;B.left="0px";B.top="0px";B.width=H.Width+"px";B.height=H.Height+"px";if (!FCKBrowserInfo.IsIE){B.borderRight=B.borderBottom="9999px solid white";B.backgroundColor="white";};C.scrollTo(0,0);var I=FCKTools.GetWindowPosition(C,A);if (I.x!=0) B.left=(-1*I.x)+"px";if (I.y!=0) B.top=(-1*I.y)+"px";this.IsMaximized=true;}else{if(FCKBrowserInfo.IsIE) C.detachEvent("onresize",FCKFitWindow_Resize);else C.removeEventListener("resize",FCKFitWindow_Resize,true);G=A;while((G=G.parentNode)){if (G._fckSavedStyles){FCKTools.RestoreStyles(G,G._fckSavedStyles);G._fckSavedStyles=null;}};if (FCKBrowserInfo.IsIE) D.style.overflow=this.documentElementOverflow;FCKTools.RestoreStyles(A,this._EditorFrameStyles);C.scrollTo(this._ScrollPos.X,this._ScrollPos.Y);this.IsMaximized=false;};FCKToolbarItems.GetItem('FitWindow').RefreshState();if (FCK.EditMode==0) FCK.EditingArea.MakeEditable();FCK.Focus();};FCKFitWindow.prototype.GetState=function(){if (FCKConfig.ToolbarLocation!='In') return -1;else return (this.IsMaximized?1:0);};function FCKFitWindow_Resize(){var A=FCKTools.GetViewPaneSize(parent);var B=window.frameElement.style;B.width=A.Width+'px';B.height=A.Height+'px';};
+var FCKFitWindow=function(){this.Name='FitWindow';};FCKFitWindow.prototype.Execute=function(){var A=window.frameElement;var B=A.style;var C=parent;var D=C.document.documentElement;var E=C.document.body;var F=E.style;var G;var H=new FCKDomRange(FCK.EditorWindow);H.MoveToSelection();var I=FCKTools.GetScrollPosition(FCK.EditorWindow);if (!this.IsMaximized){if(FCKBrowserInfo.IsIE) C.attachEvent('onresize',FCKFitWindow_Resize);else C.addEventListener('resize',FCKFitWindow_Resize,true);this._ScrollPos=FCKTools.GetScrollPosition(C);G=A;while((G=G.parentNode)){if (G.nodeType==1){G._fckSavedStyles=FCKTools.SaveStyles(G);G.style.zIndex=FCKConfig.FloatingPanelsZIndex-1;}};if (FCKBrowserInfo.IsIE){this.documentElementOverflow=D.style.overflow;D.style.overflow='hidden';F.overflow='hidden';}else{F.overflow='hidden';F.width='0px';F.height='0px';};this._EditorFrameStyles=FCKTools.SaveStyles(A);var J=FCKTools.GetViewPaneSize(C);B.position="absolute";A.offsetLeft;B.zIndex=FCKConfig.FloatingPanelsZIndex-1;B.left="0px";B.top="0px";B.width=J.Width+"px";B.height=J.Height+"px";if (!FCKBrowserInfo.IsIE){B.borderRight=B.borderBottom="9999px solid white";B.backgroundColor="white";};C.scrollTo(0,0);var K=FCKTools.GetWindowPosition(C,A);if (K.x!=0) B.left=(-1*K.x)+"px";if (K.y!=0) B.top=(-1*K.y)+"px";this.IsMaximized=true;}else{if(FCKBrowserInfo.IsIE) C.detachEvent("onresize",FCKFitWindow_Resize);else C.removeEventListener("resize",FCKFitWindow_Resize,true);G=A;while((G=G.parentNode)){if (G._fckSavedStyles){FCKTools.RestoreStyles(G,G._fckSavedStyles);G._fckSavedStyles=null;}};if (FCKBrowserInfo.IsIE) D.style.overflow=this.documentElementOverflow;FCKTools.RestoreStyles(A,this._EditorFrameStyles);C.scrollTo(this._ScrollPos.X,this._ScrollPos.Y);this.IsMaximized=false;};FCKToolbarItems.GetItem('FitWindow').RefreshState();if (FCK.EditMode==0) FCK.EditingArea.MakeEditable();FCK.Focus();H.Select();FCK.EditorWindow.scrollTo(I.X,I.Y);};FCKFitWindow.prototype.GetState=function(){if (FCKConfig.ToolbarLocation!='In') return -1;else return (this.IsMaximized?1:0);};function FCKFitWindow_Resize(){var A=FCKTools.GetViewPaneSize(parent);var B=window.frameElement.style;B.width=A.Width+'px';B.height=A.Height+'px';};
var FCKListCommand=function(A,B){this.Name=A;this.TagName=B;};FCKListCommand.prototype={GetState:function(){if (FCK.EditMode!=0||!FCK.EditorWindow) return -1;var A=FCKSelection.GetBoundaryParentElement(true);var B=A;while (B){if (B.nodeName.IEquals(['ul','ol'])) break;B=B.parentNode;};if (B&&B.nodeName.IEquals(this.TagName)) return 1;else return 0;},Execute:function(){FCKUndo.SaveUndoStep();var A=FCK.EditorDocument;var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=this.GetState();if (C==0){FCKDomTools.TrimNode(A.body);if (!A.body.firstChild){var D=A.createElement('p');A.body.appendChild(D);B.MoveToNodeContents(D);}};var E=B.CreateBookmark();var F=[];var G={};var H=new FCKDomRangeIterator(B);var I;H.ForceBrBreak=(C==0);var J=true;var K=null;while (J){while ((I=H.GetNextParagraph())){var L=new FCKElementPath(I);var M=null;var N=false;var O=L.BlockLimit;for (var i=L.Elements.length-1;i>=0;i--){var P=L.Elements[i];if (P.nodeName.IEquals(['ol','ul'])){if (O._FCK_ListGroupObject) O._FCK_ListGroupObject=null;var Q=P._FCK_ListGroupObject;if (Q) Q.contents.push(I);else{Q={ 'root':P,'contents':[I] };F.push(Q);FCKDomTools.SetElementMarker(G,P,'_FCK_ListGroupObject',Q);};N=true;break;}};if (N) continue;var R=O;if (R._FCK_ListGroupObject) R._FCK_ListGroupObject.contents.push(I);else{var Q={ 'root':R,'contents':[I] };FCKDomTools.SetElementMarker(G,R,'_FCK_ListGroupObject',Q);F.push(Q);}};if (FCKBrowserInfo.IsIE) J=false;else{if (K==null){K=[];var T=FCKSelection.GetSelection();if (T&&F.length==0) K.push(T.getRangeAt(0));for (var i=1;T&&i<T.rangeCount;i++) K.push(T.getRangeAt(i));};if (K.length<1) J=false;else{var U=FCKW3CRange.CreateFromRange(A,K.shift());B._Range=U;B._UpdateElementInfo();if (B.StartNode.nodeName.IEquals('td')) B.SetStart(B.StartNode,1);if (B.EndNode.nodeName.IEquals('td')) B.SetEnd(B.EndNode,2);H=new FCKDomRangeIterator(B);H.ForceBrBreak=(C==0);}}};var W=[];while (F.length>0){var Q=F.shift();if (C==0){if (Q.root.nodeName.IEquals(['ul','ol'])) this._ChangeListType(Q,G,W);else this._CreateList(Q,W);}else if (C==1&&Q.root.nodeName.IEquals(['ul','ol'])) this._RemoveList(Q,G);};for (var i=0;i<W.length;i++){var M=W[i];var Z=false;var a=M;while (!Z){a=a.nextSibling;if (a&&a.nodeType==3&&a.nodeValue.search(/^[\n\r\t ]*$/)==0) continue;Z=true;};if (a&&a.nodeName.IEquals(this.TagName)){a.parentNode.removeChild(a);while (a.firstChild) M.appendChild(a.removeChild(a.firstChild));};Z=false;a=M;while (!Z){a=a.previousSibling;if (a&&a.nodeType==3&&a.nodeValue.search(/^[\n\r\t ]*$/)==0) continue;Z=true;};if (a&&a.nodeName.IEquals(this.TagName)){a.parentNode.removeChild(a);while (a.lastChild) M.insertBefore(a.removeChild(a.lastChild),M.firstChild);}};FCKDomTools.ClearAllMarkers(G);B.MoveToBookmark(E);B.Select();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');},_ChangeListType:function(A,B,C){var D=FCKDomTools.ListToArray(A.root,B);var E=[];for (var i=0;i<A.contents.length;i++){var F=A.contents[i];F=FCKTools.GetElementAscensor(F,'li');if (!F||F._FCK_ListItem_Processed) continue;E.push(F);FCKDomTools.SetElementMarker(B,F,'_FCK_ListItem_Processed',true);};var G=FCKTools.GetElementDocument(A.root).createElement(this.TagName);for (var i=0;i<E.length;i++){var H=E[i]._FCK_ListArray_Index;D[H].parent=G;};var I=FCKDomTools.ArrayToList(D,B);for (var i=0;i<I.listNode.childNodes.length;i++){if (I.listNode.childNodes[i].nodeName.IEquals(this.TagName)) C.push(I.listNode.childNodes[i]);};A.root.parentNode.replaceChild(I.listNode,A.root);},_CreateList:function(A,B){var C=A.contents;var D=FCKTools.GetElementDocument(A.root);var E=[];if (C.length==1&&C[0]==A.root){var F=D.createElement('div');while (C[0].firstChild) F.appendChild(C[0].removeChild(C[0].firstChild));C[0].appendChild(F);C[0]=F;};var G=A.contents[0].parentNode;for (var i=0;i<C.length;i++) G=FCKDomTools.GetCommonParents(G,C[i].parentNode).pop();for (var i=0;i<C.length;i++){var H=C[i];while (H.parentNode){if (H.parentNode==G){E.push(H);break;};H=H.parentNode;}};if (E.length<1) return;var I=E[E.length-1].nextSibling;var J=D.createElement(this.TagName);B.push(J);while (E.length){var K=E.shift();var L=D.createDocumentFragment();while (K.firstChild) L.appendChild(K.removeChild(K.firstChild));K.parentNode.removeChild(K);var M=D.createElement('li');M.appendChild(L);J.appendChild(M);};G.insertBefore(J,I);},_RemoveList:function(A,B){var C=FCKDomTools.ListToArray(A.root,B);var D=[];for (var i=0;i<A.contents.length;i++){var E=A.contents[i];E=FCKTools.GetElementAscensor(E,'li');if (!E||E._FCK_ListItem_Processed) continue;D.push(E);FCKDomTools.SetElementMarker(B,E,'_FCK_ListItem_Processed',true);};var F=null;for (var i=0;i<D.length;i++){var G=D[i]._FCK_ListArray_Index;C[G].indent=-1;F=G;};for (var i=F+1;i<C.length;i++){if (C[i].indent>C[i-1].indent+1){var H=C[i-1].indent+1-C[i].indent;var I=C[i].indent;while (C[i]&&C[i].indent>=I){C[i].indent+=H;i++;};i--;}};var J=FCKDomTools.ArrayToList(C,B);if (A.root.nextSibling==null||A.root.nextSibling.nodeName.IEquals('br')){if (J.listNode.lastChild.nodeName.IEquals('br')) J.listNode.removeChild(J.listNode.lastChild);};A.root.parentNode.replaceChild(J.listNode,A.root);}};
var FCKJustifyCommand=function(A){this.AlignValue=A;var B=FCKConfig.ContentLangDirection.toLowerCase();this.IsDefaultAlign=(A=='left'&&B=='ltr')||(A=='right'&&B=='rtl');var C=this._CssClassName=(function(){var D=FCKConfig.JustifyClasses;if (D){switch (A){case 'left':return D[0]||null;case 'center':return D[1]||null;case 'right':return D[2]||null;case 'justify':return D[3]||null;}};return null;})();if (C&&C.length>0) this._CssClassRegex=new RegExp('(?:^|\\s+)'+C+'(?=$|\\s)');};FCKJustifyCommand._GetClassNameRegex=function(){var A=FCKJustifyCommand._ClassRegex;if (A!=undefined) return A;var B=[];var C=FCKConfig.JustifyClasses;if (C){for (var i=0;i<4;i++){var D=C[i];if (D&&D.length>0) B.push(D);}};if (B.length>0) A=new RegExp('(?:^|\\s+)(?:'+B.join('|')+')(?=$|\\s)');else A=null;return FCKJustifyCommand._ClassRegex=A;};FCKJustifyCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();var A=new FCKDomRange(FCK.EditorWindow);A.MoveToSelection();var B=this.GetState();if (B==-1) return;var C=A.CreateBookmark();var D=this._CssClassName;var E=new FCKDomRangeIterator(A);var F;while ((F=E.GetNextParagraph())){F.removeAttribute('align');if (D){var G=F.className.replace(FCKJustifyCommand._GetClassNameRegex(),'');if (B==0){if (G.length>0) G+=' ';F.className=G+D;}else if (G.length==0) FCKDomTools.RemoveAttribute(F,'class');}else{var H=F.style;if (B==0) H.textAlign=this.AlignValue;else{H.textAlign='';if (H.cssText.length==0) F.removeAttribute('style');}}};A.MoveToBookmark(C);A.Select();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');},GetState:function(){if (FCK.EditMode!=0||!FCK.EditorWindow) return -1;var A=new FCKElementPath(FCKSelection.GetBoundaryParentElement(true));var B=A.Block||A.BlockLimit;if (!B||B.nodeName.toLowerCase()=='body') return 0;var C;if (FCKBrowserInfo.IsIE) C=B.currentStyle.textAlign;else C=FCK.EditorWindow.getComputedStyle(B,'').getPropertyValue('text-align');C=C.replace(/(-moz-|-webkit-|start|auto)/i,'');if ((!C&&this.IsDefaultAlign)||C==this.AlignValue) return 1;return 0;}};
var FCKIndentCommand=function(A,B){this.Name=A;this.Offset=B;this.IndentCSSProperty=FCKConfig.ContentLangDirection.IEquals('ltr')?'marginLeft':'marginRight';};FCKIndentCommand._InitIndentModeParameters=function(){if (FCKConfig.IndentClasses&&FCKConfig.IndentClasses.length>0){this._UseIndentClasses=true;this._IndentClassMap={};for (var i=0;i<FCKConfig.IndentClasses.length;i++) this._IndentClassMap[FCKConfig.IndentClasses[i]]=i+1;this._ClassNameRegex=new RegExp('(?:^|\\s+)('+FCKConfig.IndentClasses.join('|')+')(?=$|\\s)');}else this._UseIndentClasses=false;};FCKIndentCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();var A=new FCKDomRange(FCK.EditorWindow);A.MoveToSelection();var B=A.CreateBookmark();var C=FCKDomTools.GetCommonParentNode(A.StartNode||A.StartContainer,A.EndNode||A.EndContainer,['ul','ol']);if (C) this._IndentList(A,C);else this._IndentBlock(A);A.MoveToBookmark(B);A.Select();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');},GetState:function(){if (FCK.EditMode!=0||!FCK.EditorWindow) return -1;if (FCKIndentCommand._UseIndentClasses==undefined) FCKIndentCommand._InitIndentModeParameters();var A=FCKSelection.GetBoundaryParentElement(true);var B=FCKSelection.GetBoundaryParentElement(false);var C=FCKDomTools.GetCommonParentNode(A,B,['ul','ol']);if (C){if (this.Name.IEquals('outdent')) return 0;var D=FCKTools.GetElementAscensor(A,'li');if (!D||!D.previousSibling) return -1;return 0;};if (!FCKIndentCommand._UseIndentClasses&&this.Name.IEquals('indent')) return 0;var E=new FCKElementPath(A);var F=E.Block||E.BlockLimit;if (!F) return -1;if (FCKIndentCommand._UseIndentClasses){var G=F.className.match(FCKIndentCommand._ClassNameRegex);var H=0;if (G!=null){G=G[1];H=FCKIndentCommand._IndentClassMap[G];};if ((this.Name=='outdent'&&H==0)||(this.Name=='indent'&&H==FCKConfig.IndentClasses.length)) return -1;return 0;}else{var I=parseInt(F.style[this.IndentCSSProperty],10);if (isNaN(I)) I=0;if (I<=0) return -1;return 0;}},_IndentBlock:function(A){var B=new FCKDomRangeIterator(A);B.EnforceRealBlocks=true;A.Expand('block_contents');var C=FCKDomTools.GetCommonParents(A.StartContainer,A.EndContainer);var D=C[C.length-1];var E;while ((E=B.GetNextParagraph())){if (!(E==D||E.parentNode==D)) continue;if (FCKIndentCommand._UseIndentClasses){var F=E.className.match(FCKIndentCommand._ClassNameRegex);var G=0;if (F!=null){F=F[1];G=FCKIndentCommand._IndentClassMap[F];};if (this.Name.IEquals('outdent')) G--;else if (this.Name.IEquals('indent')) G++;G=Math.min(G,FCKConfig.IndentClasses.length);G=Math.max(G,0);var H=E.className.replace(FCKIndentCommand._ClassNameRegex,'');if (G<1) E.className=H;else E.className=(H.length>0?H+' ':'')+FCKConfig.IndentClasses[G-1];}else{var I=parseInt(E.style[this.IndentCSSProperty],10);if (isNaN(I)) I=0;I+=this.Offset;I=Math.max(I,0);I=Math.ceil(I/this.Offset)*this.Offset;E.style[this.IndentCSSProperty]=I?I+FCKConfig.IndentUnit:'';if (E.getAttribute('style')=='') E.removeAttribute('style');}}},_IndentList:function(A,B){var C=A.StartContainer;var D=A.EndContainer;while (C&&C.parentNode!=B) C=C.parentNode;while (D&&D.parentNode!=B) D=D.parentNode;if (!C||!D) return;var E=C;var F=[];var G=false;while (G==false){if (E==D) G=true;F.push(E);E=E.nextSibling;};if (F.length<1) return;var H=FCKDomTools.GetParents(B);for (var i=0;i<H.length;i++){if (H[i].nodeName.IEquals(['ul','ol'])){B=H[i];break;}};var I=this.Name.IEquals('indent')?1:-1;var J=F[0];var K=F[F.length-1];var L={};var M=FCKDomTools.ListToArray(B,L);var N=M[K._FCK_ListArray_Index].indent;for (var i=J._FCK_ListArray_Index;i<=K._FCK_ListArray_Index;i++) M[i].indent+=I;for (var i=K._FCK_ListArray_Index+1;i<M.length&&M[i].indent>N;i++) M[i].indent+=I;var O=FCKDomTools.ArrayToList(M);if (O) B.parentNode.replaceChild(O.listNode,B);FCKDomTools.ClearAllMarkers(L);}};
var FCKBlockQuoteCommand=function(){};FCKBlockQuoteCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();var A=this.GetState();var B=new FCKDomRange(FCK.EditorWindow);B.MoveToSelection();var C=B.CreateBookmark();if (FCKBrowserInfo.IsIE){var D=B.GetBookmarkNode(C,true);var E=B.GetBookmarkNode(C,false);var F;if (D&&D.parentNode.nodeName.IEquals('blockquote')&&!D.previousSibling){F=D;while ((F=F.nextSibling)){if (FCKListsLib.BlockElements[F.nodeName.toLowerCase()]) FCKDomTools.MoveNode(D,F,true);}};if (E&&E.parentNode.nodeName.IEquals('blockquote')&&!E.previousSibling){F=E;while ((F=F.nextSibling)){if (FCKListsLib.BlockElements[F.nodeName.toLowerCase()]){if (F.firstChild==D) FCKDomTools.InsertAfterNode(D,E);else FCKDomTools.MoveNode(E,F,true);}}}};var G=new FCKDomRangeIterator(B);var H;if (A==0){G.EnforceRealBlocks=true;var I=[];while ((H=G.GetNextParagraph())) I.push(H);if (I.length<1){para=B.Window.document.createElement(FCKConfig.EnterMode.IEquals('p')?'p':'div');B.InsertNode(para);para.appendChild(B.Window.document.createTextNode('\ufeff'));B.MoveToBookmark(C);B.MoveToNodeContents(para);B.Collapse(true);C=B.CreateBookmark();I.push(para);};var J=I[0].parentNode;var K=[];for (var i=0;i<I.length;i++){H=I[i];J=FCKDomTools.GetCommonParents(H.parentNode,J).pop();};var L=null;while (I.length>0){H=I.shift();while (H.parentNode!=J) H=H.parentNode;if (H!=L) K.push(H);L=H;}while (K.length>0){H=K.shift();if (H.nodeName.IEquals('blockquote')){var M=FCKTools.GetElementDocument(H).createDocumentFragment();while (H.firstChild){M.appendChild(H.removeChild(H.firstChild));I.push(M.lastChild);};H.parentNode.replaceChild(M,H);}else I.push(H);};var N=B.Window.document.createElement('blockquote');J.insertBefore(N,I[0]);while (I.length>0){H=I.shift();N.appendChild(H);}}else if (A==1){var O=[];while ((H=G.GetNextParagraph())){var P=null;var Q=null;while (H.parentNode){if (H.parentNode.nodeName.IEquals('blockquote')){P=H.parentNode;Q=H;break;};H=H.parentNode;};if (P&&Q) O.push(Q);};var R=[];while (O.length>0){var S=O.shift();var N=S.parentNode;if (S==S.parentNode.firstChild){N.parentNode.insertBefore(N.removeChild(S),N);if (!N.firstChild) N.parentNode.removeChild(N);}else if (S==S.parentNode.lastChild){N.parentNode.insertBefore(N.removeChild(S),N.nextSibling);if (!N.firstChild) N.parentNode.removeChild(N);}else FCKDomTools.BreakParent(S,S.parentNode,B);R.push(S);};if (FCKConfig.EnterMode.IEquals('br')){while (R.length){var S=R.shift();var W=true;if (S.nodeName.IEquals('div')){var M=FCKTools.GetElementDocument(S).createDocumentFragment();var Y=W&&S.previousSibling&&!FCKListsLib.BlockBoundaries[S.previousSibling.nodeName.toLowerCase()];if (W&&Y) M.appendChild(FCKTools.GetElementDocument(S).createElement('br'));var Z=S.nextSibling&&!FCKListsLib.BlockBoundaries[S.nextSibling.nodeName.toLowerCase()];while (S.firstChild) M.appendChild(S.removeChild(S.firstChild));if (Z) M.appendChild(FCKTools.GetElementDocument(S).createElement('br'));S.parentNode.replaceChild(M,S);W=false;}}}};B.MoveToBookmark(C);B.Select();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');},GetState:function(){if (FCK.EditMode!=0||!FCK.EditorWindow) return -1;var A=new FCKElementPath(FCKSelection.GetBoundaryParentElement(true));var B=A.Block||A.BlockLimit;if (!B||B.nodeName.toLowerCase()=='body') return 0;for (var i=0;i<A.Elements.length;i++){if (A.Elements[i].nodeName.IEquals('blockquote')) return 1;};return 0;}};
var FCKCoreStyleCommand=function(A){this.Name='CoreStyle';this.StyleName='_FCK_'+A;this.IsActive=false;FCKStyles.AttachStyleStateChange(this.StyleName,this._OnStyleStateChange,this);};FCKCoreStyleCommand.prototype={Execute:function(){FCKUndo.SaveUndoStep();if (this.IsActive) FCKStyles.RemoveStyle(this.StyleName);else FCKStyles.ApplyStyle(this.StyleName);FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');},GetState:function(){if (FCK.EditMode!=0) return -1;return this.IsActive?1:0;},_OnStyleStateChange:function(A,B){this.IsActive=B;}};
var FCKRemoveFormatCommand=function(){this.Name='RemoveFormat';};FCKRemoveFormatCommand.prototype={Execute:function(){FCKStyles.RemoveAll();FCK.Focus();FCK.Events.FireEvent('OnSelectionChange');},GetState:function(){return FCK.EditorWindow?0:-1;}};
-var FCKCommands=FCK.Commands={};FCKCommands.LoadedCommands={};FCKCommands.RegisterCommand=function(A,B){this.LoadedCommands[A]=B;};FCKCommands.GetCommand=function(A){var B=FCKCommands.LoadedCommands[A];if (B) return B;switch (A){case 'Bold':case 'Italic':case 'Underline':case 'StrikeThrough':case 'Subscript':case 'Superscript':B=new FCKCoreStyleCommand(A);break;case 'RemoveFormat':B=new FCKRemoveFormatCommand();break;case 'DocProps':B=new FCKDialogCommand('DocProps',FCKLang.DocProps,'dialog/fck_docprops.html',400,380,FCKCommands.GetFullPageState);break;case 'Templates':B=new FCKDialogCommand('Templates',FCKLang.DlgTemplatesTitle,'dialog/fck_template.html',380,450);break;case 'Link':B=new FCKDialogCommand('Link',FCKLang.DlgLnkWindowTitle,'dialog/fck_link.html',400,300);break;case 'Unlink':B=new FCKUnlinkCommand();break;case 'Anchor':B=new FCKDialogCommand('Anchor',FCKLang.DlgAnchorTitle,'dialog/fck_anchor.html',370,160);break;case 'AnchorDelete':B=new FCKAnchorDeleteCommand();break;case 'BulletedList':B=new FCKDialogCommand('BulletedList',FCKLang.BulletedListProp,'dialog/fck_listprop.html?UL',370,160);break;case 'NumberedList':B=new FCKDialogCommand('NumberedList',FCKLang.NumberedListProp,'dialog/fck_listprop.html?OL',370,160);break;case 'About':B=new FCKDialogCommand('About',FCKLang.About,'dialog/fck_about.html',420,330,function(){ return 0;});break;case 'Find':B=new FCKDialogCommand('Find',FCKLang.DlgFindAndReplaceTitle,'dialog/fck_replace.html',340,230,null,null,'Find');break;case 'Replace':B=new FCKDialogCommand('Replace',FCKLang.DlgFindAndReplaceTitle,'dialog/fck_replace.html',340,230,null,null,'Replace');break;case 'Image':B=new FCKDialogCommand('Image',FCKLang.DlgImgTitle,'dialog/fck_image.html',450,390);break;case 'Flash':B=new FCKDialogCommand('Flash',FCKLang.DlgFlashTitle,'dialog/fck_flash.html',450,390);break;case 'SpecialChar':B=new FCKDialogCommand('SpecialChar',FCKLang.DlgSpecialCharTitle,'dialog/fck_specialchar.html',400,290);break;case 'Smiley':B=new FCKDialogCommand('Smiley',FCKLang.DlgSmileyTitle,'dialog/fck_smiley.html',FCKConfig.SmileyWindowWidth,FCKConfig.SmileyWindowHeight);break;case 'Table':B=new FCKDialogCommand('Table',FCKLang.DlgTableTitle,'dialog/fck_table.html',480,250);break;case 'TableProp':B=new FCKDialogCommand('Table',FCKLang.DlgTableTitle,'dialog/fck_table.html?Parent',480,250);break;case 'TableCellProp':B=new FCKDialogCommand('TableCell',FCKLang.DlgCellTitle,'dialog/fck_tablecell.html',550,240);break;case 'Style':B=new FCKStyleCommand();break;case 'FontName':B=new FCKFontNameCommand();break;case 'FontSize':B=new FCKFontSizeCommand();break;case 'FontFormat':B=new FCKFormatBlockCommand();break;case 'Source':B=new FCKSourceCommand();break;case 'Preview':B=new FCKPreviewCommand();break;case 'Save':B=new FCKSaveCommand();break;case 'NewPage':B=new FCKNewPageCommand();break;case 'PageBreak':B=new FCKPageBreakCommand();break;case 'Rule':B=new FCKRuleCommand();break;case 'TextColor':B=new FCKTextColorCommand('ForeColor');break;case 'BGColor':B=new FCKTextColorCommand('BackColor');break;case 'Paste':B=new FCKPasteCommand();break;case 'PasteText':B=new FCKPastePlainTextCommand();break;case 'PasteWord':B=new FCKPasteWordCommand();break;case 'JustifyLeft':B=new FCKJustifyCommand('left');break;case 'JustifyCenter':B=new FCKJustifyCommand('center');break;case 'JustifyRight':B=new FCKJustifyCommand('right');break;case 'JustifyFull':B=new FCKJustifyCommand('justify');break;case 'Indent':B=new FCKIndentCommand('indent',FCKConfig.IndentLength);break;case 'Outdent':B=new FCKIndentCommand('outdent',FCKConfig.IndentLength*-1);break;case 'Blockquote':B=new FCKBlockQuoteCommand();break;case 'TableInsertRowAfter':B=new FCKTableCommand('TableInsertRowAfter');break;case 'TableInsertRowBefore':B=new FCKTableCommand('TableInsertRowBefore');break;case 'TableDeleteRows':B=new FCKTableCommand('TableDeleteRows');break;case 'TableInsertColumnAfter':B=new FCKTableCommand('TableInsertColumnAfter');break;case 'TableInsertColumnBefore':B=new FCKTableCommand('TableInsertColumnBefore');break;case 'TableDeleteColumns':B=new FCKTableCommand('TableDeleteColumns');break;case 'TableInsertCellAfter':B=new FCKTableCommand('TableInsertCellAfter');break;case 'TableInsertCellBefore':B=new FCKTableCommand('TableInsertCellBefore');break;case 'TableDeleteCells':B=new FCKTableCommand('TableDeleteCells');break;case 'TableMergeCells':B=new FCKTableCommand('TableMergeCells');break;case 'TableMergeRight':B=new FCKTableCommand('TableMergeRight');break;case 'TableMergeDown':B=new FCKTableCommand('TableMergeDown');break;case 'TableHorizontalSplitCell':B=new FCKTableCommand('TableHorizontalSplitCell');break;case 'TableVerticalSplitCell':B=new FCKTableCommand('TableVerticalSplitCell');break;case 'TableDelete':B=new FCKTableCommand('TableDelete');break;case 'Form':B=new FCKDialogCommand('Form',FCKLang.Form,'dialog/fck_form.html',380,210);break;case 'Checkbox':B=new FCKDialogCommand('Checkbox',FCKLang.Checkbox,'dialog/fck_checkbox.html',380,200);break;case 'Radio':B=new FCKDialogCommand('Radio',FCKLang.RadioButton,'dialog/fck_radiobutton.html',380,200);break;case 'TextField':B=new FCKDialogCommand('TextField',FCKLang.TextField,'dialog/fck_textfield.html',380,210);break;case 'Textarea':B=new FCKDialogCommand('Textarea',FCKLang.Textarea,'dialog/fck_textarea.html',380,210);break;case 'HiddenField':B=new FCKDialogCommand('HiddenField',FCKLang.HiddenField,'dialog/fck_hiddenfield.html',380,190);break;case 'Button':B=new FCKDialogCommand('Button',FCKLang.Button,'dialog/fck_button.html',380,210);break;case 'Select':B=new FCKDialogCommand('Select',FCKLang.SelectionField,'dialog/fck_select.html',400,340);break;case 'ImageButton':B=new FCKDialogCommand('ImageButton',FCKLang.ImageButton,'dialog/fck_image.html?ImageButton',450,390);break;case 'SpellCheck':B=new FCKSpellCheckCommand();break;case 'FitWindow':B=new FCKFitWindow();break;case 'Undo':B=new FCKUndoCommand();break;case 'Redo':B=new FCKRedoCommand();break;case 'Copy':B=new FCKCutCopyCommand(false);break;case 'Cut':B=new FCKCutCopyCommand(true);break;case 'SelectAll':B=new FCKSelectAllCommand();break;case 'InsertOrderedList':B=new FCKListCommand('insertorderedlist','ol');break;case 'InsertUnorderedList':B=new FCKListCommand('insertunorderedlist','ul');break;case 'ShowBlocks':B=new FCKShowBlockCommand('ShowBlocks',FCKConfig.StartupShowBlocks?1:0);break;case 'Undefined':B=new FCKUndefinedCommand();break;default:if (FCKRegexLib.NamedCommands.test(A)) B=new FCKNamedCommand(A);else{alert(FCKLang.UnknownCommand.replace(/%1/g,A));return null;}};FCKCommands.LoadedCommands[A]=B;return B;};FCKCommands.GetFullPageState=function(){return FCKConfig.FullPage?0:-1;};FCKCommands.GetBooleanState=function(A){return A?-1:0;};
+var FCKCommands=FCK.Commands={};FCKCommands.LoadedCommands={};FCKCommands.RegisterCommand=function(A,B){this.LoadedCommands[A]=B;};FCKCommands.GetCommand=function(A){var B=FCKCommands.LoadedCommands[A];if (B) return B;switch (A){case 'Bold':case 'Italic':case 'Underline':case 'StrikeThrough':case 'Subscript':case 'Superscript':B=new FCKCoreStyleCommand(A);break;case 'RemoveFormat':B=new FCKRemoveFormatCommand();break;case 'DocProps':B=new FCKDialogCommand('DocProps',FCKLang.DocProps,'dialog/fck_docprops.html',400,380,FCKCommands.GetFullPageState);break;case 'Templates':B=new FCKDialogCommand('Templates',FCKLang.DlgTemplatesTitle,'dialog/fck_template.html',380,450);break;case 'Link':B=new FCKDialogCommand('Link',FCKLang.DlgLnkWindowTitle,'dialog/fck_link.html',400,300);break;case 'Unlink':B=new FCKUnlinkCommand();break;case 'VisitLink':B=new FCKVisitLinkCommand();break;case 'Anchor':B=new FCKDialogCommand('Anchor',FCKLang.DlgAnchorTitle,'dialog/fck_anchor.html',370,160);break;case 'AnchorDelete':B=new FCKAnchorDeleteCommand();break;case 'BulletedList':B=new FCKDialogCommand('BulletedList',FCKLang.BulletedListProp,'dialog/fck_listprop.html?UL',370,160);break;case 'NumberedList':B=new FCKDialogCommand('NumberedList',FCKLang.NumberedListProp,'dialog/fck_listprop.html?OL',370,160);break;case 'About':B=new FCKDialogCommand('About',FCKLang.About,'dialog/fck_about.html',420,330,function(){ return 0;});break;case 'Find':B=new FCKDialogCommand('Find',FCKLang.DlgFindAndReplaceTitle,'dialog/fck_replace.html',340,230,null,null,'Find');break;case 'Replace':B=new FCKDialogCommand('Replace',FCKLang.DlgFindAndReplaceTitle,'dialog/fck_replace.html',340,230,null,null,'Replace');break;case 'Image':B=new FCKDialogCommand('Image',FCKLang.DlgImgTitle,'dialog/fck_image.html',450,390);break;case 'Flash':B=new FCKDialogCommand('Flash',FCKLang.DlgFlashTitle,'dialog/fck_flash.html',450,390);break;case 'SpecialChar':B=new FCKDialogCommand('SpecialChar',FCKLang.DlgSpecialCharTitle,'dialog/fck_specialchar.html',400,290);break;case 'Smiley':B=new FCKDialogCommand('Smiley',FCKLang.DlgSmileyTitle,'dialog/fck_smiley.html',FCKConfig.SmileyWindowWidth,FCKConfig.SmileyWindowHeight);break;case 'Table':B=new FCKDialogCommand('Table',FCKLang.DlgTableTitle,'dialog/fck_table.html',480,250);break;case 'TableProp':B=new FCKDialogCommand('Table',FCKLang.DlgTableTitle,'dialog/fck_table.html?Parent',480,250);break;case 'TableCellProp':B=new FCKDialogCommand('TableCell',FCKLang.DlgCellTitle,'dialog/fck_tablecell.html',550,240);break;case 'Style':B=new FCKStyleCommand();break;case 'FontName':B=new FCKFontNameCommand();break;case 'FontSize':B=new FCKFontSizeCommand();break;case 'FontFormat':B=new FCKFormatBlockCommand();break;case 'Source':B=new FCKSourceCommand();break;case 'Preview':B=new FCKPreviewCommand();break;case 'Save':B=new FCKSaveCommand();break;case 'NewPage':B=new FCKNewPageCommand();break;case 'PageBreak':B=new FCKPageBreakCommand();break;case 'Rule':B=new FCKRuleCommand();break;case 'Nbsp':B=new FCKNbsp();break;case 'TextColor':B=new FCKTextColorCommand('ForeColor');break;case 'BGColor':B=new FCKTextColorCommand('BackColor');break;case 'Paste':B=new FCKPasteCommand();break;case 'PasteText':B=new FCKPastePlainTextCommand();break;case 'PasteWord':B=new FCKPasteWordCommand();break;case 'JustifyLeft':B=new FCKJustifyCommand('left');break;case 'JustifyCenter':B=new FCKJustifyCommand('center');break;case 'JustifyRight':B=new FCKJustifyCommand('right');break;case 'JustifyFull':B=new FCKJustifyCommand('justify');break;case 'Indent':B=new FCKIndentCommand('indent',FCKConfig.IndentLength);break;case 'Outdent':B=new FCKIndentCommand('outdent',FCKConfig.IndentLength*-1);break;case 'Blockquote':B=new FCKBlockQuoteCommand();break;case 'CreateDiv':B=new FCKDialogCommand('CreateDiv',FCKLang.CreateDiv,'dialog/fck_div.html',380,210,null,null,true);break;case 'EditDiv':B=new FCKDialogCommand('EditDiv',FCKLang.EditDiv,'dialog/fck_div.html',380,210,null,null,false);break;case 'DeleteDiv':B=new FCKDeleteDivCommand();break;case 'TableInsertRowAfter':B=new FCKTableCommand('TableInsertRowAfter');break;case 'TableInsertRowBefore':B=new FCKTableCommand('TableInsertRowBefore');break;case 'TableDeleteRows':B=new FCKTableCommand('TableDeleteRows');break;case 'TableInsertColumnAfter':B=new FCKTableCommand('TableInsertColumnAfter');break;case 'TableInsertColumnBefore':B=new FCKTableCommand('TableInsertColumnBefore');break;case 'TableDeleteColumns':B=new FCKTableCommand('TableDeleteColumns');break;case 'TableInsertCellAfter':B=new FCKTableCommand('TableInsertCellAfter');break;case 'TableInsertCellBefore':B=new FCKTableCommand('TableInsertCellBefore');break;case 'TableDeleteCells':B=new FCKTableCommand('TableDeleteCells');break;case 'TableMergeCells':B=new FCKTableCommand('TableMergeCells');break;case 'TableMergeRight':B=new FCKTableCommand('TableMergeRight');break;case 'TableMergeDown':B=new FCKTableCommand('TableMergeDown');break;case 'TableHorizontalSplitCell':B=new FCKTableCommand('TableHorizontalSplitCell');break;case 'TableVerticalSplitCell':B=new FCKTableCommand('TableVerticalSplitCell');break;case 'TableDelete':B=new FCKTableCommand('TableDelete');break;case 'Form':B=new FCKDialogCommand('Form',FCKLang.Form,'dialog/fck_form.html',380,210);break;case 'Checkbox':B=new FCKDialogCommand('Checkbox',FCKLang.Checkbox,'dialog/fck_checkbox.html',380,200);break;case 'Radio':B=new FCKDialogCommand('Radio',FCKLang.RadioButton,'dialog/fck_radiobutton.html',380,200);break;case 'TextField':B=new FCKDialogCommand('TextField',FCKLang.TextField,'dialog/fck_textfield.html',380,210);break;case 'Textarea':B=new FCKDialogCommand('Textarea',FCKLang.Textarea,'dialog/fck_textarea.html',380,210);break;case 'HiddenField':B=new FCKDialogCommand('HiddenField',FCKLang.HiddenField,'dialog/fck_hiddenfield.html',380,190);break;case 'Button':B=new FCKDialogCommand('Button',FCKLang.Button,'dialog/fck_button.html',380,210);break;case 'Select':B=new FCKDialogCommand('Select',FCKLang.SelectionField,'dialog/fck_select.html',400,340);break;case 'ImageButton':B=new FCKDialogCommand('ImageButton',FCKLang.ImageButton,'dialog/fck_image.html?ImageButton',450,390);break;case 'SpellCheck':B=new FCKSpellCheckCommand();break;case 'FitWindow':B=new FCKFitWindow();break;case 'Undo':B=new FCKUndoCommand();break;case 'Redo':B=new FCKRedoCommand();break;case 'Copy':B=new FCKCutCopyCommand(false);break;case 'Cut':B=new FCKCutCopyCommand(true);break;case 'SelectAll':B=new FCKSelectAllCommand();break;case 'InsertOrderedList':B=new FCKListCommand('insertorderedlist','ol');break;case 'InsertUnorderedList':B=new FCKListCommand('insertunorderedlist','ul');break;case 'ShowBlocks':B=new FCKShowBlockCommand('ShowBlocks',FCKConfig.StartupShowBlocks?1:0);break;case 'Undefined':B=new FCKUndefinedCommand();break;default:if (FCKRegexLib.NamedCommands.test(A)) B=new FCKNamedCommand(A);else{alert(FCKLang.UnknownCommand.replace(/%1/g,A));return null;}};FCKCommands.LoadedCommands[A]=B;return B;};FCKCommands.GetFullPageState=function(){return FCKConfig.FullPage?0:-1;};FCKCommands.GetBooleanState=function(A){return A?-1:0;};
var FCKPanel=function(A){this.IsRTL=(FCKLang.Dir=='rtl');this.IsContextMenu=false;this._LockCounter=0;this._Window=A||window;var B;if (FCKBrowserInfo.IsIE){this._Popup=this._Window.createPopup();var C=this._Window.document;if (FCK_IS_CUSTOM_DOMAIN&&!FCKBrowserInfo.IsIE7){C.domain=FCK_ORIGINAL_DOMAIN;document.domain=FCK_ORIGINAL_DOMAIN;};B=this.Document=this._Popup.document;if (FCK_IS_CUSTOM_DOMAIN){B.domain=FCK_RUNTIME_DOMAIN;C.domain=FCK_RUNTIME_DOMAIN;document.domain=FCK_RUNTIME_DOMAIN;};FCK.IECleanup.AddItem(this,FCKPanel_Cleanup);}else{var D=this._IFrame=this._Window.document.createElement('iframe');FCKTools.ResetStyles(D);D.src='javascript:void(0)';D.allowTransparency=true;D.frameBorder='0';D.scrolling='no';D.style.width=D.style.height='0px';FCKDomTools.SetElementStyles(D,{position:'absolute',zIndex:FCKConfig.FloatingPanelsZIndex});this._Window.document.body.appendChild(D);var E=D.contentWindow;B=this.Document=E.document;var F='';if (FCKBrowserInfo.IsSafari) F='<base href="'+window.document.location+'">';B.open();B.write('<html><head>'+F+'<\/head><body style="margin:0px;padding:0px;"><\/body><\/html>');B.close();if(FCKBrowserInfo.IsAIR) FCKAdobeAIR.Panel_Contructor(B,window.document.location);FCKTools.AddEventListenerEx(E,'focus',FCKPanel_Window_OnFocus,this);FCKTools.AddEventListenerEx(E,'blur',FCKPanel_Window_OnBlur,this);};B.dir=FCKLang.Dir;FCKTools.AddEventListener(B,'contextmenu',FCKTools.CancelEvent);this.MainNode=B.body.appendChild(B.createElement('DIV'));this.MainNode.style.cssFloat=this.IsRTL?'right':'left';};FCKPanel.prototype.AppendStyleSheet=function(A){FCKTools.AppendStyleSheet(this.Document,A);};FCKPanel.prototype.Preload=function(x,y,A){if (this._Popup) this._Popup.show(x,y,0,0,A);};FCKPanel.prototype.Show=function(x,y,A,B,C){var D;var E=this.MainNode;if (this._Popup){this._Popup.show(x,y,0,0,A);FCKDomTools.SetElementStyles(E,{B:B?B+'px':'',C:C?C+'px':''});D=E.offsetWidth;if (this.IsRTL){if (this.IsContextMenu) x=x-D+1;else if (A) x=(x*-1)+A.offsetWidth-D;};this._Popup.show(x,y,D,E.offsetHeight,A);if (this.OnHide){if (this._Timer) CheckPopupOnHide.call(this,true);this._Timer=FCKTools.SetInterval(CheckPopupOnHide,100,this);}}else{if (typeof(FCK.ToolbarSet.CurrentInstance.FocusManager)!='undefined') FCK.ToolbarSet.CurrentInstance.FocusManager.Lock();if (this.ParentPanel){this.ParentPanel.Lock();FCKPanel_Window_OnBlur(null,this.ParentPanel);};if (FCKBrowserInfo.IsGecko&&FCKBrowserInfo.IsMac){this._IFrame.scrolling='';FCKTools.RunFunction(function(){ this._IFrame.scrolling='no';},this);};if (FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel&&FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel!=this) FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel.Hide(false,true);FCKDomTools.SetElementStyles(E,{B:B?B+'px':'',C:C?C+'px':''});D=E.offsetWidth;if (!B) this._IFrame.width=1;if (!C) this._IFrame.height=1;D=E.offsetWidth||E.firstChild.offsetWidth;var F=FCKTools.GetDocumentPosition(this._Window,A.nodeType==9?(FCKTools.IsStrictMode(A)?A.documentElement:A.body):A);var G=FCKDomTools.GetPositionedAncestor(this._IFrame.parentNode);if (G){var H=FCKTools.GetDocumentPosition(FCKTools.GetElementWindow(G),G);F.x-=H.x;F.y-=H.y;};if (this.IsRTL&&!this.IsContextMenu) x=(x*-1);x+=F.x;y+=F.y;if (this.IsRTL){if (this.IsContextMenu) x=x-D+1;else if (A) x=x+A.offsetWidth-D;}else{var I=FCKTools.GetViewPaneSize(this._Window);var J=FCKTools.GetScrollPosition(this._Window);var K=I.Height+J.Y;var L=I.Width+J.X;if ((x+D)>L) x-=x+D-L;if ((y+E.offsetHeight)>K) y-=y+E.offsetHeight-K;};FCKDomTools.SetElementStyles(this._IFrame,{left:x+'px',top:y+'px'});this._IFrame.contentWindow.focus();this._IsOpened=true;var M=this;this._resizeTimer=setTimeout(function(){var N=E.offsetWidth||E.firstChild.offsetWidth;var O=E.offsetHeight;M._IFrame.style.width=N+'px';M._IFrame.style.height=O+'px';},0);FCK.ToolbarSet.CurrentInstance.GetInstanceObject('FCKPanel')._OpenedPanel=this;};FCKTools.RunFunction(this.OnShow,this);};FCKPanel.prototype.Hide=function(A,B){if (this._Popup) this._Popup.hide();else{if (!this._IsOpened||this._LockCounter>0) return;if (typeof(FCKFocusManager)!='undefined'&&!B) FCKFocusManager.Unlock();this._IFrame.style.width=this._IFrame.style.height='0px';this._IsOpened=false;if (this._resizeTimer){clearTimeout(this._resizeTimer);this._resizeTimer=null;};if (this.ParentPanel) this.ParentPanel.Unlock();if (!A) FCKTools.RunFunction(this.OnHide,this);}};FCKPanel.prototype.CheckIsOpened=function(){if (this._Popup) return this._Popup.isOpen;else return this._IsOpened;};FCKPanel.prototype.CreateChildPanel=function(){var A=this._Popup?FCKTools.GetDocumentWindow(this.Document):this._Window;var B=new FCKPanel(A);B.ParentPanel=this;return B;};FCKPanel.prototype.Lock=function(){this._LockCounter++;};FCKPanel.prototype.Unlock=function(){if (--this._LockCounter==0&&!this.HasFocus) this.Hide();};function FCKPanel_Window_OnFocus(e,A){A.HasFocus=true;};function FCKPanel_Window_OnBlur(e,A){A.HasFocus=false;if (A._LockCounter==0) FCKTools.RunFunction(A.Hide,A);};function CheckPopupOnHide(A){if (A||!this._Popup.isOpen){window.clearInterval(this._Timer);this._Timer=null;FCKTools.RunFunction(this.OnHide,this);}};function FCKPanel_Cleanup(){this._Popup=null;this._Window=null;this.Document=null;this.MainNode=null;};
var FCKIcon=function(A){var B=A?typeof(A):'undefined';switch (B){case 'number':this.Path=FCKConfig.SkinPath+'fck_strip.gif';this.Size=16;this.Position=A;break;case 'undefined':this.Path=FCK_SPACER_PATH;break;case 'string':this.Path=A;break;default:this.Path=A[0];this.Size=A[1];this.Position=A[2];}};FCKIcon.prototype.CreateIconElement=function(A){var B,eIconImage;if (this.Position){var C='-'+((this.Position-1)*this.Size)+'px';if (FCKBrowserInfo.IsIE){B=A.createElement('DIV');eIconImage=B.appendChild(A.createElement('IMG'));eIconImage.src=this.Path;eIconImage.style.top=C;}else{B=A.createElement('IMG');B.src=FCK_SPACER_PATH;B.style.backgroundPosition='0px '+C;B.style.backgroundImage='url("'+this.Path+'")';}}else{if (FCKBrowserInfo.IsIE){B=A.createElement('DIV');eIconImage=B.appendChild(A.createElement('IMG'));eIconImage.src=this.Path?this.Path:FCK_SPACER_PATH;}else{B=A.createElement('IMG');B.src=this.Path?this.Path:FCK_SPACER_PATH;}};B.className='TB_Button_Image';return B;};
var FCKToolbarButtonUI=function(A,B,C,D,E,F){this.Name=A;this.Label=B||A;this.Tooltip=C||this.Label;this.Style=E||0;this.State=F||0;this.Icon=new FCKIcon(D);if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKToolbarButtonUI_Cleanup);};FCKToolbarButtonUI.prototype._CreatePaddingElement=function(A){var B=A.createElement('IMG');B.className='TB_Button_Padding';B.src=FCK_SPACER_PATH;return B;};FCKToolbarButtonUI.prototype.Create=function(A){var B=FCKTools.GetElementDocument(A);var C=this.MainElement=B.createElement('DIV');C.title=this.Tooltip;if (FCKBrowserInfo.IsGecko) C.onmousedown=FCKTools.CancelEvent;FCKTools.AddEventListenerEx(C,'mouseover',FCKToolbarButtonUI_OnMouseOver,this);FCKTools.AddEventListenerEx(C,'mouseout',FCKToolbarButtonUI_OnMouseOut,this);FCKTools.AddEventListenerEx(C,'click',FCKToolbarButtonUI_OnClick,this);this.ChangeState(this.State,true);if (this.Style==0&&!this.ShowArrow){C.appendChild(this.Icon.CreateIconElement(B));}else{var D=C.appendChild(B.createElement('TABLE'));D.cellPadding=0;D.cellSpacing=0;var E=D.insertRow(-1);var F=E.insertCell(-1);if (this.Style==0||this.Style==2) F.appendChild(this.Icon.CreateIconElement(B));else F.appendChild(this._CreatePaddingElement(B));if (this.Style==1||this.Style==2){F=E.insertCell(-1);F.className='TB_Button_Text';F.noWrap=true;F.appendChild(B.createTextNode(this.Label));};if (this.ShowArrow){if (this.Style!=0){E.insertCell(-1).appendChild(this._CreatePaddingElement(B));};F=E.insertCell(-1);var G=F.appendChild(B.createElement('IMG'));G.src=FCKConfig.SkinPath+'images/toolbar.buttonarrow.gif';G.width=5;G.height=3;};F=E.insertCell(-1);F.appendChild(this._CreatePaddingElement(B));};A.appendChild(C);};FCKToolbarButtonUI.prototype.ChangeState=function(A,B){if (!B&&this.State==A) return;var e=this.MainElement;if (!e) return;switch (parseInt(A,10)){case 0:e.className='TB_Button_Off';break;case 1:e.className='TB_Button_On';break;case -1:e.className='TB_Button_Disabled';break;};this.State=A;};function FCKToolbarButtonUI_OnMouseOver(A,B){if (B.State==0) this.className='TB_Button_Off_Over';else if (B.State==1) this.className='TB_Button_On_Over';};function FCKToolbarButtonUI_OnMouseOut(A,B){if (B.State==0) this.className='TB_Button_Off';else if (B.State==1) this.className='TB_Button_On';};function FCKToolbarButtonUI_OnClick(A,B){if (B.OnClick&&B.State!=-1) B.OnClick(B);};function FCKToolbarButtonUI_Cleanup(){this.MainElement=null;};
@@ -94,7 +94,7 @@
var FCKToolbarFontsCombo=function(A,B){this.CommandName='FontName';this.Label=this.GetLabel();this.Tooltip=A?A:this.Label;this.Style=B?B:2;this.DefaultLabel=FCKConfig.DefaultFontLabel||'';};FCKToolbarFontsCombo.prototype=new FCKToolbarFontFormatCombo(false);FCKToolbarFontsCombo.prototype.GetLabel=function(){return FCKLang.Font;};FCKToolbarFontsCombo.prototype.GetStyles=function(){var A=FCKStyles.GetStyle('_FCK_FontFace');if (!A){alert("The FCKConfig.CoreStyles['Size'] setting was not found. Please check the fckconfig.js file");return {};};var B={};var C=FCKConfig.FontNames.split(';');for (var i=0;i<C.length;i++){var D=C[i].split('/');var E=D[0];var F=D[1]||E;var G=FCKTools.CloneObject(A);G.SetVariable('Font',E);G.Label=F;B[F]=G;};return B;};FCKToolbarFontsCombo.prototype.RefreshActiveItems=FCKToolbarStyleCombo.prototype.RefreshActiveItems;FCKToolbarFontsCombo.prototype.StyleCombo_OnBeforeClick=function(A){A.DeselectAll();var B=FCKSelection.GetBoundaryParentElement(true);if (B){var C=new FCKElementPath(B);for (var i in A.Items){var D=A.Items[i];var E=D.Style;if (E.CheckActive(C)){A.SelectItem(D);return;}}}};
var FCKToolbarFontSizeCombo=function(A,B){this.CommandName='FontSize';this.Label=this.GetLabel();this.Tooltip=A?A:this.Label;this.Style=B?B:2;this.DefaultLabel=FCKConfig.DefaultFontSizeLabel||'';this.FieldWidth=70;};FCKToolbarFontSizeCombo.prototype=new FCKToolbarFontFormatCombo(false);FCKToolbarFontSizeCombo.prototype.GetLabel=function(){return FCKLang.FontSize;};FCKToolbarFontSizeCombo.prototype.GetStyles=function(){var A=FCKStyles.GetStyle('_FCK_Size');if (!A){alert("The FCKConfig.CoreStyles['FontFace'] setting was not found. Please check the fckconfig.js file");return {};};var B={};var C=FCKConfig.FontSizes.split(';');for (var i=0;i<C.length;i++){var D=C[i].split('/');var E=D[0];var F=D[1]||E;var G=FCKTools.CloneObject(A);G.SetVariable('Size',E);G.Label=F;B[F]=G;};return B;};FCKToolbarFontSizeCombo.prototype.RefreshActiveItems=FCKToolbarStyleCombo.prototype.RefreshActiveItems;FCKToolbarFontSizeCombo.prototype.StyleCombo_OnBeforeClick=FCKToolbarFontsCombo.prototype.StyleCombo_OnBeforeClick;
var FCKToolbarPanelButton=function(A,B,C,D,E){this.CommandName=A;var F;if (E==null) F=FCKConfig.SkinPath+'toolbar/'+A.toLowerCase()+'.gif';else if (typeof(E)=='number') F=[FCKConfig.SkinPath+'fck_strip.gif',16,E];var G=this._UIButton=new FCKToolbarButtonUI(A,B,C,F,D);G._FCKToolbarPanelButton=this;G.ShowArrow=true;G.OnClick=FCKToolbarPanelButton_OnButtonClick;};FCKToolbarPanelButton.prototype.TypeName='FCKToolbarPanelButton';FCKToolbarPanelButton.prototype.Create=function(A){A.className+='Menu';this._UIButton.Create(A);var B=FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(this.CommandName)._Panel;this.RegisterPanel(B);};FCKToolbarPanelButton.prototype.RegisterPanel=function(A){if (A._FCKToolbarPanelButton) return;A._FCKToolbarPanelButton=this;var B=A.Document.body.appendChild(A.Document.createElement('div'));B.style.position='absolute';B.style.top='0px';var C=A._FCKToolbarPanelButtonLineDiv=B.appendChild(A.Document.createElement('IMG'));C.className='TB_ConnectionLine';C.style.position='absolute';C.src=FCK_SPACER_PATH;A.OnHide=FCKToolbarPanelButton_OnPanelHide;};function FCKToolbarPanelButton_OnButtonClick(A){var B=this._FCKToolbarPanelButton;var e=B._UIButton.MainElement;B._UIButton.ChangeState(1);var C=FCK.ToolbarSet.CurrentInstance.Commands.GetCommand(B.CommandName);var D=C._Panel;D._FCKToolbarPanelButtonLineDiv.style.width=(e.offsetWidth-2)+'px';C.Execute(0,e.offsetHeight-1,e);};function FCKToolbarPanelButton_OnPanelHide(){var A=this._FCKToolbarPanelButton;A._UIButton.ChangeState(0);};FCKToolbarPanelButton.prototype.RefreshState=FCKToolbarButton.prototype.RefreshState;FCKToolbarPanelButton.prototype.Enable=FCKToolbarButton.prototype.Enable;FCKToolbarPanelButton.prototype.Disable=FCKToolbarButton.prototype.Disable;
-var FCKToolbarItems={};FCKToolbarItems.LoadedItems={};FCKToolbarItems.RegisterItem=function(A,B){this.LoadedItems[A]=B;};FCKToolbarItems.GetItem=function(A){var B=FCKToolbarItems.LoadedItems[A];if (B) return B;switch (A){case 'Source':B=new FCKToolbarButton('Source',FCKLang.Source,null,2,true,true,1);break;case 'DocProps':B=new FCKToolbarButton('DocProps',FCKLang.DocProps,null,null,null,null,2);break;case 'Save':B=new FCKToolbarButton('Save',FCKLang.Save,null,null,true,null,3);break;case 'NewPage':B=new FCKToolbarButton('NewPage',FCKLang.NewPage,null,null,true,null,4);break;case 'Preview':B=new FCKToolbarButton('Preview',FCKLang.Preview,null,null,true,null,5);break;case 'Templates':B=new FCKToolbarButton('Templates',FCKLang.Templates,null,null,null,null,6);break;case 'About':B=new FCKToolbarButton('About',FCKLang.About,null,null,true,null,47);break;case 'Cut':B=new FCKToolbarButton('Cut',FCKLang.Cut,null,null,false,true,7);break;case 'Copy':B=new FCKToolbarButton('Copy',FCKLang.Copy,null,null,false,true,8);break;case 'Paste':B=new FCKToolbarButton('Paste',FCKLang.Paste,null,null,false,true,9);break;case 'PasteText':B=new FCKToolbarButton('PasteText',FCKLang.PasteText,null,null,false,true,10);break;case 'PasteWord':B=new FCKToolbarButton('PasteWord',FCKLang.PasteWord,null,null,false,true,11);break;case 'Print':B=new FCKToolbarButton('Print',FCKLang.Print,null,null,false,true,12);break;case 'SpellCheck':B=new FCKToolbarButton('SpellCheck',FCKLang.SpellCheck,null,null,null,null,13);break;case 'Undo':B=new FCKToolbarButton('Undo',FCKLang.Undo,null,null,false,true,14);break;case 'Redo':B=new FCKToolbarButton('Redo',FCKLang.Redo,null,null,false,true,15);break;case 'SelectAll':B=new FCKToolbarButton('SelectAll',FCKLang.SelectAll,null,null,true,null,18);break;case 'RemoveFormat':B=new FCKToolbarButton('RemoveFormat',FCKLang.RemoveFormat,null,null,false,true,19);break;case 'FitWindow':B=new FCKToolbarButton('FitWindow',FCKLang.FitWindow,null,null,true,true,66);break;case 'Bold':B=new FCKToolbarButton('Bold',FCKLang.Bold,null,null,false,true,20);break;case 'Italic':B=new FCKToolbarButton('Italic',FCKLang.Italic,null,null,false,true,21);break;case 'Underline':B=new FCKToolbarButton('Underline',FCKLang.Underline,null,null,false,true,22);break;case 'StrikeThrough':B=new FCKToolbarButton('StrikeThrough',FCKLang.StrikeThrough,null,null,false,true,23);break;case 'Subscript':B=new FCKToolbarButton('Subscript',FCKLang.Subscript,null,null,false,true,24);break;case 'Superscript':B=new FCKToolbarButton('Superscript',FCKLang.Superscript,null,null,false,true,25);break;case 'OrderedList':B=new FCKToolbarButton('InsertOrderedList',FCKLang.NumberedListLbl,FCKLang.NumberedList,null,false,true,26);break;case 'UnorderedList':B=new FCKToolbarButton('InsertUnorderedList',FCKLang.BulletedListLbl,FCKLang.BulletedList,null,false,true,27);break;case 'Outdent':B=new FCKToolbarButton('Outdent',FCKLang.DecreaseIndent,null,null,false,true,28);break;case 'Indent':B=new FCKToolbarButton('Indent',FCKLang.IncreaseIndent,null,null,false,true,29);break;case 'Blockquote':B=new FCKToolbarButton('Blockquote',FCKLang.Blockquote,null,null,false,true,73);break;case 'Link':B=new FCKToolbarButton('Link',FCKLang.InsertLinkLbl,FCKLang.InsertLink,null,false,true,34);break;case 'Unlink':B=new FCKToolbarButton('Unlink',FCKLang.RemoveLink,null,null,false,true,35);break;case 'Anchor':B=new FCKToolbarButton('Anchor',FCKLang.Anchor,null,null,null,null,36);break;case 'Image':B=new FCKToolbarButton('Image',FCKLang.InsertImageLbl,FCKLang.InsertImage,null,false,true,37);break;case 'Flash':B=new FCKToolbarButton('Flash',FCKLang.InsertFlashLbl,FCKLang.InsertFlash,null,false,true,38);break;case 'Table':B=new FCKToolbarButton('Table',FCKLang.InsertTableLbl,FCKLang.InsertTable,null,false,true,39);break;case 'SpecialChar':B=new FCKToolbarButton('SpecialChar',FCKLang.InsertSpecialCharLbl,FCKLang.InsertSpecialChar,null,false,true,42);break;case 'Smiley':B=new FCKToolbarButton('Smiley',FCKLang.InsertSmileyLbl,FCKLang.InsertSmiley,null,false,true,41);break;case 'PageBreak':B=new FCKToolbarButton('PageBreak',FCKLang.PageBreakLbl,FCKLang.PageBreak,null,false,true,43);break;case 'Rule':B=new FCKToolbarButton('Rule',FCKLang.InsertLineLbl,FCKLang.InsertLine,null,false,true,40);break;case 'JustifyLeft':B=new FCKToolbarButton('JustifyLeft',FCKLang.LeftJustify,null,null,false,true,30);break;case 'JustifyCenter':B=new FCKToolbarButton('JustifyCenter',FCKLang.CenterJustify,null,null,false,true,31);break;case 'JustifyRight':B=new FCKToolbarButton('JustifyRight',FCKLang.RightJustify,null,null,false,true,32);break;case 'JustifyFull':B=new FCKToolbarButton('JustifyFull',FCKLang.BlockJustify,null,null,false,true,33);break;case 'Style':B=new FCKToolbarStyleCombo();break;case 'FontName':B=new FCKToolbarFontsCombo();break;case 'FontSize':B=new FCKToolbarFontSizeCombo();break;case 'FontFormat':B=new FCKToolbarFontFormatCombo();break;case 'TextColor':B=new FCKToolbarPanelButton('TextColor',FCKLang.TextColor,null,null,45);break;case 'BGColor':B=new FCKToolbarPanelButton('BGColor',FCKLang.BGColor,null,null,46);break;case 'Find':B=new FCKToolbarButton('Find',FCKLang.Find,null,null,null,null,16);break;case 'Replace':B=new FCKToolbarButton('Replace',FCKLang.Replace,null,null,null,null,17);break;case 'Form':B=new FCKToolbarButton('Form',FCKLang.Form,null,null,null,null,48);break;case 'Checkbox':B=new FCKToolbarButton('Checkbox',FCKLang.Checkbox,null,null,null,null,49);break;case 'Radio':B=new FCKToolbarButton('Radio',FCKLang.RadioButton,null,null,null,null,50);break;case 'TextField':B=new FCKToolbarButton('TextField',FCKLang.TextField,null,null,null,null,51);break;case 'Textarea':B=new FCKToolbarButton('Textarea',FCKLang.Textarea,null,null,null,null,52);break;case 'HiddenField':B=new FCKToolbarButton('HiddenField',FCKLang.HiddenField,null,null,null,null,56);break;case 'Button':B=new FCKToolbarButton('Button',FCKLang.Button,null,null,null,null,54);break;case 'Select':B=new FCKToolbarButton('Select',FCKLang.SelectionField,null,null,null,null,53);break;case 'ImageButton':B=new FCKToolbarButton('ImageButton',FCKLang.ImageButton,null,null,null,null,55);break;case 'ShowBlocks':B=new FCKToolbarButton('ShowBlocks',FCKLang.ShowBlocks,null,null,null,true,72);break;default:alert(FCKLang.UnknownToolbarItem.replace(/%1/g,A));return null;};FCKToolbarItems.LoadedItems[A]=B;return B;};
+var FCKToolbarItems={};FCKToolbarItems.LoadedItems={};FCKToolbarItems.RegisterItem=function(A,B){this.LoadedItems[A]=B;};FCKToolbarItems.GetItem=function(A){var B=FCKToolbarItems.LoadedItems[A];if (B) return B;switch (A){case 'Source':B=new FCKToolbarButton('Source',FCKLang.Source,null,2,true,true,1);break;case 'DocProps':B=new FCKToolbarButton('DocProps',FCKLang.DocProps,null,null,null,null,2);break;case 'Save':B=new FCKToolbarButton('Save',FCKLang.Save,null,null,true,null,3);break;case 'NewPage':B=new FCKToolbarButton('NewPage',FCKLang.NewPage,null,null,true,null,4);break;case 'Preview':B=new FCKToolbarButton('Preview',FCKLang.Preview,null,null,true,null,5);break;case 'Templates':B=new FCKToolbarButton('Templates',FCKLang.Templates,null,null,null,null,6);break;case 'About':B=new FCKToolbarButton('About',FCKLang.About,null,null,true,null,47);break;case 'Cut':B=new FCKToolbarButton('Cut',FCKLang.Cut,null,null,false,true,7);break;case 'Copy':B=new FCKToolbarButton('Copy',FCKLang.Copy,null,null,false,true,8);break;case 'Paste':B=new FCKToolbarButton('Paste',FCKLang.Paste,null,null,false,true,9);break;case 'PasteText':B=new FCKToolbarButton('PasteText',FCKLang.PasteText,null,null,false,true,10);break;case 'PasteWord':B=new FCKToolbarButton('PasteWord',FCKLang.PasteWord,null,null,false,true,11);break;case 'Print':B=new FCKToolbarButton('Print',FCKLang.Print,null,null,false,true,12);break;case 'SpellCheck':B=new FCKToolbarButton('SpellCheck',FCKLang.SpellCheck,null,null,null,null,13);break;case 'Undo':B=new FCKToolbarButton('Undo',FCKLang.Undo,null,null,false,true,14);break;case 'Redo':B=new FCKToolbarButton('Redo',FCKLang.Redo,null,null,false,true,15);break;case 'SelectAll':B=new FCKToolbarButton('SelectAll',FCKLang.SelectAll,null,null,true,null,18);break;case 'RemoveFormat':B=new FCKToolbarButton('RemoveFormat',FCKLang.RemoveFormat,null,null,false,true,19);break;case 'FitWindow':B=new FCKToolbarButton('FitWindow',FCKLang.FitWindow,null,null,true,true,66);break;case 'Bold':B=new FCKToolbarButton('Bold',FCKLang.Bold,null,null,false,true,20);break;case 'Italic':B=new FCKToolbarButton('Italic',FCKLang.Italic,null,null,false,true,21);break;case 'Underline':B=new FCKToolbarButton('Underline',FCKLang.Underline,null,null,false,true,22);break;case 'StrikeThrough':B=new FCKToolbarButton('StrikeThrough',FCKLang.StrikeThrough,null,null,false,true,23);break;case 'Subscript':B=new FCKToolbarButton('Subscript',FCKLang.Subscript,null,null,false,true,24);break;case 'Superscript':B=new FCKToolbarButton('Superscript',FCKLang.Superscript,null,null,false,true,25);break;case 'OrderedList':B=new FCKToolbarButton('InsertOrderedList',FCKLang.NumberedListLbl,FCKLang.NumberedList,null,false,true,26);break;case 'UnorderedList':B=new FCKToolbarButton('InsertUnorderedList',FCKLang.BulletedListLbl,FCKLang.BulletedList,null,false,true,27);break;case 'Outdent':B=new FCKToolbarButton('Outdent',FCKLang.DecreaseIndent,null,null,false,true,28);break;case 'Indent':B=new FCKToolbarButton('Indent',FCKLang.IncreaseIndent,null,null,false,true,29);break;case 'Blockquote':B=new FCKToolbarButton('Blockquote',FCKLang.Blockquote,null,null,false,true,73);break;case 'CreateDiv':B=new FCKToolbarButton('CreateDiv',FCKLang.CreateDiv,null,null,false,true,74);break;case 'Link':B=new FCKToolbarButton('Link',FCKLang.InsertLinkLbl,FCKLang.InsertLink,null,false,true,34);break;case 'Unlink':B=new FCKToolbarButton('Unlink',FCKLang.RemoveLink,null,null,false,true,35);break;case 'Anchor':B=new FCKToolbarButton('Anchor',FCKLang.Anchor,null,null,null,null,36);break;case 'Image':B=new FCKToolbarButton('Image',FCKLang.InsertImageLbl,FCKLang.InsertImage,null,false,true,37);break;case 'Flash':B=new FCKToolbarButton('Flash',FCKLang.InsertFlashLbl,FCKLang.InsertFlash,null,false,true,38);break;case 'Table':B=new FCKToolbarButton('Table',FCKLang.InsertTableLbl,FCKLang.InsertTable,null,false,true,39);break;case 'SpecialChar':B=new FCKToolbarButton('SpecialChar',FCKLang.InsertSpecialCharLbl,FCKLang.InsertSpecialChar,null,false,true,42);break;case 'Smiley':B=new FCKToolbarButton('Smiley',FCKLang.InsertSmileyLbl,FCKLang.InsertSmiley,null,false,true,41);break;case 'PageBreak':B=new FCKToolbarButton('PageBreak',FCKLang.PageBreakLbl,FCKLang.PageBreak,null,false,true,43);break;case 'Rule':B=new FCKToolbarButton('Rule',FCKLang.InsertLineLbl,FCKLang.InsertLine,null,false,true,40);break;case 'JustifyLeft':B=new FCKToolbarButton('JustifyLeft',FCKLang.LeftJustify,null,null,false,true,30);break;case 'JustifyCenter':B=new FCKToolbarButton('JustifyCenter',FCKLang.CenterJustify,null,null,false,true,31);break;case 'JustifyRight':B=new FCKToolbarButton('JustifyRight',FCKLang.RightJustify,null,null,false,true,32);break;case 'JustifyFull':B=new FCKToolbarButton('JustifyFull',FCKLang.BlockJustify,null,null,false,true,33);break;case 'Style':B=new FCKToolbarStyleCombo();break;case 'FontName':B=new FCKToolbarFontsCombo();break;case 'FontSize':B=new FCKToolbarFontSizeCombo();break;case 'FontFormat':B=new FCKToolbarFontFormatCombo();break;case 'TextColor':B=new FCKToolbarPanelButton('TextColor',FCKLang.TextColor,null,null,45);break;case 'BGColor':B=new FCKToolbarPanelButton('BGColor',FCKLang.BGColor,null,null,46);break;case 'Find':B=new FCKToolbarButton('Find',FCKLang.Find,null,null,null,null,16);break;case 'Replace':B=new FCKToolbarButton('Replace',FCKLang.Replace,null,null,null,null,17);break;case 'Form':B=new FCKToolbarButton('Form',FCKLang.Form,null,null,null,null,48);break;case 'Checkbox':B=new FCKToolbarButton('Checkbox',FCKLang.Checkbox,null,null,null,null,49);break;case 'Radio':B=new FCKToolbarButton('Radio',FCKLang.RadioButton,null,null,null,null,50);break;case 'TextField':B=new FCKToolbarButton('TextField',FCKLang.TextField,null,null,null,null,51);break;case 'Textarea':B=new FCKToolbarButton('Textarea',FCKLang.Textarea,null,null,null,null,52);break;case 'HiddenField':B=new FCKToolbarButton('HiddenField',FCKLang.HiddenField,null,null,null,null,56);break;case 'Button':B=new FCKToolbarButton('Button',FCKLang.Button,null,null,null,null,54);break;case 'Select':B=new FCKToolbarButton('Select',FCKLang.SelectionField,null,null,null,null,53);break;case 'ImageButton':B=new FCKToolbarButton('ImageButton',FCKLang.ImageButton,null,null,null,null,55);break;case 'ShowBlocks':B=new FCKToolbarButton('ShowBlocks',FCKLang.ShowBlocks,null,null,null,true,72);break;default:alert(FCKLang.UnknownToolbarItem.replace(/%1/g,A));return null;};FCKToolbarItems.LoadedItems[A]=B;return B;};
var FCKToolbar=function(){this.Items=[];};FCKToolbar.prototype.AddItem=function(A){return this.Items[this.Items.length]=A;};FCKToolbar.prototype.AddButton=function(A,B,C,D,E,F){if (typeof(D)=='number') D=[this.DefaultIconsStrip,this.DefaultIconSize,D];var G=new FCKToolbarButtonUI(A,B,C,D,E,F);G._FCKToolbar=this;G.OnClick=FCKToolbar_OnItemClick;return this.AddItem(G);};function FCKToolbar_OnItemClick(A){var B=A._FCKToolbar;if (B.OnItemClick) B.OnItemClick(B,A);};FCKToolbar.prototype.AddSeparator=function(){this.AddItem(new FCKToolbarSeparator());};FCKToolbar.prototype.Create=function(A){var B=FCKTools.GetElementDocument(A);var e=B.createElement('table');e.className='TB_Toolbar';e.style.styleFloat=e.style.cssFloat=(FCKLang.Dir=='ltr'?'left':'right');e.dir=FCKLang.Dir;e.cellPadding=0;e.cellSpacing=0;var C=e.insertRow(-1);var D;if (!this.HideStart){D=C.insertCell(-1);D.appendChild(B.createElement('div')).className='TB_Start';};for (var i=0;i<this.Items.length;i++){this.Items[i].Create(C.insertCell(-1));};if (!this.HideEnd){D=C.insertCell(-1);D.appendChild(B.createElement('div')).className='TB_End';};A.appendChild(e);};var FCKToolbarSeparator=function(){};FCKToolbarSeparator.prototype.Create=function(A){FCKTools.AppendElement(A,'div').className='TB_Separator';};
var FCKToolbarBreak=function(){};FCKToolbarBreak.prototype.Create=function(A){var B=FCKTools.GetElementDocument(A).createElement('div');B.className='TB_Break';B.style.clear=FCKLang.Dir=='rtl'?'left':'right';A.appendChild(B);};
function FCKToolbarSet_Create(A){var B;var C=A||FCKConfig.ToolbarLocation;switch (C){case 'In':document.getElementById('xToolbarRow').style.display='';B=new FCKToolbarSet(document);break;case 'None':B=new FCKToolbarSet(document);break;default:FCK.Events.AttachEvent('OnBlur',FCK_OnBlur);FCK.Events.AttachEvent('OnFocus',FCK_OnFocus);var D;var E=C.match(/^Out:(.+)\((\w+)\)$/);if (E){if (FCKBrowserInfo.IsAIR) FCKAdobeAIR.ToolbarSet_GetOutElement(window,E);else D=eval('parent.'+E[1]).document.getElementById(E[2]);}else{E=C.match(/^Out:(\w+)$/);if (E) D=parent.document.getElementById(E[1]);};if (!D){alert('Invalid value for "ToolbarLocation"');return arguments.callee('In');};B=D.__FCKToolbarSet;if (B) break;var F=FCKTools.GetElementDocument(D).createElement('iframe');F.src='javascript:void(0)';F.frameBorder=0;F.width='100%';F.height='10';D.appendChild(F);F.unselectable='on';var G=F.contentWindow.document;var H='';if (FCKBrowserInfo.IsSafari) H='<base href="'+window.document.location+'">';G.open();G.write('<html><head>'+H+'<script type="text/javascript"> var adjust = function() { window.frameElement.height = document.body.scrollHeight ; }; window.onresize = window.onload = function(){var timer = null;var lastHeight = -1;var lastChange = 0;var poller = function(){var currentHeight = document.body.scrollHeight || 0;var currentTime = (new Date()).getTime();if (currentHeight != lastHeight){lastChange = currentTime;adjust();lastHeight = document.body.scrollHeight;}if (lastChange < currentTime - 1000) clearInterval(timer);};timer = setInterval(poller, 100);}</script></head><body style="overflow: hidden">'+document.getElementById('xToolbarSpace').innerHTML+'</body></html>');G.close();if(FCKBrowserInfo.IsAIR) FCKAdobeAIR.ToolbarSet_InitOutFrame(G);FCKTools.AddEventListener(G,'contextmenu',FCKTools.CancelEvent);FCKTools.AppendStyleSheet(G,FCKConfig.SkinEditorCSS);B=D.__FCKToolbarSet=new FCKToolbarSet(G);B._IFrame=F;if (FCK.IECleanup) FCK.IECleanup.AddItem(D,FCKToolbarSet_Target_Cleanup);};B.CurrentInstance=FCK;if (!B.ToolbarItems) B.ToolbarItems=FCKToolbarItems;FCK.AttachToOnSelectionChange(B.RefreshItemsState);return B;};function FCK_OnBlur(A){var B=A.ToolbarSet;if (B.CurrentInstance==A) B.Disable();};function FCK_OnFocus(A){var B=A.ToolbarSet;var C=A||FCK;B.CurrentInstance.FocusManager.RemoveWindow(B._IFrame.contentWindow);B.CurrentInstance=C;C.FocusManager.AddWindow(B._IFrame.contentWindow,true);B.Enable();};function FCKToolbarSet_Cleanup(){this._TargetElement=null;this._IFrame=null;};function FCKToolbarSet_Target_Cleanup(){this.__FCKToolbarSet=null;};var FCKToolbarSet=function(A){this._Document=A;this._TargetElement=A.getElementById('xToolbar');var B=A.getElementById('xExpandHandle');var C=A.getElementById('xCollapseHandle');B.title=FCKLang.ToolbarExpand;FCKTools.AddEventListener(B,'click',FCKToolbarSet_Expand_OnClick);C.title=FCKLang.ToolbarCollapse;FCKTools.AddEventListener(C,'click',FCKToolbarSet_Collapse_OnClick);if (!FCKConfig.ToolbarCanCollapse||FCKConfig.ToolbarStartExpanded) this.Expand();else this.Collapse();C.style.display=FCKConfig.ToolbarCanCollapse?'':'none';if (FCKConfig.ToolbarCanCollapse) C.style.display='';else A.getElementById('xTBLeftBorder').style.display='';this.Toolbars=[];this.IsLoaded=false;if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKToolbarSet_Cleanup);};function FCKToolbarSet_Expand_OnClick(){FCK.ToolbarSet.Expand();};function FCKToolbarSet_Collapse_OnClick(){FCK.ToolbarSet.Collapse();};FCKToolbarSet.prototype.Expand=function(){this._ChangeVisibility(false);};FCKToolbarSet.prototype.Collapse=function(){this._ChangeVisibility(true);};FCKToolbarSet.prototype._ChangeVisibility=function(A){this._Document.getElementById('xCollapsed').style.display=A?'':'none';this._Document.getElementById('xExpanded').style.display=A?'none':'';if (FCKBrowserInfo.IsGecko){FCKTools.RunFunction(window.onresize);}};FCKToolbarSet.prototype.Load=function(A){this.Name=A;this.Items=[];this.ItemsWysiwygOnly=[];this.ItemsContextSensitive=[];this._TargetElement.innerHTML='';var B=FCKConfig.ToolbarSets[A];if (!B){alert(FCKLang.UnknownToolbarSet.replace(/%1/g,A));return;};this.Toolbars=[];for (var x=0;x<B.length;x++){var C=B[x];if (!C) continue;var D;if (typeof(C)=='string'){if (C=='/') D=new FCKToolbarBreak();}else{D=new FCKToolbar();for (var j=0;j<C.length;j++){var E=C[j];if (E=='-') D.AddSeparator();else{var F=FCKToolbarItems.GetItem(E);if (F){D.AddItem(F);this.Items.push(F);if (!F.SourceView) this.ItemsWysiwygOnly.push(F);if (F.ContextSensitive) this.ItemsContextSensitive.push(F);}}}};D.Create(this._TargetElement);this.Toolbars[this.Toolbars.length]=D;};FCKTools.DisableSelection(this._Document.getElementById('xCollapseHandle').parentNode);if (FCK.Status!=2) FCK.Events.AttachEvent('OnStatusChange',this.RefreshModeState);else this.RefreshModeState();this.IsLoaded=true;this.IsEnabled=true;FCKTools.RunFunction(this.OnLoad);};FCKToolbarSet.prototype.Enable=function(){if (this.IsEnabled) return;this.IsEnabled=true;var A=this.Items;for (var i=0;i<A.length;i++) A[i].RefreshState();};FCKToolbarSet.prototype.Disable=function(){if (!this.IsEnabled) return;this.IsEnabled=false;var A=this.Items;for (var i=0;i<A.length;i++) A[i].Disable();};FCKToolbarSet.prototype.RefreshModeState=function(A){if (FCK.Status!=2) return;var B=A?A.ToolbarSet:this;var C=B.ItemsWysiwygOnly;if (FCK.EditMode==0){for (var i=0;i<C.length;i++) C[i].Enable();B.RefreshItemsState(A);}else{B.RefreshItemsState(A);for (var j=0;j<C.length;j++) C[j].Disable();}};FCKToolbarSet.prototype.RefreshItemsState=function(A){var B=(A?A.ToolbarSet:this).ItemsContextSensitive;for (var i=0;i<B.length;i++) B[i].RefreshState();};
@@ -102,8 +102,8 @@
var FCKMenuItem=function(A,B,C,D,E,F){this.Name=B;this.Label=C||B;this.IsDisabled=E;this.Icon=new FCKIcon(D);this.SubMenu=new FCKMenuBlockPanel();this.SubMenu.Parent=A;this.SubMenu.OnClick=FCKTools.CreateEventListener(FCKMenuItem_SubMenu_OnClick,this);this.CustomData=F;if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKMenuItem_Cleanup);};FCKMenuItem.prototype.AddItem=function(A,B,C,D,E){this.HasSubMenu=true;return this.SubMenu.AddItem(A,B,C,D,E);};FCKMenuItem.prototype.AddSeparator=function(){this.SubMenu.AddSeparator();};FCKMenuItem.prototype.Create=function(A){var B=this.HasSubMenu;var C=FCKTools.GetElementDocument(A);var r=this.MainElement=A.insertRow(-1);r.className=this.IsDisabled?'MN_Item_Disabled':'MN_Item';if (!this.IsDisabled){FCKTools.AddEventListenerEx(r,'mouseover',FCKMenuItem_OnMouseOver,[this]);FCKTools.AddEventListenerEx(r,'click',FCKMenuItem_OnClick,[this]);if (!B) FCKTools.AddEventListenerEx(r,'mouseout',FCKMenuItem_OnMouseOut,[this]);};var D=r.insertCell(-1);D.className='MN_Icon';D.appendChild(this.Icon.CreateIconElement(C));D=r.insertCell(-1);D.className='MN_Label';D.noWrap=true;D.appendChild(C.createTextNode(this.Label));D=r.insertCell(-1);if (B){D.className='MN_Arrow';var E=D.appendChild(C.createElement('IMG'));E.src=FCK_IMAGES_PATH+'arrow_'+FCKLang.Dir+'.gif';E.width=4;E.height=7;this.SubMenu.Create();this.SubMenu.Panel.OnHide=FCKTools.CreateEventListener(FCKMenuItem_SubMenu_OnHide,this);}};FCKMenuItem.prototype.Activate=function(){this.MainElement.className='MN_Item_Over';if (this.HasSubMenu){this.SubMenu.Show(this.MainElement.offsetWidth+2,-2,this.MainElement);};FCKTools.RunFunction(this.OnActivate,this);};FCKMenuItem.prototype.Deactivate=function(){this.MainElement.className='MN_Item';if (this.HasSubMenu) this.SubMenu.Hide();};function FCKMenuItem_SubMenu_OnClick(A,B){FCKTools.RunFunction(B.OnClick,B,[A]);};function FCKMenuItem_SubMenu_OnHide(A){A.Deactivate();};function FCKMenuItem_OnClick(A,B){if (B.HasSubMenu) B.Activate();else{B.Deactivate();FCKTools.RunFunction(B.OnClick,B,[B]);}};function FCKMenuItem_OnMouseOver(A,B){B.Activate();};function FCKMenuItem_OnMouseOut(A,B){B.Deactivate();};function FCKMenuItem_Cleanup(){this.MainElement=null;};
var FCKMenuBlock=function(){this._Items=[];};FCKMenuBlock.prototype.Count=function(){return this._Items.length;};FCKMenuBlock.prototype.AddItem=function(A,B,C,D,E){var F=new FCKMenuItem(this,A,B,C,D,E);F.OnClick=FCKTools.CreateEventListener(FCKMenuBlock_Item_OnClick,this);F.OnActivate=FCKTools.CreateEventListener(FCKMenuBlock_Item_OnActivate,this);this._Items.push(F);return F;};FCKMenuBlock.prototype.AddSeparator=function(){this._Items.push(new FCKMenuSeparator());};FCKMenuBlock.prototype.RemoveAllItems=function(){this._Items=[];var A=this._ItemsTable;if (A){while (A.rows.length>0) A.deleteRow(0);}};FCKMenuBlock.prototype.Create=function(A){if (!this._ItemsTable){if (FCK.IECleanup) FCK.IECleanup.AddItem(this,FCKMenuBlock_Cleanup);this._Window=FCKTools.GetElementWindow(A);var B=FCKTools.GetElementDocument(A);var C=A.appendChild(B.createElement('table'));C.cellPadding=0;C.cellSpacing=0;FCKTools.DisableSelection(C);var D=C.insertRow(-1).insertCell(-1);D.className='MN_Menu';var E=this._ItemsTable=D.appendChild(B.createElement('table'));E.cellPadding=0;E.cellSpacing=0;};for (var i=0;i<this._Items.length;i++) this._Items[i].Create(this._ItemsTable);};function FCKMenuBlock_Item_OnClick(A,B){if (B.Hide) B.Hide();FCKTools.RunFunction(B.OnClick,B,[A]);};function FCKMenuBlock_Item_OnActivate(A){var B=A._ActiveItem;if (B&&B!=this){if (!FCKBrowserInfo.IsIE&&B.HasSubMenu&&!this.HasSubMenu){A._Window.focus();A.Panel.HasFocus=true;};B.Deactivate();};A._ActiveItem=this;};function FCKMenuBlock_Cleanup(){this._Window=null;this._ItemsTable=null;};var FCKMenuSeparator=function(){};FCKMenuSeparator.prototype.Create=function(A){var B=FCKTools.GetElementDocument(A);var r=A.insertRow(-1);var C=r.insertCell(-1);C.className='MN_Separator MN_Icon';C=r.insertCell(-1);C.className='MN_Separator';C.appendChild(B.createElement('DIV')).className='MN_Separator_Line';C=r.insertCell(-1);C.className='MN_Separator';C.appendChild(B.createElement('DIV')).className='MN_Separator_Line';};
var FCKMenuBlockPanel=function(){FCKMenuBlock.call(this);};FCKMenuBlockPanel.prototype=new FCKMenuBlock();FCKMenuBlockPanel.prototype.Create=function(){var A=this.Panel=(this.Parent&&this.Parent.Panel?this.Parent.Panel.CreateChildPanel():new FCKPanel());A.AppendStyleSheet(FCKConfig.SkinEditorCSS);FCKMenuBlock.prototype.Create.call(this,A.MainNode);};FCKMenuBlockPanel.prototype.Show=function(x,y,A){if (!this.Panel.CheckIsOpened()) this.Panel.Show(x,y,A);};FCKMenuBlockPanel.prototype.Hide=function(){if (this.Panel.CheckIsOpened()) this.Panel.Hide();};
-var FCKContextMenu=function(A,B){this.CtrlDisable=false;var C=this._Panel=new FCKPanel(A);C.AppendStyleSheet(FCKConfig.SkinEditorCSS);C.IsContextMenu=true;if (FCKBrowserInfo.IsGecko) C.Document.addEventListener('draggesture',function(e) {e.preventDefault();return false;},true);var D=this._MenuBlock=new FCKMenuBlock();D.Panel=C;D.OnClick=FCKTools.CreateEventListener(FCKContextMenu_MenuBlock_OnClick,this);this._Redraw=true;};FCKContextMenu.prototype.SetMouseClickWindow=function(A){if (!FCKBrowserInfo.IsIE){this._Document=A.document;if (FCKBrowserInfo.IsOpera&&!('oncontextmenu' in document.createElement('foo'))){this._Document.addEventListener('mousedown',FCKContextMenu_Document_OnMouseDown,false);this._Document.addEventListener('mouseup',FCKContextMenu_Document_OnMouseUp,false);};this._Document.addEventListener('contextmenu',FCKContextMenu_Document_OnContextMenu,false);}};FCKContextMenu.prototype.AddItem=function(A,B,C,D,E){var F=this._MenuBlock.AddItem(A,B,C,D,E);this._Redraw=true;return F;};FCKContextMenu.prototype.AddSeparator=function(){this._MenuBlock.AddSeparator();this._Redraw=true;};FCKContextMenu.prototype.RemoveAllItems=function(){this._MenuBlock.RemoveAllItems();this._Redraw=true;};FCKContextMenu.prototype.AttachToElement=function(A){if (FCKBrowserInfo.IsIE) FCKTools.AddEventListenerEx(A,'contextmenu',FCKContextMenu_AttachedElement_OnContextMenu,this);else A._FCKContextMenu=this;};function FCKContextMenu_Document_OnContextMenu(e){var A=e.target;while (A){if (A._FCKContextMenu){if (A._FCKContextMenu.CtrlDisable&&(e.ctrlKey||e.metaKey)) return true;FCKTools.CancelEvent(e);FCKContextMenu_AttachedElement_OnContextMenu(e,A._FCKContextMenu,A);return false;};A=A.parentNode;};return true;};var FCKContextMenu_OverrideButton;function FCKContextMenu_Document_OnMouseDown(e){if(!e||e.button!=2) return false;var A=e.target;while (A){if (A._FCKContextMenu){if (A._FCKContextMenu.CtrlDisable&&(e.ctrlKey||e.metaKey)) return true;var B=FCKContextMenu_OverrideButton;if(!B){var C=FCKTools.GetElementDocument(e.target);B=FCKContextMenu_OverrideButton=C.createElement('input');B.type='button';var D=C.createElement('p');C.body.appendChild(D);D.appendChild(B);};B.style.cssText='position:absolute;top:'+(e.clientY-2)+'px;left:'+(e.clientX-2)+'px;width:5px;height:5px;opacity:0.01';};A=A.parentNode;};return false;};function FCKContextMenu_Document_OnMouseUp(e){var A=FCKContextMenu_OverrideButton;if (A){var B=A.parentNode;B.parentNode.removeChild(B);FCKContextMenu_OverrideButton=undefined;if(e&&e.button==2){FCKContextMenu_Document_OnContextMenu(e);return false;}};return true;};function FCKContextMenu_AttachedElement_OnContextMenu(A,B,C){if (B.CtrlDisable&&(A.ctrlKey||A.metaKey)) return true;var D=C||this;if (B.OnBeforeOpen) B.OnBeforeOpen.call(B,D);if (B._MenuBlock.Count()==0) return false;if (B._Redraw){B._MenuBlock.Create(B._Panel.MainNode);B._Redraw=false;};FCKTools.DisableSelection(B._Panel.Document.body);var x=0;var y=0;if (FCKBrowserInfo.IsIE){x=A.screenX;y=A.screenY;}else if (FCKBrowserInfo.IsSafari){x=A.clientX;y=A.clientY;}else{x=A.pageX;y=A.pageY;};B._Panel.Show(x,y,A.currentTarget||null);return false;};function FCKContextMenu_MenuBlock_OnClick(A,B){B._Panel.Hide();FCKTools.RunFunction(B.OnItemClick,B,A);};
-FCK.ContextMenu={};FCK.ContextMenu.Listeners=[];FCK.ContextMenu.RegisterListener=function(A){if (A) this.Listeners.push(A);};function FCK_ContextMenu_Init(){var A=FCK.ContextMenu._InnerContextMenu=new FCKContextMenu(FCKBrowserInfo.IsIE?window:window.parent,FCKLang.Dir);A.CtrlDisable=FCKConfig.BrowserContextMenuOnCtrl;A.OnBeforeOpen=FCK_ContextMenu_OnBeforeOpen;A.OnItemClick=FCK_ContextMenu_OnItemClick;var B=FCK.ContextMenu;for (var i=0;i<FCKConfig.ContextMenu.length;i++) B.RegisterListener(FCK_ContextMenu_GetListener(FCKConfig.ContextMenu[i]));};function FCK_ContextMenu_GetListener(A){switch (A){case 'Generic':return {AddItems:function(menu,tag,tagName){menu.AddItem('Cut',FCKLang.Cut,7,FCKCommands.GetCommand('Cut').GetState()==-1);menu.AddItem('Copy',FCKLang.Copy,8,FCKCommands.GetCommand('Copy').GetState()==-1);menu.AddItem('Paste',FCKLang.Paste,9,FCKCommands.GetCommand('Paste').GetState()==-1);}};case 'Table':return {AddItems:function(menu,tag,tagName){var B=(tagName=='TABLE');var C=(!B&&FCKSelection.HasAncestorNode('TABLE'));if (C){menu.AddSeparator();var D=menu.AddItem('Cell',FCKLang.CellCM);D.AddItem('TableInsertCellBefore',FCKLang.InsertCellBefore,69);D.AddItem('TableInsertCellAfter',FCKLang.InsertCellAfter,58);D.AddItem('TableDeleteCells',FCKLang.DeleteCells,59);if (FCKBrowserInfo.IsGecko) D.AddItem('TableMergeCells',FCKLang.MergeCells,60,FCKCommands.GetCommand('TableMergeCells').GetState()==-1);else{D.AddItem('TableMergeRight',FCKLang.MergeRight,60,FCKCommands.GetCommand('TableMergeRight').GetState()==-1);D.AddItem('TableMergeDown',FCKLang.MergeDown,60,FCKCommands.GetCommand('TableMergeDown').GetState()==-1);};D.AddItem('TableHorizontalSplitCell',FCKLang.HorizontalSplitCell,61,FCKCommands.GetCommand('TableHorizontalSplitCell').GetState()==-1);D.AddItem('TableVerticalSplitCell',FCKLang.VerticalSplitCell,61,FCKCommands.GetCommand('TableVerticalSplitCell').GetState()==-1);D.AddSeparator();D.AddItem('TableCellProp',FCKLang.CellProperties,57,FCKCommands.GetCommand('TableCellProp').GetState()==-1);menu.AddSeparator();D=menu.AddItem('Row',FCKLang.RowCM);D.AddItem('TableInsertRowBefore',FCKLang.InsertRowBefore,70);D.AddItem('TableInsertRowAfter',FCKLang.InsertRowAfter,62);D.AddItem('TableDeleteRows',FCKLang.DeleteRows,63);menu.AddSeparator();D=menu.AddItem('Column',FCKLang.ColumnCM);D.AddItem('TableInsertColumnBefore',FCKLang.InsertColumnBefore,71);D.AddItem('TableInsertColumnAfter',FCKLang.InsertColumnAfter,64);D.AddItem('TableDeleteColumns',FCKLang.DeleteColumns,65);};if (B||C){menu.AddSeparator();menu.AddItem('TableDelete',FCKLang.TableDelete);menu.AddItem('TableProp',FCKLang.TableProperties,39);}}};case 'Link':return {AddItems:function(menu,tag,tagName){var E=(tagName=='A'||FCKSelection.HasAncestorNode('A'));if (E||FCK.GetNamedCommandState('Unlink')!=-1){var F=FCKSelection.MoveToAncestorNode('A');var G=(F&&F.name.length>0&&F.href.length==0);if (G) return;menu.AddSeparator();if (E) menu.AddItem('Link',FCKLang.EditLink,34);menu.AddItem('Unlink',FCKLang.RemoveLink,35);}}};case 'Image':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&!tag.getAttribute('_fckfakelement')){menu.AddSeparator();menu.AddItem('Image',FCKLang.ImageProperties,37);}}};case 'Anchor':return {AddItems:function(menu,tag,tagName){var F=FCKSelection.MoveToAncestorNode('A');var G=(F&&F.name.length>0);if (G||(tagName=='IMG'&&tag.getAttribute('_fckanchor'))){menu.AddSeparator();menu.AddItem('Anchor',FCKLang.AnchorProp,36);menu.AddItem('AnchorDelete',FCKLang.AnchorDelete);}}};case 'Flash':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&tag.getAttribute('_fckflash')){menu.AddSeparator();menu.AddItem('Flash',FCKLang.FlashProperties,38);}}};case 'Form':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('FORM')){menu.AddSeparator();menu.AddItem('Form',FCKLang.FormProp,48);}}};case 'Checkbox':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='checkbox'){menu.AddSeparator();menu.AddItem('Checkbox',FCKLang.CheckboxProp,49);}}};case 'Radio':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='radio'){menu.AddSeparator();menu.AddItem('Radio',FCKLang.RadioButtonProp,50);}}};case 'TextField':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&(tag.type=='text'||tag.type=='password')){menu.AddSeparator();menu.AddItem('TextField',FCKLang.TextFieldProp,51);}}};case 'HiddenField':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&tag.getAttribute('_fckinputhidden')){menu.AddSeparator();menu.AddItem('HiddenField',FCKLang.HiddenFieldProp,56);}}};case 'ImageButton':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='image'){menu.AddSeparator();menu.AddItem('ImageButton',FCKLang.ImageButtonProp,55);}}};case 'Button':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&(tag.type=='button'||tag.type=='submit'||tag.type=='reset')){menu.AddSeparator();menu.AddItem('Button',FCKLang.ButtonProp,54);}}};case 'Select':return {AddItems:function(menu,tag,tagName){if (tagName=='SELECT'){menu.AddSeparator();menu.AddItem('Select',FCKLang.SelectionFieldProp,53);}}};case 'Textarea':return {AddItems:function(menu,tag,tagName){if (tagName=='TEXTAREA'){menu.AddSeparator();menu.AddItem('Textarea',FCKLang.TextareaProp,52);}}};case 'BulletedList':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('UL')){menu.AddSeparator();menu.AddItem('BulletedList',FCKLang.BulletedListProp,27);}}};case 'NumberedList':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('OL')){menu.AddSeparator();menu.AddItem('NumberedList',FCKLang.NumberedListProp,26);}}};};return null;};function FCK_ContextMenu_OnBeforeOpen(){FCK.Events.FireEvent('OnSelectionChange');var A,sTagName;if ((A=FCKSelection.GetSelectedElement())) sTagName=A.tagName;var B=FCK.ContextMenu._InnerContextMenu;B.RemoveAllItems();var C=FCK.ContextMenu.Listeners;for (var i=0;i<C.length;i++) C[i].AddItems(B,A,sTagName);};function FCK_ContextMenu_OnItemClick(A){FCK.Focus();FCKCommands.GetCommand(A.Name).Execute(A.CustomData);};
+var FCKContextMenu=function(A,B){this.CtrlDisable=false;var C=this._Panel=new FCKPanel(A);C.AppendStyleSheet(FCKConfig.SkinEditorCSS);C.IsContextMenu=true;if (FCKBrowserInfo.IsGecko) C.Document.addEventListener('draggesture',function(e) {e.preventDefault();return false;},true);var D=this._MenuBlock=new FCKMenuBlock();D.Panel=C;D.OnClick=FCKTools.CreateEventListener(FCKContextMenu_MenuBlock_OnClick,this);this._Redraw=true;};FCKContextMenu.prototype.SetMouseClickWindow=function(A){if (!FCKBrowserInfo.IsIE){this._Document=A.document;if (FCKBrowserInfo.IsOpera&&!('oncontextmenu' in document.createElement('foo'))){this._Document.addEventListener('mousedown',FCKContextMenu_Document_OnMouseDown,false);this._Document.addEventListener('mouseup',FCKContextMenu_Document_OnMouseUp,false);};this._Document.addEventListener('contextmenu',FCKContextMenu_Document_OnContextMenu,false);}};FCKContextMenu.prototype.AddItem=function(A,B,C,D,E){var F=this._MenuBlock.AddItem(A,B,C,D,E);this._Redraw=true;return F;};FCKContextMenu.prototype.AddSeparator=function(){this._MenuBlock.AddSeparator();this._Redraw=true;};FCKContextMenu.prototype.RemoveAllItems=function(){this._MenuBlock.RemoveAllItems();this._Redraw=true;};FCKContextMenu.prototype.AttachToElement=function(A){if (FCKBrowserInfo.IsIE) FCKTools.AddEventListenerEx(A,'contextmenu',FCKContextMenu_AttachedElement_OnContextMenu,this);else A._FCKContextMenu=this;};function FCKContextMenu_Document_OnContextMenu(e){if (FCKConfig.BrowserContextMenu) return true;var A=e.target;while (A){if (A._FCKContextMenu){if (A._FCKContextMenu.CtrlDisable&&(e.ctrlKey||e.metaKey)) return true;FCKTools.CancelEvent(e);FCKContextMenu_AttachedElement_OnContextMenu(e,A._FCKContextMenu,A);return false;};A=A.parentNode;};return true;};var FCKContextMenu_OverrideButton;function FCKContextMenu_Document_OnMouseDown(e){if(!e||e.button!=2) return false;if (FCKConfig.BrowserContextMenu) return true;var A=e.target;while (A){if (A._FCKContextMenu){if (A._FCKContextMenu.CtrlDisable&&(e.ctrlKey||e.metaKey)) return true;var B=FCKContextMenu_OverrideButton;if(!B){var C=FCKTools.GetElementDocument(e.target);B=FCKContextMenu_OverrideButton=C.createElement('input');B.type='button';var D=C.createElement('p');C.body.appendChild(D);D.appendChild(B);};B.style.cssText='position:absolute;top:'+(e.clientY-2)+'px;left:'+(e.clientX-2)+'px;width:5px;height:5px;opacity:0.01';};A=A.parentNode;};return false;};function FCKContextMenu_Document_OnMouseUp(e){if (FCKConfig.BrowserContextMenu) return true;var A=FCKContextMenu_OverrideButton;if (A){var B=A.parentNode;B.parentNode.removeChild(B);FCKContextMenu_OverrideButton=undefined;if(e&&e.button==2){FCKContextMenu_Document_OnContextMenu(e);return false;}};return true;};function FCKContextMenu_AttachedElement_OnContextMenu(A,B,C){if ((B.CtrlDisable&&(A.ctrlKey||A.metaKey))||FCKConfig.BrowserContextMenu) return true;var D=C||this;if (B.OnBeforeOpen) B.OnBeforeOpen.call(B,D);if (B._MenuBlock.Count()==0) return false;if (B._Redraw){B._MenuBlock.Create(B._Panel.MainNode);B._Redraw=false;};FCKTools.DisableSelection(B._Panel.Document.body);var x=0;var y=0;if (FCKBrowserInfo.IsIE){x=A.screenX;y=A.screenY;}else if (FCKBrowserInfo.IsSafari){x=A.clientX;y=A.clientY;}else{x=A.pageX;y=A.pageY;};B._Panel.Show(x,y,A.currentTarget||null);return false;};function FCKContextMenu_MenuBlock_OnClick(A,B){B._Panel.Hide();FCKTools.RunFunction(B.OnItemClick,B,A);};
+FCK.ContextMenu={};FCK.ContextMenu.Listeners=[];FCK.ContextMenu.RegisterListener=function(A){if (A) this.Listeners.push(A);};function FCK_ContextMenu_Init(){var A=FCK.ContextMenu._InnerContextMenu=new FCKContextMenu(FCKBrowserInfo.IsIE?window:window.parent,FCKLang.Dir);A.CtrlDisable=FCKConfig.BrowserContextMenuOnCtrl;A.OnBeforeOpen=FCK_ContextMenu_OnBeforeOpen;A.OnItemClick=FCK_ContextMenu_OnItemClick;var B=FCK.ContextMenu;for (var i=0;i<FCKConfig.ContextMenu.length;i++) B.RegisterListener(FCK_ContextMenu_GetListener(FCKConfig.ContextMenu[i]));};function FCK_ContextMenu_GetListener(A){switch (A){case 'Generic':return {AddItems:function(menu,tag,tagName){menu.AddItem('Cut',FCKLang.Cut,7,FCKCommands.GetCommand('Cut').GetState()==-1);menu.AddItem('Copy',FCKLang.Copy,8,FCKCommands.GetCommand('Copy').GetState()==-1);menu.AddItem('Paste',FCKLang.Paste,9,FCKCommands.GetCommand('Paste').GetState()==-1);}};case 'Table':return {AddItems:function(menu,tag,tagName){var B=(tagName=='TABLE');var C=(!B&&FCKSelection.HasAncestorNode('TABLE'));if (C){menu.AddSeparator();var D=menu.AddItem('Cell',FCKLang.CellCM);D.AddItem('TableInsertCellBefore',FCKLang.InsertCellBefore,69);D.AddItem('TableInsertCellAfter',FCKLang.InsertCellAfter,58);D.AddItem('TableDeleteCells',FCKLang.DeleteCells,59);if (FCKBrowserInfo.IsGecko) D.AddItem('TableMergeCells',FCKLang.MergeCells,60,FCKCommands.GetCommand('TableMergeCells').GetState()==-1);else{D.AddItem('TableMergeRight',FCKLang.MergeRight,60,FCKCommands.GetCommand('TableMergeRight').GetState()==-1);D.AddItem('TableMergeDown',FCKLang.MergeDown,60,FCKCommands.GetCommand('TableMergeDown').GetState()==-1);};D.AddItem('TableHorizontalSplitCell',FCKLang.HorizontalSplitCell,61,FCKCommands.GetCommand('TableHorizontalSplitCell').GetState()==-1);D.AddItem('TableVerticalSplitCell',FCKLang.VerticalSplitCell,61,FCKCommands.GetCommand('TableVerticalSplitCell').GetState()==-1);D.AddSeparator();D.AddItem('TableCellProp',FCKLang.CellProperties,57,FCKCommands.GetCommand('TableCellProp').GetState()==-1);menu.AddSeparator();D=menu.AddItem('Row',FCKLang.RowCM);D.AddItem('TableInsertRowBefore',FCKLang.InsertRowBefore,70);D.AddItem('TableInsertRowAfter',FCKLang.InsertRowAfter,62);D.AddItem('TableDeleteRows',FCKLang.DeleteRows,63);menu.AddSeparator();D=menu.AddItem('Column',FCKLang.ColumnCM);D.AddItem('TableInsertColumnBefore',FCKLang.InsertColumnBefore,71);D.AddItem('TableInsertColumnAfter',FCKLang.InsertColumnAfter,64);D.AddItem('TableDeleteColumns',FCKLang.DeleteColumns,65);};if (B||C){menu.AddSeparator();menu.AddItem('TableDelete',FCKLang.TableDelete);menu.AddItem('TableProp',FCKLang.TableProperties,39);}}};case 'Link':return {AddItems:function(menu,tag,tagName){var E=(tagName=='A'||FCKSelection.HasAncestorNode('A'));if (E||FCK.GetNamedCommandState('Unlink')!=-1){var F=FCKSelection.MoveToAncestorNode('A');var G=(F&&F.name.length>0&&F.href.length==0);if (G) return;menu.AddSeparator();menu.AddItem('VisitLink',FCKLang.VisitLink);menu.AddSeparator();if (E) menu.AddItem('Link',FCKLang.EditLink,34);menu.AddItem('Unlink',FCKLang.RemoveLink,35);}}};case 'Image':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&!tag.getAttribute('_fckfakelement')){menu.AddSeparator();menu.AddItem('Image',FCKLang.ImageProperties,37);}}};case 'Anchor':return {AddItems:function(menu,tag,tagName){var F=FCKSelection.MoveToAncestorNode('A');var G=(F&&F.name.length>0);if (G||(tagName=='IMG'&&tag.getAttribute('_fckanchor'))){menu.AddSeparator();menu.AddItem('Anchor',FCKLang.AnchorProp,36);menu.AddItem('AnchorDelete',FCKLang.AnchorDelete);}}};case 'Flash':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&tag.getAttribute('_fckflash')){menu.AddSeparator();menu.AddItem('Flash',FCKLang.FlashProperties,38);}}};case 'Form':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('FORM')){menu.AddSeparator();menu.AddItem('Form',FCKLang.FormProp,48);}}};case 'Checkbox':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='checkbox'){menu.AddSeparator();menu.AddItem('Checkbox',FCKLang.CheckboxProp,49);}}};case 'Radio':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='radio'){menu.AddSeparator();menu.AddItem('Radio',FCKLang.RadioButtonProp,50);}}};case 'TextField':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&(tag.type=='text'||tag.type=='password')){menu.AddSeparator();menu.AddItem('TextField',FCKLang.TextFieldProp,51);}}};case 'HiddenField':return {AddItems:function(menu,tag,tagName){if (tagName=='IMG'&&tag.getAttribute('_fckinputhidden')){menu.AddSeparator();menu.AddItem('HiddenField',FCKLang.HiddenFieldProp,56);}}};case 'ImageButton':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&tag.type=='image'){menu.AddSeparator();menu.AddItem('ImageButton',FCKLang.ImageButtonProp,55);}}};case 'Button':return {AddItems:function(menu,tag,tagName){if (tagName=='INPUT'&&(tag.type=='button'||tag.type=='submit'||tag.type=='reset')){menu.AddSeparator();menu.AddItem('Button',FCKLang.ButtonProp,54);}}};case 'Select':return {AddItems:function(menu,tag,tagName){if (tagName=='SELECT'){menu.AddSeparator();menu.AddItem('Select',FCKLang.SelectionFieldProp,53);}}};case 'Textarea':return {AddItems:function(menu,tag,tagName){if (tagName=='TEXTAREA'){menu.AddSeparator();menu.AddItem('Textarea',FCKLang.TextareaProp,52);}}};case 'BulletedList':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('UL')){menu.AddSeparator();menu.AddItem('BulletedList',FCKLang.BulletedListProp,27);}}};case 'NumberedList':return {AddItems:function(menu,tag,tagName){if (FCKSelection.HasAncestorNode('OL')){menu.AddSeparator();menu.AddItem('NumberedList',FCKLang.NumberedListProp,26);}}};case 'DivContainer':return {AddItems:function(menu,tag,tagName){var J=FCKDomTools.GetSelectedDivContainers();if (J.length>0){menu.AddSeparator();menu.AddItem('EditDiv',FCKLang.EditDiv,75);menu.AddItem('DeleteDiv',FCKLang.DeleteDiv,76);}}};};return null;};function FCK_ContextMenu_OnBeforeOpen(){FCK.Events.FireEvent('OnSelectionChange');var A,sTagName;if ((A=FCKSelection.GetSelectedElement())) sTagName=A.tagName;var B=FCK.ContextMenu._InnerContextMenu;B.RemoveAllItems();var C=FCK.ContextMenu.Listeners;for (var i=0;i<C.length;i++) C[i].AddItems(B,A,sTagName);};function FCK_ContextMenu_OnItemClick(A){FCK.Focus();FCKCommands.GetCommand(A.Name).Execute(A.CustomData);};
var FCKHtmlIterator=function(A){this._sourceHtml=A;};FCKHtmlIterator.prototype={Next:function(){var A=this._sourceHtml;if (A==null) return null;var B=FCKRegexLib.HtmlTag.exec(A);var C=false;var D="";if (B){if (B.index>0){D=A.substr(0,B.index);this._sourceHtml=A.substr(B.index);}else{C=true;D=B[0];this._sourceHtml=A.substr(B[0].length);}}else{D=A;this._sourceHtml=null;};return { 'isTag':C,'value':D };},Each:function(A){var B;while ((B=this.Next())) A(B.isTag,B.value);}};var FCKHtmlIterator=function(A){this._sourceHtml=A;};FCKHtmlIterator.prototype={Next:function(){var A=this._sourceHtml;if (A==null) return null;var B=FCKRegexLib.HtmlTag.exec(A);var C=false;var D="";if (B){if (B.index>0){D=A.substr(0,B.index);this._sourceHtml=A.substr(B.index);}else{C=true;D=B[0];this._sourceHtml=A.substr(B[0].length);}}else{D=A;this._sourceHtml=null;};return { 'isTag':C,'value':D };},Each:function(A){var B;while ((B=this.Next())) A(B.isTag,B.value);}};
var FCKPlugin=function(A,B,C){this.Name=A;this.BasePath=C?C:FCKConfig.PluginsPath;this.Path=this.BasePath+A+'/';if (!B||B.length==0) this.AvailableLangs=[];else this.AvailableLangs=B.split(',');};FCKPlugin.prototype.Load=function(){if (this.AvailableLangs.length>0){var A;if (this.AvailableLangs.IndexOf(FCKLanguageManager.ActiveLanguage.Code)>=0) A=FCKLanguageManager.ActiveLanguage.Code;else A=this.AvailableLangs[0];LoadScript(this.Path+'lang/'+A+'.js');};LoadScript(this.Path+'fckplugin.js');};
var FCKPlugins=FCK.Plugins={};FCKPlugins.ItemsCount=0;FCKPlugins.Items={};FCKPlugins.Load=function(){var A=FCKPlugins.Items;for (var i=0;i<FCKConfig.Plugins.Items.length;i++){var B=FCKConfig.Plugins.Items[i];var C=A[B[0]]=new FCKPlugin(B[0],B[1],B[2]);FCKPlugins.ItemsCount++;};for (var s in A) A[s].Load();FCKPlugins.Load=null;};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/_translationstatus.txt
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/_translationstatus.txt (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/_translationstatus.txt Thu Aug 28 18:47:59 2008
@@ -21,58 +21,58 @@
* Translations Status.
*/
-af.js Found: 396 Missing: 15
-ar.js Found: 411 Missing: 0
-bg.js Found: 373 Missing: 38
-bn.js Found: 380 Missing: 31
-bs.js Found: 226 Missing: 185
-ca.js Found: 411 Missing: 0
-cs.js Found: 411 Missing: 0
-da.js Found: 381 Missing: 30
-de.js Found: 411 Missing: 0
-el.js Found: 396 Missing: 15
-en-au.js Found: 411 Missing: 0
-en-ca.js Found: 411 Missing: 0
-en-uk.js Found: 411 Missing: 0
-eo.js Found: 346 Missing: 65
-es.js Found: 411 Missing: 0
-et.js Found: 411 Missing: 0
-eu.js Found: 411 Missing: 0
-fa.js Found: 397 Missing: 14
-fi.js Found: 411 Missing: 0
-fo.js Found: 396 Missing: 15
-fr-ca.js Found: 411 Missing: 0
-fr.js Found: 411 Missing: 0
-gl.js Found: 381 Missing: 30
-gu.js Found: 411 Missing: 0
-he.js Found: 411 Missing: 0
-hi.js Found: 411 Missing: 0
-hr.js Found: 411 Missing: 0
-hu.js Found: 411 Missing: 0
-it.js Found: 410 Missing: 1
-ja.js Found: 411 Missing: 0
-km.js Found: 370 Missing: 41
-ko.js Found: 390 Missing: 21
-lt.js Found: 376 Missing: 35
-lv.js Found: 381 Missing: 30
-mn.js Found: 411 Missing: 0
-ms.js Found: 352 Missing: 59
-nb.js Found: 395 Missing: 16
-nl.js Found: 411 Missing: 0
-no.js Found: 395 Missing: 16
-pl.js Found: 411 Missing: 0
-pt-br.js Found: 411 Missing: 0
-pt.js Found: 381 Missing: 30
-ro.js Found: 410 Missing: 1
-ru.js Found: 411 Missing: 0
-sk.js Found: 396 Missing: 15
-sl.js Found: 411 Missing: 0
-sr-latn.js Found: 368 Missing: 43
-sr.js Found: 368 Missing: 43
-sv.js Found: 396 Missing: 15
-th.js Found: 393 Missing: 18
-tr.js Found: 396 Missing: 15
-uk.js Found: 397 Missing: 14
-vi.js Found: 396 Missing: 15
-zh-cn.js Found: 411 Missing: 0
-zh.js Found: 411 Missing: 0
+af.js Found: 396 Missing: 24
+ar.js Found: 411 Missing: 9
+bg.js Found: 373 Missing: 47
+bn.js Found: 380 Missing: 40
+bs.js Found: 226 Missing: 194
+ca.js Found: 420 Missing: 0
+cs.js Found: 420 Missing: 0
+da.js Found: 381 Missing: 39
+de.js Found: 419 Missing: 1
+el.js Found: 396 Missing: 24
+en-au.js Found: 420 Missing: 0
+en-ca.js Found: 420 Missing: 0
+en-uk.js Found: 420 Missing: 0
+eo.js Found: 346 Missing: 74
+es.js Found: 420 Missing: 0
+et.js Found: 411 Missing: 9
+eu.js Found: 411 Missing: 9
+fa.js Found: 413 Missing: 7
+fi.js Found: 411 Missing: 9
+fo.js Found: 420 Missing: 0
+fr-ca.js Found: 419 Missing: 1
+fr.js Found: 420 Missing: 0
+gl.js Found: 381 Missing: 39
+gu.js Found: 411 Missing: 9
+he.js Found: 420 Missing: 0
+hi.js Found: 420 Missing: 0
+hr.js Found: 420 Missing: 0
+hu.js Found: 411 Missing: 9
+it.js Found: 410 Missing: 10
+ja.js Found: 420 Missing: 0
+km.js Found: 370 Missing: 50
+ko.js Found: 390 Missing: 30
+lt.js Found: 376 Missing: 44
+lv.js Found: 381 Missing: 39
+mn.js Found: 411 Missing: 9
+ms.js Found: 352 Missing: 68
+nb.js Found: 414 Missing: 6
+nl.js Found: 420 Missing: 0
+no.js Found: 414 Missing: 6
+pl.js Found: 411 Missing: 9
+pt-br.js Found: 411 Missing: 9
+pt.js Found: 381 Missing: 39
+ro.js Found: 410 Missing: 10
+ru.js Found: 411 Missing: 9
+sk.js Found: 396 Missing: 24
+sl.js Found: 411 Missing: 9
+sr-latn.js Found: 368 Missing: 52
+sr.js Found: 368 Missing: 52
+sv.js Found: 409 Missing: 11
+th.js Found: 393 Missing: 27
+tr.js Found: 396 Missing: 24
+uk.js Found: 397 Missing: 23
+vi.js Found: 419 Missing: 1
+zh-cn.js Found: 420 Missing: 0
+zh.js Found: 420 Missing: 0
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/af.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/af.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/af.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Skakel",
InsertLink : "Skakel byvoeg/verander",
RemoveLink : "Skakel verweider",
+VisitLink : "Open Link", //MISSING
Anchor : "Plekhouer byvoeg/verander",
AnchorDelete : "Remove Anchor", //MISSING
InsertImageLbl : "Beeld",
@@ -72,6 +73,9 @@
DecreaseIndent : "Paradeering verkort",
IncreaseIndent : "Paradeering verleng",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Ont-skep",
Redo : "Her-skep",
NumberedListLbl : "Genommerde lys",
@@ -157,6 +161,7 @@
NoActiveX : "U browser sekuriteit instellings kan die funksies van die editor behinder. U moet die opsie \"Run ActiveX controls and plug-ins\" aktiveer. U ondervinding mag problematies geskiet of sekere funksionaliteit mag verhinder word.",
BrowseServerBlocked : "Die vorraad venster word geblok! Verseker asseblief dat U die \"popup blocker\" instelling verander.",
DialogBlocked : "Die dialoog venster vir verdere informasie word geblok. De-aktiveer asseblief die \"popup blocker\" instellings wat dit behinder.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Blaai Informasie deur",
DlgAboutLicenseTab : "Lesensie",
DlgAboutVersion : "weergawe",
-DlgAboutInfo : "Vir meer informasie gaan na "
+DlgAboutInfo : "Vir meer informasie gaan na ",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ar.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ar.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ar.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "رابط",
InsertLink : "إدراج/تحرير رابط",
RemoveLink : "إزالة رابط",
+VisitLink : "Open Link", //MISSING
Anchor : "إدراج/تحرير إشارة مرجعية",
AnchorDelete : "إزالة إشارة مرجعية",
InsertImageLbl : "صورة",
@@ -72,6 +73,9 @@
DecreaseIndent : "إنقاص المسافة البادئة",
IncreaseIndent : "زيادة المسافة البادئة",
Blockquote : "اقتباس",
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "تراجع",
Redo : "إعادة",
NumberedListLbl : "تعداد رقمي",
@@ -157,6 +161,7 @@
NoActiveX : "لتأمين متصفحك يجب أن تحدد بعض مميزات المحرر. يتوجب عليك تمكين الخيار \"Run ActiveX controls and plug-ins\". قد تواجة أخطاء وتلاحظ مميزات مفقودة",
BrowseServerBlocked : "لايمكن فتح مصدر المتصفح. فضلا يجب التأكد بأن جميع موانع النوافذ المنبثقة معطلة",
DialogBlocked : "لايمكن فتح نافذة الحوار . فضلا تأكد من أن مانع النوافذ المنبثة معطل .",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "موافق",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "معلومات متصفحك",
DlgAboutLicenseTab : "الترخيص",
DlgAboutVersion : "الإصدار",
-DlgAboutInfo : "لمزيد من المعلومات تفضل بزيارة"
+DlgAboutInfo : "لمزيد من المعلومات تفضل بزيارة",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/bg.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/bg.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/bg.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Връзка",
InsertLink : "Добави/Редактирай връзка",
RemoveLink : "Изтрий връзка",
+VisitLink : "Open Link", //MISSING
Anchor : "Добави/Редактирай котва",
AnchorDelete : "Remove Anchor", //MISSING
InsertImageLbl : "Изображение",
@@ -72,6 +73,9 @@
DecreaseIndent : "Намали отстъпа",
IncreaseIndent : "Увеличи отстъпа",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Отмени",
Redo : "Повтори",
NumberedListLbl : "Нумериран списък",
@@ -157,6 +161,7 @@
NoActiveX : "Your browser's security settings could limit some features of the editor. You must enable the option \"Run ActiveX controls and plug-ins\". You may experience errors and notice missing features.", //MISSING
BrowseServerBlocked : "The resources browser could not be opened. Make sure that all popup blockers are disabled.", //MISSING
DialogBlocked : "It was not possible to open the dialog window. Make sure all popup blockers are disabled.", //MISSING
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "ОК",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Информация за браузъра",
DlgAboutLicenseTab : "License", //MISSING
DlgAboutVersion : "версия",
-DlgAboutInfo : "За повече информация посетете"
+DlgAboutInfo : "За повече информация посетете",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/bn.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/bn.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/bn.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "লিংকের যুক্ত করার লেবেল",
InsertLink : "লিংক যুক্ত কর",
RemoveLink : "লিংক সরাও",
+VisitLink : "Open Link", //MISSING
Anchor : "নোঙ্গর",
AnchorDelete : "Remove Anchor", //MISSING
InsertImageLbl : "ছবির লেবেল যুক্ত কর",
@@ -72,6 +73,9 @@
DecreaseIndent : "ইনডেন্ট কমাও",
IncreaseIndent : "ইনডেন্ট বাড়াও",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "আনডু",
Redo : "রি-ডু",
NumberedListLbl : "সাংখ্যিক লিস্টের লেবেল",
@@ -157,6 +161,7 @@
NoActiveX : "আপনার ব্রাউজারের সুরক্ষা সেটিংস কারনে এডিটরের কিছু ফিচার পাওয়া নাও যেতে পারে। আপনাকে অবশ্যই \"Run ActiveX controls and plug-ins\" এনাবেল করে নিতে হবে। আপনি ভুলভ্রান্তি কিছু কিছু ফিচারের অনুপস্থিতি উপলব্ধি করতে পারেন।",
BrowseServerBlocked : "রিসোর্স ব্রাউজার খোলা গেল না। নিশ্চিত করুন যে সব পপআপ ব্লকার বন্ধ করা আছে।",
DialogBlocked : "ডায়ালগ ইউন্ডো খোলা গেল না। নিশ্চিত করুন যে সব পপআপ ব্লকার বন্ধ করা আছে।",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "ওকে",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "ব্রাউজারের ব্যাপারে তথ্য",
DlgAboutLicenseTab : "লাইসেন্স",
DlgAboutVersion : "ভার্সন",
-DlgAboutInfo : "আরও তথ্যের জন্য যান"
+DlgAboutInfo : "আরও তথ্যের জন্য যান",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/bs.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/bs.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/bs.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Link",
InsertLink : "Ubaci/Izmjeni link",
RemoveLink : "Izbriši link",
+VisitLink : "Open Link", //MISSING
Anchor : "Insert/Edit Anchor", //MISSING
AnchorDelete : "Remove Anchor", //MISSING
InsertImageLbl : "Slika",
@@ -72,6 +73,9 @@
DecreaseIndent : "Smanji uvod",
IncreaseIndent : "Poveæaj uvod",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Vrati",
Redo : "Ponovi",
NumberedListLbl : "Numerisana lista",
@@ -157,6 +161,7 @@
NoActiveX : "Your browser's security settings could limit some features of the editor. You must enable the option \"Run ActiveX controls and plug-ins\". You may experience errors and notice missing features.", //MISSING
BrowseServerBlocked : "The resources browser could not be opened. Make sure that all popup blockers are disabled.", //MISSING
DialogBlocked : "It was not possible to open the dialog window. Make sure all popup blockers are disabled.", //MISSING
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Browser Info", //MISSING
DlgAboutLicenseTab : "License", //MISSING
DlgAboutVersion : "verzija",
-DlgAboutInfo : "Za više informacija posjetite"
+DlgAboutInfo : "Za više informacija posjetite",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ca.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ca.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ca.js Thu Aug 28 18:47:59 2008
@@ -43,7 +43,8 @@
RemoveFormat : "Elimina Format",
InsertLinkLbl : "Enllaç",
InsertLink : "Insereix/Edita enllaç",
-RemoveLink : "Elimina enllaç",
+RemoveLink : "Elimina l'enllaç",
+VisitLink : "Obre l'enllaç",
Anchor : "Insereix/Edita àncora",
AnchorDelete : "Elimina àncora",
InsertImageLbl : "Imatge",
@@ -72,6 +73,9 @@
DecreaseIndent : "Redueix el sagnat",
IncreaseIndent : "Augmenta el sagnat",
Blockquote : "Bloc de cita",
+CreateDiv : "Crea un contenidor Div",
+EditDiv : "Edita el contenidor Div",
+DeleteDiv : "Elimina el contenidor Div",
Undo : "Desfés",
Redo : "Refés",
NumberedListLbl : "Llista numerada",
@@ -156,7 +160,8 @@
UnknownToolbarSet : "Conjunt de barra d'eines \"%1\" inexistent",
NoActiveX : "Les preferències del navegador poden limitar algunes funcions d'aquest editor. Cal habilitar l'opció \"Executa controls ActiveX i plug-ins\". Poden sorgir errors i poden faltar algunes funcions.",
BrowseServerBlocked : "El visualitzador de recursos no s'ha pogut obrir. Assegura't de que els bloquejos de finestres emergents estan desactivats.",
-DialogBlocked : "No ha estat possible obrir una finestra de diàleg. Assegura't de que els bloquejos de finestres emergents estan desactivats.",
+DialogBlocked : "No ha estat possible obrir una finestra de diàleg. Assegureu-vos que els bloquejos de finestres emergents estan desactivats.",
+VisitLinkBlocked : "No ha estat possible obrir una nova finestra. Assegureu-vos que els bloquejos de finestres emergents estan desactivats.",
// Dialogs
DlgBtnOK : "D'acord",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Informació del navegador",
DlgAboutLicenseTab : "Llicència",
DlgAboutVersion : "versió",
-DlgAboutInfo : "Per a més informació aneu a"
+DlgAboutInfo : "Per a més informació aneu a",
+
+// Div Dialog
+DlgDivGeneralTab : "General",
+DlgDivAdvancedTab : "Avançat",
+DlgDivStyle : "Estil",
+DlgDivInlineStyle : "Estil en línia"
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/cs.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/cs.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/cs.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Odkaz",
InsertLink : "Vložit/změnit odkaz",
RemoveLink : "Odstranit odkaz",
+VisitLink : "Otevřít odkaz",
Anchor : "Vložít/změnit záložku",
AnchorDelete : "Odstranit kotvu",
InsertImageLbl : "Obrázek",
@@ -72,6 +73,9 @@
DecreaseIndent : "Zmenšit odsazení",
IncreaseIndent : "Zvětšit odsazení",
Blockquote : "Citace",
+CreateDiv : "Vytvořit Div kontejner",
+EditDiv : "Upravit Div kontejner",
+DeleteDiv : "Odstranit Div kontejner",
Undo : "Zpět",
Redo : "Znovu",
NumberedListLbl : "Číslování",
@@ -157,6 +161,7 @@
NoActiveX : "Nastavení bezpečnosti Vašeho prohlížeče omezuje funkčnost některých jeho možností. Je třeba zapnout volbu \"Spouštět ovládáací prvky ActiveX a moduly plug-in\", jinak nebude možné využívat všechny dosputné schopnosti editoru.",
BrowseServerBlocked : "Průzkumník zdrojů nelze otevřít. Prověřte, zda nemáte aktivováno blokování popup oken.",
DialogBlocked : "Nelze otevřít dialogové okno. Prověřte, zda nemáte aktivováno blokování popup oken.",
+VisitLinkBlocked : "Není možné otevřít nové okno. Prověřte, zda všechny nástroje pro blokování vyskakovacích oken jsou vypnuty.",
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Informace o prohlížeči",
DlgAboutLicenseTab : "Licence",
DlgAboutVersion : "verze",
-DlgAboutInfo : "Více informací získáte na"
+DlgAboutInfo : "Více informací získáte na",
+
+// Div Dialog
+DlgDivGeneralTab : "Obecné",
+DlgDivAdvancedTab : "Rozšířené",
+DlgDivStyle : "Styl",
+DlgDivInlineStyle : "Vložený styl"
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/da.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/da.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/da.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Hyperlink",
InsertLink : "Indsæt/rediger hyperlink",
RemoveLink : "Fjern hyperlink",
+VisitLink : "Open Link", //MISSING
Anchor : "Indsæt/rediger bogmærke",
AnchorDelete : "Remove Anchor", //MISSING
InsertImageLbl : "Indsæt billede",
@@ -72,6 +73,9 @@
DecreaseIndent : "Formindsk indrykning",
IncreaseIndent : "Forøg indrykning",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Fortryd",
Redo : "Annuller fortryd",
NumberedListLbl : "Talopstilling",
@@ -157,6 +161,7 @@
NoActiveX : "Din browsers sikkerhedsindstillinger begrænser nogle af editorens muligheder.<br>Slå \"Kør ActiveX-objekter og plug-ins\" til, ellers vil du opleve fejl og manglende muligheder.",
BrowseServerBlocked : "Browseren kunne ikke åbne de nødvendige ressourcer!<br>Slå pop-up blokering fra.",
DialogBlocked : "Dialogvinduet kunne ikke åbnes!<br>Slå pop-up blokering fra.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Generelt",
DlgAboutLicenseTab : "Licens",
DlgAboutVersion : "version",
-DlgAboutInfo : "For yderlig information gå til"
+DlgAboutInfo : "For yderlig information gå til",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/de.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/de.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/de.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Link",
InsertLink : "Link einfügen/editieren",
RemoveLink : "Link entfernen",
+VisitLink : "Link aufrufen",
Anchor : "Anker einfügen/editieren",
AnchorDelete : "Anker entfernen",
InsertImageLbl : "Bild",
@@ -72,6 +73,9 @@
DecreaseIndent : "Einzug verringern",
IncreaseIndent : "Einzug erhöhen",
Blockquote : "Zitatblock",
+CreateDiv : "Erzeuge Div Block",
+EditDiv : "Bearbeite Div Block",
+DeleteDiv : "Entferne Div Block",
Undo : "Rückgängig",
Redo : "Wiederherstellen",
NumberedListLbl : "Nummerierte Liste",
@@ -157,6 +161,7 @@
NoActiveX : "Die Sicherheitseinstellungen Ihres Browsers beschränken evtl. einige Funktionen des Editors. Aktivieren Sie die Option \"ActiveX-Steuerelemente und Plugins ausführen\" in den Sicherheitseinstellungen, um diese Funktionen nutzen zu können",
BrowseServerBlocked : "Ein Auswahlfenster konnte nicht geöffnet werden. Stellen Sie sicher, das alle Popup-Blocker ausgeschaltet sind.",
DialogBlocked : "Das Dialog-Fenster konnte nicht geöffnet werden. Stellen Sie sicher, das alle Popup-Blocker ausgeschaltet sind.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Browser-Info",
DlgAboutLicenseTab : "Lizenz",
DlgAboutVersion : "Version",
-DlgAboutInfo : "Für weitere Informationen siehe"
+DlgAboutInfo : "Für weitere Informationen siehe",
+
+// Div Dialog
+DlgDivGeneralTab : "Allgemein",
+DlgDivAdvancedTab : "Erweitert",
+DlgDivStyle : "Style",
+DlgDivInlineStyle : "Inline Style"
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/el.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/el.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/el.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Σύνδεσμος (Link)",
InsertLink : "Εισαγωγή/Μεταβολή Συνδέσμου (Link)",
RemoveLink : "Αφαίρεση Συνδέσμου (Link)",
+VisitLink : "Open Link", //MISSING
Anchor : "Εισαγωγή/επεξεργασία Anchor",
AnchorDelete : "Remove Anchor", //MISSING
InsertImageLbl : "Εικόνα",
@@ -72,6 +73,9 @@
DecreaseIndent : "Μείωση Εσοχής",
IncreaseIndent : "Αύξηση Εσοχής",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Αναίρεση",
Redo : "Επαναφορά",
NumberedListLbl : "Λίστα με Αριθμούς",
@@ -157,6 +161,7 @@
NoActiveX : "Οι ρυθμίσεις ασφαλείας του browser σας μπορεί να περιορίσουν κάποιες ρυθμίσεις του προγράμματος. Χρειάζεται να ενεργοποιήσετε την επιλογή \"Run ActiveX controls and plug-ins\". Ίσως παρουσιαστούν λάθη και παρατηρήσετε ελειπείς λειτουργίες.",
BrowseServerBlocked : "Οι πόροι του browser σας δεν είναι προσπελάσιμοι. Σιγουρευτείτε ότι δεν υπάρχουν ενεργοί popup blockers.",
DialogBlocked : "Δεν ήταν δυνατό να ανοίξει το παράθυρο διαλόγου. Σιγουρευτείτε ότι δεν υπάρχουν ενεργοί popup blockers.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Πληροφορίες Browser",
DlgAboutLicenseTab : "Άδεια",
DlgAboutVersion : "έκδοση",
-DlgAboutInfo : "Για περισσότερες πληροφορίες"
+DlgAboutInfo : "Για περισσότερες πληροφορίες",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/en-au.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/en-au.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/en-au.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Link",
InsertLink : "Insert/Edit Link",
RemoveLink : "Remove Link",
+VisitLink : "Open Link",
Anchor : "Insert/Edit Anchor",
AnchorDelete : "Remove Anchor",
InsertImageLbl : "Image",
@@ -72,6 +73,9 @@
DecreaseIndent : "Decrease Indent",
IncreaseIndent : "Increase Indent",
Blockquote : "Blockquote",
+CreateDiv : "Create Div Container",
+EditDiv : "Edit Div Container",
+DeleteDiv : "Remove Div Container",
Undo : "Undo",
Redo : "Redo",
NumberedListLbl : "Numbered List",
@@ -157,6 +161,7 @@
NoActiveX : "Your browser's security settings could limit some features of the editor. You must enable the option \"Run ActiveX controls and plug-ins\". You may experience errors and notice missing features.",
BrowseServerBlocked : "The resources browser could not be opened. Make sure that all popup blockers are disabled.",
DialogBlocked : "It was not possible to open the dialog window. Make sure all popup blockers are disabled.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.",
// Dialogs
DlgBtnOK : "OK",
@@ -355,7 +360,7 @@
PasteAsText : "Paste as Plain Text",
PasteFromWord : "Paste from Word",
-DlgPasteMsg2 : "Please paste inside the following box using the keyboard (<STRONG>Ctrl+V</STRONG>) and hit <STRONG>OK</STRONG>.",
+DlgPasteMsg2 : "Please paste inside the following box using the keyboard (<strong>Ctrl+V</strong>) and hit <strong>OK</strong>.",
DlgPasteSec : "Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.",
DlgPasteIgnoreFont : "Ignore Font Face definitions",
DlgPasteRemoveStyles : "Remove Styles definitions",
@@ -501,7 +506,7 @@
// Templates Dialog
Templates : "Templates",
DlgTemplatesTitle : "Content Templates",
-DlgTemplatesSelMsg : "Please select the template to open in the editor<br>(the actual contents will be lost):",
+DlgTemplatesSelMsg : "Please select the template to open in the editor<br />(the actual contents will be lost):",
DlgTemplatesLoading : "Loading templates list. Please wait...",
DlgTemplatesNoTpl : "(No templates defined)",
DlgTemplatesReplace : "Replace actual contents",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Browser Info",
DlgAboutLicenseTab : "License",
DlgAboutVersion : "version",
-DlgAboutInfo : "For further information go to"
+DlgAboutInfo : "For further information go to",
+
+// Div Dialog
+DlgDivGeneralTab : "General",
+DlgDivAdvancedTab : "Advanced",
+DlgDivStyle : "Style",
+DlgDivInlineStyle : "Inline Style"
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/en-ca.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/en-ca.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/en-ca.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Link",
InsertLink : "Insert/Edit Link",
RemoveLink : "Remove Link",
+VisitLink : "Open Link",
Anchor : "Insert/Edit Anchor",
AnchorDelete : "Remove Anchor",
InsertImageLbl : "Image",
@@ -72,6 +73,9 @@
DecreaseIndent : "Decrease Indent",
IncreaseIndent : "Increase Indent",
Blockquote : "Blockquote",
+CreateDiv : "Create Div Container",
+EditDiv : "Edit Div Container",
+DeleteDiv : "Remove Div Container",
Undo : "Undo",
Redo : "Redo",
NumberedListLbl : "Numbered List",
@@ -157,6 +161,7 @@
NoActiveX : "Your browser's security settings could limit some features of the editor. You must enable the option \"Run ActiveX controls and plug-ins\". You may experience errors and notice missing features.",
BrowseServerBlocked : "The resources browser could not be opened. Make sure that all popup blockers are disabled.",
DialogBlocked : "It was not possible to open the dialog window. Make sure all popup blockers are disabled.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.",
// Dialogs
DlgBtnOK : "OK",
@@ -355,7 +360,7 @@
PasteAsText : "Paste as Plain Text",
PasteFromWord : "Paste from Word",
-DlgPasteMsg2 : "Please paste inside the following box using the keyboard (<STRONG>Ctrl+V</STRONG>) and hit <STRONG>OK</STRONG>.",
+DlgPasteMsg2 : "Please paste inside the following box using the keyboard (<strong>Ctrl+V</strong>) and hit <strong>OK</strong>.",
DlgPasteSec : "Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.",
DlgPasteIgnoreFont : "Ignore Font Face definitions",
DlgPasteRemoveStyles : "Remove Styles definitions",
@@ -501,7 +506,7 @@
// Templates Dialog
Templates : "Templates",
DlgTemplatesTitle : "Content Templates",
-DlgTemplatesSelMsg : "Please select the template to open in the editor<br>(the actual contents will be lost):",
+DlgTemplatesSelMsg : "Please select the template to open in the editor<br />(the actual contents will be lost):",
DlgTemplatesLoading : "Loading templates list. Please wait...",
DlgTemplatesNoTpl : "(No templates defined)",
DlgTemplatesReplace : "Replace actual contents",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Browser Info",
DlgAboutLicenseTab : "License",
DlgAboutVersion : "version",
-DlgAboutInfo : "For further information go to"
+DlgAboutInfo : "For further information go to",
+
+// Div Dialog
+DlgDivGeneralTab : "General",
+DlgDivAdvancedTab : "Advanced",
+DlgDivStyle : "Style",
+DlgDivInlineStyle : "Inline Style"
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/en-uk.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/en-uk.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/en-uk.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Link",
InsertLink : "Insert/Edit Link",
RemoveLink : "Remove Link",
+VisitLink : "Open Link",
Anchor : "Insert/Edit Anchor",
AnchorDelete : "Remove Anchor",
InsertImageLbl : "Image",
@@ -72,6 +73,9 @@
DecreaseIndent : "Decrease Indent",
IncreaseIndent : "Increase Indent",
Blockquote : "Blockquote",
+CreateDiv : "Create Div Container",
+EditDiv : "Edit Div Container",
+DeleteDiv : "Remove Div Container",
Undo : "Undo",
Redo : "Redo",
NumberedListLbl : "Numbered List",
@@ -157,6 +161,7 @@
NoActiveX : "Your browser's security settings could limit some features of the editor. You must enable the option \"Run ActiveX controls and plug-ins\". You may experience errors and notice missing features.",
BrowseServerBlocked : "The resources browser could not be opened. Make sure that all popup blockers are disabled.",
DialogBlocked : "It was not possible to open the dialog window. Make sure all popup blockers are disabled.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.",
// Dialogs
DlgBtnOK : "OK",
@@ -355,7 +360,7 @@
PasteAsText : "Paste as Plain Text",
PasteFromWord : "Paste from Word",
-DlgPasteMsg2 : "Please paste inside the following box using the keyboard (<STRONG>Ctrl+V</STRONG>) and hit <STRONG>OK</STRONG>.",
+DlgPasteMsg2 : "Please paste inside the following box using the keyboard (<strong>Ctrl+V</strong>) and hit <strong>OK</strong>.",
DlgPasteSec : "Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.",
DlgPasteIgnoreFont : "Ignore Font Face definitions",
DlgPasteRemoveStyles : "Remove Styles definitions",
@@ -501,7 +506,7 @@
// Templates Dialog
Templates : "Templates",
DlgTemplatesTitle : "Content Templates",
-DlgTemplatesSelMsg : "Please select the template to open in the editor<br>(the actual contents will be lost):",
+DlgTemplatesSelMsg : "Please select the template to open in the editor<br />(the actual contents will be lost):",
DlgTemplatesLoading : "Loading templates list. Please wait...",
DlgTemplatesNoTpl : "(No templates defined)",
DlgTemplatesReplace : "Replace actual contents",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Browser Info",
DlgAboutLicenseTab : "License",
DlgAboutVersion : "version",
-DlgAboutInfo : "For further information go to"
+DlgAboutInfo : "For further information go to",
+
+// Div Dialog
+DlgDivGeneralTab : "General",
+DlgDivAdvancedTab : "Advanced",
+DlgDivStyle : "Style",
+DlgDivInlineStyle : "Inline Style"
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/en.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/en.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/en.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Link",
InsertLink : "Insert/Edit Link",
RemoveLink : "Remove Link",
+VisitLink : "Open Link",
Anchor : "Insert/Edit Anchor",
AnchorDelete : "Remove Anchor",
InsertImageLbl : "Image",
@@ -72,6 +73,9 @@
DecreaseIndent : "Decrease Indent",
IncreaseIndent : "Increase Indent",
Blockquote : "Blockquote",
+CreateDiv : "Create Div Container",
+EditDiv : "Edit Div Container",
+DeleteDiv : "Remove Div Container",
Undo : "Undo",
Redo : "Redo",
NumberedListLbl : "Numbered List",
@@ -157,6 +161,7 @@
NoActiveX : "Your browser's security settings could limit some features of the editor. You must enable the option \"Run ActiveX controls and plug-ins\". You may experience errors and notice missing features.",
BrowseServerBlocked : "The resources browser could not be opened. Make sure that all popup blockers are disabled.",
DialogBlocked : "It was not possible to open the dialog window. Make sure all popup blockers are disabled.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.",
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Browser Info",
DlgAboutLicenseTab : "License",
DlgAboutVersion : "version",
-DlgAboutInfo : "For further information go to"
+DlgAboutInfo : "For further information go to",
+
+// Div Dialog
+DlgDivGeneralTab : "General",
+DlgDivAdvancedTab : "Advanced",
+DlgDivStyle : "Style",
+DlgDivInlineStyle : "Inline Style"
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/eo.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/eo.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/eo.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Ligilo",
InsertLink : "Enmeti/Ŝanĝi Ligilon",
RemoveLink : "Forigi Ligilon",
+VisitLink : "Open Link", //MISSING
Anchor : "Enmeti/Ŝanĝi Ankron",
AnchorDelete : "Remove Anchor", //MISSING
InsertImageLbl : "Bildo",
@@ -72,6 +73,9 @@
DecreaseIndent : "Malpligrandigi Krommarĝenon",
IncreaseIndent : "Pligrandigi Krommarĝenon",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Malfari",
Redo : "Refari",
NumberedListLbl : "Numera Listo",
@@ -157,6 +161,7 @@
NoActiveX : "Your browser's security settings could limit some features of the editor. You must enable the option \"Run ActiveX controls and plug-ins\". You may experience errors and notice missing features.", //MISSING
BrowseServerBlocked : "The resources browser could not be opened. Make sure that all popup blockers are disabled.", //MISSING
DialogBlocked : "It was not possible to open the dialog window. Make sure all popup blockers are disabled.", //MISSING
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "Akcepti",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Informoj pri TTT-legilo",
DlgAboutLicenseTab : "License", //MISSING
DlgAboutVersion : "versio",
-DlgAboutInfo : "Por pli da informoj, vizitu"
+DlgAboutInfo : "Por pli da informoj, vizitu",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/es.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/es.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/es.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Vínculo",
InsertLink : "Insertar/Editar Vínculo",
RemoveLink : "Eliminar Vínculo",
+VisitLink : "Abrir enlace",
Anchor : "Referencia",
AnchorDelete : "Eliminar Referencia",
InsertImageLbl : "Imagen",
@@ -72,6 +73,9 @@
DecreaseIndent : "Disminuir Sangría",
IncreaseIndent : "Aumentar Sangría",
Blockquote : "Cita",
+CreateDiv : "Crear contenedor (div)",
+EditDiv : "Editar contenedor (div)",
+DeleteDiv : "Eliminar contenedor (div)",
Undo : "Deshacer",
Redo : "Rehacer",
NumberedListLbl : "Numeración",
@@ -157,6 +161,7 @@
NoActiveX : "La configuración de las opciones de seguridad de su navegador puede estar limitando algunas características del editor. Por favor active la opción \"Ejecutar controles y complementos de ActiveX \", de lo contrario puede experimentar errores o ausencia de funcionalidades.",
BrowseServerBlocked : "La ventana de visualización del servidor no pudo ser abierta. Verifique que su navegador no esté bloqueando las ventanas emergentes (pop up).",
DialogBlocked : "No se ha podido abrir la ventana de diálogo. Verifique que su navegador no esté bloqueando las ventanas emergentes (pop up).",
+VisitLinkBlocked : "Nose ha podido abrir la ventana. Asegurese de que todos los bloqueadores de popups están deshabilitados.",
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Información de Navegador",
DlgAboutLicenseTab : "Licencia",
DlgAboutVersion : "versión",
-DlgAboutInfo : "Para mayor información por favor dirigirse a"
+DlgAboutInfo : "Para mayor información por favor dirigirse a",
+
+// Div Dialog
+DlgDivGeneralTab : "General",
+DlgDivAdvancedTab : "Avanzado",
+DlgDivStyle : "Estilo",
+DlgDivInlineStyle : "Estilos CSS"
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/et.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/et.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/et.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Link",
InsertLink : "Sisesta link / Muuda linki",
RemoveLink : "Eemalda link",
+VisitLink : "Open Link", //MISSING
Anchor : "Sisesta ankur / Muuda ankrut",
AnchorDelete : "Eemalda ankur",
InsertImageLbl : "Pilt",
@@ -72,6 +73,9 @@
DecreaseIndent : "Vähenda taanet",
IncreaseIndent : "Suurenda taanet",
Blockquote : "Blokktsitaat",
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Võta tagasi",
Redo : "Korda toimingut",
NumberedListLbl : "Nummerdatud loetelu",
@@ -157,6 +161,7 @@
NoActiveX : "Sinu veebisirvija turvalisuse seaded võivad limiteerida mõningaid tekstirdaktori kasutusvõimalusi. Sa peaksid võimaldama valiku \"Run ActiveX controls and plug-ins\" oma veebisirvija seadetes. Muidu võid sa täheldada vigu tekstiredaktori töös ja märgata puuduvaid funktsioone.",
BrowseServerBlocked : "Ressursside sirvija avamine ebaõnnestus. Võimalda pop-up akende avanemine.",
DialogBlocked : "Ei olenud võimalik avada dialoogi akent. Võimalda pop-up akende avanemine.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Veebisirvija info",
DlgAboutLicenseTab : "Litsents",
DlgAboutVersion : "versioon",
-DlgAboutInfo : "Täpsema info saamiseks mine"
+DlgAboutInfo : "Täpsema info saamiseks mine",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/eu.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/eu.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/eu.js Thu Aug 28 18:47:59 2008
@@ -45,6 +45,7 @@
InsertLinkLbl : "Esteka",
InsertLink : "Txertatu/Editatu Esteka",
RemoveLink : "Kendu Esteka",
+VisitLink : "Open Link", //MISSING
Anchor : "Aingura",
AnchorDelete : "Ezabatu Aingura",
InsertImageLbl : "Irudia",
@@ -73,6 +74,9 @@
DecreaseIndent : "Txikitu Koska",
IncreaseIndent : "Handitu Koska",
Blockquote : "Aipamen blokea",
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Desegin",
Redo : "Berregin",
NumberedListLbl : "Zenbakidun Zerrenda",
@@ -158,6 +162,7 @@
NoActiveX : "Zure nabigatzailearen segustasun hobespenak editore honen zenbait ezaugarri mugatu ditzake. \"ActiveX kontrolak eta plug-inak\" aktibatu beharko zenituzke, bestela erroreak eta ezaugarrietan mugak egon daitezke.",
BrowseServerBlocked : "Baliabideen arakatzailea ezin da ireki. Ziurtatu popup blokeatzaileak desgaituta dituzula.",
DialogBlocked : "Ezin da elkarrizketa-leihoa ireki. Ziurtatu popup blokeatzaileak desgaituta dituzula.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "Ados",
@@ -512,5 +517,11 @@
DlgAboutBrowserInfoTab : "Nabigatzailearen Informazioa",
DlgAboutLicenseTab : "Lizentzia",
DlgAboutVersion : "bertsioa",
-DlgAboutInfo : "Informazio gehiago eskuratzeko hona joan"
+DlgAboutInfo : "Informazio gehiago eskuratzeko hona joan",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/fa.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/fa.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/fa.js Thu Aug 28 18:47:59 2008
@@ -44,8 +44,9 @@
InsertLinkLbl : "پیوند",
InsertLink : "گنجاندن/ویرایش ِپیوند",
RemoveLink : "برداشتن پیوند",
+VisitLink : "باز کردن پیوند",
Anchor : "گنجاندن/ویرایش ِلنگر",
-AnchorDelete : "Remove Anchor", //MISSING
+AnchorDelete : "برداشتن لنگر",
InsertImageLbl : "تصویر",
InsertImage : "گنجاندن/ویرایش ِتصویر",
InsertFlashLbl : "Flash",
@@ -71,7 +72,10 @@
BlockJustify : "بلوکچین",
DecreaseIndent : "کاهش تورفتگی",
IncreaseIndent : "افزایش تورفتگی",
-Blockquote : "Blockquote", //MISSING
+Blockquote : "بلوک نقل قول",
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "واچیدن",
Redo : "بازچیدن",
NumberedListLbl : "فهرست شمارهدار",
@@ -105,27 +109,27 @@
ImageButton : "دکمهٴ تصویری",
FitWindow : "بیشینهسازی ِاندازهٴ ویرایشگر",
-ShowBlocks : "Show Blocks", //MISSING
+ShowBlocks : "نمایش بلوکها",
// Context Menu
EditLink : "ویرایش پیوند",
CellCM : "سلول",
RowCM : "سطر",
ColumnCM : "ستون",
-InsertRowAfter : "Insert Row After", //MISSING
-InsertRowBefore : "Insert Row Before", //MISSING
+InsertRowAfter : "افزودن سطر بعد از",
+InsertRowBefore : "افزودن سطر قبل از",
DeleteRows : "حذف سطرها",
-InsertColumnAfter : "Insert Column After", //MISSING
-InsertColumnBefore : "Insert Column Before", //MISSING
+InsertColumnAfter : "افزودن ستون بعد از",
+InsertColumnBefore : "افزودن ستون قبل از",
DeleteColumns : "حذف ستونها",
-InsertCellAfter : "Insert Cell After", //MISSING
-InsertCellBefore : "Insert Cell Before", //MISSING
+InsertCellAfter : "افزودن سلول بعد از",
+InsertCellBefore : "افزودن سلول قبل از",
DeleteCells : "حذف سلولها",
MergeCells : "ادغام سلولها",
-MergeRight : "Merge Right", //MISSING
-MergeDown : "Merge Down", //MISSING
-HorizontalSplitCell : "Split Cell Horizontally", //MISSING
-VerticalSplitCell : "Split Cell Vertically", //MISSING
+MergeRight : "ادغام به راست",
+MergeDown : "ادغام به پایین",
+HorizontalSplitCell : "جدا کردن افقی سلول",
+VerticalSplitCell : "جدا کردن عمودی سلول",
TableDelete : "پاککردن جدول",
CellProperties : "ویژگیهای سلول",
TableProperties : "ویژگیهای جدول",
@@ -157,6 +161,7 @@
NoActiveX : "تنظیمات امنیتی مرورگر شما ممکن است در بعضی از ویژگیهای مرورگر محدودیت ایجاد کند. شما باید گزینهٴ \"Run ActiveX controls and plug-ins\" را فعال کنید. ممکن است شما با خطاهایی روبرو باشید و متوجه کمبود ویژگیهایی شوید.",
BrowseServerBlocked : "توانایی بازگشایی مرورگر منابع فراهم نیست. اطمینان حاصل کنید که تمامی برنامههای پیشگیری از نمایش popup را از کار بازداشتهاید.",
DialogBlocked : "توانایی بازگشایی پنجرهٴ کوچک ِگفتگو فراهم نیست. اطمینان حاصل کنید که تمامی برنامههای پیشگیری از نمایش popup را از کار بازداشتهاید.",
+VisitLinkBlocked : "امکان بازکردن یک پنجره جدید نیست. اطمینان حاصل کنید که تمامی برنامههای پیشگیری از نمایش popup را از کار بازداشتهاید.",
// Dialogs
DlgBtnOK : "پذیرش",
@@ -332,7 +337,7 @@
DlgCellBtnSelect : "برگزینید...",
// Find and Replace Dialog
-DlgFindAndReplaceTitle : "Find and Replace", //MISSING
+DlgFindAndReplaceTitle : "جستجو و جایگزینی",
// Find Dialog
DlgFindTitle : "یافتن",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "اطلاعات مرورگر",
DlgAboutLicenseTab : "گواهینامه",
DlgAboutVersion : "نگارش",
-DlgAboutInfo : "برای آگاهی بیشتر به این نشانی بروید"
+DlgAboutInfo : "برای آگاهی بیشتر به این نشانی بروید",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/fi.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/fi.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/fi.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Linkki",
InsertLink : "Lisää linkki/muokkaa linkkiä",
RemoveLink : "Poista linkki",
+VisitLink : "Open Link", //MISSING
Anchor : "Lisää ankkuri/muokkaa ankkuria",
AnchorDelete : "Poista ankkuri",
InsertImageLbl : "Kuva",
@@ -72,6 +73,9 @@
DecreaseIndent : "Pienennä sisennystä",
IncreaseIndent : "Suurenna sisennystä",
Blockquote : "Lainaus",
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Kumoa",
Redo : "Toista",
NumberedListLbl : "Numerointi",
@@ -157,6 +161,7 @@
NoActiveX : "Selaimesi turvallisuusasetukset voivat rajoittaa joitain editorin ominaisuuksia. Sinun pitää ottaa käyttöön asetuksista \"Suorita ActiveX komponentit ja -plugin-laajennukset\". Saatat kohdata virheitä ja huomata puuttuvia ominaisuuksia.",
BrowseServerBlocked : "Resurssiselainta ei voitu avata. Varmista, että ponnahdusikkunoiden estäjät eivät ole päällä.",
DialogBlocked : "Apuikkunaa ei voitu avaata. Varmista, että ponnahdusikkunoiden estäjät eivät ole päällä.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Selaimen tiedot",
DlgAboutLicenseTab : "Lisenssi",
DlgAboutVersion : "versio",
-DlgAboutInfo : "Lisää tietoa osoitteesta"
+DlgAboutInfo : "Lisää tietoa osoitteesta",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/fo.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/fo.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/fo.js Thu Aug 28 18:47:59 2008
@@ -44,8 +44,9 @@
InsertLinkLbl : "Tilknýti",
InsertLink : "Ger/broyt tilknýti",
RemoveLink : "Strika tilknýti",
+VisitLink : "Opna tilknýti",
Anchor : "Ger/broyt marknastein",
-AnchorDelete : "Remove Anchor", //MISSING
+AnchorDelete : "Strika marknastein",
InsertImageLbl : "Myndir",
InsertImage : "Set inn/broyt mynd",
InsertFlashLbl : "Flash",
@@ -71,7 +72,10 @@
BlockJustify : "Javnir tekstkantar",
DecreaseIndent : "Minka reglubrotarinntriv",
IncreaseIndent : "Økja reglubrotarinntriv",
-Blockquote : "Blockquote", //MISSING
+Blockquote : "Blockquote",
+CreateDiv : "Ger DIV øki",
+EditDiv : "Broyt DIV øki",
+DeleteDiv : "Strika DIV øki",
Undo : "Angra",
Redo : "Vend aftur",
NumberedListLbl : "Talmerktur listi",
@@ -105,27 +109,27 @@
ImageButton : "Myndaknøttur",
FitWindow : "Set tekstviðgera til fulla stødd",
-ShowBlocks : "Show Blocks", //MISSING
+ShowBlocks : "Vís blokkar",
// Context Menu
EditLink : "Broyt tilknýti",
CellCM : "Meski",
RowCM : "Rað",
ColumnCM : "Kolonna",
-InsertRowAfter : "Insert Row After", //MISSING
-InsertRowBefore : "Insert Row Before", //MISSING
+InsertRowAfter : "Set rað inn aftaná",
+InsertRowBefore : "Set rað inn áðrenn",
DeleteRows : "Strika røðir",
-InsertColumnAfter : "Insert Column After", //MISSING
-InsertColumnBefore : "Insert Column Before", //MISSING
+InsertColumnAfter : "Set kolonnu inn aftaná",
+InsertColumnBefore : "Set kolonnu inn áðrenn",
DeleteColumns : "Strika kolonnur",
-InsertCellAfter : "Insert Cell After", //MISSING
-InsertCellBefore : "Insert Cell Before", //MISSING
+InsertCellAfter : "Set meska inn aftaná",
+InsertCellBefore : "Set meska inn áðrenn",
DeleteCells : "Strika meskar",
MergeCells : "Flætta meskar",
-MergeRight : "Merge Right", //MISSING
-MergeDown : "Merge Down", //MISSING
-HorizontalSplitCell : "Split Cell Horizontally", //MISSING
-VerticalSplitCell : "Split Cell Vertically", //MISSING
+MergeRight : "Flætta meskar til høgru",
+MergeDown : "Flætta saman",
+HorizontalSplitCell : "Kloyv meska vatnrætt",
+VerticalSplitCell : "Kloyv meska loddrætt",
TableDelete : "Strika tabell",
CellProperties : "Meskueginleikar",
TableProperties : "Tabelleginleikar",
@@ -157,6 +161,7 @@
NoActiveX : "Trygdaruppsetingin í alnótskaganum kann sum er avmarka onkrar hentleikar í tekstviðgeranum. Tú mást loyva møguleikanum \"Run/Kør ActiveX controls and plug-ins\". Tú kanst uppliva feilir og ávaringar um tvørrandi hentleikar.",
BrowseServerBlocked : "Ambætarakagin kundi ikki opnast. Tryggja tær, at allar pop-up forðingar eru óvirknar.",
DialogBlocked : "Tað eyðnaðist ikki at opna samskiftisrútin. Tryggja tær, at allar pop-up forðingar eru óvirknar.",
+VisitLinkBlocked : "Tað eyðnaðist ikki at opna nýggjan rút. Tryggja tær, at allar pop-up forðingar eru óvirknar.",
// Dialogs
DlgBtnOK : "Góðkent",
@@ -332,7 +337,7 @@
DlgCellBtnSelect : "Vel...",
// Find and Replace Dialog
-DlgFindAndReplaceTitle : "Find and Replace", //MISSING
+DlgFindAndReplaceTitle : "Finn og broyt",
// Find Dialog
DlgFindTitle : "Finn",
@@ -349,19 +354,19 @@
DlgReplaceWordChk : "Bert heil orð",
// Paste Operations / Dialog
-PasteErrorCut : "Trygdaruppseting alnótskagans forðar tekstviðgeranum í at kvetta tekstin. vinarliga nýt knappaborðið til at kvetta tekstin (CTRL+X).",
+PasteErrorCut : "Trygdaruppseting alnótskagans forðar tekstviðgeranum í at kvetta tekstin. Vinarliga nýt knappaborðið til at kvetta tekstin (CTRL+X).",
PasteErrorCopy : "Trygdaruppseting alnótskagans forðar tekstviðgeranum í at avrita tekstin. Vinarliga nýt knappaborðið til at avrita tekstin (CTRL+C).",
PasteAsText : "Innrita som reinan tekst",
PasteFromWord : "Innrita fra Word",
DlgPasteMsg2 : "Vinarliga koyr tekstin í hendan rútin við knappaborðinum (<strong>CTRL+V</strong>) og klikk á <strong>Góðtak</strong>.",
-DlgPasteSec : "Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.", //MISSING
+DlgPasteSec : "Trygdaruppseting alnótskagans forðar tekstviðgeranum í beinleiðis atgongd til avritingarminnið. Tygum mugu royna aftur í hesum rútinum.",
DlgPasteIgnoreFont : "Forfjóna Font definitiónirnar",
-DlgPasteRemoveStyles : "Strika Styles definitiónir",
+DlgPasteRemoveStyles : "Strika typografi definitiónir",
// Color Picker
-ColorAutomatic : "Av sær sjálvum",
+ColorAutomatic : "Automatiskt",
ColorMoreColors : "Fleiri litir...",
// Document Properties
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Upplýsingar um alnótskagan",
DlgAboutLicenseTab : "License",
DlgAboutVersion : "version",
-DlgAboutInfo : "Fyri fleiri upplýsingar, far til"
+DlgAboutInfo : "Fyri fleiri upplýsingar, far til",
+
+// Div Dialog
+DlgDivGeneralTab : "Generelt",
+DlgDivAdvancedTab : "Fjølbroytt",
+DlgDivStyle : "Typografi",
+DlgDivInlineStyle : "Inline typografi"
};
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/fr-ca.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/fr-ca.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,526 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Canadian French language file.
+ */
+
+var FCKLang =
+{
+// Language direction : "ltr" (left to right) or "rtl" (right to left).
+Dir : "ltr",
+
+ToolbarCollapse : "Masquer Outils",
+ToolbarExpand : "Afficher Outils",
+
+// Toolbar Items and Context Menu
+Save : "Sauvegarder",
+NewPage : "Nouvelle page",
+Preview : "Previsualiser",
+Cut : "Couper",
+Copy : "Copier",
+Paste : "Coller",
+PasteText : "Coller en tant que texte",
+PasteWord : "Coller en tant que Word (formaté)",
+Print : "Imprimer",
+SelectAll : "Tout sélectionner",
+RemoveFormat : "Supprimer le formatage",
+InsertLinkLbl : "Lien",
+InsertLink : "Insérer/modifier le lien",
+RemoveLink : "Supprimer le lien",
+VisitLink : "Suivre le lien",
+Anchor : "Insérer/modifier l'ancre",
+AnchorDelete : "Supprimer l'ancre",
+InsertImageLbl : "Image",
+InsertImage : "Insérer/modifier l'image",
+InsertFlashLbl : "Animation Flash",
+InsertFlash : "Insérer/modifier l'animation Flash",
+InsertTableLbl : "Tableau",
+InsertTable : "Insérer/modifier le tableau",
+InsertLineLbl : "Séparateur",
+InsertLine : "Insérer un séparateur",
+InsertSpecialCharLbl: "Caractères spéciaux",
+InsertSpecialChar : "Insérer un caractère spécial",
+InsertSmileyLbl : "Emoticon",
+InsertSmiley : "Insérer un Emoticon",
+About : "A propos de FCKeditor",
+Bold : "Gras",
+Italic : "Italique",
+Underline : "Souligné",
+StrikeThrough : "Barrer",
+Subscript : "Indice",
+Superscript : "Exposant",
+LeftJustify : "Aligner à gauche",
+CenterJustify : "Centrer",
+RightJustify : "Aligner à Droite",
+BlockJustify : "Texte justifié",
+DecreaseIndent : "Diminuer le retrait",
+IncreaseIndent : "Augmenter le retrait",
+Blockquote : "Citation",
+CreateDiv : "Créer Balise Div",
+EditDiv : "Modifier Balise Div",
+DeleteDiv : "Supprimer Balise Div",
+Undo : "Annuler",
+Redo : "Refaire",
+NumberedListLbl : "Liste numérotée",
+NumberedList : "Insérer/supprimer la liste numérotée",
+BulletedListLbl : "Liste à puces",
+BulletedList : "Insérer/supprimer la liste à puces",
+ShowTableBorders : "Afficher les bordures du tableau",
+ShowDetails : "Afficher les caractères invisibles",
+Style : "Style",
+FontFormat : "Format",
+Font : "Police",
+FontSize : "Taille",
+TextColor : "Couleur de caractère",
+BGColor : "Couleur de fond",
+Source : "Source",
+Find : "Chercher",
+Replace : "Remplacer",
+SpellCheck : "Orthographe",
+UniversalKeyboard : "Clavier universel",
+PageBreakLbl : "Saut de page",
+PageBreak : "Insérer un saut de page",
+
+Form : "Formulaire",
+Checkbox : "Case à cocher",
+RadioButton : "Bouton radio",
+TextField : "Champ texte",
+Textarea : "Zone de texte",
+HiddenField : "Champ caché",
+Button : "Bouton",
+SelectionField : "Champ de sélection",
+ImageButton : "Bouton image",
+
+FitWindow : "Edition pleine page",
+ShowBlocks : "Afficher les blocs",
+
+// Context Menu
+EditLink : "Modifier le lien",
+CellCM : "Cellule",
+RowCM : "Ligne",
+ColumnCM : "Colonne",
+InsertRowAfter : "Insérer une ligne après",
+InsertRowBefore : "Insérer une ligne avant",
+DeleteRows : "Supprimer des lignes",
+InsertColumnAfter : "Insérer une colonne après",
+InsertColumnBefore : "Insérer une colonne avant",
+DeleteColumns : "Supprimer des colonnes",
+InsertCellAfter : "Insérer une cellule après",
+InsertCellBefore : "Insérer une cellule avant",
+DeleteCells : "Supprimer des cellules",
+MergeCells : "Fusionner les cellules",
+MergeRight : "Fusionner à droite",
+MergeDown : "Fusionner en bas",
+HorizontalSplitCell : "Scinder la cellule horizontalement",
+VerticalSplitCell : "Scinder la cellule verticalement",
+TableDelete : "Supprimer le tableau",
+CellProperties : "Propriétés de cellule",
+TableProperties : "Propriétés du tableau",
+ImageProperties : "Propriétés de l'image",
+FlashProperties : "Propriétés de l'animation Flash",
+
+AnchorProp : "Propriétés de l'ancre",
+ButtonProp : "Propriétés du bouton",
+CheckboxProp : "Propriétés de la case à cocher",
+HiddenFieldProp : "Propriétés du champ caché",
+RadioButtonProp : "Propriétés du bouton radio",
+ImageButtonProp : "Propriétés du bouton image",
+TextFieldProp : "Propriétés du champ texte",
+SelectionFieldProp : "Propriétés de la liste/du menu",
+TextareaProp : "Propriétés de la zone de texte",
+FormProp : "Propriétés du formulaire",
+
+FontFormats : "Normal;Formaté;Adresse;En-tête 1;En-tête 2;En-tête 3;En-tête 4;En-tête 5;En-tête 6;Normal (DIV)",
+
+// Alerts and Messages
+ProcessingXHTML : "Calcul XHTML. Veuillez patienter...",
+Done : "Terminé",
+PasteWordConfirm : "Le texte à coller semble provenir de Word. Désirez-vous le nettoyer avant de coller?",
+NotCompatiblePaste : "Cette commande nécessite Internet Explorer version 5.5 et plus. Souhaitez-vous coller sans nettoyage?",
+UnknownToolbarItem : "Élément de barre d'outil inconnu \"%1\"",
+UnknownCommand : "Nom de commande inconnu \"%1\"",
+NotImplemented : "Commande indisponible",
+UnknownToolbarSet : "La barre d'outils \"%1\" n'existe pas",
+NoActiveX : "Les paramètres de sécurité de votre navigateur peuvent limiter quelques fonctionnalités de l'éditeur. Veuillez activer l'option \"Exécuter les contrôles ActiveX et les plug-ins\". Il se peut que vous rencontriez des erreurs et remarquiez quelques limitations.",
+BrowseServerBlocked : "Le navigateur n'a pas pu être ouvert. Assurez-vous que les bloqueurs de popups soient désactivés.",
+DialogBlocked : "La fenêtre de dialogue n'a pas pu s'ouvrir. Assurez-vous que les bloqueurs de popups soient désactivés.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
+
+// Dialogs
+DlgBtnOK : "OK",
+DlgBtnCancel : "Annuler",
+DlgBtnClose : "Fermer",
+DlgBtnBrowseServer : "Parcourir le serveur",
+DlgAdvancedTag : "Avancée",
+DlgOpOther : "<autre>",
+DlgInfoTab : "Info",
+DlgAlertUrl : "Veuillez saisir l'URL",
+
+// General Dialogs Labels
+DlgGenNotSet : "<Par défaut>",
+DlgGenId : "Id",
+DlgGenLangDir : "Sens d'écriture",
+DlgGenLangDirLtr : "De gauche à droite (LTR)",
+DlgGenLangDirRtl : "De droite à gauche (RTL)",
+DlgGenLangCode : "Code langue",
+DlgGenAccessKey : "Équivalent clavier",
+DlgGenName : "Nom",
+DlgGenTabIndex : "Ordre de tabulation",
+DlgGenLongDescr : "URL de description longue",
+DlgGenClass : "Classes de feuilles de style",
+DlgGenTitle : "Titre",
+DlgGenContType : "Type de contenu",
+DlgGenLinkCharset : "Encodage de caractère",
+DlgGenStyle : "Style",
+
+// Image Dialog
+DlgImgTitle : "Propriétés de l'image",
+DlgImgInfoTab : "Informations sur l'image",
+DlgImgBtnUpload : "Envoyer sur le serveur",
+DlgImgURL : "URL",
+DlgImgUpload : "Télécharger",
+DlgImgAlt : "Texte de remplacement",
+DlgImgWidth : "Largeur",
+DlgImgHeight : "Hauteur",
+DlgImgLockRatio : "Garder les proportions",
+DlgBtnResetSize : "Taille originale",
+DlgImgBorder : "Bordure",
+DlgImgHSpace : "Espacement horizontal",
+DlgImgVSpace : "Espacement vertical",
+DlgImgAlign : "Alignement",
+DlgImgAlignLeft : "Gauche",
+DlgImgAlignAbsBottom: "Abs Bas",
+DlgImgAlignAbsMiddle: "Abs Milieu",
+DlgImgAlignBaseline : "Bas du texte",
+DlgImgAlignBottom : "Bas",
+DlgImgAlignMiddle : "Milieu",
+DlgImgAlignRight : "Droite",
+DlgImgAlignTextTop : "Haut du texte",
+DlgImgAlignTop : "Haut",
+DlgImgPreview : "Prévisualisation",
+DlgImgAlertUrl : "Veuillez saisir l'URL de l'image",
+DlgImgLinkTab : "Lien",
+
+// Flash Dialog
+DlgFlashTitle : "Propriétés de l'animation Flash",
+DlgFlashChkPlay : "Lecture automatique",
+DlgFlashChkLoop : "Boucle",
+DlgFlashChkMenu : "Activer le menu Flash",
+DlgFlashScale : "Affichage",
+DlgFlashScaleAll : "Par défaut (tout montrer)",
+DlgFlashScaleNoBorder : "Sans bordure",
+DlgFlashScaleFit : "Ajuster aux dimensions",
+
+// Link Dialog
+DlgLnkWindowTitle : "Propriétés du lien",
+DlgLnkInfoTab : "Informations sur le lien",
+DlgLnkTargetTab : "Destination",
+
+DlgLnkType : "Type de lien",
+DlgLnkTypeURL : "URL",
+DlgLnkTypeAnchor : "Ancre dans cette page",
+DlgLnkTypeEMail : "E-Mail",
+DlgLnkProto : "Protocole",
+DlgLnkProtoOther : "<autre>",
+DlgLnkURL : "URL",
+DlgLnkAnchorSel : "Sélectionner une ancre",
+DlgLnkAnchorByName : "Par nom",
+DlgLnkAnchorById : "Par id",
+DlgLnkNoAnchors : "(Pas d'ancre disponible dans le document)",
+DlgLnkEMail : "Adresse E-Mail",
+DlgLnkEMailSubject : "Sujet du message",
+DlgLnkEMailBody : "Corps du message",
+DlgLnkUpload : "Télécharger",
+DlgLnkBtnUpload : "Envoyer sur le serveur",
+
+DlgLnkTarget : "Destination",
+DlgLnkTargetFrame : "<Cadre>",
+DlgLnkTargetPopup : "<fenêtre popup>",
+DlgLnkTargetBlank : "Nouvelle fenêtre (_blank)",
+DlgLnkTargetParent : "Fenêtre mère (_parent)",
+DlgLnkTargetSelf : "Même fenêtre (_self)",
+DlgLnkTargetTop : "Fenêtre supérieure (_top)",
+DlgLnkTargetFrameName : "Nom du cadre de destination",
+DlgLnkPopWinName : "Nom de la fenêtre popup",
+DlgLnkPopWinFeat : "Caractéristiques de la fenêtre popup",
+DlgLnkPopResize : "Taille modifiable",
+DlgLnkPopLocation : "Barre d'adresses",
+DlgLnkPopMenu : "Barre de menu",
+DlgLnkPopScroll : "Barres de défilement",
+DlgLnkPopStatus : "Barre d'état",
+DlgLnkPopToolbar : "Barre d'outils",
+DlgLnkPopFullScrn : "Plein écran (IE)",
+DlgLnkPopDependent : "Dépendante (Netscape)",
+DlgLnkPopWidth : "Largeur",
+DlgLnkPopHeight : "Hauteur",
+DlgLnkPopLeft : "Position à partir de la gauche",
+DlgLnkPopTop : "Position à partir du haut",
+
+DlnLnkMsgNoUrl : "Veuillez saisir l'URL",
+DlnLnkMsgNoEMail : "Veuillez saisir l'adresse e-mail",
+DlnLnkMsgNoAnchor : "Veuillez sélectionner une ancre",
+DlnLnkMsgInvPopName : "Le nom de la fenêtre popup doit commencer par une lettre et ne doit pas contenir d'espace",
+
+// Color Dialog
+DlgColorTitle : "Sélectionner",
+DlgColorBtnClear : "Effacer",
+DlgColorHighlight : "Prévisualisation",
+DlgColorSelected : "Sélectionné",
+
+// Smiley Dialog
+DlgSmileyTitle : "Insérer un Emoticon",
+
+// Special Character Dialog
+DlgSpecialCharTitle : "Insérer un caractère spécial",
+
+// Table Dialog
+DlgTableTitle : "Propriétés du tableau",
+DlgTableRows : "Lignes",
+DlgTableColumns : "Colonnes",
+DlgTableBorder : "Taille de la bordure",
+DlgTableAlign : "Alignement",
+DlgTableAlignNotSet : "<Par défaut>",
+DlgTableAlignLeft : "Gauche",
+DlgTableAlignCenter : "Centré",
+DlgTableAlignRight : "Droite",
+DlgTableWidth : "Largeur",
+DlgTableWidthPx : "pixels",
+DlgTableWidthPc : "pourcentage",
+DlgTableHeight : "Hauteur",
+DlgTableCellSpace : "Espacement",
+DlgTableCellPad : "Contour",
+DlgTableCaption : "Titre",
+DlgTableSummary : "Résumé",
+
+// Table Cell Dialog
+DlgCellTitle : "Propriétés de la cellule",
+DlgCellWidth : "Largeur",
+DlgCellWidthPx : "pixels",
+DlgCellWidthPc : "pourcentage",
+DlgCellHeight : "Hauteur",
+DlgCellWordWrap : "Retour à la ligne",
+DlgCellWordWrapNotSet : "<Par défaut>",
+DlgCellWordWrapYes : "Oui",
+DlgCellWordWrapNo : "Non",
+DlgCellHorAlign : "Alignement horizontal",
+DlgCellHorAlignNotSet : "<Par défaut>",
+DlgCellHorAlignLeft : "Gauche",
+DlgCellHorAlignCenter : "Centré",
+DlgCellHorAlignRight: "Droite",
+DlgCellVerAlign : "Alignement vertical",
+DlgCellVerAlignNotSet : "<Par défaut>",
+DlgCellVerAlignTop : "Haut",
+DlgCellVerAlignMiddle : "Milieu",
+DlgCellVerAlignBottom : "Bas",
+DlgCellVerAlignBaseline : "Bas du texte",
+DlgCellRowSpan : "Lignes fusionnées",
+DlgCellCollSpan : "Colonnes fusionnées",
+DlgCellBackColor : "Couleur de fond",
+DlgCellBorderColor : "Couleur de bordure",
+DlgCellBtnSelect : "Sélectionner...",
+
+// Find and Replace Dialog
+DlgFindAndReplaceTitle : "Chercher et Remplacer",
+
+// Find Dialog
+DlgFindTitle : "Chercher",
+DlgFindFindBtn : "Chercher",
+DlgFindNotFoundMsg : "Le texte indiqué est introuvable.",
+
+// Replace Dialog
+DlgReplaceTitle : "Remplacer",
+DlgReplaceFindLbl : "Rechercher:",
+DlgReplaceReplaceLbl : "Remplacer par:",
+DlgReplaceCaseChk : "Respecter la casse",
+DlgReplaceReplaceBtn : "Remplacer",
+DlgReplaceReplAllBtn : "Tout remplacer",
+DlgReplaceWordChk : "Mot entier",
+
+// Paste Operations / Dialog
+PasteErrorCut : "Les paramètres de sécurité de votre navigateur empêchent l'éditeur de couper automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl+X).",
+PasteErrorCopy : "Les paramètres de sécurité de votre navigateur empêchent l'éditeur de copier automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl+C).",
+
+PasteAsText : "Coller comme texte",
+PasteFromWord : "Coller à partir de Word",
+
+DlgPasteMsg2 : "Veuillez coller dans la zone ci-dessous en utilisant le clavier (<STRONG>Ctrl+V</STRONG>) et appuyer sur <STRONG>OK</STRONG>.",
+DlgPasteSec : "A cause des paramètres de sécurité de votre navigateur, l'éditeur ne peut accéder au presse-papier directement. Vous devez coller à nouveau le contenu dans cette fenêtre.",
+DlgPasteIgnoreFont : "Ignorer les polices de caractères",
+DlgPasteRemoveStyles : "Supprimer les styles",
+
+// Color Picker
+ColorAutomatic : "Automatique",
+ColorMoreColors : "Plus de couleurs...",
+
+// Document Properties
+DocProps : "Propriétés du document",
+
+// Anchor Dialog
+DlgAnchorTitle : "Propriétés de l'ancre",
+DlgAnchorName : "Nom de l'ancre",
+DlgAnchorErrorName : "Veuillez saisir le nom de l'ancre",
+
+// Speller Pages Dialog
+DlgSpellNotInDic : "Pas dans le dictionnaire",
+DlgSpellChangeTo : "Changer en",
+DlgSpellBtnIgnore : "Ignorer",
+DlgSpellBtnIgnoreAll : "Ignorer tout",
+DlgSpellBtnReplace : "Remplacer",
+DlgSpellBtnReplaceAll : "Remplacer tout",
+DlgSpellBtnUndo : "Annuler",
+DlgSpellNoSuggestions : "- Pas de suggestion -",
+DlgSpellProgress : "Vérification d'orthographe en cours...",
+DlgSpellNoMispell : "Vérification d'orthographe terminée: pas d'erreur trouvée",
+DlgSpellNoChanges : "Vérification d'orthographe terminée: Pas de modifications",
+DlgSpellOneChange : "Vérification d'orthographe terminée: Un mot modifié",
+DlgSpellManyChanges : "Vérification d'orthographe terminée: %1 mots modifiés",
+
+IeSpellDownload : "Le Correcteur d'orthographe n'est pas installé. Souhaitez-vous le télécharger maintenant?",
+
+// Button Dialog
+DlgButtonText : "Texte (Valeur)",
+DlgButtonType : "Type",
+DlgButtonTypeBtn : "Bouton",
+DlgButtonTypeSbm : "Soumettre",
+DlgButtonTypeRst : "Réinitialiser",
+
+// Checkbox and Radio Button Dialogs
+DlgCheckboxName : "Nom",
+DlgCheckboxValue : "Valeur",
+DlgCheckboxSelected : "Sélectionné",
+
+// Form Dialog
+DlgFormName : "Nom",
+DlgFormAction : "Action",
+DlgFormMethod : "Méthode",
+
+// Select Field Dialog
+DlgSelectName : "Nom",
+DlgSelectValue : "Valeur",
+DlgSelectSize : "Taille",
+DlgSelectLines : "lignes",
+DlgSelectChkMulti : "Sélection multiple",
+DlgSelectOpAvail : "Options disponibles",
+DlgSelectOpText : "Texte",
+DlgSelectOpValue : "Valeur",
+DlgSelectBtnAdd : "Ajouter",
+DlgSelectBtnModify : "Modifier",
+DlgSelectBtnUp : "Monter",
+DlgSelectBtnDown : "Descendre",
+DlgSelectBtnSetValue : "Valeur sélectionnée",
+DlgSelectBtnDelete : "Supprimer",
+
+// Textarea Dialog
+DlgTextareaName : "Nom",
+DlgTextareaCols : "Colonnes",
+DlgTextareaRows : "Lignes",
+
+// Text Field Dialog
+DlgTextName : "Nom",
+DlgTextValue : "Valeur",
+DlgTextCharWidth : "Largeur en caractères",
+DlgTextMaxChars : "Nombre maximum de caractères",
+DlgTextType : "Type",
+DlgTextTypeText : "Texte",
+DlgTextTypePass : "Mot de passe",
+
+// Hidden Field Dialog
+DlgHiddenName : "Nom",
+DlgHiddenValue : "Valeur",
+
+// Bulleted List Dialog
+BulletedListProp : "Propriétés de liste à puces",
+NumberedListProp : "Propriétés de liste numérotée",
+DlgLstStart : "Début",
+DlgLstType : "Type",
+DlgLstTypeCircle : "Cercle",
+DlgLstTypeDisc : "Disque",
+DlgLstTypeSquare : "Carré",
+DlgLstTypeNumbers : "Nombres (1, 2, 3)",
+DlgLstTypeLCase : "Lettres minuscules (a, b, c)",
+DlgLstTypeUCase : "Lettres majuscules (A, B, C)",
+DlgLstTypeSRoman : "Chiffres romains minuscules (i, ii, iii)",
+DlgLstTypeLRoman : "Chiffres romains majuscules (I, II, III)",
+
+// Document Properties Dialog
+DlgDocGeneralTab : "Général",
+DlgDocBackTab : "Fond",
+DlgDocColorsTab : "Couleurs et Marges",
+DlgDocMetaTab : "Méta-Données",
+
+DlgDocPageTitle : "Titre de la page",
+DlgDocLangDir : "Sens d'écriture",
+DlgDocLangDirLTR : "De la gauche vers la droite (LTR)",
+DlgDocLangDirRTL : "De la droite vers la gauche (RTL)",
+DlgDocLangCode : "Code langue",
+DlgDocCharSet : "Encodage de caractère",
+DlgDocCharSetCE : "Europe Centrale",
+DlgDocCharSetCT : "Chinois Traditionnel (Big5)",
+DlgDocCharSetCR : "Cyrillique",
+DlgDocCharSetGR : "Grecque",
+DlgDocCharSetJP : "Japonais",
+DlgDocCharSetKR : "Coréen",
+DlgDocCharSetTR : "Turcque",
+DlgDocCharSetUN : "Unicode (UTF-8)",
+DlgDocCharSetWE : "Occidental",
+DlgDocCharSetOther : "Autre encodage de caractère",
+
+DlgDocDocType : "Type de document",
+DlgDocDocTypeOther : "Autre type de document",
+DlgDocIncXHTML : "Inclure les déclarations XHTML",
+DlgDocBgColor : "Couleur de fond",
+DlgDocBgImage : "Image de fond",
+DlgDocBgNoScroll : "Image fixe sans défilement",
+DlgDocCText : "Texte",
+DlgDocCLink : "Lien",
+DlgDocCVisited : "Lien visité",
+DlgDocCActive : "Lien activé",
+DlgDocMargins : "Marges",
+DlgDocMaTop : "Haut",
+DlgDocMaLeft : "Gauche",
+DlgDocMaRight : "Droite",
+DlgDocMaBottom : "Bas",
+DlgDocMeIndex : "Mots-clés (séparés par des virgules)",
+DlgDocMeDescr : "Description",
+DlgDocMeAuthor : "Auteur",
+DlgDocMeCopy : "Copyright",
+DlgDocPreview : "Prévisualisation",
+
+// Templates Dialog
+Templates : "Modèles",
+DlgTemplatesTitle : "Modèles de contenu",
+DlgTemplatesSelMsg : "Sélectionner le modèle à ouvrir dans l'éditeur<br>(le contenu actuel sera remplacé):",
+DlgTemplatesLoading : "Chargement de la liste des modèles. Veuillez patienter...",
+DlgTemplatesNoTpl : "(Aucun modèle disponible)",
+DlgTemplatesReplace : "Remplacer tout le contenu actuel",
+
+// About Dialog
+DlgAboutAboutTab : "Á propos de",
+DlgAboutBrowserInfoTab : "Navigateur",
+DlgAboutLicenseTab : "License",
+DlgAboutVersion : "Version",
+DlgAboutInfo : "Pour plus d'informations, visiter",
+
+// Div Dialog
+DlgDivGeneralTab : "Général",
+DlgDivAdvancedTab : "Avancé",
+DlgDivStyle : "Style",
+DlgDivInlineStyle : "Attribut Style"
+};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/fr.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/fr.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/fr.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Lien",
InsertLink : "Insérer/modifier le lien",
RemoveLink : "Supprimer le lien",
+VisitLink : "Suivre le lien",
Anchor : "Insérer/modifier l'ancre",
AnchorDelete : "Supprimer l'ancre",
InsertImageLbl : "Image",
@@ -72,6 +73,9 @@
DecreaseIndent : "Diminuer le retrait",
IncreaseIndent : "Augmenter le retrait",
Blockquote : "Citation",
+CreateDiv : "Créer Balise Div",
+EditDiv : "Modifier Balise Div",
+DeleteDiv : "Supprimer Balise Div",
Undo : "Annuler",
Redo : "Refaire",
NumberedListLbl : "Liste numérotée",
@@ -157,6 +161,7 @@
NoActiveX : "Les paramètres de sécurité de votre navigateur peuvent limiter quelques fonctionnalités de l'éditeur. Veuillez activer l'option \"Exécuter les contrôles ActiveX et les plug-ins\". Il se peut que vous rencontriez des erreurs et remarquiez quelques limitations.",
BrowseServerBlocked : "Le navigateur n'a pas pu être ouvert. Assurez-vous que les bloqueurs de popups soient désactivés.",
DialogBlocked : "La fenêtre de dialogue n'a pas pu s'ouvrir. Assurez-vous que les bloqueurs de popups soient désactivés.",
+VisitLinkBlocked : "Impossible d'ouvrir une nouvelle fenêtre. Assurez-vous que les bloqueurs de popups soient désactivés.",
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Navigateur",
DlgAboutLicenseTab : "Licence",
DlgAboutVersion : "Version",
-DlgAboutInfo : "Pour plus d'informations, aller à"
+DlgAboutInfo : "Pour plus d'informations, aller à",
+
+// Div Dialog
+DlgDivGeneralTab : "Général",
+DlgDivAdvancedTab : "Avancé",
+DlgDivStyle : "Style",
+DlgDivInlineStyle : "Attribut Style"
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/gl.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/gl.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/gl.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Ligazón",
InsertLink : "Inserir/Editar Ligazón",
RemoveLink : "Eliminar Ligazón",
+VisitLink : "Open Link", //MISSING
Anchor : "Inserir/Editar Referencia",
AnchorDelete : "Remove Anchor", //MISSING
InsertImageLbl : "Imaxe",
@@ -72,6 +73,9 @@
DecreaseIndent : "Disminuir Sangría",
IncreaseIndent : "Aumentar Sangría",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Desfacer",
Redo : "Refacer",
NumberedListLbl : "Lista Numerada",
@@ -157,6 +161,7 @@
NoActiveX : "As opcións de seguridade do seu navegador poderían limitar algunha das características de editor. Debe activar a opción \"Executar controis ActiveX e plug-ins\". Pode notar que faltan características e experimentar erros",
BrowseServerBlocked : "Non se poido abrir o navegador de recursos. Asegúrese de que están desactivados os bloqueadores de xanelas emerxentes",
DialogBlocked : "Non foi posible abrir a xanela de diálogo. Asegúrese de que están desactivados os bloqueadores de xanelas emerxentes",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Información do Navegador",
DlgAboutLicenseTab : "Licencia",
DlgAboutVersion : "versión",
-DlgAboutInfo : "Para máis información visitar:"
+DlgAboutInfo : "Para máis información visitar:",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/gu.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/gu.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,526 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Gujarati language file.
+ */
+
+var FCKLang =
+{
+// Language direction : "ltr" (left to right) or "rtl" (right to left).
+Dir : "ltr",
+
+ToolbarCollapse : "ટૂલબાર નાનું કરવું",
+ToolbarExpand : "ટૂલબાર મોટું કરવું",
+
+// Toolbar Items and Context Menu
+Save : "સેવ",
+NewPage : "નવુ પાનું",
+Preview : "પૂર્વદર્શન",
+Cut : "કાપવું",
+Copy : "નકલ",
+Paste : "પેસ્ટ",
+PasteText : "પેસ્ટ (સાદી ટેક્સ્ટ)",
+PasteWord : "પેસ્ટ (વડૅ ટેક્સ્ટ)",
+Print : "પ્રિન્ટ",
+SelectAll : "બઘું પસંદ કરવું",
+RemoveFormat : "ફૉર્મટ કાઢવું",
+InsertLinkLbl : "સંબંધન, લિંક",
+InsertLink : "લિંક ઇન્સર્ટ/દાખલ કરવી",
+RemoveLink : "લિંક કાઢવી",
+VisitLink : "Open Link", //MISSING
+Anchor : "ઍંકર ઇન્સર્ટ/દાખલ કરવી",
+AnchorDelete : "ઍંકર કાઢવી",
+InsertImageLbl : "ચિત્ર",
+InsertImage : "ચિત્ર ઇન્સર્ટ/દાખલ કરવું",
+InsertFlashLbl : "ફ્લૅશ",
+InsertFlash : "ફ્લૅશ ઇન્સર્ટ/દાખલ કરવું",
+InsertTableLbl : "ટેબલ, કોઠો",
+InsertTable : "ટેબલ, કોઠો ઇન્સર્ટ/દાખલ કરવું",
+InsertLineLbl : "રેખા",
+InsertLine : "સમસ્તરીય રેખા ઇન્સર્ટ/દાખલ કરવી",
+InsertSpecialCharLbl: "વિશિષ્ટ અક્ષર",
+InsertSpecialChar : "વિશિષ્ટ અક્ષર ઇન્સર્ટ/દાખલ કરવું",
+InsertSmileyLbl : "સ્માઇલી",
+InsertSmiley : "સ્માઇલી ઇન્સર્ટ/દાખલ કરવી",
+About : "FCKeditorના વિષે",
+Bold : "બોલ્ડ/સ્પષ્ટ",
+Italic : "ઇટેલિક, ત્રાંસા",
+Underline : "અન્ડર્લાઇન, નીચે લીટી",
+StrikeThrough : "છેકી નાખવું",
+Subscript : "એક ચિહ્નની નીચે કરેલું બીજું ચિહ્ન",
+Superscript : "એક ચિહ્ન ઉપર કરેલું બીજું ચિહ્ન.",
+LeftJustify : "ડાબી બાજુએ/બાજુ તરફ",
+CenterJustify : "સંકેંદ્રણ/સેંટરિંગ",
+RightJustify : "જમણી બાજુએ/બાજુ તરફ",
+BlockJustify : "બ્લૉક, અંતરાય જસ્ટિફાઇ",
+DecreaseIndent : "ઇન્ડેન્ટ લીટીના આરંભમાં જગ્યા ઘટાડવી",
+IncreaseIndent : "ઇન્ડેન્ટ, લીટીના આરંભમાં જગ્યા વધારવી",
+Blockquote : "બ્લૉક-કોટ, અવતરણચિહ્નો",
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
+Undo : "રદ કરવું; પહેલાં હતી એવી સ્થિતિ પાછી લાવવી",
+Redo : "રિડૂ; પછી હતી એવી સ્થિતિ પાછી લાવવી",
+NumberedListLbl : "સંખ્યાંકન સૂચિ",
+NumberedList : "સંખ્યાંકન સૂચિ ઇન્સર્ટ/દાખલ કરવી",
+BulletedListLbl : "બુલેટ સૂચિ",
+BulletedList : "બુલેટ સૂચિ ઇન્સર્ટ/દાખલ કરવી",
+ShowTableBorders : "ટેબલ, કોઠાની બાજુ(બોર્ડર) બતાવવી",
+ShowDetails : "વિસ્તૃત વિગતવાર બતાવવું",
+Style : "શૈલી/રીત",
+FontFormat : "ફૉન્ટ ફૉર્મટ, રચનાની શૈલી",
+Font : "ફૉન્ટ",
+FontSize : "ફૉન્ટ સાઇઝ/કદ",
+TextColor : "શબ્દનો રંગ",
+BGColor : "બૅકગ્રાઉન્ડ રંગ,",
+Source : "મૂળ કે પ્રાથમિક દસ્તાવેજ",
+Find : "શોધવું",
+Replace : "રિપ્લેસ/બદલવું",
+SpellCheck : "જોડણી (સ્પેલિંગ) તપાસવી",
+UniversalKeyboard : "યૂનિવર્સલ/વિશ્વવ્યાપક કીબૉર્ડ",
+PageBreakLbl : "પેજબ્રેક/પાનાને અલગ કરવું",
+PageBreak : "ઇન્સર્ટ પેજબ્રેક/પાનાને અલગ કરવું/દાખલ કરવું",
+
+Form : "ફૉર્મ/પત્રક",
+Checkbox : "ચેક બોક્સ",
+RadioButton : "રેડિઓ બટન",
+TextField : "ટેક્સ્ટ ફીલ્ડ, શબ્દ ક્ષેત્ર",
+Textarea : "ટેક્સ્ટ એરિઆ, શબ્દ વિસ્તાર",
+HiddenField : "ગુપ્ત ક્ષેત્ર",
+Button : "બટન",
+SelectionField : "પસંદગી ક્ષેત્ર",
+ImageButton : "ચિત્ર બટન",
+
+FitWindow : "એડિટરની સાઇઝ અધિકતમ કરવી",
+ShowBlocks : "બ્લૉક બતાવવું",
+
+// Context Menu
+EditLink : " લિંક એડિટ/માં ફેરફાર કરવો",
+CellCM : "કોષના ખાના",
+RowCM : "પંક્તિના ખાના",
+ColumnCM : "કૉલમ/ઊભી કટાર",
+InsertRowAfter : "પછી પંક્તિ ઉમેરવી",
+InsertRowBefore : "પહેલાં પંક્તિ ઉમેરવી",
+DeleteRows : "પંક્તિઓ ડિલીટ/કાઢી નાખવી",
+InsertColumnAfter : "પછી કૉલમ/ઊભી કટાર ઉમેરવી",
+InsertColumnBefore : "પહેલાં કૉલમ/ઊભી કટાર ઉમેરવી",
+DeleteColumns : "કૉલમ/ઊભી કટાર ડિલીટ/કાઢી નાખવી",
+InsertCellAfter : "પછી કોષ ઉમેરવો",
+InsertCellBefore : "પહેલાં કોષ ઉમેરવો",
+DeleteCells : "કોષ ડિલીટ/કાઢી નાખવો",
+MergeCells : "કોષ ભેગા કરવા",
+MergeRight : "જમણી બાજુ ભેગા કરવા",
+MergeDown : "નીચે ભેગા કરવા",
+HorizontalSplitCell : "કોષને સમસ્તરીય વિભાજન કરવું",
+VerticalSplitCell : "કોષને સીધું ને ઊભું વિભાજન કરવું",
+TableDelete : "કોઠો ડિલીટ/કાઢી નાખવું",
+CellProperties : "કોષના ગુણ",
+TableProperties : "કોઠાના ગુણ",
+ImageProperties : "ચિત્રના ગુણ",
+FlashProperties : "ફ્લૅશના ગુણ",
+
+AnchorProp : "ઍંકરના ગુણ",
+ButtonProp : "બટનના ગુણ",
+CheckboxProp : "ચેક બોક્સ ગુણ",
+HiddenFieldProp : "ગુપ્ત ક્ષેત્રના ગુણ",
+RadioButtonProp : "રેડિઓ બટનના ગુણ",
+ImageButtonProp : "ચિત્ર બટનના ગુણ",
+TextFieldProp : "ટેક્સ્ટ ફીલ્ડ, શબ્દ ક્ષેત્રના ગુણ",
+SelectionFieldProp : "પસંદગી ક્ષેત્રના ગુણ",
+TextareaProp : "ટેક્સ્ટ એઅરિઆ, શબ્દ વિસ્તારના ગુણ",
+FormProp : "ફૉર્મ/પત્રકના ગુણ",
+
+FontFormats : "સામાન્ય;ફૉર્મટેડ;સરનામું;શીર્ષક 1;શીર્ષક 2;શીર્ષક 3;શીર્ષક 4;શીર્ષક 5;શીર્ષક 6;શીર્ષક (DIV)",
+
+// Alerts and Messages
+ProcessingXHTML : "XHTML પ્રક્રિયા ચાલુ છે. મહેરબાની કરીને રાહ જોવો...",
+Done : "પતી ગયું",
+PasteWordConfirm : "તમે જે ટેક્સ્ટ પેસ્ટ કરવા માંગો છો, તે વડૅમાંથી કોપી કરેલુ લાગે છે. પેસ્ટ કરતા પહેલાં ટેક્સ્ટ સાફ કરવી છે?",
+NotCompatiblePaste : "આ કમાન્ડ ઈનટરનેટ એક્સપ્લોરર(Internet Explorer) 5.5 અથવા એના પછીના વર્ઝન માટેજ છે. ટેક્સ્ટને સાફ કયૅા પહેલાં પેસ્ટ કરવી છે?",
+UnknownToolbarItem : "અજાણી ટૂલબાર આઇટમ \"%1\"",
+UnknownCommand : "અજાણયો કમાન્ડ \"%1\"",
+NotImplemented : "કમાન્ડ ઇમ્પ્લિમન્ટ નથી કરોયો",
+UnknownToolbarSet : "ટૂલબાર સેટ \"%1\" ઉપલબ્ધ નથી",
+NoActiveX : "તમારા બ્રાઉઝરની સુરક્ષા સેટિંગસ એડિટરના અમુક ફીચરને પરવાનગી આપતી નથી. કૃપયા \"Run ActiveX controls and plug-ins\" વિકલ્પને ઇનેબલ/સમર્થ કરો. તમારા બ્રાઉઝરમાં એરર ઇન્વિઝિબલ ફીચરનો અનુભવ થઈ શકે છે. કૃપયા પૉપ-અપ બ્લૉકર ડિસેબલ કરો.",
+BrowseServerBlocked : "રિસૉર્સ બ્રાઉઝર ખોલી ન સકાયું.",
+DialogBlocked : "ડાયલૉગ વિન્ડો ખોલી ન સકાયું. કૃપયા પૉપ-અપ બ્લૉકર ડિસેબલ કરો.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
+
+// Dialogs
+DlgBtnOK : "ઠીક છે",
+DlgBtnCancel : "રદ કરવું",
+DlgBtnClose : "બંધ કરવું",
+DlgBtnBrowseServer : "સર્વર બ્રાઉઝ કરો",
+DlgAdvancedTag : "અડ્વાન્સડ",
+DlgOpOther : "<અન્ય>",
+DlgInfoTab : "સૂચના",
+DlgAlertUrl : "URL ઇન્સર્ટ કરો",
+
+// General Dialogs Labels
+DlgGenNotSet : "<સેટ નથી>",
+DlgGenId : "Id",
+DlgGenLangDir : "ભાષા લેખવાની પદ્ધતિ",
+DlgGenLangDirLtr : "ડાબે થી જમણે (LTR)",
+DlgGenLangDirRtl : "જમણે થી ડાબે (RTL)",
+DlgGenLangCode : "ભાષા કોડ",
+DlgGenAccessKey : "ઍક્સેસ કી",
+DlgGenName : "નામ",
+DlgGenTabIndex : "ટૅબ ઇન્ડેક્સ",
+DlgGenLongDescr : "વધારે માહિતી માટે URL",
+DlgGenClass : "સ્ટાઇલ-શીટ ક્લાસ",
+DlgGenTitle : "મુખ્ય મથાળું",
+DlgGenContType : "મુખ્ય કન્ટેન્ટ પ્રકાર",
+DlgGenLinkCharset : "લિંક રિસૉર્સ કૅરિક્ટર સેટ",
+DlgGenStyle : "સ્ટાઇલ",
+
+// Image Dialog
+DlgImgTitle : "ચિત્રના ગુણ",
+DlgImgInfoTab : "ચિત્ર ની જાણકારી",
+DlgImgBtnUpload : "આ સર્વરને મોકલવું",
+DlgImgURL : "URL",
+DlgImgUpload : "અપલોડ",
+DlgImgAlt : "ઑલ્ટર્નટ ટેક્સ્ટ",
+DlgImgWidth : "પહોળાઈ",
+DlgImgHeight : "ઊંચાઈ",
+DlgImgLockRatio : "લૉક ગુણોત્તર",
+DlgBtnResetSize : "રીસેટ સાઇઝ",
+DlgImgBorder : "બોર્ડર",
+DlgImgHSpace : "સમસ્તરીય જગ્યા",
+DlgImgVSpace : "લંબરૂપ જગ્યા",
+DlgImgAlign : "લાઇનદોરીમાં ગોઠવવું",
+DlgImgAlignLeft : "ડાબી બાજુ ગોઠવવું",
+DlgImgAlignAbsBottom: "Abs નીચે",
+DlgImgAlignAbsMiddle: "Abs ઉપર",
+DlgImgAlignBaseline : "આધાર લીટી",
+DlgImgAlignBottom : "નીચે",
+DlgImgAlignMiddle : "વચ્ચે",
+DlgImgAlignRight : "જમણી",
+DlgImgAlignTextTop : "ટેક્સ્ટ ઉપર",
+DlgImgAlignTop : "ઉપર",
+DlgImgPreview : "પૂર્વદર્શન",
+DlgImgAlertUrl : "ચિત્રની URL ટાઇપ કરો",
+DlgImgLinkTab : "લિંક",
+
+// Flash Dialog
+DlgFlashTitle : "ફ્લૅશ ગુણ",
+DlgFlashChkPlay : "ઑટો/સ્વયં પ્લે",
+DlgFlashChkLoop : "લૂપ",
+DlgFlashChkMenu : "ફ્લૅશ મેન્યૂ નો પ્રયોગ કરો",
+DlgFlashScale : "સ્કેલ",
+DlgFlashScaleAll : "સ્કેલ ઓલ/બધુ બતાવો",
+DlgFlashScaleNoBorder : "સ્કેલ બોર્ડર વગર",
+DlgFlashScaleFit : "સ્કેલ એકદમ ફીટ",
+
+// Link Dialog
+DlgLnkWindowTitle : "લિંક",
+DlgLnkInfoTab : "લિંક ઇન્ફૉ ટૅબ",
+DlgLnkTargetTab : "ટાર્ગેટ/લક્ષ્ય ટૅબ",
+
+DlgLnkType : "લિંક પ્રકાર",
+DlgLnkTypeURL : "URL",
+DlgLnkTypeAnchor : "આ પેજનો ઍંકર",
+DlgLnkTypeEMail : "ઈ-મેલ",
+DlgLnkProto : "પ્રોટોકૉલ",
+DlgLnkProtoOther : "<અન્ય>",
+DlgLnkURL : "URL",
+DlgLnkAnchorSel : "ઍંકર પસંદ કરો",
+DlgLnkAnchorByName : "ઍંકર નામથી પસંદ કરો",
+DlgLnkAnchorById : "ઍંકર એલિમન્ટ Id થી પસંદ કરો",
+DlgLnkNoAnchors : "(ડૉક્યુમન્ટમાં ઍંકરની સંખ્યા)",
+DlgLnkEMail : "ઈ-મેલ સરનામું",
+DlgLnkEMailSubject : "ઈ-મેલ વિષય",
+DlgLnkEMailBody : "સંદેશ",
+DlgLnkUpload : "અપલોડ",
+DlgLnkBtnUpload : "આ સર્વરને મોકલવું",
+
+DlgLnkTarget : "ટાર્ગેટ/લક્ષ્ય",
+DlgLnkTargetFrame : "<ફ્રેમ>",
+DlgLnkTargetPopup : "<પૉપ-અપ વિન્ડો>",
+DlgLnkTargetBlank : "નવી વિન્ડો (_blank)",
+DlgLnkTargetParent : "મૂળ વિન્ડો (_parent)",
+DlgLnkTargetSelf : "આજ વિન્ડો (_self)",
+DlgLnkTargetTop : "ઉપરની વિન્ડો (_top)",
+DlgLnkTargetFrameName : "ટાર્ગેટ ફ્રેમ નું નામ",
+DlgLnkPopWinName : "પૉપ-અપ વિન્ડો નું નામ",
+DlgLnkPopWinFeat : "પૉપ-અપ વિન્ડો ફીચરસૅ",
+DlgLnkPopResize : "સાઇઝ બદલી સકાય છે",
+DlgLnkPopLocation : "લોકેશન બાર",
+DlgLnkPopMenu : "મેન્યૂ બાર",
+DlgLnkPopScroll : "સ્ક્રોલ બાર",
+DlgLnkPopStatus : "સ્ટૅટસ બાર",
+DlgLnkPopToolbar : "ટૂલ બાર",
+DlgLnkPopFullScrn : "ફુલ સ્ક્રીન (IE)",
+DlgLnkPopDependent : "ડિપેન્ડન્ટ (Netscape)",
+DlgLnkPopWidth : "પહોળાઈ",
+DlgLnkPopHeight : "ઊંચાઈ",
+DlgLnkPopLeft : "ડાબી બાજુ",
+DlgLnkPopTop : "જમણી બાજુ",
+
+DlnLnkMsgNoUrl : "લિંક URL ટાઇપ કરો",
+DlnLnkMsgNoEMail : "ઈ-મેલ સરનામું ટાઇપ કરો",
+DlnLnkMsgNoAnchor : "ઍંકર પસંદ કરો",
+DlnLnkMsgInvPopName : "પૉપ-અપ વિન્ડો નું નામ ઍલ્ફબેટથી શરૂ કરવો અને તેમાં સ્પેઇસ ન હોવી જોઈએ",
+
+// Color Dialog
+DlgColorTitle : "રંગ પસંદ કરો",
+DlgColorBtnClear : "સાફ કરો",
+DlgColorHighlight : "હાઈલાઇટ",
+DlgColorSelected : "સિલેક્ટેડ/પસંદ કરવું",
+
+// Smiley Dialog
+DlgSmileyTitle : "સ્માઇલી પસંદ કરો",
+
+// Special Character Dialog
+DlgSpecialCharTitle : "સ્પેશિઅલ વિશિષ્ટ અક્ષર પસંદ કરો",
+
+// Table Dialog
+DlgTableTitle : "ટેબલ, કોઠાનું મથાળું",
+DlgTableRows : "પંક્તિના ખાના",
+DlgTableColumns : "કૉલમ/ઊભી કટાર",
+DlgTableBorder : "કોઠાની બાજુ(બોર્ડર) સાઇઝ",
+DlgTableAlign : "અલાઇનમન્ટ/ગોઠવાયેલું ",
+DlgTableAlignNotSet : "<સેટ નથી>",
+DlgTableAlignLeft : "ડાબી બાજુ",
+DlgTableAlignCenter : "મધ્ય સેન્ટર",
+DlgTableAlignRight : "જમણી બાજુ",
+DlgTableWidth : "પહોળાઈ",
+DlgTableWidthPx : "પિકસલ",
+DlgTableWidthPc : "પ્રતિશત",
+DlgTableHeight : "ઊંચાઈ",
+DlgTableCellSpace : "સેલ અંતર",
+DlgTableCellPad : "સેલ પૅડિંગ",
+DlgTableCaption : "મથાળું/કૅપ્શન ",
+DlgTableSummary : "ટૂંકો એહેવાલ",
+
+// Table Cell Dialog
+DlgCellTitle : "પંક્તિના ખાનાના ગુણ",
+DlgCellWidth : "પહોળાઈ",
+DlgCellWidthPx : "પિકસલ",
+DlgCellWidthPc : "પ્રતિશત",
+DlgCellHeight : "ઊંચાઈ",
+DlgCellWordWrap : "વર્ડ રૅપ",
+DlgCellWordWrapNotSet : "<સેટ નથી>",
+DlgCellWordWrapYes : "હા",
+DlgCellWordWrapNo : "ના",
+DlgCellHorAlign : "સમસ્તરીય ગોઠવવું",
+DlgCellHorAlignNotSet : "<સેટ નથી>",
+DlgCellHorAlignLeft : "ડાબી બાજુ",
+DlgCellHorAlignCenter : "મધ્ય સેન્ટર",
+DlgCellHorAlignRight: "જમણી બાજુ",
+DlgCellVerAlign : "લંબરૂપ ગોઠવવું",
+DlgCellVerAlignNotSet : "<સેટ નથી>",
+DlgCellVerAlignTop : "ઉપર",
+DlgCellVerAlignMiddle : "મધ્ય સેન્ટર",
+DlgCellVerAlignBottom : "નીચે",
+DlgCellVerAlignBaseline : "મૂળ રેખા",
+DlgCellRowSpan : "પંક્તિ સ્પાન",
+DlgCellCollSpan : "કૉલમ/ઊભી કટાર સ્પાન",
+DlgCellBackColor : "બૅકગ્રાઉન્ડ રંગ",
+DlgCellBorderColor : "બોર્ડરનો રંગ",
+DlgCellBtnSelect : "પસંદ કરો...",
+
+// Find and Replace Dialog
+DlgFindAndReplaceTitle : "શોધવું અને બદલવું",
+
+// Find Dialog
+DlgFindTitle : "શોધવું",
+DlgFindFindBtn : "શોધવું",
+DlgFindNotFoundMsg : "તમે શોધેલી ટેક્સ્ટ નથી મળી",
+
+// Replace Dialog
+DlgReplaceTitle : "બદલવું",
+DlgReplaceFindLbl : "આ શોધો",
+DlgReplaceReplaceLbl : "આનાથી બદલો",
+DlgReplaceCaseChk : "કેસ સરખા રાખો",
+DlgReplaceReplaceBtn : "બદલવું",
+DlgReplaceReplAllBtn : "બઘા બદલી ",
+DlgReplaceWordChk : "બઘા શબ્દ સરખા રાખો",
+
+// Paste Operations / Dialog
+PasteErrorCut : "તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસ કટ કરવાની પરવાનગી નથી આપતી. (Ctrl+X) નો ઉપયોગ કરો.",
+PasteErrorCopy : "તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસ કોપી કરવાની પરવાનગી નથી આપતી. (Ctrl+C) का प्रयोग करें।",
+
+PasteAsText : "પેસ્ટ (ટેક્સ્ટ)",
+PasteFromWord : "પેસ્ટ (વર્ડ થી)",
+
+DlgPasteMsg2 : "Ctrl+V નો પ્રયોગ કરી પેસ્ટ કરો",
+DlgPasteSec : "તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસના કારણે,એડિટર તમારા કિલ્પબોર્ડ ડેટા ને કોપી નથી કરી શકતો. તમારે આ વિન્ડોમાં ફરીથી પેસ્ટ કરવું પડશે.",
+DlgPasteIgnoreFont : "ફૉન્ટફેસ વ્યાખ્યાની અવગણના",
+DlgPasteRemoveStyles : "સ્ટાઇલ વ્યાખ્યા કાઢી નાખવી",
+
+// Color Picker
+ColorAutomatic : "સ્વચાલિત",
+ColorMoreColors : "ઔર રંગ...",
+
+// Document Properties
+DocProps : "ડૉક્યુમન્ટ ગુણ/પ્રૉપર્ટિઝ",
+
+// Anchor Dialog
+DlgAnchorTitle : "ઍંકર ગુણ/પ્રૉપર્ટિઝ",
+DlgAnchorName : "ઍંકરનું નામ",
+DlgAnchorErrorName : "ઍંકરનું નામ ટાઈપ કરો",
+
+// Speller Pages Dialog
+DlgSpellNotInDic : "શબ્દકોશમાં નથી",
+DlgSpellChangeTo : "આનાથી બદલવું",
+DlgSpellBtnIgnore : "ઇગ્નોર/અવગણના કરવી",
+DlgSpellBtnIgnoreAll : "બધાની ઇગ્નોર/અવગણના કરવી",
+DlgSpellBtnReplace : "બદલવું",
+DlgSpellBtnReplaceAll : "બધા બદલી કરો",
+DlgSpellBtnUndo : "અન્ડૂ",
+DlgSpellNoSuggestions : "- કઇ સજેશન નથી -",
+DlgSpellProgress : "શબ્દની જોડણી/સ્પેલ ચેક ચાલુ છે...",
+DlgSpellNoMispell : "શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: ખોટી જોડણી મળી નથી",
+DlgSpellNoChanges : "શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: એકપણ શબ્દ બદલયો નથી",
+DlgSpellOneChange : "શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: એક શબ્દ બદલયો છે",
+DlgSpellManyChanges : "શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: %1 શબ્દ બદલયા છે",
+
+IeSpellDownload : "સ્પેલ-ચેકર ઇન્સ્ટોલ નથી. શું તમે ડાઉનલોડ કરવા માંગો છો?",
+
+// Button Dialog
+DlgButtonText : "ટેક્સ્ટ (વૅલ્યૂ)",
+DlgButtonType : "પ્રકાર",
+DlgButtonTypeBtn : "બટન",
+DlgButtonTypeSbm : "સબ્મિટ",
+DlgButtonTypeRst : "રિસેટ",
+
+// Checkbox and Radio Button Dialogs
+DlgCheckboxName : "નામ",
+DlgCheckboxValue : "વૅલ્યૂ",
+DlgCheckboxSelected : "સિલેક્ટેડ",
+
+// Form Dialog
+DlgFormName : "નામ",
+DlgFormAction : "ક્રિયા",
+DlgFormMethod : "પદ્ધતિ",
+
+// Select Field Dialog
+DlgSelectName : "નામ",
+DlgSelectValue : "વૅલ્યૂ",
+DlgSelectSize : "સાઇઝ",
+DlgSelectLines : "લીટીઓ",
+DlgSelectChkMulti : "એકથી વધારે પસંદ કરી શકો",
+DlgSelectOpAvail : "ઉપલબ્ધ વિકલ્પ",
+DlgSelectOpText : "ટેક્સ્ટ",
+DlgSelectOpValue : "વૅલ્યૂ",
+DlgSelectBtnAdd : "ઉમેરવું",
+DlgSelectBtnModify : "બદલવું",
+DlgSelectBtnUp : "ઉપર",
+DlgSelectBtnDown : "નીચે",
+DlgSelectBtnSetValue : "પસંદ કરલી વૅલ્યૂ સેટ કરો",
+DlgSelectBtnDelete : "રદ કરવું",
+
+// Textarea Dialog
+DlgTextareaName : "નામ",
+DlgTextareaCols : "કૉલમ/ઊભી કટાર",
+DlgTextareaRows : "પંક્તિઓ",
+
+// Text Field Dialog
+DlgTextName : "નામ",
+DlgTextValue : "વૅલ્યૂ",
+DlgTextCharWidth : "કેરેક્ટરની પહોળાઈ",
+DlgTextMaxChars : "અધિકતમ કેરેક્ટર",
+DlgTextType : "ટાઇપ",
+DlgTextTypeText : "ટેક્સ્ટ",
+DlgTextTypePass : "પાસવર્ડ",
+
+// Hidden Field Dialog
+DlgHiddenName : "નામ",
+DlgHiddenValue : "વૅલ્યૂ",
+
+// Bulleted List Dialog
+BulletedListProp : "બુલેટ સૂચિ ગુણ",
+NumberedListProp : "સંખ્યાંક્તિ સૂચિ ગુણ",
+DlgLstStart : "શરૂઆતથી",
+DlgLstType : "પ્રકાર",
+DlgLstTypeCircle : "વર્તુળ",
+DlgLstTypeDisc : "ડિસ્ક",
+DlgLstTypeSquare : "ચોરસ",
+DlgLstTypeNumbers : "સંખ્યા (1, 2, 3)",
+DlgLstTypeLCase : "નાના અક્ષર (a, b, c)",
+DlgLstTypeUCase : "મોટા અક્ષર (A, B, C)",
+DlgLstTypeSRoman : "નાના રોમન આંક (i, ii, iii)",
+DlgLstTypeLRoman : "મોટા રોમન આંક (I, II, III)",
+
+// Document Properties Dialog
+DlgDocGeneralTab : "સાધારણ",
+DlgDocBackTab : "બૅકગ્રાઉન્ડ",
+DlgDocColorsTab : "રંગ અને માર્જિન/કિનાર",
+DlgDocMetaTab : "મેટાડૅટા",
+
+DlgDocPageTitle : "પેજ મથાળું/ટાઇટલ",
+DlgDocLangDir : "ભાષા લેખવાની પદ્ધતિ",
+DlgDocLangDirLTR : "ડાબે થી જમણે (LTR)",
+DlgDocLangDirRTL : "જમણે થી ડાબે (RTL)",
+DlgDocLangCode : "ભાષા કોડ",
+DlgDocCharSet : "કેરેક્ટર સેટ એન્કોડિંગ",
+DlgDocCharSetCE : "મધ્ય યુરોપિઅન (Central European)",
+DlgDocCharSetCT : "ચાઇનીઝ (Chinese Traditional Big5)",
+DlgDocCharSetCR : "સિરીલિક (Cyrillic)",
+DlgDocCharSetGR : "ગ્રીક (Greek)",
+DlgDocCharSetJP : "જાપાનિઝ (Japanese)",
+DlgDocCharSetKR : "કોરીયન (Korean)",
+DlgDocCharSetTR : "ટર્કિ (Turkish)",
+DlgDocCharSetUN : "યૂનિકોડ (UTF-8)",
+DlgDocCharSetWE : "પશ્ચિમ યુરોપિઅન (Western European)",
+DlgDocCharSetOther : "અન્ય કેરેક્ટર સેટ એન્કોડિંગ",
+
+DlgDocDocType : "ડૉક્યુમન્ટ પ્રકાર શીર્ષક",
+DlgDocDocTypeOther : "અન્ય ડૉક્યુમન્ટ પ્રકાર શીર્ષક",
+DlgDocIncXHTML : "XHTML સૂચના સમાવિષ્ટ કરવી",
+DlgDocBgColor : "બૅકગ્રાઉન્ડ રંગ",
+DlgDocBgImage : "બૅકગ્રાઉન્ડ ચિત્ર URL",
+DlgDocBgNoScroll : "સ્ક્રોલ ન થાય તેવું બૅકગ્રાઉન્ડ",
+DlgDocCText : "ટેક્સ્ટ",
+DlgDocCLink : "લિંક",
+DlgDocCVisited : "વિઝિટેડ લિંક",
+DlgDocCActive : "સક્રિય લિંક",
+DlgDocMargins : "પેજ માર્જિન",
+DlgDocMaTop : "ઉપર",
+DlgDocMaLeft : "ડાબી",
+DlgDocMaRight : "જમણી",
+DlgDocMaBottom : "નીચે",
+DlgDocMeIndex : "ડૉક્યુમન્ટ ઇન્ડેક્સ સંકેતશબ્દ (અલ્પવિરામ (,) થી અલગ કરો)",
+DlgDocMeDescr : "ડૉક્યુમન્ટ વર્ણન",
+DlgDocMeAuthor : "લેખક",
+DlgDocMeCopy : "કૉપિરાઇટ",
+DlgDocPreview : "પૂર્વદર્શન",
+
+// Templates Dialog
+Templates : "ટેમ્પ્લેટ",
+DlgTemplatesTitle : "કન્ટેન્ટ ટેમ્પ્લેટ",
+DlgTemplatesSelMsg : "એડિટરમાં ઓપન કરવા ટેમ્પ્લેટ પસંદ કરો (વર્તમાન કન્ટેન્ટ સેવ નહીં થાય):",
+DlgTemplatesLoading : "ટેમ્પ્લેટ સૂચિ લોડ થાય છે. રાહ જુઓ...",
+DlgTemplatesNoTpl : "(કોઈ ટેમ્પ્લેટ ડિફાઇન નથી)",
+DlgTemplatesReplace : "મૂળ શબ્દને બદલો",
+
+// About Dialog
+DlgAboutAboutTab : "FCKEditor ના વિષે",
+DlgAboutBrowserInfoTab : "બ્રાઉઝર ના વિષે",
+DlgAboutLicenseTab : "લાઇસન્સ",
+DlgAboutVersion : "વર્ઝન",
+DlgAboutInfo : "વધારે માહિતી માટે:",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
+};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/he.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/he.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/he.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "קישור",
InsertLink : "הוספת/עריכת קישור",
RemoveLink : "הסרת הקישור",
+VisitLink : "פתח קישור",
Anchor : "הוספת/עריכת נקודת עיגון",
AnchorDelete : "הסר נקודת עיגון",
InsertImageLbl : "תמונה",
@@ -72,6 +73,9 @@
DecreaseIndent : "הקטנת אינדנטציה",
IncreaseIndent : "הגדלת אינדנטציה",
Blockquote : "בלוק ציטוט",
+CreateDiv : "צור מיכל(תג)DIV",
+EditDiv : "ערוך מיכל (תג)DIV",
+DeleteDiv : "הסר מיכל(תג) DIV",
Undo : "ביטול צעד אחרון",
Redo : "חזרה על צעד אחרון",
NumberedListLbl : "רשימה ממוספרת",
@@ -157,6 +161,7 @@
NoActiveX : "הגדרות אבטחה של הדפדפן עלולות לגביל את אפשרויות העריכה.יש לאפשר את האופציה \"הרץ פקדים פעילים ותוספות\". תוכל לחוות טעויות וחיווים של אפשרויות שחסרים.",
BrowseServerBlocked : "לא ניתן לגשת לדפדפן משאבים.אנא וודא שחוסם חלונות הקופצים לא פעיל.",
DialogBlocked : "לא היה ניתן לפתוח חלון דיאלוג. אנא וודא שחוסם חלונות קופצים לא פעיל.",
+VisitLinkBlocked : "לא ניתן לפתוח חלון חדש.נא לוודא שחוסמי החלונות הקופצים לא פעילים.",
// Dialogs
DlgBtnOK : "אישור",
@@ -166,7 +171,7 @@
DlgAdvancedTag : "אפשרויות מתקדמות",
DlgOpOther : "<אחר>",
DlgInfoTab : "מידע",
-DlgAlertUrl : "אנה הזן URL",
+DlgAlertUrl : "אנא הזן URL",
// General Dialogs Labels
DlgGenNotSet : "<לא נקבע>",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "גירסת דפדפן",
DlgAboutLicenseTab : "רשיון",
DlgAboutVersion : "גירסא",
-DlgAboutInfo : "מידע נוסף ניתן למצוא כאן:"
+DlgAboutInfo : "מידע נוסף ניתן למצוא כאן:",
+
+// Div Dialog
+DlgDivGeneralTab : "כללי",
+DlgDivAdvancedTab : "מתקדם",
+DlgDivStyle : "סגנון",
+DlgDivInlineStyle : "סגנון בתוך השורה"
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/hi.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/hi.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/hi.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "लिंक",
InsertLink : "लिंक इन्सर्ट/संपादन",
RemoveLink : "लिंक हटायें",
+VisitLink : "लिंक खोलें",
Anchor : "ऐंकर इन्सर्ट/संपादन",
AnchorDelete : "ऐंकर हटायें",
InsertImageLbl : "तस्वीर",
@@ -72,6 +73,9 @@
DecreaseIndent : "इन्डॅन्ट कम करें",
IncreaseIndent : "इन्डॅन्ट बढ़ायें",
Blockquote : "ब्लॉक-कोट",
+CreateDiv : "डिव (Div) कन्टेनर बनायें",
+EditDiv : "डिव (Div) कन्टेनर बदलें",
+DeleteDiv : "डिव कन्टेनर हटायें",
Undo : "अन्डू",
Redo : "रीडू",
NumberedListLbl : "अंकीय सूची",
@@ -155,8 +159,9 @@
NotImplemented : "कमान्ड इम्प्लीमॅन्ट नहीं किया गया है",
UnknownToolbarSet : "टूलबार सॅट \"%1\" उपलब्ध नहीं है",
NoActiveX : "आपके ब्राउज़र् की सुरक्शा सेटिंग्स् एडिटर की कुछ् फ़ीचरों को सीमित कर् सकती हैं। क्रिपया \"Run ActiveX controls and plug-ins\" विकल्प को एनेबल करें. आपको एरर्स् और गायब फ़ीचर्स् का अनुभव हो सकता है।",
-BrowseServerBlocked : "रिसोर्सेज़ ब्राउज़र् नहीं खोला जा सका। क्रिपया सभी पॉप्-अप् ब्लॉकर्स् को डिसेबल करें।",
-DialogBlocked : "डायलग विन्डो नहीं खोला जा सका। क्रिपया सभी पॉप्-अप् ब्लॉकर्स् को डिसेबल करें।",
+BrowseServerBlocked : "रिसोर्सेज़ ब्राउज़र् नहीं खोला जा सका। क्रिपया सभी पॉप्-अप् ब्लॉकर्स् को निष्क्रिय करें।",
+DialogBlocked : "डायलग विन्डो नहीं खोला जा सका। क्रिपया सभी पॉप्-अप् ब्लॉकर्स् को निष्क्रिय करें।",
+VisitLinkBlocked : "नया विन्डो नहीं खोला जा सका। क्रिपया सभी पॉप्-अप् ब्लॉकर्स् को निष्क्रिय करें।",
// Dialogs
DlgBtnOK : "ठीक है",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "ब्राउज़र के बारे में",
DlgAboutLicenseTab : "लाइसैन्स",
DlgAboutVersion : "वर्ज़न",
-DlgAboutInfo : "अधिक जानकारी के लिये यहाँ जायें:"
+DlgAboutInfo : "अधिक जानकारी के लिये यहाँ जायें:",
+
+// Div Dialog
+DlgDivGeneralTab : "सामान्य",
+DlgDivAdvancedTab : "एड्वान्स्ड",
+DlgDivStyle : "स्टाइल",
+DlgDivInlineStyle : "इनलाइन स्टाइल"
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/hr.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/hr.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/hr.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Link",
InsertLink : "Ubaci/promijeni link",
RemoveLink : "Ukloni link",
+VisitLink : "Otvori link",
Anchor : "Ubaci/promijeni sidro",
AnchorDelete : "Ukloni sidro",
InsertImageLbl : "Slika",
@@ -72,6 +73,9 @@
DecreaseIndent : "Pomakni ulijevo",
IncreaseIndent : "Pomakni udesno",
Blockquote : "Blockquote",
+CreateDiv : "Napravi Div kontejner",
+EditDiv : "Uredi Div kontejner",
+DeleteDiv : "Ukloni Div kontejner",
Undo : "Poništi",
Redo : "Ponovi",
NumberedListLbl : "Brojčana lista",
@@ -157,6 +161,7 @@
NoActiveX : "Vaše postavke pretraživača mogle bi ograničiti neke od mogućnosti editora. Morate uključiti opciju \"Run ActiveX controls and plug-ins\" u postavkama. Ukoliko to ne učinite, moguće su razliite greške tijekom rada.",
BrowseServerBlocked : "Pretraivač nije moguće otvoriti. Provjerite da li je uključeno blokiranje pop-up prozora.",
DialogBlocked : "Nije moguće otvoriti novi prozor. Provjerite da li je uključeno blokiranje pop-up prozora.",
+VisitLinkBlocked : "Nije moguće otvoriti novi prozor. Provjerite da li je uključeno blokiranje pop-up prozora.",
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Podaci o pretraživaču",
DlgAboutLicenseTab : "Licenca",
DlgAboutVersion : "inačica",
-DlgAboutInfo : "Za više informacija posjetite"
+DlgAboutInfo : "Za više informacija posjetite",
+
+// Div Dialog
+DlgDivGeneralTab : "Općenito",
+DlgDivAdvancedTab : "Napredno",
+DlgDivStyle : "Stil",
+DlgDivInlineStyle : "Stil u redu"
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/hu.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/hu.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/hu.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Hivatkozás",
InsertLink : "Hivatkozás beillesztése/módosítása",
RemoveLink : "Hivatkozás törlése",
+VisitLink : "Open Link", //MISSING
Anchor : "Horgony beillesztése/szerkesztése",
AnchorDelete : "Horgony eltávolítása",
InsertImageLbl : "Kép",
@@ -72,6 +73,9 @@
DecreaseIndent : "Behúzás csökkentése",
IncreaseIndent : "Behúzás növelése",
Blockquote : "Idézet blokk",
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Visszavonás",
Redo : "Ismétlés",
NumberedListLbl : "Számozás",
@@ -157,6 +161,7 @@
NoActiveX : "A böngésző biztonsági beállításai korlátozzák a szerkesztő lehetőségeit. Engedélyezni kell ezt az opciót: \"Run ActiveX controls and plug-ins\". Ettől függetlenül előfordulhatnak hibaüzenetek ill. bizonyos funkciók hiányozhatnak.",
BrowseServerBlocked : "Nem lehet megnyitni a fájlböngészőt. Bizonyosodjon meg róla, hogy a felbukkanó ablakok engedélyezve vannak.",
DialogBlocked : "Nem lehet megnyitni a párbeszédablakot. Bizonyosodjon meg róla, hogy a felbukkanó ablakok engedélyezve vannak.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "Rendben",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Böngésző információ",
DlgAboutLicenseTab : "Licensz",
DlgAboutVersion : "verzió",
-DlgAboutInfo : "További információkért látogasson el ide:"
+DlgAboutInfo : "További információkért látogasson el ide:",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/it.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/it.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/it.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Collegamento",
InsertLink : "Inserisci/Modifica collegamento",
RemoveLink : "Elimina collegamento",
+VisitLink : "Open Link", //MISSING
Anchor : "Inserisci/Modifica Ancora",
AnchorDelete : "Rimuovi Ancora",
InsertImageLbl : "Immagine",
@@ -72,6 +73,9 @@
DecreaseIndent : "Riduci rientro",
IncreaseIndent : "Aumenta rientro",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Annulla",
Redo : "Ripristina",
NumberedListLbl : "Elenco numerato",
@@ -157,6 +161,7 @@
NoActiveX : "Le impostazioni di sicurezza del tuo browser potrebbero limitare alcune funzionalità dell'editor. Devi abilitare l'opzione \"Esegui controlli e plug-in ActiveX\". Potresti avere errori e notare funzionalità mancanti.",
BrowseServerBlocked : "Non è possibile aprire la finestra di espolorazione risorse. Verifica che tutti i blocca popup siano bloccati.",
DialogBlocked : "Non è possibile aprire la finestra di dialogo. Verifica che tutti i blocca popup siano bloccati.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Informazioni Browser",
DlgAboutLicenseTab : "Licenza",
DlgAboutVersion : "versione",
-DlgAboutInfo : "Per maggiori informazioni visitare"
+DlgAboutInfo : "Per maggiori informazioni visitare",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ja.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ja.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ja.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "リンク",
InsertLink : "リンク挿入/編集",
RemoveLink : "リンク削除",
+VisitLink : "リンクを開く",
Anchor : "アンカー挿入/編集",
AnchorDelete : "アンカー削除",
InsertImageLbl : "イメージ",
@@ -72,6 +73,9 @@
DecreaseIndent : "インデント解除",
IncreaseIndent : "インデント",
Blockquote : "ブロック引用",
+CreateDiv : "Div 作成",
+EditDiv : "Div 編集",
+DeleteDiv : "Div 削除",
Undo : "元に戻す",
Redo : "やり直し",
NumberedListLbl : "段落番号",
@@ -157,6 +161,7 @@
NoActiveX : "エラー、警告メッセージなどが発生した場合、ブラウザーのセキュリティ設定によりエディタのいくつかの機能が制限されている可能性があります。セキュリティ設定のオプションで\"ActiveXコントロールとプラグインの実行\"を有効にするにしてください。",
BrowseServerBlocked : "サーバーブラウザーを開くことができませんでした。ポップアップ・ブロック機能が無効になっているか確認してください。",
DialogBlocked : "ダイアログウィンドウを開くことができませんでした。ポップアップ・ブロック機能が無効になっているか確認してください。",
+VisitLinkBlocked : "新しいウィンドウを開くことができませんでした。ポップアップ・ブロック機能が無効になっているか確認してください。",
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "ブラウザ情報",
DlgAboutLicenseTab : "ライセンス",
DlgAboutVersion : "バージョン",
-DlgAboutInfo : "より詳しい情報はこちらで"
+DlgAboutInfo : "より詳しい情報はこちらで",
+
+// Div Dialog
+DlgDivGeneralTab : "全般",
+DlgDivAdvancedTab : "高度な設定",
+DlgDivStyle : "スタイル",
+DlgDivInlineStyle : "インラインスタイル"
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/km.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/km.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/km.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "ឈ្នាប់",
InsertLink : "បន្ថែម/កែប្រែ ឈ្នាប់",
RemoveLink : "លប់ឈ្នាប់",
+VisitLink : "Open Link", //MISSING
Anchor : "បន្ថែម/កែប្រែ យុថ្កា",
AnchorDelete : "Remove Anchor", //MISSING
InsertImageLbl : "រូបភាព",
@@ -72,6 +73,9 @@
DecreaseIndent : "បន្ថយការចូលបន្ទាត់",
IncreaseIndent : "បន្ថែមការចូលបន្ទាត់",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "សារឡើងវិញ",
Redo : "ធ្វើឡើងវិញ",
NumberedListLbl : "បញ្ជីជាអក្សរ",
@@ -157,6 +161,7 @@
NoActiveX : "ការកំណត់សុវត្ថភាពរបស់កម្មវិធីរុករករបស់លោកអ្នក នេះអាចធ្វើអោយលោកអ្នកមិនអាចប្រើមុខងារខ្លះរបស់កម្មវិធីតាក់តែងអត្ថបទនេះ ។ លោកអ្នកត្រូវកំណត់អោយ \"ActiveX និងកម្មវិធីជំនួយក្នុង (plug-ins)\" អោយដំណើរការ ។ លោកអ្នកអាចជួបប្រទះនឹង បញ្ហា ព្រមជាមួយនឹងការបាត់បង់មុខងារណាមួយរបស់កម្មវិធីតាក់តែងអត្ថបទនេះ ។",
BrowseServerBlocked : "The resources browser could not be opened. Make sure that all popup blockers are disabled.", //MISSING
DialogBlocked : "វីនដូវមិនអាចបើកបានទេ ។ សូមពិនិត្យចំពោះកម្មវិធីបិទ វីនដូវលោត (popup) ថាតើវាដំណើរការរឺទេ ។",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "យល់ព្រម",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "ព៌តមានកម្មវិធីរុករក",
DlgAboutLicenseTab : "License", //MISSING
DlgAboutVersion : "ជំនាន់",
-DlgAboutInfo : "សំរាប់ព៌តមានផ្សេងទៀត សូមទាក់ទង"
+DlgAboutInfo : "សំរាប់ព៌តមានផ្សេងទៀត សូមទាក់ទង",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ko.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ko.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ko.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "링크",
InsertLink : "링크 삽입/변경",
RemoveLink : "링크 삭제",
+VisitLink : "Open Link", //MISSING
Anchor : "책갈피 삽입/변경",
AnchorDelete : "Remove Anchor", //MISSING
InsertImageLbl : "이미지",
@@ -72,6 +73,9 @@
DecreaseIndent : "내어쓰기",
IncreaseIndent : "들여쓰기",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "취소",
Redo : "재실행",
NumberedListLbl : "순서있는 목록",
@@ -157,6 +161,7 @@
NoActiveX : "브러우저의 보안 설정으로 인해 몇몇 기능의 작동에 장애가 있을 수 있습니다. \"액티브-액스 기능과 플러그 인\" 옵션을 허용하여 주시지 않으면 오류가 발생할 수 있습니다.",
BrowseServerBlocked : "브러우저 요소가 열리지 않습니다. 팝업차단 설정이 꺼져있는지 확인하여 주십시오.",
DialogBlocked : "윈도우 대화창을 열 수 없습니다. 팝업차단 설정이 꺼져있는지 확인하여 주십시오.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "예",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "브라우저 정보",
DlgAboutLicenseTab : "License", //MISSING
DlgAboutVersion : "버전",
-DlgAboutInfo : "더 많은 정보를 보시려면 다음 사이트로 가십시오."
+DlgAboutInfo : "더 많은 정보를 보시려면 다음 사이트로 가십시오.",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/lt.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/lt.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/lt.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Nuoroda",
InsertLink : "Įterpti/taisyti nuorodą",
RemoveLink : "Panaikinti nuorodą",
+VisitLink : "Open Link", //MISSING
Anchor : "Įterpti/modifikuoti žymę",
AnchorDelete : "Remove Anchor", //MISSING
InsertImageLbl : "Vaizdas",
@@ -72,6 +73,9 @@
DecreaseIndent : "Sumažinti įtrauką",
IncreaseIndent : "Padidinti įtrauką",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Atšaukti",
Redo : "Atstatyti",
NumberedListLbl : "Numeruotas sąrašas",
@@ -157,6 +161,7 @@
NoActiveX : "Jūsų naršyklės saugumo nuostatos gali riboti kai kurias redaktoriaus savybes. Jūs turite aktyvuoti opciją \"Run ActiveX controls and plug-ins\". Kitu atveju Jums bus pranešama apie klaidas ir trūkstamas savybes.",
BrowseServerBlocked : "Neįmanoma atidaryti naujo naršyklės lango. Įsitikinkite, kad iškylančių langų blokavimo programos neveiksnios.",
DialogBlocked : "Neįmanoma atidaryti dialogo lango. Įsitikinkite, kad iškylančių langų blokavimo programos neveiksnios.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Naršyklės informacija",
DlgAboutLicenseTab : "License", //MISSING
DlgAboutVersion : "versija",
-DlgAboutInfo : "Papildomą informaciją galima gauti"
+DlgAboutInfo : "Papildomą informaciją galima gauti",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/lv.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/lv.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/lv.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Hipersaite",
InsertLink : "Ievietot/Labot hipersaiti",
RemoveLink : "Noņemt hipersaiti",
+VisitLink : "Open Link", //MISSING
Anchor : "Ievietot/Labot iezīmi",
AnchorDelete : "Remove Anchor", //MISSING
InsertImageLbl : "Attēls",
@@ -72,6 +73,9 @@
DecreaseIndent : "Samazināt atkāpi",
IncreaseIndent : "Palielināt atkāpi",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Atcelt",
Redo : "Atkārtot",
NumberedListLbl : "Numurēts saraksts",
@@ -157,6 +161,7 @@
NoActiveX : "Interneta pārlūkprogrammas drošības uzstādījumi varētu ietekmēt dažas no redaktora īpašībām. Jābūt aktivizētai sadaļai \"Run ActiveX controls and plug-ins\". Savādāk ir iespējamas kļūdas darbībā un kļūdu paziņojumu parādīšanās.",
BrowseServerBlocked : "Resursu pārlūks nevar tikt atvērts. Pārliecinieties, ka uznirstošo logu bloķētāji ir atslēgti.",
DialogBlocked : "Nav iespējams atvērt dialoglogu. Pārliecinieties, ka uznirstošo logu bloķētāji ir atslēgti.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "Darīts!",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Informācija par pārlūkprogrammu",
DlgAboutLicenseTab : "Licence",
DlgAboutVersion : "versija",
-DlgAboutInfo : "Papildus informācija ir pieejama"
+DlgAboutInfo : "Papildus informācija ir pieejama",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/mn.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/mn.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/mn.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Линк",
InsertLink : "Линк Оруулах/Засварлах",
RemoveLink : "Линк авч хаях",
+VisitLink : "Open Link", //MISSING
Anchor : "Холбоос Оруулах/Засварлах",
AnchorDelete : "Холбоос Авах",
InsertImageLbl : "Зураг",
@@ -72,6 +73,9 @@
DecreaseIndent : "Догол мөр нэмэх",
IncreaseIndent : "Догол мөр хасах",
Blockquote : "Хайрцаглах",
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Хүчингүй болгох",
Redo : "Өмнөх үйлдлээ сэргээх",
NumberedListLbl : "Дугаарлагдсан жагсаалт",
@@ -157,6 +161,7 @@
NoActiveX : "Таны үзүүлэгч/browser-н хамгаалалтын тохиргоо editor-н зарим боломжийг хязгаарлаж байна. Та \"Run ActiveX controls ба plug-ins\" сонголыг идвэхитэй болго.",
BrowseServerBlocked : "Нөөц үзүүгч нээж чадсангүй. Бүх popup blocker-г disabled болгоно уу.",
DialogBlocked : "Харилцах цонхонд энийг нээхэд боломжгүй ээ. Бүх popup blocker-г disabled болгоно уу.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Мэдээлэл үзүүлэгч",
DlgAboutLicenseTab : "Лиценз",
DlgAboutVersion : "Хувилбар",
-DlgAboutInfo : "Мэдээллээр туслах"
+DlgAboutInfo : "Мэдээллээр туслах",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ms.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ms.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ms.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Sambungan",
InsertLink : "Masukkan/Sunting Sambungan",
RemoveLink : "Buang Sambungan",
+VisitLink : "Open Link", //MISSING
Anchor : "Masukkan/Sunting Pautan",
AnchorDelete : "Remove Anchor", //MISSING
InsertImageLbl : "Gambar",
@@ -72,6 +73,9 @@
DecreaseIndent : "Kurangkan Inden",
IncreaseIndent : "Tambahkan Inden",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Batalkan",
Redo : "Ulangkan",
NumberedListLbl : "Senarai bernombor",
@@ -157,6 +161,7 @@
NoActiveX : "Your browser's security settings could limit some features of the editor. You must enable the option \"Run ActiveX controls and plug-ins\". You may experience errors and notice missing features.", //MISSING
BrowseServerBlocked : "The resources browser could not be opened. Make sure that all popup blockers are disabled.", //MISSING
DialogBlocked : "It was not possible to open the dialog window. Make sure all popup blockers are disabled.", //MISSING
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Maklumat Perisian Browser",
DlgAboutLicenseTab : "License", //MISSING
DlgAboutVersion : "versi",
-DlgAboutInfo : "Untuk maklumat lanjut sila pergi ke"
+DlgAboutInfo : "Untuk maklumat lanjut sila pergi ke",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/nb.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/nb.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/nb.js Thu Aug 28 18:47:59 2008
@@ -44,8 +44,9 @@
InsertLinkLbl : "Lenke",
InsertLink : "Sett inn/Rediger lenke",
RemoveLink : "Fjern lenke",
+VisitLink : "Åpne lenke",
Anchor : "Sett inn/Rediger anker",
-AnchorDelete : "Remove Anchor", //MISSING
+AnchorDelete : "Fjern anker",
InsertImageLbl : "Bilde",
InsertImage : "Sett inn/Rediger bilde",
InsertFlashLbl : "Flash",
@@ -72,10 +73,13 @@
DecreaseIndent : "Senk nivå",
IncreaseIndent : "Øk nivå",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Angre",
Redo : "Gjør om",
-NumberedListLbl : "Numrert liste",
-NumberedList : "Sett inn/Fjern numrert liste",
+NumberedListLbl : "Nummerert liste",
+NumberedList : "Sett inn/Fjern nummerert liste",
BulletedListLbl : "Uordnet liste",
BulletedList : "Sett inn/Fjern uordnet liste",
ShowTableBorders : "Vis tabellrammer",
@@ -87,7 +91,7 @@
TextColor : "Tekstfarge",
BGColor : "Bakgrunnsfarge",
Source : "Kilde",
-Find : "Finn",
+Find : "Søk",
Replace : "Erstatt",
SpellCheck : "Stavekontroll",
UniversalKeyboard : "Universelt tastatur",
@@ -95,13 +99,13 @@
PageBreak : "Sett inn sideskift",
Form : "Skjema",
-Checkbox : "Sjekkboks",
-RadioButton : "Radioknapp",
-TextField : "Tekstfelt",
+Checkbox : "Avmerkingsboks",
+RadioButton : "Alternativknapp",
+TextField : "Tekstboks",
Textarea : "Tekstområde",
HiddenField : "Skjult felt",
Button : "Knapp",
-SelectionField : "Dropdown meny",
+SelectionField : "Rullegardinliste",
ImageButton : "Bildeknapp",
FitWindow : "Maksimer størrelsen på redigeringsverktøyet",
@@ -112,51 +116,52 @@
CellCM : "Celle",
RowCM : "Rader",
ColumnCM : "Kolonne",
-InsertRowAfter : "Insert Row After", //MISSING
-InsertRowBefore : "Insert Row Before", //MISSING
+InsertRowAfter : "Sett inn rad etter",
+InsertRowBefore : "Sett inn rad før",
DeleteRows : "Slett rader",
-InsertColumnAfter : "Insert Column After", //MISSING
-InsertColumnBefore : "Insert Column Before", //MISSING
+InsertColumnAfter : "Sett inn kolonne etter",
+InsertColumnBefore : "Sett inn kolonne før",
DeleteColumns : "Slett kolonner",
-InsertCellAfter : "Insert Cell After", //MISSING
-InsertCellBefore : "Insert Cell Before", //MISSING
+InsertCellAfter : "Sett inn celle etter",
+InsertCellBefore : "Sett inn celle før",
DeleteCells : "Slett celler",
MergeCells : "Slå sammen celler",
-MergeRight : "Merge Right", //MISSING
-MergeDown : "Merge Down", //MISSING
-HorizontalSplitCell : "Split Cell Horizontally", //MISSING
-VerticalSplitCell : "Split Cell Vertically", //MISSING
+MergeRight : "Slå sammen høyre",
+MergeDown : "Slå sammen ned",
+HorizontalSplitCell : "Del celle horisontalt",
+VerticalSplitCell : "Del celle vertikalt",
TableDelete : "Slett tabell",
-CellProperties : "Celleegenskaper",
-TableProperties : "Tabellegenskaper",
-ImageProperties : "Bildeegenskaper",
-FlashProperties : "Flash Egenskaper",
-
-AnchorProp : "Ankeregenskaper",
-ButtonProp : "Knappegenskaper",
-CheckboxProp : "Sjekkboksegenskaper",
-HiddenFieldProp : "Skjult felt egenskaper",
-RadioButtonProp : "Radioknappegenskaper",
-ImageButtonProp : "Bildeknappegenskaper",
-TextFieldProp : "Tekstfeltegenskaper",
-SelectionFieldProp : "Dropdown menyegenskaper",
-TextareaProp : "Tekstfeltegenskaper",
-FormProp : "Skjemaegenskaper",
+CellProperties : "Egenskaper for celle",
+TableProperties : "Egenskaper for tabell",
+ImageProperties : "Egenskaper for bilde",
+FlashProperties : "Egenskaper for Flash-objekt",
+
+AnchorProp : "Egenskaper for anker",
+ButtonProp : "Egenskaper for knapp",
+CheckboxProp : "Egenskaper for avmerkingsboks",
+HiddenFieldProp : "Egenskaper for skjult felt",
+RadioButtonProp : "Egenskaper for alternativknapp",
+ImageButtonProp : "Egenskaper for bildeknapp",
+TextFieldProp : "Egenskaper for tekstfelt",
+SelectionFieldProp : "Egenskaper for rullegardinliste",
+TextareaProp : "Egenskaper for tekstområde",
+FormProp : "Egenskaper for skjema",
FontFormats : "Normal;Formatert;Adresse;Tittel 1;Tittel 2;Tittel 3;Tittel 4;Tittel 5;Tittel 6;Normal (DIV)",
// Alerts and Messages
ProcessingXHTML : "Lager XHTML. Vennligst vent...",
Done : "Ferdig",
-PasteWordConfirm : "Teksten du prøver å lime inn ser ut som om den kommer fra word , du bør rense den før du limer inn , vil du gjøre dette?",
-NotCompatiblePaste : "Denne kommandoen er tilgjenglig kun for Internet Explorer version 5.5 eller bedre. Vil du fortsette uten å rense?(Du kan lime inn som ren tekst)",
+PasteWordConfirm : "Teksten du prøver å lime inn ser ut som om den kommer fra Word. Vil du rense den for unødvendig kode før du limer inn?",
+NotCompatiblePaste : "Denne kommandoen er kun tilgjenglig for Internet Explorer versjon 5.5 eller bedre. Vil du fortsette uten å rense? (Du kan lime inn som ren tekst)",
UnknownToolbarItem : "Ukjent menyvalg \"%1\"",
UnknownCommand : "Ukjent kommando \"%1\"",
-NotImplemented : "Kommando ikke ennå implimentert",
+NotImplemented : "Kommando ikke implimentert",
UnknownToolbarSet : "Verktøylinjesett \"%1\" finnes ikke",
-NoActiveX : "Din nettleser's sikkerhetsinstillinger kan begrense noen av funksjonene i redigeringsverktøyet. Du må aktivere \"Kjør ActiveXkontroller og plugins\". Du kan oppleve feil og advarsler om manglende funksjoner",
-BrowseServerBlocked : "Kunne ikke åpne dialogboksen for filarkiv. Pass på at du har slått av popupstoppere.",
-DialogBlocked : "Kunne ikke åpne dialogboksen. Pass på at du har slått av popupstoppere.",
+NoActiveX : "Din nettlesers sikkerhetsinstillinger kan begrense noen av funksjonene i redigeringsverktøyet. Du må aktivere \"Kjør ActiveX-kontroller og plugin-modeller\". Du kan oppleve feil og advarsler om manglende funksjoner",
+BrowseServerBlocked : "Kunne ikke åpne dialogboksen for filarkiv. Sjekk at popup-blokkering er deaktivert.",
+DialogBlocked : "Kunne ikke åpne dialogboksen. Sjekk at popup-blokkering er deaktivert.",
+VisitLinkBlocked : "Kunne ikke åpne et nytt vindu. Sjekk at popup-blokkering er deaktivert.",
// Dialogs
DlgBtnOK : "OK",
@@ -166,7 +171,7 @@
DlgAdvancedTag : "Avansert",
DlgOpOther : "<Annet>",
DlgInfoTab : "Info",
-DlgAlertUrl : "Vennligst skriv inn URL'en",
+DlgAlertUrl : "Vennligst skriv inn URL-en",
// General Dialogs Labels
DlgGenNotSet : "<ikke satt>",
@@ -174,7 +179,7 @@
DlgGenLangDir : "Språkretning",
DlgGenLangDirLtr : "Venstre til høyre (VTH)",
DlgGenLangDirRtl : "Høyre til venstre (HTV)",
-DlgGenLangCode : "Språk kode",
+DlgGenLangCode : "Språkkode",
DlgGenAccessKey : "Aksessknapp",
DlgGenName : "Navn",
DlgGenTabIndex : "Tab Indeks",
@@ -210,18 +215,18 @@
DlgImgAlignTextTop : "Tekst topp",
DlgImgAlignTop : "Topp",
DlgImgPreview : "Forhåndsvis",
-DlgImgAlertUrl : "Vennligst skriv bildeurlen",
+DlgImgAlertUrl : "Vennligst skriv bilde-urlen",
DlgImgLinkTab : "Lenke",
// Flash Dialog
-DlgFlashTitle : "Flash Egenskaper",
-DlgFlashChkPlay : "Auto Spill",
+DlgFlashTitle : "Flash-egenskaper",
+DlgFlashChkPlay : "Autospill",
DlgFlashChkLoop : "Loop",
-DlgFlashChkMenu : "Slå på Flash meny",
+DlgFlashChkMenu : "Slå på Flash-meny",
DlgFlashScale : "Skaler",
DlgFlashScaleAll : "Vis alt",
DlgFlashScaleNoBorder : "Ingen ramme",
-DlgFlashScaleFit : "Skaler til å passeExact Fit",
+DlgFlashScaleFit : "Skaler til å passe",
// Link Dialog
DlgLnkWindowTitle : "Lenke",
@@ -235,7 +240,7 @@
DlgLnkProto : "Protokoll",
DlgLnkProtoOther : "<annet>",
DlgLnkURL : "URL",
-DlgLnkAnchorSel : "Velg ett anker",
+DlgLnkAnchorSel : "Velg et anker",
DlgLnkAnchorByName : "Anker etter navn",
DlgLnkAnchorById : "Element etter ID",
DlgLnkNoAnchors : "(Ingen anker i dokumentet)",
@@ -249,12 +254,12 @@
DlgLnkTargetFrame : "<ramme>",
DlgLnkTargetPopup : "<popup vindu>",
DlgLnkTargetBlank : "Nytt vindu (_blank)",
-DlgLnkTargetParent : "Foreldre vindu (_parent)",
+DlgLnkTargetParent : "Foreldrevindu (_parent)",
DlgLnkTargetSelf : "Samme vindu (_self)",
DlgLnkTargetTop : "Hele vindu (_top)",
DlgLnkTargetFrameName : "Målramme",
-DlgLnkPopWinName : "Popup vindus navn",
-DlgLnkPopWinFeat : "Popup vindus egenskaper",
+DlgLnkPopWinName : "Navn på popup-vindus",
+DlgLnkPopWinFeat : "Egenskaper for popup-vindu",
DlgLnkPopResize : "Endre størrelse",
DlgLnkPopLocation : "Adresselinje",
DlgLnkPopMenu : "Menylinje",
@@ -266,18 +271,18 @@
DlgLnkPopWidth : "Bredde",
DlgLnkPopHeight : "Høyde",
DlgLnkPopLeft : "Venstre posisjon",
-DlgLnkPopTop : "Topp posisjon",
+DlgLnkPopTop : "Topp-posisjon",
DlnLnkMsgNoUrl : "Vennligst skriv inn lenkens url",
DlnLnkMsgNoEMail : "Vennligst skriv inn e-postadressen",
-DlnLnkMsgNoAnchor : "Vennligst velg ett anker",
-DlnLnkMsgInvPopName : "Popup vinduets navn må begynne med en bokstav, og kan ikke inneholde mellomrom",
+DlnLnkMsgNoAnchor : "Vennligst velg et anker",
+DlnLnkMsgInvPopName : "Popup-vinduets navn må begynne med en bokstav, og kan ikke inneholde mellomrom",
// Color Dialog
DlgColorTitle : "Velg farge",
DlgColorBtnClear : "Tøm",
DlgColorHighlight : "Marker",
-DlgColorSelected : "Velg",
+DlgColorSelected : "Valgt",
// Smiley Dialog
DlgSmileyTitle : "Sett inn smil",
@@ -286,7 +291,7 @@
DlgSpecialCharTitle : "Velg spesielt tegn",
// Table Dialog
-DlgTableTitle : "Tabellegenskaper",
+DlgTableTitle : "Egenskaper for tabell",
DlgTableRows : "Rader",
DlgTableColumns : "Kolonner",
DlgTableBorder : "Rammestørrelse",
@@ -299,8 +304,8 @@
DlgTableWidthPx : "piksler",
DlgTableWidthPc : "prosent",
DlgTableHeight : "Høyde",
-DlgTableCellSpace : "Celle marg",
-DlgTableCellPad : "Celle polstring",
+DlgTableCellSpace : "Cellemarg",
+DlgTableCellPad : "Cellepolstring",
DlgTableCaption : "Tittel",
DlgTableSummary : "Sammendrag",
@@ -332,31 +337,31 @@
DlgCellBtnSelect : "Velg...",
// Find and Replace Dialog
-DlgFindAndReplaceTitle : "Find and Replace", //MISSING
+DlgFindAndReplaceTitle : "Søk og erstatt",
// Find Dialog
-DlgFindTitle : "Finn",
-DlgFindFindBtn : "Finn",
-DlgFindNotFoundMsg : "Den spesifiserte teksten ble ikke funnet.",
+DlgFindTitle : "Søk",
+DlgFindFindBtn : "Søk",
+DlgFindNotFoundMsg : "Fant ikke søketeksten.",
// Replace Dialog
DlgReplaceTitle : "Erstatt",
-DlgReplaceFindLbl : "Finn hva:",
+DlgReplaceFindLbl : "Søk etter:",
DlgReplaceReplaceLbl : "Erstatt med:",
-DlgReplaceCaseChk : "Riktig case",
+DlgReplaceCaseChk : "Skill mellom store og små bokstaver",
DlgReplaceReplaceBtn : "Erstatt",
DlgReplaceReplAllBtn : "Erstatt alle",
-DlgReplaceWordChk : "Finn hele ordet",
+DlgReplaceWordChk : "Bare hele ord",
// Paste Operations / Dialog
-PasteErrorCut : "Din nettlesers sikkerhetsinstillinger tillater ikke automatisk klipping av tekst. Vennligst brukt snareveien (Ctrl+X).",
-PasteErrorCopy : "Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst brukt snareveien (Ctrl+C).",
+PasteErrorCut : "Din nettlesers sikkerhetsinstillinger tillater ikke automatisk klipping av tekst. Vennligst bruk snareveien (Ctrl+X).",
+PasteErrorCopy : "Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk snareveien (Ctrl+C).",
PasteAsText : "Lim inn som ren tekst",
-PasteFromWord : "Lim inn fra word",
+PasteFromWord : "Lim inn fra Word",
DlgPasteMsg2 : "Vennligst lim inn i den følgende boksen med tastaturet (<STRONG>Ctrl+V</STRONG>) og trykk <STRONG>OK</STRONG>.",
-DlgPasteSec : "Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.", //MISSING
+DlgPasteSec : "Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du må lime det igjen i dette vinduet.",
DlgPasteIgnoreFont : "Fjern skrifttyper",
DlgPasteRemoveStyles : "Fjern stildefinisjoner",
@@ -380,17 +385,17 @@
DlgSpellBtnReplace : "Erstatt",
DlgSpellBtnReplaceAll : "Erstatt alle",
DlgSpellBtnUndo : "Angre",
-DlgSpellNoSuggestions : "- ingen forslag -",
+DlgSpellNoSuggestions : "- Ingen forslag -",
DlgSpellProgress : "Stavekontroll pågår...",
DlgSpellNoMispell : "Stavekontroll fullført: ingen feilstavinger funnet",
DlgSpellNoChanges : "Stavekontroll fullført: ingen ord endret",
DlgSpellOneChange : "Stavekontroll fullført: Ett ord endret",
DlgSpellManyChanges : "Stavekontroll fullført: %1 ord endret",
-IeSpellDownload : "Stavekontroll ikke installert, vil du laste den ned nå?",
+IeSpellDownload : "Stavekontroll er ikke installert. Vil du laste den ned nå?",
// Button Dialog
-DlgButtonText : "Tekst",
+DlgButtonText : "Tekst (verdi)",
DlgButtonType : "Type",
DlgButtonTypeBtn : "Knapp",
DlgButtonTypeSbm : "Send",
@@ -429,7 +434,7 @@
// Text Field Dialog
DlgTextName : "Navn",
-DlgTextValue : "verdi",
+DlgTextValue : "Verdi",
DlgTextCharWidth : "Tegnbredde",
DlgTextMaxChars : "Maks antall tegn",
DlgTextType : "Type",
@@ -441,24 +446,24 @@
DlgHiddenValue : "Verdi",
// Bulleted List Dialog
-BulletedListProp : "Uordnet listeegenskaper",
-NumberedListProp : "Ordnet listeegenskaper",
+BulletedListProp : "Egenskaper for uordnet liste",
+NumberedListProp : "Egenskaper for ordnet liste",
DlgLstStart : "Start",
DlgLstType : "Type",
DlgLstTypeCircle : "Sirkel",
DlgLstTypeDisc : "Hel sirkel",
DlgLstTypeSquare : "Firkant",
-DlgLstTypeNumbers : "Numre(1, 2, 3)",
+DlgLstTypeNumbers : "Numre (1, 2, 3)",
DlgLstTypeLCase : "Små bokstaver (a, b, c)",
-DlgLstTypeUCase : "Store bokstaver(A, B, C)",
-DlgLstTypeSRoman : "Små romerske tall(i, ii, iii)",
-DlgLstTypeLRoman : "Store romerske tall(I, II, III)",
+DlgLstTypeUCase : "Store bokstaver (A, B, C)",
+DlgLstTypeSRoman : "Små romerske tall (i, ii, iii)",
+DlgLstTypeLRoman : "Store romerske tall (I, II, III)",
// Document Properties Dialog
-DlgDocGeneralTab : "Generalt",
+DlgDocGeneralTab : "Generelt",
DlgDocBackTab : "Bakgrunn",
DlgDocColorsTab : "Farger og marginer",
-DlgDocMetaTab : "Meta Data",
+DlgDocMetaTab : "Meta-data",
DlgDocPageTitle : "Sidetittel",
DlgDocLangDir : "Språkretning",
@@ -473,16 +478,16 @@
DlgDocCharSetJP : "Japansk",
DlgDocCharSetKR : "Koreansk",
DlgDocCharSetTR : "Tyrkisk",
-DlgDocCharSetUN : "Unikode (UTF-8)",
+DlgDocCharSetUN : "Unicode (UTF-8)",
DlgDocCharSetWE : "Vesteuropeisk",
DlgDocCharSetOther : "Annet tegnsett",
DlgDocDocType : "Dokumenttype header",
DlgDocDocTypeOther : "Annet dokumenttype header",
-DlgDocIncXHTML : "Inkulder XHTML deklarasjon",
+DlgDocIncXHTML : "Inkluder XHTML-deklarasjon",
DlgDocBgColor : "Bakgrunnsfarge",
-DlgDocBgImage : "Bakgrunnsbilde url",
-DlgDocBgNoScroll : "Ikke scroll bakgrunnsbilde",
+DlgDocBgImage : "URL for bakgrunnsbilde",
+DlgDocBgNoScroll : "Lås bakgrunnsbilde",
DlgDocCText : "Tekst",
DlgDocCLink : "Link",
DlgDocCVisited : "Besøkt lenke",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Nettleserinfo",
DlgAboutLicenseTab : "Lisens",
DlgAboutVersion : "versjon",
-DlgAboutInfo : "For further information go to" //MISSING
+DlgAboutInfo : "For mer informasjon, se",
+
+// Div Dialog
+DlgDivGeneralTab : "Generelt",
+DlgDivAdvancedTab : "Avansert",
+DlgDivStyle : "Stil",
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/nl.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/nl.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/nl.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Link",
InsertLink : "Link invoegen/wijzigen",
RemoveLink : "Link verwijderen",
+VisitLink : "Link volgen",
Anchor : "Interne link",
AnchorDelete : "Anker verwijderen",
InsertImageLbl : "Afbeelding",
@@ -72,6 +73,9 @@
DecreaseIndent : "Inspringen verkleinen",
IncreaseIndent : "Inspringen vergroten",
Blockquote : "Citaatblok",
+CreateDiv : "DIV aanmaken",
+EditDiv : "DIV wijzigen",
+DeleteDiv : "DIV verwijderen",
Undo : "Ongedaan maken",
Redo : "Opnieuw uitvoeren",
NumberedListLbl : "Genummerde lijst",
@@ -157,6 +161,7 @@
NoActiveX : "De beveilingsinstellingen van je browser zouden sommige functies van de editor kunnen beperken. De optie \"Activeer ActiveX-elementen en plug-ins\" dient ingeschakeld te worden. Het kan zijn dat er nu functies ontbreken of niet werken.",
BrowseServerBlocked : "De bestandsbrowser kon niet geopend worden. Zorg ervoor dat pop-up-blokkeerders uit staan.",
DialogBlocked : "Kan het dialoogvenster niet weergeven. Zorg ervoor dat pop-up-blokkeerders uit staan.",
+VisitLinkBlocked : "Het was niet mogelijk een nieuw venster te openen. Controleer of er geen pop-up-blocker aktief is.",
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Browserinformatie",
DlgAboutLicenseTab : "Licentie",
DlgAboutVersion : "Versie",
-DlgAboutInfo : "Voor meer informatie ga naar "
+DlgAboutInfo : "Voor meer informatie ga naar ",
+
+// Div Dialog
+DlgDivGeneralTab : "Algemeen",
+DlgDivAdvancedTab : "Geavanceerd",
+DlgDivStyle : "Style",
+DlgDivInlineStyle : "Inline Style"
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/no.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/no.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/no.js Thu Aug 28 18:47:59 2008
@@ -44,8 +44,9 @@
InsertLinkLbl : "Lenke",
InsertLink : "Sett inn/Rediger lenke",
RemoveLink : "Fjern lenke",
+VisitLink : "Åpne lenke",
Anchor : "Sett inn/Rediger anker",
-AnchorDelete : "Remove Anchor", //MISSING
+AnchorDelete : "Fjern anker",
InsertImageLbl : "Bilde",
InsertImage : "Sett inn/Rediger bilde",
InsertFlashLbl : "Flash",
@@ -72,10 +73,13 @@
DecreaseIndent : "Senk nivå",
IncreaseIndent : "Øk nivå",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Angre",
Redo : "Gjør om",
-NumberedListLbl : "Numrert liste",
-NumberedList : "Sett inn/Fjern numrert liste",
+NumberedListLbl : "Nummerert liste",
+NumberedList : "Sett inn/Fjern nummerert liste",
BulletedListLbl : "Uordnet liste",
BulletedList : "Sett inn/Fjern uordnet liste",
ShowTableBorders : "Vis tabellrammer",
@@ -87,7 +91,7 @@
TextColor : "Tekstfarge",
BGColor : "Bakgrunnsfarge",
Source : "Kilde",
-Find : "Finn",
+Find : "Søk",
Replace : "Erstatt",
SpellCheck : "Stavekontroll",
UniversalKeyboard : "Universelt tastatur",
@@ -95,13 +99,13 @@
PageBreak : "Sett inn sideskift",
Form : "Skjema",
-Checkbox : "Sjekkboks",
-RadioButton : "Radioknapp",
-TextField : "Tekstfelt",
+Checkbox : "Avmerkingsboks",
+RadioButton : "Alternativknapp",
+TextField : "Tekstboks",
Textarea : "Tekstområde",
HiddenField : "Skjult felt",
Button : "Knapp",
-SelectionField : "Dropdown meny",
+SelectionField : "Rullegardinliste",
ImageButton : "Bildeknapp",
FitWindow : "Maksimer størrelsen på redigeringsverktøyet",
@@ -112,51 +116,52 @@
CellCM : "Celle",
RowCM : "Rader",
ColumnCM : "Kolonne",
-InsertRowAfter : "Insert Row After", //MISSING
-InsertRowBefore : "Insert Row Before", //MISSING
+InsertRowAfter : "Sett inn rad etter",
+InsertRowBefore : "Sett inn rad før",
DeleteRows : "Slett rader",
-InsertColumnAfter : "Insert Column After", //MISSING
-InsertColumnBefore : "Insert Column Before", //MISSING
+InsertColumnAfter : "Sett inn kolonne etter",
+InsertColumnBefore : "Sett inn kolonne før",
DeleteColumns : "Slett kolonner",
-InsertCellAfter : "Insert Cell After", //MISSING
-InsertCellBefore : "Insert Cell Before", //MISSING
+InsertCellAfter : "Sett inn celle etter",
+InsertCellBefore : "Sett inn celle før",
DeleteCells : "Slett celler",
MergeCells : "Slå sammen celler",
-MergeRight : "Merge Right", //MISSING
-MergeDown : "Merge Down", //MISSING
-HorizontalSplitCell : "Split Cell Horizontally", //MISSING
-VerticalSplitCell : "Split Cell Vertically", //MISSING
+MergeRight : "Slå sammen høyre",
+MergeDown : "Slå sammen ned",
+HorizontalSplitCell : "Del celle horisontalt",
+VerticalSplitCell : "Del celle vertikalt",
TableDelete : "Slett tabell",
-CellProperties : "Celleegenskaper",
-TableProperties : "Tabellegenskaper",
-ImageProperties : "Bildeegenskaper",
-FlashProperties : "Flash Egenskaper",
-
-AnchorProp : "Ankeregenskaper",
-ButtonProp : "Knappegenskaper",
-CheckboxProp : "Sjekkboksegenskaper",
-HiddenFieldProp : "Skjult felt egenskaper",
-RadioButtonProp : "Radioknappegenskaper",
-ImageButtonProp : "Bildeknappegenskaper",
-TextFieldProp : "Tekstfeltegenskaper",
-SelectionFieldProp : "Dropdown menyegenskaper",
-TextareaProp : "Tekstfeltegenskaper",
-FormProp : "Skjemaegenskaper",
+CellProperties : "Egenskaper for celle",
+TableProperties : "Egenskaper for tabell",
+ImageProperties : "Egenskaper for bilde",
+FlashProperties : "Egenskaper for Flash-objekt",
+
+AnchorProp : "Egenskaper for anker",
+ButtonProp : "Egenskaper for knapp",
+CheckboxProp : "Egenskaper for avmerkingsboks",
+HiddenFieldProp : "Egenskaper for skjult felt",
+RadioButtonProp : "Egenskaper for alternativknapp",
+ImageButtonProp : "Egenskaper for bildeknapp",
+TextFieldProp : "Egenskaper for tekstfelt",
+SelectionFieldProp : "Egenskaper for rullegardinliste",
+TextareaProp : "Egenskaper for tekstområde",
+FormProp : "Egenskaper for skjema",
FontFormats : "Normal;Formatert;Adresse;Tittel 1;Tittel 2;Tittel 3;Tittel 4;Tittel 5;Tittel 6;Normal (DIV)",
// Alerts and Messages
ProcessingXHTML : "Lager XHTML. Vennligst vent...",
Done : "Ferdig",
-PasteWordConfirm : "Teksten du prøver å lime inn ser ut som om den kommer fra word , du bør rense den før du limer inn , vil du gjøre dette?",
-NotCompatiblePaste : "Denne kommandoen er tilgjenglig kun for Internet Explorer version 5.5 eller bedre. Vil du fortsette uten å rense?(Du kan lime inn som ren tekst)",
+PasteWordConfirm : "Teksten du prøver å lime inn ser ut som om den kommer fra Word. Vil du rense den for unødvendig kode før du limer inn?",
+NotCompatiblePaste : "Denne kommandoen er kun tilgjenglig for Internet Explorer versjon 5.5 eller bedre. Vil du fortsette uten å rense? (Du kan lime inn som ren tekst)",
UnknownToolbarItem : "Ukjent menyvalg \"%1\"",
UnknownCommand : "Ukjent kommando \"%1\"",
-NotImplemented : "Kommando ikke ennå implimentert",
+NotImplemented : "Kommando ikke implimentert",
UnknownToolbarSet : "Verktøylinjesett \"%1\" finnes ikke",
-NoActiveX : "Din nettleser's sikkerhetsinstillinger kan begrense noen av funksjonene i redigeringsverktøyet. Du må aktivere \"Kjør ActiveXkontroller og plugins\". Du kan oppleve feil og advarsler om manglende funksjoner",
-BrowseServerBlocked : "Kunne ikke åpne dialogboksen for filarkiv. Pass på at du har slått av popupstoppere.",
-DialogBlocked : "Kunne ikke åpne dialogboksen. Pass på at du har slått av popupstoppere.",
+NoActiveX : "Din nettlesers sikkerhetsinstillinger kan begrense noen av funksjonene i redigeringsverktøyet. Du må aktivere \"Kjør ActiveX-kontroller og plugin-modeller\". Du kan oppleve feil og advarsler om manglende funksjoner",
+BrowseServerBlocked : "Kunne ikke åpne dialogboksen for filarkiv. Sjekk at popup-blokkering er deaktivert.",
+DialogBlocked : "Kunne ikke åpne dialogboksen. Sjekk at popup-blokkering er deaktivert.",
+VisitLinkBlocked : "Kunne ikke åpne et nytt vindu. Sjekk at popup-blokkering er deaktivert.",
// Dialogs
DlgBtnOK : "OK",
@@ -166,7 +171,7 @@
DlgAdvancedTag : "Avansert",
DlgOpOther : "<Annet>",
DlgInfoTab : "Info",
-DlgAlertUrl : "Vennligst skriv inn URL'en",
+DlgAlertUrl : "Vennligst skriv inn URL-en",
// General Dialogs Labels
DlgGenNotSet : "<ikke satt>",
@@ -174,7 +179,7 @@
DlgGenLangDir : "Språkretning",
DlgGenLangDirLtr : "Venstre til høyre (VTH)",
DlgGenLangDirRtl : "Høyre til venstre (HTV)",
-DlgGenLangCode : "Språk kode",
+DlgGenLangCode : "Språkkode",
DlgGenAccessKey : "Aksessknapp",
DlgGenName : "Navn",
DlgGenTabIndex : "Tab Indeks",
@@ -210,18 +215,18 @@
DlgImgAlignTextTop : "Tekst topp",
DlgImgAlignTop : "Topp",
DlgImgPreview : "Forhåndsvis",
-DlgImgAlertUrl : "Vennligst skriv bildeurlen",
+DlgImgAlertUrl : "Vennligst skriv bilde-urlen",
DlgImgLinkTab : "Lenke",
// Flash Dialog
-DlgFlashTitle : "Flash Egenskaper",
-DlgFlashChkPlay : "Auto Spill",
+DlgFlashTitle : "Flash-egenskaper",
+DlgFlashChkPlay : "Autospill",
DlgFlashChkLoop : "Loop",
-DlgFlashChkMenu : "Slå på Flash meny",
+DlgFlashChkMenu : "Slå på Flash-meny",
DlgFlashScale : "Skaler",
DlgFlashScaleAll : "Vis alt",
DlgFlashScaleNoBorder : "Ingen ramme",
-DlgFlashScaleFit : "Skaler til å passeExact Fit",
+DlgFlashScaleFit : "Skaler til å passe",
// Link Dialog
DlgLnkWindowTitle : "Lenke",
@@ -235,7 +240,7 @@
DlgLnkProto : "Protokoll",
DlgLnkProtoOther : "<annet>",
DlgLnkURL : "URL",
-DlgLnkAnchorSel : "Velg ett anker",
+DlgLnkAnchorSel : "Velg et anker",
DlgLnkAnchorByName : "Anker etter navn",
DlgLnkAnchorById : "Element etter ID",
DlgLnkNoAnchors : "(Ingen anker i dokumentet)",
@@ -249,12 +254,12 @@
DlgLnkTargetFrame : "<ramme>",
DlgLnkTargetPopup : "<popup vindu>",
DlgLnkTargetBlank : "Nytt vindu (_blank)",
-DlgLnkTargetParent : "Foreldre vindu (_parent)",
+DlgLnkTargetParent : "Foreldrevindu (_parent)",
DlgLnkTargetSelf : "Samme vindu (_self)",
DlgLnkTargetTop : "Hele vindu (_top)",
DlgLnkTargetFrameName : "Målramme",
-DlgLnkPopWinName : "Popup vindus navn",
-DlgLnkPopWinFeat : "Popup vindus egenskaper",
+DlgLnkPopWinName : "Navn på popup-vindus",
+DlgLnkPopWinFeat : "Egenskaper for popup-vindu",
DlgLnkPopResize : "Endre størrelse",
DlgLnkPopLocation : "Adresselinje",
DlgLnkPopMenu : "Menylinje",
@@ -266,18 +271,18 @@
DlgLnkPopWidth : "Bredde",
DlgLnkPopHeight : "Høyde",
DlgLnkPopLeft : "Venstre posisjon",
-DlgLnkPopTop : "Topp posisjon",
+DlgLnkPopTop : "Topp-posisjon",
DlnLnkMsgNoUrl : "Vennligst skriv inn lenkens url",
DlnLnkMsgNoEMail : "Vennligst skriv inn e-postadressen",
-DlnLnkMsgNoAnchor : "Vennligst velg ett anker",
-DlnLnkMsgInvPopName : "Popup vinduets navn må begynne med en bokstav, og kan ikke inneholde mellomrom",
+DlnLnkMsgNoAnchor : "Vennligst velg et anker",
+DlnLnkMsgInvPopName : "Popup-vinduets navn må begynne med en bokstav, og kan ikke inneholde mellomrom",
// Color Dialog
DlgColorTitle : "Velg farge",
DlgColorBtnClear : "Tøm",
DlgColorHighlight : "Marker",
-DlgColorSelected : "Velg",
+DlgColorSelected : "Valgt",
// Smiley Dialog
DlgSmileyTitle : "Sett inn smil",
@@ -286,7 +291,7 @@
DlgSpecialCharTitle : "Velg spesielt tegn",
// Table Dialog
-DlgTableTitle : "Tabellegenskaper",
+DlgTableTitle : "Egenskaper for tabell",
DlgTableRows : "Rader",
DlgTableColumns : "Kolonner",
DlgTableBorder : "Rammestørrelse",
@@ -299,8 +304,8 @@
DlgTableWidthPx : "piksler",
DlgTableWidthPc : "prosent",
DlgTableHeight : "Høyde",
-DlgTableCellSpace : "Celle marg",
-DlgTableCellPad : "Celle polstring",
+DlgTableCellSpace : "Cellemarg",
+DlgTableCellPad : "Cellepolstring",
DlgTableCaption : "Tittel",
DlgTableSummary : "Sammendrag",
@@ -332,31 +337,31 @@
DlgCellBtnSelect : "Velg...",
// Find and Replace Dialog
-DlgFindAndReplaceTitle : "Find and Replace", //MISSING
+DlgFindAndReplaceTitle : "Søk og erstatt",
// Find Dialog
-DlgFindTitle : "Finn",
-DlgFindFindBtn : "Finn",
-DlgFindNotFoundMsg : "Den spesifiserte teksten ble ikke funnet.",
+DlgFindTitle : "Søk",
+DlgFindFindBtn : "Søk",
+DlgFindNotFoundMsg : "Fant ikke søketeksten.",
// Replace Dialog
DlgReplaceTitle : "Erstatt",
-DlgReplaceFindLbl : "Finn hva:",
+DlgReplaceFindLbl : "Søk etter:",
DlgReplaceReplaceLbl : "Erstatt med:",
-DlgReplaceCaseChk : "Riktig case",
+DlgReplaceCaseChk : "Skill mellom store og små bokstaver",
DlgReplaceReplaceBtn : "Erstatt",
DlgReplaceReplAllBtn : "Erstatt alle",
-DlgReplaceWordChk : "Finn hele ordet",
+DlgReplaceWordChk : "Bare hele ord",
// Paste Operations / Dialog
-PasteErrorCut : "Din nettlesers sikkerhetsinstillinger tillater ikke automatisk klipping av tekst. Vennligst brukt snareveien (Ctrl+X).",
-PasteErrorCopy : "Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst brukt snareveien (Ctrl+C).",
+PasteErrorCut : "Din nettlesers sikkerhetsinstillinger tillater ikke automatisk klipping av tekst. Vennligst bruk snareveien (Ctrl+X).",
+PasteErrorCopy : "Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk snareveien (Ctrl+C).",
PasteAsText : "Lim inn som ren tekst",
-PasteFromWord : "Lim inn fra word",
+PasteFromWord : "Lim inn fra Word",
DlgPasteMsg2 : "Vennligst lim inn i den følgende boksen med tastaturet (<STRONG>Ctrl+V</STRONG>) og trykk <STRONG>OK</STRONG>.",
-DlgPasteSec : "Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.", //MISSING
+DlgPasteSec : "Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du må lime det igjen i dette vinduet.",
DlgPasteIgnoreFont : "Fjern skrifttyper",
DlgPasteRemoveStyles : "Fjern stildefinisjoner",
@@ -380,17 +385,17 @@
DlgSpellBtnReplace : "Erstatt",
DlgSpellBtnReplaceAll : "Erstatt alle",
DlgSpellBtnUndo : "Angre",
-DlgSpellNoSuggestions : "- ingen forslag -",
+DlgSpellNoSuggestions : "- Ingen forslag -",
DlgSpellProgress : "Stavekontroll pågår...",
DlgSpellNoMispell : "Stavekontroll fullført: ingen feilstavinger funnet",
DlgSpellNoChanges : "Stavekontroll fullført: ingen ord endret",
DlgSpellOneChange : "Stavekontroll fullført: Ett ord endret",
DlgSpellManyChanges : "Stavekontroll fullført: %1 ord endret",
-IeSpellDownload : "Stavekontroll ikke installert, vil du laste den ned nå?",
+IeSpellDownload : "Stavekontroll er ikke installert. Vil du laste den ned nå?",
// Button Dialog
-DlgButtonText : "Tekst",
+DlgButtonText : "Tekst (verdi)",
DlgButtonType : "Type",
DlgButtonTypeBtn : "Knapp",
DlgButtonTypeSbm : "Send",
@@ -429,7 +434,7 @@
// Text Field Dialog
DlgTextName : "Navn",
-DlgTextValue : "verdi",
+DlgTextValue : "Verdi",
DlgTextCharWidth : "Tegnbredde",
DlgTextMaxChars : "Maks antall tegn",
DlgTextType : "Type",
@@ -441,24 +446,24 @@
DlgHiddenValue : "Verdi",
// Bulleted List Dialog
-BulletedListProp : "Uordnet listeegenskaper",
-NumberedListProp : "Ordnet listeegenskaper",
+BulletedListProp : "Egenskaper for uordnet liste",
+NumberedListProp : "Egenskaper for ordnet liste",
DlgLstStart : "Start",
DlgLstType : "Type",
DlgLstTypeCircle : "Sirkel",
DlgLstTypeDisc : "Hel sirkel",
DlgLstTypeSquare : "Firkant",
-DlgLstTypeNumbers : "Numre(1, 2, 3)",
+DlgLstTypeNumbers : "Numre (1, 2, 3)",
DlgLstTypeLCase : "Små bokstaver (a, b, c)",
-DlgLstTypeUCase : "Store bokstaver(A, B, C)",
-DlgLstTypeSRoman : "Små romerske tall(i, ii, iii)",
-DlgLstTypeLRoman : "Store romerske tall(I, II, III)",
+DlgLstTypeUCase : "Store bokstaver (A, B, C)",
+DlgLstTypeSRoman : "Små romerske tall (i, ii, iii)",
+DlgLstTypeLRoman : "Store romerske tall (I, II, III)",
// Document Properties Dialog
-DlgDocGeneralTab : "Generalt",
+DlgDocGeneralTab : "Generelt",
DlgDocBackTab : "Bakgrunn",
DlgDocColorsTab : "Farger og marginer",
-DlgDocMetaTab : "Meta Data",
+DlgDocMetaTab : "Meta-data",
DlgDocPageTitle : "Sidetittel",
DlgDocLangDir : "Språkretning",
@@ -473,16 +478,16 @@
DlgDocCharSetJP : "Japansk",
DlgDocCharSetKR : "Koreansk",
DlgDocCharSetTR : "Tyrkisk",
-DlgDocCharSetUN : "Unikode (UTF-8)",
+DlgDocCharSetUN : "Unicode (UTF-8)",
DlgDocCharSetWE : "Vesteuropeisk",
DlgDocCharSetOther : "Annet tegnsett",
DlgDocDocType : "Dokumenttype header",
DlgDocDocTypeOther : "Annet dokumenttype header",
-DlgDocIncXHTML : "Inkulder XHTML deklarasjon",
+DlgDocIncXHTML : "Inkluder XHTML-deklarasjon",
DlgDocBgColor : "Bakgrunnsfarge",
-DlgDocBgImage : "Bakgrunnsbilde url",
-DlgDocBgNoScroll : "Ikke scroll bakgrunnsbilde",
+DlgDocBgImage : "URL for bakgrunnsbilde",
+DlgDocBgNoScroll : "Lås bakgrunnsbilde",
DlgDocCText : "Tekst",
DlgDocCLink : "Link",
DlgDocCVisited : "Besøkt lenke",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Nettleserinfo",
DlgAboutLicenseTab : "Lisens",
DlgAboutVersion : "versjon",
-DlgAboutInfo : "For further information go to" //MISSING
+DlgAboutInfo : "For mer informasjon, se",
+
+// Div Dialog
+DlgDivGeneralTab : "Generelt",
+DlgDivAdvancedTab : "Avansert",
+DlgDivStyle : "Stil",
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/pl.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/pl.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/pl.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Hiperłącze",
InsertLink : "Wstaw/edytuj hiperłącze",
RemoveLink : "Usuń hiperłącze",
+VisitLink : "Open Link", //MISSING
Anchor : "Wstaw/edytuj kotwicę",
AnchorDelete : "Usuń kotwicę",
InsertImageLbl : "Obrazek",
@@ -72,6 +73,9 @@
DecreaseIndent : "Zmniejsz wcięcie",
IncreaseIndent : "Zwiększ wcięcie",
Blockquote : "Cytat",
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Cofnij",
Redo : "Ponów",
NumberedListLbl : "Lista numerowana",
@@ -157,6 +161,7 @@
NoActiveX : "Ustawienia zabezpieczeń twojej przeglądarki mogą ograniczyć niektóre funkcje edytora. Musisz włączyć opcję \"Uruchamianie formantów Activex i dodatków plugin\". W przeciwnym wypadku mogą pojawiać się błędy.",
BrowseServerBlocked : "Nie można otworzyć okno menadżera plików. Upewnij się, że wszystkie blokady wyskakujących okienek są wyłączone.",
DialogBlocked : "Nie można otworzyć okna dialogowego. Upewnij się, że wszystkie blokady wyskakujących okienek są wyłączone.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "O przeglądarce",
DlgAboutLicenseTab : "Licencja",
DlgAboutVersion : "wersja",
-DlgAboutInfo : "Więcej informacji uzyskasz pod adresem"
+DlgAboutInfo : "Więcej informacji uzyskasz pod adresem",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/pt-br.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/pt-br.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/pt-br.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Hiperlink",
InsertLink : "Inserir/Editar Hiperlink",
RemoveLink : "Remover Hiperlink",
+VisitLink : "Open Link", //MISSING
Anchor : "Inserir/Editar Âncora",
AnchorDelete : "Remover Âncora",
InsertImageLbl : "Figura",
@@ -72,6 +73,9 @@
DecreaseIndent : "Diminuir Recuo",
IncreaseIndent : "Aumentar Recuo",
Blockquote : "Recuo",
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Desfazer",
Redo : "Refazer",
NumberedListLbl : "Numeração",
@@ -157,6 +161,7 @@
NoActiveX : "As configurações de segurança do seu browser podem limitar algumas características do editor. Você precisa habilitar a opção \"Executar controles e plug-ins ActiveX\". Você pode experimentar erros e alertas de características faltantes.",
BrowseServerBlocked : "Os recursos do browser não puderam ser abertos. Tenha certeza que todos os bloqueadores de popup estão desabilitados.",
DialogBlocked : "Não foi possível abrir a janela de diálogo. Tenha certeza que todos os bloqueadores de popup estão desabilitados.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Informações do Navegador",
DlgAboutLicenseTab : "Licença",
DlgAboutVersion : "versão",
-DlgAboutInfo : "Para maiores informações visite"
+DlgAboutInfo : "Para maiores informações visite",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/pt.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/pt.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/pt.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Hiperligação",
InsertLink : "Inserir/Editar Hiperligação",
RemoveLink : "Eliminar Hiperligação",
+VisitLink : "Open Link", //MISSING
Anchor : " Inserir/Editar Âncora",
AnchorDelete : "Remove Anchor", //MISSING
InsertImageLbl : "Imagem",
@@ -72,6 +73,9 @@
DecreaseIndent : "Diminuir Avanço",
IncreaseIndent : "Aumentar Avanço",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Anular",
Redo : "Repetir",
NumberedListLbl : "Numeração",
@@ -157,6 +161,7 @@
NoActiveX : "As definições de segurança do navegador podem limitar algumas potencalidades do editr. Deve activar a opção \"Executar controlos e extensões ActiveX\". Pode ocorrer erros ou verificar que faltam potencialidades.",
BrowseServerBlocked : "Não foi possível abrir o navegador de recursos. Certifique-se que todos os bloqueadores de popup estão desactivados.",
DialogBlocked : "Não foi possível abrir a janela de diálogo. Certifique-se que todos os bloqueadores de popup estão desactivados.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Informação do Nevegador",
DlgAboutLicenseTab : "Licença",
DlgAboutVersion : "versão",
-DlgAboutInfo : "Para mais informações por favor dirija-se a"
+DlgAboutInfo : "Para mais informações por favor dirija-se a",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ro.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ro.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ro.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Link (Legătură web)",
InsertLink : "Inserează/Editează link (legătură web)",
RemoveLink : "Înlătură link (legătură web)",
+VisitLink : "Open Link", //MISSING
Anchor : "Inserează/Editează ancoră",
AnchorDelete : "Şterge ancoră",
InsertImageLbl : "Imagine",
@@ -72,6 +73,9 @@
DecreaseIndent : "Scade indentarea",
IncreaseIndent : "Creşte indentarea",
Blockquote : "Citat",
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Starea anterioară (undo)",
Redo : "Starea ulterioară (redo)",
NumberedListLbl : "Listă numerotată",
@@ -157,6 +161,7 @@
NoActiveX : "Setările de securitate ale programului dvs. cu care navigaţi pe internet (browser) pot limita anumite funcţionalităţi ale editorului. Pentru a evita asta, trebuie să activaţi opţiunea \"Run ActiveX controls and plug-ins\". Poate veţi întâlni erori sau veţi observa funcţionalităţi lipsă.",
BrowseServerBlocked : "The resources browser could not be opened. Asiguraţi-vă că nu e activ niciun \"popup blocker\" (funcţionalitate a programului de navigat (browser) sau a unui plug-in al acestuia de a bloca deschiderea unui noi ferestre).",
DialogBlocked : "Nu a fost posibilă deschiderea unei ferestre de dialog. Asiguraţi-vă că nu e activ niciun \"popup blocker\" (funcţionalitate a programului de navigat (browser) sau a unui plug-in al acestuia de a bloca deschiderea unui noi ferestre).",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "Bine",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Informaţii browser",
DlgAboutLicenseTab : "Licenţă",
DlgAboutVersion : "versiune",
-DlgAboutInfo : "Pentru informaţii amănunţite, vizitaţi"
+DlgAboutInfo : "Pentru informaţii amănunţite, vizitaţi",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ru.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ru.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/ru.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Ссылка",
InsertLink : "Вставить/Редактировать ссылку",
RemoveLink : "Убрать ссылку",
+VisitLink : "Open Link", //MISSING
Anchor : "Вставить/Редактировать якорь",
AnchorDelete : "Убрать якорь",
InsertImageLbl : "Изображение",
@@ -72,6 +73,9 @@
DecreaseIndent : "Уменьшить отступ",
IncreaseIndent : "Увеличить отступ",
Blockquote : "Цитата",
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Отменить",
Redo : "Повторить",
NumberedListLbl : "Нумерованный список",
@@ -157,6 +161,7 @@
NoActiveX : "Настройки безопасности вашего браузера могут ограничивать некоторые свойства редактора. Вы должны включить опцию \"Запускать элементы управления ActiveX и плугины\". Вы можете видеть ошибки и замечать отсутствие возможностей.",
BrowseServerBlocked : "Ресурсы браузера не могут быть открыты. Проверьте что блокировки всплывающих окон выключены.",
DialogBlocked : "Невозможно открыть окно диалога. Проверьте что блокировки всплывающих окон выключены.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "ОК",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Информация браузера",
DlgAboutLicenseTab : "Лицензия",
DlgAboutVersion : "Версия",
-DlgAboutInfo : "Для большей информации, посетите"
+DlgAboutInfo : "Для большей информации, посетите",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/sk.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/sk.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/sk.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Odkaz",
InsertLink : "Vložiť/zmeniť odkaz",
RemoveLink : "Odstrániť odkaz",
+VisitLink : "Open Link", //MISSING
Anchor : "Vložiť/zmeniť kotvu",
AnchorDelete : "Remove Anchor", //MISSING
InsertImageLbl : "Obrázok",
@@ -72,6 +73,9 @@
DecreaseIndent : "Zmenšiť odsadenie",
IncreaseIndent : "Zväčšiť odsadenie",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Späť",
Redo : "Znovu",
NumberedListLbl : "Číslovanie",
@@ -157,6 +161,7 @@
NoActiveX : "Bezpečnostné nastavenia vášho prehliadača môžu obmedzovať niektoré funkcie editora. Pre ich plnú funkčnosť musíte zapnúť voľbu \"Spúšťať ActiveX moduly a zásuvné moduly\", inak sa môžete stretnúť s chybami a nefunkčnosťou niektorých funkcií.",
BrowseServerBlocked : "Prehliadač zdrojových prvkov nebolo možné otvoriť. Uistite sa, že máte vypnuté všetky blokovače vyskakujúcich okien.",
DialogBlocked : "Dialógové okno nebolo možné otvoriť. Uistite sa, že máte vypnuté všetky blokovače vyskakujúcich okien.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Informácie o prehliadači",
DlgAboutLicenseTab : "Licencia",
DlgAboutVersion : "verzia",
-DlgAboutInfo : "Viac informácií získate na"
+DlgAboutInfo : "Viac informácií získate na",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/sl.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/sl.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/sl.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Povezava",
InsertLink : "Vstavi/uredi povezavo",
RemoveLink : "Odstrani povezavo",
+VisitLink : "Open Link", //MISSING
Anchor : "Vstavi/uredi zaznamek",
AnchorDelete : "Odstrani zaznamek",
InsertImageLbl : "Slika",
@@ -72,6 +73,9 @@
DecreaseIndent : "Zmanjšaj zamik",
IncreaseIndent : "Povečaj zamik",
Blockquote : "Citat",
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Razveljavi",
Redo : "Ponovi",
NumberedListLbl : "Oštevilčen seznam",
@@ -157,6 +161,7 @@
NoActiveX : "Varnostne nastavitve vašega brskalnika lahko omejijo delovanje nekaterih zmožnosti urejevalnika. Če ne želite zaznavati napak in sporočil o manjkajočih zmožnostih, omogočite možnost \"Zaženi ActiveX kontrolnike in vtičnike\".",
BrowseServerBlocked : "Brskalnik virov se ne more odpreti. Prepričajte se, da je preprečevanje pojavnih oken onemogočeno.",
DialogBlocked : "Pogovorno okno se ni moglo odpreti. Prepričajte se, da je preprečevanje pojavnih oken onemogočeno.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "V redu",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Informacije o brskalniku",
DlgAboutLicenseTab : "Dovoljenja",
DlgAboutVersion : "različica",
-DlgAboutInfo : "Za več informacij obiščite"
+DlgAboutInfo : "Za več informacij obiščite",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/sr-latn.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/sr-latn.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/sr-latn.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Link",
InsertLink : "Unesi/izmeni link",
RemoveLink : "Ukloni link",
+VisitLink : "Open Link", //MISSING
Anchor : "Unesi/izmeni sidro",
AnchorDelete : "Remove Anchor", //MISSING
InsertImageLbl : "Slika",
@@ -72,6 +73,9 @@
DecreaseIndent : "Smanji levu marginu",
IncreaseIndent : "Uvećaj levu marginu",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Poni�ti akciju",
Redo : "Ponovi akciju",
NumberedListLbl : "Nabrojiva lista",
@@ -157,6 +161,7 @@
NoActiveX : "Your browser's security settings could limit some features of the editor. You must enable the option \"Run ActiveX controls and plug-ins\". You may experience errors and notice missing features.", //MISSING
BrowseServerBlocked : "The resources browser could not be opened. Make sure that all popup blockers are disabled.", //MISSING
DialogBlocked : "It was not possible to open the dialog window. Make sure all popup blockers are disabled.", //MISSING
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Informacije o pretraživacu",
DlgAboutLicenseTab : "License", //MISSING
DlgAboutVersion : "verzija",
-DlgAboutInfo : "Za više informacija posetite"
+DlgAboutInfo : "Za više informacija posetite",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/sr.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/sr.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/sr.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Линк",
InsertLink : "Унеси/измени линк",
RemoveLink : "Уклони линк",
+VisitLink : "Open Link", //MISSING
Anchor : "Унеси/измени сидро",
AnchorDelete : "Remove Anchor", //MISSING
InsertImageLbl : "Слика",
@@ -72,6 +73,9 @@
DecreaseIndent : "Смањи леву маргину",
IncreaseIndent : "Увећај леву маргину",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Поништи акцију",
Redo : "Понови акцију",
NumberedListLbl : "Набројиву листу",
@@ -157,6 +161,7 @@
NoActiveX : "Your browser's security settings could limit some features of the editor. You must enable the option \"Run ActiveX controls and plug-ins\". You may experience errors and notice missing features.", //MISSING
BrowseServerBlocked : "The resources browser could not be opened. Make sure that all popup blockers are disabled.", //MISSING
DialogBlocked : "It was not possible to open the dialog window. Make sure all popup blockers are disabled.", //MISSING
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "OK",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Информације о претраживачу",
DlgAboutLicenseTab : "License", //MISSING
DlgAboutVersion : "верзија",
-DlgAboutInfo : "За више информација посетите"
+DlgAboutInfo : "За више информација посетите",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/sv.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/sv.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/sv.js Thu Aug 28 18:47:59 2008
@@ -44,8 +44,9 @@
InsertLinkLbl : "Länk",
InsertLink : "Infoga/Redigera länk",
RemoveLink : "Radera länk",
+VisitLink : "Open Link", //MISSING
Anchor : "Infoga/Redigera ankarlänk",
-AnchorDelete : "Remove Anchor", //MISSING
+AnchorDelete : "Radera ankarlänk",
InsertImageLbl : "Bild",
InsertImage : "Infoga/Redigera bild",
InsertFlashLbl : "Flash",
@@ -72,6 +73,9 @@
DecreaseIndent : "Minska indrag",
IncreaseIndent : "Öka indrag",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Ångra",
Redo : "Gör om",
NumberedListLbl : "Numrerad lista",
@@ -112,20 +116,20 @@
CellCM : "Cell",
RowCM : "Rad",
ColumnCM : "Kolumn",
-InsertRowAfter : "Insert Row After", //MISSING
-InsertRowBefore : "Insert Row Before", //MISSING
+InsertRowAfter : "Lägg till Rad Efter",
+InsertRowBefore : "Lägg till Rad Före",
DeleteRows : "Radera rad",
-InsertColumnAfter : "Insert Column After", //MISSING
-InsertColumnBefore : "Insert Column Before", //MISSING
+InsertColumnAfter : "Lägg till Kolumn Efter",
+InsertColumnBefore : "Lägg till Kolumn Före",
DeleteColumns : "Radera kolumn",
-InsertCellAfter : "Insert Cell After", //MISSING
-InsertCellBefore : "Insert Cell Before", //MISSING
+InsertCellAfter : "Lägg till Cell Efter",
+InsertCellBefore : "Lägg till Cell Före",
DeleteCells : "Radera celler",
MergeCells : "Sammanfoga celler",
-MergeRight : "Merge Right", //MISSING
-MergeDown : "Merge Down", //MISSING
-HorizontalSplitCell : "Split Cell Horizontally", //MISSING
-VerticalSplitCell : "Split Cell Vertically", //MISSING
+MergeRight : "Sammanfoga Höger",
+MergeDown : "Sammanfoga Ner",
+HorizontalSplitCell : "Dela Cell Horisontellt",
+VerticalSplitCell : "Dela Cell Vertikalt",
TableDelete : "Radera tabell",
CellProperties : "Cellegenskaper",
TableProperties : "Tabellegenskaper",
@@ -157,6 +161,7 @@
NoActiveX : "Din webläsares säkerhetsinställningar kan begränsa funktionaliteten. Du bör aktivera \"Kör ActiveX kontroller och plug-ins\". Fel och avsaknad av funktioner kan annars uppstå.",
BrowseServerBlocked : "Kunde Ej öppna resursfönstret. Var god och avaktivera alla popup-blockerare.",
DialogBlocked : "Kunde Ej öppna dialogfönstret. Var god och avaktivera alla popup-blockerare.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "OK",
@@ -332,7 +337,7 @@
DlgCellBtnSelect : "Välj...",
// Find and Replace Dialog
-DlgFindAndReplaceTitle : "Find and Replace", //MISSING
+DlgFindAndReplaceTitle : "Sök och ersätt",
// Find Dialog
DlgFindTitle : "Sök",
@@ -443,7 +448,7 @@
// Bulleted List Dialog
BulletedListProp : "Egenskaper för punktlista",
NumberedListProp : "Egenskaper för numrerad lista",
-DlgLstStart : "Start", //MISSING
+DlgLstStart : "Start",
DlgLstType : "Typ",
DlgLstTypeCircle : "Cirkel",
DlgLstTypeDisc : "Punkt",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Webläsare",
DlgAboutLicenseTab : "Licens",
DlgAboutVersion : "version",
-DlgAboutInfo : "För mer information se"
+DlgAboutInfo : "För mer information se",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/th.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/th.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/th.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "ลิงค์เชื่อมโยงเว็บ อีเมล์ รูปภาพ หรือไฟล์อื่นๆ",
InsertLink : "แทรก/แก้ไข ลิงค์",
RemoveLink : "ลบ ลิงค์",
+VisitLink : "Open Link", //MISSING
Anchor : "แทรก/แก้ไข Anchor",
AnchorDelete : "Remove Anchor", //MISSING
InsertImageLbl : "รูปภาพ",
@@ -72,6 +73,9 @@
DecreaseIndent : "ลดระยะย่อหน้า",
IncreaseIndent : "เพิ่มระยะย่อหน้า",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "ยกเลิกคำสั่ง",
Redo : "ทำซ้ำคำสั่ง",
NumberedListLbl : "ลำดับรายการแบบตัวเลข",
@@ -157,6 +161,7 @@
NoActiveX : "โปรแกรมท่องอินเตอร์เน็ตของท่านไม่อนุญาติให้อีดิตเตอร์ทำงาน \"Run ActiveX controls and plug-ins\". หากไม่อนุญาติให้ใช้งาน ActiveX controls ท่านจะไม่สามารถใช้งานได้อย่างเต็มประสิทธิภาพ.",
BrowseServerBlocked : "เปิดหน้าต่างป๊อบอัพเพื่อทำงานต่อไม่ได้ กรุณาปิดเครื่องมือป้องกันป๊อบอัพในโปรแกรมท่องอินเตอร์เน็ตของท่านด้วย",
DialogBlocked : "เปิดหน้าต่างป๊อบอัพเพื่อทำงานต่อไม่ได้ กรุณาปิดเครื่องมือป้องกันป๊อบอัพในโปรแกรมท่องอินเตอร์เน็ตของท่านด้วย",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "ตกลง",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "โปรแกรมท่องเว็บที่ท่านใช้",
DlgAboutLicenseTab : "ลิขสิทธิ์",
DlgAboutVersion : "รุ่น",
-DlgAboutInfo : "For further information go to" //MISSING
+DlgAboutInfo : "For further information go to", //MISSING
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/tr.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/tr.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/tr.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Köprü",
InsertLink : "Köprü Ekle/Düzenle",
RemoveLink : "Köprü Kaldır",
+VisitLink : "Open Link", //MISSING
Anchor : "Çapa Ekle/Düzenle",
AnchorDelete : "Remove Anchor", //MISSING
InsertImageLbl : "Resim",
@@ -72,6 +73,9 @@
DecreaseIndent : "Sekme Azalt",
IncreaseIndent : "Sekme Arttır",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Geri Al",
Redo : "Tekrarla",
NumberedListLbl : "Numaralı Liste",
@@ -157,6 +161,7 @@
NoActiveX : "Kullandığınız tarayıcının güvenlik ayarları bazı özelliklerin kullanılmasını engelliyor. Bu özelliklerin çalışması için \"Run ActiveX controls and plug-ins (Activex ve eklentileri çalıştır)\" seçeneğinin aktif yapılması gerekiyor. Kullanılamayan eklentiler ve hatalar konusunda daha fazla bilgi sahibi olun.",
BrowseServerBlocked : "Kaynak tarayıcısı açılamadı. Tüm \"popup blocker\" programlarının devre dışı olduğundan emin olun. (Yahoo toolbar, Msn toolbar, Google toolbar gibi)",
DialogBlocked : "Diyalog açmak mümkün olmadı. Tüm \"Popup Blocker\" programlarının devre dışı olduğundan emin olun.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "Tamam",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Gezgin Bilgisi",
DlgAboutLicenseTab : "Lisans",
DlgAboutVersion : "sürüm",
-DlgAboutInfo : "Daha fazla bilgi için:"
+DlgAboutInfo : "Daha fazla bilgi için:",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/uk.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/uk.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/uk.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "Посилання",
InsertLink : "Вставити/Редагувати посилання",
RemoveLink : "Знищити посилання",
+VisitLink : "Open Link", //MISSING
Anchor : "Вставити/Редагувати якір",
AnchorDelete : "Remove Anchor", //MISSING
InsertImageLbl : "Зображення",
@@ -72,6 +73,9 @@
DecreaseIndent : "Зменшити відступ",
IncreaseIndent : "Збільшити відступ",
Blockquote : "Blockquote", //MISSING
+CreateDiv : "Create Div Container", //MISSING
+EditDiv : "Edit Div Container", //MISSING
+DeleteDiv : "Remove Div Container", //MISSING
Undo : "Повернути",
Redo : "Повторити",
NumberedListLbl : "Нумерований список",
@@ -157,6 +161,7 @@
NoActiveX : "Настройки безпеки вашого браузера можуть обмежувати деякі властивості редактора. Ви повинні включити опцію \"Запускати елементи управління ACTIVEX і плугіни\". Ви можете бачити помилки і помічати відсутність можливостей.",
BrowseServerBlocked : "Ресурси браузера не можуть бути відкриті. Перевірте що блокування спливаючих вікон вимкнені.",
DialogBlocked : "Не можливо відкрити вікно діалогу. Перевірте що блокування спливаючих вікон вимкнені.",
+VisitLinkBlocked : "It was not possible to open a new window. Make sure all popup blockers are disabled.", //MISSING
// Dialogs
DlgBtnOK : "ОК",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Інформація браузера",
DlgAboutLicenseTab : "Ліцензія",
DlgAboutVersion : "Версія",
-DlgAboutInfo : "Додаткову інформацію дивіться на "
+DlgAboutInfo : "Додаткову інформацію дивіться на ",
+
+// Div Dialog
+DlgDivGeneralTab : "General", //MISSING
+DlgDivAdvancedTab : "Advanced", //MISSING
+DlgDivStyle : "Style", //MISSING
+DlgDivInlineStyle : "Inline Style" //MISSING
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/vi.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/vi.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/vi.js Thu Aug 28 18:47:59 2008
@@ -44,8 +44,9 @@
InsertLinkLbl : "Liên kết",
InsertLink : "Chèn/Sửa Liên kết",
RemoveLink : "Xoá Liên kết",
+VisitLink : "Mở Liên Kết",
Anchor : "Chèn/Sửa Neo",
-AnchorDelete : "Remove Anchor", //MISSING
+AnchorDelete : "Gỡ bỏ Neo",
InsertImageLbl : "Hình ảnh",
InsertImage : "Chèn/Sửa Hình ảnh",
InsertFlashLbl : "Flash",
@@ -71,7 +72,10 @@
BlockJustify : "Canh đều",
DecreaseIndent : "Dịch ra ngoài",
IncreaseIndent : "Dịch vào trong",
-Blockquote : "Blockquote", //MISSING
+Blockquote : "Khối Trích dẫn",
+CreateDiv : "Tạo Div Container",
+EditDiv : "Chỉnh sửa Div Container",
+DeleteDiv : "Gỡ bỏ Div Container",
Undo : "Khôi phục thao tác",
Redo : "Làm lại thao tác",
NumberedListLbl : "Danh sách có thứ tự",
@@ -105,27 +109,27 @@
ImageButton : "Nút hình ảnh",
FitWindow : "Mở rộng tối đa kích thước trình biên tập",
-ShowBlocks : "Show Blocks", //MISSING
+ShowBlocks : "Hiển thị các Khối",
// Context Menu
EditLink : "Sửa Liên kết",
CellCM : "Ô",
RowCM : "Hàng",
ColumnCM : "Cột",
-InsertRowAfter : "Insert Row After", //MISSING
-InsertRowBefore : "Insert Row Before", //MISSING
+InsertRowAfter : "Chèn Hàng Phía sau",
+InsertRowBefore : "Chèn Hàng Phía trước",
DeleteRows : "Xoá Hàng",
-InsertColumnAfter : "Insert Column After", //MISSING
-InsertColumnBefore : "Insert Column Before", //MISSING
+InsertColumnAfter : "Chèn Cột Phía sau",
+InsertColumnBefore : "Chèn Cột Phía trước",
DeleteColumns : "Xoá Cột",
-InsertCellAfter : "Insert Cell After", //MISSING
-InsertCellBefore : "Insert Cell Before", //MISSING
+InsertCellAfter : "Chèn Ô Phía sau",
+InsertCellBefore : "Chèn Ô Phía trước",
DeleteCells : "Xoá Ô",
-MergeCells : "Trộn Ô",
-MergeRight : "Merge Right", //MISSING
-MergeDown : "Merge Down", //MISSING
-HorizontalSplitCell : "Split Cell Horizontally", //MISSING
-VerticalSplitCell : "Split Cell Vertically", //MISSING
+MergeCells : "Kết hợp Ô",
+MergeRight : "Kết hợp Sang phải",
+MergeDown : "Kết hợp Xuống dưới",
+HorizontalSplitCell : "Tách ngang Ô",
+VerticalSplitCell : "Tách dọc Ô",
TableDelete : "Xóa Bảng",
CellProperties : "Thuộc tính Ô",
TableProperties : "Thuộc tính Bảng",
@@ -154,9 +158,10 @@
UnknownCommand : "Không rõ lệnh \"%1\"",
NotImplemented : "Lệnh không được thực hiện",
UnknownToolbarSet : "Thanh công cụ \"%1\" không tồn tại",
-NoActiveX : "Các thiết lập bảo mật của trình duyệt có thể giới hạn một số chức năng của trình biên tập. Bạn phải bật tùy chọn \"Run ActiveX controls and plug-ins\". Bạn có thể gặp một số lỗi và thấy thiếu đi một số chức năng.",
+NoActiveX : "Các thiết lập bảo mật của trình duyệt có thể giới hạn một số chức năng của trình biên tập. Bạn phải bật tùy chọn \"Run ActiveX controls and plug-ins\". Bạn có thể gặp một số lỗi và thấy thiếu một số chức năng.",
BrowseServerBlocked : "Không thể mở được bộ duyệt tài nguyên. Hãy đảm bảo chức năng chặn popup đã bị vô hiệu hóa.",
DialogBlocked : "Không thể mở được cửa sổ hộp thoại. Hãy đảm bảo chức năng chặn popup đã bị vô hiệu hóa.",
+VisitLinkBlocked : "Không thể mở được cửa sổ trình duyệt mới. Hãy đảm bảo chức năng chặn popup đã bị vô hiệu hóa.",
// Dialogs
DlgBtnOK : "Đồng ý",
@@ -194,7 +199,7 @@
DlgImgAlt : "Chú thích Hình ảnh",
DlgImgWidth : "Rộng",
DlgImgHeight : "Cao",
-DlgImgLockRatio : "Giữ tỷ lệ",
+DlgImgLockRatio : "Giữ nguyên tỷ lệ",
DlgBtnResetSize : "Kích thước gốc",
DlgImgBorder : "Đường viền",
DlgImgHSpace : "HSpace",
@@ -203,7 +208,7 @@
DlgImgAlignLeft : "Trái",
DlgImgAlignAbsBottom: "Dưới tuyệt đối",
DlgImgAlignAbsMiddle: "Giữa tuyệt đối",
-DlgImgAlignBaseline : "Baseline",
+DlgImgAlignBaseline : "Đường cơ sở",
DlgImgAlignBottom : "Dưới",
DlgImgAlignMiddle : "Giữa",
DlgImgAlignRight : "Phải",
@@ -324,7 +329,7 @@
DlgCellVerAlignTop : "Trên",
DlgCellVerAlignMiddle : "Giữa",
DlgCellVerAlignBottom : "Dưới",
-DlgCellVerAlignBaseline : "Baseline",
+DlgCellVerAlignBaseline : "Đường cơ sở",
DlgCellRowSpan : "Nối Hàng",
DlgCellCollSpan : "Nối Cột",
DlgCellBackColor : "Màu nền",
@@ -332,7 +337,7 @@
DlgCellBtnSelect : "Chọn...",
// Find and Replace Dialog
-DlgFindAndReplaceTitle : "Find and Replace", //MISSING
+DlgFindAndReplaceTitle : "Tìm kiếm và Thay Thế",
// Find Dialog
DlgFindTitle : "Tìm kiếm",
@@ -370,7 +375,7 @@
// Anchor Dialog
DlgAnchorTitle : "Thuộc tính Neo",
DlgAnchorName : "Tên của Neo",
-DlgAnchorErrorName : "Hãy đưa vào tên của Neo",
+DlgAnchorErrorName : "Hãy nhập vào tên của Neo",
// Speller Pages Dialog
DlgSpellNotInDic : "Không có trong từ điển",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "Thông tin trình duyệt",
DlgAboutLicenseTab : "Giấy phép",
DlgAboutVersion : "phiên bản",
-DlgAboutInfo : "Để biết thêm thông tin, hãy truy cập"
+DlgAboutInfo : "Để biết thêm thông tin, hãy truy cập",
+
+// Div Dialog
+DlgDivGeneralTab : "Chung",
+DlgDivAdvancedTab : "Nâng cao",
+DlgDivStyle : "Kiểu Style",
+DlgDivInlineStyle : "Kiểu Style Trực tiếp"
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/zh-cn.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/zh-cn.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/zh-cn.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "超链接",
InsertLink : "插入/编辑超链接",
RemoveLink : "取消超链接",
+VisitLink : "打开超链接",
Anchor : "插入/编辑锚点链接",
AnchorDelete : "清除锚点链接",
InsertImageLbl : "图象",
@@ -71,7 +72,10 @@
BlockJustify : "两端对齐",
DecreaseIndent : "减少缩进量",
IncreaseIndent : "增加缩进量",
-Blockquote : "引用文字",
+Blockquote : "块引用",
+CreateDiv : "新增 Div 标籤",
+EditDiv : "更改 Div 标籤",
+DeleteDiv : "删除 Div 标籤",
Undo : "撤消",
Redo : "重做",
NumberedListLbl : "编号列表",
@@ -157,6 +161,7 @@
NoActiveX : "浏览器安全设置限制了本编辑器的某些功能。您必须启用安全设置中的“运行 ActiveX 控件和插件”,否则将出现某些错误并缺少功能。",
BrowseServerBlocked : "无法打开资源浏览器,请确认是否启用了禁止弹出窗口。",
DialogBlocked : "无法打开对话框窗口,请确认是否启用了禁止弹出窗口或网页对话框(IE)。",
+VisitLinkBlocked : "无法打开新窗口,请确认是否启用了禁止弹出窗口或网页对话框(IE)。",
// Dialogs
DlgBtnOK : "确定",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "浏览器信息",
DlgAboutLicenseTab : "许可证",
DlgAboutVersion : "版本",
-DlgAboutInfo : "要获得更多信息请访问 "
+DlgAboutInfo : "要获得更多信息请访问 ",
+
+// Div Dialog
+DlgDivGeneralTab : "常规",
+DlgDivAdvancedTab : "高级",
+DlgDivStyle : "样式",
+DlgDivInlineStyle : "CSS 样式"
};
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/zh.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/zh.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/lang/zh.js Thu Aug 28 18:47:59 2008
@@ -44,6 +44,7 @@
InsertLinkLbl : "超連結",
InsertLink : "插入/編輯超連結",
RemoveLink : "移除超連結",
+VisitLink : "開啟超連結",
Anchor : "插入/編輯錨點",
AnchorDelete : "移除錨點",
InsertImageLbl : "影像",
@@ -71,7 +72,10 @@
BlockJustify : "左右對齊",
DecreaseIndent : "減少縮排",
IncreaseIndent : "增加縮排",
-Blockquote : "块引用",
+Blockquote : "引用文字",
+CreateDiv : "新增 Div 標籤",
+EditDiv : "變更 Div 標籤",
+DeleteDiv : "移除 Div 標籤",
Undo : "復原",
Redo : "重複",
NumberedListLbl : "編號清單",
@@ -157,6 +161,7 @@
NoActiveX : "瀏覽器的安全性設定限制了本編輯器的某些功能。您必須啟用安全性設定中的「執行ActiveX控制項與外掛程式」項目,否則本編輯器將會出現錯誤並缺少某些功能",
BrowseServerBlocked : "無法開啟資源瀏覽器,請確定所有快顯視窗封鎖程式是否關閉",
DialogBlocked : "無法開啟對話視窗,請確定所有快顯視窗封鎖程式是否關閉",
+VisitLinkBlocked : "無法開啟新視窗,請確定所有快顯視窗封鎖程式是否關閉",
// Dialogs
DlgBtnOK : "確定",
@@ -511,5 +516,11 @@
DlgAboutBrowserInfoTab : "瀏覽器資訊",
DlgAboutLicenseTab : "許可證",
DlgAboutVersion : "版本",
-DlgAboutInfo : "想獲得更多資訊請至 "
+DlgAboutInfo : "想獲得更多資訊請至 ",
+
+// Div Dialog
+DlgDivGeneralTab : "一般",
+DlgDivAdvancedTab : "進階",
+DlgDivStyle : "樣式",
+DlgDivInlineStyle : "CSS 樣式"
};
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/plugins/placeholder/lang/es.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/plugins/placeholder/lang/es.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,27 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ *
+ * Placholder Spanish language file.
+ */
+FCKLang.PlaceholderBtn = 'Insertar/Editar contenedor' ;
+FCKLang.PlaceholderDlgTitle = 'Propiedades del contenedor ' ;
+FCKLang.PlaceholderDlgName = 'Nombre de contenedor' ;
+FCKLang.PlaceholderErrNoName = 'Por favor escriba el nombre de contenedor' ;
+FCKLang.PlaceholderErrNameInUse = 'El nombre especificado ya esta en uso' ;
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/default/fck_dialog_ie6.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/default/fck_dialog_ie6.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,110 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ */
+
+(function()
+{
+ // IE6 doens't handle absolute positioning properly (it is always in quirks
+ // mode). This function fixes the sizes and positions of many elements that
+ // compose the skin (this is skin specific).
+ var fixSizes = window.DoResizeFixes = function()
+ {
+ var fckDlg = window.document.body ;
+
+ for ( var i = 0 ; i < fckDlg.childNodes.length ; i++ )
+ {
+ var child = fckDlg.childNodes[i] ;
+ switch ( child.className )
+ {
+ case 'contents' :
+ child.style.width = Math.max( 0, fckDlg.offsetWidth - 16 - 16 ) ; // -left -right
+ child.style.height = Math.max( 0, fckDlg.clientHeight - 20 - 2 ) ; // -bottom -top
+ break ;
+
+ case 'blocker' :
+ case 'cover' :
+ child.style.width = Math.max( 0, fckDlg.offsetWidth - 16 - 16 + 4 ) ; // -left -right + 4
+ child.style.height = Math.max( 0, fckDlg.clientHeight - 20 - 2 + 4 ) ; // -bottom -top + 4
+ break ;
+
+ case 'tr' :
+ child.style.left = Math.max( 0, fckDlg.clientWidth - 16 ) ;
+ break ;
+
+ case 'tc' :
+ child.style.width = Math.max( 0, fckDlg.clientWidth - 16 - 16 ) ;
+ break ;
+
+ case 'ml' :
+ child.style.height = Math.max( 0, fckDlg.clientHeight - 16 - 51 ) ;
+ break ;
+
+ case 'mr' :
+ child.style.left = Math.max( 0, fckDlg.clientWidth - 16 ) ;
+ child.style.height = Math.max( 0, fckDlg.clientHeight - 16 - 51 ) ;
+ break ;
+
+ case 'bl' :
+ child.style.top = Math.max( 0, fckDlg.clientHeight - 51 ) ;
+ break ;
+
+ case 'br' :
+ child.style.left = Math.max( 0, fckDlg.clientWidth - 30 ) ;
+ child.style.top = Math.max( 0, fckDlg.clientHeight - 51 ) ;
+ break ;
+
+ case 'bc' :
+ child.style.width = Math.max( 0, fckDlg.clientWidth - 30 - 30 ) ;
+ child.style.top = Math.max( 0, fckDlg.clientHeight - 51 ) ;
+ break ;
+ }
+ }
+ }
+
+ var closeButtonOver = function()
+ {
+ this.style.backgroundPosition = '-16px -687px' ;
+ } ;
+
+ var closeButtonOut = function()
+ {
+ this.style.backgroundPosition = '-16px -651px' ;
+ } ;
+
+ var fixCloseButton = function()
+ {
+ var closeButton = document.getElementById ( 'closeButton' ) ;
+
+ closeButton.onmouseover = closeButtonOver ;
+ closeButton.onmouseout = closeButtonOut ;
+ }
+
+ var onLoad = function()
+ {
+ fixSizes() ;
+ fixCloseButton() ;
+
+ window.attachEvent( 'onresize', fixSizes ) ;
+ window.detachEvent( 'onload', onLoad ) ;
+ }
+
+ window.attachEvent( 'onload', onLoad ) ;
+
+})() ;
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/default/fck_strip.gif
==============================================================================
Binary files. No diff available.
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/default/images/dialog.sides.gif
==============================================================================
Binary file. No diff available.
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/default/images/dialog.sides.png
==============================================================================
Binary file. No diff available.
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/default/images/dialog.sides.rtl.png
==============================================================================
Binary file. No diff available.
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/default/images/sprites.gif
==============================================================================
Binary file. No diff available.
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/default/images/sprites.png
==============================================================================
Binary file. No diff available.
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/office2003/fck_dialog_ie6.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/office2003/fck_dialog_ie6.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,110 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ */
+
+(function()
+{
+ // IE6 doens't handle absolute positioning properly (it is always in quirks
+ // mode). This function fixes the sizes and positions of many elements that
+ // compose the skin (this is skin specific).
+ var fixSizes = window.DoResizeFixes = function()
+ {
+ var fckDlg = window.document.body ;
+
+ for ( var i = 0 ; i < fckDlg.childNodes.length ; i++ )
+ {
+ var child = fckDlg.childNodes[i] ;
+ switch ( child.className )
+ {
+ case 'contents' :
+ child.style.width = Math.max( 0, fckDlg.offsetWidth - 16 - 16 ) ; // -left -right
+ child.style.height = Math.max( 0, fckDlg.clientHeight - 20 - 2 ) ; // -bottom -top
+ break ;
+
+ case 'blocker' :
+ case 'cover' :
+ child.style.width = Math.max( 0, fckDlg.offsetWidth - 16 - 16 + 4 ) ; // -left -right + 4
+ child.style.height = Math.max( 0, fckDlg.clientHeight - 20 - 2 + 4 ) ; // -bottom -top + 4
+ break ;
+
+ case 'tr' :
+ child.style.left = Math.max( 0, fckDlg.clientWidth - 16 ) ;
+ break ;
+
+ case 'tc' :
+ child.style.width = Math.max( 0, fckDlg.clientWidth - 16 - 16 ) ;
+ break ;
+
+ case 'ml' :
+ child.style.height = Math.max( 0, fckDlg.clientHeight - 16 - 51 ) ;
+ break ;
+
+ case 'mr' :
+ child.style.left = Math.max( 0, fckDlg.clientWidth - 16 ) ;
+ child.style.height = Math.max( 0, fckDlg.clientHeight - 16 - 51 ) ;
+ break ;
+
+ case 'bl' :
+ child.style.top = Math.max( 0, fckDlg.clientHeight - 51 ) ;
+ break ;
+
+ case 'br' :
+ child.style.left = Math.max( 0, fckDlg.clientWidth - 30 ) ;
+ child.style.top = Math.max( 0, fckDlg.clientHeight - 51 ) ;
+ break ;
+
+ case 'bc' :
+ child.style.width = Math.max( 0, fckDlg.clientWidth - 30 - 30 ) ;
+ child.style.top = Math.max( 0, fckDlg.clientHeight - 51 ) ;
+ break ;
+ }
+ }
+ }
+
+ var closeButtonOver = function()
+ {
+ this.style.backgroundPosition = '-16px -687px' ;
+ } ;
+
+ var closeButtonOut = function()
+ {
+ this.style.backgroundPosition = '-16px -651px' ;
+ } ;
+
+ var fixCloseButton = function()
+ {
+ var closeButton = document.getElementById ( 'closeButton' ) ;
+
+ closeButton.onmouseover = closeButtonOver ;
+ closeButton.onmouseout = closeButtonOut ;
+ }
+
+ var onLoad = function()
+ {
+ fixSizes() ;
+ fixCloseButton() ;
+
+ window.attachEvent( 'onresize', fixSizes ) ;
+ window.detachEvent( 'onload', onLoad ) ;
+ }
+
+ window.attachEvent( 'onload', onLoad ) ;
+
+})() ;
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/office2003/fck_strip.gif
==============================================================================
Binary files. No diff available.
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/office2003/images/dialog.sides.gif
==============================================================================
Binary file. No diff available.
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/office2003/images/dialog.sides.png
==============================================================================
Binary file. No diff available.
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/office2003/images/dialog.sides.rtl.png
==============================================================================
Binary file. No diff available.
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/office2003/images/sprites.gif
==============================================================================
Binary file. No diff available.
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/office2003/images/sprites.png
==============================================================================
Binary file. No diff available.
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/silver/fck_dialog_ie6.js
==============================================================================
--- (empty file)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/silver/fck_dialog_ie6.js Thu Aug 28 18:47:59 2008
@@ -0,0 +1,110 @@
+/*
+ * FCKeditor - The text editor for Internet - http://www.fckeditor.net
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
+ *
+ * == BEGIN LICENSE ==
+ *
+ * Licensed under the terms of any of the following licenses at your
+ * choice:
+ *
+ * - GNU General Public License Version 2 or later (the "GPL")
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * - Mozilla Public License Version 1.1 or later (the "MPL")
+ * http://www.mozilla.org/MPL/MPL-1.1.html
+ *
+ * == END LICENSE ==
+ */
+
+(function()
+{
+ // IE6 doens't handle absolute positioning properly (it is always in quirks
+ // mode). This function fixes the sizes and positions of many elements that
+ // compose the skin (this is skin specific).
+ var fixSizes = window.DoResizeFixes = function()
+ {
+ var fckDlg = window.document.body ;
+
+ for ( var i = 0 ; i < fckDlg.childNodes.length ; i++ )
+ {
+ var child = fckDlg.childNodes[i] ;
+ switch ( child.className )
+ {
+ case 'contents' :
+ child.style.width = Math.max( 0, fckDlg.offsetWidth - 16 - 16 ) ; // -left -right
+ child.style.height = Math.max( 0, fckDlg.clientHeight - 20 - 2 ) ; // -bottom -top
+ break ;
+
+ case 'blocker' :
+ case 'cover' :
+ child.style.width = Math.max( 0, fckDlg.offsetWidth - 16 - 16 + 4 ) ; // -left -right + 4
+ child.style.height = Math.max( 0, fckDlg.clientHeight - 20 - 2 + 4 ) ; // -bottom -top + 4
+ break ;
+
+ case 'tr' :
+ child.style.left = Math.max( 0, fckDlg.clientWidth - 16 ) ;
+ break ;
+
+ case 'tc' :
+ child.style.width = Math.max( 0, fckDlg.clientWidth - 16 - 16 ) ;
+ break ;
+
+ case 'ml' :
+ child.style.height = Math.max( 0, fckDlg.clientHeight - 16 - 51 ) ;
+ break ;
+
+ case 'mr' :
+ child.style.left = Math.max( 0, fckDlg.clientWidth - 16 ) ;
+ child.style.height = Math.max( 0, fckDlg.clientHeight - 16 - 51 ) ;
+ break ;
+
+ case 'bl' :
+ child.style.top = Math.max( 0, fckDlg.clientHeight - 51 ) ;
+ break ;
+
+ case 'br' :
+ child.style.left = Math.max( 0, fckDlg.clientWidth - 30 ) ;
+ child.style.top = Math.max( 0, fckDlg.clientHeight - 51 ) ;
+ break ;
+
+ case 'bc' :
+ child.style.width = Math.max( 0, fckDlg.clientWidth - 30 - 30 ) ;
+ child.style.top = Math.max( 0, fckDlg.clientHeight - 51 ) ;
+ break ;
+ }
+ }
+ }
+
+ var closeButtonOver = function()
+ {
+ this.style.backgroundPosition = '-16px -687px' ;
+ } ;
+
+ var closeButtonOut = function()
+ {
+ this.style.backgroundPosition = '-16px -651px' ;
+ } ;
+
+ var fixCloseButton = function()
+ {
+ var closeButton = document.getElementById ( 'closeButton' ) ;
+
+ closeButton.onmouseover = closeButtonOver ;
+ closeButton.onmouseout = closeButtonOut ;
+ }
+
+ var onLoad = function()
+ {
+ fixSizes() ;
+ fixCloseButton() ;
+
+ window.attachEvent( 'onresize', fixSizes ) ;
+ window.detachEvent( 'onload', onLoad ) ;
+ }
+
+ window.attachEvent( 'onload', onLoad ) ;
+
+})() ;
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/silver/fck_strip.gif
==============================================================================
Binary files. No diff available.
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/silver/images/dialog.sides.gif
==============================================================================
Binary file. No diff available.
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/silver/images/dialog.sides.png
==============================================================================
Binary file. No diff available.
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/silver/images/dialog.sides.rtl.png
==============================================================================
Binary file. No diff available.
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/silver/images/sprites.gif
==============================================================================
Binary file. No diff available.
Added: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/editor/skins/silver/images/sprites.png
==============================================================================
Binary file. No diff available.
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/fckconfig.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/fckconfig.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/fckconfig.js Thu Aug 28 18:47:59 2008
@@ -1,6 +1,6 @@
-/*
+/*
* FCKeditor - The text editor for Internet - http://www.fckeditor.net
- * Copyright (C) 2003-2007 Frederico Caldeira Knabben
+ * Copyright (C) 2003-2008 Frederico Caldeira Knabben
*
* == BEGIN LICENSE ==
*
@@ -21,7 +21,7 @@
* Editor configuration settings.
*
* Follow this link for more information:
- * http://wiki.fckeditor.net/Developer%27s_Guide/Configuration/Configurations_Settings
+ * http://docs.fckeditor.net/FCKeditor_2.x/Developers_Guide/Configuration/Configuration_Options
*/
FCKConfig.CustomConfigurationsPath = '' ;
@@ -42,7 +42,10 @@
FCKConfig.Debug = false ;
FCKConfig.AllowQueryStringDebug = true ;
-FCKConfig.SkinPath = FCKConfig.BasePath + 'skins/silver/' ;
+FCKConfig.SkinPath = FCKConfig.BasePath + 'skins/default/' ;
+FCKConfig.SkinEditorCSS = '' ; // FCKConfig.SkinPath + "|<minified css>" ;
+FCKConfig.SkinDialogCSS = '' ; // FCKConfig.SkinPath + "|<minified css>" ;
+
FCKConfig.PreloadImages = [ FCKConfig.SkinPath + 'images/toolbar.start.gif', FCKConfig.SkinPath + 'images/toolbar.buttonarrow.gif' ] ;
FCKConfig.PluginsPath = FCKConfig.BasePath + 'plugins/' ;
@@ -73,6 +76,9 @@
FCKConfig.FormatOutput = true ;
FCKConfig.FormatIndentator = ' ' ;
+FCKConfig.EMailProtection = 'encode' ; // none | encode | function
+FCKConfig.EMailProtectionFunction = 'mt(NAME,DOMAIN,SUBJECT,BODY)' ;
+
FCKConfig.StartupFocus = false ;
FCKConfig.ForcePasteAsPlainText = false ;
FCKConfig.AutoDetectPasteFromWord = true ; // IE only.
@@ -81,10 +87,9 @@
FCKConfig.TabSpaces = 0 ;
FCKConfig.ShowBorders = true ;
FCKConfig.SourcePopup = false ;
-FCKConfig.ToolbarStartExpanded = false ;
+FCKConfig.ToolbarStartExpanded = ;
FCKConfig.ToolbarCanCollapse = true ;
FCKConfig.IgnoreEmptyParagraphValue = true ;
-FCKConfig.PreserveSessionOnFileBrowser = false ;
FCKConfig.FloatingPanelsZIndex = 10000 ;
FCKConfig.HtmlEncodeOutput = false ;
@@ -94,22 +99,20 @@
FCKConfig.ToolbarLocation = 'In' ;
FCKConfig.ToolbarSets["Default"] = [
- //['Source','DocProps','-','Save','NewPage','Preview'], // ,'-','Templates'],
- ['Source','DocProps','-','Preview'], // ,'-','Templates'],
+ ['Source','DocProps','-','Save','NewPage','Preview','-','Templates'],
['Cut','Copy','Paste','PasteText','PasteWord','-','Print','SpellCheck'],
['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
-// ['Form','Checkbox','Radio','TextField','Textarea','Select','Button','ImageButton','HiddenField'],
- ['FitWindow','ShowBlocks'], // ,'-','About'],
+ ['Form','Checkbox','Radio','TextField','Textarea','Select','Button','ImageButton','HiddenField'],
'/',
['Bold','Italic','Underline','StrikeThrough','-','Subscript','Superscript'],
- ['OrderedList','UnorderedList','-','Outdent','Indent','Blockquote'],
+ ['OrderedList','UnorderedList','-','Outdent','Indent','Blockquote','CreateDiv'],
['JustifyLeft','JustifyCenter','JustifyRight','JustifyFull'],
['Link','Unlink','Anchor'],
-// ['Image','Flash','Table','Rule','Smiley','SpecialChar','PageBreak'],
- ['Table','Rule','SpecialChar','PageBreak'],
+ ['Image','Flash','Table','Rule','Smiley','SpecialChar','PageBreak'],
'/',
['Style','FontFormat','FontName','FontSize'],
- ['TextColor','BGColor'] // No comma for the last row.
+ ['TextColor','BGColor'],
+ ['FitWindow','ShowBlocks','-','About'] // No comma for the last row.
] ;
FCKConfig.ToolbarSets["Basic"] = [
@@ -119,14 +122,15 @@
FCKConfig.EnterMode = 'p' ; // p | div | br
FCKConfig.ShiftEnterMode = 'br' ; // p | div | br
-
FCKConfig.Keystrokes = [
[ CTRL + 65 /*A*/, true ],
[ CTRL + 67 /*C*/, true ],
[ CTRL + 70 /*F*/, true ],
[ CTRL + 83 /*S*/, true ],
+ [ CTRL + 84 /*T*/, true ],
[ CTRL + 88 /*X*/, true ],
[ CTRL + 86 /*V*/, 'Paste' ],
+ [ CTRL + 45 /*INS*/, true ],
[ SHIFT + 45 /*INS*/, 'Paste' ],
[ CTRL + 88 /*X*/, 'Cut' ],
[ SHIFT + 46 /*DEL*/, 'Cut' ],
@@ -139,19 +143,18 @@
[ CTRL + 85 /*U*/, 'Underline' ],
[ CTRL + SHIFT + 83 /*S*/, 'Save' ],
[ CTRL + ALT + 13 /*ENTER*/, 'FitWindow' ],
+ [ SHIFT + 32 /*SPACE*/, 'Nbsp' ]
] ;
-
-
-
-FCKConfig.ContextMenu = ['Generic','Link','Anchor','Image','Flash','Select','Textarea','Checkbox','Radio','TextField','HiddenField','ImageButton','Button','BulletedList','NumberedList','Table','Form'] ;
-FCKConfig.BrowserContextMenuOnCtrl = true ;
+FCKConfig.ContextMenu = ['Generic','Link','Anchor','Image','Flash','Select','Textarea','Checkbox','Radio','TextField','HiddenField','ImageButton','Button','BulletedList','NumberedList','Table','Form','DivContainer'] ;
+FCKConfig.BrowserContextMenuOnCtrl = false ;
+FCKConfig.BrowserContextMenu = false ;
FCKConfig.EnableMoreFontColors = true ;
FCKConfig.FontColors = '000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,808080,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF' ;
FCKConfig.FontFormats = 'p;h1;h2;h3;h4;h5;h6;pre;address;div' ;
-FCKConfig.FontNames = 'Arial;Courier New;Tahoma;Times New Roman;Verdana' ;
+FCKConfig.FontNames = 'Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana' ;
FCKConfig.FontSizes = 'smaller;larger;xx-small;x-small;small;medium;large;x-large;xx-large' ;
FCKConfig.StylesXmlPath = FCKConfig.EditorPath + 'fckstyles.xml' ;
@@ -160,7 +163,7 @@
FCKConfig.SpellChecker = 'ieSpell' ; // 'ieSpell' | 'SpellerPages'
FCKConfig.IeSpellDownloadUrl = 'http://www.iespell.com/download.php' ;
FCKConfig.SpellerPagesServerScript = 'server-scripts/spellchecker.php' ; // Available extension: .php .cfm .pl
-FCKConfig.FirefoxSpellChecker = true ;
+FCKConfig.FirefoxSpellChecker = false ;
FCKConfig.MaxUndoLevels = 15 ;
@@ -194,22 +197,25 @@
// Only inline elements are valid.
FCKConfig.RemoveFormatTags = 'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var' ;
-FCKConfig.CustomStyles =
+// Attributes that will be removed
+FCKConfig.RemoveAttributes = 'class,style,lang,width,height,align,hspace,valign' ;
+
+FCKConfig.CustomStyles =
{
'Red Title' : { Element : 'h3', Styles : { 'color' : 'Red' } }
};
// Do not add, rename or remove styles here. Only apply definition changes.
-FCKConfig.CoreStyles =
+FCKConfig.CoreStyles =
{
// Basic Inline Styles.
- 'Bold' : { Element : 'b', Overrides : 'strong' },
- 'Italic' : { Element : 'i', Overrides : 'em' },
+ 'Bold' : { Element : 'strong', Overrides : 'b' },
+ 'Italic' : { Element : 'em', Overrides : 'i' },
'Underline' : { Element : 'u' },
'StrikeThrough' : { Element : 'strike' },
'Subscript' : { Element : 'sub' },
'Superscript' : { Element : 'sup' },
-
+
// Basic Block Styles (Font Format Combo).
'p' : { Element : 'p' },
'div' : { Element : 'div' },
@@ -221,30 +227,32 @@
'h4' : { Element : 'h4' },
'h5' : { Element : 'h5' },
'h6' : { Element : 'h6' },
-
+
// Other formatting features.
- 'FontFace' :
- {
- Element : 'span',
- Styles : { 'font-family' : '#("Font")' },
+ 'FontFace' :
+ {
+ Element : 'span',
+ Styles : { 'font-family' : '#("Font")' },
Overrides : [ { Element : 'font', Attributes : { 'face' : null } } ]
},
-
+
'Size' :
- {
- Element : 'span',
- Styles : { 'font-size' : '#("Size","fontSize")' },
+ {
+ Element : 'span',
+ Styles : { 'font-size' : '#("Size","fontSize")' },
Overrides : [ { Element : 'font', Attributes : { 'size' : null } } ]
},
-
+
'Color' :
- {
- Element : 'span',
- Styles : { 'color' : '#("Color","color")' },
+ {
+ Element : 'span',
+ Styles : { 'color' : '#("Color","color")' },
Overrides : [ { Element : 'font', Attributes : { 'color' : null } } ]
},
-
- 'BackColor' : { Element : 'span', Styles : { 'background-color' : '#("Color","color")' } }
+
+ 'BackColor' : { Element : 'span', Styles : { 'background-color' : '#("Color","color")' } },
+
+ 'SelectionHighlight' : { Element : 'span', Styles : { 'background-color' : 'navy', 'color' : 'white' } }
};
// The distance of an indentation step.
@@ -274,17 +282,17 @@
var _QuickUploadExtension = _QuickUploadLanguage == 'perl' ? 'cgi' : _QuickUploadLanguage ;
FCKConfig.LinkBrowser = true ;
-FCKConfig.LinkBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Connector=../../connectors/' + _FileBrowserLanguage + '/connector.' + _FileBrowserExtension ;
+FCKConfig.LinkBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Connector=' + encodeURIComponent( FCKConfig.BasePath + 'filemanager/connectors/' + _FileBrowserLanguage + '/connector.' + _FileBrowserExtension ) ;
FCKConfig.LinkBrowserWindowWidth = FCKConfig.ScreenWidth * 0.7 ; // 70%
FCKConfig.LinkBrowserWindowHeight = FCKConfig.ScreenHeight * 0.7 ; // 70%
FCKConfig.ImageBrowser = true ;
-FCKConfig.ImageBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Type=Image&Connector=../../connectors/' + _FileBrowserLanguage + '/connector.' + _FileBrowserExtension ;
+FCKConfig.ImageBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Type=Image&Connector=' + encodeURIComponent( FCKConfig.BasePath + 'filemanager/connectors/' + _FileBrowserLanguage + '/connector.' + _FileBrowserExtension ) ;
FCKConfig.ImageBrowserWindowWidth = FCKConfig.ScreenWidth * 0.7 ; // 70% ;
FCKConfig.ImageBrowserWindowHeight = FCKConfig.ScreenHeight * 0.7 ; // 70% ;
FCKConfig.FlashBrowser = true ;
-FCKConfig.FlashBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Type=Flash&Connector=../../connectors/' + _FileBrowserLanguage + '/connector.' + _FileBrowserExtension ;
+FCKConfig.FlashBrowserURL = FCKConfig.BasePath + 'filemanager/browser/default/browser.html?Type=Flash&Connector=' + encodeURIComponent( FCKConfig.BasePath + 'filemanager/connectors/' + _FileBrowserLanguage + '/connector.' + _FileBrowserExtension ) ;
FCKConfig.FlashBrowserWindowWidth = FCKConfig.ScreenWidth * 0.7 ; //70% ;
FCKConfig.FlashBrowserWindowHeight = FCKConfig.ScreenHeight * 0.7 ; //70% ;
@@ -307,5 +315,11 @@
FCKConfig.SmileyImages = ['regular_smile.gif','sad_smile.gif','wink_smile.gif','teeth_smile.gif','confused_smile.gif','tounge_smile.gif','embaressed_smile.gif','omg_smile.gif','whatchutalkingabout_smile.gif','angry_smile.gif','angel_smile.gif','shades_smile.gif','devil_smile.gif','cry_smile.gif','lightbulb.gif','thumbs_down.gif','thumbs_up.gif','heart.gif','broken_heart.gif','kiss.gif','envelope.gif'] ;
FCKConfig.SmileyColumns = 8 ;
FCKConfig.SmileyWindowWidth = 320 ;
-FCKConfig.SmileyWindowHeight = 240 ;
+FCKConfig.SmileyWindowHeight = 210 ;
+
+FCKConfig.BackgroundBlockerColor = '#ffffff' ;
+FCKConfig.BackgroundBlockerOpacity = 0.50 ;
+
+FCKConfig.MsWebBrowserControlCompat = false ;
+FCKConfig.PreventSubmitHandler = false ;
Modified: rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/fckeditor.js
==============================================================================
--- rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/fckeditor.js (original)
+++ rt/3.8/branches/fckeditor-upgrade/share/html/NoAuth/RichText/FCKeditor/fckeditor.js Thu Aug 28 18:47:59 2008
@@ -59,8 +59,8 @@
*/
FCKeditor.MinWidth = 750 ;
-FCKeditor.prototype.Version = '2.6.2' ;
-FCKeditor.prototype.VersionBuild = '19417' ;
+FCKeditor.prototype.Version = '2.6.3' ;
+FCKeditor.prototype.VersionBuild = '19836' ;
FCKeditor.prototype.Create = function()
{
More information about the Rt-commit
mailing list