Index: /CKEditor/branches/versions/3.0.x/CHANGES.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/CHANGES.html	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/CHANGES.html	(revision 4056)
@@ -1,3 +1,3 @@
-﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <!--
 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
@@ -36,7 +36,207 @@
 	</h1>
 	<h3>
+		CKEditor 3.0 (SVN)</h3>
+	<p>
+		New features:</p>
+	<ul>
+	<li><a href="http://dev.fckeditor.net/ticket/3188">#3188</a> : Introduce
+		&lt;pre&gt; formatting feature when converting from other blocks.</li>
+	</ul>
+	<p>
+		Fixed issues:</p>
+	<ul>
+		<li><a href="http://dev.fckeditor.net/ticket/2856">#2856</a> : Fixed problem with inches in Paste From Word plugin.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3929">#3929</a> : Using Paste dialog,
+			the text is pasted into current selection</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3920">#3920</a> : Mouse cursor over characters in
+			Special Character dialog now is correct</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3882">#3882</a> : Fixed an issue
+			with PasteFromWord dialog in which default values was ignored</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3859">#3859</a> : Fixed Flash dialog layout in Webkit</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3852">#3852</a> : Disabled textarea resizing in dialogs</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3831">#3831</a> : The attempt to remove the contextmenu plugin
+			will not anymore break the editor</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3781">#3781</a> : Colorbutton is now disabled in 'source' mode</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3848">#3848</a> : Fixed an issue with Webkit in witch
+			elements in the Image and Link dialogs had wrong dimensions.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3808">#3808</a> : Fixed UI Color Picker dialog size in example page.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3658">#3658</a> : Editor had horizontal scrollbar in IE6.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3819">#3819</a> : The cursor was not visible
+			when applying style to collapsed selections in Firefox 2.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3809">#3809</a> : Fixed beam cursor
+			when mouse cursor is over text-only buttons in IE.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3815">#3815</a> : Fixed an issue
+			with the form dialog in which the "enctype" attribute is outputted as "encoding".</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3785">#3785</a> : Fixed an issue
+			in CKEDITOR.tools.htmlEncode() which incorrectly outputs &amp;nbsp; in IE8.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3820">#3820</a> : Fixed an issue in
+			bullet list command in which a list created at the bottom of another gets merged to the top.
+			</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3830">#3830</a> : Table cell properties dialog
+			doesn't apply to all selected cells.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3835">#3835</a> : Element path is not refreshed
+			after click on 'newpage'; and safari is not putting focus on document also.
+			</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3821">#3821</a> : Fixed an issue with JAWS in which
+			toolbar items are read inconsistently between virtual cursor modes.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3789">#3789</a> : The &quot;src&quot; attribute
+			was getting duplicated in some situations.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3591">#3591</a> : Protecting flash related elements
+			including '&lt;object&gt;', '&lt;embed&gt;' and '&lt;param&gt;'.
+			</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3759">#3759</a> : Fixed CKEDITOR.dom.element::scrollIntoView
+			logic bug which scroll even element is inside viewport.
+			</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3773">#3773</a> : Fixed remove list will merge lines.
+			</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3829">#3829</a> : Fixed remove empty link on output data.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3730">#3730</a> : Indent is performing on the whole
+			block instead of selected lines in enterMode = BR.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3844">#3844</a> : Fixed UndoManager register keydown on obsoleted document</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3805">#3805</a> : Enabled SCAYT plugin for IE.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3834">#3834</a> : Context menu on table caption was incorrect.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3812">#3812</a> : Fixed an issue in which the editor
+			may show up empty or uneditable in IE7, 8 and Firefox 3.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3825">#3825</a> : Fixed JS error when opening spellingcheck.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3862">#3862</a> : Fixed html parser infinite loop on certain malformed
+			source code.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3639">#3639</a> : Button size was inconsistent.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3874">#3874</a> : Paste as plain text in Safari loosing lines.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3849">#3849</a> : Fixed IE8 crashes when applying lists and indenting.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3876">#3876</a> : Changed dialog checkbox and radio labels to explicit labels.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3843">#3843</a> : Fixed context submenu position in IE 6 & 7 RTL.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3864">#3864</a> : [FF]Document is not editable after inserting element on a fresh page.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3883">#3883</a> : Fixed removing inline style logic incorrect on Firefox2.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3884">#3884</a> : Empty "href" attribute was duplicated on output data.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3858">#3858</a> : Fixed the issue where toolbars
+			break up in IE6 and IE7 after the browser is resized.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3868">#3868</a> : [chrome] SCAYT toolbar options was in reversed order.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3875">#3875</a> : Fixed an issue in Safari where
+			table row/column/cell menus are not useable when table cells are selected.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3896">#3896</a> : The editing area was
+			flashing when switching forth and back to source view.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3894">#3894</a> : Fixed an issue where editor failed to initialize when using the on-demand loading way.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3903">#3903</a> : Color button plugin doesn't read config entry from editor instance correctly.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3801">#3801</a> : Comments at the start of the document was lost in IE.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3871">#3871</a> : Unable to redo when undos to the front of snapshots stack.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3909">#3909</a> : Move focus from editor into a text input control is broken.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3870">#3870</a> : The empty paragraph
+			desappears when hitting ENTER after &quot;New Page&quot;.</li>
+ 		<li><a href="http://dev.fckeditor.net/ticket/3887">#3887</a> : Fixed an issue in which the create
+ 			list command may leak outside of a selected table cell and into the rest of document.</li>
+ 		<li><a href="http://dev.fckeditor.net/ticket/3916">#3916</a> : Fixed maximize does not enlarge editor width when width is set.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3879">#3879</a> : [webkit] Color button panel had incorrect size on first open.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3839">#3839</a> : Update Scayt plugin to reflect the latest change from SpellChecker.net.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3742">#3742</a> : Fixed wrong dialog layout for dialogs without tab bar in IE RTL mode .</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3671">#3671</a> : Fixed body fixing should be applied to the real type under fake elements.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3836">#3836</a> : Fixed remove list in enterMode=BR will merge sibling text to one line.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3949">#3949</a> : Fixed enterKey within pre-formatted text introduce wrong line-break.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3878">#3878</a> : Whenever possible,
+		dialogs will not present scrollbars if the content is too big for its standard
+		size.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3782">#3782</a> : Remove empty list in table cell result in collapsed cell.</li>
+		<li>Updated the following language files:<ul>
+			<li><a href="http://dev.fckeditor.net/ticket/4183">#4183</a> : Basque;</li>
+			<li><a href="http://dev.fckeditor.net/ticket/3837">#3837</a> : Brazilian Portuguese;</li>
+			<li><a href="http://dev.fckeditor.net/ticket/4171">#4171</a> : Catalan;</li>
+			<li><a href="http://dev.fckeditor.net/ticket/4115">#4115</a> : Chinese (Simplified);</li>
+			<li><a href="http://dev.fckeditor.net/ticket/4179">#4179</a> : Chinese (Traditional);</li>
+			<li><a href="http://dev.fckeditor.net/ticket/4102">#4102</a> : Croatian;</li>
+			<li><a href="http://dev.fckeditor.net/ticket/4105">#4105</a> : French;</li>
+			<li><a href="http://dev.fckeditor.net/ticket/4104">#4104</a> : German;</li>
+			<li><a href="http://dev.fckeditor.net/ticket/4116">#4116</a> : Italian;</li>
+			<li><a href="http://dev.fckeditor.net/ticket/4091">#4091</a> : Japanese;</li>
+			<li><a href="http://dev.fckeditor.net/ticket/4120">#4120</a> : Polish;</li>
+			<li><a href="http://dev.fckeditor.net/ticket/3987">#3987</a> : Spanish;</li>
+			<li><a href="http://dev.fckeditor.net/ticket/4089">#4089</a> : Ukrainian;</li>
+			<li><a href="http://dev.fckeditor.net/ticket/4166">#4166</a> : Vietnamese.</li>
+		</ul></li>
+		<li><a href="http://dev.fckeditor.net/ticket/3984">#3984</a> : [IE]The pre-formatted style is generating error.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3946">#3946</a> : Fixed unable to hide contextmenu.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3956">#3956</a> : Fixed About dialog in Source Mode for IE.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3953">#3953</a> : Fixed keystroke for close Paste dialog.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3951">#3951</a> : Reset size and lock ratio options were not accessible in Image dialog.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3921">#3921</a> : Fixed Container scroll issue on IE7.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3940">#3940</a> : Fixed list operation doesn't stop at table.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3891">#3891</a> : [IE] Fixed 'automatic' font color doesn't work.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3972">#3972</a> : Fixed unable to remove a single empty list in document in Firefox with enterMode=BR.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3973">#3973</a> : Fixed list creation error at the end of document.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3959">#3959</a> : Pasting styled text from word result in content lost.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3793">#3793</a> : Combined images into sprites.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3783">#3783</a> : Fixed indenting command in table cells create collapsed paragraph.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3968">#3968</a> : About dialog layout was broken with IE+Standards+RTL.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3991">#3991</a> : In IE quirks, text was not visible in v2 and office2003 skins.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3983">#3983</a> : In IE, we&#39;ll now
+			silently ignore wrong toolbar definition settings which have extra commas being
+			left around.</li>
+		<li>Fixed the following test cases:<ul>
+			<li><a href="http://dev.fckeditor.net/ticket/3992">#3992</a> : core/ckeditor2.html</li>
+			<li><a href="http://dev.fckeditor.net/ticket/4138">#4138</a> : core/plugins.html</li>
+			<li><a href="http://dev.fckeditor.net/ticket/3801">#3801</a> : plugins/htmldataprocessor/htmldataprocessor.html</li>
+		</ul></li>
+		<li><a href="http://dev.fckeditor.net/ticket/3989">#3989</a> : Host page horizontal scrolling a lot when on having righ-to-left direction.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4001">#4001</a> : Create link around existing image result incorrect.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3988">#3988</a> : Destroy editor on form submit event cause error.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3994">#3994</a> : Insert horizontal line at end of document cause error.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4074">#4074</a> : Indent error with 'indentClasses' config specified.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4057">#4057</a> : Fixed anchor is lost after switch between editing modes.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3644">#3644</a> : Image dialog was missin radio lock.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4014">#4014</a> : Firefox2 had no dialog button backgrounds.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4018">#4018</a> : Firefox2 had no richcombo text visible.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4035">#4035</a> : [IE6] Paste dialog size was too small.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4049">#4049</a> : Kama skin was too wide with config.width.</li>
+		<li>The following released files now doesn't require the _source folder<ul>
+			<li><a href="http://dev.fckeditor.net/ticket/4086">#4086</a> : _samples/ui_languages.html</li>
+			<li><a href="http://dev.fckeditor.net/ticket/4093">#4093</a> : _tests/core/dom/document.html</li>
+			<li><a href="http://dev.fckeditor.net/ticket/4094">#4094</a> : Smiley plugin file</li>
+			<li><a href="http://dev.fckeditor.net/ticket/4097">#4097</a> : No undo/redo support for fontColor and backgroundColor buttons.</li>
+		</ul></li>
+		<li><a href="http://dev.fckeditor.net/ticket/4085">#4085</a> : Paste and Paste from Word dialogs were not well styled in IE+RTL.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3982">#3982</a> : Fixed enterKey on empty list item result in weird dom structure.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4101">#4101</a> : Now it is possible to close dialog before gets focus.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4075">#4075</a> : [IE6/7]Fixed apply custom inline style with "class" attribute failed.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4087">#4087</a> : [Firefox]Fixed extra blocks created on create list when full document selected.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4097">#4097</a> : No undo/redo support for fontColor and backgroundColor buttons.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4111">#4111</a> : Fixed apply block style after inline style applied on full document error.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3622">#3622</a> : Fixed shift enter with selection not deleting highlighted text.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4092">#4092</a> : [IE6] Close button was missing for dialog without multiple tabs.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4003">#4003</a> : Markup on the image dialog was disrupted when removing the border input.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4096">#4096</a> : Editor content area was pushed down in IE RTL quirks.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4112">#4112</a> : [FF] Paste dialog had scrollbars in quirks.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4118">#4118</a> : Dialog dragging was
+			occasionally behaving strangely .</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4077">#4077</a> : The toolbar combos
+			were rendering incorrectly in some languages, like Chinese.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/3622">#3622</a> : The toolbar in the v2
+			skin was wrapping improperly in some languages.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4119">#4119</a> : Unable to edit image link with image dialog.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4117">#4117</a> : Fixed dialog error when transforming image into button.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4058">#4058</a> : [FF] wysiwyg mode is sometimes not been activated.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4114">#4114</a> : [IE] RTE + IE6/IE7 Quirks = dialog mispositoned.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4123">#4123</a> : Some dialog buttons were broken in IE7 quirks.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4122">#4122</a> : [IE] The image dialog
+			was being rendered improperly when loading an image with long URL.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4144">#4144</a> : Fixed the white-spaces at the end of &lt;pre&gt; is incorrectly removed.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4143">#4143</a> : Fixed element id is lost when extracting contents from the range.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4007">#4007</a> : [IE] Source area overflow from editor chrome.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4145">#4145</a> : Fixed the on demand
+			(&quot;basic&quot;) loading model of the editor.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4139">#4139</a> : Fixed list plugin regression of [3903].</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4147">#4147</a> : Unify style text normalization logic when comparing styles.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4150">#4150</a> : Fixed enlarge list result incorrect at the inner boundary of block.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4164">#4164</a> : Now it is possible to paste text
+			in Source mode even if forcePasteAsPlainText = true.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4129">#4129</a> : [FF]Unable to remove list with Ctrl-A.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4172">#4172</a> : [Safari] The trailing
+			&lt;br&gt; was not been always added to blank lines ending with &amp;nbsp;.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4178">#4178</a> : It&#39;s now possible to
+			copy and paste Flash content among different editor instances.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4193">#4193</a> : Automatic font color produced empty span on Firefox 3.5.</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4186">#4186</a> : [FF] Fixed First open float panel cause host page scrollbar blinking.</li>
+	</ul>
+	<h3>
 		CKEditor 3.0 RC</h3>
 	<p>
-		No changelog available.</p>
+		Changelog starts at this release.</p>
 	<div id="footer">
 		<hr />
Index: /CKEditor/branches/versions/3.0.x/INSTALL.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/INSTALL.html	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/INSTALL.html	(revision 4056)
@@ -0,0 +1,92 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!--
+Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>Installation Guide - CKEditor</title>
+	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+	<style type="text/css">
+		h3
+		{
+			border-bottom: 1px solid #AAAAAA;
+		}
+		pre
+		{
+			background-color: #F9F9F9;
+			border: 1px dashed #2F6FAB;
+			padding: 1em;
+			line-height: 1.1em;
+		}
+		#footer hr
+		{
+			margin: 10px 0 15px 0;
+			height: 1px;
+			border: solid 1px gray;
+			border-bottom: none;
+		}
+		#footer p
+		{
+			margin: 0 10px 10px 10px;
+			float: left;
+		}
+		#footer #copy
+		{
+			float: right;
+		}
+	</style>
+</head>
+<body>
+	<h1>
+		CKEditor Installation Guide</h1>
+	<h3>
+		What&#39;s CKEditor?</h3>
+	<p>
+		CKEditor is a text editor to be used inside web pages. It&#39;s not a replacement
+		for desktop text editors like Word or OpenOffice, but a component to be used as
+		part of web applications and web sites.</p>
+	<h3>
+		Installation</h3>
+	<p>
+		Installing CKEditor is an easy task. Just follow these simple steps:</p>
+	<ol>
+		<li><strong>Download</strong> the latest version of the editor from our web site: <a
+			href="http://ckeditor.com">http://ckeditor.com</a>. You should have already completed
+			this step, but be sure you have the very latest version.</li>
+		<li><strong>Extract</strong> (decompress) the downloaded file into the root of your
+			web site.</li>
+	</ol>
+	<p>
+		<strong>Note:</strong> CKEditor is by default installed in the &quot;ckeditor&quot;
+		folder. You can place the files in whichever you want though.</p>
+	<h3>
+		Checking Your Installation
+	</h3>
+	<p>
+		The editor comes with a few sample pages that can be used to verify that installation
+		proceeded properly. Take a look at the <a href="_samples">_samples</a> directory.</p>
+	<p>
+		To test your installation, just call the following page at your web site:</p>
+	<pre>
+http://&lt;your site&gt;/&lt;CKEditor installation path&gt;/_samples/index.html
+
+For example:
+http://www.example.com/ckeditor/_samples/index.html</pre>
+	<h3>
+		Documentation</h3>
+	<p>
+		The full editor documentation is available online at the following address:<br />
+		<a href="http://docs.cksource.com/ckeditor">http://docs.cksource.com/ckeditor</a></p>
+	<div id="footer">
+		<hr />
+		<p>
+			CKEditor - The text editor for Internet - <a href="http://ckeditor.com/">http://ckeditor.com</a>
+		</p>
+		<p id="copy">
+			Copyright &copy; 2003-2009, <a href="http://cksource.com/">CKSource</a> - Frederico
+			Knabben. All rights reserved.
+		</p>
+	</div>
+</body>
+</html>
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/README.txt
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/README.txt	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/README.txt	(revision 4056)
@@ -0,0 +1,151 @@
+======================================================================
+
+DESCRIPTION:
+
+** NOTICE ** THIS VERSION OF THE SOFTWARE IS "BETA," MEANING IT IS IS
+NOT YET READY FOR USE IN A PRODUCTION ENVIRONEMNT. IT IS MADE
+AVAILABLE FOR PREVIEW AND TESTING PURPOSES ONLY.
+
+This is Version 2 of JsDoc Toolkit, an automatic documentation
+generation tool for JavaScript. It is written in JavaScript and is run
+from a command line (or terminal) using the Java runtime engine.
+
+Using this tool you can automatically turn JavaDoc-like comments in
+your JavaScript source code into published output files, such as HTML
+or XML.
+
+For more information, to report a bug, or to browse the technical
+documentation for this tool please visit the official JsDoc Toolkit
+project homepage at http://code.google.com/p/jsdoc-toolkit/
+
+For the most up-to-date documentation on Version 2 of JsDoc Toolkit
+see the Verion 2 wiki at http://jsdoctoolkit.org/wiki
+
+
+======================================================================
+
+REQUIREMENTS:
+
+JsDoc Toolkit is known to work with:
+java version "1.6.0_03"
+Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
+on Windows XP,
+and java version "1.5.0_13"
+Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_13-b05-241)
+on Mac OS X 10.4.
+
+Other versions of java may or may not work with JsDoc Toolkit.
+
+======================================================================
+
+USAGE:
+
+Running JsDoc Toolkit requires you to have Java installed on your
+computer. For more information see http://www.java.com/getjava/
+
+Before running the JsDoc Toolkit app you should change your current
+working directory to the jsdoc-toolkit folder. Then follow the
+examples below, or as shown on the project wiki.
+
+On a computer running Windows a valid command line to run JsDoc
+Toolkit might look like this:
+
+> java -jar jsrun.jar app\run.js -a -t=templates\jsdoc mycode.js
+
+On Mac OS X or Linux the same command would look like this:
+
+$ java -jar jsrun.jar app/run.js -a -t=templates/jsdoc mycode.js
+
+The above assumes your current working directory contains jsrun.jar,
+the "app" and "templates" subdirectories from the standard JsDoc
+Toolkit distribution and that the relative path to the code you wish
+to document is "mycode.js".
+
+The output documentation files will be saved to a new directory named
+"out" (by default) in the current directory, or if you specify a
+-d=somewhere_else option, to the somewhere_else directory.
+
+For help (usage notes) enter this on the command line:
+
+$ java -jar jsrun.jar app/run.js --help
+
+More information about the various command line options used by JsDoc
+Toolkit are available on the project wiki.
+
+======================================================================
+
+TESTING:
+
+To run the suite of unit tests included with JsDoc Toolkit enter this
+on the command line:
+
+$ java -jar jsrun.jar app/run.js -T
+
+To see a dump of the internal data structure that JsDoc Toolkit has
+built from your source files use this command:
+
+$ java -jar jsrun.jar app/run.js mycode.js -Z
+
+
+======================================================================
+
+LICENSE:
+
+JSDoc.pm
+
+This project is based on the JSDoc.pm tool, created by Michael
+Mathews and Gabriel Reid. More information on JsDoc.pm can
+be found on the JSDoc.pm homepage: http://jsdoc.sourceforge.net/
+
+Complete documentation on JsDoc Toolkit can be found on the project
+wiki at http://code.google.com/p/jsdoc-toolkit/w/list
+
+Rhino
+
+Rhino (JavaScript in Java) is open source and licensed by Mozilla
+under the MPL 1.1 or later/GPL 2.0 or later licenses, the text of
+which is available at http://www.mozilla.org/MPL/
+
+You can obtain the source code for Rhino from the Mozilla web site at
+http://www.mozilla.org/rhino/download.html
+
+JsDoc Toolkit is a larger work that uses the Rhino JavaScript engine
+but is not derived from it in any way. The Rhino library is used 
+without modification and without any claims whatsoever.
+
+The Rhino Debugger
+
+You can obtain more information about the Rhino Debugger from the 
+Mozilla web site at http://www.mozilla.org/rhino/debugger.html
+
+JsDoc Toolkit is a larger work that uses the Rhino Debugger but
+is not derived from it in any way. The Rhino Debugger is used
+without modification and without any claims whatsoever.
+
+JsDoc Toolkit
+
+All code specific to JsDoc Toolkit are free, open source and licensed
+for use under the X11/MIT License.
+
+JsDoc Toolkit is Copyright (c)2008 Michael Mathews <micmath@gmail.com>
+
+This program is free software; you can redistribute it and/or
+modify it under the terms below.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions: The above copyright notice and this
+permission notice must be included in all copies or substantial
+portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame.js	(revision 4056)
@@ -0,0 +1,33 @@
+IO.include("frame/Opt.js");
+IO.include("frame/Chain.js");
+IO.include("frame/Link.js");
+IO.include("frame/String.js");
+IO.include("frame/Hash.js");
+IO.include("frame/Namespace.js");
+IO.include("frame/Reflection.js");
+
+/** A few helper functions to make life a little easier. */
+
+function defined(o) {
+	return (o !== undefined);
+}
+
+function copy(o) { // todo check for circular refs
+	if (o == null || typeof(o) != 'object') return o;
+	var c = new o.constructor();
+	for(var p in o)	c[p] = copy(o[p]);
+	return c;
+}
+
+function isUnique(arr) {
+	var l = arr.length;
+	for(var i = 0; i < l; i++ ) {
+		if (arr.lastIndexOf(arr[i]) > i) return false;
+	}
+	return true;
+}
+
+/** Returns the given string with all regex meta characters backslashed. */
+RegExp.escapeMeta = function(str) {
+	return str.replace(/([$^\\\/()|?+*\[\]{}.-])/g, "\\$1");
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Chain.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Chain.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Chain.js	(revision 4056)
@@ -0,0 +1,102 @@
+/**@constructor*/
+function ChainNode(object, link) {
+	this.value = object;
+	this.link = link; // describes this node's relationship to the previous node
+}
+
+/**@constructor*/
+function Chain(valueLinks) {
+	this.nodes = [];
+	this.cursor = -1;
+	
+	if (valueLinks && valueLinks.length > 0) {
+		this.push(valueLinks[0], "//");
+		for (var i = 1, l = valueLinks.length; i < l; i+=2) {
+			this.push(valueLinks[i+1], valueLinks[i]);
+		}
+	}
+}
+
+Chain.prototype.push = function(o, link) {
+	if (this.nodes.length > 0 && link) this.nodes.push(new ChainNode(o, link));
+	else this.nodes.push(new ChainNode(o));
+}
+
+Chain.prototype.unshift = function(o, link) {
+	if (this.nodes.length > 0 && link) this.nodes[0].link = link;
+	this.nodes.unshift(new ChainNode(o));
+	this.cursor++;
+}
+
+Chain.prototype.get = function() {
+	if (this.cursor < 0 || this.cursor > this.nodes.length-1) return null;
+	return this.nodes[this.cursor];
+}
+
+Chain.prototype.first = function() {
+	this.cursor = 0;
+	return this.get();
+}
+
+Chain.prototype.last = function() {
+	this.cursor = this.nodes.length-1;
+	return this.get();
+}
+
+Chain.prototype.next = function() {
+	this.cursor++;
+	return this.get();
+}
+
+Chain.prototype.prev = function() {
+	this.cursor--;
+	return this.get();
+}
+
+Chain.prototype.toString = function() {
+	var string = "";
+	for (var i = 0, l = this.nodes.length; i < l; i++) {
+		if (this.nodes[i].link) string += " -("+this.nodes[i].link+")-> ";
+		string += this.nodes[i].value.toString();
+	}
+	return string;
+}
+
+Chain.prototype.joinLeft = function() {
+	var result = "";
+	for (var i = 0, l = this.cursor; i < l; i++) {
+		if (result && this.nodes[i].link) result += this.nodes[i].link;
+		result += this.nodes[i].value.toString();
+	}
+	return result;
+}
+
+
+/* USAGE:
+
+var path = "one/two/three.four/five-six";
+var pathChain = new Chain(path.split(/([\/.-])/));
+print(pathChain);
+
+var lineage = new Chain();
+lineage.push("Port");
+lineage.push("Les", "son");
+lineage.push("Dawn", "daughter");
+lineage.unshift("Purdie", "son");
+
+print(lineage);
+
+// walk left
+for (var node = lineage.last(); node !== null; node = lineage.prev()) {
+	print("< "+node.value);
+}
+
+// walk right
+var node = lineage.first()
+while (node !== null) {
+	print(node.value);
+	node = lineage.next();
+	if (node && node.link) print("had a "+node.link+" named");
+}
+
+*/
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Dumper.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Dumper.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Dumper.js	(revision 4056)
@@ -0,0 +1,144 @@
+/**
+ * @class
+<pre>
+This is a lightly modified version of Kevin Jones' JavaScript
+library Data.Dump. To download the original visit:
+    <a href="http://openjsan.org/doc/k/ke/kevinj/Data/Dump/">http://openjsan.org/doc/k/ke/kevinj/Data/Dump/</a>
+
+AUTHORS
+
+The Data.Dump JavaScript module is written by Kevin Jones 
+(kevinj@cpan.org), based on Data::Dump by Gisle Aas (gisle@aas.no),
+based on Data::Dumper by Gurusamy Sarathy (gsar@umich.edu).
+
+COPYRIGHT
+
+Copyright 2007 Kevin Jones. Copyright 1998-2000,2003-2004 Gisle Aas.
+Copyright 1996-1998 Gurusamy Sarathy.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the Perl Artistic License
+
+See http://www.perl.com/perl/misc/Artistic.html
+</pre>
+ * @static
+ */
+Dumper = {
+	/** @param [...] The objects to dump. */
+	dump: function () {
+	    if (arguments.length > 1)
+	        return this._dump(arguments);
+	    else if (arguments.length == 1)
+	        return this._dump(arguments[0]);
+	    else
+	        return "()";
+	},
+	
+	_dump: function (obj) {
+		if (typeof obj == 'undefined') return 'undefined';
+		var out;
+		if (obj.serialize) { return obj.serialize(); }
+		var type = this._typeof(obj);
+		if (obj.circularReference) obj.circularReference++;
+		switch (type) {
+			case 'circular':
+				out = "{ //circularReference\n}";
+				break;
+			case 'object':
+				var pairs = new Array;
+				
+				for (var prop in obj) {
+					if (prop != "circularReference" && obj.hasOwnProperty(prop)) { //hide inherited properties
+						pairs.push(prop + ': ' + this._dump(obj[prop]));
+					}
+				}
+	
+				out = '{' + this._format_list(pairs) + '}';
+				break;
+	
+			case 'string':
+				for (var prop in Dumper.ESC) {
+					if (Dumper.ESC.hasOwnProperty(prop)) {
+						obj = obj.replace(prop, Dumper.ESC[prop]);
+					}
+				}
+	
+			// Escape UTF-8 Strings
+				if (obj.match(/^[\x00-\x7f]*$/)) {
+					out = '"' + obj.replace(/\"/g, "\\\"").replace(/([\n\r]+)/g, "\\$1") + '"';
+				}
+				else {
+					out = "unescape('"+escape(obj)+"')";
+				}
+				break;
+	
+			case 'array':
+				var elems = new Array;
+	
+				for (var i=0; i<obj.length; i++) {
+					elems.push( this._dump(obj[i]) );
+				}
+	
+				out = '[' + this._format_list(elems) + ']';
+				break;
+	
+			case 'date':
+			// firefox returns GMT strings from toUTCString()...
+			var utc_string = obj.toUTCString().replace(/GMT/,'UTC');
+				out = 'new Date("' + utc_string + '")';
+				break;
+	
+			case 'element':
+				// DOM element
+				out = this._dump_dom(obj);
+				break;
+		
+				default:
+					out = obj;
+		}
+	
+		out = String(out).replace(/\n/g, '\n    ');
+		out = out.replace(/\n    (.*)$/,"\n$1");
+	
+		return out;
+	},
+	
+	_format_list: function (list) {
+		if (!list.length) return '';
+		var nl = list.toString().length > 60 ? '\n' : ' ';
+		return nl + list.join(',' + nl) + nl;
+    },
+    
+    _typeof: function (obj) {
+    	if (obj && obj.circularReference && obj.circularReference > 1) return 'circular';
+		if (Array.prototype.isPrototypeOf(obj)) return 'array';
+		if (Date.prototype.isPrototypeOf(obj)) return 'date';
+		if (typeof obj.nodeType != 'undefined') return 'element';
+		return typeof(obj);
+	},
+	
+	_dump_dom: function (obj) {
+		return '"' + Dumper.nodeTypes[obj.nodeType] + '"';
+	}
+};
+
+Dumper.ESC = {
+    "\t": "\\t",
+    "\n": "\\n",
+    "\f": "\\f"
+};
+
+Dumper.nodeTypes = {
+    1: "ELEMENT_NODE",
+    2: "ATTRIBUTE_NODE",
+    3: "TEXT_NODE",
+    4: "CDATA_SECTION_NODE",
+    5: "ENTITY_REFERENCE_NODE",
+    6: "ENTITY_NODE",
+    7: "PROCESSING_INSTRUCTION_NODE",
+    8: "COMMENT_NODE",
+    9: "DOCUMENT_NODE",
+    10: "DOCUMENT_TYPE_NODE",
+    11: "DOCUMENT_FRAGMENT_NODE",
+    12: "NOTATION_NODE"
+};
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Hash.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Hash.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Hash.js	(revision 4056)
@@ -0,0 +1,47 @@
+/**@constructor*/
+function Hash() {
+	this.reset();
+}
+
+Hash.prototype.reset = function() {
+	this.elements = {};
+}
+
+Hash.prototype.put = function() {
+	for (var i = 0, l = arguments.length; i < l; i++) {
+		this.elements[arguments[i]] = arguments[++i];
+	}
+}
+
+Hash.prototype.has = function(key) {
+	return this.elements.hasOwnProperty(key);
+}
+
+Hash.prototype.get = function(key) {
+	return (this.has(key)) ? this.elements[key] : undefined;
+}
+
+Hash.prototype.drop = function(key) {
+	if (this.has(key)) {
+		delete this.elements[key];
+	}
+}
+
+Hash.prototype.rename = function(oldKey, newKey) {
+	if (oldKey != newKey && this.has(oldKey)) {
+		this.elements[newKey] = this.elements[oldKey];
+		delete this.elements[oldKey];
+	}
+}
+
+Hash.prototype.keys = function() {
+	var keys = [];
+	for (var key in this.elements) if (this.has(key)) keys.push(key);
+	return keys;
+}
+
+Hash.prototype.values = function() {
+	var values = [];
+	for (var key in this.elements) if (this.has(key)) values.push(this.get(key));
+	return values;
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Link.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Link.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Link.js	(revision 4056)
@@ -0,0 +1,142 @@
+/** Handle the creation of HTML links to documented symbols.
+	@constructor
+*/
+function Link() {
+	this.alias = "";
+	this.src = "";
+	this.file = "";
+	this.text = "";
+	this.innerName = "";
+	this.classLink = false;
+	this.targetName = "";
+	
+	this.target = function(targetName) {
+		if (defined(targetName)) this.targetName = targetName;
+		return this;
+	}
+	this.inner = function(inner) {
+		if (defined(inner)) this.innerName = inner;
+		return this;
+	}
+	this.withText = function(text) {
+		if (defined(text)) this.text = text;
+		return this;
+	}
+	this.toSrc = function(filename) {
+		if (defined(filename)) this.src = filename;
+		return this;
+	}
+	this.toSymbol = function(alias) {
+		if (defined(alias)) this.alias = new String(alias);
+		return this;
+	}
+	this.toClass = function(alias) {
+		this.classLink = true;
+		return this.toSymbol(alias);
+	}
+	this.toFile = function(file) {
+		if (defined(file)) this.file = file;
+		return this;
+	}
+	
+	this.toString = function() {
+		var linkString;
+		var thisLink = this;
+
+		if (this.alias) {
+			linkString = this.alias.replace(/(^|[^a-z$0-9_#.:^-])([|a-z$0-9_#.:^-]+)($|[^a-z$0-9_#.:^-])/i,
+				function(match, prematch, symbolName, postmatch) {
+					var symbolNames = symbolName.split("|");
+					var links = [];
+					for (var i = 0, l = symbolNames.length; i < l; i++) {
+						thisLink.alias = symbolNames[i];
+						links.push(thisLink._makeSymbolLink(symbolNames[i]));
+					}
+					return prematch+links.join("|")+postmatch;
+				}
+			);
+		}
+		else if (this.src) {
+			linkString = thisLink._makeSrcLink(this.src);
+		}
+		else if (this.file) {
+			linkString = thisLink._makeFileLink(this.file);
+		}
+
+		return linkString;
+	}
+}
+
+/** prefixed for hashes */
+Link.hashPrefix = "";
+
+/** Appended to the front of relative link paths. */
+Link.base = "";
+
+Link.symbolNameToLinkName = function(symbol) {
+	var linker = "";
+	if (symbol.isStatic) linker = ".";
+	else if (symbol.isInner) linker = "-";
+	
+	return Link.hashPrefix+linker+symbol.name;
+}
+
+/** Create a link to a snother symbol. */
+Link.prototype._makeSymbolLink = function(alias) {
+	var linkBase = Link.base+publish.conf.symbolsDir;
+	var linkTo = Link.symbolSet.getSymbol(alias);
+	var linkPath;
+	var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
+
+	// is it an internal link?
+	if (alias.charAt(0) == "#") var linkPath = alias;
+	
+	// if there is no symbol by that name just return the name unaltered
+	else if (!linkTo) return this.text || alias;
+	
+	// it's a symbol in another file
+	else {
+
+		if (!linkTo.is("CONSTRUCTOR") && !linkTo.isNamespace) { // it's a method or property
+			linkPath = escape(linkTo.memberOf) || "_global_";
+			linkPath += publish.conf.ext + "#" + Link.symbolNameToLinkName(linkTo);
+		}
+		else {
+			linkPath = escape(linkTo.alias);
+			linkPath += publish.conf.ext + (this.classLink? "":"#" + Link.hashPrefix + "constructor");
+		}
+		linkPath = linkBase + linkPath
+	}
+	
+	var linkText = this.text || alias;
+	
+	var link = {linkPath: linkPath, linkText: linkText};
+	
+	if (typeof JSDOC.PluginManager != "undefined") {
+		JSDOC.PluginManager.run("onSymbolLink", link);
+	}
+	
+	return "<a href=\""+link.linkPath+"\""+target+">"+link.linkText+"</a>";
+}
+
+/** Create a link to a source file. */
+Link.prototype._makeSrcLink = function(srcFilePath) {
+	var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
+		
+	// transform filepath into a filename
+	var srcFile = srcFilePath.replace(/\.\.?[\\\/]/g, "").replace(/[:\\\/]/g, "_");
+	var outFilePath = Link.base + publish.conf.srcDir + srcFile + publish.conf.ext;
+
+	if (!this.text) this.text = FilePath.fileName(srcFilePath);
+	return "<a href=\""+outFilePath+"\""+target+">"+this.text+"</a>";
+}
+
+/** Create a link to a source file. */
+Link.prototype._makeFileLink = function(filePath) {
+	var target = (this.targetName)? " target=\""+this.targetName+"\"" : "";
+		
+	var outFilePath =  Link.base + filePath;
+
+	if (!this.text) this.text = filePath;
+	return "<a href=\""+outFilePath+"\""+target+">"+this.text+"</a>";
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Namespace.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Namespace.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Namespace.js	(revision 4056)
@@ -0,0 +1,10 @@
+_global_ = this;
+
+function Namespace(name, f) {
+	var n = name.split(".");
+	for (var o = _global_, i = 0, l = n.length; i < l; i++) {
+		o = o[n[i]] = o[n[i]] || {};
+	}
+	
+	if (f) f();
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Opt.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Opt.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Opt.js	(revision 4056)
@@ -0,0 +1,134 @@
+/** @namespace */
+Opt = {
+	/**
+	 * Get commandline option values.
+	 * @param {Array} args Commandline arguments. Like ["-a=xml", "-b", "--class=new", "--debug"]
+	 * @param {object} optNames Map short names to long names. Like {a:"accept", b:"backtrace", c:"class", d:"debug"}.
+	 * @return {object} Short names and values. Like {a:"xml", b:true, c:"new", d:true}
+	 */
+	get: function(args, optNames) {
+		var opt = {"_": []}; // the unnamed option allows multiple values
+		for (var i = 0; i < args.length; i++) {
+			var arg = new String(args[i]);
+			var name;
+			var value;
+			if (arg.charAt(0) == "-") {
+				if (arg.charAt(1) == "-") { // it's a longname like --foo
+					arg = arg.substring(2);
+					var m = arg.split("=");
+					name = m.shift();
+					value = m.shift();
+					if (typeof value == "undefined") value = true;
+					
+					for (var n in optNames) { // convert it to a shortname
+						if (name == optNames[n]) {
+							name = n;
+						}
+					}
+				}
+				else { // it's a shortname like -f
+					arg = arg.substring(1);
+					var m = arg.split("=");
+					name = m.shift();
+					value = m.shift();
+					if (typeof value == "undefined") value = true;
+					
+					for (var n in optNames) { // find the matching key
+						if (name == n || name+'[]' == n) {
+							name = n;
+							break;
+						}
+					}
+				}
+				if (name.match(/(.+)\[\]$/)) { // it's an array type like n[]
+					name = RegExp.$1;
+					if (!opt[name]) opt[name] = [];
+				}
+				
+				if (opt[name] && opt[name].push) {
+					opt[name].push(value);
+				}
+				else {
+					opt[name] = value;
+				}
+			}
+			else { // not associated with any optname
+				opt._.push(args[i]);
+			}
+		}
+		return opt;
+	}
+}
+
+/*t:
+	plan(11, "Testing Opt.");
+	
+	is(
+		typeof Opt,
+		"object",
+		"Opt is an object."
+	);
+	
+	is(
+		typeof Opt.get,
+		"function",
+		"Opt.get is a function."
+	);
+	
+	var optNames = {a:"accept", b:"backtrace", c:"class", d:"debug", "e[]":"exceptions"};
+	var t_options = Opt.get(["-a=xml", "-b", "--class=new", "--debug", "-e=one", "-e=two", "foo", "bar"], optNames);
+	
+	is(
+		t_options.a,
+		"xml",
+		"an option defined with a short name can be accessed by its short name."
+	);
+	
+	is(
+		t_options.b,
+		true,
+		"an option defined with a short name and no value are true."
+	);
+	
+	is(
+		t_options.c,
+		"new",
+		"an option defined with a long name can be accessed by its short name."
+	);
+	
+	is(
+		t_options.d,
+		true,
+		"an option defined with a long name and no value are true."
+	);
+	
+	is(
+		typeof t_options.e,
+		"object",
+		"an option that can accept multiple values is defined."
+	);
+	
+	is(
+		t_options.e.length,
+		2,
+		"an option that can accept multiple values can have more than one value."
+	);
+	
+	is(
+		t_options.e[1],
+		"two",
+		"an option that can accept multiple values can be accessed as an array."
+	);
+	
+	is(
+		typeof t_options._,
+		"object",
+		"the property '_' is defined for unnamed options."
+	);
+	
+	is(
+		t_options._[0],
+		"foo",
+		"the property '_' can be accessed as an array."
+	);
+ */
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Reflection.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Reflection.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Reflection.js	(revision 4056)
@@ -0,0 +1,26 @@
+/**@constructor*/
+function Reflection(obj) {
+	this.obj = obj;
+}
+
+Reflection.prototype.getConstructorName = function() {
+	if (this.obj.constructor.name) return this.obj.constructor.name;
+	var src = this.obj.constructor.toSource();
+	var name = src.substring(name.indexOf("function")+8, src.indexOf('(')).replace(/ /g,'');
+	return name;
+}
+
+Reflection.prototype.getMethod = function(name) {
+	for (var p in this.obj) {
+		if (p == name && typeof(this.obj[p]) == "function") return this.obj[p];
+	}
+	return null;
+}
+
+Reflection.prototype.getParameterNames = function() {
+	var src = this.obj.toSource();
+	src = src.substring(
+		src.indexOf("(", 8)+1, src.indexOf(")")
+	);
+	return src.split(/, ?/);
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/String.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/String.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/String.js	(revision 4056)
@@ -0,0 +1,93 @@
+/**
+	@name String
+	@class Additions to the core string object.
+*/
+
+/** @author Steven Levithan, released as public domain. */
+String.prototype.trim = function() {
+	var str = this.replace(/^\s+/, '');
+	for (var i = str.length - 1; i >= 0; i--) {
+		if (/\S/.test(str.charAt(i))) {
+			str = str.substring(0, i + 1);
+			break;
+		}
+	}
+	return str;
+}
+/*t:
+	plan(6, "Testing String.prototype.trim.");
+	
+	var s = "   a bc   ".trim();
+	is(s, "a bc", "multiple spaces front and back are trimmed.");
+
+	s = "a bc\n\n".trim();
+	is(s, "a bc", "newlines only in back are trimmed.");
+	
+	s = "\ta bc".trim();
+	is(s, "a bc", "tabs only in front are trimmed.");
+	
+	s = "\n \t".trim();
+	is(s, "", "an all-space string is trimmed to empty.");
+	
+	s = "a b\nc".trim();
+	is(s, "a b\nc", "a string with no spaces in front or back is trimmed to itself.");
+	
+	s = "".trim();
+	is(s, "", "an empty string is trimmed to empty.");
+
+*/
+
+String.prototype.balance = function(open, close) {
+	var i = 0;
+	while (this.charAt(i) != open) {
+		if (i == this.length) return [-1, -1];
+		i++;
+	}
+	
+	var j = i+1;
+	var balance = 1;
+	while (j < this.length) {
+		if (this.charAt(j) == open) balance++;
+		if (this.charAt(j) == close) balance--;
+		if (balance == 0) break;
+		j++;
+		if (j == this.length) return [-1, -1];
+	}
+	
+	return [i, j];
+}
+/*t:
+	plan(16, "Testing String.prototype.balance.");
+	
+	var s = "{abc}".balance("{","}");
+	is(s[0], 0, "opener in first is found.");
+	is(s[1], 4, "closer in last is found.");
+	
+	s = "ab{c}de".balance("{","}");
+	is(s[0], 2, "opener in middle is found.");
+	is(s[1], 4, "closer in middle is found.");
+	
+	s = "a{b{c}de}f".balance("{","}");
+	is(s[0], 1, "nested opener is found.");
+	is(s[1], 8, "nested closer is found.");
+	
+	s = "{}".balance("{","}");
+	is(s[0], 0, "opener with no content is found.");
+	is(s[1], 1, "closer with no content is found.");
+	
+	s = "".balance("{","}");
+	is(s[0], -1, "empty string opener is -1.");
+	is(s[1], -1, "empty string closer is -1.");
+	
+	s = "{abc".balance("{","}");
+	is(s[0], -1, "opener with no closer returns -1.");
+	is(s[1], -1, "no closer returns -1.");
+	
+	s = "abc".balance("{","}");
+	is(s[0], -1, "no opener or closer returns -1 for opener.");
+	is(s[1], -1, "no opener or closer returns -1 for closer.");
+	
+	s = "a<bc}de".balance("<","}");
+	is(s[0], 1, "unmatching opener is found.");
+	is(s[1], 4, "unmatching closer is found.");
+*/
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Testrun.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Testrun.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/frame/Testrun.js	(revision 4056)
@@ -0,0 +1,129 @@
+/**
+ * @fileOverview
+ * @name JsTestrun
+ * @author Michael Mathews micmath@gmail.com
+ * @url $HeadURL: http://jsdoc-toolkit.googlecode.com/svn/tags/jsdoc_toolkit-2.0.2/jsdoc-toolkit/app/frame/Testrun.js $
+ * @revision $Id: Testrun.js 418 2008-01-15 21:40:33Z micmath $
+ * @license <a href="http://en.wikipedia.org/wiki/MIT_License">X11/MIT License</a>
+ *          (See the accompanying README file for full details.)
+ */
+ 
+/**
+	Yet another unit testing tool for JavaScript.
+	@author Michael Mathews <a href="mailto:micmath@gmail.com">micmath@gmail.com</a>
+	@param {object} testCases Properties are testcase names, values are functions to execute as tests.
+*/
+function testrun(testCases) {
+	var ran = 0;
+	for (t in testCases) {
+		var result = testCases[t]();
+		ran++;
+	}
+	
+	return testrun.reportOut+"-------------------------------\n"+((testrun.fails>0)? ":( Failed "+testrun.fails+"/" : ":) Passed all ")+testrun.count+" test"+((testrun.count == 1)? "":"s")+".\n";
+}
+
+
+testrun.count = 0;
+testrun.current = null;
+testrun.passes = 0;
+testrun.fails = 0;
+testrun.reportOut = "";
+
+/** @private */
+testrun.report = function(text) {
+	testrun.reportOut += text+"\n";
+}
+
+/**
+	Check if test evaluates to true.
+	@param {string} test To be evaluated.
+	@param {string} message Optional. To be displayed in the report.
+	@return {boolean} True if the string test evaluates to true.
+*/
+ok = function(test, message) {
+	testrun.count++;
+	
+	var result;
+	try {
+		result = eval(test);
+		
+		if (result) {
+			testrun.passes++;
+			testrun.report("    OK "+testrun.count+" - "+((message != null)? message : ""));
+		}
+		else {
+			testrun.fails++;
+			testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
+		}
+	}
+	catch(e) {
+		testrun.fails++
+		testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
+
+	}
+}
+
+/**
+	Check if test is same as expected.
+	@param {string} test To be evaluated.
+	@param {string} expected
+	@param {string} message Optional. To be displayed in the report. 
+	@return {boolean} True if (test == expected). Note that the comparison is not a strict equality check.
+*/
+is = function(test, expected, message) {
+	testrun.count++;
+	
+	var result;
+	try {
+		result = eval(test);
+		
+		if (result == expected) {
+			testrun.passes++
+			testrun.report("    OK "+testrun.count+" - "+((message != null)? message : ""));
+		}
+		else {
+			testrun.fails++
+			testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
+			testrun.report("expected: "+expected);
+			testrun.report("     got: "+result);
+		}
+	}
+	catch(e) {
+		testrun.fails++
+		testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
+		testrun.report("expected: "+expected);
+		testrun.report("     got: "+result);}
+}
+
+/**
+	Check if test matches pattern.
+	@param {string} test To be evaluated.
+	@param {string} pattern Used to create a RegExp.
+	@param {string} message Optional. To be displayed in the report.
+	@return {boolean} True if test matches pattern.
+*/
+like = function(test, pattern, message) {
+	testrun.count++;
+
+	var result;
+	try {
+		result = eval(test);
+		var rgx = new RegExp(pattern);
+		
+		if (rgx.test(result)) {
+			testrun.passes++
+			testrun.report("    OK "+testrun.count+" - "+((message != null)? message : ""));
+		}
+		else {
+			testrun.fails++
+			testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
+			testrun.report("       this: "+result);
+			testrun.report("is not like: "+pattern);
+		}
+	}
+	catch(e) {
+		testrun.fails++
+		testrun.report("NOT OK "+testrun.count+" - "+((message != null)? message : ""));
+	}
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/handlers/FOODOC.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/handlers/FOODOC.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/handlers/FOODOC.js	(revision 4056)
@@ -0,0 +1,26 @@
+/**
+   This is the main container for the FOODOC handler.
+   @namespace
+*/
+FOODOC = {
+};
+
+/** The current version string of this application. */
+FOODOC.VERSION = "1.0";
+
+FOODOC.handle = function(srcFile, src) {
+	LOG.inform("Handling file '" + srcFile + "'");
+	
+	return [
+		new JSDOC.Symbol(
+			"foo",
+			[],
+			"VIRTUAL",
+			new JSDOC.DocComment("/** This is a foo. */")
+		)
+	];
+};
+
+FOODOC.publish = function(symbolgroup) {
+	LOG.inform("Publishing symbolgroup.");
+};
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/handlers/XMLDOC.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/handlers/XMLDOC.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/handlers/XMLDOC.js	(revision 4056)
@@ -0,0 +1,26 @@
+/**
+ * This is the main container for the XMLDOC handler.
+ * @namespace
+ * @author Brett Fattori (bfattori@fry.com)
+ * @version $Revision: 498 $
+ */
+XMLDOC = {
+	
+};
+
+/** The current version string of this application. */
+XMLDOC.VERSION = "1.0";
+
+/** Include the library necessary to handle XML files */
+IO.includeDir("handlers/XMLDOC/");
+
+/**
+ * @type Symbol[]
+ */
+XMLDOC.handle = function(srcFile, src) {
+	
+};
+
+XMLDOC.publish = function(symbolgroup) {
+	
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js	(revision 4056)
@@ -0,0 +1,159 @@
+LOG.inform("XMLDOC.DomReader loaded");
+
+XMLDOC.DomReader = function(root) {
+
+   this.dom = root;
+
+   /**
+    * The current node the reader is on
+    */
+   this.node = root;
+
+   /**
+    * Get the current node the reader is on
+    * @type XMLDOC.Parser.node
+    */
+   XMLDOC.DomReader.prototype.getNode = function() {
+      return this.node;
+   };
+
+   /**
+    * Set the node the reader should be positioned on.
+    * @param node {XMLDOC.Parser.node}
+    */
+   XMLDOC.DomReader.prototype.setNode = function(node) {
+      this.node = node;
+   };
+
+   /**
+    * A helper method to make sure the current node will
+    * never return null, unless null is passed as the root.
+    * @param step {String} An expression to evaluate - should return a node or null
+    */
+   XMLDOC.DomReader.prototype.navigate = function(step) {
+      var n;
+      if ((n = step) != null)
+      {
+         this.node = n;
+         return this.node;
+      }
+      return null;
+   };
+
+   /**
+    * Get the root node of the current node's document.
+    */
+   XMLDOC.DomReader.prototype.root = function() {
+      this.navigate(this.dom);
+   };
+
+   /**
+    * Get the parent of the current node.
+    */
+   XMLDOC.DomReader.prototype.parent = function() {
+      return this.navigate(this.node.parentNode());
+   };
+
+   /**
+    * Get the first child of the current node.
+    */
+   XMLDOC.DomReader.prototype.firstChild = function() {
+      return this.navigate(this.node.firstChild());
+   };
+
+   /**
+    * Get the last child of the current node.
+    */
+   XMLDOC.DomReader.prototype.lastChild = function() {
+      return this.navigate(this.node.lastChild());
+   };
+
+   /**
+    * Get the next sibling of the current node.
+    */
+   XMLDOC.DomReader.prototype.nextSibling = function() {
+      return this.navigate(this.node.nextSibling());
+   };
+
+   /**
+    * Get the previous sibling of the current node.
+    */
+   XMLDOC.DomReader.prototype.prevSibling = function() {
+      return this.navigate(this.node.prevSibling());
+   };
+
+   //===============================================================================================
+   // Support methods
+
+   /**
+    * Walk the tree starting with the current node, calling the plug-in for
+    * each node visited.  Each time the plug-in is called, the DomReader
+    * is passed as the only parameter.  Use the {@link XMLDOC.DomReader#getNode} method
+    * to access the current node.   <i>This method uses a depth first traversal pattern.</i>
+    *
+    * @param srcFile {String} The source file being evaluated
+    */
+   XMLDOC.DomReader.prototype.getSymbols = function(srcFile)
+   {
+      XMLDOC.DomReader.symbols = [];
+      XMLDOC.DomReader.currentFile = srcFile;
+      JSDOC.Symbol.srcFile = (srcFile || "");
+
+      if (defined(JSDOC.PluginManager)) {
+         JSDOC.PluginManager.run("onDomGetSymbols", this);
+      }
+
+      return XMLDOC.DomReader.symbols;
+   };
+
+   /**
+    * Find the node with the given name using a depth first traversal.
+    * Does not modify the DomReader's current node.
+    *
+    * @param name {String} The name of the node to find
+    * @return the node that was found, or null if not found
+    */
+   XMLDOC.DomReader.prototype.findNode = function(name)
+   {
+      var findNode = null;
+
+      // Start at the current node and move into the subtree,
+      // looking for the node with the given name
+      function deeper(node, find)
+      {
+         var look = null;
+
+         if (node) {
+            if (node.name == find)
+            {
+               return node;
+            }
+
+            if (node.firstChild())
+            {
+               look = deeper(node.firstChild(), find);
+            }
+
+            if (!look && node.nextSibling())
+            {
+               look = deeper(node.nextSibling(), find);
+            }
+         }
+
+         return look;
+      }
+
+      return deeper(this.getNode().firstChild(), name);
+   };
+
+   /**
+    * Find the next node with the given name using a depth first traversal.
+    *
+    * @param name {String} The name of the node to find
+    */
+   XMLDOC.DomReader.prototype.findPreviousNode = function(name)
+   {
+   };
+
+};
+
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js	(revision 4056)
@@ -0,0 +1,16 @@
+LOG.inform("XMLDOC.symbolize loaded");
+
+/**
+ * Convert the source file to a set of symbols
+ */
+XMLDOC.symbolize = function(srcFile, src) {
+
+   LOG.inform("Symbolizing file '" + srcFile + "'");
+
+   // XML files already have a defined structure, so we don't need to
+   // do anything but parse them.  The DOM reader can create a symbol
+   // table from the parsed XML.
+   var dr = new XMLDOC.DomReader(XMLDOC.Parser.parse(src));
+   return dr.getSymbols(srcFile);
+
+};
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js	(revision 4056)
@@ -0,0 +1,292 @@
+LOG.inform("XMLDOC.Parser loaded");
+
+/**
+ * XML Parser object.  Returns an {@link #XMLDOC.Parser.node} which is
+ * the root element of the parsed document.
+ * <p/>
+ * By default, this parser will only handle well formed XML.  To
+ * allow the parser to handle HTML, set the <tt>XMLDOC.Parser.strictMode</tt>
+ * variable to <tt>false</tt> before calling <tt>XMLDOC.Parser.parse()</tt>.
+ * <p/>
+ * <i>Note: If you pass poorly formed XML, it will cause the parser to throw
+ * an exception.</i>
+ *
+ * @author Brett Fattori (bfattori@fry.com)
+ * @author $Author: micmath $
+ * @version $Revision: 497 $
+ */
+XMLDOC.Parser = {};
+
+/**
+ * Strict mode setting.  Setting this to false allows HTML-style source to
+ * be parsed.  Normally, well formed XML has defined end tags, or empty tags
+ * are properly formed.  Default: <tt>true</tt>
+ * @type Boolean
+ */
+XMLDOC.Parser.strictMode = true;
+
+/**
+ * A node in an XML Document.  Node types are ROOT, ELEMENT, COMMENT, PI, and TEXT.
+ * @param parent {XMLDOC.Parser.node} The parent node
+ * @param name {String} The node name
+ * @param type {String} One of the types
+ */
+XMLDOC.Parser.node = function(parent, name, type)
+{
+   this.name = name;
+   this.type = type || "ELEMENT";
+   this.parent = parent;
+   this.charData = "";
+   this.attrs = {};
+   this.nodes = [];
+   this.cPtr = 0;
+
+   XMLDOC.Parser.node.prototype.getAttributeNames = function() {
+      var a = [];
+      for (var o in this.attrs)
+      {
+         a.push(o);
+      }
+
+      return a;
+   };
+
+   XMLDOC.Parser.node.prototype.getAttribute = function(attr) {
+      return this.attrs[attr];
+   };
+
+   XMLDOC.Parser.node.prototype.setAttribute = function(attr, val) {
+      this.attrs[attr] = val;
+   };
+
+   XMLDOC.Parser.node.prototype.getChild = function(idx) {
+      return this.nodes[idx];
+   };
+
+   XMLDOC.Parser.node.prototype.parentNode = function() {
+      return this.parent;
+   };
+
+   XMLDOC.Parser.node.prototype.firstChild = function() {
+      return this.nodes[0];
+   };
+
+   XMLDOC.Parser.node.prototype.lastChild = function() {
+      return this.nodes[this.nodes.length - 1];
+   };
+
+   XMLDOC.Parser.node.prototype.nextSibling = function() {
+      var p = this.parent;
+      if (p && (p.nodes.indexOf(this) + 1 != p.nodes.length))
+      {
+         return p.getChild(p.nodes.indexOf(this) + 1);
+      }
+      return null;
+   };
+
+   XMLDOC.Parser.node.prototype.prevSibling = function() {
+      var p = this.parent;
+      if (p && (p.nodes.indexOf(this) - 1 >= 0))
+      {
+         return p.getChild(p.nodes.indexOf(this) - 1);
+      }
+      return null;
+   };
+};
+
+/**
+ * Parse an XML Document from the specified source.  The XML should be
+ * well formed, unless strict mode is disabled, then the parser will
+ * handle HTML-style XML documents.
+ * @param src {String} The source to parse
+ */
+XMLDOC.Parser.parse = function(src)
+{
+   var A = [];
+
+   // Normailize whitespace
+   A = src.split("\r\n");
+   src = A.join("\n");
+   A = src.split("\r");
+   src = A.join("\n");
+
+   // Remove XML and DOCTYPE specifier
+   src.replace(/<\?XML .*\?>/i, "");
+   src.replace(/<!DOCTYPE .*\>/i, "");
+
+   // The document is the root node and cannot be modified or removed
+   var doc = new XMLDOC.Parser.node(null, "ROOT", "DOCUMENT");
+
+   // Let's break it down
+   XMLDOC.Parser.eat(doc, src);
+
+   return doc;
+};
+
+/**
+ * The XML fragment processing routine.  This method is private and should not be called
+ * directly.
+ * @param parentNode {XMLDOC.Parser.node} The node which is the parent of this fragment
+ * @param src {String} The source within the fragment to process
+ * @private
+ */
+XMLDOC.Parser.eat = function(parentNode, src)
+{
+   // A simple tag def
+   var reTag = new RegExp("<(!|)(\\?|--|)((.|\\s)*?)\\2>","g");
+
+   // Special tag types
+   var reCommentTag = /<!--((.|\s)*?)-->/;
+   var rePITag = /<\?((.|\s)*?)\?>/;
+
+   // A start tag (with potential empty marker)
+   var reStartTag = /<(.*?)( +([\w_\-]*)=(\"|')(.*)\4)*(\/)?>/;
+
+   // An empty HTML style tag (not proper XML, but we'll accept it so we can process HTML)
+   var reHTMLEmptyTag = /<(.*?)( +([\w_\-]*)=(\"|')(.*)\4)*>/;
+
+   // Fully enclosing tag with nested tags
+   var reEnclosingTag = /<(.*?)( +([\w_\-]*)=(\"|')(.*?)\4)*>((.|\s)*?)<\/\1>/;
+
+   // Breaks down attributes
+   var reAttributes = new RegExp(" +([\\w_\\-]*)=(\"|')(.*?)\\2","g");
+
+   // Find us a tag
+   var tag;
+   while ((tag = reTag.exec(src)) != null)
+   {
+      if (tag.index > 0)
+      {
+         // The next tag has some text before it
+         var text = src.substring(0, tag.index).replace(/^[ \t\n]+((.|\n)*?)[ \t\n]+$/, "$1");
+
+         if (text.length > 0 && (text != "\n"))
+         {
+            var txtnode = new XMLDOC.Parser.node(parentNode, "", "TEXT");
+            txtnode.charData = text;
+
+            // Append the new text node
+            parentNode.nodes.push(txtnode);
+         }
+
+         // Reset the lastIndex of reTag
+         reTag.lastIndex -= src.substring(0, tag.index).length;
+
+         // Eat the text
+         src = src.substring(tag.index);
+      }
+
+      if (reCommentTag.test(tag[0]))
+      {
+         // Is this a comment?
+         var comment = new XMLDOC.Parser.node(parentNode, "", "COMMENT");
+         comment.charData = reCommentTag.exec(tag[0])[1];
+
+         // Append the comment
+         parentNode.nodes.push(comment);
+
+         // Move the lastIndex of reTag
+         reTag.lastIndex -= tag[0].length;
+
+         // Eat the tag
+         src = src.replace(reCommentTag, "");
+      }
+      else if (rePITag.test(tag[0]))
+      {
+         // Is this a processing instruction?
+         var pi = new XMLDOC.Parser.node(parentNode, "", "PI");
+         pi.charData = rePITag.exec(tag[0])[1];
+
+         // Append the processing instruction
+         parentNode.nodes.push(pi);
+
+         // Move the lastIndex of reTag
+         reTag.lastIndex -= tag[0].length;
+
+         // Eat the tag
+         src = src.replace(rePITag, "");
+      }
+      else if (reStartTag.test(tag[0]))
+      {
+         // Break it down
+         var e = reStartTag.exec(tag[0]);
+         var elem = new XMLDOC.Parser.node(parentNode, e[1], "ELEMENT");
+
+         // Get attributes from the tag
+         var a;
+         while ((a = reAttributes.exec(e[2])) != null )
+         {
+            elem.attrs[a[1]] = a[3];
+         }
+
+         // Is this an empty XML-style tag?
+         if (e[6] == "/")
+         {
+            // Append the empty element
+            parentNode.nodes.push(elem);
+
+            // Move the lastIndex of reTag (include the start tag length)
+            reTag.lastIndex -= e[0].length;
+
+            // Eat the tag
+            src = src.replace(reStartTag, "");
+         }
+         else
+         {
+            // Check for malformed XML tags
+            var htmlParsed = false;
+            var htmlStartTag = reHTMLEmptyTag.exec(src);
+
+            // See if there isn't an end tag within this block
+            var reHTMLEndTag = new RegExp("</" + htmlStartTag[1] + ">");
+            var htmlEndTag = reHTMLEndTag.exec(src);
+
+            if (XMLDOC.Parser.strictMode && htmlEndTag == null)
+            {
+               // Poorly formed XML fails in strict mode
+               var err = new Error("Malformed XML passed to XMLDOC.Parser... Error contains malformed 'src'");
+               err.src = src;
+               throw err;
+            }
+            else if (htmlEndTag == null)
+            {
+               // This is an HTML-style empty tag, store the element for it in non-strict mode
+               parentNode.nodes.push(elem);
+
+               // Eat the tag
+               src = src.replace(reHTMLEmptyTag, "");
+               htmlParsed = true;
+            }
+
+            // If we didn't parse HTML-style, it must be an enclosing tag
+            if (!htmlParsed)
+            {
+               var enc = reEnclosingTag.exec(src);
+
+               // Go deeper into the document
+               XMLDOC.Parser.eat(elem, enc[6]);
+
+               // Append the new element node
+               parentNode.nodes.push(elem);
+
+               // Eat the tag
+               src = src.replace(reEnclosingTag, "");
+            }
+         }
+
+         // Reset the lastIndex of reTag
+         reTag.lastIndex = 0;
+      }
+   }
+
+   // No tag was found... append the text if there is any
+   src = src.replace(/^[ \t\n]+((.|\n)*?)[ \t\n]+$/, "$1");
+   if (src.length > 0 && (src != "\n"))
+   {
+      var txtNode = new XMLDOC.Parser.node(parentNode, "", "TEXT");
+      txtNode.charData = src;
+
+      // Append the new text node
+      parentNode.nodes.push(txtNode);
+   }
+};
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC.js	(revision 4056)
@@ -0,0 +1,98 @@
+/**
+	@overview
+	@date $Date: 2008-08-02 10:25:54 +0200 (Sat, 02 Aug 2008) $
+	@version $Revision: 668 $ 
+	@location $HeadURL: http://jsdoc-toolkit.googlecode.com/svn/tags/jsdoc_toolkit-2.0.2/jsdoc-toolkit/app/lib/JSDOC.js $
+	@name whateverFilename.js
+ */
+
+/**
+	This is the main container for the JSDOC application.
+	@namespace
+*/
+JSDOC = {
+};
+
+/**
+	@requires Opt
+ */
+if (typeof arguments == "undefined") arguments = [];
+JSDOC.opt = Opt.get(
+	arguments, 
+	{
+		d: "directory",
+		c: "conf",
+		t: "template",
+		r: "recurse",
+		x: "ext",
+		p: "private",
+		a: "allfunctions", 
+		e: "encoding",
+		n: "nocode",
+		o: "out",
+		s: "suppress",
+		T: "testmode",
+		h: "help",
+		v: "verbose",
+		"D[]": "define",
+		"H[]": "handler"
+	}
+);
+
+/** The current version string of this application. */
+JSDOC.VERSION = "2.0.2";
+
+/** Print out usage information and quit. */
+JSDOC.usage = function() {
+	print("USAGE: java -jar jsrun.jar app/run.js [OPTIONS] <SRC_DIR> <SRC_FILE> ...");
+	print("");
+	print("OPTIONS:");
+	print("  -a or --allfunctions\n          Include all functions, even undocumented ones.\n");
+	print("  -c or --conf\n          Load a configuration file.\n");
+	print("  -d=<PATH> or --directory=<PATH>\n          Output to this directory (defaults to \"out\").\n");
+	print("  -D=\"myVar:My value\" or --define=\"myVar:My value\"\n          Multiple. Define a variable, available in JsDoc as JSDOC.opt.D.myVar\n");
+	print("  -e=<ENCODING> or --encoding=<ENCODING>\n          Use this encoding to read and write files.\n");
+	print("  -h or --help\n          Show this message and exit.\n");
+	//print("  -H=ext:handler or --handler=ext:handler\n          Multiple. Load handlers/handler.js to handle files with .ext names.\n");
+	print("  -n or --nocode\n          Ignore all code, only document comments with @name tags.\n");
+	print("  -o=<PATH> or --out=<PATH>\n          Print log messages to a file (defaults to stdout).\n");
+	print("  -p or --private\n          Include symbols tagged as private, underscored and inner symbols.\n");
+	print("  -r=<DEPTH> or --recurse=<DEPTH>\n          Descend into src directories.\n");
+	print("  -s or --suppress\n          Suppress source code output.\n");
+	print("  -t=<PATH> or --template=<PATH>\n          Required. Use this template to format the output.\n");
+	print("  -T or --test\n          Run all unit tests and exit.\n");
+	print("  -v or --verbose\n          Provide verbose feedback about what is happening.\n");
+	print("  -x=<EXT>[,EXT]... or --ext=<EXT>[,EXT]...\n          Scan source files with the given extension/s (defaults to js).\n");
+	
+	quit();
+}
+
+/*t:
+	plan(4, "Testing JSDOC namespace.");
+	
+	is(
+		typeof JSDOC,
+		"object",
+		"JSDOC.usage is a function."
+	);
+	
+	is(
+		typeof JSDOC.VERSION,
+		"string",
+		"JSDOC.VERSION is a string."
+	);
+	
+	is(
+		typeof JSDOC.usage,
+		"function",
+		"JSDOC.usage is a function."
+	);
+	
+	is(
+		typeof JSDOC.opt,
+		"object",
+		"JSDOC.opt is a object."
+	);
+ */
+
+if (this.IO) IO.includeDir("lib/JSDOC/");
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/DocComment.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/DocComment.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/DocComment.js	(revision 4056)
@@ -0,0 +1,200 @@
+if (typeof JSDOC == "undefined") JSDOC = {};
+
+/**
+	Create a new DocComment. This takes a raw documentation comment,
+	and wraps it in useful accessors.
+	@class Represents a documentation comment object.
+ */ 
+JSDOC.DocComment = function(/**String*/comment) {
+	this.init();
+	if (typeof comment != "undefined") {
+		this.parse(comment);
+	}
+}
+
+JSDOC.DocComment.prototype.init = function() {
+	this.isUserComment = true;
+	this.src           = "";
+	this.meta          = "";
+	this.tagTexts      = [];
+	this.tags          = [];
+}
+
+/**
+	@requires JSDOC.DocTag
+ */
+JSDOC.DocComment.prototype.parse = function(/**String*/comment) {
+	if (comment == "") {
+		comment = "/** @desc */";
+		this.isUserComment = false;
+	}
+	
+	this.src = JSDOC.DocComment.unwrapComment(comment);
+	
+	this.meta = "";
+	if (this.src.indexOf("#") == 0) {
+		this.src.match(/#(.+[+-])([\s\S]*)$/);
+		if (RegExp.$1) this.meta = RegExp.$1;
+		if (RegExp.$2) this.src = RegExp.$2;
+	}
+	
+	this.fixDesc();
+	
+	if (typeof JSDOC.PluginManager != "undefined") {
+		JSDOC.PluginManager.run("onDocCommentSrc", this);
+	}
+	
+	this.src = JSDOC.DocComment.shared+"\n"+this.src;
+	
+	this.tagTexts = 
+		this.src
+		.split(/(^|[\r\n])\s*@/)
+		.filter(function($){return $.match(/\S/)});
+	
+	/**
+		The tags found in the comment.
+		@type JSDOC.DocTag[]
+	 */
+	this.tags = this.tagTexts.map(function($){return new JSDOC.DocTag($)});
+	
+	if (typeof JSDOC.PluginManager != "undefined") {
+		JSDOC.PluginManager.run("onDocCommentTags", this);
+	}
+}
+
+/*t:
+	plan(5, "testing JSDOC.DocComment");
+	requires("../frame/String.js");
+	requires("../lib/JSDOC/DocTag.js");
+	
+	var com = new JSDOC.DocComment("/**@foo some\n* comment here*"+"/");
+	is(com.tagTexts[0], "foo some\ncomment here", "first tag text is found.");
+	is(com.tags[0].title, "foo", "the title is found in a comment with one tag.");
+	
+	var com = new JSDOC.DocComment("/** @foo first\n* @bar second*"+"/");
+	is(com.getTag("bar").length, 1, "getTag() returns one tag by that title.");
+	
+	JSDOC.DocComment.shared = "@author John Smith";
+	var com = new JSDOC.DocComment("/**@foo some\n* comment here*"+"/");
+	is(com.tags[0].title, "author", "shared comment is added.");
+	is(com.tags[1].title, "foo", "shared comment is added to existing tag.");
+*/
+
+/**
+	If no @desc tag is provided, this function will add it.
+ */
+JSDOC.DocComment.prototype.fixDesc = function() {
+	if (this.meta && this.meta != "@+") return;
+	if (/^\s*[^@\s]/.test(this.src)) {				
+		this.src = "@desc "+this.src;
+	}
+}
+
+/*t:
+	plan(5, "testing JSDOC.DocComment#fixDesc");
+	
+	var com = new JSDOC.DocComment();
+	
+	com.src = "this is a desc\n@author foo";
+	com.fixDesc();
+	is(com.src, "@desc this is a desc\n@author foo", "if no @desc tag is provided one is added.");
+
+	com.src = "x";
+	com.fixDesc();
+	is(com.src, "@desc x", "if no @desc tag is provided one is added to a single character.");
+
+	com.src = "\nx";
+	com.fixDesc();
+	is(com.src, "@desc \nx", "if no @desc tag is provided one is added to return and character.");
+	
+	com.src = " ";
+	com.fixDesc();
+	is(com.src, " ", "if no @desc tag is provided one is not added to just whitespace.");
+
+	com.src = "";
+	com.fixDesc();
+	is(com.src, "", "if no @desc tag is provided one is not added to empty.");
+*/
+
+/**
+	Remove slash-star comment wrapper from a raw comment string.
+	@type String
+ */
+JSDOC.DocComment.unwrapComment = function(/**String*/comment) {
+	if (!comment) return "";
+	var unwrapped = comment.replace(/(^\/\*\*|\*\/$)/g, "").replace(/^\s*\* ?/gm, "");
+	return unwrapped;
+}
+
+/*t:
+	plan(5, "testing JSDOC.DocComment.unwrapComment");
+	
+	var com = "/**x*"+"/";
+	var unwrapped = JSDOC.DocComment.unwrapComment(com);
+	is(unwrapped, "x", "a single character jsdoc is found.");
+	
+	com = "/***x*"+"/";
+	unwrapped = JSDOC.DocComment.unwrapComment(com);
+	is(unwrapped, "x", "three stars are allowed in the opener.");
+	
+	com = "/****x*"+"/";
+	unwrapped = JSDOC.DocComment.unwrapComment(com);
+	is(unwrapped, "*x", "fourth star in the opener is kept.");
+	
+	com = "/**x\n * y\n*"+"/";
+	unwrapped = JSDOC.DocComment.unwrapComment(com);
+	is(unwrapped, "x\ny\n", "leading stars and spaces are trimmed.");
+	
+	com = "/**x\n *   y\n*"+"/";
+	unwrapped = JSDOC.DocComment.unwrapComment(com);
+	is(unwrapped, "x\n  y\n", "only first space after leading stars are trimmed.");
+*/
+
+/**
+	Provides a printable version of the comment.
+	@type String
+ */
+JSDOC.DocComment.prototype.toString = function() {
+	return this.src;
+}
+
+/*t:
+	plan(1, "testing JSDOC.DocComment#fixDesc");
+	var com = new JSDOC.DocComment();
+	com.src = "foo";
+	is(""+com, "foo", "stringifying a comment returns the unwrapped src.");
+*/
+
+/**
+	Given the title of a tag, returns all tags that have that title.
+	@type JSDOC.DocTag[]
+ */
+JSDOC.DocComment.prototype.getTag = function(/**String*/tagTitle) {
+	return this.tags.filter(function($){return $.title == tagTitle});
+}
+
+/*t:
+	plan(1, "testing JSDOC.DocComment#getTag");
+	requires("../frame/String.js");
+	requires("../lib/JSDOC/DocTag.js");
+	
+	var com = new JSDOC.DocComment("/**@foo some\n* @bar\n* @bar*"+"/");
+	is(com.getTag("bar").length, 2, "getTag returns expected number of tags.");
+*/
+
+/**
+	Used to store the currently shared tag text.
+*/
+JSDOC.DocComment.shared = "";
+
+/*t:
+	plan(2, "testing JSDOC.DocComment.shared");
+	requires("../frame/String.js");
+	requires("../lib/JSDOC/DocTag.js");
+	
+	JSDOC.DocComment.shared = "@author Michael";
+	
+	var com = new JSDOC.DocComment("/**@foo\n* @foo*"+"/");
+	is(com.getTag("author").length, 1, "getTag returns shared tag.");
+	is(com.getTag("foo").length, 2, "getTag returns unshared tags too.");
+*/
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/DocTag.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/DocTag.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/DocTag.js	(revision 4056)
@@ -0,0 +1,294 @@
+if (typeof JSDOC == "undefined") JSDOC = {};
+
+/**
+	@constructor
+ */
+JSDOC.DocTag = function(src) {
+	this.init();
+	if (typeof src != "undefined") {
+		this.parse(src);
+	}
+}
+
+/**
+	Create and initialize the properties of this.
+ */
+JSDOC.DocTag.prototype.init = function() {
+	this.title        = "";
+	this.type         = "";
+	this.name         = "";
+	this.isOptional   = false;
+	this.defaultValue = "";
+	this.desc         = "";
+	
+	return this;
+}
+
+/**
+	Populate the properties of this from the given tag src.
+	@param {string} src
+ */
+JSDOC.DocTag.prototype.parse = function(src) {
+	if (typeof src != "string") throw "src must be a string not "+(typeof src);
+
+	try {
+		src = this.nibbleTitle(src);
+		if (JSDOC.PluginManager) {
+			JSDOC.PluginManager.run("onDocTagSynonym", this);
+		}
+		
+		src = this.nibbleType(src);
+		
+		// only some tags are allowed to have names.
+		if (this.title == "param" || this.title == "property" || this.title == "config") { // @config is deprecated
+			src = this.nibbleName(src);
+		}
+	}
+	catch(e) {
+		if (LOG) LOG.warn(e);
+		else throw e;
+	}
+	this.desc = src; // whatever is left
+	
+	// example tags need to have whitespace preserved
+	if (this.title != "example") this.desc = this.desc.trim();
+	
+	if (JSDOC.PluginManager) {
+		JSDOC.PluginManager.run("onDocTag", this);
+	}
+}
+
+/**
+	Automatically called when this is stringified.
+ */
+JSDOC.DocTag.prototype.toString = function() {
+	return this.desc;
+}
+
+/*t:
+	plan(1, "testing JSDOC.DocTag#toString");
+	
+	var tag = new JSDOC.DocTag("param {object} date A valid date.");
+	is(""+tag, "A valid date.", "stringifying a tag returns the desc.");
+ */
+
+/**
+	Find and shift off the title of a tag.
+	@param {string} src
+	@return src
+ */
+JSDOC.DocTag.prototype.nibbleTitle = function(src) {
+	if (typeof src != "string") throw "src must be a string not "+(typeof src);
+	
+	var parts = src.match(/^\s*(\S+)(?:\s([\s\S]*))?$/);
+
+	if (parts && parts[1]) this.title = parts[1];
+	if (parts && parts[2]) src = parts[2];
+	else src = "";
+	
+	return src;
+}
+
+/*t:
+	plan(8, "testing JSDOC.DocTag#nibbleTitle");
+	
+	var tag = new JSDOC.DocTag();
+	
+	tag.init().nibbleTitle("aTitleGoesHere");
+	is(tag.title, "aTitleGoesHere", "a title can be found in a single-word string.");
+	
+	var src = tag.init().nibbleTitle("aTitleGoesHere and the rest");
+	is(tag.title, "aTitleGoesHere", "a title can be found in a multi-word string.");
+	is(src, "and the rest", "the rest is returned when the title is nibbled off.");
+	
+	src = tag.init().nibbleTitle("");
+	is(tag.title, "", "given an empty string the title is empty.");
+	is(src, "", "the rest is empty when the tag is empty.");
+
+	var src = tag.init().nibbleTitle(" aTitleGoesHere\n  a description");
+	is(tag.title, "aTitleGoesHere", "leading and trailing spaces are not part of the title.");
+	is(src, "  a description", "leading spaces (less one) are part of the description.");
+
+	tag.init().nibbleTitle("a.Title::Goes_Here foo");
+	is(tag.title, "a.Title::Goes_Here", "titles with punctuation are allowed.");
+ */
+
+/**
+	Find and shift off the type of a tag.
+	@requires frame/String.js
+	@param {string} src
+	@return src
+ */
+JSDOC.DocTag.prototype.nibbleType = function(src) {
+	if (typeof src != "string") throw "src must be a string not "+(typeof src);
+	
+	if (src.match(/^\s*\{/)) {
+		var typeRange = src.balance("{", "}");
+		if (typeRange[1] == -1) {
+			throw "Malformed comment tag ignored. Tag type requires an opening { and a closing }: "+src;
+		}
+		this.type = src.substring(typeRange[0]+1, typeRange[1]).trim();
+		this.type = this.type.replace(/\s*,\s*/g, "|"); // multiples can be separated by , or |
+		src = src.substring(typeRange[1]+1);
+	}
+	
+	return src;
+}
+
+/*t:
+	plan(5, "testing JSDOC.DocTag.parser.nibbleType");
+	requires("../frame/String.js");
+	
+	var tag = new JSDOC.DocTag();
+	
+	tag.init().nibbleType("{String[]} aliases");
+	is(tag.type, "String[]", "type can have non-alpha characters.");
+	
+	tag.init().nibbleType("{ aTypeGoesHere  } etc etc");
+	is(tag.type, "aTypeGoesHere", "type is trimmed.");
+	
+	tag.init().nibbleType("{ oneType, twoType ,\n threeType  } etc etc");
+	is(tag.type, "oneType|twoType|threeType", "multiple types can be separated by commas.");
+	
+	var error;
+	try { tag.init().nibbleType("{widget foo"); }
+	catch(e) { error = e; }
+	is(typeof error, "string", "malformed tag type throws error.");
+	isnt(error.indexOf("Malformed"), -1, "error message tells tag is malformed.");
+ */
+
+/**
+	Find and shift off the name of a tag.
+	@requires frame/String.js
+	@param {string} src
+	@return src
+ */
+JSDOC.DocTag.prototype.nibbleName = function(src) {
+	if (typeof src != "string") throw "src must be a string not "+(typeof src);
+	
+	src = src.trim();
+	
+	// is optional?
+	if (src.charAt(0) == "[") {
+		var nameRange = src.balance("[", "]");
+		if (nameRange[1] == -1) {
+			throw "Malformed comment tag ignored. Tag optional name requires an opening [ and a closing ]: "+src;
+		}
+		this.name = src.substring(nameRange[0]+1, nameRange[1]).trim();
+		this.isOptional = true;
+		
+		src = src.substring(nameRange[1]+1);
+		
+		// has default value?
+		var nameAndValue = this.name.split("=");
+		if (nameAndValue.length) {
+			this.name = nameAndValue.shift().trim();
+			this.defaultValue = nameAndValue.join("=");
+		}
+	}
+	else {
+		var parts = src.match(/^(\S+)(?:\s([\s\S]*))?$/);
+		if (parts) {
+			if (parts[1]) this.name = parts[1];
+			if (parts[2]) src = parts[2].trim();
+			else src = "";
+		}
+	}	
+
+	return src;
+}
+
+/*t:
+	requires("../frame/String.js");
+	plan(9, "testing JSDOC.DocTag.parser.nibbleName");
+	
+	var tag = new JSDOC.DocTag();
+	
+	tag.init().nibbleName("[foo] This is a description.");
+	is(tag.isOptional, true, "isOptional syntax is detected.");
+	is(tag.name, "foo", "optional param name is found.");
+ 	
+	tag.init().nibbleName("[foo] This is a description.");
+	is(tag.isOptional, true, "isOptional syntax is detected when no type.");
+	is(tag.name, "foo", "optional param name is found when no type.");
+	
+	tag.init().nibbleName("[foo=7] This is a description.");
+ 	is(tag.name, "foo", "optional param name is found when default value.");
+ 	is(tag.defaultValue, 7, "optional param default value is found when default value.");
+ 	
+ 	//tag.init().nibbleName("[foo= a value] This is a description.");
+ 	//is(tag.defaultValue, " a value", "optional param default value is found when default value has spaces (issue #112).");
+ 	
+ 	tag.init().nibbleName("[foo=[]] This is a description.");
+ 	is(tag.defaultValue, "[]", "optional param default value is found when default value is [] (issue #95).");
+ 	
+ 	tag.init().nibbleName("[foo=a=b] This is a description.");
+ 	is(tag.name, "foo", "optional param name is found when default value is a=b.");
+ 	is(tag.defaultValue, "a=b", "optional param default value is found when default value is a=b.")
+ */
+
+/*t:
+	plan(32, "Testing JSDOC.DocTag.parser.");
+	requires("../frame/String.js");
+	
+ 	var tag = new JSDOC.DocTag();
+ 	
+ 	is(typeof tag, "object", "JSDOC.DocTag.parser with an empty string returns an object.");
+ 	is(typeof tag.title, "string", "returned object has a string property 'title'.");
+ 	is(typeof tag.type, "string", "returned object has a string property 'type'.");
+ 	is(typeof tag.name, "string", "returned object has a string property 'name'.");
+ 	is(typeof tag.defaultValue, "string", "returned object has a string property 'defaultValue'.");
+ 	is(typeof tag.isOptional, "boolean", "returned object has a boolean property 'isOptional'.");
+ 	is(typeof tag.desc, "string", "returned object has a string property 'desc'.");
+  
+  	tag = new JSDOC.DocTag("param {widget} foo");
+  	is(tag.title, "param", "param title is found.");
+  	is(tag.name, "foo", "param name is found when desc is missing.");
+ 	is(tag.desc, "", "param desc is empty when missing.");
+ 	
+ 	tag = new JSDOC.DocTag("param {object} date A valid date.");
+ 	is(tag.name, "date", "param name is found with a type.");
+ 	is(tag.type, "object", "param type is found.");
+ 	is(tag.desc, "A valid date.", "param desc is found with a type.");
+ 	
+  	tag = new JSDOC.DocTag("param aName a description goes\n    here.");
+	is(tag.name, "aName", "param name is found without a type.");
+ 	is(tag.desc, "a description goes\n    here.", "param desc is found without a type.");
+ 	
+ 	tag = new JSDOC.DocTag("param {widget}");
+ 	is(tag.name, "", "param name is empty when it is not given.");
+	
+	tag = new JSDOC.DocTag("param {widget} [foo] This is a description.");
+	is(tag.name, "foo", "optional param name is found.");
+	
+	tag = new JSDOC.DocTag("return {aType} This is a description.");
+	is(tag.type, "aType", "when return tag has no name, type is found.");
+	is(tag.desc, "This is a description.", "when return tag has no name, desc is found.");
+	
+	tag = new JSDOC.DocTag("author Joe Coder <jcoder@example.com>");
+	is(tag.title, "author", "author tag has a title.");
+	is(tag.type, "", "the author tag has no type.");
+	is(tag.name, "", "the author tag has no name.");
+	is(tag.desc, "Joe Coder <jcoder@example.com>", "author tag has desc.");
+	
+	tag = new JSDOC.DocTag("private \t\n  ");
+	is(tag.title, "private", "private tag has a title.");
+	is(tag.type, "", "the private tag has no type.");
+	is(tag.name, "", "the private tag has no name.");
+	is(tag.desc, "", "private tag has no desc.");
+
+	tag = new JSDOC.DocTag("example\n   example(code);\n   more();");
+	is(tag.desc, "   example(code);\n   more();", "leading whitespace (less one) in examples code is preserved.");
+	
+	tag = new JSDOC.DocTag("param theName  \n");
+	is(tag.name, "theName", "name only is found.");
+	
+	tag = new JSDOC.DocTag("type theDesc  \n");
+	is(tag.desc, "theDesc", "desc only is found.");
+	
+	tag = new JSDOC.DocTag("type {theType} \n");
+	is(tag.type, "theType", "type only is found.");
+	
+	tag = new JSDOC.DocTag("");
+	is(tag.title, "", "title is empty when tag is empty.");
+ */
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js	(revision 4056)
@@ -0,0 +1,162 @@
+/**
+	@constructor
+	@param [opt] Used to override the commandline options. Useful for testing.
+	@version $Id: JsDoc.js 592 2008-05-09 07:43:33Z micmath $
+*/
+JSDOC.JsDoc = function(/**object*/ opt) {
+	if (opt) {
+		JSDOC.opt = opt;
+	}
+	
+	// the -c option: use a configuration file
+	if (JSDOC.opt.c) {
+		eval("JSDOC.conf = " + IO.readFile(JSDOC.opt.c));
+		
+		LOG.inform("Using configuration file at '"+JSDOC.opt.c+"'.");
+		
+		for (var c in JSDOC.conf) {
+			if (c !== "D" && !defined(JSDOC.opt[c])) { // commandline overrules config file
+				JSDOC.opt[c] = JSDOC.conf[c];
+			}
+		}
+		
+		if (typeof JSDOC.conf["_"] != "undefined") {
+			JSDOC.opt["_"] = JSDOC.opt["_"].concat(JSDOC.conf["_"]);
+		}
+		
+		LOG.inform("With configuration: ");
+		for (var o in JSDOC.opt) {
+			LOG.inform("    "+o+": "+JSDOC.opt[o]);
+		}
+	}
+	
+	if (JSDOC.opt.h) {
+		JSDOC.usage();
+		quit();
+	}
+	
+	// defend against options that are not sane 
+	if (JSDOC.opt._.length == 0) {
+		LOG.warn("No source files to work on. Nothing to do.");
+		quit();
+	}
+	if (JSDOC.opt.t === true || JSDOC.opt.d === true) {
+		JSDOC.usage();
+	}
+	
+	if (typeof JSDOC.opt.d == "string") {
+		if (!JSDOC.opt.d.charAt(JSDOC.opt.d.length-1).match(/[\\\/]/)) {
+			JSDOC.opt.d = JSDOC.opt.d+"/";
+		}
+		LOG.inform("Output directory set to '"+JSDOC.opt.d+"'.");
+		IO.mkPath(JSDOC.opt.d);
+	}
+	if (JSDOC.opt.e) IO.setEncoding(JSDOC.opt.e);
+	
+	// the -r option: scan source directories recursively
+	if (typeof JSDOC.opt.r == "boolean") JSDOC.opt.r = 10;
+	else if (!isNaN(parseInt(JSDOC.opt.r))) JSDOC.opt.r = parseInt(JSDOC.opt.r);
+	else JSDOC.opt.r = 1;
+	
+	// the -D option: define user variables
+	var D = {};
+	if (JSDOC.opt.D) {
+		for (var i = 0; i < JSDOC.opt.D.length; i++) {
+			var defineParts = JSDOC.opt.D[i].split(":", 2);
+			if (defineParts) D[defineParts[0]] = defineParts[1];
+		}
+	}
+	JSDOC.opt.D = D;
+	// combine any conf file D options with the commandline D options
+	if (defined(JSDOC.conf)) for (var c in JSDOC.conf.D) {
+ 		if (!defined(JSDOC.opt.D[c])) {
+ 			JSDOC.opt.D[c] = JSDOC.conf.D[c];
+ 		}
+ 	}
+
+	// Load additional file handlers
+	// the -H option: filetype handlers
+	JSDOC.handlers = {};
+/*	
+	if (JSDOC.opt.H) {
+		for (var i = 0; i < JSDOC.opt.H.length; i++) {
+			var handlerDef = JSDOC.opt.H[i].split(":");
+			LOG.inform("Adding '." + handlerDef[0] + "' content handler from handlers/" + handlerDef[1] + ".js");
+			IO.include("handlers/" + handlerDef[1] + ".js");
+			if (!eval("typeof "+handlerDef[1])) {
+				LOG.warn(handlerDef[1] + "is not defined in "+handlerDef[1] + ".js");
+			}
+			else {
+				JSDOC.handlers[handlerDef[0]] = eval(handlerDef[1]);
+			}
+		}
+	}
+*/	
+	// Give plugins a chance to initialize
+	if (defined(JSDOC.PluginManager)) {
+		JSDOC.PluginManager.run("onInit", this);
+	}
+
+	JSDOC.opt.srcFiles = this._getSrcFiles();
+	this._parseSrcFiles();
+	//var handler = symbols.handler;
+	this.symbolSet = JSDOC.Parser.symbols;
+	//this.symbolGroup.handler = handler;
+}
+
+/**
+	Retrieve source file list.
+	@returns {String[]} The pathnames of the files to be parsed.
+ */
+JSDOC.JsDoc.prototype._getSrcFiles = function() {
+	this.srcFiles = [];
+	
+	var ext = ["js"];
+	if (JSDOC.opt.x) {
+		ext = JSDOC.opt.x.split(",").map(function($) {return $.toLowerCase()});
+	}
+	
+	for (var i = 0; i < JSDOC.opt._.length; i++) {
+		this.srcFiles = this.srcFiles.concat(
+			IO.ls(JSDOC.opt._[i], JSDOC.opt.r).filter(
+				function($) {
+					var thisExt = $.split(".").pop().toLowerCase();
+					return (ext.indexOf(thisExt) > -1 || thisExt in JSDOC.handlers); // we're only interested in files with certain extensions
+				}
+			)
+		);
+	}
+	
+	return this.srcFiles;
+}
+
+JSDOC.JsDoc.prototype._parseSrcFiles = function() {
+	JSDOC.Parser.init();
+	for (var i = 0, l = this.srcFiles.length; i < l; i++) {
+		var srcFile = this.srcFiles[i];
+		
+		try {
+			var src = IO.readFile(srcFile);
+		}
+		catch(e) {
+			LOG.warn("Can't read source file '"+srcFile+"': "+e.message);
+		}
+
+		// Check to see if there is a handler for this file type
+//		var ext = FilePath.fileExtension(srcFile);
+// 		if (JSDOC.handlers[ext]) {
+// 			LOG.inform(" Using external handler for '" + ext + "'");
+// 
+// 			symbols = symbols.concat(JSDOC.handlers[ext].handle(srcFile, src));
+// 			symbols.handler = JSDOC.handlers[ext];
+// 		}
+// 		else {
+			// The default (JSDOC) handler
+			var tr = new JSDOC.TokenReader();
+			var ts = new JSDOC.TokenStream(tr.tokenize(new JSDOC.TextStream(src)));
+	
+			JSDOC.Parser.parse(ts, srcFile);
+//		}
+	}
+	JSDOC.Parser.finish();
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js	(revision 4056)
@@ -0,0 +1,100 @@
+/**
+	@constructor
+*/
+JSDOC.JsPlate = function(templateFile) {
+	if (templateFile) this.template = IO.readFile(templateFile);
+	
+	this.templateFile = templateFile;
+	this.code = "";
+	this.parse();
+}
+
+JSDOC.JsPlate.prototype.parse = function() {
+	this.template = this.template.replace(/\{#[\s\S]+?#\}/gi, "");
+	this.code = "var output=``"+this.template;
+
+	this.code = this.code.replace(
+		/<for +each="(.+?)" +in="(.+?)" *>/gi, 
+		function (match, eachName, inName) {
+			return "``;\rvar $"+eachName+"_keys = keys("+inName+");\rfor(var $"+eachName+"_i = 0; $"+eachName+"_i < $"+eachName+"_keys.length; $"+eachName+"_i++) {\rvar $"+eachName+"_last = ($"+eachName+"_i == $"+eachName+"_keys.length-1);\rvar $"+eachName+"_key = $"+eachName+"_keys[$"+eachName+"_i];\rvar "+eachName+" = "+inName+"[$"+eachName+"_key];\routput+=``";
+		}
+	);	
+	this.code = this.code.replace(/<if test="(.+?)">/g, "``;\rif ($1) { output+=``");
+	this.code = this.code.replace(/<elseif test="(.+?)"\s*\/>/g, "``;}\relse if ($1) { output+=``");
+	this.code = this.code.replace(/<else\s*\/>/g, "``;}\relse { output+=``");
+	this.code = this.code.replace(/<\/(if|for)>/g, "``;\r};\routput+=``");
+	this.code = this.code.replace(
+		/\{\+\s*([\s\S]+?)\s*\+\}/gi,
+		function (match, code) {
+			code = code.replace(/"/g, "``"); // prevent qoute-escaping of inline code
+			code = code.replace(/(\r?\n)/g, " ");
+			return "``+ ("+code+") +``";
+		}
+	);
+	this.code = this.code.replace(
+		/\{!\s*([\s\S]+?)\s*!\}/gi,
+		function (match, code) {
+			code = code.replace(/"/g, "``"); // prevent qoute-escaping of inline code
+			code = code.replace(/(\n)/g, " ");
+			return "``; "+code+";\routput+=``";
+		}
+	);
+	this.code = this.code+"``;";
+
+	this.code = this.code.replace(/(\r?\n)/g, "\\n");
+	this.code = this.code.replace(/"/g, "\\\"");
+	this.code = this.code.replace(/``/g, "\"");
+}
+
+JSDOC.JsPlate.prototype.toCode = function() {
+	return this.code;
+}
+
+JSDOC.JsPlate.keys = function(obj) {
+	var keys = [];
+	if (obj.constructor.toString().indexOf("Array") > -1) {
+		for (var i = 0; i < obj.length; i++) {
+			keys.push(i);
+		}
+	}
+	else {
+		for (var i in obj) {
+			keys.push(i);
+		}
+	}
+	return keys;
+};
+
+JSDOC.JsPlate.values = function(obj) {
+	var values = [];
+	if (obj.constructor.toString().indexOf("Array") > -1) {
+		for (var i = 0; i < obj.length; i++) {
+			values.push(obj[i]);
+		}
+	}
+	else {
+		for (var i in obj) {
+			values.push(obj[i]);
+		}
+	}
+	return values;
+};
+
+JSDOC.JsPlate.prototype.process = function(data) {
+	var keys = JSDOC.JsPlate.keys;
+	var values = JSDOC.JsPlate.values;
+	
+	try {
+		eval(this.code);
+	}
+	catch (e) {
+		print(">> There was an error evaluating the compiled code from template: "+this.templateFile);
+		print("   The error was on line "+e.lineNumber+" "+e.name+": "+e.message);
+		var lines = this.code.split("\r");
+		if (e.lineNumber-2 >= 0) print("line "+(e.lineNumber-1)+": "+lines[e.lineNumber-2]);
+		print("line "+e.lineNumber+": "+lines[e.lineNumber-1]);
+		print("");
+	}
+	/*debug*///print(this.code);
+	return output;
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/Lang.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/Lang.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/Lang.js	(revision 4056)
@@ -0,0 +1,144 @@
+/**
+	@namespace
+*/
+JSDOC.Lang = {
+}
+
+JSDOC.Lang.isBuiltin = function(name) {
+	return (JSDOC.Lang.isBuiltin.coreObjects.indexOf(name) > -1);
+}
+JSDOC.Lang.isBuiltin.coreObjects = ['_global_', 'Array', 'Boolean', 'Date', 'Function', 'Math', 'Number', 'Object', 'RegExp', 'String'];
+
+JSDOC.Lang.whitespace = function(ch) {
+	return JSDOC.Lang.whitespace.names[ch];
+}
+JSDOC.Lang.whitespace.names = {
+	" ":      "SPACE",
+	"\f":     "FORMFEED",
+	"\t":     "TAB",
+	"\u0009": "UNICODE_TAB",
+	"\u000A": "UNICODE_NBR",
+	"\u0008": "VERTICAL_TAB"
+};
+
+JSDOC.Lang.newline = function(ch) {
+	return JSDOC.Lang.newline.names[ch];
+}
+JSDOC.Lang.newline.names = {
+	"\n":     "NEWLINE",
+	"\r":     "RETURN",
+	"\u000A": "UNICODE_LF",
+	"\u000D": "UNICODE_CR",
+	"\u2029": "UNICODE_PS",
+	"\u2028": "UNICODE_LS"
+};
+
+JSDOC.Lang.keyword = function(word) {
+	return JSDOC.Lang.keyword.names["="+word];
+}
+JSDOC.Lang.keyword.names = {
+	"=break":      "BREAK",
+	"=case":       "CASE",
+	"=catch":      "CATCH",
+	"=const":      "VAR",
+	"=continue":   "CONTINUE",
+	"=default":    "DEFAULT",
+	"=delete":     "DELETE",
+	"=do":         "DO",
+	"=else":       "ELSE",
+	"=false":      "FALSE",
+	"=finally":    "FINALLY",
+	"=for":        "FOR",
+	"=function":   "FUNCTION",
+	"=if":         "IF",
+	"=in":         "IN",
+	"=instanceof": "INSTANCEOF",
+	"=new":        "NEW",
+	"=null":       "NULL",
+	"=return":     "RETURN",
+	"=switch":     "SWITCH",
+	"=this":       "THIS",
+	"=throw":      "THROW",
+	"=true":       "TRUE",
+	"=try":        "TRY",
+	"=typeof":     "TYPEOF",
+	"=void":       "VOID",
+	"=while":      "WHILE",
+	"=with":       "WITH",
+	"=var":        "VAR"
+};
+
+JSDOC.Lang.punc = function(ch) {
+	return JSDOC.Lang.punc.names[ch];
+}
+JSDOC.Lang.punc.names = {
+	";":   "SEMICOLON",
+	",":   "COMMA",
+	"?":   "HOOK",
+	":":   "COLON",
+	"||":  "OR", 
+	"&&":  "AND",
+	"|":   "BITWISE_OR",
+	"^":   "BITWISE_XOR",
+	"&":   "BITWISE_AND",
+	"===": "STRICT_EQ", 
+	"==":  "EQ",
+	"=":   "ASSIGN",
+	"!==": "STRICT_NE",
+	"!=":  "NE",
+	"<<":  "LSH",
+	"<=":  "LE", 
+	"<":   "LT",
+	">>>": "URSH",
+	">>":  "RSH",
+	">=":  "GE",
+	">":   "GT", 
+	"++":  "INCREMENT",
+	"--":  "DECREMENT",
+	"+":   "PLUS",
+	"-":   "MINUS",
+	"*":   "MUL",
+	"/":   "DIV", 
+	"%":   "MOD",
+	"!":   "NOT",
+	"~":   "BITWISE_NOT",
+	".":   "DOT",
+	"[":   "LEFT_BRACKET",
+	"]":   "RIGHT_BRACKET",
+	"{":   "LEFT_CURLY",
+	"}":   "RIGHT_CURLY",
+	"(":   "LEFT_PAREN",
+	")":   "RIGHT_PAREN"
+};
+
+JSDOC.Lang.matching = function(name) {
+	return JSDOC.Lang.matching.names[name];
+}
+JSDOC.Lang.matching.names = {
+	"LEFT_PAREN": "RIGHT_PAREN",
+	"RIGHT_PAREN": "LEFT_PAREN",
+	"LEFT_CURLY": "RIGHT_CURLY",
+	"RIGHT_CURLY": "LEFT_CURLY",
+	"LEFT_BRACE": "RIGHT_BRACE",
+	"RIGHT_BRACE": "LEFT_BRACE"
+}
+
+JSDOC.Lang.isNumber = function(str) {
+	return /^(\.[0-9]|[0-9]+\.|[0-9])[0-9]*([eE][+-][0-9]+)?$/i.test(str);
+}
+
+JSDOC.Lang.isHexDec = function(str) {
+	return /^0x[0-9A-F]+$/i.test(str);
+}
+
+JSDOC.Lang.isWordChar = function(str) {
+	return /^[a-zA-Z0-9$_.]+$/.test(str);
+}
+
+JSDOC.Lang.isSpace = function(str) {
+	return (typeof JSDOC.Lang.whitespace(str) != "undefined");
+}
+
+JSDOC.Lang.isNewline = function(str) {
+	return (typeof JSDOC.Lang.newline(str) != "undefined");
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/Parser.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/Parser.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/Parser.js	(revision 4056)
@@ -0,0 +1,109 @@
+if (typeof JSDOC == "undefined") JSDOC = {};
+
+/**
+	@namespace
+	@requires JSDOC.Walker
+	@requires JSDOC.Symbol
+	@requires JSDOC.DocComment
+*/
+JSDOC.Parser = {
+	conf: {
+		ignoreCode:               JSDOC.opt.n,
+		ignoreAnonymous:           true, // factory: true
+		treatUnderscoredAsPrivate: true, // factory: true
+		explain:                   false // factory: false
+	},
+	
+	addSymbol: function(symbol) {
+		// if a symbol alias is documented more than once the last one with the user docs wins
+		if (JSDOC.Parser.symbols.hasSymbol(symbol.alias)) {
+			var oldSymbol = JSDOC.Parser.symbols.getSymbol(symbol.alias);
+
+			if (oldSymbol.comment.isUserComment) {
+				if (symbol.comment.isUserComment) { // old and new are both documented
+					LOG.warn("The symbol '"+symbol.alias+"' is documented more than once.");
+				}
+				else { // old is documented but new isn't
+					return;
+				}
+			}
+		}
+		
+		// we don't document anonymous things
+		if (JSDOC.Parser.conf.ignoreAnonymous && symbol.name.match(/\$anonymous\b/)) return;
+
+		// uderscored things may be treated as if they were marked private, this cascades
+		if (JSDOC.Parser.conf.treatUnderscoredAsPrivate && symbol.name.match(/[.#-]_[^.#-]+$/)) {
+			if (!symbol.comment.getTag("public")) symbol.isPrivate = true;
+		}
+		
+		// -p flag is required to document private things
+		if (!JSDOC.opt.p && symbol.isPrivate) return; // issue #161 fixed by mcbain.asm
+		
+		// ignored things are not documented, this doesn't cascade
+		if (symbol.isIgnored) return;
+		
+		JSDOC.Parser.symbols.addSymbol(symbol);
+	},
+	
+	addBuiltin: function(name) {
+		var builtin = new JSDOC.Symbol(name, [], "CONSTRUCTOR", new JSDOC.DocComment(""));
+		builtin.isNamespace = true;
+		builtin.srcFile = "";
+		builtin.isPrivate = false;
+		JSDOC.Parser.addSymbol(builtin);
+		return builtin;
+	},
+	
+	init: function() {
+		JSDOC.Parser.symbols = new JSDOC.SymbolSet();
+		JSDOC.Parser.walker = new JSDOC.Walker();
+	},
+	
+	finish: function() {
+		JSDOC.Parser.symbols.relate();		
+		
+		// make a litle report about what was found
+		if (JSDOC.Parser.conf.explain) {
+			var symbols = JSDOC.Parser.symbols.toArray();
+			var srcFile = "";
+			for (var i = 0, l = symbols.length; i < l; i++) {
+				var symbol = symbols[i];
+				if (srcFile != symbol.srcFile) {
+					srcFile = symbol.srcFile;
+					print("\n"+srcFile+"\n-------------------");
+				}
+				print(i+":\n  alias => "+symbol.alias + "\n  name => "+symbol.name+ "\n  isa => "+symbol.isa + "\n  memberOf => " + symbol.memberOf + "\n  isStatic => " + symbol.isStatic + ",  isInner => " + symbol.isInner);
+			}
+			print("-------------------\n");
+		}
+	}
+}
+
+JSDOC.Parser.parse = function(/**JSDOC.TokenStream*/ts, /**String*/srcFile) {
+	JSDOC.Symbol.srcFile = (srcFile || "");
+	JSDOC.DocComment.shared = ""; // shared comments don't cross file boundaries
+	
+	if (!JSDOC.Parser.walker) JSDOC.Parser.init();
+	JSDOC.Parser.walker.walk(ts); // adds to our symbols
+	
+	// filter symbols by option
+	for (p in JSDOC.Parser.symbols._index) {
+		var symbol = JSDOC.Parser.symbols.getSymbol(p);
+		
+		if (!symbol) continue;
+		
+		if (symbol.is("FILE") || symbol.is("GLOBAL")) {
+			continue;
+		}
+		else if (!JSDOC.opt.a && !symbol.comment.isUserComment) {
+			JSDOC.Parser.symbols.deleteSymbol(symbol.alias);
+		}
+		
+		if (/#$/.test(symbol.alias)) { // we don't document prototypes
+			JSDOC.Parser.symbols.deleteSymbol(symbol.alias);
+		}
+	}
+	
+	return JSDOC.Parser.symbols.toArray();
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js	(revision 4056)
@@ -0,0 +1,33 @@
+/**
+	@namespace Holds functionality related to running plugins.
+*/
+JSDOC.PluginManager = {
+}
+
+/**
+	@param name A unique name that identifies that plugin.
+	@param handlers A collection of named functions. The names correspond to hooks in the core code.
+*/
+JSDOC.PluginManager.registerPlugin = function(/**String*/name, /**Object*/handlers) {
+	if (!defined(JSDOC.PluginManager.plugins))
+		/** The collection of all plugins. Requires a unique name for each.
+		*/
+		JSDOC.PluginManager.plugins = {};
+	
+	
+	JSDOC.PluginManager.plugins[name] = handlers;
+}
+
+/**
+	@param hook The name of the hook that is being caught.
+	@param target Any object. This will be passed as the only argument to the handler whose
+	name matches the hook name. Handlers cannot return a value, so must modify the target
+	object to have an effect.
+*/
+JSDOC.PluginManager.run = function(/**String*/hook, /**Mixed*/target) {
+	for (var name in JSDOC.PluginManager.plugins) {
+		if (defined(JSDOC.PluginManager.plugins[name][hook])) {
+			JSDOC.PluginManager.plugins[name][hook](target);
+		}
+	}
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/Symbol.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/Symbol.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/Symbol.js	(revision 4056)
@@ -0,0 +1,600 @@
+if (typeof JSDOC == "undefined") JSDOC = {};
+
+/**
+	Create a new Symbol.
+	@class Represents a symbol in the source code.
+ */
+JSDOC.Symbol = function() {
+	this.init();
+	if (arguments.length) this.populate.apply(this, arguments);
+}
+
+JSDOC.Symbol.prototype.init = function() {
+	this.$args = [];
+	this.addOn = "";
+	this.alias = "";
+	this.augments = [];
+	this.author = "";
+	this.classDesc = "";
+	this.comment = {};
+	this.defaultValue = undefined;
+	this.deprecated = "";
+	this.desc = "";
+	this.events = [];
+	this.example = [];
+	this.exceptions = [];
+	this.inherits = [];
+	this.inheritsFrom = [];
+	this.isa = "OBJECT";
+	this.isEvent = false;
+	this.isConstant = false;
+	this.isIgnored = false;
+	this.isInner = false;
+	this.isNamespace = false;
+	this.isPrivate = false;
+	this.isStatic = false;
+	this.memberOf = "";
+	this.methods = [];
+	this._name = "";
+	this._params = [];
+	this.properties = [];
+	this.requires = [];
+	this.returns = [];
+	this.see = [];
+	this.since = "";
+	this.srcFile = {};
+	this.type = "";
+	this.version = "";
+}
+
+JSDOC.Symbol.prototype.serialize = function() {
+	var keys = [];
+	for (var p in this) {
+		keys.push (p);
+	}
+	keys = keys.sort();
+	
+	var out = "";
+	for (var i in keys) {
+		if (typeof this[keys[i]] == "function") continue;
+		out += keys[i]+" => "+Dumper.dump(this[keys[i]])+",\n";
+	}
+	return "\n{\n" + out + "}\n";
+}
+
+JSDOC.Symbol.prototype.clone = function() {
+	var clone = new JSDOC.Symbol();
+	clone.populate.apply(clone, this.$args); // repopulate using the original arguments
+	clone.srcFile = this.srcFile; // not the current srcFile, the one when the original was made
+	return clone;
+}
+
+JSDOC.Symbol.prototype.__defineSetter__("name",
+	function(n) { n = n.replace(/^_global_[.#-]/, ""); n = n.replace(/\.prototype\.?/g, '#'); this._name = n; }
+);
+JSDOC.Symbol.prototype.__defineGetter__("name",
+	function() { return this._name; }
+);
+JSDOC.Symbol.prototype.__defineSetter__("params", 
+	function(v) {
+		for (var i = 0, l = v.length; i < l; i++) {
+			if (v[i].constructor != JSDOC.DocTag) { // may be a generic object parsed from signature, like {type:..., name:...}
+				this._params[i] = new JSDOC.DocTag("param"+((v[i].type)?" {"+v[i].type+"}":"")+" "+v[i].name);
+			}
+			else {
+				this._params[i] = v[i];
+			}
+		}
+	}
+);
+JSDOC.Symbol.prototype.__defineGetter__("params",
+	function() { return this._params; }
+);
+
+JSDOC.Symbol.prototype.populate = function(
+		/** String */ name,
+		/** Object[] */ params,
+		/** String */ isa,
+		/** JSDOC.DocComment */ comment
+) {
+	this.$args = arguments;
+	
+	this.name = name;
+	this.alias = this.name;
+	this.params = params;
+	this.isa = (isa == "VIRTUAL")? "OBJECT":isa;
+	this.comment = comment || new JSDOC.DocComment("");
+	this.srcFile = JSDOC.Symbol.srcFile;
+	
+	if (this.is("FILE") && !this.alias) this.alias = this.srcFile;
+
+	this.setTags();
+	
+	if (typeof JSDOC.PluginManager != "undefined") {
+		JSDOC.PluginManager.run("onSymbol", this);
+	}
+}
+
+JSDOC.Symbol.prototype.setTags = function() {
+	// @author
+	var authors = this.comment.getTag("author");
+	if (authors.length) {
+		this.author = authors.map(function($){return $.desc;}).join(", ");
+	}
+	
+	/*t:
+		plan(34, "testing JSDOC.Symbol");
+		
+		requires("../lib/JSDOC/DocComment.js");
+		requires("../frame/String.js");
+		requires("../lib/JSDOC/DocTag.js");
+
+		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@author Joe Smith*"+"/"));
+		is(sym.author, "Joe Smith", "@author tag, author is found.");
+	*/
+	
+	// @desc
+	var descs = this.comment.getTag("desc");
+	if (descs.length) {
+		this.desc = descs.map(function($){return $.desc;}).join("\n"); // multiple descriptions are concatenated into one
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@desc This is a description.*"+"/"));
+		is(sym.desc, "This is a description.", "@desc tag, description is found.");
+	*/
+	
+	// @overview
+	if (this.is("FILE")) {
+		if (!this.alias) this.alias = this.srcFile;
+		
+		var overviews = this.comment.getTag("overview");
+		if (overviews.length) {
+			this.desc = [this.desc].concat(overviews.map(function($){return $.desc;})).join("\n");
+		}
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@overview This is an overview.*"+"/"));
+		is(sym.desc, "\nThis is an overview.", "@overview tag, description is found.");
+	*/
+	
+	// @since
+	var sinces = this.comment.getTag("since");
+	if (sinces.length) {
+		this.since = sinces.map(function($){return $.desc;}).join(", ");
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@since 1.01*"+"/"));
+		is(sym.since, "1.01", "@since tag, description is found.");
+	*/
+	
+	// @constant
+	if (this.comment.getTag("constant").length) {
+		this.isConstant = true;
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@constant*"+"/"));
+		is(sym.isConstant, true, "@constant tag, isConstant set.");
+	*/
+	
+	// @version
+	var versions = this.comment.getTag("version");
+	if (versions.length) {
+		this.version = versions.map(function($){return $.desc;}).join(", ");
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@version 2.0x*"+"/"));
+		is(sym.version, "2.0x", "@version tag, version is found.");
+	*/
+	
+	// @deprecated
+	var deprecateds = this.comment.getTag("deprecated");
+	if (deprecateds.length) {
+		this.deprecated = deprecateds.map(function($){return $.desc;}).join("\n");
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@deprecated Use other method.*"+"/"));
+		is(sym.deprecated, "Use other method.", "@deprecated tag, desc is found.");
+	*/
+	
+	// @example
+	var examples = this.comment.getTag("example");
+	if (examples.length) {
+		this.example = examples.map(
+			// trim trailing whitespace
+			function($) {
+				$.desc = $.desc.replace(/\s+$/, "");
+				return $;
+			}
+		);
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@example This\n  is an example. \n*"+"/"));
+		isnt(typeof sym.example[0], "undefined", "@example tag, creates sym.example array.");
+		is(sym.example[0], "This\n  is an example.", "@example tag, desc is found.");
+	*/
+	
+	// @see
+	var sees = this.comment.getTag("see");
+	if (sees.length) {
+		var thisSee = this.see;
+		sees.map(function($){thisSee.push($.desc);});
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "FILE", new JSDOC.DocComment("/**@see The other thing.*"+"/"));
+		is(sym.see, "The other thing.", "@see tag, desc is found.");
+	*/
+	
+	// @class
+	var classes = this.comment.getTag("class");
+	if (classes.length) {
+		this.isa = "CONSTRUCTOR";
+		this.classDesc = classes[0].desc; // desc can't apply to the constructor as there is none.
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@class This describes the class.*"+"/"));
+		is(sym.isa, "CONSTRUCTOR", "@class tag, makes symbol a constructor.");
+		is(sym.classDesc, "This describes the class.", "@class tag, class description is found.");
+	*/
+	
+	// @namespace
+	var namespaces = this.comment.getTag("namespace");
+	if (namespaces.length) {
+		this.classDesc = namespaces[0].desc+"\n"+this.desc; // desc can't apply to the constructor as there is none.
+		this.isNamespace = true;
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@namespace This describes the namespace.*"+"/"));
+		is(sym.classDesc, "This describes the namespace.\n", "@namespace tag, class description is found.");
+	*/
+	
+	// @param
+	var params = this.comment.getTag("param");
+	if (params.length) {
+		// user-defined params overwrite those with same name defined by the parser
+		var thisParams = this.params;
+
+		if (thisParams.length == 0) { // none exist yet, so just bung all these user-defined params straight in
+			this.params = params;
+		}
+		else { // need to overlay these user-defined params on to existing parser-defined params
+			for (var i = 0, l = params.length; i < l; i++) {
+				if (thisParams[i]) {
+					if (params[i].type) thisParams[i].type = params[i].type;
+					thisParams[i].name = params[i].name;
+					thisParams[i].desc = params[i].desc;
+					thisParams[i].isOptional = params[i].isOptional;
+					thisParams[i].defaultValue = params[i].defaultValue;
+				}
+				else thisParams[i] = params[i];
+			}
+		}
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [{type: "array", name: "pages"}], "FUNCTION", new JSDOC.DocComment("/**Description.*"+"/"));
+		is(sym.params.length, 1, "parser defined param is found.");
+		
+		sym = new JSDOC.Symbol("foo", [], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {array} pages*"+"/"));
+		is(sym.params.length, 1, "user defined param is found.");
+		is(sym.params[0].type, "array", "user defined param type is found.");
+		is(sym.params[0].name, "pages", "user defined param name is found.");
+		
+		sym = new JSDOC.Symbol("foo", [{type: "array", name: "pages"}], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {string} uid*"+"/"));
+		is(sym.params.length, 1, "user defined param overwrites parser defined param.");
+		is(sym.params[0].type, "string", "user defined param type overwrites parser defined param type.");
+		is(sym.params[0].name, "uid", "user defined param name overwrites parser defined param name.");
+	
+		sym = new JSDOC.Symbol("foo", [{type: "array", name: "pages"}, {type: "number", name: "count"}], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {string} uid*"+"/"));
+		is(sym.params.length, 2, "user defined params  overlay parser defined params.");
+		is(sym.params[1].type, "number", "user defined param type overlays parser defined param type.");
+		is(sym.params[1].name, "count", "user defined param name overlays parser defined param name.");
+
+		sym = new JSDOC.Symbol("foo", [], "FUNCTION", new JSDOC.DocComment("/**Description.\n@param {array} pages The pages description.*"+"/"));
+		is(sym.params.length, 1, "user defined param with description is found.");
+		is(sym.params[0].desc, "The pages description.", "user defined param description is found.");
+	*/
+	
+	// @constructor
+	if (this.comment.getTag("constructor").length) {
+		this.isa = "CONSTRUCTOR";
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@constructor*"+"/"));
+		is(sym.isa, "CONSTRUCTOR", "@constructor tag, makes symbol a constructor.");
+	*/
+	
+	// @static
+	if (this.comment.getTag("static").length) {
+		this.isStatic = true;
+		if (this.isa == "CONSTRUCTOR") {
+			this.isNamespace = true;
+		}
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@static\n@constructor*"+"/"));
+		is(sym.isStatic, true, "@static tag, makes isStatic true.");
+		is(sym.isNamespace, true, "@static and @constructor tag, makes isNamespace true.");
+	*/
+	
+	// @inner
+	if (this.comment.getTag("inner").length) {
+		this.isInner = true;
+		this.isStatic = false;
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@inner*"+"/"));
+		is(sym.isStatic, false, "@inner tag, makes isStatic false.");
+		is(sym.isInner, true, "@inner makes isInner true.");
+	*/
+	
+	// @field
+	if (this.comment.getTag("field").length) {
+		this.isa = "OBJECT";
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "FUNCTION", new JSDOC.DocComment("/**@field*"+"/"));
+		is(sym.isa, "OBJECT", "@field tag, makes symbol an object.");
+	*/
+	
+	// @function
+	if (this.comment.getTag("function").length) {
+		this.isa = "FUNCTION";
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@function*"+"/"));
+		is(sym.isa, "FUNCTION", "@function tag, makes symbol a function.");
+	*/
+	
+	// @event
+	var events = this.comment.getTag("event");
+	if (events.length) {
+		this.isa = "FUNCTION";
+		this.isEvent = true;
+	}
+	
+	/*t:
+		var sym = new JSDOC.Symbol("foo", [], "OBJECT", new JSDOC.DocComment("/**@event*"+"/"));
+		is(sym.isa, "FUNCTION", "@event tag, makes symbol a function.");
+		is(sym.isEvent, true, "@event makes isEvent true.");
+	*/
+	
+	// @name
+	var names = this.comment.getTag("name");
+	if (names.length) {
+		this.name = names[0].desc;
+	}
+	
+	/*t:
+		// todo
+	*/
+	
+	// @property
+	var properties = this.comment.getTag("property");
+	if (properties.length) {
+		thisProperties = this.properties;
+		for (var i = 0; i < properties.length; i++) {
+			var property = new JSDOC.Symbol(this.alias+"#"+properties[i].name, [], "OBJECT", new JSDOC.DocComment("/**"+properties[i].desc+"\n@name "+properties[i].name+"\n@memberOf "+this.alias+"#*/"));
+			// TODO: shouldn't the following happen in the addProperty method of Symbol?
+			property.name = properties[i].name;
+			property.memberOf = this.alias;
+			if (properties[i].type) property.type = properties[i].type;
+			if (properties[i].defaultValue) property.defaultValue = properties[i].defaultValue;
+			this.addProperty(property);
+			JSDOC.Parser.addSymbol(property);
+		}
+	}
+	
+	/*t:
+		// todo
+	*/
+
+	// @return
+	var returns = this.comment.getTag("return");
+	if (returns.length) { // there can be many return tags in a single doclet
+		this.returns = returns;
+		this.type = returns.map(function($){return $.type}).join(", ");
+	}
+	
+	/*t:
+		// todo
+	*/
+	
+	// @exception
+	this.exceptions = this.comment.getTag("throws");
+	
+	/*t:
+		// todo
+	*/
+	
+	// @requires
+	var requires = this.comment.getTag("requires");
+	if (requires.length) {
+		this.requires = requires.map(function($){return $.desc});
+	}
+	
+	/*t:
+		// todo
+	*/
+	
+	// @type
+	var types = this.comment.getTag("type");
+	if (types.length) {
+		this.type = types[0].desc; //multiple type tags are ignored
+	}
+	
+	/*t:
+		// todo
+	*/
+	
+	// @private
+	if (this.comment.getTag("private").length || this.isInner) {
+		this.isPrivate = true;
+	}
+	
+	// @ignore
+	if (this.comment.getTag("ignore").length) {
+		this.isIgnored = true;
+	}
+	
+	/*t:
+		// todo
+	*/
+	
+	// @inherits ... as ...
+	var inherits = this.comment.getTag("inherits");
+	if (inherits.length) {
+		for (var i = 0; i < inherits.length; i++) {
+			if (/^\s*([a-z$0-9_.#-]+)(?:\s+as\s+([a-z$0-9_.#]+))?/i.test(inherits[i].desc)) {
+				var inAlias = RegExp.$1;
+				var inAs = RegExp.$2 || inAlias;
+
+				if (inAlias) inAlias = inAlias.replace(/\.prototype\.?/g, "#");
+				
+				if (inAs) {
+					inAs = inAs.replace(/\.prototype\.?/g, "#");
+					inAs = inAs.replace(/^this\.?/, "#");
+				}
+
+				if (inAs.indexOf(inAlias) != 0) { //not a full namepath
+					var joiner = ".";
+					if (this.alias.charAt(this.alias.length-1) == "#" || inAs.charAt(0) == "#") {
+						joiner = "";
+					}
+					inAs = this.alias + joiner + inAs;
+				}
+			}
+			this.inherits.push({alias: inAlias, as: inAs});
+		}
+	}
+	
+	/*t:
+		// todo
+	*/
+
+	// @augments
+	this.augments = this.comment.getTag("augments");
+	
+	// @default
+	var defaults = this.comment.getTag("default");
+	if (defaults.length) {
+		if (this.is("OBJECT")) {
+			this.defaultValue = defaults[0].desc;
+		}
+	}
+	
+	/*t:
+		// todo
+	*/
+	
+	// @memberOf
+	var memberOfs = this.comment.getTag("memberOf");
+	if (memberOfs.length) {
+		this.memberOf = memberOfs[0].desc;
+		this.memberOf = this.memberOf.replace(/\.prototype\.?/g, "#");
+	}
+
+	/*t:
+		// todo
+	*/
+	
+	// @public
+	if (this.comment.getTag("public").length) {
+		this.isPrivate = false;
+	}
+	
+	/*t:
+		// todo
+	*/
+}
+
+JSDOC.Symbol.prototype.is = function(what) {
+	return this.isa === what;
+}
+
+JSDOC.Symbol.prototype.isBuiltin = function() {
+	return JSDOC.Lang.isBuiltin(this.alias);
+}
+
+JSDOC.Symbol.prototype.setType = function(/**String*/comment, /**Boolean*/overwrite) {
+	if (!overwrite && this.type) return;
+	var typeComment = JSDOC.DocComment.unwrapComment(comment);
+	this.type = typeComment;
+}
+
+JSDOC.Symbol.prototype.inherit = function(symbol) {
+	if (!this.hasMember(symbol.name) && !symbol.isInner) {
+		if (symbol.is("FUNCTION"))
+			this.methods.push(symbol);
+		else if (symbol.is("OBJECT"))
+			this.properties.push(symbol);
+	}
+}
+
+JSDOC.Symbol.prototype.hasMember = function(name) {
+	return (this.hasMethod(name) || this.hasProperty(name));
+}
+
+JSDOC.Symbol.prototype.addMember = function(symbol) {
+	if (symbol.is("FUNCTION")) { this.addMethod(symbol); }
+	else if (symbol.is("OBJECT")) { this.addProperty(symbol); }
+}
+
+JSDOC.Symbol.prototype.hasMethod = function(name) {
+	var thisMethods = this.methods;
+	for (var i = 0, l = thisMethods.length; i < l; i++) {
+		if (thisMethods[i].name == name) return true;
+		if (thisMethods[i].alias == name) return true;
+	}
+	return false;
+}
+
+JSDOC.Symbol.prototype.addMethod = function(symbol) {
+	var methodAlias = symbol.alias;
+	var thisMethods = this.methods;
+	for (var i = 0, l = thisMethods.length; i < l; i++) {
+		if (thisMethods[i].alias == methodAlias) {
+			thisMethods[i] = symbol; // overwriting previous method
+			return;
+		}
+	}
+	thisMethods.push(symbol); // new method with this alias
+}
+
+JSDOC.Symbol.prototype.hasProperty = function(name) {
+	var thisProperties = this.properties;
+	for (var i = 0, l = thisProperties.length; i < l; i++) {
+		if (thisProperties[i].name == name) return true;
+		if (thisProperties[i].alias == name) return true;
+	}
+	return false;
+}
+
+JSDOC.Symbol.prototype.addProperty = function(symbol) {
+	var propertyAlias = symbol.alias;
+	var thisProperties = this.properties;
+	for (var i = 0, l = thisProperties.length; i < l; i++) {
+		if (thisProperties[i].alias == propertyAlias) {
+			thisProperties[i] = symbol; // overwriting previous property
+			return;
+		}
+	}
+
+	thisProperties.push(symbol); // new property with this alias
+}
+
+JSDOC.Symbol.srcFile = ""; //running reference to the current file being parsed
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js	(revision 4056)
@@ -0,0 +1,220 @@
+if (typeof JSDOC == "undefined") JSDOC = {};
+
+/** @constructor */
+JSDOC.SymbolSet = function() {
+	this.init();
+}
+
+JSDOC.SymbolSet.prototype.init = function() {
+	this._index = {};
+}
+
+JSDOC.SymbolSet.prototype.keys = function() {
+	var found = [];
+	for (var p in this._index) {
+		found.push(p);
+	}
+	return found;
+}
+
+JSDOC.SymbolSet.prototype.hasSymbol = function(alias) {
+	return this._index.hasOwnProperty(alias);
+}
+
+JSDOC.SymbolSet.prototype.addSymbol = function(symbol) {
+	if (this.hasSymbol(symbol.alias)) {
+		LOG.warn("Overwriting symbol documentation for: "+symbol.alias + ".");
+	}
+	this._index[symbol.alias] = symbol;
+}
+
+JSDOC.SymbolSet.prototype.getSymbol = function(alias) {
+	if (this.hasSymbol(alias)) return this._index[alias];
+}
+
+JSDOC.SymbolSet.prototype.getSymbolByName = function(name) {
+	for (var p in this._index) {
+		var symbol = this.getSymbol(p);
+		if (symbol.name == name) return symbol;
+	}
+}
+
+JSDOC.SymbolSet.prototype.toArray = function() {
+	var found = [];
+	for (var p in this._index) {
+		found.push(this._index[p]);
+	}
+	return found;
+}
+
+JSDOC.SymbolSet.prototype.deleteSymbol = function(alias) {
+	if (!this.hasSymbol(alias)) return;
+	delete this._index[alias];
+}
+
+JSDOC.SymbolSet.prototype.renameSymbol = function(oldName, newName) {
+	// todo: should check if oldname or newname already exist
+	this._index[newName] = this._index[oldName];
+	this.deleteSymbol(oldName);
+	this._index[newName].alias = newName;
+	return newName;
+}
+
+JSDOC.SymbolSet.prototype.relate = function() {
+	this.resolveBorrows();
+	this.resolveMemberOf();
+	this.resolveAugments();
+}
+
+JSDOC.SymbolSet.prototype.resolveBorrows = function() {
+	for (p in this._index) {
+		var symbol = this._index[p];
+		if (symbol.is("FILE") || symbol.is("GLOBAL")) continue;
+		
+		var borrows = symbol.inherits;
+		for (var i = 0; i < borrows.length; i++) {
+			var borrowed = this.getSymbol(borrows[i].alias);
+			if (!borrowed) {
+				LOG.warn("Can't borrow undocumented "+borrows[i].alias+".");
+				continue;
+			}
+			
+			var borrowAsName = borrows[i].as;
+			var borrowAsAlias = borrowAsName;
+			if (!borrowAsName) {
+				LOG.warn("Malformed @borrow, 'as' is required.");
+				continue;
+			}
+			
+			if (borrowAsName.length > symbol.alias.length && borrowAsName.indexOf(symbol.alias) == 0) {
+				borrowAsName = borrowAsName.replace(borrowed.alias, "")
+			}
+			else {
+				var joiner = "";
+				if (borrowAsName.charAt(0) != "#") joiner = ".";
+				borrowAsAlias = borrowed.alias + joiner + borrowAsName;
+			}
+			
+			borrowAsName = borrowAsName.replace(/^[#.]/, "");
+					
+			if (this.hasSymbol(borrowAsAlias)) continue;
+
+			var clone = borrowed.clone();
+			clone.name = borrowAsName;
+			clone.alias = borrowAsAlias;
+			this.addSymbol(clone);
+		}
+	}
+}
+
+JSDOC.SymbolSet.prototype.resolveMemberOf = function() {
+	for (var p in this._index) {
+		var symbol = this.getSymbol(p);
+		
+		if (symbol.is("FILE") || symbol.is("GLOBAL")) continue;
+		
+		// the memberOf value was provided in the @memberOf tag
+		else if (symbol.memberOf) {
+			var parts = symbol.alias.match(new RegExp("^("+symbol.memberOf+"[.#-])(.+)$"));
+			
+			// like foo.bar is a memberOf foo
+			if (parts) {
+				symbol.memberOf = parts[1];
+				symbol.name = parts[2];
+			}
+			// like bar is a memberOf foo
+			else {
+				var joiner = symbol.memberOf.charAt(symbol.memberOf.length-1);
+				if (!/[.#-]/.test(joiner)) symbol.memberOf += ".";
+				
+				this.renameSymbol(p, symbol.memberOf + symbol.name);
+			}
+		}
+		// the memberOf must be calculated
+		else {
+			var parts = symbol.alias.match(/^(.*[.#-])([^.#-]+)$/);
+			if (parts) {
+				symbol.memberOf = parts[1];
+				symbol.name = parts[2];				
+			}
+		}
+
+		// set isStatic, isInner
+		if (symbol.memberOf) {
+			switch (symbol.memberOf.charAt(symbol.memberOf.length-1)) {
+				case '#' :
+					symbol.isStatic = false;
+					symbol.isInner = false;
+				break;
+				case '.' :
+					symbol.isStatic = true;
+					symbol.isInner = false;
+				break;
+				case '-' :
+					symbol.isStatic = false;
+					symbol.isInner = true;
+				break;
+			}
+		}
+		
+		// unowned methods and fields belong to the global object
+		if (!symbol.is("CONSTRUCTOR") && !symbol.isNamespace && symbol.memberOf == "") {
+			symbol.memberOf = "_global_";
+		}
+		
+		// clean up
+		if (symbol.memberOf.match(/[.#-]$/)) {
+			symbol.memberOf = symbol.memberOf.substr(0, symbol.memberOf.length-1);
+		}
+		
+		// add to parent's methods or properties list
+		if (symbol.memberOf) {
+			var container = this.getSymbol(symbol.memberOf);
+			if (!container) {
+				if (JSDOC.Lang.isBuiltin(symbol.memberOf)) container = JSDOC.Parser.addBuiltin(symbol.memberOf);
+				else {
+					LOG.warn("Can't document "+symbol.name +" as a member of undocumented symbol "+symbol.memberOf+".");
+				}
+			}
+			
+			if (container) container.addMember(symbol);
+		}
+	}
+}
+
+JSDOC.SymbolSet.prototype.resolveAugments = function() {
+	for (var p in this._index) {
+		var symbol = this.getSymbol(p);
+		
+		if (symbol.alias == "_global_" || symbol.is("FILE")) continue;
+		JSDOC.SymbolSet.prototype.walk.apply(this, [symbol]);
+	}
+}
+
+JSDOC.SymbolSet.prototype.walk = function(symbol) {
+	var augments = symbol.augments;
+	for(var i = 0; i < augments.length; i++) {
+		var contributer = this.getSymbol(augments[i]);
+		if (contributer) {
+			if (contributer.augments.length) {
+				JSDOC.SymbolSet.prototype.walk.apply(this, [contributer]);
+			}
+			
+			symbol.inheritsFrom.push(contributer.alias);
+			if (!isUnique(symbol.inheritsFrom)) {
+				//LOG.warn("Can't resolve augments: Circular reference: "+symbol.alias+" inherits from "+contributer.alias+" more than once.");
+			}
+			else {
+				var cmethods = contributer.methods;
+				var cproperties = contributer.properties;
+				
+				for (var ci = 0, cl = cmethods.length; ci < cl; ci++)
+					symbol.inherit(cmethods[ci]);
+				for (var ci = 0, cl = cproperties.length; ci < cl; ci++)
+					symbol.inherit(cproperties[ci]);
+			}
+		}
+		else LOG.warn("Can't augment contributer: "+augments[i]+", not found.");
+	}
+}
+
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/TextStream.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/TextStream.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/TextStream.js	(revision 4056)
@@ -0,0 +1,41 @@
+
+/**
+	@constructor
+*/
+JSDOC.TextStream = function(text) {
+	if (typeof(text) == "undefined") text = "";
+	text = ""+text;
+	this.text = text;
+	this.cursor = 0;
+}
+
+JSDOC.TextStream.prototype.look = function(n) {
+	if (typeof n == "undefined") n = 0;
+	
+	if (this.cursor+n < 0 || this.cursor+n >= this.text.length) {
+		var result = new String("");
+		result.eof = true;
+		return result;
+	}
+	return this.text.charAt(this.cursor+n);
+}
+
+JSDOC.TextStream.prototype.next = function(n) {
+	if (typeof n == "undefined") n = 1;
+	if (n < 1) return null;
+	
+	var pulled = "";
+	for (var i = 0; i < n; i++) {
+		if (this.cursor+i < this.text.length) {
+			pulled += this.text.charAt(this.cursor+i);
+		}
+		else {
+			var result = new String("");
+			result.eof = true;
+			return result;
+		}
+	}
+
+	this.cursor += n;
+	return pulled;
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/Token.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/Token.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/Token.js	(revision 4056)
@@ -0,0 +1,18 @@
+if (typeof JSDOC == "undefined") JSDOC = {};
+
+/**
+	@constructor
+*/
+JSDOC.Token = function(data, type, name) {
+	this.data = data;
+	this.type = type;
+	this.name = name;
+}
+
+JSDOC.Token.prototype.toString = function() { 
+	return "<"+this.type+" name=\""+this.name+"\">"+this.data+"</"+this.type+">";
+}
+
+JSDOC.Token.prototype.is = function(what) {
+	return this.name === what || this.type === what;
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js	(revision 4056)
@@ -0,0 +1,332 @@
+if (typeof JSDOC == "undefined") JSDOC = {};
+
+/**
+	@class Search a {@link JSDOC.TextStream} for language tokens.
+*/
+JSDOC.TokenReader = function() {
+	this.keepDocs = true;
+	this.keepWhite = false;
+	this.keepComments = false;
+}
+
+/**
+	@type {JSDOC.Token[]}
+ */
+JSDOC.TokenReader.prototype.tokenize = function(/**JSDOC.TextStream*/stream) {
+	var tokens = [];
+	/**@ignore*/ tokens.last    = function() { return tokens[tokens.length-1]; }
+	/**@ignore*/ tokens.lastSym = function() {
+		for (var i = tokens.length-1; i >= 0; i--) {
+			if (!(tokens[i].is("WHIT") || tokens[i].is("COMM"))) return tokens[i];
+		}
+	}
+
+	while (!stream.look().eof) {
+		if (this.read_mlcomment(stream, tokens)) continue;
+		if (this.read_slcomment(stream, tokens)) continue;
+		if (this.read_dbquote(stream, tokens))   continue;
+		if (this.read_snquote(stream, tokens))   continue;
+		if (this.read_regx(stream, tokens))      continue;
+		if (this.read_numb(stream, tokens))      continue;
+		if (this.read_punc(stream, tokens))      continue;
+		if (this.read_space(stream, tokens))     continue;
+		if (this.read_newline(stream, tokens))   continue;
+		if (this.read_word(stream, tokens))      continue;
+		
+		// if execution reaches here then an error has happened
+		tokens.push(new JSDOC.Token(stream.next(), "TOKN", "UNKNOWN_TOKEN"));
+	}
+	return tokens;
+}
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_word = function(/**JSDOC.TokenStream*/stream, tokens) {
+	var found = "";
+	while (!stream.look().eof && JSDOC.Lang.isWordChar(stream.look())) {
+		found += stream.next();
+	}
+	
+	if (found === "") {
+		return false;
+	}
+	else {
+		var name;
+		if ((name = JSDOC.Lang.keyword(found))) tokens.push(new JSDOC.Token(found, "KEYW", name));
+		else tokens.push(new JSDOC.Token(found, "NAME", "NAME"));
+		return true;
+	}
+}
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_punc = function(/**JSDOC.TokenStream*/stream, tokens) {
+	var found = "";
+	var name;
+	while (!stream.look().eof && JSDOC.Lang.punc(found+stream.look())) {
+		found += stream.next();
+	}
+	
+	if (found === "") {
+		return false;
+	}
+	else {
+		tokens.push(new JSDOC.Token(found, "PUNC", JSDOC.Lang.punc(found)));
+		return true;
+	}
+}
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_space = function(/**JSDOC.TokenStream*/stream, tokens) {
+	var found = "";
+	
+	while (!stream.look().eof && JSDOC.Lang.isSpace(stream.look())) {
+		found += stream.next();
+	}
+	
+	if (found === "") {
+		return false;
+	}
+	else {
+		if (this.collapseWhite) found = " ";
+		if (this.keepWhite) tokens.push(new JSDOC.Token(found, "WHIT", "SPACE"));
+		return true;
+	}
+}
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_newline = function(/**JSDOC.TokenStream*/stream, tokens) {
+	var found = "";
+	
+	while (!stream.look().eof && JSDOC.Lang.isNewline(stream.look())) {
+		found += stream.next();
+	}
+	
+	if (found === "") {
+		return false;
+	}
+	else {
+		if (this.collapseWhite) found = "\n";
+		if (this.keepWhite) tokens.push(new JSDOC.Token(found, "WHIT", "NEWLINE"));
+		return true;
+	}
+}
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_mlcomment = function(/**JSDOC.TokenStream*/stream, tokens) {
+	if (stream.look() == "/" && stream.look(1) == "*") {
+		var found = stream.next(2);
+		
+		while (!stream.look().eof && !(stream.look(-1) == "/" && stream.look(-2) == "*")) {
+			found += stream.next();
+		}
+		
+		// to start doclet we allow /** or /*** but not /**/ or /****
+		if (/^\/\*\*([^\/]|\*[^*])/.test(found) && this.keepDocs) tokens.push(new JSDOC.Token(found, "COMM", "JSDOC"));
+		else if (this.keepComments) tokens.push(new JSDOC.Token(found, "COMM", "MULTI_LINE_COMM"));
+		return true;
+	}
+	return false;
+}
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_slcomment = function(/**JSDOC.TokenStream*/stream, tokens) {
+	var found;
+	if (
+		(stream.look() == "/" && stream.look(1) == "/" && (found=stream.next(2)))
+		|| 
+		(stream.look() == "<" && stream.look(1) == "!" && stream.look(2) == "-" && stream.look(3) == "-" && (found=stream.next(4)))
+	) {
+		
+		while (!stream.look().eof && !JSDOC.Lang.isNewline(stream.look())) {
+			found += stream.next();
+		}
+		
+		if (this.keepComments) {
+			tokens.push(new JSDOC.Token(found, "COMM", "SINGLE_LINE_COMM"));
+		}
+		return true;
+	}
+	return false;
+}
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_dbquote = function(/**JSDOC.TokenStream*/stream, tokens) {
+	if (stream.look() == "\"") {
+		// find terminator
+		var string = stream.next();
+		
+		while (!stream.look().eof) {
+			if (stream.look() == "\\") {
+				if (JSDOC.Lang.isNewline(stream.look(1))) {
+					do {
+						stream.next();
+					} while (!stream.look().eof && JSDOC.Lang.isNewline(stream.look()));
+					string += "\\\n";
+				}
+				else {
+					string += stream.next(2);
+				}
+			}
+			else if (stream.look() == "\"") {
+				string += stream.next();
+				tokens.push(new JSDOC.Token(string, "STRN", "DOUBLE_QUOTE"));
+				return true;
+			}
+			else {
+				string += stream.next();
+			}
+		}
+	}
+	return false; // error! unterminated string
+}
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_snquote = function(/**JSDOC.TokenStream*/stream, tokens) {
+	if (stream.look() == "'") {
+		// find terminator
+		var string = stream.next();
+		
+		while (!stream.look().eof) {
+			if (stream.look() == "\\") { // escape sequence
+				string += stream.next(2);
+			}
+			else if (stream.look() == "'") {
+				string += stream.next();
+				tokens.push(new JSDOC.Token(string, "STRN", "SINGLE_QUOTE"));
+				return true;
+			}
+			else {
+				string += stream.next();
+			}
+		}
+	}
+	return false; // error! unterminated string
+}
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_numb = function(/**JSDOC.TokenStream*/stream, tokens) {
+	if (stream.look() === "0" && stream.look(1) == "x") {
+		return this.read_hex(stream, tokens);
+	}
+	
+	var found = "";
+	
+	while (!stream.look().eof && JSDOC.Lang.isNumber(found+stream.look())){
+		found += stream.next();
+	}
+	
+	if (found === "") {
+		return false;
+	}
+	else {
+		if (/^0[0-7]/.test(found)) tokens.push(new JSDOC.Token(found, "NUMB", "OCTAL"));
+		else tokens.push(new JSDOC.Token(found, "NUMB", "DECIMAL"));
+		return true;
+	}
+}
+/*t:
+	requires("../lib/JSDOC/TextStream.js");
+	requires("../lib/JSDOC/Token.js");
+	requires("../lib/JSDOC/Lang.js");
+	
+	plan(3, "testing JSDOC.TokenReader.prototype.read_numb");
+	
+	//// setup
+	var src = "function foo(num){while (num+8.0 >= 0x20 && num < 0777){}}";
+	var tr = new JSDOC.TokenReader();
+	var tokens = tr.tokenize(new JSDOC.TextStream(src));
+	
+	var hexToken, octToken, decToken;
+	for (var i = 0; i < tokens.length; i++) {
+		if (tokens[i].name == "HEX_DEC") hexToken = tokens[i];
+		if (tokens[i].name == "OCTAL") octToken = tokens[i];
+		if (tokens[i].name == "DECIMAL") decToken = tokens[i];
+	}
+	////
+	
+	is(decToken.data, "8.0", "decimal number is found in source.");
+	is(hexToken.data, "0x20", "hexdec number is found in source (issue #99).");
+	is(octToken.data, "0777", "octal number is found in source.");
+*/
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_hex = function(/**JSDOC.TokenStream*/stream, tokens) {
+	var found = stream.next(2);
+	
+	while (!stream.look().eof) {
+		if (JSDOC.Lang.isHexDec(found) && !JSDOC.Lang.isHexDec(found+stream.look())) { // done
+			tokens.push(new JSDOC.Token(found, "NUMB", "HEX_DEC"));
+			return true;
+		}
+		else {
+			found += stream.next();
+		}
+	}
+	return false;
+}
+
+/**
+	@returns {Boolean} Was the token found?
+ */
+JSDOC.TokenReader.prototype.read_regx = function(/**JSDOC.TokenStream*/stream, tokens) {
+	var last;
+	if (
+		stream.look() == "/"
+		&& 
+		(
+			
+			(
+				!(last = tokens.lastSym()) // there is no last, the regex is the first symbol
+				|| 
+				(
+					   !last.is("NUMB")
+					&& !last.is("NAME")
+					&& !last.is("RIGHT_PAREN")
+					&& !last.is("RIGHT_BRACKET")
+				)
+			)
+		)
+	) {
+		var regex = stream.next();
+		
+		while (!stream.look().eof) {
+			if (stream.look() == "\\") { // escape sequence
+				regex += stream.next(2);
+			}
+			else if (stream.look() == "/") {
+				regex += stream.next();
+				
+				while (/[gmi]/.test(stream.look())) {
+					regex += stream.next();
+				}
+				
+				tokens.push(new JSDOC.Token(regex, "REGX", "REGX"));
+				return true;
+			}
+			else {
+				regex += stream.next();
+			}
+		}
+		// error: unterminated regex
+	}
+	return false;
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js	(revision 4056)
@@ -0,0 +1,133 @@
+if (typeof JSDOC == "undefined") JSDOC = {};
+
+/**
+	@constructor
+*/
+JSDOC.TokenStream = function(tokens) {
+	this.tokens = (tokens || []);
+	this.rewind();
+}
+
+/**
+	@constructor
+	@private
+*/
+function VoidToken(/**String*/type) {
+	this.toString = function() {return "<VOID type=\""+type+"\">"};
+	this.is = function(){return false;}
+}
+
+JSDOC.TokenStream.prototype.rewind = function() {
+	this.cursor = -1;
+}
+
+/**
+	@type JSDOC.Token
+*/
+JSDOC.TokenStream.prototype.look = function(/**Number*/n, /**Boolean*/considerWhitespace) {
+	if (typeof n == "undefined") n = 0;
+
+	if (considerWhitespace == true) {
+		if (this.cursor+n < 0 || this.cursor+n > this.tokens.length) return {};
+		return this.tokens[this.cursor+n];
+	}
+	else {
+		var count = 0;
+		var i = this.cursor;
+
+		while (true) {
+			if (i < 0) return new JSDOC.Token("", "VOID", "START_OF_STREAM");
+			else if (i > this.tokens.length) return new JSDOC.Token("", "VOID", "END_OF_STREAM");
+
+			if (i != this.cursor && (this.tokens[i] === undefined || this.tokens[i].is("WHIT"))) {
+				if (n < 0) i--; else i++;
+				continue;
+			}
+			
+			if (count == Math.abs(n)) {
+				return this.tokens[i];
+			}
+			count++;
+			(n < 0)? i-- : i++;
+		}
+
+		return new JSDOC.Token("", "VOID", "STREAM_ERROR"); // because null isn't an object and caller always expects an object
+	}
+}
+
+/**
+	@type JSDOC.Token|JSDOC.Token[]
+*/
+JSDOC.TokenStream.prototype.next = function(/**Number*/howMany) {
+	if (typeof howMany == "undefined") howMany = 1;
+	if (howMany < 1) return null;
+	var got = [];
+
+	for (var i = 1; i <= howMany; i++) {
+		if (this.cursor+i >= this.tokens.length) {
+			return null;
+		}
+		got.push(this.tokens[this.cursor+i]);
+	}
+	this.cursor += howMany;
+
+	if (howMany == 1) {
+		return got[0];
+	}
+	else return got;
+}
+
+/**
+	@type JSDOC.Token[]
+*/
+JSDOC.TokenStream.prototype.balance = function(/**String*/start, /**String*/stop) {
+	if (!stop) stop = JSDOC.Lang.matching(start);
+	
+	var depth = 0;
+	var got = [];
+	var started = false;
+	
+	while ((token = this.look())) {
+		if (token.is(start)) {
+			depth++;
+			started = true;
+		}
+		
+		if (started) {
+			got.push(token);
+		}
+		
+		if (token.is(stop)) {
+			depth--;
+			if (depth == 0) return got;
+		}
+		if (!this.next()) break;
+	}
+}
+
+JSDOC.TokenStream.prototype.getMatchingToken = function(/**String*/start, /**String*/stop) {
+	var depth = 0;
+	var cursor = this.cursor;
+	
+	if (!start) {
+		start = JSDOC.Lang.matching(stop);
+		depth = 1;
+	}
+	if (!stop) stop = JSDOC.Lang.matching(start);
+	
+	while ((token = this.tokens[cursor])) {
+		if (token.is(start)) {
+			depth++;
+		}
+		
+		if (token.is(stop) && cursor) {
+			depth--;
+			if (depth == 0) return this.tokens[cursor];
+		}
+		cursor++;
+	}
+}
+
+JSDOC.TokenStream.prototype.insertAhead = function(/**JSDOC.Token*/token) {
+	this.tokens.splice(this.cursor+1, 0, token);
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/Util.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/Util.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/Util.js	(revision 4056)
@@ -0,0 +1,32 @@
+/**
+ * @namespace
+ * @deprecated Use {@link FilePath} instead.
+ */
+JSDOC.Util = {
+}
+
+/**
+ * @deprecated Use {@link FilePath.fileName} instead.
+ */
+JSDOC.Util.fileName = function(path) {
+	LOG.warn("JSDOC.Util.fileName is deprecated. Use FilePath.fileName instead.");
+	var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0);
+	return path.substring(nameStart);
+}
+
+/**
+ * @deprecated Use {@link FilePath.fileExtension} instead.
+ */
+JSDOC.Util.fileExtension = function(filename) {
+	LOG.warn("JSDOC.Util.fileExtension is deprecated. Use FilePath.fileExtension instead.");
+	return filename.split(".").pop().toLowerCase();
+};
+
+/**
+ * @deprecated Use {@link FilePath.dir} instead.
+ */
+JSDOC.Util.dir = function(path) {
+	LOG.warn("JSDOC.Util.dir is deprecated. Use FilePath.dir instead.");
+	var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0);
+	return path.substring(0, nameStart-1);
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/Walker.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/Walker.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/lib/JSDOC/Walker.js	(revision 4056)
@@ -0,0 +1,416 @@
+if (typeof JSDOC == "undefined") JSDOC = {};
+
+/** @constructor */
+JSDOC.Walker = function(/**JSDOC.TokenStream*/ts) {
+	this.init();
+	if (typeof ts != "undefined") {
+		this.walk(ts);
+	}
+}
+
+JSDOC.Walker.prototype.init = function() {
+	this.ts = null;
+
+	var globalSymbol = new JSDOC.Symbol("_global_", [], "GLOBAL", new JSDOC.DocComment(""));
+	globalSymbol.isNamespace = true;
+	globalSymbol.srcFile = "";
+	globalSymbol.isPrivate = false;
+	JSDOC.Parser.addSymbol(globalSymbol);
+	this.lastDoc = null;
+	this.token = null;
+	
+	/**
+		The chain of symbols under which we are currently nested.
+		@type Array
+	*/
+	this.namescope = [globalSymbol];
+	this.namescope.last = function(n){ if (!n) n = 0; return this[this.length-(1+n)] || "" };
+}
+
+JSDOC.Walker.prototype.walk = function(/**JSDOC.TokenStream*/ts) {
+	this.ts = ts;
+	while (this.token = this.ts.look()) {
+		if (this.token.popNamescope) {
+			
+			var symbol = this.namescope.pop();
+			if (symbol.is("FUNCTION")) {
+				if (this.ts.look(1).is("LEFT_PAREN") && symbol.comment.getTag("function").length == 0) {
+					symbol.isa = "OBJECT";
+				}
+			}
+		}
+		this.step();
+		if (!this.ts.next()) break;
+	}
+}
+
+JSDOC.Walker.prototype.step = function() {
+	if (this.token.is("JSDOC")) { // it's a doc comment
+	
+		var doc = new JSDOC.DocComment(this.token.data);
+		
+		if (doc.getTag("lends").length > 0) { // it's a new namescope
+			var lends = doc.getTag("lends")[0];
+
+			var name = lends.desc
+			if (!name) throw "@lends tag requires a value.";
+			
+			var symbol = new JSDOC.Symbol(name, [], "OBJECT", doc);
+			
+			this.namescope.push(symbol);
+			
+			var matching = this.ts.getMatchingToken("LEFT_CURLY");
+			if (matching) matching.popNamescope = name;
+			else LOG.warn("Mismatched } character. Can't parse code.");
+			
+			this.lastDoc = null;
+			return true;
+		}
+		else if (doc.getTag("name").length > 0 && doc.getTag("overview").length == 0) { // it's a virtual symbol
+			var virtualName = doc.getTag("name")[0].desc;
+			if (!virtualName) throw "@name tag requires a value.";
+			
+			var symbol = new JSDOC.Symbol(virtualName, [], "VIRTUAL", doc);
+			
+			JSDOC.Parser.addSymbol(symbol);
+			
+			this.lastDoc = null;
+			return true;
+		}
+		else if (doc.meta) { // it's a meta doclet
+			if (doc.meta == "@+") JSDOC.DocComment.shared = doc.src;
+			else if (doc.meta == "@-") JSDOC.DocComment.shared = "";
+			else if (doc.meta == "nocode+") JSDOC.Parser.conf.ignoreCode = true;
+			else if (doc.meta == "nocode-") JSDOC.Parser.conf.ignoreCode = JSDOC.opt.n;
+			else throw "Unrecognized meta comment: "+doc.meta;
+			
+			this.lastDoc = null;
+			return true;
+		}
+		else if (doc.getTag("overview").length > 0) { // it's a file overview
+			symbol = new JSDOC.Symbol("", [], "FILE", doc);
+			
+			JSDOC.Parser.addSymbol(symbol);
+			
+			this.lastDoc = null;
+			return true;
+		}
+		else {
+			this.lastDoc = doc;
+			return false;
+		}
+	}
+	else if (!JSDOC.Parser.conf.ignoreCode) { // it's code
+		if (this.token.is("NAME")) {
+			var symbol;
+			var name = this.token.data;
+			var doc = null; if (this.lastDoc) doc = this.lastDoc;
+			var params = [];
+			
+			// it's inside an anonymous object
+			if (this.ts.look(1).is("COLON") && this.ts.look(-1).is("LEFT_CURLY") && !(this.ts.look(-2).is("JSDOC") || this.namescope.last().comment.getTag("lends").length || this.ts.look(-2).is("ASSIGN") || this.ts.look(-2).is("COLON"))) {
+				name = "$anonymous";
+				name = this.namescope.last().alias+"-"+name
+				
+				params = [];
+				
+				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
+
+				JSDOC.Parser.addSymbol(symbol);
+				
+				this.namescope.push(symbol);
+				
+				var matching = this.ts.getMatchingToken(null, "RIGHT_CURLY");
+				if (matching) matching.popNamescope = name;
+				else LOG.warn("Mismatched } character. Can't parse code.");
+			}
+			// function foo() {}
+			else if (this.ts.look(-1).is("FUNCTION") && this.ts.look(1).is("LEFT_PAREN")) {
+				var isInner;
+				
+				if (this.lastDoc) doc = this.lastDoc;
+				name = this.namescope.last().alias+"-"+name;
+				if (!this.namescope.last().is("GLOBAL")) isInner = true;
+				
+				params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
+				
+				symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc);
+				if (isInner) symbol.isInner = true;
+				
+			
+				JSDOC.Parser.addSymbol(symbol);
+				
+				this.namescope.push(symbol);
+				
+				var matching = this.ts.getMatchingToken("LEFT_CURLY");
+				if (matching) matching.popNamescope = name;
+				else LOG.warn("Mismatched } character. Can't parse code.");
+			}
+			// foo = function() {}
+			else if (this.ts.look(1).is("ASSIGN") && this.ts.look(2).is("FUNCTION")) {
+				var isInner;
+				if (this.ts.look(-1).is("VAR") || this.isInner) {
+					name = this.namescope.last().alias+"-"+name
+					if (!this.namescope.last().is("GLOBAL")) isInner = true;
+				}
+				else if (name.indexOf("this.") == 0) {
+					name = this.resolveThis(name);
+				}
+				
+				if (this.lastDoc) doc = this.lastDoc;
+				params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
+				
+				symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc);
+				if (isInner) symbol.isInner = true;
+				
+				JSDOC.Parser.addSymbol(symbol);
+				
+				this.namescope.push(symbol);
+				
+				var matching = this.ts.getMatchingToken("LEFT_CURLY");
+				if (matching) matching.popNamescope = name;
+				else LOG.warn("Mismatched } character. Can't parse code.");
+			}
+			// foo = new function() {}
+			else if (this.ts.look(1).is("ASSIGN") && this.ts.look(2).is("NEW") && this.ts.look(3).is("FUNCTION")) {
+				var isInner;
+				if (this.ts.look(-1).is("VAR") || this.isInner) {
+					name = this.namescope.last().alias+"-"+name
+					if (!this.namescope.last().is("GLOBAL")) isInner = true;
+				}
+				else if (name.indexOf("this.") == 0) {
+					name = this.resolveThis(name);
+				}
+				
+				if (this.lastDoc) doc = this.lastDoc;
+				params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
+				
+				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
+				if (isInner) symbol.isInner = true;
+				
+			
+				JSDOC.Parser.addSymbol(symbol);
+				
+				symbol.scopeType = "INSTANCE";
+				this.namescope.push(symbol);
+				
+				var matching = this.ts.getMatchingToken("LEFT_CURLY");
+				if (matching) matching.popNamescope = name;
+				else LOG.warn("Mismatched } character. Can't parse code.");
+			}
+			// foo: function() {}
+			else if (this.ts.look(1).is("COLON") && this.ts.look(2).is("FUNCTION")) {
+				name = (this.namescope.last().alias+"."+name).replace("#.", "#");
+				
+				if (this.lastDoc) doc = this.lastDoc;
+				params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
+				
+				if (doc && doc.getTag("constructs").length) {
+					name = name.replace(/\.prototype(\.|$)/, "#");
+					
+					if (name.indexOf("#") > -1) name = name.match(/(^[^#]+)/)[0];
+					else name = this.namescope.last().alias;
+
+					symbol = new JSDOC.Symbol(name, params, "CONSTRUCTOR", doc);
+				}
+				else {
+					symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc);
+				}
+				
+				
+				JSDOC.Parser.addSymbol(symbol);
+				
+				this.namescope.push(symbol);
+				
+				var matching = this.ts.getMatchingToken("LEFT_CURLY");
+				if (matching) matching.popNamescope = name;
+				else LOG.warn("Mismatched } character. Can't parse code.");
+			}
+			// foo = {}
+			else if (this.ts.look(1).is("ASSIGN") && this.ts.look(2).is("LEFT_CURLY")) {
+				var isInner;
+				if (this.ts.look(-1).is("VAR") || this.isInner) {
+					name = this.namescope.last().alias+"-"+name
+					if (!this.namescope.last().is("GLOBAL")) isInner = true;
+				}
+				else if (name.indexOf("this.") == 0) {
+					name = this.resolveThis(name);
+				}
+				
+				if (this.lastDoc) doc = this.lastDoc;
+				
+				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
+				if (isInner) symbol.isInner = true;
+				
+			
+				if (doc) JSDOC.Parser.addSymbol(symbol);
+
+				this.namescope.push(symbol);
+				
+				var matching = this.ts.getMatchingToken("LEFT_CURLY");
+				if (matching) matching.popNamescope = name;
+				else LOG.warn("Mismatched } character. Can't parse code.");
+			}
+			// foo = x
+			else if (this.ts.look(1).is("ASSIGN")) {
+				
+				var isInner;
+				if (this.ts.look(-1).is("VAR") || this.isInner) {
+					name = this.namescope.last().alias+"-"+name
+					if (!this.namescope.last().is("GLOBAL")) isInner = true;
+				}
+				else if (name.indexOf("this.") == 0) {
+					name = this.resolveThis(name);
+				}
+				
+				if (this.lastDoc) doc = this.lastDoc;
+				
+				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
+				if (isInner) symbol.isInner = true;
+				
+			
+				if (doc) JSDOC.Parser.addSymbol(symbol);
+			}
+			// foo: {}
+			else if (this.ts.look(1).is("COLON") && this.ts.look(2).is("LEFT_CURLY")) {
+				name = (this.namescope.last().alias+"."+name).replace("#.", "#");
+				
+				if (this.lastDoc) doc = this.lastDoc;
+				
+				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
+				
+			
+				if (doc) JSDOC.Parser.addSymbol(symbol);
+				
+				this.namescope.push(symbol);
+				
+				var matching = this.ts.getMatchingToken("LEFT_CURLY");
+				if (matching) matching.popNamescope = name;
+				else LOG.warn("Mismatched } character. Can't parse code.");
+			}
+			// foo: x
+			else if (this.ts.look(1).is("COLON")) {
+				name = (this.namescope.last().alias+"."+name).replace("#.", "#");;
+				
+				if (this.lastDoc) doc = this.lastDoc;
+				
+				symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
+				
+			
+				if (doc) JSDOC.Parser.addSymbol(symbol);
+			}
+			// foo(...)
+			else if (this.ts.look(1).is("LEFT_PAREN")) {
+				var functionCall = {name: name};
+				if (!this.ts.look(2).is("RIGHT_PAREN")) functionCall.arg1 = this.ts.look(2).data;
+				
+				if (typeof JSDOC.PluginManager != "undefined") {
+					JSDOC.PluginManager.run("onFunctionCall", functionCall);
+					if (functionCall.doc) {
+						this.ts.insertAhead(new JSDOC.Token(functionCall.doc, "COMM", "JSDOC"));
+					}
+				}
+			}
+			this.lastDoc = null;
+		}
+		else if (this.token.is("FUNCTION")) { // it's an anonymous function
+			if (
+				(!this.ts.look(-1).is("COLON") || !this.ts.look(-1).is("ASSIGN"))
+				&& !this.ts.look(1).is("NAME")
+			) {
+				if (this.lastDoc) doc = this.lastDoc;
+				
+				name = "$anonymous";
+				name = this.namescope.last().alias+"-"+name
+				
+				params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
+				
+				symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc);
+				
+			
+				JSDOC.Parser.addSymbol(symbol);
+				
+				this.namescope.push(symbol);
+				
+				var matching = this.ts.getMatchingToken("LEFT_CURLY");
+				if (matching) matching.popNamescope = name;
+				else LOG.warn("Mismatched } character. Can't parse code.");
+			}
+		}
+	}
+	return true;
+}
+
+/**
+	Resolves what "this." means when it appears in a name.
+	@param name The name that starts with "this.".
+	@returns The name with "this." resolved.
+ */
+JSDOC.Walker.prototype.resolveThis = function(name) {
+	name.match(/^this\.(.+)$/)
+	var nameFragment = RegExp.$1;
+	if (!nameFragment) return name;
+	
+	var symbol = this.namescope.last();
+	var scopeType = symbol.scopeType || symbol.isa;
+
+	// if we are in a constructor function, `this` means the instance
+	if (scopeType == "CONSTRUCTOR") {
+		name = symbol.alias+"#"+nameFragment;
+	}
+	
+	// if we are in an anonymous constructor function, `this` means the instance
+	else if (scopeType == "INSTANCE") {
+		name = symbol.alias+"."+nameFragment;
+	}
+	
+	// if we are in a function, `this` means the container (possibly the global)
+	else if (scopeType == "FUNCTION") {
+		// in a method of a prototype, so `this` means the constructor
+		if (symbol.alias.match(/(^.*)[#.-][^#.-]+/)) {
+			var parentName = RegExp.$1;
+			var parent = JSDOC.Parser.symbols.getSymbol(parentName);
+
+			if (!parent) {
+				if (JSDOC.Lang.isBuiltin(parentName)) parent = JSDOC.Parser.addBuiltin(parentName);
+				else {
+					if (symbol.alias.indexOf("$anonymous") < 0) // these will be ignored eventually
+						LOG.warn("Can't document "+symbol.alias+" without first documenting "+parentName+".");
+				}
+			}
+			if (parent) name = parentName+(parent.is("CONSTRUCTOR")?"#":".")+nameFragment;
+		}
+		else {
+			parent = this.namescope.last(1);
+			name = parent.alias+(parent.is("CONSTRUCTOR")?"#":".")+nameFragment;
+		}
+	}
+	// otherwise it means the global
+	else {
+		name = nameFragment;
+	}
+	
+	return name;
+}
+
+JSDOC.Walker.onParamList = function(/**Array*/paramTokens) {
+	if (!paramTokens) {
+		LOG.warn("Malformed parameter list. Can't parse code.");
+		return [];
+	}
+	var params = [];
+	for (var i = 0, l = paramTokens.length; i < l; i++) {
+		if (paramTokens[i].is("JSDOC")) {
+			var paramType = paramTokens[i].data.replace(/(^\/\*\* *| *\*\/$)/g, "");
+			
+			if (paramTokens[i+1] && paramTokens[i+1].is("NAME")) {
+				i++;
+				params.push({type: paramType, name: paramTokens[i].data});
+			}
+		}
+		else if (paramTokens[i].is("NAME")) {
+			params.push({name: paramTokens[i].data});
+		}
+	}
+	return params;
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/main.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/main.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/main.js	(revision 4056)
@@ -0,0 +1,74 @@
+/**
+ * @version $Id: main.js 570 2008-04-07 23:54:50Z micmath $
+ */
+
+function main() {
+	IO.include("lib/JSDOC.js");
+	IO.includeDir("plugins/");
+	
+	if (JSDOC.opt.v) LOG.verbose = true;
+	if (JSDOC.opt.o) LOG.out = IO.open(JSDOC.opt.o);
+	
+	if (JSDOC.opt.T) {
+		LOG.inform("JsDoc Toolkit running in test mode at "+new Date()+".");
+		IO.include("frame/Testrun.js");
+		IO.include("test.js");
+	}
+	else {
+		LOG.inform("JsDoc Toolkit main() running at "+new Date()+".");
+		LOG.inform("With options: ");
+		for (var o in JSDOC.opt) {
+			LOG.inform("    "+o+": "+JSDOC.opt[o]);
+		}
+		
+		var jsdoc = new JSDOC.JsDoc();
+		
+		if (JSDOC.opt.Z) { // secret debugging option
+			LOG.warn("So you want to see the data structure, eh? This might hang if you have circular refs...");
+			IO.include("frame/Dumper.js");
+			var symbols = jsdoc.symbolSet.toArray();
+			for (var i = 0, l = symbols.length; i < l; i++) {
+				var symbol = symbols[i];
+				print("// symbol: " + symbol.alias);
+				print(symbol.serialize());
+			}
+		}
+		else {
+			var template = JSDOC.opt.t || System.getProperty("jsdoc.template.dir");
+
+			var handler = jsdoc.symbolSet.handler;
+			if (handler && handler.publish) {
+				handler.publish(jsdoc.symbolSet);
+			}
+			else {
+				if (typeof template != "undefined") {
+					try {
+						load(template+"/publish.js");
+						if (!publish) {
+							LOG.warn("No publish() function is defined in that template so nothing to do.");
+						}
+						else {
+							publish(jsdoc.symbolSet);
+						}
+					}
+					catch(e) {
+						LOG.warn("Sorry, that doesn't seem to be a valid template: "+template+"/publish.js : "+e);
+					}
+				}
+				else {
+					LOG.warn("No template or handlers given. Might as well read the usage notes.");
+					JSDOC.usage();
+				}
+			}
+		}
+	}
+	
+	if (LOG.warnings.length) {
+		print(LOG.warnings.length+" warning"+(LOG.warnings.length != 1? "s":"")+".");
+	}
+	
+	if (LOG.out) {
+		LOG.out.flush();
+		LOG.out.close();
+	}
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/commentSrcJson.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/commentSrcJson.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/commentSrcJson.js	(revision 4056)
@@ -0,0 +1,19 @@
+JSDOC.PluginManager.registerPlugin(
+	"JSDOC.commentSrcJson",
+	{
+		onDocCommentSrc: function(commentSrc) {
+			var json;
+			if (/^\s*@json\b/.test(commentSrc)) {
+				commentSrc = commentSrc.replace("@json", "");
+				eval("json = "+commentSrc);
+				var tagged = "";
+				for (var i in json) {
+					var tag = json[i];
+					// todo handle cases where tag is an object
+					tagged += "@"+i+" "+tag+"\n";
+				}
+				return tagged;
+			}
+		}
+	}
+);
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/frameworkPrototype.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/frameworkPrototype.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/frameworkPrototype.js	(revision 4056)
@@ -0,0 +1,16 @@
+JSDOC.PluginManager.registerPlugin(
+	"JSDOC.frameworkPrototype",
+	{
+		onPrototypeClassCreate: function(classCreator) {
+			var desc = "";
+			if (classCreator.comment) {
+				desc = classCreator.comment;
+			}
+			var insert = desc+"/** @name "+classCreator.name+"\n@constructor\n@scope "+classCreator.name+".prototype */"
+			
+			insert = insert.replace(/\*\/\/\*\*/g, "\n");
+			/*DEBUG*///print("insert is "+insert);
+			classCreator.addComment.data = insert;
+		}
+	}
+);
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/functionCall.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/functionCall.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/functionCall.js	(revision 4056)
@@ -0,0 +1,10 @@
+JSDOC.PluginManager.registerPlugin(
+	"JSDOC.functionCall",
+	{
+		onFunctionCall: function(functionCall) {
+			if (functionCall.name == "dojo.define" && functionCall.arg1) {
+				functionCall.doc = "/** @lends "+eval(functionCall.arg1)+".prototype */";
+			}
+		}
+	}
+);
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/publishSrcHilite.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/publishSrcHilite.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/publishSrcHilite.js	(revision 4056)
@@ -0,0 +1,62 @@
+JSDOC.PluginManager.registerPlugin(
+	"JSDOC.publishSrcHilite",
+	{
+		onPublishSrc: function(src) {
+			if (src.path in JsHilite.cache) {
+				return; // already generated src code
+			}
+			else JsHilite.cache[src.path] = true;
+		
+			try {
+				var sourceCode = IO.readFile(src.path);
+			}
+			catch(e) {
+				print(e.message);
+				quit();
+			}
+
+			var hiliter = new JsHilite(sourceCode, src.charset);
+			src.hilited = hiliter.hilite();
+		}
+	}
+);
+
+function JsHilite(src, charset) {
+
+	var tr = new JSDOC.TokenReader();
+	
+	tr.keepComments = true;
+	tr.keepDocs = true;
+	tr.keepWhite = true;
+	
+	this.tokens = tr.tokenize(new JSDOC.TextStream(src));
+	
+	// TODO is redefining toString() the best way?
+	JSDOC.Token.prototype.toString = function() { 
+		return "<span class=\""+this.type+"\">"+this.data.replace(/</g, "&lt;")+"</span>";
+	}
+	
+	if (!charset) charset = "utf-8";
+	
+	this.header = '<html><head><meta http-equiv="content-type" content="text/html; charset='+charset+'"> '+
+	"<style>\n\
+	.KEYW {color: #933;}\n\
+	.COMM {color: #bbb; font-style: italic;}\n\
+	.NUMB {color: #393;}\n\
+	.STRN {color: #393;}\n\
+	.REGX {color: #339;}\n\
+	.line {border-right: 1px dotted #666; color: #666; font-style: normal;}\n\
+	</style></head><body><pre>";
+	this.footer = "</pre></body></html>";
+	this.showLinenumbers = true;
+}
+
+JsHilite.cache = {};
+
+JsHilite.prototype.hilite = function() {
+	var hilited = this.tokens.join("");
+	var line = 1;
+	if (this.showLinenumbers) hilited = hilited.replace(/(^|\n)/g, function(m){return m+"<span class='line'>"+((line<10)? " ":"")+((line<100)? " ":"")+(line++)+"</span> "});
+	
+	return this.header+hilited+this.footer;
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/symbolLink.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/symbolLink.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/symbolLink.js	(revision 4056)
@@ -0,0 +1,9 @@
+JSDOC.PluginManager.registerPlugin(
+	"JSDOC.symbolLink",
+	{
+		onSymbolLink: function(link) {
+			// modify link.linkPath
+			// or link.linkText here
+		}
+	}
+);
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/tagParamConfig.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/tagParamConfig.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/tagParamConfig.js	(revision 4056)
@@ -0,0 +1,31 @@
+JSDOC.PluginManager.registerPlugin(
+	"JSDOC.tagParamConfig",
+	{
+		onDocCommentTags: function(comment) {
+			var currentParam = null;
+			var tags = comment.tags;
+			for (var i = 0, l = tags.length; i < l; i++) {
+				
+				if (tags[i].title == "param") {
+					if (tags[i].name.indexOf(".") == -1) {
+						currentParam = i;
+					}
+				}
+				else if (tags[i].title == "config") {
+					tags[i].title = "param";
+					if (currentParam == null) {
+						tags[i].name = "arguments"+"."+tags[i].name;
+					}
+					else if (tags[i].name.indexOf(tags[currentParam].name+".") != 0) {
+						tags[i].name = tags[currentParam].name+"."+tags[i].name;
+					}
+					currentParam != null
+					//tags[currentParam].properties.push(tags[i]);
+				}
+				else {
+					currentParam = null;
+				}
+			}
+		}
+	}
+);
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/tagSynonyms.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/tagSynonyms.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/plugins/tagSynonyms.js	(revision 4056)
@@ -0,0 +1,43 @@
+JSDOC.PluginManager.registerPlugin(
+	"JSDOC.tagSynonyms",
+	{
+		onDocCommentSrc: function(comment) {
+			comment.src = comment.src.replace(/@methodOf\b/i, "@function\n@memberOf");
+			comment.src = comment.src.replace(/@fieldOf\b/i, "@field\n@memberOf");
+		},
+		
+		onDocCommentTags: function(comment) {
+			for (var i = 0, l = comment.tags.length; i < l; i++) {
+				var title = comment.tags[i].title.toLowerCase();
+				var syn;
+				if ((syn = JSDOC.tagSynonyms.synonyms["="+title])) {
+					comment.tags[i].title = syn;
+				}
+			}
+		}
+	}
+);
+
+new Namespace(
+	"JSDOC.tagSynonyms",
+	function() {
+		JSDOC.tagSynonyms.synonyms = {
+			"=member":             "memberOf",
+			"=memberof":           "memberOf",
+			"=description":        "desc",
+			"=exception":          "throws",
+			"=argument":           "param",
+			"=returns":            "return",
+			"=classdescription":   "class",
+			"=fileoverview":       "overview",
+			"=extends":            "augments",
+			"=base":               "augments",
+			"=projectdescription": "overview",
+			"=classdescription":   "class",
+			"=link":               "see",
+			"=borrows":            "inherits",
+			"=scope":              "lends",
+			"=construct":          "constructor"
+		}
+	}
+);
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/run.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/run.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/run.js	(revision 4056)
@@ -0,0 +1,346 @@
+/**
+ * @fileOverview
+ * A bootstrap script that creates some basic required objects
+ * for loading other scripts.
+ * @author Michael Mathews, micmath@gmail.com
+ * @version $Id: run.js 554 2008-04-01 00:12:25Z micmath $
+ */
+
+/**
+ * @namespace Keep track of any messages from the running script.
+ */
+LOG = {
+	warn: function(msg, e) {
+		if (e) msg = e.fileName+", line "+e.lineNumber+": "+msg;
+		
+		msg = ">> WARNING: "+msg;
+		LOG.warnings.push(msg);
+		if (LOG.out) LOG.out.write(msg+"\n");
+		else print(msg);
+	},
+
+	inform: function(msg) {
+		msg = " > "+msg;
+		if (LOG.out) LOG.out.write(msg+"\n");
+		else if (typeof LOG.verbose != "undefined" && LOG.verbose) print(msg);
+	}
+};
+LOG.warnings = [];
+LOG.verbose = false
+LOG.out = undefined;
+
+/**
+ *	@class Manipulate a filepath.
+ */
+function FilePath(absPath, separator) {
+	this.slash =  separator || "/"; 
+	this.root = this.slash;
+	this.path = [];
+	this.file = "";
+	
+	var parts = absPath.split(/[\\\/]/);
+	if (parts) {
+		if (parts.length) this.root = parts.shift() + this.slash;
+		if (parts.length) this.file =  parts.pop()
+		if (parts.length) this.path = parts;
+	}
+	
+	this.path = this.resolvePath();
+}
+
+/** Collapse any dot-dot or dot items in a filepath. */
+FilePath.prototype.resolvePath = function() {
+	var resolvedPath = [];
+	for (var i = 0; i < this.path.length; i++) {
+		if (this.path[i] == "..") resolvedPath.pop();
+		else if (this.path[i] != ".") resolvedPath.push(this.path[i]);
+	}
+	return resolvedPath;
+}
+
+/** Trim off the filename. */
+FilePath.prototype.toDir = function() {
+	if (this.file) this.file = "";
+	return this;
+}
+
+/** Go up a directory. */
+FilePath.prototype.upDir = function() {
+	this.toDir();
+	if (this.path.length) this.path.pop();
+	return this;
+}
+
+FilePath.prototype.toString = function() {
+	return this.root
+		+ this.path.join(this.slash)
+		+ ((this.path.length > 0)? this.slash : "")
+		+ this.file;
+}
+
+/**
+ * Turn a path into just the name of the file.
+ */
+FilePath.fileName = function(path) {
+	var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0);
+	return path.substring(nameStart);
+}
+
+/**
+ * Get the extension of a filename
+ */
+FilePath.fileExtension = function(filename) {
+   return filename.split(".").pop().toLowerCase();
+};
+
+/**
+ * Turn a path into just the directory part.
+ */
+FilePath.dir = function(path) {
+	var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0);
+	return path.substring(0, nameStart-1);
+}
+
+
+importClass(java.lang.System);
+
+/**
+ * @namespace A collection of information about your system.
+ */
+SYS = {
+	/**
+	 * Information about your operating system: arch, name, version.
+	 * @type string
+	 */
+	os: [
+		new String(System.getProperty("os.arch")),
+		new String(System.getProperty("os.name")),
+		new String(System.getProperty("os.version"))
+	].join(", "),
+	
+	/**
+	 * Which way does your slash lean.
+	 * @type string
+	 */
+	slash: System.getProperty("file.separator")||"/",
+	
+	/**
+	 * The path to the working directory where you ran java.
+	 * @type string
+	 */
+	userDir: new String(System.getProperty("user.dir")),
+	
+	/**
+	 * Where is Java's home folder.
+	 * @type string
+	 */
+	javaHome: new String(System.getProperty("java.home")),
+	
+	/**
+	 * The absolute path to the directory containing this script.
+	 * @type string
+	 */
+	pwd: undefined
+};
+
+// jsrun appends an argument, with the path to here.
+if (arguments[arguments.length-1].match(/^-j=(.+)/)) {
+	if (RegExp.$1.charAt(0) == SYS.slash || RegExp.$1.charAt(1) == ":") { // absolute path to here
+		SYS.pwd = new FilePath(RegExp.$1).toDir().toString();
+	}
+	else { // relative path to here
+		SYS.pwd = new FilePath(SYS.userDir + SYS.slash + RegExp.$1).toDir().toString();
+	}
+	arguments.pop();
+}
+else {
+	print("The run.js script requires you use jsrun.jar.");
+	quit();
+}
+
+// shortcut
+var File = Packages.java.io.File;
+
+/**
+ * @namespace A collection of functions that deal with reading a writing to disk.
+ */
+IO = {
+
+	/**
+	 * Create a new file in the given directory, with the given name and contents.
+	 */
+	saveFile: function(/**string*/ outDir, /**string*/ fileName, /**string*/ content) {
+		var out = new Packages.java.io.PrintWriter(
+			new Packages.java.io.OutputStreamWriter(
+				new Packages.java.io.FileOutputStream(outDir+SYS.slash+fileName),
+				IO.encoding
+			)
+		);
+		out.write(content);
+		out.flush();
+		out.close();
+	},
+	
+	/**
+	 * @type string
+	 */
+	readFile: function(/**string*/ path) {
+		if (!IO.exists(path)) {
+			throw "File doesn't exist there: "+path;
+		}
+		return readFile(path, IO.encoding);
+	},
+
+	/**
+	 * @param inFile 
+	 * @param outDir
+	 * @param [fileName=The original filename]
+	 */
+	copyFile: function(/**string*/ inFile, /**string*/ outDir, /**string*/ fileName) {
+		if (fileName == null) fileName = FilePath.fileName(inFile);
+	
+		var inFile = new File(inFile);
+		var outFile = new File(outDir+SYS.slash+fileName);
+		
+		var bis = new Packages.java.io.BufferedInputStream(new Packages.java.io.FileInputStream(inFile), 4096);
+		var bos = new Packages.java.io.BufferedOutputStream(new Packages.java.io.FileOutputStream(outFile), 4096);
+		var theChar;
+		while ((theChar = bis.read()) != -1) {
+			bos.write(theChar);
+		}
+		bos.close();
+		bis.close();
+	},
+
+	/**
+	 * Creates a series of nested directories.
+	 */
+	mkPath: function(/**Array*/ path) {
+		if (path.constructor != Array) path = path.split(/[\\\/]/);
+		var make = "";
+		for (var i = 0, l = path.length; i < l; i++) {
+			make += path[i] + SYS.slash;
+			if (! IO.exists(make)) {
+				IO.makeDir(make);
+			}
+		}
+	},
+	
+	/**
+	 * Creates a directory at the given path.
+	 */
+	makeDir: function(/**string*/ path) {
+		(new File(path)).mkdir();
+	},
+
+	/**
+	 * @type string[]
+	 * @param dir The starting directory to look in.
+	 * @param [recurse=1] How many levels deep to scan.
+	 * @returns An array of all the paths to files in the given dir.
+	 */
+	ls: function(/**string*/ dir, /**number*/ recurse, _allFiles, _path) {
+		if (_path === undefined) { // initially
+			var _allFiles = [];
+			var _path = [dir];
+		}
+		if (_path.length == 0) return _allFiles;
+		if (recurse === undefined) recurse = 1;
+		
+		dir = new File(dir);
+		if (!dir.directory) return [String(dir)];
+		var files = dir.list();
+		
+		for (var f = 0; f < files.length; f++) {
+			var file = String(files[f]);
+			if (file.match(/^\.[^\.\/\\]/)) continue; // skip dot files
+	
+			if ((new File(_path.join(SYS.slash)+SYS.slash+file)).list()) { // it's a directory
+				_path.push(file);
+				if (_path.length-1 < recurse) IO.ls(_path.join(SYS.slash), recurse, _allFiles, _path);
+				_path.pop();
+			}
+			else {
+				_allFiles.push((_path.join(SYS.slash)+SYS.slash+file).replace(SYS.slash+SYS.slash, SYS.slash));
+			}
+		}
+	
+		return _allFiles;
+	},
+
+	/**
+	 * @type boolean
+	 */
+	exists: function(/**string*/ path) {
+		file = new File(path);
+	
+		if (file.isDirectory()){
+			return true;
+		}
+		if (!file.exists()){
+			return false;
+		}
+		if (!file.canRead()){
+			return false;
+		}
+		return true;
+	},
+
+	/**
+	 * 
+	 */
+	open: function(/**string*/ path, /**string*/ append) {
+		var append = true;
+		var outFile = new File(path);
+		var out = new Packages.java.io.PrintWriter(
+			new Packages.java.io.OutputStreamWriter(
+				new Packages.java.io.FileOutputStream(outFile, append),
+				IO.encoding
+			)
+		);
+		return out;
+	},
+
+	/**
+	 * Sets {@link IO.encoding}.
+	 * Encoding is used when reading and writing text to files,
+	 * and in the meta tags of HTML output.
+	 */
+	setEncoding: function(/**string*/ encoding) {
+		if (/ISO-8859-([0-9]+)/i.test(encoding)) {
+			IO.encoding = "ISO8859_"+RegExp.$1;
+		}
+		else {
+			IO.encoding = encoding;
+		}
+	},
+
+	/**
+	 * @default "utf-8"
+	 * @private
+	 */
+	encoding: "utf-8",
+	
+	/**
+	 * Load the given script.
+	 */
+	include: function(relativePath) {
+		load(SYS.pwd+relativePath);
+	},
+	
+	/**
+	 * Loads all scripts from the given directory path.
+	 */
+	includeDir: function(path) {
+		if (!path) return;
+		
+		for (var lib = IO.ls(SYS.pwd+path), i = 0; i < lib.length; i++) 
+			load(lib[i]);
+	}
+}
+
+// now run the application
+IO.include("frame.js");
+IO.include("main.js");
+
+main();
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/t/TestDoc.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/t/TestDoc.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/t/TestDoc.js	(revision 4056)
@@ -0,0 +1,144 @@
+var TestDoc = {
+	fails: 0,
+	plans: 0,
+	passes: 0,
+	results: []
+};
+
+TestDoc.record = function(result) {
+	TestDoc.results.push(result);
+	if (typeof result.verdict == "boolean") {
+		if (result.verdict === false) TestDoc.fails++;
+		if (result.verdict === true) TestDoc.passes++;
+	}
+}
+
+TestDoc.prove = function(filePath) {
+	if (typeof document != "undefined" && typeof document.write != "undefined") {
+		if (TestDoc.console) print = function(s) { TestDoc.console.appendChild(document.createTextNode(s+"\n")); }
+		else print = function(s) { document.write(s+"<br />"); }
+	}
+	TestDoc.run(TestDoc.readFile(filePath));
+}
+
+TestDoc.run = function(src) {
+	try { eval(src); } catch(e) { print("# ERROR! "+e); }
+	
+	var chunks = src.split(/\/\*t:/);
+	
+	var run = function(chunk) {
+		// local shortcuts
+		var is = TestDoc.assertEquals;
+		var isnt = TestDoc.assertNotEquals;
+		var plan = TestDoc.plan;
+		var requires = TestDoc.requires;
+		
+		try { eval(chunk); } catch(e) { print("# ERROR! "+e); }
+	}
+	for (var start = -1, end = 0; (start = src.indexOf("/*t:", end)) > end; start = end) {
+		run(
+			src.substring(
+				start+4,
+				(end = src.indexOf("*/", start))
+			)
+		);
+	}
+}
+
+TestDoc.Result = function(verdict, message) {
+	this.verdict = verdict;
+	this.message = message;
+}
+
+TestDoc.Result.prototype.toString = function() {
+	if (typeof this.verdict == "boolean") {
+		return (this.verdict? "ok" : "not ok") + " " + (++TestDoc.report.counter) + " - " + this.message;
+	}
+	
+	return "# " + this.message;
+}
+
+TestDoc.requires = function(file) {
+	if (!TestDoc.requires.loaded[file]) {
+		load(file);
+		TestDoc.requires.loaded[file] = true;
+	}
+}
+TestDoc.requires.loaded = {};
+
+TestDoc.report = function() {
+	TestDoc.report.counter = 0;
+	print("1.."+TestDoc.plans);
+	for (var i = 0; i < TestDoc.results.length; i++) {
+		print(TestDoc.results[i]);
+	}
+	print("----------------------------------------");
+	if (TestDoc.fails == 0 && TestDoc.passes == TestDoc.plans) {
+		print("All tests successful.");
+	}
+	else {
+		print("Failed " + TestDoc.fails + "/" + TestDoc.plans + " tests, "+((TestDoc.plans == 0)? 0 : Math.round(TestDoc.passes/(TestDoc.passes+TestDoc.fails)*10000)/100)+"% okay. Planned to run "+TestDoc.plans+", did run "+(TestDoc.passes+TestDoc.fails)+".")
+	}
+}
+
+TestDoc.plan = function(n, message) {
+	TestDoc.plans += n;
+	TestDoc.record(new TestDoc.Result(null, message+" ("+n+" tests)"));
+}
+
+TestDoc.assertEquals = function(a, b, message) {
+	var result = (a == b);
+	if (!result) message += "\n#\n# " + a + " does not equal " + b + "\n#";
+	TestDoc.record(new TestDoc.Result(result, message));
+}
+
+TestDoc.assertNotEquals = function(a, b, message) {
+	var result = (a != b);
+	if (!result) message += "\n#\n# " + a + " equals " + b + "\n#";
+	TestDoc.record(new TestDoc.Result(result, message));
+}
+
+TestDoc.readFile = (function(){
+	// rhino
+	if (typeof readFile == "function") {
+		return function(url) {
+			var text = readFile(url);
+			return text || "";
+		}
+	}
+
+	// a web browser
+	else {
+		return function(url) {
+			var httpRequest;
+		
+			if (window.XMLHttpRequest) { // Mozilla, Safari, etc
+				httpRequest = new XMLHttpRequest();
+			} 
+			else if (window.ActiveXObject) { // IE
+				try {
+					httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
+				} 
+				catch (e) {
+				   try {
+						httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
+					} 
+					catch (e) {
+					}
+				}
+			}
+		
+			if (!httpRequest) { throw "Cannot create HTTP Request."; }
+			
+			httpRequest.open('GET', url, false);
+			httpRequest.send('');
+			if (httpRequest.readyState == 4) {
+				if (httpRequest.status >= 400) {
+					throw "The HTTP Request returned an error code: "+httpRequest.status;
+				}
+			}
+			
+			return httpRequest.responseText || "";
+		}
+	}
+})();
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/t/runner.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/t/runner.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/t/runner.js	(revision 4056)
@@ -0,0 +1,13 @@
+// try: java -jar ../../jsrun.jar runner.js
+
+load("TestDoc.js");
+
+TestDoc.prove("../frame/Opt.js");
+TestDoc.prove("../lib/JSDOC.js");
+TestDoc.prove("../frame/String.js");
+TestDoc.prove("../lib/JSDOC/DocTag.js");
+TestDoc.prove("../lib/JSDOC/DocComment.js");
+TestDoc.prove("../lib/JSDOC/TokenReader.js");
+TestDoc.prove("../lib/JSDOC/Symbol.js");
+
+TestDoc.report();
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test.js	(revision 4056)
@@ -0,0 +1,304 @@
+load("app/frame/Dumper.js");
+function symbolize(opt) {
+	symbols = null;
+	jsdoc = new JSDOC.JsDoc(opt);
+	symbols = jsdoc.symbolSet;
+}
+
+
+var testCases = [
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/overview.js"]});
+		//print(Dumper.dump(symbols));	
+		is('symbols.getSymbolByName("My Cool Library").name', 'My Cool Library', 'File overview can be found by alias.');		
+	}
+	,
+	function() {
+		symbolize({_: [SYS.pwd+"test/name.js"]});
+
+		is('symbols.getSymbol("Response").name', "Response", 'Virtual class name is found.');
+		is('symbols.getSymbol("Response#text").alias', "Response#text", 'Virtual method name is found.');
+		is('symbols.getSymbol("Response#text").memberOf', "Response", 'Virtual method parent name is found.');
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/prototype.js"]});
+
+		is('symbols.getSymbol("Article").name', "Article", 'Function set to constructor prototype with inner constructor name is found.');
+		is('symbols.getSymbol("Article").hasMethod("init")', true, 'The initializer method name of prototype function is correct.');
+		is('symbols.getSymbol("Article").hasMember("counter")', true, 'A static property set in the prototype definition is found.');
+		is('symbols.getSymbol("Article").hasMember("title")', true, 'An instance property set in the prototype is found.');
+		is('symbols.getSymbol("Article#title").isStatic', false, 'An instance property has isStatic set to false.');
+		is('symbols.getSymbol("Article.counter").name', "counter", 'A static property set in the initializer has the name set correctly.');
+		is('symbols.getSymbol("Article.counter").memberOf', "Article", 'A static property set in the initializer has the memberOf set correctly.');
+		is('symbols.getSymbol("Article.counter").isStatic', true, 'A static property set in the initializer has isStatic set to true.');
+	}
+	,
+	function() {
+		symbolize({a:true, _: [SYS.pwd+"test/prototype_oblit.js"]});
+		
+		is('symbols.getSymbol("Article").name', "Article", 'Oblit set to constructor prototype name is found.');
+		is('typeof symbols.getSymbol("Article.prototype")', "undefined", 'The prototype oblit is not a symbol.');
+		is('symbols.getSymbol("Article#getTitle").name', "getTitle", 'The nonstatic method name of prototype oblit is correct.');
+		is('symbols.getSymbol("Article#getTitle").alias', "Article#getTitle", 'The alias of non-static method of prototype oblit is correct.');
+		is('symbols.getSymbol("Article#getTitle").isStatic', false, 'The isStatic of a nonstatic method of prototype oblit is correct.');
+		is('symbols.getSymbol("Article.getTitle").name', "getTitle", 'The static method name of prototype oblit is correct.');
+		is('symbols.getSymbol("Article.getTitle").isStatic', true, 'The isStatic of a static method of prototype oblit is correct.');
+		is('symbols.getSymbol("Article#getTitle").isa', "FUNCTION", 'The isa of non-static method of prototype oblit is correct.');
+		is('symbols.getSymbol("Article.getTitle").alias', "Article.getTitle", 'The alias of a static method of prototype oblit is correct.');
+		is('symbols.getSymbol("Article.getTitle").isa', "FUNCTION", 'The isa of static method of prototype oblit is correct.');
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/prototype_oblit_constructor.js"]});
+		
+		is('symbols.getSymbol("Article").name', "Article", 'Oblit set to constructor prototype with inner constructor name is found.');
+		is('symbols.getSymbol("Article#init").name', "init", 'The initializer method name of prototype oblit is correct.');
+		is('symbols.getSymbol("Article").hasMember("pages")', true, 'Property set by initializer method "this" is on the outer constructor.');
+		is('symbols.getSymbol("Article#Title").name', "Title", 'Name of the inner constructor name is found.');
+		is('symbols.getSymbol("Article#Title").memberOf', "Article", 'The memberOf of the inner constructor name is found.');
+		is('symbols.getSymbol("Article#Title").isa', "CONSTRUCTOR", 'The isa of the inner constructor name is constructor.');
+		is('symbols.getSymbol("Article#Title").hasMember("title")', true, 'A property set on the inner constructor "this"  is on the inner constructor.');
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/inner.js"]});
+		
+		is('symbols.getSymbol("Outer").name', "Outer", 'Outer constructor prototype name is found.');
+		is('symbols.getSymbol("Outer").methods.length', 1, 'Inner function doesnt appear as a method of the outer.');
+		is('symbols.getSymbol("Outer").hasMethod("open")', true, 'Outer constructors methods arent affected by inner function.');
+		is('symbols.getSymbol("Outer-Inner").alias', "Outer-Inner", 'Alias of inner function is found.');
+		is('symbols.getSymbol("Outer-Inner").isa', "CONSTRUCTOR", 'isa of inner function constructor is found.');
+		is('symbols.getSymbol("Outer-Inner").memberOf', "Outer", 'The memberOf of inner function is found.');
+		is('symbols.getSymbol("Outer-Inner").name', "Inner", 'The name of inner function is found.');
+		is('symbols.getSymbol("Outer-Inner#name").name', "name", 'A member of the inner function constructor, attached to "this" is found on inner.');
+		is('symbols.getSymbol("Outer-Inner#name").memberOf', "Outer-Inner", 'The memberOf of an inner function member is found.');		
+	}
+	,
+	function() {
+		symbolize({a:true, _: [SYS.pwd+"test/prototype_nested.js"]});
+		
+		is('symbols.getSymbol("Word").name', "Word", 'Base constructor name is found.');
+		is('symbols.getSymbol("Word").hasMethod("reverse")', true, 'Base constructor method is found.');
+		is('symbols.getSymbol("Word").methods.length', 1, 'Base constructor has only one method.');
+		is('symbols.getSymbol("Word").memberOf', "", 'Base constructor memberOf is empty.');
+		is('symbols.getSymbol("Word#reverse").name', "reverse", 'Member of constructor prototype name is found.');
+		is('symbols.getSymbol("Word#reverse").memberOf', "Word", 'Member of constructor prototype memberOf is found.');
+		is('symbols.getSymbol("Word#reverse.utf8").name', "utf8", 'Member of constructor prototype method name is found.');
+		is('symbols.getSymbol("Word#reverse.utf8").memberOf', "Word#reverse", 'Static nested member memberOf is found.');
+	}
+	,
+	function() {
+		symbolize({a:true, _: [SYS.pwd+"test/namespace_nested.js"]});
+		
+		is('symbols.getSymbol("ns1").name', "ns1", 'Base namespace name is found.');
+		is('symbols.getSymbol("ns1").memberOf', "", 'Base namespace memberOf is empty (its a constructor).');
+		is('symbols.getSymbol("ns1.ns2").name', "ns2", 'Nested namespace name is found.');
+ 		is('symbols.getSymbol("ns1.ns2").alias', "ns1.ns2", 'Nested namespace alias is found.');
+ 		is('symbols.getSymbol("ns1.ns2").memberOf', "ns1", 'Nested namespace memberOf is found.');
+ 		is('symbols.getSymbol("ns1.ns2.Function1").name', "Function1", 'Method of nested namespace name is found.');
+ 		is('symbols.getSymbol("ns1.ns2.Function1").memberOf', "ns1.ns2", 'Constructor of nested namespace memberOf is found.');			
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/functions_nested.js"]});
+		
+		is('symbols.getSymbol("Zop").name', "Zop", 'Any constructor name is found.');
+		is('symbols.getSymbol("Zop").isa', "CONSTRUCTOR", 'It isa constructor.');
+		is('symbols.getSymbol("Zop").hasMethod("zap")', true, 'Its method name, set later, is in methods array.');
+		is('symbols.getSymbol("Foo").name', "Foo", 'The containing constructor name is found.');
+		is('symbols.getSymbol("Foo").hasMethod("methodOne")', true, 'Its method name is found.');
+		is('symbols.getSymbol("Foo").hasMethod("methodTwo")', true, 'Its second method name is found.');
+		is('symbols.getSymbol("Foo#methodOne").alias', "Foo#methodOne", 'A methods alias is found.');
+		is('symbols.getSymbol("Foo#methodOne").isStatic', false, 'A methods is not static.');
+		is('symbols.getSymbol("Bar").name', "Bar", 'A global function declared inside another function is found.');
+		is('symbols.getSymbol("Bar").isa', "FUNCTION", 'It isa function.');
+		is('symbols.getSymbol("Bar").memberOf', "_global_", 'It is global.');
+		is('symbols.getSymbol("Foo-inner").name', "inner", 'An inner functions name is found.');
+		is('symbols.getSymbol("Foo-inner").memberOf', "Foo", 'It is member of the outer function.');
+		is('symbols.getSymbol("Foo-inner").isInner', true, 'It is an inner function.');
+	}
+	,
+	function() {
+		symbolize({a:true, _: [SYS.pwd+"test/memberof_constructor.js"]});
+		
+		is('symbols.getSymbol("Circle#Tangent").name', "Tangent", 'Constructor set on prototype using @member has correct name.');
+ 		is('symbols.getSymbol("Circle#Tangent").memberOf', "Circle", 'Constructor set on prototype using @member has correct memberOf.');
+ 		is('symbols.getSymbol("Circle#Tangent").alias', "Circle#Tangent", 'Constructor set on prototype using @member has correct alias.');
+ 		is('symbols.getSymbol("Circle#Tangent").isa', "CONSTRUCTOR", 'Constructor set on prototype using @member has correct isa.');
+		is('symbols.getSymbol("Circle#Tangent").isStatic', false, 'Constructor set on prototype using @member is not static.');
+		is('symbols.getSymbol("Circle#Tangent#getDiameter").name', "getDiameter", 'Method set on prototype using @member has correct name.');
+		is('symbols.getSymbol("Circle#Tangent#getDiameter").memberOf', "Circle#Tangent", 'Method set on prototype using @member has correct memberOf.');
+		is('symbols.getSymbol("Circle#Tangent#getDiameter").alias', "Circle#Tangent#getDiameter", 'Method set on prototype using @member has correct alias.');
+		is('symbols.getSymbol("Circle#Tangent#getDiameter").isa', "FUNCTION", 'Method set on prototype using @member has correct isa.');
+		is('symbols.getSymbol("Circle#Tangent#getDiameter").isStatic', false, 'Method set on prototype using @member is not static.');
+	}
+	,
+	function() {
+		symbolize({a:true, p: true,  _: [SYS.pwd+"test/memberof.js"]});
+		
+		is('symbols.getSymbol("pack.install").alias', "pack.install", 'Using @memberOf sets alias, when parent name is in memberOf tag.');
+		is('symbols.getSymbol("pack.install.overwrite").name', "install.overwrite", 'Using @memberOf sets name, even if the name is dotted.');
+		is('symbols.getSymbol("pack.install.overwrite").memberOf', "pack", 'Using @memberOf sets memberOf.');
+ 		is('symbols.getSymbol("pack.install.overwrite").isStatic', true, 'Using @memberOf with value not ending in octothorp sets isStatic to true.');
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/borrows.js"]});
+
+		is('symbols.getSymbol("Layout").name', "Layout", 'Constructor can be found.');
+		is('symbols.getSymbol("Layout").hasMethod("init")', true, 'Constructor method name can be found.');
+		is('symbols.getSymbol("Layout").hasMember("orientation")', true, 'Constructor property name can be found.');
+		
+		is('symbols.getSymbol("Page").hasMethod("reset")', true, 'Second constructor method name can be found.');
+		is('symbols.getSymbol("Page").hasMember("orientation")', true, 'Second constructor borrowed property name can be found in properties.');
+		is('symbols.getSymbol("Page#orientation").memberOf', "Page", 'Second constructor borrowed property memberOf can be found.');
+		is('symbols.getSymbol("Page").hasMethod("myGetInnerElements")', true, 'Can borrow an inner function, add it as a static function.');
+
+		is('symbols.getSymbol("ThreeColumnPage#init").alias', "ThreeColumnPage#init", 'Third constructor method can be found even though method with same name is borrowed.');
+		is('symbols.getSymbol("ThreeColumnPage#reset").alias', "ThreeColumnPage#reset", 'Borrowed method can be found.');
+		is('symbols.getSymbol("ThreeColumnPage#orientation").alias', "ThreeColumnPage#orientation", 'Twice borrowed method can be found.');
+	
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/borrows2.js"]});
+
+		is('symbols.getSymbol("Foo").hasMethod("my_zop")', true, 'Borrowed method can be found.');		
+		is('symbols.getSymbol("Bar").hasMethod("my_zip")', true, 'Second borrowed method can be found.');
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/constructs.js"]});
+
+		is('symbols.getSymbol("Person").hasMethod("say")', true, 'The constructs tag creates a class that lends can add a method to.');		
+	}
+	,
+	function() {
+		symbolize({a: true, _: [SYS.pwd+"test/augments.js", SYS.pwd+"test/augments2.js"]});
+		
+		is('symbols.getSymbol("Page").augments[0]', "Layout", 'An augmented class can be found.');
+		is('symbols.getSymbol("Page#reset").alias', "Page#reset", 'Method of augmenter can be found.');
+		is('symbols.getSymbol("Page").hasMethod("Layout#init")', true, 'Method from augmented can be found.');
+		is('symbols.getSymbol("Page").hasMember("Layout#orientation")', true, 'Property from augmented can be found.');
+		is('symbols.getSymbol("Page").methods.length', 3, 'Methods of augmented class are included in methods array.');
+	
+		is('symbols.getSymbol("ThreeColumnPage").augments[0]', "Page", 'The extends tag is a synonym for augments.');
+		is('symbols.getSymbol("ThreeColumnPage").hasMethod("ThreeColumnPage#init")', true, 'Local method overrides augmented method of same name.');
+		is('symbols.getSymbol("ThreeColumnPage").methods.length', 3, 'Local method count is right.');
+		
+		is('symbols.getSymbol("NewsletterPage").augments[0]', "ThreeColumnPage", 'Can augment across file boundaries.');
+		is('symbols.getSymbol("NewsletterPage").augments.length', 2, 'Multiple augments are supported.');
+		is('symbols.getSymbol("NewsletterPage").inherits[0].alias', "Junkmail#annoy", 'Inherited method with augments.');
+		is('symbols.getSymbol("NewsletterPage").methods.length', 6, 'Methods of augmented class are included in methods array across files.');
+		is('symbols.getSymbol("NewsletterPage").properties.length', 1, 'Properties of augmented class are included in properties array across files.');
+	}
+	,
+	function() {
+		symbolize({a:true, _: [SYS.pwd+"test/static_this.js"]});
+		
+		is('symbols.getSymbol("box.holder").name', "holder", 'Static namespace name can be found.');
+		is('symbols.getSymbol("box.holder.foo").name', "foo", 'Static namespace method name can be found.');
+		is('symbols.getSymbol("box.holder").isStatic', true, 'Static namespace method is static.');
+		
+		is('symbols.getSymbol("box.holder.counter").name', "counter", 'Instance namespace property name set on "this" can be found.');
+		is('symbols.getSymbol("box.holder.counter").alias', "box.holder.counter", 'Instance namespace property alias set on "this" can be found.');
+		is('symbols.getSymbol("box.holder.counter").memberOf', "box.holder", 'Static namespace property memberOf set on "this" can be found.');
+	}
+	,
+	function() {
+		symbolize({a:true, p: true, _: [SYS.pwd+"test/lend.js"]});
+
+		is('symbols.getSymbol("Person").name', "Person", 'Class defined in lend comment is found.');
+		is('symbols.getSymbol("Person").hasMethod("initialize")', true, 'Lent instance method name can be found.');
+		is('symbols.getSymbol("Person").hasMethod("say")', true, 'Second instance method can be found.');
+		is('symbols.getSymbol("Person#sing").isStatic', false, 'Instance method is known to be not static.');
+		
+		is('symbols.getSymbol("Person.getCount").name', "getCount", 'Static method name from second lend comment can be found.');
+		is('symbols.getSymbol("Person.getCount").isStatic', true, 'Static method from second lend comment is known to be static.');
+	
+		is('LOG.warnings.filter(function($){if($.indexOf("notok") > -1) return $}).length', 1, 'A warning is emitted when lending to an undocumented parent.');
+	}
+	,
+	function() {
+		symbolize({a:true, _: [SYS.pwd+"test/param_inline.js"]});
+	
+		is('symbols.getSymbol("Layout").params[0].type', "int", 'Inline param name is set.');
+		is('symbols.getSymbol("Layout").params[0].desc', "The number of columns.", 'Inline param desc is set from comment.');
+		is('symbols.getSymbol("Layout#getElement").params[0].name', "id", 'User defined param documentation takes precedence over parser defined.');
+		is('symbols.getSymbol("Layout#getElement").params[0].isOptional', true, 'Default for param is to not be optional.');
+		is('symbols.getSymbol("Layout#getElement").params[1].isOptional', false, 'Can mark a param as being optional.');
+		is('symbols.getSymbol("Layout#getElement").params[1].type', "number|string", 'Type of inline param doc can have multiple values.');
+		is('symbols.getSymbol("Layout#Canvas").params[0].type', "", 'Type can be not defined for some params.');
+		is('symbols.getSymbol("Layout#Canvas").params[2].type', "int", 'Type can be defined inline for only some params.');
+		is('symbols.getSymbol("Layout#rotate").params.length', 0, 'Docomments inside function sig is ignored without a param.');
+		is('symbols.getSymbol("Layout#init").params[2].type', "zoppler", 'Doc comment type overrides inline type for param with same name.');
+	}
+	,
+	function() {
+		symbolize({a: true, _: [SYS.pwd+"test/shared.js", SYS.pwd+"test/shared2.js"]});
+
+		is('symbols.getSymbol("Array#some").name', 'some', 'The name of a symbol in a shared section is found.');
+		is('symbols.getSymbol("Array#some").alias', 'Array#some', 'The alias of a symbol in a shared section is found.');
+		is('symbols.getSymbol("Array#some").desc', "Extension to builtin array.", 'A description can be shared.');
+		is('symbols.getSymbol("Array#filter").desc', "Extension to builtin array.\nChange every element of an array.", 'A shared description is appended.');
+		is('symbols.getSymbol("Queue").desc', "A first in, first out data structure.", 'A description is not shared when outside a shared section.');
+		is('symbols.getSymbol("Queue.rewind").alias', "Queue.rewind", 'Second shared tag can be started.');
+		is('symbols.getSymbol("startOver").alias', "startOver", 'Shared tag doesnt cross over files.');
+	}
+	,
+	function() {
+		symbolize({a: true, _: [SYS.pwd+"test/config.js"]});
+		is('symbols.getSymbol("Contact").params[0].name', 'person', 'The name of a param is found.');
+		is('symbols.getSymbol("Contact").params[1].name', 'person.name', 'The name of a param set with a dot name is found.');
+		is('symbols.getSymbol("Contact").params[2].name', 'person.age', 'The name of a param set with a dot name is found.');
+		is('symbols.getSymbol("Contact").params[4].name', 'connection', 'The name of a param after config is found.');
+		
+		is('symbols.getSymbol("Family").params[0].name', 'persons', 'Another name of a param is found.');
+		is('symbols.getSymbol("Family").params[1].name', 'persons.Father', 'The name of a param+config is found.');
+		is('symbols.getSymbol("Family").params[2].name', 'persons.Mother', 'The name of a second param+config is found.');
+		is('symbols.getSymbol("Family").params[3].name', 'persons.Children', 'The name of a third param+config is found.');
+			
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/ignore.js"]});
+		is('LOG.warnings.filter(function($){if($.indexOf("undocumented symbol Ignored") > -1) return $}).length', 1, 'A warning is emitted when documenting members of an ignored parent.');
+
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/functions_anon.js"]});
+		is('symbols.getSymbol("a.b").alias', 'a.b', 'In anonymous constructor this is found to be the container object.');
+		is('symbols.getSymbol("a.f").alias', 'a.f', 'In anonymous constructor this can have a method.');
+		is('symbols.getSymbol("a.c").alias', 'a.c', 'In anonymous constructor method this is found to be the container object.');
+		is('symbols.getSymbol("g").alias', 'g', 'In anonymous function executed inline this is the global.');
+		is('symbols.getSymbol("bar2.p").alias', 'bar2.p', 'In named constructor executed inline this is the container object.');
+		is('symbols.getSymbol("module.pub").alias', 'module.pub', 'In parenthesized anonymous function executed inline function scoped variables arent documented.');
+
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/oblit_anon.js"]});
+		is('symbols.getSymbol("opt").name', 'opt', 'Anonymous object properties are assigned to $anonymous.');
+		is('symbols.getSymbol("opt.conf.keep").alias', 'opt.conf.keep', 'Anonymous object properties are assigned to $anonymous.');
+		is('symbols.getSymbol("opt.conf.base").alias', 'opt.conf.base', 'Anonymous object properties are assigned to $anonymous.');
+		
+	}
+	,
+	function() {
+		symbolize({a:true, p:true, _: [SYS.pwd+"test/params_optional.js"]});
+		is('symbols.getSymbol("Document").params.length', 3, 'Correct number of params are found when optional param syntax is used.');
+		is('symbols.getSymbol("Document").params[1].name', "id", 'Name of optional param is found.');
+		is('symbols.getSymbol("Document").params[1].isOptional', true, 'Optional param is marked isOptional.');
+		is('symbols.getSymbol("Document").params[2].name', "title", 'Name of optional param with default value is found.');
+		is('symbols.getSymbol("Document").params[2].isOptional', true, 'Optional param with default value is marked isOptional.');
+		is('symbols.getSymbol("Document").params[2].defaultValue', " This is untitled.", 'Optional param default value is found.');
+
+
+	}
+];
+
+
+//// run and print results
+print(testrun(testCases));
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/addon.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/addon.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/addon.js	(revision 4056)
@@ -0,0 +1,24 @@
+String.prototype.reverse = function() {
+}
+
+String.prototype.reverse.utf8 = function() {
+}
+
+Function.count = function() {
+}
+
+/** @memberOf Function */
+Function.count.reset = function() {
+}
+
+/** @memberOf Function */
+count.getValue = function() {
+}
+
+/** @memberOf Function.prototype */
+getSig = function() {
+}
+
+/** @memberOf Function.prototype */
+Function.prototype.getProps = function() {
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/anon_inner.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/anon_inner.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/anon_inner.js	(revision 4056)
@@ -0,0 +1,14 @@
+/**
+ * @name bar
+ * @namespace
+ */
+ 
+new function() {
+    /**
+     * @name bar-foo
+     * @function
+     * @param {number} x
+     */
+    function foo(x) {
+    }
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/augments.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/augments.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/augments.js	(revision 4056)
@@ -0,0 +1,31 @@
+/**
+@constructor
+*/
+function Layout(p) {
+	this.init = function(p) {
+	}
+	
+	this.getId = function() {
+	}
+	
+	/** @type Page */
+	this.orientation = "landscape";
+}
+
+/**
+@constructor
+@augments Layout
+*/
+function Page() {
+	this.reset = function(b) {
+	}
+}
+
+/**
+@extends Page
+@constructor
+*/
+function ThreeColumnPage() {
+	this.init = function(resetCode) {
+	}
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/augments2.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/augments2.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/augments2.js	(revision 4056)
@@ -0,0 +1,26 @@
+/**
+@constructor
+*/
+function LibraryItem() {
+	this.reserve = function() {
+	}
+}
+
+/**
+@constructor
+*/
+function Junkmail() {
+	this.annoy = function() {
+	}
+}
+
+/**
+@inherits Junkmail.prototype.annoy as pester
+@augments ThreeColumnPage
+@augments LibraryItem
+@constructor
+*/
+function NewsletterPage() {
+	this.getHeadline = function() {
+	}
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/borrows.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/borrows.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/borrows.js	(revision 4056)
@@ -0,0 +1,41 @@
+/**
+@constructor
+*/
+function Layout(p) {
+	/** initilize 1 */
+	this.init = function(p) {
+	}
+	
+	/** get the id */
+	this.getId = function() {
+	}
+	
+	/** @type string */
+	this.orientation = "landscape";
+	
+	function getInnerElements(elementSecretId){
+	}
+}
+
+/**
+@constructor
+@borrows Layout#orientation as #orientation
+@borrows Layout-getInnerElements as myGetInnerElements
+*/
+function Page() {
+	/** reset the page */
+	this.reset = function(b) {
+	}
+}
+
+/**
+@constructor
+@borrows Layout.prototype.orientation as this.orientation
+@borrows Layout.prototype.init as #init
+@inherits Page.prototype.reset as #reset
+*/
+function ThreeColumnPage() {
+	/** initilize 2 */
+	this.init = function(p) {
+	}
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/borrows2.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/borrows2.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/borrows2.js	(revision 4056)
@@ -0,0 +1,23 @@
+// testing circular borrows
+
+/**
+	@class
+	@borrows Bar#zop as this.my_zop
+*/
+function Foo() {
+	/** this is a zip. */
+	this.zip = function() {}
+	
+	this.my_zop = new Bar().zop;
+}
+
+/**
+	@class
+	@borrows Foo#zip as this.my_zip
+*/
+function Bar() {
+	/** this is a zop. */
+	this.zop = function() {}
+	
+	this.my_zip = new Foo().zip;
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/config.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/config.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/config.js	(revision 4056)
@@ -0,0 +1,22 @@
+/**
+ * @constructor
+ * @param person The person.
+ * @param {string} person.name The person's name.
+ * @config {integer} age The person's age.
+ * @config [id=1] Optional id number to use.
+ * @param connection
+ */
+function Contact(person, connection) {
+
+}
+
+/**
+ * @constructor
+ * @param persons
+ * @config {string} Father The paternal person.
+ * @config {string} Mother The maternal person.
+ * @config {string[]} Children And the rest.
+ */
+function Family(/**Object*/persons) {
+
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/constructs.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/constructs.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/constructs.js	(revision 4056)
@@ -0,0 +1,18 @@
+var Person = makeClass(
+    /**
+      @scope Person
+    */
+    {
+        /**
+        	This is just another way to define a constructor.
+        	@constructs
+        	@param {string} name The name of the person.
+         */
+        initialize: function(name) {
+            this.name = name;
+        },
+        say: function(message) {
+            return this.name + " says: " + message;
+        }
+    }
+);
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/encoding.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/encoding.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/encoding.js	(revision 4056)
@@ -0,0 +1,10 @@
+
+/**
+ * @Constructor
+ * @desc 配置文件
+ * @class 什么也不返回
+ */
+function Test(conf) {
+    // do something;
+}
+
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/encoding_other.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/encoding_other.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/encoding_other.js	(revision 4056)
@@ -0,0 +1,12 @@
+
+/**
+ * @Constructor
+ * @desc ðïîÛ
+ * @class ßàáâãäåæçèçìëêíîï °±²³´µ¡¶·¸¹
+ */
+function Test(conf) {
+    // do something;
+}
+
+// run with commanline option -e=iso-8859-5
+
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/functions_anon.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/functions_anon.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/functions_anon.js	(revision 4056)
@@ -0,0 +1,39 @@
+/** an anonymous constructor executed inline */
+a = new function() {
+	/** a.b*/
+    this.b = 1;
+    /** a.f */
+    this.f = function() {
+    	/** a.c */
+    	this.c = 2;
+    }
+}
+
+
+/**
+	named function executed inline
+*/
+bar1 = function Zoola1() {
+	/** property of global */
+	this.g = 1;
+}();
+
+/**
+	named constructor executed inline
+*/
+bar2 = new function Zoola2() {
+	/** property of bar */
+	this.p = 1;
+};
+
+/** module pattern */
+module = (function () {
+	/** won't appear in documentation */
+	var priv = 1;
+	
+	/** @scope module */
+	return {
+		/** will appear as a property of module */
+		pub: 1
+	}
+})();
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/functions_nested.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/functions_nested.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/functions_nested.js	(revision 4056)
@@ -0,0 +1,33 @@
+/** @constructor */
+function Zop() {
+}
+
+/**
+ @class
+*/
+Foo = function(id) {
+	// this is a bit twisted, but if you call Foo() you will then
+	// modify Foo(). This is kinda, sorta non-insane, because you
+	// would have to call Foo() 100% of the time to use Foo's methods
+	Foo.prototype.methodOne = function(bar) {
+	  alert(bar);
+	};
+	
+	// same again
+	Foo.prototype.methodTwo = function(bar2) {
+	  alert(bar2);
+	};
+	
+	// and these are only executed if the enclosing function is actually called
+	// and who knows if that will ever happen?
+	Bar = function(pez) {
+	  alert(pez);
+	};
+	Zop.prototype.zap = function(p){
+		alert(p);
+	};
+	
+	// but this is only visible inside Foo
+	function inner() {
+	}
+};
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/global.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/global.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/global.js	(revision 4056)
@@ -0,0 +1,13 @@
+/** ecks */
+var x = [1, 2, 4];
+
+var y = {
+	foo: function(){
+	}
+}
+
+bar = function() {
+}
+
+function zop() {
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/globals.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/globals.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/globals.js	(revision 4056)
@@ -0,0 +1,25 @@
+function example(/**Circle*/a, b) {
+	/** a global defined in function  */
+	var number = a;
+	
+	var hideNumber = function(){
+	}
+	
+	setNumber = function(){
+	}
+	alert('You have chosen: ' + b);
+}
+
+function initPage() {
+	var supported = document.createElement && document.getElementsByTagName;
+	if (!supported) return;
+	// start of DOM script
+	var x = document.getElementById('writeroot');
+	// etc.
+}
+
+/** an example var */
+var document = new Document(x, y);
+
+var getNumber = function(){
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/ignore.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/ignore.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/ignore.js	(revision 4056)
@@ -0,0 +1,10 @@
+/**
+ * A test constructor.
+ * @constructor
+ * @ignore
+ */
+function Ignored() {
+	/** a method */
+    this.bar = function() {
+    }
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/inner.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/inner.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/inner.js	(revision 4056)
@@ -0,0 +1,16 @@
+/**
+ * @constructor
+ */
+function Outer() {
+  /**
+   * @constructor
+   */
+  function Inner(name) {
+    /** The name of this. */
+    this.name = name;
+  }
+
+  this.open = function(name) {
+    return (new Inner(name));
+  }
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/jsdoc_test.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/jsdoc_test.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/jsdoc_test.js	(revision 4056)
@@ -0,0 +1,477 @@
+/** 
+ * @fileoverview This file is to be used for testing the JSDoc parser
+ * It is not intended to be an example of good JavaScript OO-programming,
+ * nor is it intended to fulfill any specific purpose apart from 
+ * demonstrating the functionality of the 
+ * <a href='http://sourceforge.net/projects/jsdoc'>JSDoc</a> parser
+ *
+ * @author Gabriel Reid gab_reid@users.sourceforge.net
+ * @version 0.1 
+ */
+
+
+/**
+ * Construct a new Shape object.
+ * @class This is the basic Shape class.  
+ * It can be considered an abstract class, even though no such thing
+ * really existing in JavaScript
+ * @constructor
+ * @throws MemoryException if there is no more memory 
+ * @throws GeneralShapeException rarely (if ever)
+ * @return {Shape|Coordinate} A new shape.
+ */
+function Shape(){
+  
+   /**
+    * This is an example of a function that is not given as a property
+    * of a prototype, but instead it is assigned within a constructor.
+    * For inner functions like this to be picked up by the parser, the
+    * function that acts as a constructor <b>must</b> be denoted with
+    * the <b>&#64;constructor</b> tag in its comment.
+    * @type String
+    */
+   this.getClassName = function(){
+      return "Shape";
+   }
+
+   /** 
+    * This is an inner method, just used here as an example
+    * @since version 0.5
+    * @author Sue Smart
+    */
+   function addReference(){
+       // Do nothing...
+   }
+   
+}
+
+/**
+ * Create a new Hexagon instance.
+ * @extends Shape
+ * @class Hexagon is a class that is a <i>logical</i> sublcass of 
+ * {@link Shape} (thanks to the <code>&#64;extends</code> tag), but in 
+ * reality it is completely unrelated to Shape.
+ * @param {int} sideLength The length of one side for the new Hexagon
+ * @example
+ * var h = new Hexagon(2);
+ * @example
+ * if (hasHex) {
+ *     hex   = new Hexagon(5);
+ *     color = hex.getColor();
+ * }
+ */
+function Hexagon(sideLength) {
+}
+
+
+/**
+ * This is an unattached (static) function that adds two integers together.
+ * @param {int} One The first number to add 
+ * @param {int} Two The second number to add 
+ * @author Gabriel Reid
+ * @deprecated So you shouldn't use it anymore!
+ */
+function Add(One, Two){
+    return One + Two;
+}
+
+
+/**
+ * The color of this shape
+ * @type Color
+ */
+Shape.prototype.color = null;
+
+/**
+ * The border of this shape. 
+ * @field
+ * @type int
+ */
+Shape.prototype.border = function(){return border;};
+
+/*
+ * These are all the instance method implementations for Shape
+ */
+
+/**
+ * Get the coordinates of this shape. It is assumed that we're always talking
+ * about shapes in a 2D location here.
+ * @requires The {@link Shape} class
+ * @returns A Coordinate object representing the location of this Shape
+ * @type Coordinate[]
+ */
+Shape.prototype.getCoords = function(){
+   return this.coords;
+}
+
+/**
+ * Get the color of this shape.
+ * @see #setColor
+ * @see The <a href="http://example.com">Color</a> library.
+ * @link Shape
+ * @type Color
+ */
+Shape.prototype.getColor = function(){
+   return this.color;
+}
+
+/**
+ * Set the coordinates for this Shape
+ * @param {Coordinate} coordinates The coordinates to set for this Shape
+ */
+Shape.prototype.setCoords = function(coordinates){
+   this.coords = coordinates;
+}
+
+/**
+ * Set the color for this Shape
+ * @param {Color} color The color to set for this Shape
+ * @param other There is no other param, but it can still be documented if
+ *              optional parameters are used
+ * @throws NonExistantColorException (no, not really!)
+ * @see #getColor
+ */
+Shape.prototype.setColor = function(color){
+   this.color = color;
+}
+
+/**
+ * Clone this shape
+ * @returns A copy of this shape
+ * @type Shape
+ * @author Gabriel Reid
+ */
+Shape.prototype.clone = function(){
+   return new Shape();
+}
+
+/**
+ * Create a new Rectangle instance. 
+ * @class A basic rectangle class, inherits from Shape.
+ * This class could be considered a concrete implementation class
+ * @constructor
+ * @param {int} width The optional width for this Rectangle
+ * @param {int} height Thie optional height for this Rectangle
+ * @author Gabriel Reid
+ * @see Shape is the base class for this
+ * @augments Shape
+ * @hilited
+ */
+function Rectangle(width, // This is the width 
+                  height // This is the height
+                  ){
+   if (width){
+      this.width = width;
+      if (height){
+	 this.height = height;
+      }
+   }
+}
+
+
+/* Inherit from Shape */
+Rectangle.prototype = new Shape();
+
+/**
+ * Value to represent the width of the Rectangle.
+ * <br>Text in <b>bold</b> and <i>italic</i> and a 
+ * link to <a href="http://sf.net">SourceForge</a>
+ * @private
+ * @type int
+ */
+Rectangle.prototype.width = 0;
+
+/**
+ * Value to represent the height of the Rectangle
+ * @private
+ * @type int
+ */
+Rectangle.prototype.height = 0;
+
+/**
+ * Get the type of this object. 
+ * @type String
+ */
+Rectangle.prototype.getClassName= function(){
+    return "Rectangle";
+}
+
+/**
+ * Get the value of the width for the Rectangle
+ * @type int
+ * @see Rectangle#setWidth
+ */
+Rectangle.prototype.getWidth = function(){
+   return this.width;
+}
+
+/**
+ * Get the value of the height for the Rectangle.
+ * Another getter is the {@link Shape#getColor} method in the 
+ * {@link Shape} base class.  
+ * @return The height of this Rectangle
+ * @type int
+ * @see Rectangle#setHeight
+ */
+Rectangle.prototype.getHeight = function(){
+    return this.height;
+}
+
+/**
+ * Set the width value for this Rectangle.
+ * @param {int} width The width value to be set
+ * @see #setWidth
+ */
+Rectangle.prototype.setWidth = function(width){
+   this.width = width;
+}
+
+/**
+ * Set the height value for this Rectangle.
+ * @param {int} height The height value to be set
+ * @see #getHeight
+ */
+Rectangle.prototype.setHeight = function(height){
+   this.height = height;
+}
+
+/**
+ * Get the value for the total area of this Rectangle
+ * @return total area of this Rectangle
+ * @type int
+ */
+Rectangle.prototype.getArea = function(){
+   return width * height;
+}
+
+
+/**
+ * Create a new Square instance.
+ * @class A Square is a subclass of {@link Rectangle}
+ * @param {int} width The optional width for this Rectangle
+ * @param {int} height The optional height for this Rectangle
+ * @augments Rectangle
+ */
+function Square(width, height){
+   if (width){
+      this.width = width;
+      if (height){
+	 this.height = height;
+      }
+   } 
+   
+}
+
+/* Square is a subclass of Rectangle */
+Square.prototype = new Rectangle();
+
+/**
+ * Set the width value for this Shape.
+ * @param {int} width The width value to be set
+ * @see #getWidth
+ */
+Square.prototype.setWidth = function(width){
+   this.width = this.height = width;
+}
+
+/**
+ * Set the height value for this Shape 
+ * Sets the {@link Rectangle#height} attribute in the Rectangle.
+ * @param {int} height The height value to be set
+ */
+Square.prototype.setHeight = function(height){
+   this.height = this.width = height;
+}
+
+
+/**
+ * Create a new Circle instance based on a radius.
+ * @class Circle class is another subclass of Shape
+ * @extends Shape
+ * @param {int} radius The optional radius of this {@link Circle }
+ * @mixin Square.prototype.setWidth as this.setDiameter
+ */
+function Circle(radius){
+   if (radius) {
+      /** The radius of the this Circle. */
+      this.radius = radius;
+   }
+}
+
+/* Circle inherits from {@link Shape} */
+Circle.prototype = new Shape();
+
+/** 
+ * The radius value for this Circle 
+ * @private
+ * @type int
+ */
+Circle.prototype.radius = 0;
+
+/** 
+ * A very simple class (static) field that is also a constant
+ * @final
+ * @type float
+ */
+Circle.PI = 3.14;
+
+/**
+ * Get the radius value for this Circle
+ * @type int
+ * @see #setRadius
+ */
+Circle.prototype.getRadius = function(){
+   return this.radius;
+}
+
+/** 
+ * Set the radius value for this Circle
+ * @param {int} radius The {@link Circle#radius} value to set
+ * @see #getRadius
+ */
+Circle.prototype.setRadius = function(radius){
+   this.radius = radius;
+}
+
+/** 
+ * An example of a  class (static) method that acts as a factory for Circle
+ * objects. Given a radius value, this method creates a new Circle.
+ * @param {int} radius The radius value to use for the new Circle.
+ * @type Circle
+ */
+Circle.createCircle = function(radius){
+    return new Circle(radius);
+}
+
+
+/**
+ * Create a new Coordinate instance based on x and y grid data.
+ * @class Coordinate is a class that can encapsulate location information.
+ * @param {int} [x=0] The optional x portion of the Coordinate
+ * @param {int} [y=0] The optinal y portion of the Coordinate
+ */
+function Coordinate(x, y){
+   if (x){
+      this.x = x;
+      if (y){
+	 this.y = y;
+      }
+   }
+}
+
+/** 
+ * The x portion of the Coordinate 
+ * @type int
+ * @see #getX
+ * @see #setX
+ */
+Coordinate.prototype.x = 0;
+
+/** 
+ * The y portion of the Coordinate 
+ * @type int
+ * @see #getY
+ * @see #setY
+ */
+Coordinate.prototype.y = 0;
+
+/**
+ * Gets the x portion of the Coordinate.
+ * @type int
+ * @see #setX
+ */
+Coordinate.prototype.getX = function(){
+   return this.x;
+}
+
+/** 
+ * Get the y portion of the Coordinate.
+ * @type int
+ * @see #setY
+ */
+Coordinate.prototype.getY = function(){
+   return this.y;
+}
+
+/**
+ * Sets the x portion of the Coordinate.
+ * @param {int} x The x value to set
+ * @see #getX
+ */
+Coordinate.prototype.setX = function(x){
+   this.x = x;
+}
+
+/** 
+ * Sets the y portion of the Coordinate.
+ * @param {int} y The y value to set
+ * @see #getY
+ */
+Coordinate.prototype.setY = function(y){
+   this.y = y;
+}
+
+/**
+ * @class This class exists to demonstrate the assignment of a class prototype
+ * as an anonymous block.
+ */
+function ShapeFactory(){
+}
+
+ShapeFactory.prototype = {
+   /** 
+    * Creates a new {@link Shape} instance.
+    * @return A new {@link Shape}
+    * @type Shape
+    */
+   createShape: function(){
+      return new Shape();
+   }
+}
+
+/**
+ * An example of a singleton class
+ * @param ... Arguments represent {@link coordinate}s in the shape.
+ * @constructor
+ */
+MySingletonShapeFactory = function(){
+
+   /**
+    * Get the next {@link Shape}
+    * @type Shape
+    * @return A new {@link Shape}
+    */
+   this.getShape = function(){ 
+      return null; 
+   }
+
+}
+
+
+/** 
+ * Create a new Foo instance.
+ * @class This is the Foo class. It exists to demonstrate 'nested' classes.
+ * @constructor 
+ * @see Foo.Bar
+ */
+function Foo(){}
+
+/** 
+ * Creates a new instance of Bar.
+ * @class This class exists to demonstrate 'nested' classes.
+ * @constructor 
+ * @see Foo.Bar
+ */
+function Bar(){}
+
+/** 
+ * Nested class
+ * @constructor 
+ */
+Foo.Bar = function(){
+	/** The x. */ this.x = 2;
+}
+
+Foo.Bar.prototype = new Bar();
+/** The y. */ 
+Foo.Bar.prototype.y = '3';
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/lend.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/lend.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/lend.js	(revision 4056)
@@ -0,0 +1,33 @@
+ /** @class  */
+var Person = Class.create(
+    /**
+      @lends Person.prototype
+    */
+    {
+      initialize: function(name) {
+            this.name = name;
+        },
+        say: function(message) {
+            return this.name + ': ' + message;
+        }
+    }
+ );
+
+/** @lends Person.prototype */
+{
+	/** like say but more musical */
+	sing: function(song) {
+	}
+}
+
+/** @lends Person */
+{
+	getCount: function() {
+	}
+}
+
+/** @lends Unknown.prototype */
+{
+	notok: function() {
+	}
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/memberof.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/memberof.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/memberof.js	(revision 4056)
@@ -0,0 +1,20 @@
+/** @constructor */
+pack = function() {
+	this.init = function(){}
+	function config(){}
+}
+ 
+ pack.build = function(task) {};
+
+/** @memberOf pack */
+pack.install = function() {}
+
+/** @memberOf pack */
+pack.install.overwrite = function() {}
+
+/** @memberOf pack */
+clean = function() {}
+
+
+/** @memberOf pack-config */
+install = function() {};
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/memberof_constructor.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/memberof_constructor.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/memberof_constructor.js	(revision 4056)
@@ -0,0 +1,15 @@
+/** @constructor */
+function Circle(){}
+
+/**
+ @constructor
+ @memberOf Circle.prototype
+ */
+Tangent = function(){};
+
+/**
+	@member Circle.prototype.Tangent.prototype
+*/
+getDiameter = function(){};
+
+
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/name.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/name.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/name.js	(revision 4056)
@@ -0,0 +1,19 @@
+/**
+ @name Response
+ @class
+*/
+
+Response.prototype = {
+	/**
+	 @name Response#text
+	 @function
+	 @description
+		Gets the body of the response as plain text
+	 @returns {String}
+		Response as text
+	*/
+
+	text: function() {
+		return this.nativeResponse.responseText;
+	}
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/namespace_nested.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/namespace_nested.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/namespace_nested.js	(revision 4056)
@@ -0,0 +1,23 @@
+/** 
+	@namespace This is the first namespace.
+*/
+ns1 = {};
+
+/** 
+	This is the second namespace.
+	@namespace
+*/
+ns1.ns2 = {};
+
+/**
+	This part of ns1.ns2
+	@constructor
+*/
+ns1.ns2.Function1 = function() {
+};
+
+ns1.staticFunction = function() {
+};
+
+/** A static field in a namespace. */
+ns1.ns2.staticField = 1;
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/nocode.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/nocode.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/nocode.js	(revision 4056)
@@ -0,0 +1,13 @@
+/**#nocode+*/
+    /**
+      @name star
+      @function
+    */
+    function blahblah() {
+    
+    }
+/**#nocode-*/
+
+function yaddayadda() {
+
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/oblit_anon.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/oblit_anon.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/oblit_anon.js	(revision 4056)
@@ -0,0 +1,20 @@
+/** the options */
+opt = Opt.get(
+	arguments, 
+	{
+	 d: "directory",
+	 c: "conf",
+	 "D[]": "define"
+	}
+);
+
+/** configuration */
+opt.conf = {
+	/** keep */
+	keep: true,
+	/** base */
+	base: getBase(this, {p: properties})
+}
+
+
+
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/overview.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/overview.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/overview.js	(revision 4056)
@@ -0,0 +1,20 @@
+/**
+ * @overview This "library" contains a 
+ *               lot of classes and functions.
+ * @example
+ <pre>
+	var x (x < 1);
+	alert("This 'is' \"code\"");
+ </pre>
+ * @name My Cool Library
+ * @author 	Joe Smith jsmith@company.com
+ * @version 	0.1 
+ */
+ 
+/** 
+ * Gets the current foo 
+ * @param {String} fooId	The unique identifier for the foo.
+ * @return {Object}	Returns the current foo.
+ */
+function getFoo(fooID){
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/param_inline.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/param_inline.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/param_inline.js	(revision 4056)
@@ -0,0 +1,37 @@
+/**
+	@constructor
+	@param columns The number of columns.
+*/
+function Layout(/**int*/columns){
+	/**
+		@param [id] The id of the element.
+		@param elName The name of the element.
+	*/
+	this.getElement = function(
+		/** string */ elName,
+		/** number|string */ id
+	) {
+	};
+	
+	/** 
+		@constructor
+	 */
+	this.Canvas = function(top, left, /**int*/width, height) {
+		/** Is it initiated yet? */
+		this.initiated = true;
+	}
+	
+	this.rotate = function(/**nothing*/) {
+	}
+	
+	/** 
+	@param x
+	@param y
+	@param {zoppler} z*/
+	this.init = function(x, y, /**abbler*/z) {
+		/** The xyz. */
+		this.xyz = x+y+z;
+		this.getXyz = function() {
+		}
+	}
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/params_optional.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/params_optional.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/params_optional.js	(revision 4056)
@@ -0,0 +1,8 @@
+
+/**
+ * @param {Page[]} pages
+ * @param {number} [id] Specifies the id, if applicable.
+ * @param {String} [title = This is untitled.] Specifies the title.
+ */
+function Document(pages, id, title){
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/prototype.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/prototype.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/prototype.js	(revision 4056)
@@ -0,0 +1,17 @@
+/** @constructor */
+function Article() {
+}
+
+Article.prototype.init = function(title) {
+	/** the instance title */
+	this.title = title;
+	
+	/** the static counter */
+	Article.counter = 1;
+}
+
+a = new Article();
+a.Init("my title");
+
+print(a.title);
+print(Article.counter);
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/prototype_nested.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/prototype_nested.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/prototype_nested.js	(revision 4056)
@@ -0,0 +1,9 @@
+/** @constructor */
+function Word() {
+}
+
+Word.prototype.reverse = function() {
+}
+
+Word.prototype.reverse.utf8 = function() {
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/prototype_oblit.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/prototype_oblit.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/prototype_oblit.js	(revision 4056)
@@ -0,0 +1,13 @@
+/** @constructor */
+function Article() {
+}
+
+Article.prototype = {
+	/** instance get title */
+	getTitle: function(){
+	}
+}
+
+/** static get title */
+Article.getTitle = function(){
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/prototype_oblit_constructor.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/prototype_oblit_constructor.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/prototype_oblit_constructor.js	(revision 4056)
@@ -0,0 +1,24 @@
+/** @constructor */
+function Article() {
+}
+
+Article.prototype = {
+	/** @constructor */
+	Title: function(title) {
+		/** the value of the Title instance */
+		this.title = title;
+	},
+	
+	init: function(pages) {
+		/** the value of the pages of the Article instance */
+		this.pages = pages;
+	}
+}
+
+f = new Article();
+f.init("one two three");
+
+t = new f.Title("my title");
+
+print(f.pages);
+print(t.title);
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/public.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/public.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/public.js	(revision 4056)
@@ -0,0 +1,10 @@
+/**@constructor*/
+function Foo() {
+	/**
+		@public
+		@static
+		@field
+	*/
+	var bar = function(x) {
+	}
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/shared.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/shared.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/shared.js	(revision 4056)
@@ -0,0 +1,42 @@
+
+/**
+ * Builtin object.
+ * @class
+ * @name Array
+ */
+ 
+/**#@+
+ * Extension to builtin array.
+ * @memberOf Array
+ * @method
+ */
+ 
+/**
+ * @returns Boolen if some array members...
+ */
+Array.prototype.some = function(){};
+
+/**
+ * Change every element of an array.
+ * @returns Filtered array copy.
+ */
+Array.prototype.filter = function(){};
+
+/**#@-*/
+
+
+/**
+ * A first in, first out data structure.
+ * @constructor
+ */
+Queue = function(){};
+
+/**#@+
+ * Extension to Queue.
+ * @memberOf Queue
+ */
+
+rewind = function(){
+}
+
+// should close automatically here.
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/shared2.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/shared2.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/shared2.js	(revision 4056)
@@ -0,0 +1,2 @@
+startOver = function(){
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/shortcuts.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/shortcuts.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/shortcuts.js	(revision 4056)
@@ -0,0 +1,22 @@
+// /**#=+
+//  * {
+//  *	'D': 'Date.prototype',
+//  *	'$N': 'Number'
+//  * }
+//  */
+// var D = Date.prototype,
+// $N = Number;
+// 
+// D.locale = function(){
+// };
+// 
+// /**
+// 	@return {string} The cardinal number string.
+// */
+// $N.nth = function(n){
+// };
+// 
+// LOAD.file = function(){
+// }
+// 
+// /**#=-*/
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/static_this.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/static_this.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/static_this.js	(revision 4056)
@@ -0,0 +1,13 @@
+/** the parent */
+var box = {};
+
+/** @namespace */
+box.holder = {}
+
+box.holder.foo = function() {
+	/** the counter */
+	this.counter = 1;
+}
+
+box.holder.foo();
+print(box.holder.counter);
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/synonyms.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/synonyms.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/synonyms.js	(revision 4056)
@@ -0,0 +1,23 @@
+/**
+	@class
+	@inherits Bar#zop as #my_zop
+*/
+function Foo() {
+	/** this is a zip. */
+	this.zip = function() {}
+	
+	/** from Bar */
+	this.my_zop = new Bar().zop;
+}
+
+/**
+	@class
+	@borrows Foo#zip as this.my_zip
+*/
+function Bar() {
+	/** this is a zop. */
+	this.zop = function() {}
+	
+	/** from Foo */
+	this.my_zip = new Foo().zip;
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/tosource.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/tosource.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/tosource.js	(revision 4056)
@@ -0,0 +1,23 @@
+/**
+ * @param {Object} object
+ * @return {string}
+ */
+function valueOf(object) {}
+
+/**
+ * @param {Object} object
+ * @return {string}
+ */
+function toString(object) {}
+
+/**
+ * @param {Object} object
+ * @return {string}
+ */
+function toSource(object) {}
+
+/**
+ * @param {Object} object
+ * @return {string}
+ */
+function constructor(object) {}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/variable_redefine.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/variable_redefine.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/app/test/variable_redefine.js	(revision 4056)
@@ -0,0 +1,14 @@
+/** @constructor */
+function Foo() {
+	var bar = 1;
+	bar = 2; // redefining a private
+	
+	this.baz = 1;
+	baz = 2; // global
+	
+	/** a private */
+	var blap = {
+		/** in here */
+		tada: 1
+	}
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/changes.txt
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/changes.txt	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/changes.txt	(revision 4056)
@@ -0,0 +1,53 @@
+== 2.0.2 ==
+
+  * Fixed bug that sometimes caused an example of division in the source code to be interpretted as a regex by the JsDoc Toolkit analyzer. ( issue #158 )
+  * Fixed a bug that prevented private variables marked as @public from appearing in the documentation. ( issue #161 )
+  * Fixed bug that prevented variable names with underscored properties from appearing in summaries. ( issue #173 )
+
+== 2.0.1 ==
+
+  * Fixed bug that prevented @fileOverview tag from being recognized.
+  * Added support for @fieldOf as a synonym for @field plus @memberOf.
+  * Added support for @name tag in a @fileOverview comment to control the displayed name of the file.
+  * Added support for multiple @example tags. ( issue #152 )
+  * Modified style sheet of jsdoc template to make more readable. ( issue #151 )
+  * Fixed bug that prevented @since documentation from displaying correctly when it appeared in a class. ( issue #150 )
+  * Fixed bug that caused inhertited properties to sometimes not resolve correctly. ( issue #144 )
+  * Modified so that trailing whitespace in @example is always trimmed. ( issue #153 )
+  * Added support for elseif to JsPlate. (hat tip to fredck)
+  * Added support for @location urls in the @overview comment to the jsdoc template.
+
+== Changes From Versions 1.4.0 to 2.0.0 ==
+
+  * Upgraded included version of Rhino from 1.6 to 1.7R1.
+  * Removed circular references in parsed documentation objects.
+  * Improved inheritance handling, now properties and events can be inherited same as methods.
+  * Improved handling of cross-file relationships, now having two related objects in separate files is not a problem.
+  * Improved ability to recognize membership of previously defined objects.
+  * Added ability to redefine parsing behavior with plugins.
+  * @methodOf is a synonym for @function and @memberOf.
+  * Added @default to document default values of members that are objects.
+  * Added ability to parse and refer to inner functions.
+  * Fixed bug that appeared when calling a method to set properties of the instance referred to by "this".
+  * Added ability to automatically create links to other symbols.
+  * New "jsdoc" template now produces fully W3C valid XHTML.
+  * Inline parameter type hint comments are now documented.
+  * Fixed error: Locally scoped variables (declared with var) no longer appear as global.
+  * It is now possible to run JsDoc Toolkit from any directory.
+  * Added support for inline {@link ...} tags.
+  * Added support for the -H command-line option to allow for custom content handlers.
+  * Tag names @inherits and @scope changed to @borrows and @lends.
+  ? Combining @constructor in a doclet with @lends now supported.
+  * Multiple @lend tags now supported.
+  * Added support for the @constructs tag, used inside a @lends block.
+  * Added support for the @constant tag.
+  * Fixed bug that prevented the use of [] as a default value.
+  * Added support for the @field tag.
+  * Added support for the @public tag (applied to inner functions).
+  * @namespace tag can now be applied to functions, not just object literals.
+  * Added support for the -s command line option to suppress source code output.
+  * Added new unit test framework.
+  * Underscored symbols are now treated as if they have a @private tag by default.
+  * Improved support for anonymous constructors.
+  * Added support for the nocode meta tag.
+  
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/conf/sample.conf
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/conf/sample.conf	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/conf/sample.conf	(revision 4056)
@@ -0,0 +1,31 @@
+/*
+	This is an example of one way you could set up a configuration file to more
+	conveniently define some commandline options. You might like to do this if
+	you frequently reuse the same options. Note that you don't need to define
+	every option in this file, you can combine a configuration file with
+	additional options on the commandline if your wish.
+	
+	You would include this configuration file by running JsDoc Toolkit like so:
+	java -jar jsrun.jar app/run.js -c=conf/sample.conf
+
+*/
+
+{
+	// source files to use
+	_: ['app/test/jsdoc_test.js'],
+	
+	// document all functions, even uncommented ones
+	a: true,
+	
+	// including those marked @private
+	p: true,
+	
+	// some extra variables I want to include
+	D: {generatedBy: "Michael Mathews", copyright: "2008"},
+	
+	// use this directory as the output directory
+	d: "docs",
+	
+	// use this template
+	t: "templates/jsdoc"
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/java/build.xml
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/java/build.xml	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/java/build.xml	(revision 4056)
@@ -0,0 +1,36 @@
+<project>
+   <target name="clean">
+        <delete dir="build"/>
+    </target>
+
+    <target name="compile">
+        <mkdir dir="build/classes"/>
+        <javac 
+         srcdir="src" destdir="build/classes"
+         classpath="./classes/js.jar"
+        />
+    </target>
+
+    <target name="jar">
+        <mkdir dir="build/jar"/>
+        <jar destfile="build/jar/jsrun.jar" basedir="build/classes">
+            <manifest>
+               <attribute name="Main-Class" value="JsRun"/>
+               <attribute name="Class-Path" value="./java/classes/js.jar"/>
+            </manifest>
+        </jar>
+    </target>
+    
+    <target name="debugjar">
+        <mkdir dir="build/jar"/>
+        <jar destfile="build/jar/jsdebug.jar" basedir="build/classes">
+            <manifest>
+               <attribute name="Main-Class" value="JsDebugRun"/>
+               <attribute name="Class-Path" value="./java/classes/js.jar"/>
+            </manifest>
+        </jar>
+    </target>
+
+    <target name="clean-build" depends="clean,compile,jar"/>
+    <target name="clean-debug" depends="clean,compile,debugjar"/>
+</project>
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/java/build_1.4.xml
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/java/build_1.4.xml	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/java/build_1.4.xml	(revision 4056)
@@ -0,0 +1,36 @@
+<project default="clean-build"><!-- use this build script if you are stuck with ant version 1.4 -->
+   <target name="clean">
+        <delete dir="build"/>
+    </target>
+
+    <target name="compile">
+        <mkdir dir="build/classes"/>
+        <javac 
+         srcdir="src" destdir="build/classes"
+         classpath="./classes/js.jar"
+        />
+    </target>
+
+    <target name="jar">
+        <mkdir dir="build/jar"/>
+        <jar jarfile="build/jar/jsrun.jar" basedir="build/classes">
+            <manifest>
+               <attribute name="Main-Class" value="JsRun"/>
+               <attribute name="Class-Path" value="./java/classes/js.jar"/>
+            </manifest>
+        </jar>
+    </target>
+    
+    <target name="debugjar">
+        <mkdir dir="build/jar"/>
+        <jar jarfile="build/jar/jsdebug.jar" basedir="build/classes">
+            <manifest>
+               <attribute name="Main-Class" value="JsDebugRun"/>
+               <attribute name="Class-Path" value="./java/classes/js.jar"/>
+            </manifest>
+        </jar>
+    </target>
+
+    <target name="clean-build" depends="clean,compile,jar"/>
+    <target name="clean-debug" depends="clean,compile,debugjar"/>
+</project>
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/java/src/JsDebugRun.java
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/java/src/JsDebugRun.java	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/java/src/JsDebugRun.java	(revision 4056)
@@ -0,0 +1,21 @@
+/**
+ * A trivial bootstrap class that simply adds the path to the
+ * .js file as an argument to the Rhino call. This little hack
+ * allows the code in the .js file to have access to it's own 
+ * path via the Rhino arguments object. This is necessary to 
+ * allow the .js code to find resource files in a location 
+ * relative to itself.
+ *
+ * USAGE: java -jar jsdebug.jar path/to/file.js
+ */
+public class JsDebugRun {
+	public static void main(String[] args) {
+		String[] jsargs = {"-j="+args[0]};
+		
+		String[] allArgs = new String[jsargs.length + args.length];
+		System.arraycopy(args, 0, allArgs, 0, args.length);
+		System.arraycopy(jsargs, 0, allArgs, args.length ,jsargs.length);
+
+		org.mozilla.javascript.tools.debugger.Main.main(allArgs);
+    }
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/java/src/JsRun.java
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/java/src/JsRun.java	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/java/src/JsRun.java	(revision 4056)
@@ -0,0 +1,21 @@
+/**
+ * A trivial bootstrap class that simply adds the path to the
+ * .js file as an argument to the Rhino call. This little hack
+ * allows the code in the .js file to have access to it's own 
+ * path via the Rhino arguments object. This is necessary to 
+ * allow the .js code to find resource files in a location 
+ * relative to itself.
+ *
+ * USAGE: java -jar jsrun.jar path/to/file.js
+ */
+public class JsRun {
+	public static void main(String[] args) {
+		String[] jsargs = {"-j="+args[0]};
+		
+		String[] allArgs = new String[jsargs.length + args.length];
+		System.arraycopy(args, 0, allArgs, 0, args.length);
+		System.arraycopy(jsargs, 0, allArgs, args.length ,jsargs.length);
+
+		org.mozilla.javascript.tools.shell.Main.main(allArgs);
+    }
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/allclasses.tmpl
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/allclasses.tmpl	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/allclasses.tmpl	(revision 4056)
@@ -0,0 +1,17 @@
+<div align="center">{+new Link().toFile("index.html").withText("Class Index")+}
+| {+new Link().toFile("files.html").withText("File Index")+}</div>
+<hr />
+<h2>Classes</h2>
+<ul class="classList">
+	<for each="thisClass" in="data">
+	<li>{!
+		if (thisClass.alias == "_global_") {
+			output += "<i>"+new Link().toClass(thisClass.alias)+"</i>";
+		}
+		else {
+			output += new Link().toClass(thisClass.alias);
+		}
+	!}</li>
+	</for>
+</ul>
+<hr />
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/allfiles.tmpl
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/allfiles.tmpl	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/allfiles.tmpl	(revision 4056)
@@ -0,0 +1,56 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset={+IO.encoding+}"" />
+		{! Link.base = ""; /* all generated links will be relative to this */ !}
+		<title>JsDoc Reference - File Index</title>
+		<meta name="generator" content="JsDoc Toolkit" />
+		
+		<style type="text/css">
+		{+include("static/default.css")+}
+		</style>
+	</head>
+	
+	<body>
+		{+include("static/header.html")+}
+		
+		<div id="index">
+			{+publish.classesIndex+}
+		</div>
+		
+		<div id="content">
+			<h1 class="classTitle">File Index</h1>
+			
+			<for each="item" in="data">
+			<div>
+				<h2>{+new Link().toSrc(item.alias).withText(item.name)+}</h2>
+				<if test="item.desc">{+resolveLinks(summarize(item.desc))+}</if>
+				<dl>
+					<if test="item.author">
+						<dt class="heading">Author:</dt>
+						<dd>{+item.author+}</dd>
+					</if>
+					<if test="item.version">
+						<dt class="heading">Version:</dt>
+							<dd>{+item.version+}</dd>
+					</if>
+					{! var locations = item.comment.getTag('location').map(function($){return $.toString().replace(/(^\$ ?| ?\$$)/g, '').replace(/^HeadURL: https:/g, 'http:');}) !}
+					<if test="locations.length">
+						<dt class="heading">Location:</dt>
+							<for each="location" in="locations">
+							<dd><a href="{+location+}">{+location+}</a></dd>
+							</for>
+					</if>
+				</dl>
+			</div>
+			<hr />
+			</for>
+			
+		</div>
+		<div class="fineprint" style="clear:both">
+			<if test="JSDOC.opt.D.copyright">&copy;{+JSDOC.opt.D.copyright+}<br /></if>
+			Documentation generated by <a href="http://www.jsdoctoolkit.org/" target="_blankt">JsDoc Toolkit</a> {+JSDOC.VERSION+} on {+new Date()+}
+		</div>
+	</body>
+</html>
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/class.tmpl
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/class.tmpl	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/class.tmpl	(revision 4056)
@@ -0,0 +1,487 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset={+IO.encoding+}" />
+		<meta name="generator" content="JsDoc Toolkit" />
+		{! Link.base = "../"; /* all generated links will be relative to this */ !}
+		<title>JsDoc Reference - {+data.alias+}</title>
+
+		<style type="text/css">
+			{+include("static/default.css")+}
+		</style>
+	</head>
+
+	<body>
+<!-- ============================== header ================================= -->	
+		<!-- begin static/header.html -->
+		{+include("static/header.html")+}
+		<!-- end static/header.html -->
+
+<!-- ============================== classes index ============================ -->
+		<div id="index">
+			<!-- begin publish.classesIndex -->
+			{+publish.classesIndex+}
+			<!-- end publish.classesIndex -->
+		</div>
+		
+		<div id="content">
+<!-- ============================== class title ============================ -->
+			<h1 class="classTitle">
+				{!
+					var classType = "";
+					
+					if (data.isBuiltin()) {
+						classType += "Built-In ";
+					}
+					
+					if (data.isNamespace) {
+						if (data.is('FUNCTION')) {
+							classType += "Function ";
+						}
+						classType += "Namespace ";
+					}
+					else {
+						classType += "Class ";
+					}
+				!}
+				{+classType+}{+data.alias+}
+			</h1>
+
+<!-- ============================== class summary ========================== -->			
+			<p class="description">
+				<if test="data.augments.length"><br />Extends
+					{+
+						data.augments
+						.sort()
+						.map(
+							function($) { return new Link().toSymbol($); }
+						)
+						.join(", ")
+					+}.<br />
+				</if>
+			
+				{+resolveLinks(data.classDesc)+}
+				
+				<if test="!data.isBuiltin()">{# isn't defined in any file #}
+					<br /><i>Defined in: </i> {+new Link().toSrc(data.srcFile)+}.
+				</if>
+			</p>
+
+<!-- ============================== constructor summary ==================== -->			
+			<if test="!data.isBuiltin() && (data.isNamespace || data.is('CONSTRUCTOR'))">
+			<table class="summaryTable" cellspacing="0" summary="A summary of the constructor documented in the class {+data.alias+}.">
+				<caption>{+classType+}Summary</caption>
+				<thead>
+					<tr>
+						<th scope="col">Constructor Attributes</th>
+						<th scope="col">Constructor Name and Description</th>
+					</tr>
+				</thead>
+				<tbody>
+					<tr>
+						<td class="attributes">{!
+							if (data.isPrivate) output += "&lt;private&gt; ";
+							if (data.isInner) output += "&lt;inner&gt; ";
+						!}&nbsp;</td>
+						<td class="nameDescription" {!if (data.comment.getTag("hilited").length){output += 'style="color: red"'}!}>
+							<div class="fixedFont">
+								<b>{+ new Link().toSymbol(data.alias).inner('constructor')+}</b><if test="classType != 'Namespace '">{+ makeSignature(data.params) +}</if>
+							</div>
+							<div class="description">{+resolveLinks(summarize(data.desc))+}</div>
+						</td>
+					</tr>
+				</tbody>
+			</table>
+			</if>
+
+<!-- ============================== properties summary ===================== -->
+			<if test="data.properties.length">
+				{! var ownProperties = data.properties.filter(function($){return $.memberOf == data.alias && !$.isNamespace}).sort(makeSortby("name")); !}
+				<if test="ownProperties.length">
+				<table class="summaryTable" cellspacing="0" summary="A summary of the fields documented in the class {+data.alias+}.">
+					<caption>Field Summary</caption>
+					<thead>
+						<tr>
+							<th scope="col">Field Attributes</th>
+							<th scope="col">Field Name and Description</th>
+						</tr>
+					</thead>
+					<tbody>
+					<for each="member" in="ownProperties">
+						<tr>
+							<td class="attributes">{!
+								if (member.isPrivate) output += "&lt;private&gt; ";
+								if (member.isInner) output += "&lt;inner&gt; ";
+								if (member.isStatic) output += "&lt;static&gt; ";
+								if (member.isConstant) output += "&lt;constant&gt; ";
+							!}&nbsp;</td>
+							<td class="nameDescription">
+								<div class="fixedFont">
+								<if test="member.isStatic && member.memberOf != '_global_'">{+member.memberOf+}.</if><b>{+new Link().toSymbol(member.alias).withText(member.name)+}</b>
+								</div>
+								<div class="description">{+resolveLinks(summarize(member.desc))+}</div>
+							</td>
+						</tr>
+					</for>
+					</tbody>
+				</table>
+				</if>
+				
+				<if test="data.inheritsFrom.length">
+				<dl class="inheritsList">
+				{!
+					var borrowedMembers = data.properties.filter(function($) {return $.memberOf != data.alias});
+					
+					var contributers = [];
+					borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)});
+					for (var i = 0, l = contributers.length; i < l; i++) {
+						output +=
+							"<dt>Fields borrowed from class "+new Link().toSymbol(contributers[i])+": </dt>"
+							+
+							"<dd>" +
+							borrowedMembers
+							.filter(
+								function($) { return $.memberOf == contributers[i] }
+							)
+							.sort(makeSortby("name"))
+							.map(
+								function($) { return new Link().toSymbol($.alias).withText($.name) }
+							)
+							.join(", ")
+							+
+							"</dd>";
+					}
+				!}
+				</dl>
+				</if>
+			</if>
+
+<!-- ============================== methods summary ======================== -->
+			<if test="data.methods.length">
+				{! var ownMethods = data.methods.filter(function($){return $.memberOf == data.alias  && !$.isNamespace}).sort(makeSortby("name")); !}
+				<if test="ownMethods.length">
+				<table class="summaryTable" cellspacing="0" summary="A summary of the methods documented in the class {+data.alias+}.">
+					<caption>Method Summary</caption>
+					<thead>
+						<tr>
+							<th scope="col">Method Attributes</th>
+							<th scope="col">Method Name and Description</th>
+						</tr>
+					</thead>
+					<tbody>
+					<for each="member" in="ownMethods">
+						<tr>
+							<td class="attributes">{!
+								if (member.isPrivate) output += "&lt;private&gt; ";
+								if (member.isInner) output += "&lt;inner&gt; ";
+								if (member.isStatic) output += "&lt;static&gt; ";
+							!}&nbsp;</td>
+							<td class="nameDescription">
+								<div class="fixedFont"><if test="member.isStatic && member.memberOf != '_global_'">{+member.memberOf+}.</if><b>{+new Link().toSymbol(member.alias).withText(member.name)+}</b>{+makeSignature(member.params)+}
+								</div>
+								<div class="description">{+resolveLinks(summarize(member.desc))+}</div>
+							</td>
+						</tr>
+					</for>
+					</tbody>
+				</table>
+				</if>
+				
+				<if test="data.inheritsFrom.length">
+				<dl class="inheritsList">
+				{!
+					var borrowedMembers = data.methods.filter(function($) {return $.memberOf != data.alias});
+					var contributers = [];
+					borrowedMembers.map(function($) {if (contributers.indexOf($.memberOf) < 0) contributers.push($.memberOf)});
+					for (var i = 0, l = contributers.length; i < l; i++) {
+						output +=
+							"<dt>Methods borrowed from class "+new Link().toSymbol(contributers[i])+": </dt>"
+							+
+							"<dd>" +
+							borrowedMembers
+							.filter(
+								function($) { return $.memberOf == contributers[i] }
+							)
+							.sort(makeSortby("name"))
+							.map(
+								function($) { return new Link().toSymbol($.alias).withText($.name) }
+							)
+							.join(", ")
+							+
+							"</dd>";
+					}
+				
+				!}
+				</dl>
+				</if>
+			</if>
+
+<!-- ============================== constructor details ==================== -->		
+			<if test="!data.isBuiltin() && (data.isNamespace || data.is('CONSTRUCTOR'))">
+			<div class="details"><a name="constructor"> </a>
+				<div class="sectionTitle">
+					{+classType+}Detail
+				</div>
+				
+				<div class="fixedFont">{!
+					if (data.isPrivate) output += "&lt;private&gt; ";
+					if (data.isInner) output += "&lt;inner&gt; ";
+				!}
+						<b>{+ data.alias +}</b><if test="classType != 'Namespace '">{+ makeSignature(data.params) +}</if>
+				</div>
+				
+				<div class="description">
+					{+resolveLinks(data.desc)+}
+					<if test="data.author"><br /><i>Author: </i>{+data.author+}.</if>
+				</div>
+				
+				<if test="data.example.length">
+				<for each="example" in="data.example">
+				<pre class="code">{+example+}</pre>
+				</for>
+				</if>
+				
+				
+					<if test="data.params.length">
+						<dl class="detailList">
+						<dt class="heading">Parameters:</dt>
+						<for each="item" in="data.params">
+							<dt>
+								{+((item.type)?""+("<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type)+"}</span> ")) : "")+} <b>{+item.name+}</b>
+								<if test="item.isOptional"><i>Optional<if test="item.defaultValue">, Default: {+item.defaultValue+}</if></i></if>
+							</dt>
+								<dd>{+resolveLinks(item.desc)+}</dd>
+						</for>
+						</dl>
+					</if>
+					<if test="data.deprecated">
+						<dl class="detailList">
+						<dt class="heading">Deprecated:</dt>
+						<dt>
+							{+resolveLinks(data.deprecated)+}
+						</dt>
+						</dl>
+					</if>
+					<if test="data.since">
+						<dl class="detailList">
+						<dt class="heading">Since:</dt>
+							<dd>{+ data.since +}</dd>
+						</dl>
+					</if>
+					<if test="data.exceptions.length">
+						<dl class="detailList">
+						<dt class="heading">Throws:</dt>
+						<for each="item" in="data.exceptions">
+							<dt>
+								{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+} <b>{+item.name+}</b>
+							</dt>
+								<dd>{+resolveLinks(item.desc)+}</dd>
+						</for>
+						</dl>
+					</if>
+					<if test="data.returns.length">
+						<dl class="detailList">
+						<dt class="heading">Returns:</dt>
+						<for each="item" in="data.returns">
+								<dd>{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+}{+resolveLinks(item.desc)+}</dd>
+						</for>
+						</dl>
+					</if>
+					<if test="data.requires.length">
+						<dl class="detailList">
+						<dt class="heading">Requires:</dt>
+						<for each="item" in="data.requires">
+							<dd>{+ resolveLinks(item) +}</dd>
+						</for>
+						</dl>
+					</if>
+					<if test="data.see.length">
+						<dl class="detailList">
+						<dt class="heading">See:</dt>
+						<for each="item" in="data.see">
+							<dd>{+ new Link().toSymbol(item) +}</dd>
+						</for>
+						</dl>
+					</if>
+
+			</div>
+			</if>
+
+<!-- ============================== field details ========================== -->		
+			<if test="defined(ownProperties) && ownProperties.length">
+				<div class="sectionTitle">
+					Field Detail
+				</div>
+				<for each="member" in="ownProperties">
+					<a name="{+Link.symbolNameToLinkName(member)+}"> </a>
+					<div class="fixedFont">{!
+						if (member.isPrivate) output += "&lt;private&gt; ";
+						if (member.isInner) output += "&lt;inner&gt; ";
+						if (member.isStatic) output += "&lt;static&gt; ";
+						if (member.isConstant) output += "&lt;constant&gt; ";
+					!}
+					
+					<if test="member.type"><span class="light">{{+new Link().toSymbol(member.type)+}}</span></if>
+					<if test="member.isStatic && member.memberOf != '_global_'"><span class="light">{+member.memberOf+}.</span></if><b>{+member.name+}</b>
+					
+					</div>
+					<div class="description">
+						{+resolveLinks(member.desc)+}
+						<if test="member.srcFile != data.srcFile">
+							<br />
+							<i>Defined in: </i> {+new Link().toSrc(member.srcFile)+}.
+						</if>
+						<if test="member.author"><br /><i>Author: </i>{+member.author+}.</if>
+					</div>
+					
+					<if test="member.example.length">
+					<for each="example" in="member.example">
+					<pre class="code">{+example+}</pre>
+					</for>
+					</if>
+
+						<if test="member.deprecated">
+							<dl class="detailList">
+							<dt class="heading">Deprecated:</dt>
+							<dt>
+								{+ member.deprecated +}
+							</dt>
+							</dl>
+						</if>
+						<if test="member.since">
+							<dl class="detailList">
+							<dt class="heading">Since:</dt>
+								<dd>{+ member.since +}</dd>
+							</dl>
+						</if>
+						<if test="member.see.length">
+							<dl class="detailList">
+							<dt class="heading">See:</dt>
+							<for each="item" in="member.see">
+							<dd>{+ new Link().toSymbol(item) +}</dd>
+							</for>
+							</dl>
+						</if>
+						<if test="member.defaultValue">
+							<dl class="detailList">
+							<dt class="heading">Default Value:</dt>
+							<dd>
+								{+resolveLinks(member.defaultValue)+}
+							</dd>
+							</dl>
+						</if>
+
+					<if test="!$member_last"><hr /></if>
+				</for>
+			</if>
+
+<!-- ============================== method details ========================= -->		
+			<if test="defined(ownMethods) && ownMethods.length">
+				<div class="sectionTitle">
+					Method Detail
+				</div>
+				<for each="member" in="ownMethods">
+					<a name="{+Link.symbolNameToLinkName(member)+}"> </a>
+					<div class="fixedFont">{!
+						if (member.isPrivate) output += "&lt;private&gt; ";
+						if (member.isInner) output += "&lt;inner&gt; ";
+						if (member.isStatic) output += "&lt;static&gt; ";
+					!}
+					
+					<if test="member.type"><span class="light">{{+new Link().toSymbol(member.type)+}}</span></if>
+					<if test="member.isStatic && member.memberOf != '_global_'"><span class="light">{+member.memberOf+}.</span></if><b>{+member.name+}</b>{+makeSignature(member.params)+}
+					
+					</div>
+					<div class="description">
+						{+resolveLinks(member.desc)+}
+						<if test="member.srcFile != data.srcFile">
+							<br />
+							<i>Defined in: </i> {+new Link().toSrc(member.srcFile)+}.
+						</if>
+						<if test="member.author"><br /><i>Author: </i>{+member.author+}.</if>
+					</div>
+					
+					<if test="member.example.length">
+					<for each="example" in="member.example">
+					<pre class="code">{+example+}</pre>
+					</for>
+					</if>
+					
+						<if test="member.params.length">
+							<dl class="detailList">
+							<dt class="heading">Parameters:</dt>
+							<for each="item" in="member.params">
+								<dt>
+									{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+}<b>{+item.name+}</b>
+									<if test="item.isOptional"><i>Optional<if test="item.defaultValue">, Default: {+item.defaultValue+}</if></i></if>
+								</dt>
+								<dd>{+resolveLinks(item.desc)+}</dd>
+							</for>
+							</dl>
+						</if>
+						<if test="member.deprecated">
+							<dl class="detailList">
+							<dt class="heading">Deprecated:</dt>
+							<dt>
+								{+member.deprecated+}
+							</dt>
+							</dl>
+						</if>
+						<if test="member.since">
+							<dl class="detailList">
+							<dt class="heading">Since:</dt>
+								<dd>{+ member.since +}</dd>
+							</dl>
+							</dl>
+						</if>
+						<if test="member.exceptions.length">
+							<dl class="detailList">
+							<dt class="heading">Throws:</dt>
+							<for each="item" in="member.exceptions">
+								<dt>
+									{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+} <b>{+item.name+}</b>
+								</dt>
+								<dd>{+resolveLinks(item.desc)+}</dd>
+							</for>
+							</dl>
+						</if>
+						<if test="member.returns.length">
+							<dl class="detailList">
+							<dt class="heading">Returns:</dt>
+							<for each="item" in="member.returns">
+								<dd>{+((item.type)?"<span class=\"light fixedFont\">{"+(new Link().toSymbol(item.type))+"}</span> " : "")+}{+resolveLinks(item.desc)+}</dd>
+							</for>
+							</dl>
+						</if>
+						<if test="member.requires.length">
+							<dl class="detailList">
+							<dt class="heading">Requires:</dt>
+							<for each="item" in="member.requires">
+								<dd>{+ resolveLinks(item) +}</dd>
+							</for>
+							</dl>
+						</if>
+						<if test="member.see.length">
+							<dl class="detailList">
+							<dt class="heading">See:</dt>
+							<for each="item" in="member.see">
+								<dd>{+ new Link().toSymbol(item) +}</dd>
+							</for>
+							</dl>
+						</if>
+
+					<if test="!$member_last"><hr /></if>
+				</for>
+			</if>
+			
+			<hr />
+		</div>
+		
+<!-- ============================== footer ================================= -->
+		<div class="fineprint" style="clear:both">
+			<if test="JSDOC.opt.D.copyright">&copy;{+JSDOC.opt.D.copyright+}<br /></if>
+			Documentation generated by <a href="http://www.jsdoctoolkit.org/" target="_blank">JsDoc Toolkit</a> {+JSDOC.VERSION+} on {+new Date()+}
+		</div>
+	</body>
+</html>
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/index.tmpl
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/index.tmpl	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/index.tmpl	(revision 4056)
@@ -0,0 +1,39 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+	<head>
+		<meta http-equiv="content-type" content="text/html; charset={+IO.encoding+}"" />
+		
+		<title>JsDoc Reference - Index</title>
+		<meta name="generator" content="JsDoc Toolkit" />
+		
+		<style type="text/css">
+		{+include("static/default.css")+}
+		</style>
+	</head>
+	
+	<body>
+		{+include("static/header.html")+}
+		
+		<div id="index">
+			{+publish.classesIndex+}
+		</div>
+		
+		<div id="content">
+			<h1 class="classTitle">Class Index</h1>
+			
+			<for each="thisClass" in="data">
+			<div>
+				<h2>{+(new Link().toSymbol(thisClass.alias))+}</h2>
+				{+resolveLinks(summarize(thisClass.classDesc))+}
+			</div>
+			<hr />
+			</for>
+			
+		</div>
+		<div class="fineprint" style="clear:both">
+			<if test="JSDOC.opt.D.copyright">&copy;{+JSDOC.opt.D.copyright+}<br /></if>
+			Documentation generated by <a href="http://www.jsdoctoolkit.org/" target="_blankt">JsDoc Toolkit</a> {+JSDOC.VERSION+} on {+new Date()+}
+		</div>
+	</body>
+</html>
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/publish.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/publish.js	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/publish.js	(revision 4056)
@@ -0,0 +1,166 @@
+function publish(symbolSet) {
+	publish.conf = {  // trailing slash expected for dirs
+		ext: ".html",
+		outDir: JSDOC.opt.d || SYS.pwd+"../out/jsdoc/",
+		templatesDir: SYS.pwd+"../templates/jsdoc/",
+		symbolsDir: "symbols/",
+		srcDir: "symbols/src/"
+	};
+	
+	
+	if (JSDOC.opt.s && defined(Link) && Link.prototype._makeSrcLink) {
+		Link.prototype._makeSrcLink = function(srcFilePath) {
+			return "&lt;"+srcFilePath+"&gt;";
+		}
+	}
+	
+	IO.mkPath((publish.conf.outDir+"symbols/src").split("/"));
+		
+	// used to check the details of things being linked to
+	Link.symbolSet = symbolSet;
+
+	try {
+		var classTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"class.tmpl");
+		var classesTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"allclasses.tmpl");
+	}
+	catch(e) {
+		print(e.message);
+		quit();
+	}
+	
+	// filters
+	function hasNoParent($) {return ($.memberOf == "")}
+	function isaFile($) {return ($.is("FILE"))}
+	function isaClass($) {return ($.is("CONSTRUCTOR") || $.isNamespace)}
+	
+	var symbols = symbolSet.toArray();
+	
+	var files = JSDOC.opt.srcFiles;
+ 	for (var i = 0, l = files.length; i < l; i++) {
+ 		var file = files[i];
+ 		var srcDir = publish.conf.outDir + "symbols/src/";
+		makeSrcFile(file, srcDir);
+ 	}
+ 	
+ 	var classes = symbols.filter(isaClass).sort(makeSortby("alias"));
+	
+	Link.base = "../";
+ 	publish.classesIndex = classesTemplate.process(classes); // kept in memory
+	
+	for (var i = 0, l = classes.length; i < l; i++) {
+		var symbol = classes[i];
+		var output = "";
+		output = classTemplate.process(symbol);
+		
+		IO.saveFile(publish.conf.outDir+"symbols/", symbol.alias+publish.conf.ext, output);
+	}
+	
+	// regenrate the index with different relative links
+	Link.base = "";
+	publish.classesIndex = classesTemplate.process(classes);
+	
+	try {
+		var classesindexTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"index.tmpl");
+	}
+	catch(e) { print(e.message); quit(); }
+	
+	var classesIndex = classesindexTemplate.process(classes);
+	IO.saveFile(publish.conf.outDir, "index"+publish.conf.ext, classesIndex);
+	classesindexTemplate = classesIndex = classes = null;
+	
+	try {
+		var fileindexTemplate = new JSDOC.JsPlate(publish.conf.templatesDir+"allfiles.tmpl");
+	}
+	catch(e) { print(e.message); quit(); }
+	
+	var documentedFiles = symbols.filter(isaFile);
+	var allFiles = [];
+	
+	for (var i = 0; i < files.length; i++) {
+		allFiles.push(new JSDOC.Symbol(files[i], [], "FILE", new JSDOC.DocComment("/** */")));
+	}
+	
+	for (var i = 0; i < documentedFiles.length; i++) {
+		var offset = files.indexOf(documentedFiles[i].alias);
+		allFiles[offset] = documentedFiles[i];
+	}
+		
+	allFiles = allFiles.sort(makeSortby("name"));
+
+	var filesIndex = fileindexTemplate.process(allFiles);
+	IO.saveFile(publish.conf.outDir, "files"+publish.conf.ext, filesIndex);
+	fileindexTemplate = filesIndex = files = null;
+}
+
+
+/** Just the first sentence. Should not break on dotted variable names. */
+function summarize(desc) {
+	if (typeof desc != "undefined")
+		return desc.match(/([\w\W]+?\.)[^a-z0-9_$]/i)? RegExp.$1 : desc;
+}
+
+/** make a symbol sorter by some attribute */
+function makeSortby(attribute) {
+	return function(a, b) {
+		if (a[attribute] != undefined && b[attribute] != undefined) {
+			a = a[attribute].toLowerCase();
+			b = b[attribute].toLowerCase();
+			if (a < b) return -1;
+			if (a > b) return 1;
+			return 0;
+		}
+	}
+}
+
+function include(path) {
+	var path = publish.conf.templatesDir+path;
+	return IO.readFile(path);
+}
+
+function makeSrcFile(path, srcDir, name) {
+	if (JSDOC.opt.s) return;
+	
+	if (!name) {
+		name = path.replace(/\.\.?[\\\/]/g, "").replace(/[\\\/]/g, "_");
+		name = name.replace(/\:/g, "_");
+	}
+	
+	var src = {path: path, name:name, charset: IO.encoding, hilited: ""};
+	
+	if (defined(JSDOC.PluginManager)) {
+		JSDOC.PluginManager.run("onPublishSrc", src);
+	}
+
+	if (src.hilited) {
+		IO.saveFile(srcDir, name+publish.conf.ext, src.hilited);
+	}
+}
+
+function makeSignature(params) {
+	if (!params) return "()";
+	var signature = "("
+	+
+	params.filter(
+		function($) {
+			return $.name.indexOf(".") == -1; // don't show config params in signature
+		}
+	).map(
+		function($) {
+			return $.name;
+		}
+	).join(", ")
+	+
+	")";
+	return signature;
+}
+
+/** Find symbol {@link ...} strings in text and turn into html links */
+function resolveLinks(str, from) {
+	str = str.replace(/\{@link ([^} ]+) ?\}/gi,
+		function(match, symbolName) {
+			return new Link().toSymbol(symbolName);
+		}
+	);
+	
+	return str;
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/static/default.css
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/static/default.css	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/static/default.css	(revision 4056)
@@ -0,0 +1,162 @@
+/* default.css */
+body
+{
+	font: 12px "Lucida Grande", Tahoma, Arial, Helvetica, sans-serif;
+	width: 800px;
+}
+
+.header
+{
+	clear: both;
+	background-color: #ccc;
+	padding: 8px;
+}
+
+h1
+{
+	font-size: 150%;
+	font-weight: bold;
+	padding: 0;
+	margin: 1em 0 0 .3em;
+}
+
+hr
+{
+	border: none 0;
+	border-top: 1px solid #7F8FB1;
+	height: 1px;
+}
+
+pre.code
+{
+	display: block;
+	padding: 8px;
+	border: 1px dashed #ccc;
+}
+
+#index
+{
+	margin-top: 24px;
+	float: left;
+	width: 160px;
+	position: absolute;
+	left: 8px;
+	background-color: #F3F3F3;
+	padding: 8px;
+}
+
+#content
+{
+	margin-left: 190px;
+	width: 600px;
+}
+
+.classList
+{
+	list-style-type: none;
+	padding: 0;
+	margin: 0 0 0 8px;
+	font-family: arial, sans-serif;
+	font-size: 1em;
+	overflow: auto;
+}
+
+.classList li
+{
+	padding: 0;
+	margin: 0 0 8px 0;
+}
+
+.summaryTable { width: 100%; }
+
+h1.classTitle
+{
+	font-size:170%;
+	line-height:130%;
+}
+
+h2 { font-size: 110%; }
+caption, div.sectionTitle
+{
+	background-color: #7F8FB1;
+	color: #fff;
+	font-size:130%;
+	text-align: left;
+	padding: 2px 6px 2px 6px;
+	border: 1px #7F8FB1 solid;
+}
+
+div.sectionTitle { margin-bottom: 8px; }
+.summaryTable thead { display: none; }
+
+.summaryTable td
+{
+	vertical-align: top;
+	padding: 4px;
+	border-bottom: 1px #7F8FB1 solid;
+	border-right: 1px #7F8FB1 solid;
+}
+
+/*col#summaryAttributes {}*/
+.summaryTable td.attributes
+{
+	border-left: 1px #7F8FB1 solid;
+	width: 140px;
+	text-align: right;
+}
+
+td.attributes, .fixedFont
+{
+	line-height: 15px;
+	color: #002EBE;
+	font-family: "Courier New",Courier,monospace;
+	font-size: 13px;
+}
+
+.summaryTable td.nameDescription
+{
+	text-align: left;
+	font-size: 13px;
+	line-height: 15px;
+}
+
+.summaryTable td.nameDescription, .description
+{
+	line-height: 15px;
+	padding: 4px;
+	padding-left: 4px;
+}
+
+.summaryTable { margin-bottom: 8px; }
+
+ul.inheritsList
+{
+	list-style: square;
+	margin-left: 20px;
+	padding-left: 0;
+}
+
+.detailList {
+	margin-left: 20px; 
+	line-height: 15px;
+}
+.detailList dt { margin-left: 20px; }
+
+.detailList .heading
+{
+	font-weight: bold;
+	padding-bottom: 6px;
+	margin-left: 0;
+}
+
+.light, td.attributes, .light a:link, .light a:visited
+{
+	color: #777;
+	font-style: italic;
+}
+
+.fineprint
+{
+	text-align: right;
+	font-size: 10px;
+}
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/static/header.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/static/header.html	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/static/header.html	(revision 4056)
@@ -0,0 +1,2 @@
+<div id="header">
+</div>
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/static/index.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/static/index.html	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/static/index.html	(revision 4056)
@@ -0,0 +1,19 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+	<title>Generated Javascript Documentation</title>
+</head>
+<frameset cols="20%,80%">
+	<frame src="allclasses-frame.html" name="packageFrame" />
+	<frame src="splash.html" name="classFrame" />
+	<noframes>
+		<body>
+		<p>
+		This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
+		</p>
+		</body>
+	</noframes>
+</frameset>
+</html>
Index: /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/symbol.tmpl
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/symbol.tmpl	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_dev/_thirdparty/jsdoc-toolkit/templates/jsdoc/symbol.tmpl	(revision 4056)
@@ -0,0 +1,35 @@
+<symbol alias="{+data.alias+}">
+	<name>{+data.name+}</name>
+	<memberOf>{+data.memberOf+}</memberOf>
+	<isStatic>{+data.isStatic+}</isStatic>
+	<isa>{+data.isa+}</isa>
+	<desc>{+data.desc+}</desc>
+	<classDesc>{+data.classDesc+}</classDesc>
+	
+	<methods><for each="method" in="data.methods">
+		<method>
+			<name>{+method.name+}</name>
+			<memberOf>{+method.memberOf+}</memberOf>
+			<isStatic>{+method.isStatic+}</isStatic>
+			<desc>{+method.desc+}</desc>
+			<params><for each="param" in="method.params">
+				<param>
+					<type>{+param.type+}</type>
+					<name>{+param.name+}</name>
+					<desc>{+param.desc+}</desc>
+					<defaultValue>{+param.defaultValue+}</defaultValue>
+				</param></for>
+			</params>
+		</method></for>
+	</methods>
+	
+	<properties><for each="property" in="data.properties">
+		<property>
+			<name>{+property.name+}</name>
+			<memberOf>{+property.memberOf+}</memberOf>
+			<isStatic>{+property.isStatic+}</isStatic>
+			<desc>{+property.desc+}</desc>
+			<type>{+property.type+}</type>
+		</property></for>
+	</properties>
+</symbol>
Index: /CKEditor/branches/versions/3.0.x/_dev/docs_build/docs_build.bat
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/docs_build/docs_build.bat	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_dev/docs_build/docs_build.bat	(revision 4056)
@@ -4,14 +4,14 @@
 :: For licensing, see LICENSE.html or http://ckeditor.com/license
 ::
-:: Build the _docs/api documentation files.
+:: Builds the documentation files.
 ::
 
-ECHO Building the API document at _docs/api...
+ECHO Building the API document into the api_docs directory...
 
-del /F /Q "../../_docs/api/*.*"
+del /F /Q "api_docs/*.*"
 
 java -jar ../_thirdparty/jsdoc-toolkit/jsrun.jar ../_thirdparty/jsdoc-toolkit/app/run.js -c=docs_build.conf
 
-:: php ../fixlineends/fixlineends.php --eolstripwhite --eofnewline --eofstripwhite --nohidden --nosystem ../../_docs/api/
+:: php ../fixlineends/fixlineends.php --eolstripwhite --eofnewline --eofstripwhite --nohidden --nosystem api_docs/
 
 ECHO Finished!
Index: /CKEditor/branches/versions/3.0.x/_dev/docs_build/docs_build.conf
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/docs_build/docs_build.conf	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_dev/docs_build/docs_build.conf	(revision 4056)
@@ -17,4 +17,5 @@
 		'../../_source/core/',
 		'../../_source/plugins/',
+		'../../_source/skins/kama/skin.js',
 		'../../_source/lang/en.js'
 	],
@@ -27,5 +28,5 @@
 
 	// use this directory as the output directory
-	d: '../../_docs/api',
+	d: 'api_docs',
 
 	// Template.
Index: /CKEditor/branches/versions/3.0.x/_dev/releaser/ckreleaser.release
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/releaser/ckreleaser.release	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_dev/releaser/ckreleaser.release	(revision 4056)
@@ -11,5 +11,4 @@
 [
 	'_dev',
-	'_docs/api',
 	'_samples',
 	'_source/adapters',
@@ -59,10 +58,4 @@
 ],
 
-documentation :
-{
-	config: '_dev/docs_build/docs_build.conf',
-	target: '_docs/api'
-},
-
 samples :
 {
Index: /CKEditor/branches/versions/3.0.x/_dev/releaser/release.bat
===================================================================
--- /CKEditor/branches/versions/3.0.x/_dev/releaser/release.bat	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_dev/releaser/release.bat	(revision 4056)
@@ -11,3 +11,3 @@
 :: rmdir /S /Q release
 
-java -jar ckreleaser/ckreleaser.jar ckreleaser.release ../.. release "3.0 RC" ckeditor_3.0rc
+java -jar ckreleaser/ckreleaser.jar ckreleaser.release ../.. release "CKEditor 3.0 SVN" ckeditor_3.0_svn
Index: /CKEditor/branches/versions/3.0.x/_samples/ui_languages.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_samples/ui_languages.html	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_samples/ui_languages.html	(revision 4056)
@@ -11,5 +11,7 @@
 	//<![CDATA[
 
-	document.write( '<script type="text/javascript" src="../_source/lang/_languages.js"><\/script>' );
+	document.write( '<script type="text/javascript" src="../' +
+		'_source/' + 	// %REMOVE_LINE%
+		'lang/_languages.js"><\/script>' );
 
 	//]]>
Index: /CKEditor/branches/versions/3.0.x/_source/core/config.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/core/config.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/core/config.js	(revision 4056)
@@ -43,4 +43,12 @@
 	customConfig : CKEDITOR.getUrl( 'config.js' ),
 
+	/**
+	 * Whether the replaced element (usually a textarea) is to be updated
+	 * automatically when posting the form containing the editor.
+	 * @type Boolean
+	 * @default true
+	 * @example
+	 * config.autoUpdateElement = true;
+	 */
 	autoUpdateElement : true,
 
@@ -80,5 +88,5 @@
 	 * The user interface language localization to use. If empty, the editor
 	 * automatically localize the editor to the user language, if supported,
-	 * otherwise the [@link #defaultLanguage] language is used.
+	 * otherwise the {@link CKEDITOR.config.defaultLanguage} language is used.
 	 * @default true
 	 * @type Boolean
@@ -90,5 +98,5 @@
 
 	/**
-	 * The language to be used if [@link #language] is left empty and it's not
+	 * The language to be used if {@link CKEDITOR.config.language} is left empty and it's not
 	 * possible to localize the editor to the user language.
 	 * @default 'en'
@@ -99,5 +107,40 @@
 	defaultLanguage : 'en',
 
+	/**
+	 * Sets the behavior for the ENTER key. It also dictates other behaviour
+	 * rules in the editor, like whether the &lt;br&gt; element is to be used
+	 * as a paragraph separator when indenting text.
+	 * The allowed values are the following constants, and their relative
+	 * behavior:
+	 * <ul>
+	 *     <li>{@link CKEDITOR.ENTER_P} (1): new &lt;p&gt; paragraphs are created;</li>
+	 *     <li>{@link CKEDITOR.ENTER_BR} (2): lines are broken with &lt;br&gt; elements;</li>
+	 *     <li>{@link CKEDITOR.ENTER_DIV} (3): new &lt;div&gt; blocks are created.</li>
+	 * </ul>
+	 * <strong>Note</strong>: It's recommended to use the
+	 * {@link CKEDITOR.ENTER_P} value because of its semantic value and
+	 * correctness. The editor is optimized for this value.
+	 * @type Number
+	 * @default {@link CKEDITOR.ENTER_P}
+	 * @example
+	 * // Not recommended.
+	 * config.enterMode = CKEDITOR.ENTER_BR;
+	 */
 	enterMode : CKEDITOR.ENTER_P,
+
+	/**
+	 * Just like the {@link CKEDITOR.config.enterMode} setting, it defines the behavior for the SHIFT+ENTER key.
+	 * The allowed values are the following constants, and their relative
+	 * behavior:
+	 * <ul>
+	 *     <li>{@link CKEDITOR.ENTER_P} (1): new &lt;p&gt; paragraphs are created;</li>
+	 *     <li>{@link CKEDITOR.ENTER_BR} (2): lines are broken with &lt;br&gt; elements;</li>
+	 *     <li>{@link CKEDITOR.ENTER_DIV} (3): new &lt;div&gt; blocks are created.</li>
+	 * </ul>
+	 * @type Number
+	 * @default {@link CKEDITOR.ENTER_BR}
+	 * @example
+	 * config.shiftEnterMode = CKEDITOR.ENTER_P;
+	 */
 	shiftEnterMode : CKEDITOR.ENTER_BR,
 
@@ -137,7 +180,10 @@
 	/**
 	 * The editor height, in CSS size format or pixel integer.
-	 * @type String|Number
+	 * @type Number|String
 	 * @default '200'
 	 * @example
+	 * config.height = 500;
+	 * @example
+	 * config.height = '25em';
 	 */
 	height : 200,
@@ -145,8 +191,9 @@
 	/**
 	 * Comma separated list of plugins to load and initialize for an editor
-	 * instance.
-	 * @type String
-	 * @example
-	 * config.plugins = 'basicstyles,button,htmldataprocessor,toolbar,wysiwygarea';
+	 * instance. This should be rarely changed, using instead the
+	 * {@link CKEDITOR.config.extraPlugins} and
+	 * {@link CKEDITOR.config.removePlugins} for customizations.
+	 * @type String
+	 * @example
 	 */
 	plugins : 'about,basicstyles,blockquote,button,clipboard,colorbutton,contextmenu,elementspath,enterkey,entities,filebrowser,find,flash,font,format,forms,horizontalrule,htmldataprocessor,image,indent,justify,keystrokes,link,list,maximize,newpage,pagebreak,pastefromword,pastetext,popup,preview,print,removeformat,resize,save,scayt,smiley,showblocks,sourcearea,stylescombo,table,tabletools,specialchar,tab,templates,toolbar,undo,wysiwygarea,wsc',
@@ -155,5 +202,5 @@
 	 * List of additional plugins to be loaded. This is a tool setting which
 	 * makes it easier to add new plugins, whithout having to touch and
-	 * possibly breaking the <i>plugins</i> setting.
+	 * possibly breaking the {@link CKEDITOR.config.plugins} setting.
 	 * @type String
 	 * @example
@@ -164,6 +211,7 @@
 	/**
 	 * List of plugins that must not be loaded. This is a tool setting which
-	 * makes it easier to avoid loading plugins definied in the <i>plugins</i>
-	 * setting, whithout having to touch and possibly breaking it.
+	 * makes it easier to avoid loading plugins definied in the
+	 * {@link CKEDITOR.config.plugins} setting, whithout having to touch it and
+	 * potentially breaking it.
 	 * @type String
 	 * @example
@@ -176,4 +224,5 @@
 	 * indicating code that must stay untouched.
 	 * @type Array
+	 * @default [] (empty array)
 	 * @example
 	 * config.protectedSource.push( /<\?[\s\S]*?\?>/g );   // PHP Code
@@ -217,8 +266,11 @@
 	 * The editor width in CSS size format or pixel integer.
 	 * @type String|Number
-	 * @default '100%'
-	 * @example
-	 */
-	width : '100%',
+	 * @default '' (empty)
+	 * @example
+	 * config.width = 850;
+	 * @example
+	 * config.width = '75%';
+	 */
+	width : '',
 
 	/**
Index: /CKEditor/branches/versions/3.0.x/_source/core/dom/documentfragment.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/core/dom/documentfragment.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/core/dom/documentfragment.js	(revision 4056)
@@ -31,4 +31,5 @@
 	{
 		'append' : 1,
+		'appendBogus' : 1,
 		'getFirst' : 1,
 		'getLast' : 1,
@@ -39,4 +40,5 @@
 		'replace' : 1,
 		'trim' : 1,
+		'type' : 1,
 		'ltrim' : 1,
 		'rtrim' : 1,
Index: Editor/branches/versions/3.0.x/_source/core/dom/domwalker.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/core/dom/domwalker.js	(revision 4055)
+++ 	(revision )
@@ -1,242 +1,0 @@
-/*
-Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function()
-{
-	var fireDomWalkerEvent = function( transistionType, fromNode, toNode )
-		{
-			var eventData = { from : fromNode, to : toNode, type : transistionType };
-			this.fire( transistionType, eventData );
-			this._.actionEvents.push( eventData );
-		};
-
-	CKEDITOR.dom.domWalker = function( node )
-	{
-		if ( arguments.length < 1 )
-			return;
-
-		this._ = { currentNode : node, actionEvents : [], stopFlag : false };
-		CKEDITOR.event.implementOn( this );
-	};
-
-	CKEDITOR.dom.domWalker.prototype = {
-		next : (function()
-		{
-			var dfsStepForward = function()
-			{
-				var current = this._.currentNode, next;
-
-				if ( !current )
-					return null;
-
-				if ( current.getChildCount && current.getChildCount() > 0 )
-				{
-					next = current.getChild( 0 );
-					fireDomWalkerEvent.call( this, 'down', current, next );
-					return next;
-				}
-				else if ( current.getNext() )
-				{
-					next = current.getNext();
-					fireDomWalkerEvent.call( this, 'sibling', current, next );
-					return next;
-				}
-				else
-				{
-					var ancestor = current.getParent();
-					fireDomWalkerEvent.call( this, 'up', current, ancestor );
-
-					while ( ancestor )
-					{
-						if ( ancestor.getNext() )
-						{
-							next = ancestor.getNext();
-							fireDomWalkerEvent.call( this, 'sibling', ancestor, next );
-							return next;
-						}
-						else
-						{
-							next = ancestor.getParent();
-							fireDomWalkerEvent.call( this, 'up', ancestor, next );
-							ancestor = next;
-						}
-					}
-				}
-				return null;
-			};
-
-			return function()
-			{
-				this._.actionEvents = [];
-				return {
-					node : ( this._.currentNode = dfsStepForward.apply( this ) ),
-					events : this._.actionEvents
-				};
-			};
-		})(),
-
-		back : (function()
-		{
-			var dfsStepBackward = function()
-			{
-				var current = this._.currentNode, next;
-
-				if ( !current )
-					return null;
-
-				if ( current.getPrevious() )
-				{
-					var lastChild = current.getPrevious();
-					fireDomWalkerEvent.call( this, 'sibling', current, lastChild );
-					while ( lastChild.getChildCount && lastChild.getChildCount() > 0 )
-					{
-						next = lastChild.getChild( lastChild.getChildCount() - 1 );
-						fireDomWalkerEvent.call( this, 'down', lastChild, next );
-						lastChild = next;
-					}
-					return lastChild;
-				}
-				else
-				{
-					next = current.getParent();
-					fireDomWalkerEvent.call( this, 'up', current, next );
-					return next;
-				}
-				return null;
-			};
-
-			return function()
-			{
-				this._.actionEvents = [];
-				return {
-					node : ( this._.currentNode = dfsStepBackward.apply( this ) ),
-					events : this._.actionEvents
-				};
-			};
-		})(),
-
-		forward : function( guardFunc )
-		{
-			var retval;
-			this._.stopFlag = false;
-
-			// The default behavior is to stop once the end of document is reached.
-			guardFunc = guardFunc || function( evt ) {};
-
-			this.on( 'sibling', guardFunc );
-			this.on( 'up', guardFunc );
-			this.on( 'down', guardFunc );
-			while( ( !retval || retval.node ) && !this._.stopFlag )
-			{
-				retval = this.next();
-				this.fire( 'step', retval );
-			}
-			this.removeListener( 'sibling', guardFunc );
-			this.removeListener( 'up', guardFunc );
-			this.removeListener( 'down', guardFunc );
-			return retval;
-		},
-
-		reverse : function( guardFunc )
-		{
-			var retval;
-			this._.stopFlag = false;
-
-			// The default behavior is top stop once the start of document is reached.
-			guardFunc = guardFunc || function( evt ) {};
-
-			this.on( 'sibling', guardFunc );
-			this.on( 'up', guardFunc );
-			this.on( 'down', guardFunc );
-			while( ( !retval || retval.node ) && !this._.stopFlag )
-			{
-				retval = this.back();
-				this.fire( 'step', retval );
-			}
-			this.removeListener( 'sibling', guardFunc );
-			this.removeListener( 'up', guardFunc );
-			this.removeListener( 'down', guardFunc );
-			return retval;
-		},
-
-		stop : function()
-		{
-			this._.stopFlag = true;
-			return this;
-		},
-
-		stopped : function()
-		{
-			return this._.stopFlag;
-		},
-
-		setNode : function( node )
-		{
-			this._.currentNode = node;
-			return this;
-		}
-	};
-
-	/*
-	 * Anything whose display computed style is block, list-item, table,
-	 * table-row-group, table-header-group, table-footer-group, table-row,
-	 * table-column-group, table-column, table-cell, table-caption, or whose node
-	 * name is hr, br (when enterMode is br only) is a block boundary.
-	 */
-	var blockBoundaryDisplayMatch =
-	{
-		block : 1,
-		'list-item' : 1,
-		table : 1,
-		'table-row-group' : 1,
-		'table-header-group' : 1,
-		'table-footer-group' : 1,
-		'table-row' : 1,
-		'table-column-group' : 1,
-		'table-column' : 1,
-		'table-cell' : 1,
-		'table-caption' : 1
-	},
-		blockBoundaryNodeNameMatch = { hr : 1 };
-
-	CKEDITOR.dom.element.prototype.isBlockBoundary = function( customNodeNames )
-	{
-		var nodeNameMatches = CKEDITOR.tools.extend( {}, blockBoundaryNodeNameMatch, customNodeNames || {} );
-
-		return blockBoundaryDisplayMatch[ this.getComputedStyle( 'display' ) ] ||
-			nodeNameMatches[ this.getName() ];
-	};
-
-	CKEDITOR.dom.domWalker.blockBoundary = function( customNodeNames )
-	{
-		return function( evt )
-		{
-			var to = evt.data.to,
-				from = evt.data.from;
-			if ( to && to.type == CKEDITOR.NODE_ELEMENT )
-			{
-				if ( to.isBlockBoundary( customNodeNames ) )
-				{
-					evt.stop();
-					this.stop();
-					return;
-				}
-			}
-			if ( ( evt.data.type == 'up' || evt.data.type == 'sibling' ) && from && from.type == CKEDITOR.NODE_ELEMENT )
-			{
-				if ( from.isBlockBoundary( customNodeNames ) )
-				{
-					evt.stop();
-					this.stop();
-				}
-			}
-		};
-	};
-
-	CKEDITOR.dom.domWalker.listItemBoundary = function()
-	{
-		return CKEDITOR.dom.domWalker.blockBoundary( { br : 1 } );
-	};
-})();
Index: /CKEditor/branches/versions/3.0.x/_source/core/dom/element.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/core/dom/element.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/core/dom/element.js	(revision 4056)
@@ -431,8 +431,5 @@
 						case 'style':
 							// IE does not return inline styles via getAttribute(). See #2947.
-							var styleText = this.$.style.cssText;
-							return styleText.toLowerCase().replace(
-								/\s*(?:;\s*|$)/, ';').replace(
-									/([^;])$/, '$1;');
+							return this.$.style.cssText;
 					}
 
@@ -645,14 +642,14 @@
 
 		/**
-		 * @param ignoreEmpty Skip empty text nodes.
-		 */
-		getLast : function( ignoreEmpty )
-		{
-			var $ = this.$.lastChild;
-			if ( ignoreEmpty && $ && ( $.nodeType == CKEDITOR.NODE_TEXT )
-					&& !CKEDITOR.tools.trim( $.nodeValue ) )
-				return new CKEDITOR.dom.node( $ ).getPrevious( true );
-			else
-				return $ ? new CKEDITOR.dom.node( $ ) : null;
+		 * @param {Function} evaluator Filtering the result node.
+		 */
+		getLast : function( evaluator )
+		{
+			var last = this.$.lastChild,
+				retval = last && new CKEDITOR.dom.node( last );
+			if ( retval && evaluator && !evaluator( retval ) )
+				retval = retval.getPrevious( evaluator );
+
+			return retval;
 		},
 
@@ -775,5 +772,5 @@
 								// Note : I was not able to reproduce it outside the editor,
 								// but I've faced it while working on the TC of #1391.
-								if ( this.getAttribute( 'class' ) > 0 )
+								if ( this.getAttribute( 'class' ) )
 									return true;
 
@@ -1224,10 +1221,12 @@
 			var elementPosition = this.getDocumentPosition();
 			offset += elementPosition.y;
-			// Scroll the window to the desired position, if not already visible.
+
+			// offset value might be out of range(nagative), fix it(#3692).
+			offset = offset < 0 ? 0 : offset;
+
+			// Scroll the window to the desired position, if not already visible(#3795).
 			var currentScroll = win.getScrollPosition().y;
-
-			// Though the computed offset value maybe out of range ( e.g.
-			// a negative value ), browser will try to scroll as much as possible. (#3692)
-			win.$.scrollTo( 0, offset > 0 ? offset : 0 );
+			if ( offset > currentScroll || offset < currentScroll - winHeight )
+				win.$.scrollTo( 0, offset );
 		},
 
Index: /CKEditor/branches/versions/3.0.x/_source/core/dom/node.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/core/dom/node.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/core/dom/node.js	(revision 4056)
@@ -351,19 +351,20 @@
 		},
 
-		getPrevious : function( ignoreSpaces )
-		{
-			var previous = this.$.previousSibling;
-			while ( ignoreSpaces && previous && ( previous.nodeType == CKEDITOR.NODE_TEXT )
-					&& !CKEDITOR.tools.trim( previous.nodeValue ) )
+		getPrevious : function( evaluator )
+		{
+			var previous = this.$, retval;
+			do
+			{
 				previous = previous.previousSibling;
-
-			return previous ? new CKEDITOR.dom.node( previous ) : null;
+				retval = previous && new CKEDITOR.dom.node( previous );
+			}
+			while ( retval && evaluator && !evaluator( retval ) )
+			return retval;
 		},
 
 		/**
 		 * Gets the node that follows this element in its parent's child list.
-		 * @param {Boolean} ignoreSpaces Whether should ignore empty text nodes.
-		 * @returns {CKEDITOR.dom.node} The next node or null if not
-		 *		available.
+		 * @param {Function} evaluator Filtering the result node.
+		 * @returns {CKEDITOR.dom.node} The next node or null if not available.
 		 * @example
 		 * var element = CKEDITOR.dom.element.createFromHtml( '&lt;div&gt;&lt;b&gt;Example&lt;/b&gt; &lt;i&gt;next&lt;/i&gt;&lt;/div&gt;' );
@@ -371,12 +372,14 @@
 		 * alert( first.getName() );  // "i"
 		 */
-		getNext : function( ignoreSpaces )
-		{
-			var next = this.$.nextSibling;
-			while ( ignoreSpaces && next && ( next.nodeType == CKEDITOR.NODE_TEXT )
-				  && !CKEDITOR.tools.trim( next.nodeValue ) )
+		getNext : function( evaluator )
+		{
+			var next = this.$, retval;
+			do
+			{
 				next = next.nextSibling;
-
-			return next ? new CKEDITOR.dom.node( next ) : null;
+				retval = next && new CKEDITOR.dom.node( next );
+			}
+			while ( retval && evaluator && !evaluator( retval ) )
+			return retval;
 		},
 
@@ -395,5 +398,5 @@
 		},
 
-		getParents : function()
+		getParents : function( closerFirst )
 		{
 			var node = this;
@@ -402,5 +405,5 @@
 			do
 			{
-				parents.unshift( node );
+				parents[  closerFirst ? 'push' : 'unshift' ]( node );
 			}
 			while ( ( node = node.getParent() ) )
Index: /CKEditor/branches/versions/3.0.x/_source/core/dom/range.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/core/dom/range.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/core/dom/range.js	(revision 4056)
@@ -301,8 +301,10 @@
 	function elementBoundaryEval( node )
 	{
-		// Reject any text node unless it's being bookmark.
+		// Reject any text node unless it's being bookmark
+		// OR it's spaces. (#3883)
 		return node.type != CKEDITOR.NODE_TEXT
-		       && node.getName() in CKEDITOR.dtd.$removeEmpty
-			   || node.getParent().hasAttribute( '_fck_bookmark' );
+			    && node.getName() in CKEDITOR.dtd.$removeEmpty
+			    || !CKEDITOR.tools.trim( node.getText() )
+			    || node.getParent().hasAttribute( '_fck_bookmark' );
 	}
 
@@ -1172,18 +1174,17 @@
 					walker.guard = boundaryGuard;
 
-
-					if ( ( enlargeable = walker.lastBackward() ) )
-					{
-						// It's the body which stop the enlaring if no block boundary found.
-						blockBoundary = blockBoundary || body;
-
-						// Start the range at different position by comparing
-						// the document position of it with 'enlargeable' node.
-						this.setStartAt(
-								blockBoundary,
-								blockBoundary.contains( enlargeable ) ?
-									CKEDITOR.POSITION_AFTER_START :
-									CKEDITOR.POSITION_AFTER_END );
-					}
+					enlargeable = walker.lastBackward();
+
+					// It's the body which stop the enlarging if no block boundary found.
+					blockBoundary = blockBoundary || body;
+
+					// Start the range at different position by comparing
+					// the document position of it with 'enlargeable' node.
+					this.setStartAt(
+							blockBoundary,
+							!blockBoundary.is( 'br' ) &&
+							( !enlargeable || blockBoundary.contains( enlargeable ) ) ?
+								CKEDITOR.POSITION_AFTER_START :
+								CKEDITOR.POSITION_AFTER_END );
 
 					// Enlarging the end boundary.
@@ -1199,17 +1200,17 @@
 					// End the range right before the block boundary node.
 
-					if ( ( enlargeable = walker.lastForward() ) )
-					{
-						// It's the body which stop the enlaring if no block boundary found.
-						blockBoundary = blockBoundary || body;
-
-						// Start the range at different position by comparing
-						// the document position of it with 'enlargeable' node.
-						this.setEndAt(
-								blockBoundary,
-								blockBoundary.contains( enlargeable ) ?
-									CKEDITOR.POSITION_BEFORE_END :
-									CKEDITOR.POSITION_BEFORE_START );
-					}
+					enlargeable = walker.lastForward();
+
+					// It's the body which stop the enlarging if no block boundary found.
+					blockBoundary = blockBoundary || body;
+
+					// Start the range at different position by comparing
+					// the document position of it with 'enlargeable' node.
+					this.setEndAt(
+							blockBoundary,
+							!blockBoundary.is( 'br' ) &&
+							( !enlargeable || blockBoundary.contains( enlargeable ) ) ?
+								CKEDITOR.POSITION_BEFORE_END :
+								CKEDITOR.POSITION_BEFORE_START );
 					// We must include the <br> at the end of range if there's
 					// one and we're expanding list item contents
@@ -1601,5 +1602,29 @@
 
 			if ( editableElement )
-				this.moveToPosition( editableElement, CKEDITOR.POSITION_AFTER_START );
+			{
+				this.moveToPosition(editableElement, CKEDITOR.POSITION_AFTER_START);
+				return true;
+			}
+			else
+				return false;
+		},
+
+		/**
+		 * Get the single node enclosed within the range if there's one.
+		 */
+		getEnclosedNode : function()
+		{
+			var walkerRange = this.clone(),
+				walker = new CKEDITOR.dom.walker( walkerRange ),
+				isNotBookmarks = CKEDITOR.dom.walker.bookmark( true ),
+				isNotWhitespaces = CKEDITOR.dom.walker.whitespaces( true ),
+				evaluator = function( node )
+				{
+					return isNotWhitespaces( node ) && isNotBookmarks( node );
+				};
+			walkerRange.evaluator = evaluator;
+			var node = walker.next();
+			walker.reset();
+			return node && node.equals( walker.previous() ) ? node : null;
 		},
 
Index: /CKEditor/branches/versions/3.0.x/_source/core/dom/walker.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/core/dom/walker.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/core/dom/walker.js	(revision 4056)
@@ -305,4 +305,10 @@
 			{
 				return iterateToLast.call( this, true );
+			},
+
+			reset : function()
+			{
+				delete this.current;
+				this._ = {};
 			}
 
@@ -380,13 +386,26 @@
 		return function( node )
 		{
-			var retval, parent;
+			var isBookmark, parent;
 			// Is bookmark inner text node?
-			retval = ( node && !node.getName && ( parent = node.getParent() )
+			isBookmark = ( node && !node.getName && ( parent = node.getParent() )
 						&& isBookmarkNode( parent ) );
 			// Is bookmark node?
-			retval = contentOnly ? retval : retval || isBookmarkNode( node );
-			return isReject ? !retval : !!retval;
+			isBookmark = contentOnly ? isBookmark : isBookmark || isBookmarkNode( node );
+			return isReject ^ isBookmark;
 		};
 	};
 
+	/**
+	 * Whether the node contains only white-spaces characters.
+	 * @param isReject
+	 */
+	CKEDITOR.dom.walker.whitespaces = function( isReject )
+	{
+		return function( node )
+		{
+			var isWhitespace = node && ( node.type == CKEDITOR.NODE_TEXT )
+							&& !CKEDITOR.tools.trim( node.getText() );
+			return isReject ^ isWhitespace;
+		};
+	};
 })();
Index: /CKEditor/branches/versions/3.0.x/_source/core/dom/window.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/core/dom/window.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/core/dom/window.js	(revision 4056)
@@ -36,4 +36,7 @@
 		focus : function()
 		{
+			// Webkit is sometimes failed to focus iframe, blur it first(#3835).
+			if( CKEDITOR.env.webkit && this.$.parent )
+				this.$.parent.focus();
 			this.$.focus();
 		},
Index: /CKEditor/branches/versions/3.0.x/_source/core/editor.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/core/editor.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/core/editor.js	(revision 4056)
@@ -284,8 +284,9 @@
 			if ( form )
 			{
-				form.on( 'submit', function()
-					{
-						editor.updateElement();
-					});
+				function onSubmit()
+				{
+					editor.updateElement();
+				}
+				form.on( 'submit',onSubmit );
 
 				// Setup the submit function because it doesn't fire the
@@ -309,5 +310,11 @@
 				}
 			}
-		}
+
+				// Remove 'submit' events registered on form element before destroying.(#3988)
+				editor.on( 'destroy', function()
+				{
+					form.removeListener( 'submit', onSubmit );
+				} );
+			}
 	};
 
@@ -366,4 +373,7 @@
 						|| getNewName();
 
+			if ( this.name in CKEDITOR.instances )
+				throw '[CKEDITOR.editor] The instance "' + this.name + '" already exists.';
+
 			/**
 			 * The configurations for this editor instance. It inherits all
@@ -449,4 +459,5 @@
 
 			this.theme.destroy( this );
+			this.fire( 'destroy' );
 			CKEDITOR.remove( this );
 		},
Index: /CKEditor/branches/versions/3.0.x/_source/core/htmlparser/fragment.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/core/htmlparser/fragment.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/core/htmlparser/fragment.js	(revision 4056)
@@ -105,22 +105,32 @@
 			// If the target is the fragment and this element can't go inside
 			// body (if fixForBody).
-			if ( fixForBody && !target.type && !CKEDITOR.dtd.$body[ element.name ] )
-			{
-				var savedCurrent = currentNode;
-
-				// Create a <p> in the fragment.
-				currentNode = target;
-				parser.onTagOpen( fixForBody, {} );
-
-				// The new target now is the <p>.
-				target = currentNode;
-
-				if ( enforceCurrent )
-					currentNode = savedCurrent;
+			if ( fixForBody && !target.type )
+			{
+				var elementName, realElementName;
+				if ( element.attributes
+					 && ( realElementName =
+						  element.attributes[ '_cke_real_element_type' ] ) )
+					elementName = realElementName;
+				else
+					elementName =  element.name;
+				if ( !( elementName in CKEDITOR.dtd.$body ) )
+				{
+					var savedCurrent = currentNode;
+
+					// Create a <p> in the fragment.
+					currentNode = target;
+					parser.onTagOpen( fixForBody, {} );
+
+					// The new target now is the <p>.
+					target = currentNode;
+
+					if ( enforceCurrent )
+						currentNode = savedCurrent;
+				}
 			}
 
 			// Rtrim empty spaces on block end boundary. (#3585)
 			if ( element._.isBlockLike
-				 && !inPre )
+				 && element.name != 'pre' )
 			{
 
@@ -283,4 +293,11 @@
 				if ( candidate == currentNode )
 					currentNode = currentNode.parent;
+			}
+			// The tag is not actually closing anything, thus we need invalidate
+			// the pending elements.(#3862)
+			else
+			{
+				pendingInline.splice( 0, index );
+				index = 0;
 			}
 
Index: /CKEditor/branches/versions/3.0.x/_source/core/loader.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/core/loader.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/core/loader.js	(revision 4056)
@@ -40,6 +40,5 @@
 			'core/dom/nodelist'		: [ 'core/dom/node' ],
 			'core/dom/domobject'	: [ 'core/dom/event' ],
-			'core/dom/domwalker'	: [ 'core/dom/node', 'core/dom/element', 'core/dom/document' ],
-			'core/dom/range'		: [ 'core/dom/document', 'core/dom/documentfragment', 'core/dom/element', 'core/dom/domwalker', 'core/dom/walker' ],
+			'core/dom/range'		: [ 'core/dom/document', 'core/dom/documentfragment', 'core/dom/element', 'core/dom/walker' ],
 			'core/dom/text'			: [ 'core/dom/node', 'core/dom/domobject' ],
 			'core/dom/walker'		: [ 'core/dom/node' ],
@@ -125,4 +124,6 @@
 		};
 
+		var pendingLoad = [];
+
 		/** @lends CKEDITOR.loader */
 		return {
@@ -136,4 +137,55 @@
 			loadedScripts : [],
 
+			loadPending : function()
+			{
+				var scriptName = pendingLoad.shift();
+
+				if ( !scriptName )
+					return;
+
+				var scriptSrc = getUrl( '_source/' + scriptName + '.js' );
+
+				var script = document.createElement( 'script' );
+				script.type = 'text/javascript';
+				script.src = scriptSrc;
+
+				function onScriptLoaded()
+				{
+					// Append this script to the list of loaded scripts.
+					CKEDITOR.loader.loadedScripts.push( scriptName );
+
+					// Load the next.
+					CKEDITOR.loader.loadPending();
+				}
+
+				// We must guarantee the execution order of the scripts, so we
+				// need to load them one by one. (#4145)
+				// The followin if/else block has been taken from the scriptloader core code.
+				if ( CKEDITOR.env.ie )
+				{
+					/** @ignore */
+					script.onreadystatechange = function()
+					{
+						if ( script.readyState == 'loaded' || script.readyState == 'complete' )
+						{
+							script.onreadystatechange = null;
+							onScriptLoaded();
+						}
+					};
+				}
+				else
+				{
+					/** @ignore */
+					script.onload = function()
+					{
+						// Some browsers, such as Safari, may call the onLoad function
+						// immediately. Which will break the loading sequence. (#3661)
+						setTimeout( function() { onScriptLoaded( scriptName ); }, 0 );
+					};
+				}
+
+				document.body.appendChild( script );
+			},
+
 			/**
 			 * Loads a specific script, including its dependencies. This is not a
@@ -143,5 +195,5 @@
 			 * CKEDITOR.loader.load( 'core/dom/element' );
 			 */
-			load : function( scriptName )
+			load : function( scriptName, defer )
 			{
 				// Check if the script has already been loaded.
@@ -160,8 +212,5 @@
 				// Load all dependencies first.
 				for ( var i = 0 ; i < dependencies.length ; i++ )
-					this.load( dependencies[ i ] );
-
-				// Append this script to the list of loaded scripts.
-				this.loadedScripts.push( scriptName );
+					this.load( dependencies[ i ], true );
 
 				var scriptSrc = getUrl( '_source/' + scriptName + '.js' );
@@ -170,12 +219,16 @@
 				if ( document.body )
 				{
-					var script = document.createElement( 'script' );
-					script.type = 'text/javascript';
-					script.src = scriptSrc;
-
-					document.body.appendChild( script );
+					pendingLoad.push( scriptName );
+
+					if ( !defer )
+						this.loadPending();
 				}
 				else
+				{
+					// Append this script to the list of loaded scripts.
+					this.loadedScripts.push( scriptName );
+
 					document.write( '<script src="' + scriptSrc + '" type="text/javascript"><\/script>' );
+				}
 			}
 		};
Index: /CKEditor/branches/versions/3.0.x/_source/core/test.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/core/test.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/core/test.js	(revision 4056)
@@ -31,4 +31,6 @@
 	assert : YAHOO.util.Assert,
 
+	runner : YAHOO.tool.TestRunner,
+
 	/**
 	 * Adds a test case to the test runner.
@@ -56,6 +58,7 @@
 	/**
 	 * Gets the inner HTML of an element, for testing purposes.
+	 * @param {Boolean} stripLineBreaks Assign 'false' to avoid trimming line-breaks.
 	 */
-	getInnerHtml : function( elementOrId )
+	getInnerHtml : function( elementOrId , stripLineBreaks )
 	{
 		var html;
@@ -66,8 +69,25 @@
 			html = elementOrId.getHtml();
 		else
-			html = elementOrId.innerHTML || '';
+			html = elementOrId.innerHTML    // retrieve from innerHTML
+				   || elementOrId.value;    // retrieve from value
 
+		return CKEDITOR.test.fixHtml( html, stripLineBreaks );
+	},
+
+	fixHtml : function( html, stripLineBreaks )
+	{
 		html = html.toLowerCase();
-		html = html.replace( /[\n\r]/g, '' );
+
+		if ( stripLineBreaks !== false )
+			html = html.replace( /[\n\r]/g, '' );
+		else
+			html = html.replace( /\r/g, '' );    // Normalize CRLF.
+
+		function sorter( a, b )
+		{
+			var nameA = a[ 0 ];
+			var nameB = b[ 0 ];
+			return nameA < nameB ? -1 : nameA > nameB ? 1 : 0;
+		}
 
 		html = html.replace( /<\w[^>]*/g, function( match )
@@ -80,9 +100,23 @@
 						if ( attName == 'style' )
 						{
-							// Safari adds some extra space to the end.
-							attValue = attValue.replace( /\s+/g, '' );
+							// Reorganize the style rules so they are sorted by name.
 
-							// IE doesn't add the final ";"
-							attValue = attValue.replace( /([^"';\s])\s*(["']?)$/, '$1;$2' );
+							var rules = [];
+
+							// Push all rules into an Array.
+							attValue.replace( /(?:"| |;|^ )\s*([^ :]+?)\s*:\s*([^;"]+?)\s*(?=;|"|$)/g, function( match, name, value )
+								{
+									rules.push( [ name, value ] );
+								});
+
+							// Sort the Array.
+							rules.sort( sorter );
+
+							// Transform each rule entry into a string name:value.
+							for ( var i = 0 ; i < rules.length ; i++ )
+								rules[ i ] = rules[ i ].join( ':' );
+
+							// Join all rules with commas, removing spaces and adding an extra comma to the end.
+							attValue = '"' + rules && ( rules.join( ';' ).replace( /\s+/g, '' ) + ';' );
 						}
 
@@ -102,10 +136,5 @@
 					} );
 
-				attribs.sort( function( a, b )
-					{
-						var nameA = a[ 0 ];
-						var nameB = b[ 0 ];
-						return nameA < nameB ? -1 : nameA > nameB ? 1 : 0;
-					} );
+				attribs.sort( sorter );
 
 				var ret = match.replace( /\s{2,}/g, ' ' );
@@ -121,4 +150,35 @@
 
 		return html;
-	}
+	},
+
+	/**
+	 * Wrapper of CKEDITOR.dom.element::getAttribute for style text normalization.
+	 * @param element
+	 * @param attrName
+	 */
+	getAttribute : function( element, attrName )
+	{
+		var retval = element.getAttribute( attrName );
+		if ( attrName == 'style' )
+		{
+			// 1. Lower case property name.
+			// 2. Add space after colon.
+			// 3. Strip whitepsaces around semicolon.
+			// 4. Always end with semicolon
+			return retval.replace( /(?:^|;)\s*([A-Z-_]+)(:\s*)/ig,
+				function( match, property, colon )
+				{
+					return property.toLowerCase() + ': ';
+				} )
+				.replace( /\s+(?:;\s*|$)/g, ';' )
+				.replace( /([^;])$/g, '$1;' );
+		}
+
+		return retval;
+	},
+
+	/**
+	 * Whether control the runner manually instead of running on window onload.
+	 */
+	deferRunner : false
 };
Index: /CKEditor/branches/versions/3.0.x/_source/core/tools.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/core/tools.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/core/tools.js	(revision 4056)
@@ -228,12 +228,30 @@
 			};
 
-			this.htmlEncode = ( standard( '>' ) == '>' ) ?
+			var fix1 = ( standard( '\n' ).toLowerCase() == '<br>' ) ?
+				function( text )
+				{
+					// #3874 IE and Safari encode line-break into <br>
+					return standard( text ).replace( /<br>/gi, '\n' );
+				} :
+				standard;
+
+			var fix2 = ( standard( '>' ) == '>' ) ?
 				function( text )
 				{
 					// WebKit does't encode the ">" character, which makes sense, but
 					// it's different than other browsers.
-					return standard( text ).replace( />/g, '&gt;' );
+					return fix1( text ).replace( />/g, '&gt;' );
 				} :
-				standard;
+				fix1;
+
+			var fix3 = ( standard( '  ' ) == '&nbsp; ' ) ?
+				function( text )
+				{
+					// #3785 IE8 changes spaces (>= 2) to &nbsp;
+					return fix2( text ).replace( /&nbsp;/g, ' ' );
+				} :
+				fix2;
+
+			this.htmlEncode = fix3;
 
 			return this.htmlEncode( text );
@@ -502,5 +520,10 @@
 				return length + ( decimalRegex.test( length ) ? 'px' : '' );
 			};
-		})()
+		})(),
+
+		repeat : function( str, times )
+		{
+			return new Array( times + 1 ).join( str );
+		}
 	};
 })();
Index: /CKEditor/branches/versions/3.0.x/_source/lang/_translationstatus.txt
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/_translationstatus.txt	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/_translationstatus.txt	(revision 4056)
@@ -2,58 +2,58 @@
 For licensing, see LICENSE.html or http://ckeditor.com/license
 
-af.js      Found: 312 Missing: 122
-ar.js      Found: 327 Missing: 107
-bg.js      Found: 305 Missing: 129
-bn.js      Found: 307 Missing: 127
-bs.js      Found: 210 Missing: 224
-ca.js      Found: 327 Missing: 107
-cs.js      Found: 327 Missing: 107
-da.js      Found: 326 Missing: 108
-de.js      Found: 421 Missing: 13
-el.js      Found: 311 Missing: 123
-en-au.js   Found: 395 Missing: 39
-en-ca.js   Found: 395 Missing: 39
-en-uk.js   Found: 395 Missing: 39
-eo.js      Found: 282 Missing: 152
-es.js      Found: 332 Missing: 102
-et.js      Found: 326 Missing: 108
-eu.js      Found: 327 Missing: 107
-fa.js      Found: 327 Missing: 107
-fi.js      Found: 325 Missing: 109
-fo.js      Found: 326 Missing: 108
-fr-ca.js   Found: 327 Missing: 107
-fr.js      Found: 369 Missing: 65
-gl.js      Found: 308 Missing: 126
-gu.js      Found: 326 Missing: 108
-he.js      Found: 332 Missing: 102
-hi.js      Found: 327 Missing: 107
-hr.js      Found: 327 Missing: 107
-hu.js      Found: 326 Missing: 108
-is.js      Found: 332 Missing: 102
-it.js      Found: 325 Missing: 109
-ja.js      Found: 327 Missing: 107
-km.js      Found: 299 Missing: 135
-ko.js      Found: 318 Missing: 116
-lt.js      Found: 331 Missing: 103
-lv.js      Found: 308 Missing: 126
-mn.js      Found: 326 Missing: 108
-ms.js      Found: 287 Missing: 147
-nb.js      Found: 325 Missing: 109
-nl.js      Found: 327 Missing: 107
-no.js      Found: 325 Missing: 109
-pl.js      Found: 325 Missing: 109
-pt-br.js   Found: 325 Missing: 109
-pt.js      Found: 307 Missing: 127
-ro.js      Found: 326 Missing: 108
-ru.js      Found: 332 Missing: 102
-sk.js      Found: 327 Missing: 107
-sl.js      Found: 325 Missing: 109
-sr-latn.js Found: 301 Missing: 133
-sr.js      Found: 301 Missing: 133
-sv.js      Found: 324 Missing: 110
-th.js      Found: 312 Missing: 122
-tr.js      Found: 332 Missing: 102
-uk.js      Found: 327 Missing: 107
-vi.js      Found: 326 Missing: 108
-zh-cn.js   Found: 332 Missing: 102
-zh.js      Found: 327 Missing: 107
+af.js      Found: 312 Missing: 123
+ar.js      Found: 329 Missing: 106
+bg.js      Found: 305 Missing: 130
+bn.js      Found: 307 Missing: 128
+bs.js      Found: 210 Missing: 225
+ca.js      Found: 435 Missing: 0
+cs.js      Found: 327 Missing: 108
+da.js      Found: 326 Missing: 109
+de.js      Found: 435 Missing: 0
+el.js      Found: 311 Missing: 124
+en-au.js   Found: 395 Missing: 40
+en-ca.js   Found: 395 Missing: 40
+en-uk.js   Found: 395 Missing: 40
+eo.js      Found: 282 Missing: 153
+es.js      Found: 435 Missing: 0
+et.js      Found: 326 Missing: 109
+eu.js      Found: 435 Missing: 0
+fa.js      Found: 327 Missing: 108
+fi.js      Found: 325 Missing: 110
+fo.js      Found: 326 Missing: 109
+fr-ca.js   Found: 327 Missing: 108
+fr.js      Found: 434 Missing: 1
+gl.js      Found: 308 Missing: 127
+gu.js      Found: 326 Missing: 109
+he.js      Found: 332 Missing: 103
+hi.js      Found: 327 Missing: 108
+hr.js      Found: 435 Missing: 0
+hu.js      Found: 326 Missing: 109
+is.js      Found: 332 Missing: 103
+it.js      Found: 434 Missing: 1
+ja.js      Found: 434 Missing: 1
+km.js      Found: 299 Missing: 136
+ko.js      Found: 318 Missing: 117
+lt.js      Found: 331 Missing: 104
+lv.js      Found: 308 Missing: 127
+mn.js      Found: 326 Missing: 109
+ms.js      Found: 287 Missing: 148
+nb.js      Found: 325 Missing: 110
+nl.js      Found: 327 Missing: 108
+no.js      Found: 325 Missing: 110
+pl.js      Found: 435 Missing: 0
+pt-br.js   Found: 434 Missing: 1
+pt.js      Found: 307 Missing: 128
+ro.js      Found: 326 Missing: 109
+ru.js      Found: 332 Missing: 103
+sk.js      Found: 327 Missing: 108
+sl.js      Found: 325 Missing: 110
+sr-latn.js Found: 301 Missing: 134
+sr.js      Found: 301 Missing: 134
+sv.js      Found: 324 Missing: 111
+th.js      Found: 312 Missing: 123
+tr.js      Found: 332 Missing: 103
+uk.js      Found: 435 Missing: 0
+vi.js      Found: 435 Missing: 0
+zh-cn.js   Found: 435 Missing: 0
+zh.js      Found: 435 Missing: 0
Index: /CKEditor/branches/versions/3.0.x/_source/lang/af.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/af.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/af.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/ar.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/ar.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/ar.js	(revision 4056)
@@ -655,5 +655,6 @@
 	about :
 	{
-		title : 'About CKEditor', // MISSING
+		title : 'حول CKEditor',
+		dlgTitle : 'حول rotidEKC',
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/bg.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/bg.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/bg.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/bn.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/bn.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/bn.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/bs.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/bs.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/bs.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/ca.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/ca.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/ca.js	(revision 4056)
@@ -32,5 +32,5 @@
 	 * of reading non-English words. So be careful while translating it.
 	 */
-	editorTitle		: 'Rich text editor, %1', // MISSING
+	editorTitle		: 'Editor de text enriquit, %1',
 
 	// Toolbar buttons without dialogs.
@@ -91,10 +91,10 @@
 		generalTab		: 'General',
 		advancedTab		: 'Avançat',
-		validateNumberFailed	: 'This value is not a number.', // MISSING
-		confirmNewPage	: 'Any unsaved changes to this content will be lost. Are you sure you want to load new page?', // MISSING
-		confirmCancel	: 'Some of the options have been changed. Are you sure to close the dialog?', // MISSING
+		validateNumberFailed	: 'Aquest valor no és un número.',
+		confirmNewPage	: 'Els canvis en aquest contingut que no es desin es perdran. Esteu segur que voleu carregar una pàgina nova?',
+		confirmCancel	: 'Algunes opcions s\'han canviat. Esteu segur que voleu tancar la finestra de diàleg?',
 
 		// Put the voice-only part of the label in the span.
-		unavailable		: '%1<span class="cke_accessibility">, unavailable</span>' // MISSING
+		unavailable		: '%1<span class="cke_accessibility">, no disponible</span>'
 	},
 
@@ -130,5 +130,5 @@
 		targetPopupName	: 'Nom finestra popup',
 		popupFeatures	: 'Característiques finestra popup',
-		popupResizable	: 'Resizable', // MISSING
+		popupResizable	: 'Redimensionable',
 		popupStatusBar	: 'Barra d\'estat',
 		popupLocationBar	: 'Barra d\'adreça',
@@ -142,5 +142,5 @@
 		popupHeight		: 'Alçada',
 		popupTop		: 'Posició dalt',
-		id				: 'Id', // MISSING
+		id				: 'Id',
 		langDir			: 'Direcció de l\'idioma',
 		langDirNotSet	: '<no definit>',
@@ -188,7 +188,7 @@
 		matchCase			: 'Distingeix majúscules/minúscules',
 		matchWord			: 'Només paraules completes',
-		matchCyclic			: 'Match cyclic', // MISSING
+		matchCyclic			: 'Match cyclic',
 		replaceAll			: 'Reemplaça-ho tot',
-		replaceSuccessMsg	: '%1 occurrence(s) replaced.' // MISSING
+		replaceSuccessMsg	: '%1 ocurrència/es reemplaçada/es.'
 	},
 
@@ -216,16 +216,16 @@
 		caption		: 'Títol',
 		summary		: 'Resum',
-		headers		: 'Headers', // MISSING
-		headersNone		: 'None', // MISSING
-		headersColumn	: 'First column', // MISSING
-		headersRow		: 'First Row', // MISSING
-		headersBoth		: 'Both', // MISSING
-		invalidRows		: 'Number of rows must be a number greater than 0.', // MISSING
-		invalidCols		: 'Number of columns must be a number greater than 0.', // MISSING
-		invalidBorder	: 'Border size must be a number.', // MISSING
-		invalidWidth	: 'Table width must be a number.', // MISSING
-		invalidHeight	: 'Table height must be a number.', // MISSING
-		invalidCellSpacing	: 'Cell spacing must be a number.', // MISSING
-		invalidCellPadding	: 'Cell padding must be a number.', // MISSING
+		headers		: 'Capçaleres',
+		headersNone		: 'Cap',
+		headersColumn	: 'Primera columna',
+		headersRow		: 'Primera fila',
+		headersBoth		: 'Ambdues',
+		invalidRows		: 'El nombre de files ha de ser un nombre major que 0.',
+		invalidCols		: 'El nombre de columnes ha de ser un nombre major que 0.',
+		invalidBorder	: 'El gruix de la vora ha de ser un nombre.',
+		invalidWidth	: 'L\'amplada de la taula  ha de ser un nombre.',
+		invalidHeight	: 'L\'alçada de la taula  ha de ser un nombre.',
+		invalidCellSpacing	: 'L\'espaiat de cel·la  ha de ser un nombre.',
+		invalidCellPadding	: 'L\'encoixinament de cel·la  ha de ser un nombre.',
 
 		cell :
@@ -240,25 +240,25 @@
 			splitHorizontal	: 'Divideix la cel·la horitzontalment',
 			splitVertical	: 'Divideix la cel·la verticalment',
-			title			: 'Cell Properties', // MISSING
-			cellType		: 'Cell Type', // MISSING
-			rowSpan			: 'Rows Span', // MISSING
-			colSpan			: 'Columns Span', // MISSING
-			wordWrap		: 'Word Wrap', // MISSING
-			hAlign			: 'Horizontal Alignment', // MISSING
-			vAlign			: 'Vertical Alignment', // MISSING
-			alignTop		: 'Top', // MISSING
-			alignMiddle		: 'Middle', // MISSING
-			alignBottom		: 'Bottom', // MISSING
-			alignBaseline	: 'Baseline', // MISSING
-			bgColor			: 'Background Color', // MISSING
-			borderColor		: 'Border Color', // MISSING
-			data			: 'Data', // MISSING
-			header			: 'Header', // MISSING
-			yes				: 'Yes', // MISSING
-			no				: 'No', // MISSING
-			invalidWidth	: 'Cell width must be a number.', // MISSING
-			invalidHeight	: 'Cell height must be a number.', // MISSING
-			invalidRowSpan	: 'Rows span must be a whole number.', // MISSING
-			invalidColSpan	: 'Columns span must be a whole number.' // MISSING
+			title			: 'Propertiat de la cel·la',
+			cellType		: 'Tipus de cel·la',
+			rowSpan			: 'Expansió de files',
+			colSpan			: 'Expansió de columnes',
+			wordWrap		: 'Ajustar al contingut',
+			hAlign			: 'Aliniació Horizontal',
+			vAlign			: 'Aliniació Vertical',
+			alignTop		: 'A dalt',
+			alignMiddle		: 'Al mig',
+			alignBottom		: 'A baix',
+			alignBaseline	: 'A la línia base',
+			bgColor			: 'Color de fons',
+			borderColor		: 'Color de la vora',
+			data			: 'Data',
+			header			: 'Capçalera',
+			yes				: 'Sí',
+			no				: 'No',
+			invalidWidth	: 'L\'amplada de cel·la ha de ser un nombre.',
+			invalidHeight	: 'L\'alçada de cel·la ha de ser un nombre.',
+			invalidRowSpan	: 'L\'expansió de files ha de ser un nombre enter.',
+			invalidColSpan	: 'L\'expansió de columnes ha de ser un nombre enter.'
 		},
 
@@ -307,5 +307,5 @@
 		action		: 'Acció',
 		method		: 'Mètode',
-		encoding	: 'Encoding', // MISSING
+		encoding	: 'Codificació',
 		target		: 'Destí',
 		targetNotSet	: '<no definit>',
@@ -396,6 +396,6 @@
 		alertUrl	: 'Si us plau, escriviu la URL de la imatge',
 		linkTab	: 'Enllaç',
-		button2Img	: 'Do you want to transform the selected image button on a simple image?', // MISSING
-		img2Button	: 'Do you want to transform the selected image on a image button?' // MISSING
+		button2Img	: 'Voleu transformar el botó d\'imatge seleccionat en una simple imatge?',
+		img2Button	: 'Voleu transformar la imatge seleccionada en un botó d\'imatge?'
 	},
 
@@ -404,18 +404,18 @@
 	{
 		properties		: 'Propietats del Flash',
-		propertiesTab	: 'Properties', // MISSING
+		propertiesTab	: 'Propietats',
 		title		: 'Propietats del Flash',
 		chkPlay		: 'Reprodució automàtica',
 		chkLoop		: 'Bucle',
 		chkMenu		: 'Habilita menú Flash',
-		chkFull		: 'Allow Fullscreen', // MISSING
+		chkFull		: 'Permetre la pantalla completa',
  		scale		: 'Escala',
 		scaleAll		: 'Mostra-ho tot',
 		scaleNoBorder	: 'Sense vores',
 		scaleFit		: 'Mida exacta',
-		access			: 'Script Access', // MISSING
-		accessAlways	: 'Always', // MISSING
-		accessSameDomain	: 'Same domain', // MISSING
-		accessNever	: 'Never', // MISSING
+		access			: 'Accés a scripts',
+		accessAlways	: 'Sempre',
+		accessSameDomain	: 'El mateix domini',
+		accessNever	: 'Mai',
 		align		: 'Alineació',
 		alignLeft	: 'Ajusta a l\'esquerra',
@@ -428,16 +428,16 @@
 		alignTextTop	: 'Text Top',
 		alignTop	: 'Top',
-		quality		: 'Quality', // MISSING
-		qualityBest		 : 'Best', // MISSING
-		qualityHigh		 : 'High', // MISSING
-		qualityAutoHigh	 : 'Auto High', // MISSING
-		qualityMedium	 : 'Medium', // MISSING
-		qualityAutoLow	 : 'Auto Low', // MISSING
-		qualityLow		 : 'Low', // MISSING
-		windowModeWindow	 : 'Window', // MISSING
-		windowModeOpaque	 : 'Opaque', // MISSING
-		windowModeTransparent	 : 'Transparent', // MISSING
-		windowMode	: 'Window mode', // MISSING
-		flashvars	: 'Variables for Flash', // MISSING
+		quality		: 'Qualitat',
+		qualityBest		 : 'La millor',
+		qualityHigh		 : 'Alta',
+		qualityAutoHigh	 : 'Alta automàtica',
+		qualityMedium	 : 'Mitjana',
+		qualityAutoLow	 : 'Baixa automàtica',
+		qualityLow		 : 'Baixa',
+		windowModeWindow	 : 'Finestra',
+		windowModeOpaque	 : 'Opaca',
+		windowModeTransparent	 : 'Transparent',
+		windowMode	: 'Mode de la finestra',
+		flashvars	: 'Variables de Flash',
 		bgcolor	: 'Color de Fons',
 		width	: 'Amplada',
@@ -446,8 +446,8 @@
 		vSpace	: 'Espaiat vert.',
 		validateSrc : 'Si us plau, escrigui l\'enllaç URL',
-		validateWidth : 'Width must be a number.', // MISSING
-		validateHeight : 'Height must be a number.', // MISSING
-		validateHSpace : 'HSpace must be a number.', // MISSING
-		validateVSpace : 'VSpace must be a number.' // MISSING
+		validateWidth : 'L\'amplada ha de ser un nombre.',
+		validateHeight : 'L\'alçada ha de ser un nombre.',
+		validateHSpace : 'L\'espaiat horitzonatal ha de ser un nombre.',
+		validateVSpace : 'L\'espaiat vertical ha de ser un nombre.'
 	},
 
@@ -456,7 +456,7 @@
 	{
 		toolbar			: 'Revisa l\'ortografia',
-		title			: 'Spell Check', // MISSING
-		notAvailable	: 'Sorry, but service is unavailable now.', // MISSING
-		errorLoading	: 'Error loading application service host: %s.', // MISSING
+		title			: 'Comprova l\'ortografia',
+		notAvailable	: 'El servei no es troba disponible ara.',
+		errorLoading	: 'Error carregant el servidor: %s.',
 		notInDic		: 'No és al diccionari',
 		changeTo		: 'Reemplaça amb',
@@ -483,5 +483,5 @@
 	elementsPath :
 	{
-		eleTitle : '%1 element' // MISSING
+		eleTitle : '%1 element'
 	},
 
@@ -539,9 +539,9 @@
 	{
 		label : 'Estil',
-		voiceLabel : 'Styles', // MISSING
-		panelVoiceLabel : 'Select a style', // MISSING
-		panelTitle1 : 'Block Styles', // MISSING
-		panelTitle2 : 'Inline Styles', // MISSING
-		panelTitle3 : 'Object Styles' // MISSING
+		voiceLabel : 'Estils',
+		panelVoiceLabel : 'Seleccioneu un estil',
+		panelTitle1 : 'Estils de bloc',
+		panelTitle2 : 'Estils incrustats',
+		panelTitle3 : 'Estils d\'objecte'
 	},
 
@@ -549,7 +549,7 @@
 	{
 		label : 'Format',
-		voiceLabel : 'Format', // MISSING
+		voiceLabel : 'Format',
 		panelTitle : 'Format',
-		panelVoiceLabel : 'Select a paragraph format', // MISSING
+		panelVoiceLabel : 'Seleccioneu un format de paràgraf',
 
 		tag_p : 'Normal',
@@ -568,7 +568,7 @@
 	{
 		label : 'Tipus de lletra',
-		voiceLabel : 'Font', // MISSING
+		voiceLabel : 'Tipus de lletra',
 		panelTitle : 'Tipus de lletra',
-		panelVoiceLabel : 'Select a font' // MISSING
+		panelVoiceLabel : 'Seleccioneu un tipus de lletra'
 	},
 
@@ -576,7 +576,7 @@
 	{
 		label : 'Mida',
-		voiceLabel : 'Font Size', // MISSING
+		voiceLabel : 'Mida de la lletra',
 		panelTitle : 'Mida',
-		panelVoiceLabel : 'Select a font size' // MISSING
+		panelVoiceLabel : 'Seleccioneu una mida de lletra'
 	},
 
@@ -635,39 +635,40 @@
 	scayt :
 	{
-		title : 'Spell Check As You Type', // MISSING
-		enable : 'Enable SCAYT', // MISSING
-		disable : 'Disable SCAYT', // MISSING
-		about : 'About SCAYT', // MISSING
-		toggle : 'Toggle SCAYT', // MISSING
-		options : 'Options', // MISSING
-		langs : 'Languages', // MISSING
-		moreSuggestions : 'More suggestions', // MISSING
-		ignore : 'Ignore', // MISSING
-		ignoreAll : 'Ignore All', // MISSING
-		addWord : 'Add Word', // MISSING
-		emptyDic : 'Dictionary name should not be empty.', // MISSING
-		optionsTab : 'Options', // MISSING
-		languagesTab : 'Languages', // MISSING
-		dictionariesTab : 'Dictionaries', // MISSING
-		aboutTab : 'About' // MISSING
+		title : 'Spell Check As You Type',
+		enable : 'Habilitat l\'SCAYT',
+		disable : 'Deshabilita SCAYT',
+		about : 'Quant a l\'SCAYT',
+		toggle : 'Commuta l\'SCAYT',
+		options : 'Opcions',
+		langs : 'Idiomes',
+		moreSuggestions : 'Més suggerències',
+		ignore : 'Ignora',
+		ignoreAll : 'Ignora\'ls tots',
+		addWord : 'Afegeix una paraula',
+		emptyDic : 'El nom del diccionari no hauria d\'estar buit.',
+		optionsTab : 'Opcions',
+		languagesTab : 'Idiomes',
+		dictionariesTab : 'Diccionaris',
+		aboutTab : 'Quant a'
 	},
 
 	about :
 	{
-		title : 'About CKEditor', // MISSING
-		moreInfo : 'For licensing information please visit our web site:', // MISSING
-		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
-	},
-
-	maximize : 'Maximize', // MISSING
+		title : 'Quan al CKEditor',
+		dlgTitle : 'Quan al CKEditor',
+		moreInfo : 'Per informació sobre llicències visiteu el web:',
+		copy : 'Copyright &copy; $1. All rights reserved.'
+	},
+
+	maximize : 'Maximiza',
 
 	fakeobjects :
 	{
-		anchor : 'Anchor', // MISSING
-		flash : 'Flash Animation', // MISSING
-		div : 'Page Break', // MISSING
-		unknown : 'Unknown Object' // MISSING
-	},
-
-	resize : 'Drag to resize' // MISSING
+		anchor : 'Àncora',
+		flash : 'Animació Flash',
+		div : 'Salt de pàgina',
+		unknown : 'Objecte desconegut'
+	},
+
+	resize : 'Arrossegueu per redimensionar'
 };
Index: /CKEditor/branches/versions/3.0.x/_source/lang/cs.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/cs.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/cs.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/da.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/da.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/da.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/de.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/de.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/de.js	(revision 4056)
@@ -96,5 +96,5 @@
 
 		// Put the voice-only part of the label in the span.
-		unavailable		: '%1<span class="cke_accessibility">, unavailable</span>' // MISSING
+		unavailable		: '%1<span class="cke_accessibility">, nicht verfügbar</span>'
 	},
 
@@ -429,13 +429,13 @@
 		alignTop	: 'Oben',
 		quality		: 'Qualität',
-		qualityBest		 : 'Best', // MISSING
-		qualityHigh		 : 'High', // MISSING
-		qualityAutoHigh	 : 'Auto High', // MISSING
-		qualityMedium	 : 'Medium', // MISSING
-		qualityAutoLow	 : 'Auto Low', // MISSING
-		qualityLow		 : 'Low', // MISSING
-		windowModeWindow	 : 'Window', // MISSING
-		windowModeOpaque	 : 'Opaque', // MISSING
-		windowModeTransparent	 : 'Transparent', // MISSING
+		qualityBest		 : 'Beste',
+		qualityHigh		 : 'Hoch',
+		qualityAutoHigh	 : 'Auto Hoch',
+		qualityMedium	 : 'Medium',
+		qualityAutoLow	 : 'Auto Niedrig',
+		qualityLow		 : 'Niedrig',
+		windowModeWindow	 : 'Fenster',
+		windowModeOpaque	 : 'Deckend',
+		windowModeTransparent	 : 'Transparent',
 		windowMode	: 'Fenster Modus',
 		flashvars	: 'Variablen für Flash',
@@ -591,44 +591,44 @@
 	colors :
 	{
-		'000' : 'Black',
-		'800000' : 'Maroon',
-		'8B4513' : 'Saddle Brown',
-		'2F4F4F' : 'Dark Slate Gray',
-		'008080' : 'Teal',
+		'000' : 'Schwarz',
+		'800000' : 'Kastanienbraun',
+		'8B4513' : 'Braun',
+		'2F4F4F' : 'Dunkles Schiefergrau',
+		'008080' : 'Blaugrün',
 		'000080' : 'Navy',
 		'4B0082' : 'Indigo',
-		'696969' : 'Dim Gray',
-		'B22222' : 'Fire Brick',
-		'A52A2A' : 'Brown',
-		'DAA520' : 'Golden Rod',
-		'006400' : 'Dark Green',
-		'40E0D0' : 'Turquoise',
-		'0000CD' : 'Medium Blue',
-		'800080' : 'Purple',
-		'808080' : 'Gray',
-		'F00' : 'Red',
-		'FF8C00' : 'Dark Orange',
+		'696969' : 'Dunkelgrau',
+		'B22222' : 'Ziegelrot',
+		'A52A2A' : 'Braun',
+		'DAA520' : 'Goldgelb',
+		'006400' : 'Dunkelgrün',
+		'40E0D0' : 'Türkis',
+		'0000CD' : 'Medium Blau',
+		'800080' : 'Lila',
+		'808080' : 'Grau',
+		'F00' : 'Rot',
+		'FF8C00' : 'Dunkelorange',
 		'FFD700' : 'Gold',
-		'008000' : 'Green',
+		'008000' : 'Grün',
 		'0FF' : 'Cyan',
-		'00F' : 'Blue',
-		'EE82EE' : 'Violet',
-		'A9A9A9' : 'Dark Gray',
-		'FFA07A' : 'Light Salmon',
+		'00F' : 'Blau',
+		'EE82EE' : 'Hellviolett',
+		'A9A9A9' : 'Dunkelgrau',
+		'FFA07A' : 'Helles Lachsrosa',
 		'FFA500' : 'Orange',
-		'FFFF00' : 'Yellow',
+		'FFFF00' : 'Gelb',
 		'00FF00' : 'Lime',
-		'AFEEEE' : 'Pale Turquoise',
-		'ADD8E6' : 'Light Blue',
-		'DDA0DD' : 'Plum',
-		'D3D3D3' : 'Light Grey',
-		'FFF0F5' : 'Lavender Blush',
-		'FAEBD7' : 'Antique White',
-		'FFFFE0' : 'Light Yellow',
-		'F0FFF0' : 'Honeydew',
-		'F0FFFF' : 'Azure',
-		'F0F8FF' : 'Alice Blue',
-		'E6E6FA' : 'Lavender',
-		'FFF' : 'White'
+		'AFEEEE' : 'Blaß-Türkis',
+		'ADD8E6' : 'Hellblau',
+		'DDA0DD' : 'Pflaumenblau',
+		'D3D3D3' : 'Hellgrau',
+		'FFF0F5' : 'Lavendel',
+		'FAEBD7' : 'Antik Weiß',
+		'FFFFE0' : 'Hellgelb',
+		'F0FFF0' : 'Honigtau',
+		'F0FFFF' : 'Azurblau',
+		'F0F8FF' : 'Alice Blau',
+		'E6E6FA' : 'Lavendel',
+		'FFF' : 'Weiß'
 	},
 
@@ -646,5 +646,5 @@
 		ignoreAll : 'Alle ignorieren',
 		addWord : 'Wort hinzufügen',
-		emptyDic : 'Wörterbuchname sollt leer sein.',
+		emptyDic : 'Wörterbuchname sollte leer sein.',
 		optionsTab : 'Optionen',
 		languagesTab : 'Sprachen',
@@ -656,4 +656,5 @@
 	{
 		title : 'Über CKEditor',
+		dlgTitle : 'Über CKEditor',
 		moreInfo : 'Für Informationen Liztenzbestimmungen besuchen sie bitte unsere Webseite:',
 		copy : 'Copyright &copy; $1. Alle Rechte vorbehalten.'
@@ -665,9 +666,9 @@
 	{
 		anchor : 'Anker',
-		flash : 'Flash Animation', // MISSING
+		flash : 'Flash Animation',
 		div : 'Seitenumbruch',
-		unknown : 'Unknown Object' // MISSING
-	},
-
-	resize : 'Drag to resize' // MISSING
+		unknown : 'Unbekanntes Objekt'
+	},
+
+	resize : 'Zum Vergrößern ziehen'
 };
Index: /CKEditor/branches/versions/3.0.x/_source/lang/el.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/el.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/el.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/en-au.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/en-au.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/en-au.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor',
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:',
 		copy : 'Copyright &copy; $1. All rights reserved.'
Index: /CKEditor/branches/versions/3.0.x/_source/lang/en-ca.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/en-ca.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/en-ca.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor',
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:',
 		copy : 'Copyright &copy; $1. All rights reserved.'
Index: /CKEditor/branches/versions/3.0.x/_source/lang/en-uk.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/en-uk.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/en-uk.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor',
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:',
 		copy : 'Copyright &copy; $1. All rights reserved.'
Index: /CKEditor/branches/versions/3.0.x/_source/lang/en.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/en.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/en.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor',
+		dlgTitle : 'About CKEditor',
 		moreInfo : 'For licensing information please visit our web site:',
 		copy : 'Copyright &copy; $1. All rights reserved.'
Index: /CKEditor/branches/versions/3.0.x/_source/lang/eo.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/eo.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/eo.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/es.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/es.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/es.js	(revision 4056)
@@ -32,5 +32,5 @@
 	 * of reading non-English words. So be careful while translating it.
 	 */
-	editorTitle		: 'Rich text editor, %1', // MISSING
+	editorTitle		: 'Editor de texto enriquecido, %1',
 
 	// Toolbar buttons without dialogs.
@@ -91,10 +91,10 @@
 		generalTab		: 'General',
 		advancedTab		: 'Avanzado',
-		validateNumberFailed	: 'This value is not a number.', // MISSING
-		confirmNewPage	: 'Any unsaved changes to this content will be lost. Are you sure you want to load new page?', // MISSING
-		confirmCancel	: 'Some of the options have been changed. Are you sure to close the dialog?', // MISSING
+		validateNumberFailed	: 'El valor no es un número.',
+		confirmNewPage	: 'Cualquier cambio que no se haya guardado se perderá. ¿Está seguro de querer crear una nueva página?',
+		confirmCancel	: 'Algunas de las opciones se han cambiado. ¿Está seguro de querer cerrar el diálogo?',
 
 		// Put the voice-only part of the label in the span.
-		unavailable		: '%1<span class="cke_accessibility">, unavailable</span>' // MISSING
+		unavailable		: '%1<span class="cke_accessibility">, no disponible</span>'
 	},
 
@@ -130,5 +130,5 @@
 		targetPopupName	: 'Nombre de Ventana Emergente',
 		popupFeatures	: 'Características de Ventana Emergente',
-		popupResizable	: 'Resizable', // MISSING
+		popupResizable	: 'Redimensionable',
 		popupStatusBar	: 'Barra de Estado',
 		popupLocationBar	: 'Barra de ubicación',
@@ -142,5 +142,5 @@
 		popupHeight		: 'Altura',
 		popupTop		: 'Posición Derecha',
-		id				: 'Id', // MISSING
+		id				: 'Id',
 		langDir			: 'Orientación',
 		langDirNotSet	: '<No definido>',
@@ -188,7 +188,7 @@
 		matchCase			: 'Coincidir may/min',
 		matchWord			: 'Coincidir toda la palabra',
-		matchCyclic			: 'Match cyclic', // MISSING
+		matchCyclic			: 'Buscar en todo el contenido',
 		replaceAll			: 'Reemplazar Todo',
-		replaceSuccessMsg	: '%1 occurrence(s) replaced.' // MISSING
+		replaceSuccessMsg	: 'La expresión buscada ha sido reemplazada %1 veces.'
 	},
 
@@ -221,11 +221,11 @@
 		headersRow		: 'Primera fila',
 		headersBoth		: 'Ambas',
-		invalidRows		: 'Number of rows must be a number greater than 0.', // MISSING
-		invalidCols		: 'Number of columns must be a number greater than 0.', // MISSING
-		invalidBorder	: 'Border size must be a number.', // MISSING
-		invalidWidth	: 'Table width must be a number.', // MISSING
-		invalidHeight	: 'Table height must be a number.', // MISSING
-		invalidCellSpacing	: 'Cell spacing must be a number.', // MISSING
-		invalidCellPadding	: 'Cell padding must be a number.', // MISSING
+		invalidRows		: 'El número de filas debe ser un número mayor que 0.',
+		invalidCols		: 'El número de columnas debe ser un número mayor que 0.',
+		invalidBorder	: 'El tamaño del borde debe ser un número.',
+		invalidWidth	: 'La anchura de tabla debe ser un número.',
+		invalidHeight	: 'La altura de tabla debe ser un número.',
+		invalidCellSpacing	: 'El espaciado entre celdas debe ser un número.',
+		invalidCellPadding	: 'El espaciado interior debe ser un número.',
 
 		cell :
@@ -240,25 +240,25 @@
 			splitHorizontal	: 'Dividir la celda horizontalmente',
 			splitVertical	: 'Dividir la celda verticalmente',
-			title			: 'Cell Properties', // MISSING
-			cellType		: 'Cell Type', // MISSING
-			rowSpan			: 'Rows Span', // MISSING
-			colSpan			: 'Columns Span', // MISSING
-			wordWrap		: 'Word Wrap', // MISSING
-			hAlign			: 'Horizontal Alignment', // MISSING
-			vAlign			: 'Vertical Alignment', // MISSING
-			alignTop		: 'Top', // MISSING
-			alignMiddle		: 'Middle', // MISSING
-			alignBottom		: 'Bottom', // MISSING
-			alignBaseline	: 'Baseline', // MISSING
-			bgColor			: 'Background Color', // MISSING
-			borderColor		: 'Border Color', // MISSING
-			data			: 'Data', // MISSING
-			header			: 'Header', // MISSING
-			yes				: 'Yes', // MISSING
-			no				: 'No', // MISSING
-			invalidWidth	: 'Cell width must be a number.', // MISSING
-			invalidHeight	: 'Cell height must be a number.', // MISSING
-			invalidRowSpan	: 'Rows span must be a whole number.', // MISSING
-			invalidColSpan	: 'Columns span must be a whole number.' // MISSING
+			title			: 'Propiedades de celda',
+			cellType		: 'Tipo de Celda',
+			rowSpan			: 'Expandir filas',
+			colSpan			: 'Expandir columnas',
+			wordWrap		: 'Ajustar al contenido',
+			hAlign			: 'Alineación Horizontal',
+			vAlign			: 'Alineación Vertical',
+			alignTop		: 'Arriba',
+			alignMiddle		: 'Medio',
+			alignBottom		: 'Abajo',
+			alignBaseline	: 'Linea de base',
+			bgColor			: 'Color de fondo',
+			borderColor		: 'Color de borde',
+			data			: 'Datos',
+			header			: 'Encabezado',
+			yes				: 'Sí',
+			no				: 'No',
+			invalidWidth	: 'La anchura de celda debe ser un número.',
+			invalidHeight	: 'La altura de celda debe ser un número.',
+			invalidRowSpan	: 'La expansión de filas debe ser un número entero.',
+			invalidColSpan	: 'La expansión de columnas debe ser un número entero.'
 		},
 
@@ -307,5 +307,5 @@
 		action		: 'Acción',
 		method		: 'Método',
-		encoding	: 'Encoding', // MISSING
+		encoding	: 'Codificación',
 		target		: 'Destino',
 		targetNotSet	: '<No definido>',
@@ -396,6 +396,6 @@
 		alertUrl	: 'Por favor escriba la URL de la imagen',
 		linkTab	: 'Vínculo',
-		button2Img	: 'Do you want to transform the selected image button on a simple image?', // MISSING
-		img2Button	: 'Do you want to transform the selected image on a image button?' // MISSING
+		button2Img	: '¿Desea convertir el botón de imagen en una simple imagen?',
+		img2Button	: '¿Desea convertir la imagen en un botón de imagen?'
 	},
 
@@ -404,18 +404,18 @@
 	{
 		properties		: 'Propiedades de Flash',
-		propertiesTab	: 'Properties', // MISSING
+		propertiesTab	: 'Propiedades',
 		title		: 'Propiedades de Flash',
 		chkPlay		: 'Autoejecución',
 		chkLoop		: 'Repetir',
 		chkMenu		: 'Activar Menú Flash',
-		chkFull		: 'Allow Fullscreen', // MISSING
+		chkFull		: 'Permitir pantalla completa',
  		scale		: 'Escala',
 		scaleAll		: 'Mostrar todo',
 		scaleNoBorder	: 'Sin Borde',
 		scaleFit		: 'Ajustado',
-		access			: 'Script Access', // MISSING
-		accessAlways	: 'Always', // MISSING
-		accessSameDomain	: 'Same domain', // MISSING
-		accessNever	: 'Never', // MISSING
+		access			: 'Acceso de scripts',
+		accessAlways	: 'Siempre',
+		accessSameDomain	: 'Mismo dominio',
+		accessNever	: 'Nunca',
 		align		: 'Alineación',
 		alignLeft	: 'Izquierda',
@@ -428,16 +428,16 @@
 		alignTextTop	: 'Tope del texto',
 		alignTop	: 'Tope',
-		quality		: 'Quality', // MISSING
-		qualityBest		 : 'Best', // MISSING
-		qualityHigh		 : 'High', // MISSING
-		qualityAutoHigh	 : 'Auto High', // MISSING
-		qualityMedium	 : 'Medium', // MISSING
-		qualityAutoLow	 : 'Auto Low', // MISSING
-		qualityLow		 : 'Low', // MISSING
-		windowModeWindow	 : 'Window', // MISSING
-		windowModeOpaque	 : 'Opaque', // MISSING
-		windowModeTransparent	 : 'Transparent', // MISSING
-		windowMode	: 'Window mode', // MISSING
-		flashvars	: 'Variables for Flash', // MISSING
+		quality		: 'Calidad',
+		qualityBest		 : 'La mejor',
+		qualityHigh		 : 'Alta',
+		qualityAutoHigh	 : 'Auto Alta',
+		qualityMedium	 : 'Media',
+		qualityAutoLow	 : 'Auto Baja',
+		qualityLow		 : 'Baja',
+		windowModeWindow	 : 'Ventana',
+		windowModeOpaque	 : 'Opaco',
+		windowModeTransparent	 : 'Transparente',
+		windowMode	: 'WindowMode',
+		flashvars	: 'FlashVars',
 		bgcolor	: 'Color de Fondo',
 		width	: 'Anchura',
@@ -445,9 +445,9 @@
 		hSpace	: 'Esp.Horiz',
 		vSpace	: 'Esp.Vert',
-		validateSrc : 'Por favor tipee el vínculo URL',
-		validateWidth : 'Width must be a number.', // MISSING
-		validateHeight : 'Height must be a number.', // MISSING
-		validateHSpace : 'HSpace must be a number.', // MISSING
-		validateVSpace : 'VSpace must be a number.' // MISSING
+		validateSrc : 'Por favor escriba el vínculo URL',
+		validateWidth : 'Anchura debe ser un número.',
+		validateHeight : 'Altura debe ser un número.',
+		validateHSpace : 'Esp.Horiz debe ser un número.',
+		validateVSpace : 'Esp.Vert debe ser un número.'
 	},
 
@@ -456,7 +456,7 @@
 	{
 		toolbar			: 'Ortografía',
-		title			: 'Spell Check', // MISSING
-		notAvailable	: 'Sorry, but service is unavailable now.', // MISSING
-		errorLoading	: 'Error loading application service host: %s.', // MISSING
+		title			: 'Comprobar ortografía',
+		notAvailable	: 'Lo sentimos pero el servicio no está disponible.',
+		errorLoading	: 'Error cargando la aplicación del servidor: %s.',
 		notInDic		: 'No se encuentra en el Diccionario',
 		changeTo		: 'Cambiar a',
@@ -483,5 +483,5 @@
 	elementsPath :
 	{
-		eleTitle : '%1 element' // MISSING
+		eleTitle : '%1 elemento'
 	},
 
@@ -539,9 +539,9 @@
 	{
 		label : 'Estilo',
-		voiceLabel : 'Styles', // MISSING
-		panelVoiceLabel : 'Select a style', // MISSING
-		panelTitle1 : 'Block Styles', // MISSING
-		panelTitle2 : 'Inline Styles', // MISSING
-		panelTitle3 : 'Object Styles' // MISSING
+		voiceLabel : 'Estilos',
+		panelVoiceLabel : 'Elija un estilo',
+		panelTitle1 : 'Estilos de párrafo',
+		panelTitle2 : 'Estilos de carácter',
+		panelTitle3 : 'Estilos de objeto'
 	},
 
@@ -549,7 +549,7 @@
 	{
 		label : 'Formato',
-		voiceLabel : 'Format', // MISSING
+		voiceLabel : 'Formato',
 		panelTitle : 'Formato',
-		panelVoiceLabel : 'Select a paragraph format', // MISSING
+		panelVoiceLabel : 'Elija un formato de párrafo',
 
 		tag_p : 'Normal',
@@ -568,7 +568,7 @@
 	{
 		label : 'Fuente',
-		voiceLabel : 'Font', // MISSING
+		voiceLabel : 'Fuente',
 		panelTitle : 'Fuente',
-		panelVoiceLabel : 'Select a font' // MISSING
+		panelVoiceLabel : 'Elija una fuente'
 	},
 
@@ -576,7 +576,7 @@
 	{
 		label : 'Tamaño',
-		voiceLabel : 'Font Size', // MISSING
+		voiceLabel : 'Tamaño de fuente',
 		panelTitle : 'Tamaño',
-		panelVoiceLabel : 'Select a font size' // MISSING
+		panelVoiceLabel : 'Elija un tamaño de fuente'
 	},
 
@@ -635,39 +635,40 @@
 	scayt :
 	{
-		title : 'Spell Check As You Type', // MISSING
-		enable : 'Enable SCAYT', // MISSING
-		disable : 'Disable SCAYT', // MISSING
-		about : 'About SCAYT', // MISSING
-		toggle : 'Toggle SCAYT', // MISSING
-		options : 'Options', // MISSING
-		langs : 'Languages', // MISSING
-		moreSuggestions : 'More suggestions', // MISSING
-		ignore : 'Ignore', // MISSING
-		ignoreAll : 'Ignore All', // MISSING
-		addWord : 'Add Word', // MISSING
-		emptyDic : 'Dictionary name should not be empty.', // MISSING
-		optionsTab : 'Options', // MISSING
-		languagesTab : 'Languages', // MISSING
-		dictionariesTab : 'Dictionaries', // MISSING
-		aboutTab : 'About' // MISSING
+		title : 'Comprobar Ortografía Mientras Escribe',
+		enable : 'Activar COME',
+		disable : 'Desactivar COME',
+		about : 'Acerca de COME',
+		toggle : 'Cambiar COME',
+		options : 'Opciones',
+		langs : 'Idiomas',
+		moreSuggestions : 'Más sugerencias',
+		ignore : 'Ignorar',
+		ignoreAll : 'Ignorar Todas',
+		addWord : 'Añadir palabra',
+		emptyDic : 'El nombre del diccionario no puede estar en blanco.',
+		optionsTab : 'Opciones',
+		languagesTab : 'Idiomas',
+		dictionariesTab : 'Diccionarios',
+		aboutTab : 'Acerca de'
 	},
 
 	about :
 	{
-		title : 'About CKEditor', // MISSING
-		moreInfo : 'For licensing information please visit our web site:', // MISSING
-		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
-	},
-
-	maximize : 'Maximize', // MISSING
+		title : 'Acerca de CKEditor',
+		dlgTitle : 'Acerca de CKEditor',
+		moreInfo : 'Para información de licencia, por favor visite nuestro sitio web:',
+		copy : 'Copyright &copy; $1. Todos los derechos reservados.'
+	},
+
+	maximize : 'Maximizar',
 
 	fakeobjects :
 	{
-		anchor : 'Anchor', // MISSING
-		flash : 'Flash Animation', // MISSING
-		div : 'Page Break', // MISSING
-		unknown : 'Unknown Object' // MISSING
-	},
-
-	resize : 'Drag to resize' // MISSING
+		anchor : 'Ancla',
+		flash : 'Animación flash',
+		div : 'Salto de página',
+		unknown : 'Objeto desconocido'
+	},
+
+	resize : 'Arrastre para redimensionar'
 };
Index: /CKEditor/branches/versions/3.0.x/_source/lang/et.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/et.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/et.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/eu.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/eu.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/eu.js	(revision 4056)
@@ -32,5 +32,5 @@
 	 * of reading non-English words. So be careful while translating it.
 	 */
-	editorTitle		: 'Rich text editor, %1', // MISSING
+	editorTitle		: 'Testu aberastuentzako editorea, %1',
 
 	// Toolbar buttons without dialogs.
@@ -91,10 +91,10 @@
 		generalTab		: 'Orokorra',
 		advancedTab		: 'Aurreratua',
-		validateNumberFailed	: 'This value is not a number.', // MISSING
-		confirmNewPage	: 'Any unsaved changes to this content will be lost. Are you sure you want to load new page?', // MISSING
-		confirmCancel	: 'Some of the options have been changed. Are you sure to close the dialog?', // MISSING
+		validateNumberFailed	: 'Balio hau ez da zenbaki bat.',
+		confirmNewPage	: 'Eduki honetan gorde gabe dauden aldaketak galduko dira. Ziur zaude orri berri bat kargatu nahi duzula?',
+		confirmCancel	: 'Aukera batzuk aldatu egin dira. Ziur zaude elkarrizketa-koadroa itxi nahi duzula?',
 
 		// Put the voice-only part of the label in the span.
-		unavailable		: '%1<span class="cke_accessibility">, unavailable</span>' // MISSING
+		unavailable		: '%1<span class="cke_accessibility">, erabilezina</span>'
 	},
 
@@ -130,5 +130,5 @@
 		targetPopupName	: 'Popup Leihoaren Izena',
 		popupFeatures	: 'Popup Leihoaren Ezaugarriak',
-		popupResizable	: 'Resizable', // MISSING
+		popupResizable	: 'Tamaina Aldakorra',
 		popupStatusBar	: 'Egoera Barra',
 		popupLocationBar	: 'Kokaleku Barra',
@@ -142,5 +142,5 @@
 		popupHeight		: 'Altuera',
 		popupTop		: 'Goiko Posizioa',
-		id				: 'Id', // MISSING
+		id				: 'Id',
 		langDir			: 'Hizkuntzaren Norabidea',
 		langDirNotSet	: '<Ezarri gabe>',
@@ -188,7 +188,7 @@
 		matchCase			: 'Maiuskula/minuskula',
 		matchWord			: 'Esaldi osoa bilatu',
-		matchCyclic			: 'Match cyclic', // MISSING
+		matchCyclic			: 'Bilaketa ziklikoa',
 		replaceAll			: 'Ordeztu Guztiak',
-		replaceSuccessMsg	: '%1 occurrence(s) replaced.' // MISSING
+		replaceSuccessMsg	: 'Zenbat aldiz ordeztua: %1'
 	},
 
@@ -216,16 +216,16 @@
 		caption		: 'Epigrafea',
 		summary		: 'Laburpena',
-		headers		: 'Headers', // MISSING
-		headersNone		: 'None', // MISSING
-		headersColumn	: 'First column', // MISSING
-		headersRow		: 'First Row', // MISSING
-		headersBoth		: 'Both', // MISSING
-		invalidRows		: 'Number of rows must be a number greater than 0.', // MISSING
-		invalidCols		: 'Number of columns must be a number greater than 0.', // MISSING
-		invalidBorder	: 'Border size must be a number.', // MISSING
-		invalidWidth	: 'Table width must be a number.', // MISSING
-		invalidHeight	: 'Table height must be a number.', // MISSING
-		invalidCellSpacing	: 'Cell spacing must be a number.', // MISSING
-		invalidCellPadding	: 'Cell padding must be a number.', // MISSING
+		headers		: 'Goiburuak',
+		headersNone		: 'Bat ere ez',
+		headersColumn	: 'Lehen zutabea',
+		headersRow		: 'Lehen lerroa',
+		headersBoth		: 'Biak',
+		invalidRows		: 'Lerro kopurua 0 baino handiagoa den zenbakia izan behar da.',
+		invalidCols		: 'Zutabe kopurua 0 baino handiagoa den zenbakia izan behar da.',
+		invalidBorder	: 'Ertzaren tamaina zenbaki bat izan behar da.',
+		invalidWidth	: 'Taularen zabalera zenbaki bat izan behar da.',
+		invalidHeight	: 'Taularen altuera zenbaki bat izan behar da.',
+		invalidCellSpacing	: 'Gelaxka arteko tartea zenbaki bat izan behar da.',
+		invalidCellPadding	: 'Gelaxken betegarria zenbaki bat izan behar da.',
 
 		cell :
@@ -240,33 +240,33 @@
 			splitHorizontal	: 'Banatu Gelaxkak Horizontalki',
 			splitVertical	: 'Banatu Gelaxkak Bertikalki',
-			title			: 'Cell Properties', // MISSING
-			cellType		: 'Cell Type', // MISSING
-			rowSpan			: 'Rows Span', // MISSING
-			colSpan			: 'Columns Span', // MISSING
-			wordWrap		: 'Word Wrap', // MISSING
-			hAlign			: 'Horizontal Alignment', // MISSING
-			vAlign			: 'Vertical Alignment', // MISSING
-			alignTop		: 'Top', // MISSING
-			alignMiddle		: 'Middle', // MISSING
-			alignBottom		: 'Bottom', // MISSING
-			alignBaseline	: 'Baseline', // MISSING
-			bgColor			: 'Background Color', // MISSING
-			borderColor		: 'Border Color', // MISSING
-			data			: 'Data', // MISSING
-			header			: 'Header', // MISSING
-			yes				: 'Yes', // MISSING
-			no				: 'No', // MISSING
-			invalidWidth	: 'Cell width must be a number.', // MISSING
-			invalidHeight	: 'Cell height must be a number.', // MISSING
-			invalidRowSpan	: 'Rows span must be a whole number.', // MISSING
-			invalidColSpan	: 'Columns span must be a whole number.' // MISSING
+			title			: 'Gelaxken Ezaugarriak',
+			cellType		: 'Gelaxka Mota',
+			rowSpan			: 'Hedatutako Lerroak',
+			colSpan			: 'Hedatutako Zutabeak',
+			wordWrap		: 'Itzulbira',
+			hAlign			: 'Lerrokatze Horizontala',
+			vAlign			: 'Lerrokatze Bertikala',
+			alignTop		: 'Goian',
+			alignMiddle		: 'Erdian',
+			alignBottom		: 'Behean',
+			alignBaseline	: 'Oinarri-lerroan',
+			bgColor			: 'Fondoaren Kolorea',
+			borderColor		: 'Ertzaren Kolorea',
+			data			: 'Data',
+			header			: 'Goiburua',
+			yes				: 'Bai',
+			no				: 'Ez',
+			invalidWidth	: 'Gelaxkaren zabalera zenbaki bat izan behar da.',
+			invalidHeight	: 'Gelaxkaren altuera zenbaki bat izan behar da.',
+			invalidRowSpan	: 'Lerroen hedapena zenbaki osoa izan behar da.',
+			invalidColSpan	: 'Zutabeen hedapena zenbaki osoa izan behar da.'
 		},
 
 		row :
 		{
-			menu			: 'Errenkada',
+			menu			: 'Lerroa',
 			insertBefore	: 'Txertatu Lerroa Aurretik',
 			insertAfter		: 'Txertatu Lerroa Ostean',
-			deleteRow		: 'Ezabatu Errenkadak'
+			deleteRow		: 'Ezabatu Lerroak'
 		},
 
@@ -307,5 +307,5 @@
 		action		: 'Ekintza',
 		method		: 'Metodoa',
-		encoding	: 'Encoding', // MISSING
+		encoding	: 'Kodeketa',
 		target		: 'Target (Helburua)',
 		targetNotSet	: '<Ezarri gabe>',
@@ -396,6 +396,6 @@
 		alertUrl	: 'Mesedez Irudiaren URLa idatzi',
 		linkTab	: 'Esteka',
-		button2Img	: 'Do you want to transform the selected image button on a simple image?', // MISSING
-		img2Button	: 'Do you want to transform the selected image on a image button?' // MISSING
+		button2Img	: 'Aukeratutako irudi botoia, irudi normal batean eraldatu nahi duzu?',
+		img2Button	: 'Aukeratutako irudia, irudi botoi batean eraldatu nahi duzu?'
 	},
 
@@ -404,18 +404,18 @@
 	{
 		properties		: 'Flasharen Ezaugarriak',
-		propertiesTab	: 'Properties', // MISSING
+		propertiesTab	: 'Ezaugarriak',
 		title		: 'Flasharen Ezaugarriak',
 		chkPlay		: 'Automatikoki Erreproduzitu',
 		chkLoop		: 'Begizta',
 		chkMenu		: 'Flasharen Menua Gaitu',
-		chkFull		: 'Allow Fullscreen', // MISSING
+		chkFull		: 'Onartu Pantaila osoa',
  		scale		: 'Eskalatu',
 		scaleAll		: 'Dena erakutsi',
 		scaleNoBorder	: 'Ertzik gabe',
 		scaleFit		: 'Doitu',
-		access			: 'Script Access', // MISSING
-		accessAlways	: 'Always', // MISSING
-		accessSameDomain	: 'Same domain', // MISSING
-		accessNever	: 'Never', // MISSING
+		access			: 'Scriptak baimendu',
+		accessAlways	: 'Beti',
+		accessSameDomain	: 'Domeinu berdinekoak',
+		accessNever	: 'Inoiz ere ez',
 		align		: 'Lerrokatu',
 		alignLeft	: 'Ezkerrera',
@@ -428,16 +428,16 @@
 		alignTextTop	: 'Testua Goian',
 		alignTop	: 'Goian',
-		quality		: 'Quality', // MISSING
-		qualityBest		 : 'Best', // MISSING
-		qualityHigh		 : 'High', // MISSING
-		qualityAutoHigh	 : 'Auto High', // MISSING
-		qualityMedium	 : 'Medium', // MISSING
-		qualityAutoLow	 : 'Auto Low', // MISSING
-		qualityLow		 : 'Low', // MISSING
-		windowModeWindow	 : 'Window', // MISSING
-		windowModeOpaque	 : 'Opaque', // MISSING
-		windowModeTransparent	 : 'Transparent', // MISSING
-		windowMode	: 'Window mode', // MISSING
-		flashvars	: 'Variables for Flash', // MISSING
+		quality		: 'Kalitatea',
+		qualityBest		 : 'Hoberena',
+		qualityHigh		 : 'Altua',
+		qualityAutoHigh	 : 'Auto Altua',
+		qualityMedium	 : 'Ertaina',
+		qualityAutoLow	 : 'Auto Baxua',
+		qualityLow		 : 'Baxua',
+		windowModeWindow	 : 'Leihoa',
+		windowModeOpaque	 : 'Opakoa',
+		windowModeTransparent	 : 'Gardena',
+		windowMode	: 'Leihoaren modua',
+		flashvars	: 'Flash Aldagaiak',
 		bgcolor	: 'Atzeko kolorea',
 		width	: 'Zabalera',
@@ -446,8 +446,8 @@
 		vSpace	: 'VSpace',
 		validateSrc : 'Mesedez URL esteka idatzi',
-		validateWidth : 'Width must be a number.', // MISSING
-		validateHeight : 'Height must be a number.', // MISSING
-		validateHSpace : 'HSpace must be a number.', // MISSING
-		validateVSpace : 'VSpace must be a number.' // MISSING
+		validateWidth : 'Zabalera zenbaki bat izan behar da.',
+		validateHeight : 'Altuera zenbaki bat izan behar da.',
+		validateHSpace : 'HSpace zenbaki bat izan behar da.',
+		validateVSpace : 'VSpace zenbaki bat izan behar da.'
 	},
 
@@ -456,7 +456,7 @@
 	{
 		toolbar			: 'Ortografia',
-		title			: 'Spell Check', // MISSING
-		notAvailable	: 'Sorry, but service is unavailable now.', // MISSING
-		errorLoading	: 'Error loading application service host: %s.', // MISSING
+		title			: 'Ortografia zuzenketa',
+		notAvailable	: 'Barkatu baina momentu honetan zerbitzua ez dago erabilgarri.',
+		errorLoading	: 'Errorea gertatu da aplikazioa zerbitzaritik kargatzean: %s.',
 		notInDic		: 'Ez dago hiztegian',
 		changeTo		: 'Honekin ordezkatu',
@@ -483,5 +483,5 @@
 	elementsPath :
 	{
-		eleTitle : '%1 element' // MISSING
+		eleTitle : '%1 elementua'
 	},
 
@@ -539,9 +539,9 @@
 	{
 		label : 'Estiloa',
-		voiceLabel : 'Styles', // MISSING
-		panelVoiceLabel : 'Select a style', // MISSING
-		panelTitle1 : 'Block Styles', // MISSING
-		panelTitle2 : 'Inline Styles', // MISSING
-		panelTitle3 : 'Object Styles' // MISSING
+		voiceLabel : 'Estiloak',
+		panelVoiceLabel : 'Estilo bat aukeratu',
+		panelTitle1 : 'Bloke Estiloak',
+		panelTitle2 : 'Inline Estiloak',
+		panelTitle3 : 'Objektu Estiloak'
 	},
 
@@ -549,7 +549,7 @@
 	{
 		label : 'Formatua',
-		voiceLabel : 'Format', // MISSING
+		voiceLabel : 'Formatua',
 		panelTitle : 'Formatua',
-		panelVoiceLabel : 'Select a paragraph format', // MISSING
+		panelVoiceLabel : 'Aukeratu paragrafo formatu bat',
 
 		tag_p : 'Arrunta',
@@ -568,7 +568,7 @@
 	{
 		label : 'Letra-tipoa',
-		voiceLabel : 'Font', // MISSING
+		voiceLabel : 'Letra-tipoa',
 		panelTitle : 'Letra-tipoa',
-		panelVoiceLabel : 'Select a font' // MISSING
+		panelVoiceLabel : 'Aukeratu letra-tipoa'
 	},
 
@@ -576,7 +576,7 @@
 	{
 		label : 'Tamaina',
-		voiceLabel : 'Font Size', // MISSING
+		voiceLabel : 'Tamaina',
 		panelTitle : 'Tamaina',
-		panelVoiceLabel : 'Select a font size' // MISSING
+		panelVoiceLabel : 'Aukeratu letraren tamaina'
 	},
 
@@ -635,39 +635,40 @@
 	scayt :
 	{
-		title : 'Spell Check As You Type', // MISSING
-		enable : 'Enable SCAYT', // MISSING
-		disable : 'Disable SCAYT', // MISSING
-		about : 'About SCAYT', // MISSING
-		toggle : 'Toggle SCAYT', // MISSING
-		options : 'Options', // MISSING
-		langs : 'Languages', // MISSING
-		moreSuggestions : 'More suggestions', // MISSING
-		ignore : 'Ignore', // MISSING
-		ignoreAll : 'Ignore All', // MISSING
-		addWord : 'Add Word', // MISSING
-		emptyDic : 'Dictionary name should not be empty.', // MISSING
-		optionsTab : 'Options', // MISSING
-		languagesTab : 'Languages', // MISSING
-		dictionariesTab : 'Dictionaries', // MISSING
-		aboutTab : 'About' // MISSING
+		title : 'Ortografia Zuzenketa Idatzi Ahala (SCAYT)',
+		enable : 'Gaitu SCAYT',
+		disable : 'Desgaitu SCAYT',
+		about : 'SCAYTi buruz',
+		toggle : 'SCAYT aldatu',
+		options : 'Aukerak',
+		langs : 'Hizkuntzak',
+		moreSuggestions : 'Iradokizun gehiago',
+		ignore : 'Baztertu',
+		ignoreAll : 'Denak baztertu',
+		addWord : 'Hitza Gehitu',
+		emptyDic : 'Hiztegiaren izena ezin da hutsik egon.',
+		optionsTab : 'Aukerak',
+		languagesTab : 'Hizkuntzak',
+		dictionariesTab : 'Hiztegiak',
+		aboutTab : 'Honi buruz'
 	},
 
 	about :
 	{
-		title : 'About CKEditor', // MISSING
-		moreInfo : 'For licensing information please visit our web site:', // MISSING
-		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
-	},
-
-	maximize : 'Maximize', // MISSING
+		title : 'CKEditor(r)i buruz',
+		dlgTitle : 'CKEditor(r)i buruz',
+		moreInfo : 'Lizentziari buruzko informazioa gure webgunean:',
+		copy : 'Copyright &copy; $1. Eskubide guztiak erreserbaturik.'
+	},
+
+	maximize : 'Maximizatu',
 
 	fakeobjects :
 	{
-		anchor : 'Anchor', // MISSING
-		flash : 'Flash Animation', // MISSING
-		div : 'Page Break', // MISSING
-		unknown : 'Unknown Object' // MISSING
-	},
-
-	resize : 'Drag to resize' // MISSING
+		anchor : 'Aingura',
+		flash : 'Flash Animazioa',
+		div : 'Orrialde Saltoa',
+		unknown : 'Objektu ezezaguna'
+	},
+
+	resize : 'Arrastatu tamaina aldatzeko'
 };
Index: /CKEditor/branches/versions/3.0.x/_source/lang/fa.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/fa.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/fa.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/fi.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/fi.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/fi.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/fo.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/fo.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/fo.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/fr-ca.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/fr-ca.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/fr-ca.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/fr.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/fr.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/fr.js	(revision 4056)
@@ -32,10 +32,10 @@
 	 * of reading non-English words. So be careful while translating it.
 	 */
-	editorTitle		: 'Rich text editor, %1', // MISSING
+	editorTitle		: 'Editeur de Texte Enrichi, %1',
 
 	// Toolbar buttons without dialogs.
 	source			: 'Source',
 	newPage			: 'Nouvelle page',
-	save			: 'Sauver',
+	save			: 'Enregistrer',
 	preview			: 'Aperçu',
 	cut				: 'Couper',
@@ -83,5 +83,5 @@
 		langDirRtl		: 'Droite à gauche (RTL)',
 		langCode		: 'Code de langue',
-		longDescr		: 'URL de longue description (longdesc => malvoyant)',
+		longDescr		: 'URL de description longue (longdesc => malvoyant)',
 		cssClass		: 'Classe CSS',
 		advisoryTitle	: 'Description (title)',
@@ -89,12 +89,12 @@
 		ok				: 'OK',
 		cancel			: 'Annuler',
-		generalTab		: 'General',
+		generalTab		: 'Général',
 		advancedTab		: 'Avancé',
 		validateNumberFailed	: 'Cette valeur n\'est pas un nombre.',
-		confirmNewPage	: 'Les changements non sauvegardés seront perdus. Etes-vous sur de voiloir charger une nouvelle page ?',
-		confirmCancel	: 'Certaines options ont été modifiées. Etes-vous sur de vouloir fermer ?',
+		confirmNewPage	: 'Les changements non sauvegardés seront perdus. Etes-vous sûr de vouloir charger une nouvelle page?',
+		confirmCancel	: 'Certaines options ont été modifiées. Etes-vous sûr de vouloir fermer?',
 
 		// Put the voice-only part of the label in the span.
-		unavailable		: '%1<span class="cke_accessibility">, unavailable</span>' // MISSING
+		unavailable		: '%1<span class="cke_accessibility">, Indisponible</span>'
 	},
 
@@ -121,11 +121,11 @@
 		target		: 'Cible',
 		targetNotSet	: '<non définie>',
-		targetFrame	: '<frame>',
+		targetFrame	: '<cadre>',
 		targetPopup	: '<fenêtre popup>',
 		targetNew	: 'Nouvelle fenêtre (_blank)',
 		targetTop	: 'Même fenêtre (_top)',
-		targetSelf	: 'Même Frame (_self)',
+		targetSelf	: 'Même Cadre (_self)',
 		targetParent	: 'Fenêtre parente (_parent)',
-		targetFrameName	: 'Nom de la Frame cible',
+		targetFrameName	: 'Nom du Cadre destination',
 		targetPopupName	: 'Nom de la fenêtre popup',
 		popupFeatures	: 'Options de la fenêtre popup',
@@ -136,5 +136,5 @@
 		popupMenuBar	: 'Barre de menu',
 		popupFullScreen	: 'Plein écran (IE)',
-		popupScrollBars	: 'Barres de défillement',
+		popupScrollBars	: 'Barres de défilement',
 		popupDependent	: 'Dépendante (Netscape)',
 		popupWidth		: 'Largeur',
@@ -147,5 +147,5 @@
 		langDirLTR		: 'Gauche à droite',
 		langDirRTL		: 'Droite à gauche',
-		acccessKey		: 'Touche daccessibilité',
+		acccessKey		: 'Touche d\'accessibilité',
 		name			: 'Nom',
 		langCode		: 'Code de langue',
@@ -156,5 +156,5 @@
 		charset			: 'Charset de la cible',
 		styles			: 'Style',
-		selectAnchor	: 'Selectionner l\'ancre',
+		selectAnchor	: 'Sélectionner l\'ancre',
 		anchorName		: 'Par nom d\'ancre',
 		anchorId		: 'Par ID d\'élément',
@@ -183,6 +183,6 @@
 		find				: 'Trouver',
 		replace				: 'Remplacer',
-		findWhat			: 'Expression à trouver : ',
-		replaceWith			: 'Remplacer par : ',
+		findWhat			: 'Expression à trouver: ',
+		replaceWith			: 'Remplacer par: ',
 		notFoundMsg			: 'Le texte spécifié ne peut être trouvé.',
 		matchCase			: 'Respecter la casse',
@@ -203,5 +203,5 @@
 		columns		: 'Colonnes',
 		border		: 'Taille de la bordure',
-		align		: 'Alignment du contenu',
+		align		: 'Alignement du contenu',
 		alignNotSet	: '<non définie>',
 		alignLeft	: 'Gauche',
@@ -233,32 +233,32 @@
 			menu			: 'Cellule',
 			insertBefore	: 'Insérer une cellule avant',
-			insertAfter		: 'Inserer une cellule après',
+			insertAfter		: 'Insérer une cellule après',
 			deleteCell		: 'Supprimer les cellules',
 			merge			: 'Fusionner les cellules',
 			mergeRight		: 'Fusionner à droite',
 			mergeDown		: 'Fusionner en bas',
-			splitHorizontal	: 'Fractionner horizontallement',
-			splitVertical	: 'Fractionner verticallement',
-			title			: 'Cell Properties', // MISSING
-			cellType		: 'Cell Type', // MISSING
-			rowSpan			: 'Rows Span', // MISSING
-			colSpan			: 'Columns Span', // MISSING
+			splitHorizontal	: 'Fractionner horizontalement',
+			splitVertical	: 'Fractionner verticalement',
+			title			: 'Propriétés de Cellule',
+			cellType		: 'Type de Cellule',
+			rowSpan			: 'Fusion de Lignes',
+			colSpan			: 'Fusion de Colonnes',
 			wordWrap		: 'Word Wrap', // MISSING
-			hAlign			: 'Horizontal Alignment', // MISSING
-			vAlign			: 'Vertical Alignment', // MISSING
-			alignTop		: 'Top', // MISSING
-			alignMiddle		: 'Middle', // MISSING
-			alignBottom		: 'Bottom', // MISSING
-			alignBaseline	: 'Baseline', // MISSING
-			bgColor			: 'Background Color', // MISSING
-			borderColor		: 'Border Color', // MISSING
-			data			: 'Data', // MISSING
-			header			: 'Header', // MISSING
-			yes				: 'Yes', // MISSING
-			no				: 'No', // MISSING
-			invalidWidth	: 'Cell width must be a number.', // MISSING
-			invalidHeight	: 'Cell height must be a number.', // MISSING
-			invalidRowSpan	: 'Rows span must be a whole number.', // MISSING
-			invalidColSpan	: 'Columns span must be a whole number.' // MISSING
+			hAlign			: 'Alignement Horizontal',
+			vAlign			: 'Alignement Vertical',
+			alignTop		: 'Haut',
+			alignMiddle		: 'Milieu',
+			alignBottom		: 'Bas',
+			alignBaseline	: 'Bas du texte',
+			bgColor			: 'Couleur d\'arrière-plan',
+			borderColor		: 'Couleur de Bordure',
+			data			: 'Données',
+			header			: 'Entête',
+			yes				: 'Oui',
+			no				: 'Non',
+			invalidWidth	: 'La Largeur de Cellule doit être un nombre.',
+			invalidHeight	: 'La Hauteur de Cellule doit être un nombre.',
+			invalidRowSpan	: 'La fusion de lignes doit être un nombre entier.',
+			invalidColSpan	: 'La fusion de colonnes doit être un nombre entier.'
 		},
 
@@ -267,5 +267,5 @@
 			menu			: 'Ligne',
 			insertBefore	: 'Insérer une ligne avant',
-			insertAfter		: 'Inserer une ligne après',
+			insertAfter		: 'Insérer une ligne après',
 			deleteRow		: 'Supprimer les lignes'
 		},
@@ -274,6 +274,6 @@
 		{
 			menu			: 'Colonnes',
-			insertBefore	: 'Inserer une colonne avant',
-			insertAfter		: 'Inserer une colonne après',
+			insertBefore	: 'Insérer une colonne avant',
+			insertAfter		: 'Insérer une colonne après',
 			deleteColumn	: 'Supprimer les colonnes'
 		}
@@ -297,5 +297,5 @@
 		radioTitle	: 'Propriétés du bouton Radio',
 		value		: 'Valeur',
-		selected	: 'Selectionné'
+		selected	: 'Sélectionné'
 	},
 
@@ -312,5 +312,5 @@
 		targetNew	: 'Nouvelle fenêtre (_blank)',
 		targetTop	: 'Même fenêtre (_top)',
-		targetSelf	: 'Même Frame (_self)',
+		targetSelf	: 'Même Cadre (_self)',
 		targetParent	: 'Fenêtre parente (_parent)'
 	},
@@ -385,6 +385,6 @@
 		align		: 'Alignement',
 		alignLeft	: 'Gauche',
-		alignAbsBottom: 'Bas absolue',
-		alignAbsMiddle: 'Milieu absolue',
+		alignAbsBottom: 'Bas absolu',
+		alignAbsMiddle: 'Milieu absolu',
 		alignBaseline	: 'Bas du texte',
 		alignBottom	: 'Bas',
@@ -396,6 +396,6 @@
 		alertUrl	: 'Veuillez entrer l\'adresse de l\'image',
 		linkTab	: 'Lien',
-		button2Img	: 'Voulez vous transformer le bouton image sélectionné, en simple image ?',
-		img2Button	: 'Voulez vous transformer l\'image en bouton image ?'
+		button2Img	: 'Voulez-vous transformer le bouton image sélectionné en simple image?',
+		img2Button	: 'Voulez-vous transformer l\'image en bouton image?'
 	},
 
@@ -420,6 +420,6 @@
 		align		: 'Alignement',
 		alignLeft	: 'Gauche',
-		alignAbsBottom: 'Bas absolue',
-		alignAbsMiddle: 'Milieu absolue',
+		alignAbsBottom: 'Bas absolu',
+		alignAbsMiddle: 'Milieu absolu',
 		alignBaseline	: 'Bas du texte',
 		alignBottom	: 'Bas',
@@ -427,23 +427,23 @@
 		alignRight	: 'Droite',
 		alignTextTop	: 'Haut du texte',
-		alignTop	: 'Dessus',
+		alignTop	: 'Haut',
 		quality		: 'Qualité',
-		qualityBest		 : 'Best', // MISSING
-		qualityHigh		 : 'High', // MISSING
-		qualityAutoHigh	 : 'Auto High', // MISSING
-		qualityMedium	 : 'Medium', // MISSING
-		qualityAutoLow	 : 'Auto Low', // MISSING
-		qualityLow		 : 'Low', // MISSING
-		windowModeWindow	 : 'Window', // MISSING
-		windowModeOpaque	 : 'Opaque', // MISSING
-		windowModeTransparent	 : 'Transparent', // MISSING
+		qualityBest		 : 'Meilleure',
+		qualityHigh		 : 'Haute',
+		qualityAutoHigh	 : 'Haute Auto',
+		qualityMedium	 : 'Moyenne',
+		qualityAutoLow	 : 'Basse Auto',
+		qualityLow		 : 'Basse',
+		windowModeWindow	 : 'Fenêtre',
+		windowModeOpaque	 : 'Opaque',
+		windowModeTransparent	 : 'Transparent',
 		windowMode	: 'Mode fenêtre',
 		flashvars	: 'Variables du Flash',
-		bgcolor	: 'Couleur d\'arrière plan',
+		bgcolor	: 'Couleur d\'arrière-plan',
 		width	: 'Largeur',
 		height	: 'Hauteur',
 		hSpace	: 'Espacement horizontal',
 		vSpace	: 'Espacement vertical',
-		validateSrc : 'L\'adresse ne dois pas être vide.',
+		validateSrc : 'L\'adresse ne doit pas être vide.',
 		validateWidth : 'La largeur doit être un nombre.',
 		validateHeight : 'La hauteur doit être un nombre.',
@@ -457,7 +457,7 @@
 		toolbar			: 'Vérifier l\'orthographe',
 		title			: 'Vérifier l\'orthographe',
-		notAvailable	: 'Désolé, le service est indisponnible actuellement.',
+		notAvailable	: 'Désolé, le service est indisponible actuellement.',
 		errorLoading	: 'Erreur du chargement du service depuis l\'hôte : %s.',
-		notInDic		: 'N\'existe pas dasn le dictionnaire',
+		notInDic		: 'N\'existe pas dans le dictionnaire',
 		changeTo		: 'Modifier pour',
 		btnIgnore		: 'Ignorer',
@@ -466,5 +466,5 @@
 		btnReplaceAll	: 'Remplacer tout',
 		btnUndo			: 'Annuler',
-		noSuggestions	: '- Aucunes sugestions -',
+		noSuggestions	: '- Aucune suggestion -',
 		progress		: 'Vérification de l\'orthographe en cours...',
 		noMispell		: 'Vérification de l\'orthographe terminée : aucune erreur trouvée',
@@ -472,5 +472,5 @@
 		oneChange		: 'Vérification de l\'orthographe terminée : Un seul mot corrigé',
 		manyChanges		: 'Vérification de l\'orthographe terminée : %1 mots corrigés',
-		ieSpellDownload	: 'La vérification orthographique n\'est pas installée. Voulez-vous la télécharger maintenant ?'
+		ieSpellDownload	: 'La vérification d\'orthographe n\'est pas installée. Voulez-vous la télécharger maintenant?'
 	},
 
@@ -504,7 +504,7 @@
 	{
 		title		: 'Coller',
-		cutError	: 'Les paramètres de sécurité de votre navigateur, ne permettent pas à l\'éditeur d\'exécuter automatiquement des opérations de coupage. Veuillez utiliser le raccourci clavier (Ctrl+X).',
-		copyError	: 'Les paramètres de sécurité de votre navigateur, ne permettent pas à l\'éditeur d\'exécuter automatiquement des opérations de copie. Veuillez utiliser le raccourci clavier (Ctrl+C).',
-		pasteMsg	: 'Veuillez coller le texte dans la zone suivante, en utilisant le raccourci clavier (<strong>Ctrl+V</strong>) et cliquez sur OK',
+		cutError	: 'Les paramètres de sécurité de votre navigateur ne permettent pas à l\'éditeur d\'exécuter automatiquement l\'opération "couper". Veuillez utiliser le raccourci clavier (Ctrl+X).',
+		copyError	: 'Les paramètres de sécurité de votre navigateur ne permettent pas à l\'éditeur d\'exécuter automatiquement des opérations de copie. Veuillez utiliser le raccourci clavier (Ctrl+C).',
+		pasteMsg	: 'Veuillez coller le texte dans la zone suivante en utilisant le raccourci clavier (<strong>Ctrl+V</strong>) et cliquez sur OK',
 		securityMsg	: 'A cause des paramètres de sécurité de votre navigateur, l\'éditeur n\'est pas en mesure d\'accéder directement à vos données contenues dans le presse-papier. Vous devriez réessayer de coller les données dans la fenêtre.'
 	},
@@ -516,5 +516,5 @@
 		advice : 'Veuillez coller le texte dans la zone suivante, en utilisant le raccourci clavier (<strong>Ctrl+V</strong>) et cliquez sur OK.',
 		ignoreFontFace : 'Supprimer la définition des polices',
-		removeStyle : 'Supprimer la défiition des styles'
+		removeStyle : 'Supprimer la définition des styles'
 	},
 
@@ -539,6 +539,6 @@
 	{
 		label : 'Styles',
-		voiceLabel : 'Styles', // MISSING
-		panelVoiceLabel : 'Select a style', // MISSING
+		voiceLabel : 'Styles',
+		panelVoiceLabel : 'Choisissez un style',
 		panelTitle1 : 'Styles de blocs',
 		panelTitle2 : 'Styles en ligne',
@@ -549,10 +549,10 @@
 	{
 		label : 'Format',
-		voiceLabel : 'Format', // MISSING
-		panelTitle : 'Format de paragraphes',
-		panelVoiceLabel : 'Select a paragraph format', // MISSING
+		voiceLabel : 'Format',
+		panelTitle : 'Format de paragraphe',
+		panelVoiceLabel : 'Choisissez un format de paragraphe',
 
 		tag_p : 'Normal',
-		tag_pre : 'Formatté',
+		tag_pre : 'Formaté',
 		tag_address : 'Adresse',
 		tag_h1 : 'Titre 1',
@@ -568,7 +568,7 @@
 	{
 		label : 'Police',
-		voiceLabel : 'Font', // MISSING
+		voiceLabel : 'Police',
 		panelTitle : 'Style de police',
-		panelVoiceLabel : 'Select a font' // MISSING
+		panelVoiceLabel : 'Choisissez une police'
 	},
 
@@ -576,7 +576,7 @@
 	{
 		label : 'Taille',
-		voiceLabel : 'Font Size', // MISSING
+		voiceLabel : 'Taille de police',
 		panelTitle : 'Taille de police',
-		panelVoiceLabel : 'Select a font size' // MISSING
+		panelVoiceLabel : 'Choisissez une taille de police'
 	},
 
@@ -635,39 +635,40 @@
 	scayt :
 	{
-		title : 'Spell Check As You Type', // MISSING
-		enable : 'Enable SCAYT', // MISSING
-		disable : 'Disable SCAYT', // MISSING
-		about : 'About SCAYT', // MISSING
-		toggle : 'Toggle SCAYT', // MISSING
-		options : 'Options', // MISSING
-		langs : 'Languages', // MISSING
-		moreSuggestions : 'More suggestions', // MISSING
-		ignore : 'Ignore', // MISSING
-		ignoreAll : 'Ignore All', // MISSING
-		addWord : 'Add Word', // MISSING
-		emptyDic : 'Dictionary name should not be empty.', // MISSING
-		optionsTab : 'Options', // MISSING
-		languagesTab : 'Languages', // MISSING
-		dictionariesTab : 'Dictionaries', // MISSING
-		aboutTab : 'About' // MISSING
+		title : 'Vérification d\'Orthographe en Cours de Frappe (SCAYT: Spell Check As You Type)',
+		enable : 'Activer SCAYT',
+		disable : 'Désactiver SCAYT',
+		about : 'A propos de SCAYT',
+		toggle : 'Activer/Désactiver SCAYT',
+		options : 'Options',
+		langs : 'Langues',
+		moreSuggestions : 'Plus de suggestions',
+		ignore : 'Ignorer',
+		ignoreAll : 'Ignorer Tout',
+		addWord : 'Ajouter le mot',
+		emptyDic : 'Le nom du dictionnaire ne devrait pas être vide.',
+		optionsTab : 'Options',
+		languagesTab : 'Langues',
+		dictionariesTab : 'Dictionnaires',
+		aboutTab : 'A propos de'
 	},
 
 	about :
 	{
-		title : 'About CKEditor', // MISSING
-		moreInfo : 'For licensing information please visit our web site:', // MISSING
-		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
-	},
-
-	maximize : 'Maximize', // MISSING
+		title : 'A propos de CKEditor',
+		dlgTitle : 'A propos de CKEditor',
+		moreInfo : 'Pour les informations de licence, veuillez visiter notre site web:',
+		copy : 'Copyright &copy; $1. Tous droits réservés.'
+	},
+
+	maximize : 'Agrandir',
 
 	fakeobjects :
 	{
-		anchor : 'Anchor', // MISSING
-		flash : 'Flash Animation', // MISSING
-		div : 'Page Break', // MISSING
-		unknown : 'Unknown Object' // MISSING
-	},
-
-	resize : 'Drag to resize' // MISSING
+		anchor : 'Ancre',
+		flash : 'Animation Flash',
+		div : 'Saut de Page',
+		unknown : 'Objet Inconnu'
+	},
+
+	resize : 'Glisser pour modifier la taille'
 };
Index: /CKEditor/branches/versions/3.0.x/_source/lang/gl.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/gl.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/gl.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/gu.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/gu.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/gu.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/he.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/he.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/he.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/hi.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/hi.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/hi.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/hr.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/hr.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/hr.js	(revision 4056)
@@ -32,5 +32,5 @@
 	 * of reading non-English words. So be careful while translating it.
 	 */
-	editorTitle		: 'Rich text editor, %1', // MISSING
+	editorTitle		: 'Text editor, %1',
 
 	// Toolbar buttons without dialogs.
@@ -91,10 +91,10 @@
 		generalTab		: 'Općenito',
 		advancedTab		: 'Napredno',
-		validateNumberFailed	: 'This value is not a number.', // MISSING
-		confirmNewPage	: 'Any unsaved changes to this content will be lost. Are you sure you want to load new page?', // MISSING
-		confirmCancel	: 'Some of the options have been changed. Are you sure to close the dialog?', // MISSING
+		validateNumberFailed	: 'Ova vrijednost nije broj.',
+		confirmNewPage	: 'Sve napravljene promjene će biti izgubljene ukoliko ih niste snimili. Sigurno želite učitati novu stranicu?',
+		confirmCancel	: 'Neke od opcija su promjenjene. Sigurno želite zatvoriti ovaj prozor?',
 
 		// Put the voice-only part of the label in the span.
-		unavailable		: '%1<span class="cke_accessibility">, unavailable</span>' // MISSING
+		unavailable		: '%1<span class="cke_accessibility">, nedostupno</span>'
 	},
 
@@ -130,5 +130,5 @@
 		targetPopupName	: 'Naziv popup prozora',
 		popupFeatures	: 'Mogućnosti popup prozora',
-		popupResizable	: 'Resizable', // MISSING
+		popupResizable	: 'Promjenjiva veličina',
 		popupStatusBar	: 'Statusna traka',
 		popupLocationBar	: 'Traka za lokaciju',
@@ -142,5 +142,5 @@
 		popupHeight		: 'Visina',
 		popupTop		: 'Gornja pozicija',
-		id				: 'Id', // MISSING
+		id				: 'Id',
 		langDir			: 'Smjer jezika',
 		langDirNotSet	: '<nije postavljeno>',
@@ -188,7 +188,7 @@
 		matchCase			: 'Usporedi mala/velika slova',
 		matchWord			: 'Usporedi cijele riječi',
-		matchCyclic			: 'Match cyclic', // MISSING
+		matchCyclic			: 'Usporedi kružno',
 		replaceAll			: 'Zamijeni sve',
-		replaceSuccessMsg	: '%1 occurrence(s) replaced.' // MISSING
+		replaceSuccessMsg	: 'Zamijenjeno %1 pojmova.'
 	},
 
@@ -216,16 +216,16 @@
 		caption		: 'Naslov',
 		summary		: 'Sažetak',
-		headers		: 'Headers', // MISSING
-		headersNone		: 'None', // MISSING
-		headersColumn	: 'First column', // MISSING
-		headersRow		: 'First Row', // MISSING
-		headersBoth		: 'Both', // MISSING
-		invalidRows		: 'Number of rows must be a number greater than 0.', // MISSING
-		invalidCols		: 'Number of columns must be a number greater than 0.', // MISSING
-		invalidBorder	: 'Border size must be a number.', // MISSING
-		invalidWidth	: 'Table width must be a number.', // MISSING
-		invalidHeight	: 'Table height must be a number.', // MISSING
-		invalidCellSpacing	: 'Cell spacing must be a number.', // MISSING
-		invalidCellPadding	: 'Cell padding must be a number.', // MISSING
+		headers		: 'Zaglavlje',
+		headersNone		: 'Ništa',
+		headersColumn	: 'Prva kolona',
+		headersRow		: 'Prvi red',
+		headersBoth		: 'Oba',
+		invalidRows		: 'Broj redova mora biti broj veći od 0.',
+		invalidCols		: 'Broj kolona mora biti broj veći od 0.',
+		invalidBorder	: 'Debljina ruba mora biti broj.',
+		invalidWidth	: 'Širina tablice mora biti broj.',
+		invalidHeight	: 'Visina tablice mora biti broj.',
+		invalidCellSpacing	: 'Prostornost ćelija mora biti broj.',
+		invalidCellPadding	: 'Razmak ćelija mora biti broj.',
 
 		cell :
@@ -240,25 +240,25 @@
 			splitHorizontal	: 'Podijeli ćeliju vodoravno',
 			splitVertical	: 'Podijeli ćeliju okomito',
-			title			: 'Cell Properties', // MISSING
-			cellType		: 'Cell Type', // MISSING
-			rowSpan			: 'Rows Span', // MISSING
-			colSpan			: 'Columns Span', // MISSING
-			wordWrap		: 'Word Wrap', // MISSING
-			hAlign			: 'Horizontal Alignment', // MISSING
-			vAlign			: 'Vertical Alignment', // MISSING
-			alignTop		: 'Top', // MISSING
-			alignMiddle		: 'Middle', // MISSING
-			alignBottom		: 'Bottom', // MISSING
-			alignBaseline	: 'Baseline', // MISSING
-			bgColor			: 'Background Color', // MISSING
-			borderColor		: 'Border Color', // MISSING
-			data			: 'Data', // MISSING
-			header			: 'Header', // MISSING
-			yes				: 'Yes', // MISSING
-			no				: 'No', // MISSING
-			invalidWidth	: 'Cell width must be a number.', // MISSING
-			invalidHeight	: 'Cell height must be a number.', // MISSING
-			invalidRowSpan	: 'Rows span must be a whole number.', // MISSING
-			invalidColSpan	: 'Columns span must be a whole number.' // MISSING
+			title			: 'Svojstva ćelije',
+			cellType		: 'Vrsta ćelije',
+			rowSpan			: 'Rows Span',
+			colSpan			: 'Columns Span',
+			wordWrap		: 'Prelazak u novi red',
+			hAlign			: 'Vodoravno poravnanje',
+			vAlign			: 'Okomito poravnanje',
+			alignTop		: 'Vrh',
+			alignMiddle		: 'Sredina',
+			alignBottom		: 'Dolje',
+			alignBaseline	: 'Osnovna linija',
+			bgColor			: 'Boja pozadine',
+			borderColor		: 'Boja ruba',
+			data			: 'Podatak',
+			header			: 'Zaglavlje',
+			yes				: 'Da',
+			no				: 'ne',
+			invalidWidth	: 'Širina ćelije mora biti broj.',
+			invalidHeight	: 'Visina ćelije mora biti broj.',
+			invalidRowSpan	: 'Rows span mora biti cijeli broj.',
+			invalidColSpan	: 'Columns span mora biti cijeli broj.'
 		},
 
@@ -307,5 +307,5 @@
 		action		: 'Akcija',
 		method		: 'Metoda',
-		encoding	: 'Encoding', // MISSING
+		encoding	: 'Encoding',
 		target		: 'Meta',
 		targetNotSet	: '<nije postavljeno>',
@@ -396,6 +396,6 @@
 		alertUrl	: 'Unesite URL slike',
 		linkTab	: 'Link',
-		button2Img	: 'Do you want to transform the selected image button on a simple image?', // MISSING
-		img2Button	: 'Do you want to transform the selected image on a image button?' // MISSING
+		button2Img	: 'Želite li promijeniti odabrani gumb u jednostavnu sliku?',
+		img2Button	: 'Želite li promijeniti odabranu sliku u gumb?'
 	},
 
@@ -404,18 +404,18 @@
 	{
 		properties		: 'Flash svojstva',
-		propertiesTab	: 'Properties', // MISSING
+		propertiesTab	: 'Svojstva',
 		title		: 'Flash svojstva',
 		chkPlay		: 'Auto Play',
 		chkLoop		: 'Ponavljaj',
 		chkMenu		: 'Omogući Flash izbornik',
-		chkFull		: 'Allow Fullscreen', // MISSING
+		chkFull		: 'Omogući Fullscreen',
  		scale		: 'Omjer',
 		scaleAll		: 'Prikaži sve',
 		scaleNoBorder	: 'Bez okvira',
 		scaleFit		: 'Točna veličina',
-		access			: 'Script Access', // MISSING
-		accessAlways	: 'Always', // MISSING
-		accessSameDomain	: 'Same domain', // MISSING
-		accessNever	: 'Never', // MISSING
+		access			: 'Script Access',
+		accessAlways	: 'Uvijek',
+		accessSameDomain	: 'Ista domena',
+		accessNever	: 'Nikad',
 		align		: 'Poravnaj',
 		alignLeft	: 'Lijevo',
@@ -428,16 +428,16 @@
 		alignTextTop	: 'Vrh teksta',
 		alignTop	: 'Vrh',
-		quality		: 'Quality', // MISSING
-		qualityBest		 : 'Best', // MISSING
-		qualityHigh		 : 'High', // MISSING
-		qualityAutoHigh	 : 'Auto High', // MISSING
-		qualityMedium	 : 'Medium', // MISSING
-		qualityAutoLow	 : 'Auto Low', // MISSING
-		qualityLow		 : 'Low', // MISSING
-		windowModeWindow	 : 'Window', // MISSING
-		windowModeOpaque	 : 'Opaque', // MISSING
-		windowModeTransparent	 : 'Transparent', // MISSING
-		windowMode	: 'Window mode', // MISSING
-		flashvars	: 'Variables for Flash', // MISSING
+		quality		: 'Kvaliteta',
+		qualityBest		 : 'Best',
+		qualityHigh		 : 'High',
+		qualityAutoHigh	 : 'Auto High',
+		qualityMedium	 : 'Medium',
+		qualityAutoLow	 : 'Auto Low',
+		qualityLow		 : 'Low',
+		windowModeWindow	 : 'Window',
+		windowModeOpaque	 : 'Opaque',
+		windowModeTransparent	 : 'Transparent',
+		windowMode	: 'Vrsta prozora',
+		flashvars	: 'Varijable za Flash',
 		bgcolor	: 'Boja pozadine',
 		width	: 'Širina',
@@ -446,8 +446,8 @@
 		vSpace	: 'VSpace',
 		validateSrc : 'Molimo upišite URL link',
-		validateWidth : 'Width must be a number.', // MISSING
-		validateHeight : 'Height must be a number.', // MISSING
-		validateHSpace : 'HSpace must be a number.', // MISSING
-		validateVSpace : 'VSpace must be a number.' // MISSING
+		validateWidth : 'Širina mora biti broj.',
+		validateHeight : 'Visina mora biti broj.',
+		validateHSpace : 'HSpace mora biti broj.',
+		validateVSpace : 'VSpace mora biti broj.'
 	},
 
@@ -456,7 +456,7 @@
 	{
 		toolbar			: 'Provjeri pravopis',
-		title			: 'Spell Check', // MISSING
-		notAvailable	: 'Sorry, but service is unavailable now.', // MISSING
-		errorLoading	: 'Error loading application service host: %s.', // MISSING
+		title			: 'Provjera pravopisa',
+		notAvailable	: 'Žao nam je, ali usluga trenutno nije dostupna.',
+		errorLoading	: 'Greška učitavanja aplikacije: %s.',
 		notInDic		: 'Nije u rječniku',
 		changeTo		: 'Promijeni u',
@@ -483,5 +483,5 @@
 	elementsPath :
 	{
-		eleTitle : '%1 element' // MISSING
+		eleTitle : '%1 element'
 	},
 
@@ -539,9 +539,9 @@
 	{
 		label : 'Stil',
-		voiceLabel : 'Styles', // MISSING
-		panelVoiceLabel : 'Select a style', // MISSING
-		panelTitle1 : 'Block Styles', // MISSING
-		panelTitle2 : 'Inline Styles', // MISSING
-		panelTitle3 : 'Object Styles' // MISSING
+		voiceLabel : 'Stilovi',
+		panelVoiceLabel : 'Odaberite stil',
+		panelTitle1 : 'Block stilovi',
+		panelTitle2 : 'Inline stilovi',
+		panelTitle3 : 'Object stilovi'
 	},
 
@@ -549,10 +549,10 @@
 	{
 		label : 'Format',
-		voiceLabel : 'Format', // MISSING
+		voiceLabel : 'Format',
 		panelTitle : 'Format',
-		panelVoiceLabel : 'Select a paragraph format', // MISSING
+		panelVoiceLabel : 'Odaberite format paragrafa',
 
 		tag_p : 'Normal',
-		tag_pre : 'Formatted',
+		tag_pre : 'Formatirano',
 		tag_address : 'Address',
 		tag_h1 : 'Heading 1',
@@ -568,7 +568,7 @@
 	{
 		label : 'Font',
-		voiceLabel : 'Font', // MISSING
+		voiceLabel : 'Font',
 		panelTitle : 'Font',
-		panelVoiceLabel : 'Select a font' // MISSING
+		panelVoiceLabel : 'Odaberite font'
 	},
 
@@ -576,7 +576,7 @@
 	{
 		label : 'Veličina',
-		voiceLabel : 'Font Size', // MISSING
+		voiceLabel : 'Veličina slova',
 		panelTitle : 'Veličina',
-		panelVoiceLabel : 'Select a font size' // MISSING
+		panelVoiceLabel : 'Odaberite veličinu slova'
 	},
 
@@ -635,39 +635,40 @@
 	scayt :
 	{
-		title : 'Spell Check As You Type', // MISSING
-		enable : 'Enable SCAYT', // MISSING
-		disable : 'Disable SCAYT', // MISSING
-		about : 'About SCAYT', // MISSING
-		toggle : 'Toggle SCAYT', // MISSING
-		options : 'Options', // MISSING
-		langs : 'Languages', // MISSING
-		moreSuggestions : 'More suggestions', // MISSING
-		ignore : 'Ignore', // MISSING
-		ignoreAll : 'Ignore All', // MISSING
-		addWord : 'Add Word', // MISSING
-		emptyDic : 'Dictionary name should not be empty.', // MISSING
-		optionsTab : 'Options', // MISSING
-		languagesTab : 'Languages', // MISSING
-		dictionariesTab : 'Dictionaries', // MISSING
-		aboutTab : 'About' // MISSING
+		title : 'Provjeri pravopis tijekom tipkanja (SCAYT)',
+		enable : 'Omogući SCAYT',
+		disable : 'Onemogući SCAYT',
+		about : 'O SCAYT',
+		toggle : 'Omoguću/Onemogući SCAYT',
+		options : 'Opcije',
+		langs : 'Jezici',
+		moreSuggestions : 'Više prijedloga',
+		ignore : 'Zanemari',
+		ignoreAll : 'Zanemari sve',
+		addWord : 'Dodaj riječ',
+		emptyDic : 'Naziv rječnika ne smije biti prazno.',
+		optionsTab : 'Opcije',
+		languagesTab : 'Jezici',
+		dictionariesTab : 'Rječnici',
+		aboutTab : 'O SCAYT'
 	},
 
 	about :
 	{
-		title : 'About CKEditor', // MISSING
-		moreInfo : 'For licensing information please visit our web site:', // MISSING
-		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
-	},
-
-	maximize : 'Maximize', // MISSING
+		title : 'O CKEditoru',
+		dlgTitle : 'O CKEditoru',
+		moreInfo : 'Za informacije o licencama posjetite našu web stranicu:',
+		copy : 'Copyright &copy; $1. All rights reserved.'
+	},
+
+	maximize : 'Povećaj',
 
 	fakeobjects :
 	{
-		anchor : 'Anchor', // MISSING
-		flash : 'Flash Animation', // MISSING
-		div : 'Page Break', // MISSING
-		unknown : 'Unknown Object' // MISSING
-	},
-
-	resize : 'Drag to resize' // MISSING
+		anchor : 'Sidro',
+		flash : 'Flash animacija',
+		div : 'Prijelom stranice',
+		unknown : 'Nepoznati objekt'
+	},
+
+	resize : 'Povuci za promjenu veličine'
 };
Index: /CKEditor/branches/versions/3.0.x/_source/lang/hu.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/hu.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/hu.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/is.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/is.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/is.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/it.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/it.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/it.js	(revision 4056)
@@ -89,12 +89,12 @@
 		ok				: 'OK',
 		cancel			: 'Annulla',
-		generalTab		: 'General', // MISSING
+		generalTab		: 'Generale',
 		advancedTab		: 'Avanzate',
-		validateNumberFailed	: 'This value is not a number.', // MISSING
-		confirmNewPage	: 'Any unsaved changes to this content will be lost. Are you sure you want to load new page?', // MISSING
-		confirmCancel	: 'Some of the options have been changed. Are you sure to close the dialog?', // MISSING
+		validateNumberFailed	: 'Il valore inserito non è un numero.',
+		confirmNewPage	: 'Ogni modifica non salvata sarà persa. Sei sicuro di voler caricare una nuova pagina?',
+		confirmCancel	: 'Alcune delle opzioni sono state cambiate. Sei sicuro di voler chiudere la finestra di dialogo?',
 
 		// Put the voice-only part of the label in the span.
-		unavailable		: '%1<span class="cke_accessibility">, unavailable</span>' // MISSING
+		unavailable		: '%1<span class="cke_accessibility">, non disponibile</span>'
 	},
 
@@ -130,5 +130,5 @@
 		targetPopupName	: 'Nome finestra popup',
 		popupFeatures	: 'Caratteristiche finestra popup',
-		popupResizable	: 'Resizable', // MISSING
+		popupResizable	: 'Ridimensionabile',
 		popupStatusBar	: 'Barra di stato',
 		popupLocationBar	: 'Barra degli indirizzi',
@@ -142,5 +142,5 @@
 		popupHeight		: 'Altezza',
 		popupTop		: 'Posizione dall\'alto',
-		id				: 'Id', // MISSING
+		id				: 'Id',
 		langDir			: 'Direzione scrittura',
 		langDirNotSet	: '<non impostato>',
@@ -188,7 +188,7 @@
 		matchCase			: 'Maiuscole/minuscole',
 		matchWord			: 'Solo parole intere',
-		matchCyclic			: 'Match cyclic', // MISSING
+		matchCyclic			: 'Ricerca ciclica',
 		replaceAll			: 'Sostituisci tutto',
-		replaceSuccessMsg	: '%1 occurrence(s) replaced.' // MISSING
+		replaceSuccessMsg	: '%1 occorrenza(e) sostituite.'
 	},
 
@@ -216,16 +216,16 @@
 		caption		: 'Intestazione',
 		summary		: 'Indice',
-		headers		: 'Headers', // MISSING
-		headersNone		: 'None', // MISSING
-		headersColumn	: 'First column', // MISSING
-		headersRow		: 'First Row', // MISSING
-		headersBoth		: 'Both', // MISSING
-		invalidRows		: 'Number of rows must be a number greater than 0.', // MISSING
-		invalidCols		: 'Number of columns must be a number greater than 0.', // MISSING
-		invalidBorder	: 'Border size must be a number.', // MISSING
-		invalidWidth	: 'Table width must be a number.', // MISSING
-		invalidHeight	: 'Table height must be a number.', // MISSING
-		invalidCellSpacing	: 'Cell spacing must be a number.', // MISSING
-		invalidCellPadding	: 'Cell padding must be a number.', // MISSING
+		headers		: 'Intestazione',
+		headersNone		: 'Nessuna',
+		headersColumn	: 'Prima Colonna',
+		headersRow		: 'Prima Riga',
+		headersBoth		: 'Entrambe',
+		invalidRows		: 'Il numero di righe dev\'essere un numero maggiore di 0.',
+		invalidCols		: 'Il numero di colonne dev\'essere un numero maggiore di 0.',
+		invalidBorder	: 'La dimensione del bordo dev\'essere un numero.',
+		invalidWidth	: 'La larghezza della tabella dev\'essere un numero.',
+		invalidHeight	: 'L\'altezza della tabella dev\'essere un numero.',
+		invalidCellSpacing	: 'La spaziatura tra le celle dev\'essere un numero.',
+		invalidCellPadding	: 'Il pagging delle celle dev\'essere un numero',
 
 		cell :
@@ -240,25 +240,25 @@
 			splitHorizontal	: 'Dividi Cella Orizzontalmente',
 			splitVertical	: 'Dividi Cella Verticalmente',
-			title			: 'Cell Properties', // MISSING
-			cellType		: 'Cell Type', // MISSING
-			rowSpan			: 'Rows Span', // MISSING
-			colSpan			: 'Columns Span', // MISSING
-			wordWrap		: 'Word Wrap', // MISSING
-			hAlign			: 'Horizontal Alignment', // MISSING
-			vAlign			: 'Vertical Alignment', // MISSING
-			alignTop		: 'Top', // MISSING
-			alignMiddle		: 'Middle', // MISSING
-			alignBottom		: 'Bottom', // MISSING
-			alignBaseline	: 'Baseline', // MISSING
-			bgColor			: 'Background Color', // MISSING
-			borderColor		: 'Border Color', // MISSING
-			data			: 'Data', // MISSING
-			header			: 'Header', // MISSING
-			yes				: 'Yes', // MISSING
-			no				: 'No', // MISSING
-			invalidWidth	: 'Cell width must be a number.', // MISSING
-			invalidHeight	: 'Cell height must be a number.', // MISSING
-			invalidRowSpan	: 'Rows span must be a whole number.', // MISSING
-			invalidColSpan	: 'Columns span must be a whole number.' // MISSING
+			title			: 'Proprietà della cella',
+			cellType		: 'Tipo di cella',
+			rowSpan			: 'Su più righe',
+			colSpan			: 'Su più colonne',
+			wordWrap		: 'Ritorno a capo',
+			hAlign			: 'Allineamento orizzontale',
+			vAlign			: 'Allineamento verticale',
+			alignTop		: 'In Alto',
+			alignMiddle		: 'Al Centro',
+			alignBottom		: 'In Basso',
+			alignBaseline	: 'Linea Base',
+			bgColor			: 'Colore di Sfondo',
+			borderColor		: 'Colore del Bordo',
+			data			: 'Dati',
+			header			: 'Intestazione',
+			yes				: 'Si',
+			no				: 'No',
+			invalidWidth	: 'La larghezza della cella dev\'essere un numero.',
+			invalidHeight	: 'L\'altezza della cella dev\'essere un numero.',
+			invalidRowSpan	: 'Il numero di righe dev\'essere un numero intero.',
+			invalidColSpan	: 'Il numero di colonne dev\'essere un numero intero.'
 		},
 
@@ -307,5 +307,5 @@
 		action		: 'Azione',
 		method		: 'Metodo',
-		encoding	: 'Encoding', // MISSING
+		encoding	: 'Codifica',
 		target		: 'Destinazione',
 		targetNotSet	: '<non impostato>',
@@ -396,6 +396,6 @@
 		alertUrl	: 'Devi inserire l\'URL per l\'immagine',
 		linkTab	: 'Collegamento',
-		button2Img	: 'Do you want to transform the selected image button on a simple image?', // MISSING
-		img2Button	: 'Do you want to transform the selected image on a image button?' // MISSING
+		button2Img	: 'Vuoi trasformare il bottone immagine selezionato in un\'immagine semplice?',
+		img2Button	: 'Vuoi trasferomare l\'immagine selezionata in un bottone immagine?'
 	},
 
@@ -404,18 +404,18 @@
 	{
 		properties		: 'Proprietà Oggetto Flash',
-		propertiesTab	: 'Properties', // MISSING
+		propertiesTab	: 'Proprietà',
 		title		: 'Proprietà Oggetto Flash',
 		chkPlay		: 'Avvio Automatico',
-		chkLoop		: 'Cicla',
+		chkLoop		: 'Riavvio automatico',
 		chkMenu		: 'Abilita Menu di Flash',
-		chkFull		: 'Allow Fullscreen', // MISSING
+		chkFull		: 'Permetti la modalità tutto schermo',
  		scale		: 'Ridimensiona',
 		scaleAll		: 'Mostra Tutto',
 		scaleNoBorder	: 'Senza Bordo',
 		scaleFit		: 'Dimensione Esatta',
-		access			: 'Script Access', // MISSING
-		accessAlways	: 'Always', // MISSING
-		accessSameDomain	: 'Same domain', // MISSING
-		accessNever	: 'Never', // MISSING
+		access			: 'Accesso Script',
+		accessAlways	: 'Sempre',
+		accessSameDomain	: 'Solo stesso dominio',
+		accessNever	: 'Mai',
 		align		: 'Allineamento',
 		alignLeft	: 'Sinistra',
@@ -428,16 +428,16 @@
 		alignTextTop	: 'In alto al testo',
 		alignTop	: 'In Alto',
-		quality		: 'Quality', // MISSING
-		qualityBest		 : 'Best', // MISSING
-		qualityHigh		 : 'High', // MISSING
-		qualityAutoHigh	 : 'Auto High', // MISSING
-		qualityMedium	 : 'Medium', // MISSING
-		qualityAutoLow	 : 'Auto Low', // MISSING
-		qualityLow		 : 'Low', // MISSING
-		windowModeWindow	 : 'Window', // MISSING
-		windowModeOpaque	 : 'Opaque', // MISSING
-		windowModeTransparent	 : 'Transparent', // MISSING
-		windowMode	: 'Window mode', // MISSING
-		flashvars	: 'Variables for Flash', // MISSING
+		quality		: 'Qualità',
+		qualityBest		 : 'Massima',
+		qualityHigh		 : 'Alta',
+		qualityAutoHigh	 : 'Alta Automatica',
+		qualityMedium	 : 'Intermedia',
+		qualityAutoLow	 : 'Bassa Automatica',
+		qualityLow		 : 'Bassa',
+		windowModeWindow	 : 'Finestra',
+		windowModeOpaque	 : 'Opaca',
+		windowModeTransparent	 : 'Trasparente',
+		windowMode	: 'Modalità finestra',
+		flashvars	: 'Variabili per Flash',
 		bgcolor	: 'Colore sfondo',
 		width	: 'Larghezza',
@@ -446,8 +446,8 @@
 		vSpace	: 'VSpace',
 		validateSrc : 'Devi inserire l\'URL del collegamento',
-		validateWidth : 'Width must be a number.', // MISSING
-		validateHeight : 'Height must be a number.', // MISSING
-		validateHSpace : 'HSpace must be a number.', // MISSING
-		validateVSpace : 'VSpace must be a number.' // MISSING
+		validateWidth : 'La Larghezza dev\'essere un numero',
+		validateHeight : 'L\'altezza dev\'essere un numero',
+		validateHSpace : 'L\'HSpace dev\'essere un numero.',
+		validateVSpace : 'Il VSpace dev\'essere un numero.'
 	},
 
@@ -456,7 +456,7 @@
 	{
 		toolbar			: 'Correttore ortografico',
-		title			: 'Spell Check', // MISSING
-		notAvailable	: 'Sorry, but service is unavailable now.', // MISSING
-		errorLoading	: 'Error loading application service host: %s.', // MISSING
+		title			: 'Controllo ortografico',
+		notAvailable	: 'Il servizio non è momentaneamente disponibile.',
+		errorLoading	: 'Errore nel caricamento dell\'host col servizio applicativo: %s.',
 		notInDic		: 'Non nel dizionario',
 		changeTo		: 'Cambia in',
@@ -483,5 +483,5 @@
 	elementsPath :
 	{
-		eleTitle : '%1 element' // MISSING
+		eleTitle : '%1 elemento'
 	},
 
@@ -499,5 +499,5 @@
 	},
 
-	blockquote : 'Blockquote', // MISSING
+	blockquote : 'Citazione',
 
 	clipboard :
@@ -539,9 +539,9 @@
 	{
 		label : 'Stile',
-		voiceLabel : 'Styles', // MISSING
-		panelVoiceLabel : 'Select a style', // MISSING
-		panelTitle1 : 'Block Styles', // MISSING
-		panelTitle2 : 'Inline Styles', // MISSING
-		panelTitle3 : 'Object Styles' // MISSING
+		voiceLabel : 'Stili',
+		panelVoiceLabel : 'Seleziona uno stile',
+		panelTitle1 : 'Stili per blocchi',
+		panelTitle2 : 'Stili in linea',
+		panelTitle3 : 'Stili per oggetti'
 	},
 
@@ -549,7 +549,7 @@
 	{
 		label : 'Formato',
-		voiceLabel : 'Format', // MISSING
+		voiceLabel : 'Formato',
 		panelTitle : 'Formato',
-		panelVoiceLabel : 'Select a paragraph format', // MISSING
+		panelVoiceLabel : 'Seleziona il formato per paragrafo',
 
 		tag_p : 'Normale',
@@ -568,7 +568,7 @@
 	{
 		label : 'Font',
-		voiceLabel : 'Font', // MISSING
+		voiceLabel : 'Font',
 		panelTitle : 'Font',
-		panelVoiceLabel : 'Select a font' // MISSING
+		panelVoiceLabel : 'Seleziona un font'
 	},
 
@@ -576,7 +576,7 @@
 	{
 		label : 'Dimensione',
-		voiceLabel : 'Font Size', // MISSING
+		voiceLabel : 'Dimensione Font',
 		panelTitle : 'Dimensione',
-		panelVoiceLabel : 'Select a font size' // MISSING
+		panelVoiceLabel : 'Seleziona una dimensione font'
 	},
 
@@ -635,39 +635,40 @@
 	scayt :
 	{
-		title : 'Spell Check As You Type', // MISSING
-		enable : 'Enable SCAYT', // MISSING
-		disable : 'Disable SCAYT', // MISSING
-		about : 'About SCAYT', // MISSING
-		toggle : 'Toggle SCAYT', // MISSING
-		options : 'Options', // MISSING
-		langs : 'Languages', // MISSING
-		moreSuggestions : 'More suggestions', // MISSING
-		ignore : 'Ignore', // MISSING
-		ignoreAll : 'Ignore All', // MISSING
-		addWord : 'Add Word', // MISSING
-		emptyDic : 'Dictionary name should not be empty.', // MISSING
-		optionsTab : 'Options', // MISSING
-		languagesTab : 'Languages', // MISSING
-		dictionariesTab : 'Dictionaries', // MISSING
-		aboutTab : 'About' // MISSING
+		title : 'Controllo Ortografico Mentre Scrivi',
+		enable : 'Abilita COMS',
+		disable : 'Disabilita COMS',
+		about : 'About COMS',
+		toggle : 'Inverti abilitazione SCOMS',
+		options : 'Opzioni',
+		langs : 'Lingue',
+		moreSuggestions : 'Altri suggerimenti',
+		ignore : 'Ignora',
+		ignoreAll : 'Ignora tutti',
+		addWord : 'Aggiungi Parola',
+		emptyDic : 'Il nome del dizionario non può essere vuoto.',
+		optionsTab : 'Opzioni',
+		languagesTab : 'Lingue',
+		dictionariesTab : 'Dizionari',
+		aboutTab : 'About'
 	},
 
 	about :
 	{
-		title : 'About CKEditor', // MISSING
-		moreInfo : 'For licensing information please visit our web site:', // MISSING
-		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
-	},
-
-	maximize : 'Maximize', // MISSING
+		title : 'About CKEditor',
+		dlgTitle : 'About CKEditor',
+		moreInfo : 'Per le informazioni sulla licenza si prega di visitare il nostro sito:',
+		copy : 'Copyright &copy; $1. Tutti i diritti riservati.'
+	},
+
+	maximize : 'Massimizza',
 
 	fakeobjects :
 	{
-		anchor : 'Anchor', // MISSING
-		flash : 'Flash Animation', // MISSING
-		div : 'Page Break', // MISSING
-		unknown : 'Unknown Object' // MISSING
-	},
-
-	resize : 'Drag to resize' // MISSING
+		anchor : 'Ancora',
+		flash : 'Animazione Flash',
+		div : 'Interruzione di Pagina',
+		unknown : 'Oggetto sconosciuto'
+	},
+
+	resize : 'Trascina per ridimensionare'
 };
Index: /CKEditor/branches/versions/3.0.x/_source/lang/ja.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/ja.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/ja.js	(revision 4056)
@@ -32,5 +32,5 @@
 	 * of reading non-English words. So be careful while translating it.
 	 */
-	editorTitle		: 'Rich text editor, %1', // MISSING
+	editorTitle		: 'リッチテキストエディタ, %1',
 
 	// Toolbar buttons without dialogs.
@@ -91,10 +91,10 @@
 		generalTab		: '全般',
 		advancedTab		: '高度な設定',
-		validateNumberFailed	: 'This value is not a number.', // MISSING
-		confirmNewPage	: 'Any unsaved changes to this content will be lost. Are you sure you want to load new page?', // MISSING
-		confirmCancel	: 'Some of the options have been changed. Are you sure to close the dialog?', // MISSING
+		validateNumberFailed	: '値が数ではありません',
+		confirmNewPage	: '変更内容を保存せず、 新しいページを開いてもよろしいでしょうか？',
+		confirmCancel	: 'オプション設定を変更しました。ダイアログを閉じてもよろしいでしょうか？',
 
 		// Put the voice-only part of the label in the span.
-		unavailable		: '%1<span class="cke_accessibility">, unavailable</span>' // MISSING
+		unavailable		: '%1<span class="cke_accessibility">, 利用不可能</span>'
 	},
 
@@ -130,5 +130,5 @@
 		targetPopupName	: 'ポップアップウィンドウ名',
 		popupFeatures	: 'ポップアップウィンドウ特徴',
-		popupResizable	: 'Resizable', // MISSING
+		popupResizable	: 'サイズ可変',
 		popupStatusBar	: 'ステータスバー',
 		popupLocationBar	: 'ロケーションバー',
@@ -142,5 +142,5 @@
 		popupHeight		: '高さ',
 		popupTop		: '上端からの座標で指定',
-		id				: 'Id', // MISSING
+		id				: 'Id',
 		langDir			: '文字表記の方向',
 		langDirNotSet	: '<なし>',
@@ -188,7 +188,7 @@
 		matchCase			: '部分一致',
 		matchWord			: '単語単位で一致',
-		matchCyclic			: 'Match cyclic', // MISSING
+		matchCyclic			: '大文字/小文字区別一致',
 		replaceAll			: 'すべて置換え',
-		replaceSuccessMsg	: '%1 occurrence(s) replaced.' // MISSING
+		replaceSuccessMsg	: '%1 に置換しました。'
 	},
 
@@ -216,16 +216,16 @@
 		caption		: 'ｷｬﾌﾟｼｮﾝ',
 		summary		: 'テーブル目的/構造',
-		headers		: 'Headers', // MISSING
-		headersNone		: 'None', // MISSING
-		headersColumn	: 'First column', // MISSING
-		headersRow		: 'First Row', // MISSING
-		headersBoth		: 'Both', // MISSING
-		invalidRows		: 'Number of rows must be a number greater than 0.', // MISSING
-		invalidCols		: 'Number of columns must be a number greater than 0.', // MISSING
-		invalidBorder	: 'Border size must be a number.', // MISSING
-		invalidWidth	: 'Table width must be a number.', // MISSING
-		invalidHeight	: 'Table height must be a number.', // MISSING
-		invalidCellSpacing	: 'Cell spacing must be a number.', // MISSING
-		invalidCellPadding	: 'Cell padding must be a number.', // MISSING
+		headers		: 'テーブルヘッダ(th)',
+		headersNone		: 'なし',
+		headersColumn	: '初めの列のみ',
+		headersRow		: '初めの行のみ',
+		headersBoth		: '両方',
+		invalidRows		: '行は0より大きな数値で入力してください。',
+		invalidCols		: '列は0より大きな数値で入力してください。',
+		invalidBorder	: 'ボーダーサイズは数値で入力してください。',
+		invalidWidth	: 'テーブル幅は数値で入力してください。',
+		invalidHeight	: 'テーブル高さは数値で入力してください。',
+		invalidCellSpacing	: 'セル内余白は数値で入力してください。',
+		invalidCellPadding	: 'セル内間隔は数値で入力してください。',
 
 		cell :
@@ -240,25 +240,25 @@
 			splitHorizontal	: 'セルを水平方向分割',
 			splitVertical	: 'セルを垂直方向に分割',
-			title			: 'Cell Properties', // MISSING
-			cellType		: 'Cell Type', // MISSING
-			rowSpan			: 'Rows Span', // MISSING
-			colSpan			: 'Columns Span', // MISSING
-			wordWrap		: 'Word Wrap', // MISSING
-			hAlign			: 'Horizontal Alignment', // MISSING
-			vAlign			: 'Vertical Alignment', // MISSING
-			alignTop		: 'Top', // MISSING
-			alignMiddle		: 'Middle', // MISSING
-			alignBottom		: 'Bottom', // MISSING
-			alignBaseline	: 'Baseline', // MISSING
-			bgColor			: 'Background Color', // MISSING
-			borderColor		: 'Border Color', // MISSING
-			data			: 'Data', // MISSING
-			header			: 'Header', // MISSING
-			yes				: 'Yes', // MISSING
-			no				: 'No', // MISSING
-			invalidWidth	: 'Cell width must be a number.', // MISSING
-			invalidHeight	: 'Cell height must be a number.', // MISSING
-			invalidRowSpan	: 'Rows span must be a whole number.', // MISSING
-			invalidColSpan	: 'Columns span must be a whole number.' // MISSING
+			title			: 'セルプロパティ',
+			cellType		: 'セルタイプ',
+			rowSpan			: '縦幅(行数)',
+			colSpan			: '横幅(列数)',
+			wordWrap		: '折り返し',
+			hAlign			: 'セル横の整列',
+			vAlign			: 'セル縦の整列',
+			alignTop		: '上',
+			alignMiddle		: '中央',
+			alignBottom		: '下',
+			alignBaseline	: 'ベースライン',
+			bgColor			: '背景色',
+			borderColor		: 'ボーダーカラー',
+			data			: 'テーブルデータ(td)',
+			header			: 'テーブルヘッダ(th)',
+			yes				: 'Yes',
+			no				: 'No',
+			invalidWidth	: 'セル幅は数値で入力してください。',
+			invalidHeight	: 'セル高さは数値で入力してください。',
+			invalidRowSpan	: '縦幅(行数)は数値で入力してください。',
+			invalidColSpan	: '横幅(列数)は数値で入力してください。'
 		},
 
@@ -307,5 +307,5 @@
 		action		: 'アクション',
 		method		: 'メソッド',
-		encoding	: 'Encoding', // MISSING
+		encoding	: 'エンコーディング',
 		target		: 'ターゲット',
 		targetNotSet	: '<なし>',
@@ -396,6 +396,6 @@
 		alertUrl	: 'イメージのURLを入力してください。',
 		linkTab	: 'リンク',
-		button2Img	: 'Do you want to transform the selected image button on a simple image?', // MISSING
-		img2Button	: 'Do you want to transform the selected image on a image button?' // MISSING
+		button2Img	: '選択したボタンを画像に置き換えますか？',
+		img2Button	: '選択した画像をボタンに置き換えますか？'
 	},
 
@@ -404,18 +404,18 @@
 	{
 		properties		: 'Flash プロパティ',
-		propertiesTab	: 'Properties', // MISSING
+		propertiesTab	: 'プロパティ',
 		title		: 'Flash プロパティ',
 		chkPlay		: '再生',
 		chkLoop		: 'ループ再生',
 		chkMenu		: 'Flashメニュー可能',
-		chkFull		: 'Allow Fullscreen', // MISSING
+		chkFull		: 'フルスクリーン許可',
  		scale		: '拡大縮小設定',
 		scaleAll		: 'すべて表示',
 		scaleNoBorder	: '外が見えない様に拡大',
 		scaleFit		: '上下左右にフィット',
-		access			: 'Script Access', // MISSING
-		accessAlways	: 'Always', // MISSING
-		accessSameDomain	: 'Same domain', // MISSING
-		accessNever	: 'Never', // MISSING
+		access			: 'スプリクトアクセス(AllowScriptAccess)',
+		accessAlways	: 'すべての場合に通信可能(Always)',
+		accessSameDomain	: '同一ドメインのみに通信可能(Same domain)',
+		accessNever	: 'すべての場合に通信不可能(Never)',
 		align		: '行揃え',
 		alignLeft	: '左',
@@ -428,16 +428,16 @@
 		alignTextTop	: 'テキスト上部',
 		alignTop	: '上',
-		quality		: 'Quality', // MISSING
-		qualityBest		 : 'Best', // MISSING
-		qualityHigh		 : 'High', // MISSING
-		qualityAutoHigh	 : 'Auto High', // MISSING
-		qualityMedium	 : 'Medium', // MISSING
-		qualityAutoLow	 : 'Auto Low', // MISSING
-		qualityLow		 : 'Low', // MISSING
-		windowModeWindow	 : 'Window', // MISSING
-		windowModeOpaque	 : 'Opaque', // MISSING
-		windowModeTransparent	 : 'Transparent', // MISSING
-		windowMode	: 'Window mode', // MISSING
-		flashvars	: 'Variables for Flash', // MISSING
+		quality		: '画質',
+		qualityBest		 : '品質優先',
+		qualityHigh		 : '高',
+		qualityAutoHigh	 : '自動/高',
+		qualityMedium	 : '中',
+		qualityAutoLow	 : '自動/低',
+		qualityLow		 : '低',
+		windowModeWindow	 : '標準',
+		windowModeOpaque	 : '背景を不透明設定',
+		windowModeTransparent	 : '背景を透過設定',
+		windowMode	: 'ウィンドウモード',
+		flashvars	: 'フラッシュに渡す変数(FlashVars)',
 		bgcolor	: '背景色',
 		width	: '幅',
@@ -446,8 +446,8 @@
 		vSpace	: '縦間隔',
 		validateSrc : 'リンクURLを入力してください。',
-		validateWidth : 'Width must be a number.', // MISSING
-		validateHeight : 'Height must be a number.', // MISSING
-		validateHSpace : 'HSpace must be a number.', // MISSING
-		validateVSpace : 'VSpace must be a number.' // MISSING
+		validateWidth : '幅は数値で入力してください。',
+		validateHeight : '高さは数値で入力してください。',
+		validateHSpace : '横間隔は数値で入力してください。',
+		validateVSpace : '縦間隔は数値で入力してください。'
 	},
 
@@ -456,7 +456,7 @@
 	{
 		toolbar			: 'スペルチェック',
-		title			: 'Spell Check', // MISSING
-		notAvailable	: 'Sorry, but service is unavailable now.', // MISSING
-		errorLoading	: 'Error loading application service host: %s.', // MISSING
+		title			: 'スペルチェック',
+		notAvailable	: '申し訳ありません、現在サービスを利用することができません',
+		errorLoading	: 'アプリケーションサービスホスト読込みエラー: %s.',
 		notInDic		: '辞書にありません',
 		changeTo		: '変更',
@@ -483,5 +483,5 @@
 	elementsPath :
 	{
-		eleTitle : '%1 element' // MISSING
+		eleTitle : '%1 エレメント'
 	},
 
@@ -539,9 +539,9 @@
 	{
 		label : 'スタイル',
-		voiceLabel : 'Styles', // MISSING
-		panelVoiceLabel : 'Select a style', // MISSING
-		panelTitle1 : 'Block Styles', // MISSING
-		panelTitle2 : 'Inline Styles', // MISSING
-		panelTitle3 : 'Object Styles' // MISSING
+		voiceLabel : 'スタイル',
+		panelVoiceLabel : 'スタイルを選択してください',
+		panelTitle1 : 'ブロックスタイル',
+		panelTitle2 : 'インラインスタイル',
+		panelTitle3 : 'オブジェクトスタイル'
 	},
 
@@ -549,7 +549,7 @@
 	{
 		label : 'フォーマット',
-		voiceLabel : 'Format', // MISSING
+		voiceLabel : 'フォーマット',
 		panelTitle : 'フォーマット',
-		panelVoiceLabel : 'Select a paragraph format', // MISSING
+		panelVoiceLabel : 'パラグラフ形式を選択してください。',
 
 		tag_p : '標準',
@@ -568,7 +568,7 @@
 	{
 		label : 'フォント',
-		voiceLabel : 'Font', // MISSING
+		voiceLabel : 'フォント',
 		panelTitle : 'フォント',
-		panelVoiceLabel : 'Select a font' // MISSING
+		panelVoiceLabel : 'フォントを選択してください'
 	},
 
@@ -576,7 +576,7 @@
 	{
 		label : 'サイズ',
-		voiceLabel : 'Font Size', // MISSING
+		voiceLabel : 'フォントサイズ',
 		panelTitle : 'サイズ',
-		panelVoiceLabel : 'Select a font size' // MISSING
+		panelVoiceLabel : 'フォントサイズを選択してください'
 	},
 
@@ -635,39 +635,40 @@
 	scayt :
 	{
-		title : 'Spell Check As You Type', // MISSING
-		enable : 'Enable SCAYT', // MISSING
-		disable : 'Disable SCAYT', // MISSING
-		about : 'About SCAYT', // MISSING
-		toggle : 'Toggle SCAYT', // MISSING
-		options : 'Options', // MISSING
-		langs : 'Languages', // MISSING
+		title : 'スペルチェック設定(SCAYT)',
+		enable : 'SCAYT有効',
+		disable : 'SCAYT無効',
+		about : 'SCAYTﾊﾞｰｼﾞｮﾝ',
+		toggle : 'SCAYT切替',
+		options : 'オプション',
+		langs : '言語',
 		moreSuggestions : 'More suggestions', // MISSING
-		ignore : 'Ignore', // MISSING
-		ignoreAll : 'Ignore All', // MISSING
-		addWord : 'Add Word', // MISSING
-		emptyDic : 'Dictionary name should not be empty.', // MISSING
-		optionsTab : 'Options', // MISSING
-		languagesTab : 'Languages', // MISSING
-		dictionariesTab : 'Dictionaries', // MISSING
-		aboutTab : 'About' // MISSING
+		ignore : '無視',
+		ignoreAll : 'すべて無視',
+		addWord : '語句追加',
+		emptyDic : '辞書名は必ず入力してください',
+		optionsTab : 'オプション',
+		languagesTab : '言語',
+		dictionariesTab : '辞書',
+		aboutTab : 'バージョン情報'
 	},
 
 	about :
 	{
-		title : 'About CKEditor', // MISSING
-		moreInfo : 'For licensing information please visit our web site:', // MISSING
-		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
-	},
-
-	maximize : 'Maximize', // MISSING
+		title : 'CKEditorバージョン情報',
+		dlgTitle : 'CKEditorバージョン情報',
+		moreInfo : 'ライセンス情報の詳細はウェブサイトにて確認してください:',
+		copy : 'Copyright &copy; $1. All rights reserved.'
+	},
+
+	maximize : '最大化',
 
 	fakeobjects :
 	{
-		anchor : 'Anchor', // MISSING
-		flash : 'Flash Animation', // MISSING
-		div : 'Page Break', // MISSING
-		unknown : 'Unknown Object' // MISSING
-	},
-
-	resize : 'Drag to resize' // MISSING
+		anchor : 'アンカー',
+		flash : 'Flash Animation',
+		div : 'Page Break',
+		unknown : 'Unknown Object'
+	},
+
+	resize : 'ドラックしてリサイズ'
 };
Index: /CKEditor/branches/versions/3.0.x/_source/lang/km.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/km.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/km.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/ko.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/ko.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/ko.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/lt.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/lt.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/lt.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/lv.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/lv.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/lv.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/mn.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/mn.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/mn.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/ms.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/ms.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/ms.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/nb.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/nb.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/nb.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/nl.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/nl.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/nl.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/no.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/no.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/no.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/pl.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/pl.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/pl.js	(revision 4056)
@@ -32,5 +32,5 @@
 	 * of reading non-English words. So be careful while translating it.
 	 */
-	editorTitle		: 'Rich text editor, %1', // MISSING
+	editorTitle		: 'Wzbogacony edytor treści, %1',
 
 	// Toolbar buttons without dialogs.
@@ -89,12 +89,12 @@
 		ok				: 'OK',
 		cancel			: 'Anuluj',
-		generalTab		: 'General', // MISSING
+		generalTab		: 'Ogólne',
 		advancedTab		: 'Zaawansowane',
-		validateNumberFailed	: 'This value is not a number.', // MISSING
-		confirmNewPage	: 'Any unsaved changes to this content will be lost. Are you sure you want to load new page?', // MISSING
-		confirmCancel	: 'Some of the options have been changed. Are you sure to close the dialog?', // MISSING
+		validateNumberFailed	: 'Ta wartość nie jest liczbą.',
+		confirmNewPage	: 'Wszystkie niezapisane zmiany zostaną utracone. Czy na pewno wczytać nową stronę ?',
+		confirmCancel	: 'Pewne opcje zostały zmienione. Czy na pewno zamknąć okno dialogowe ?',
 
 		// Put the voice-only part of the label in the span.
-		unavailable		: '%1<span class="cke_accessibility">, unavailable</span>' // MISSING
+		unavailable		: '%1<span class="cke_accessibility">, niedostępne</span>'
 	},
 
@@ -130,5 +130,5 @@
 		targetPopupName	: 'Nazwa wyskakującego okna',
 		popupFeatures	: 'Właściwości wyskakującego okna',
-		popupResizable	: 'Resizable', // MISSING
+		popupResizable	: 'Skalowalny',
 		popupStatusBar	: 'Pasek statusu',
 		popupLocationBar	: 'Pasek adresu',
@@ -142,5 +142,5 @@
 		popupHeight		: 'Wysokość',
 		popupTop		: 'Pozycja w pionie',
-		id				: 'Id', // MISSING
+		id				: 'Id',
 		langDir			: 'Kierunek tekstu',
 		langDirNotSet	: '<nie ustawione>',
@@ -188,7 +188,7 @@
 		matchCase			: 'Uwzględnij wielkość liter',
 		matchWord			: 'Całe słowa',
-		matchCyclic			: 'Match cyclic', // MISSING
+		matchCyclic			: 'Cykliczne dopasowanie',
 		replaceAll			: 'Zastąp wszystko',
-		replaceSuccessMsg	: '%1 occurrence(s) replaced.' // MISSING
+		replaceSuccessMsg	: '%1 wystąpień zastąpionych.'
 	},
 
@@ -216,16 +216,16 @@
 		caption		: 'Tytuł',
 		summary		: 'Podsumowanie',
-		headers		: 'Headers', // MISSING
-		headersNone		: 'None', // MISSING
-		headersColumn	: 'First column', // MISSING
-		headersRow		: 'First Row', // MISSING
-		headersBoth		: 'Both', // MISSING
-		invalidRows		: 'Number of rows must be a number greater than 0.', // MISSING
-		invalidCols		: 'Number of columns must be a number greater than 0.', // MISSING
-		invalidBorder	: 'Border size must be a number.', // MISSING
-		invalidWidth	: 'Table width must be a number.', // MISSING
-		invalidHeight	: 'Table height must be a number.', // MISSING
-		invalidCellSpacing	: 'Cell spacing must be a number.', // MISSING
-		invalidCellPadding	: 'Cell padding must be a number.', // MISSING
+		headers		: 'Nagłowki',
+		headersNone		: 'Brak',
+		headersColumn	: 'Pierwsza kolumna',
+		headersRow		: 'Pierwszy wiersz',
+		headersBoth		: 'Oba',
+		invalidRows		: 'Liczba wierszy musi być liczbą większą niż 0.',
+		invalidCols		: 'Liczba kolumn musi być liczbą większą niż 0.',
+		invalidBorder	: 'Liczba obramowań musi być liczbą.',
+		invalidWidth	: 'Szerokość tabeli musi być liczbą.',
+		invalidHeight	: 'Wysokość tabeli musi być liczbą.',
+		invalidCellSpacing	: 'Odstęp komórek musi być liczbą.',
+		invalidCellPadding	: 'Dopełnienie komórek musi być liczbą.',
 
 		cell :
@@ -240,25 +240,25 @@
 			splitHorizontal	: 'Podziel komórkę poziomo',
 			splitVertical	: 'Podziel komórkę pionowo',
-			title			: 'Cell Properties', // MISSING
-			cellType		: 'Cell Type', // MISSING
-			rowSpan			: 'Rows Span', // MISSING
-			colSpan			: 'Columns Span', // MISSING
-			wordWrap		: 'Word Wrap', // MISSING
-			hAlign			: 'Horizontal Alignment', // MISSING
-			vAlign			: 'Vertical Alignment', // MISSING
-			alignTop		: 'Top', // MISSING
-			alignMiddle		: 'Middle', // MISSING
-			alignBottom		: 'Bottom', // MISSING
-			alignBaseline	: 'Baseline', // MISSING
-			bgColor			: 'Background Color', // MISSING
-			borderColor		: 'Border Color', // MISSING
-			data			: 'Data', // MISSING
-			header			: 'Header', // MISSING
-			yes				: 'Yes', // MISSING
-			no				: 'No', // MISSING
-			invalidWidth	: 'Cell width must be a number.', // MISSING
-			invalidHeight	: 'Cell height must be a number.', // MISSING
-			invalidRowSpan	: 'Rows span must be a whole number.', // MISSING
-			invalidColSpan	: 'Columns span must be a whole number.' // MISSING
+			title			: 'Właściwości komórki',
+			cellType		: 'Typ komórki',
+			rowSpan			: 'Scalenie wierszy',
+			colSpan			: 'Scalenie komórek',
+			wordWrap		: 'Zawijanie słów',
+			hAlign			: 'Wyrównanie poziome',
+			vAlign			: 'Wyrównanie pionowe',
+			alignTop		: 'Góra',
+			alignMiddle		: 'Środek',
+			alignBottom		: 'Dół',
+			alignBaseline	: 'Linia bazowa',
+			bgColor			: 'Kolor tła',
+			borderColor		: 'Kolor obramowania',
+			data			: 'Dane',
+			header			: 'Nagłowek',
+			yes				: 'Tak',
+			no				: 'Nie',
+			invalidWidth	: 'Szerokość komórki musi być liczbą.',
+			invalidHeight	: 'Wysokość komórki musi być liczbą.',
+			invalidRowSpan	: 'Scalenie wierszy musi być liczbą całkowitą.',
+			invalidColSpan	: 'Scalenie komórek musi być liczbą całkowitą.'
 		},
 
@@ -307,5 +307,5 @@
 		action		: 'Akcja',
 		method		: 'Metoda',
-		encoding	: 'Encoding', // MISSING
+		encoding	: 'Kodowanie',
 		target		: 'Cel',
 		targetNotSet	: '<nie ustawione>',
@@ -396,6 +396,6 @@
 		alertUrl	: 'Podaj adres obrazka.',
 		linkTab	: 'Hiperłącze',
-		button2Img	: 'Do you want to transform the selected image button on a simple image?', // MISSING
-		img2Button	: 'Do you want to transform the selected image on a image button?' // MISSING
+		button2Img	: 'Czy chcesz przekonwertować zaznaczony przycisk graficzny do zwykłego obrazka?',
+		img2Button	: 'Czy chcesz przekonwertować zaznaczony obrazek do przycisku graficznego?'
 	},
 
@@ -404,18 +404,18 @@
 	{
 		properties		: 'Właściwości elementu Flash',
-		propertiesTab	: 'Properties', // MISSING
+		propertiesTab	: 'Właściwości',
 		title		: 'Właściwości elementu Flash',
 		chkPlay		: 'Auto Odtwarzanie',
 		chkLoop		: 'Pętla',
 		chkMenu		: 'Włącz menu',
-		chkFull		: 'Allow Fullscreen', // MISSING
+		chkFull		: 'Dopuść pełny ekran',
  		scale		: 'Skaluj',
 		scaleAll		: 'Pokaż wszystko',
 		scaleNoBorder	: 'Bez Ramki',
 		scaleFit		: 'Dokładne dopasowanie',
-		access			: 'Script Access', // MISSING
-		accessAlways	: 'Always', // MISSING
-		accessSameDomain	: 'Same domain', // MISSING
-		accessNever	: 'Never', // MISSING
+		access			: 'Dostęp skryptów',
+		accessAlways	: 'Zawsze',
+		accessSameDomain	: 'Ta sama domena',
+		accessNever	: 'Nigdy',
 		align		: 'Wyrównaj',
 		alignLeft	: 'Do lewej',
@@ -428,16 +428,16 @@
 		alignTextTop	: 'Do góry tekstu',
 		alignTop	: 'Do góry',
-		quality		: 'Quality', // MISSING
-		qualityBest		 : 'Best', // MISSING
-		qualityHigh		 : 'High', // MISSING
-		qualityAutoHigh	 : 'Auto High', // MISSING
-		qualityMedium	 : 'Medium', // MISSING
-		qualityAutoLow	 : 'Auto Low', // MISSING
-		qualityLow		 : 'Low', // MISSING
-		windowModeWindow	 : 'Window', // MISSING
-		windowModeOpaque	 : 'Opaque', // MISSING
-		windowModeTransparent	 : 'Transparent', // MISSING
-		windowMode	: 'Window mode', // MISSING
-		flashvars	: 'Variables for Flash', // MISSING
+		quality		: 'Jakość',
+		qualityBest		 : 'Najlepsza',
+		qualityHigh		 : 'Wysoka',
+		qualityAutoHigh	 : 'Auto wysoka',
+		qualityMedium	 : 'Średnia',
+		qualityAutoLow	 : 'Auto niska',
+		qualityLow		 : 'Niska',
+		windowModeWindow	 : 'Okno',
+		windowModeOpaque	 : 'Nieprzeźroczyste',
+		windowModeTransparent	 : 'Przeźroczyste',
+		windowMode	: 'Tryb okna',
+		flashvars	: 'Zmienne dla Flash\'a',
 		bgcolor	: 'Kolor tła',
 		width	: 'Szerokość',
@@ -446,8 +446,8 @@
 		vSpace	: 'Odstęp pionowy',
 		validateSrc : 'Podaj adres URL',
-		validateWidth : 'Width must be a number.', // MISSING
-		validateHeight : 'Height must be a number.', // MISSING
-		validateHSpace : 'HSpace must be a number.', // MISSING
-		validateVSpace : 'VSpace must be a number.' // MISSING
+		validateWidth : 'Szerokość musi być liczbą.',
+		validateHeight : 'Wysokość musi być liczbą.',
+		validateHSpace : 'Odstęp poziomy musi być liczbą.',
+		validateVSpace : 'Odstęp pionowy musi być liczbą.'
 	},
 
@@ -456,7 +456,7 @@
 	{
 		toolbar			: 'Sprawdź pisownię',
-		title			: 'Spell Check', // MISSING
-		notAvailable	: 'Sorry, but service is unavailable now.', // MISSING
-		errorLoading	: 'Error loading application service host: %s.', // MISSING
+		title			: 'Sprawdź pisownię',
+		notAvailable	: 'Przepraszamy, ale usługa jest obecnie niedostępna.',
+		errorLoading	: 'Błąd wczytywania hosta aplikacji usługi: %s.',
 		notInDic		: 'Słowa nie ma w słowniku',
 		changeTo		: 'Zmień na',
@@ -483,5 +483,5 @@
 	elementsPath :
 	{
-		eleTitle : '%1 element' // MISSING
+		eleTitle : 'element %1'
 	},
 
@@ -539,9 +539,9 @@
 	{
 		label : 'Styl',
-		voiceLabel : 'Styles', // MISSING
-		panelVoiceLabel : 'Select a style', // MISSING
-		panelTitle1 : 'Block Styles', // MISSING
-		panelTitle2 : 'Inline Styles', // MISSING
-		panelTitle3 : 'Object Styles' // MISSING
+		voiceLabel : 'Style',
+		panelVoiceLabel : 'Wybierz styl',
+		panelTitle1 : 'Style blokowe',
+		panelTitle2 : 'Style liniowe',
+		panelTitle3 : 'Style obiektowe'
 	},
 
@@ -549,7 +549,7 @@
 	{
 		label : 'Format',
-		voiceLabel : 'Format', // MISSING
+		voiceLabel : 'Format',
 		panelTitle : 'Format',
-		panelVoiceLabel : 'Select a paragraph format', // MISSING
+		panelVoiceLabel : 'Wybierz paragraf do sformatowania',
 
 		tag_p : 'Normalny',
@@ -562,5 +562,5 @@
 		tag_h5 : 'Nagłówek 5',
 		tag_h6 : 'Nagłówek 6',
-		tag_div : 'Normal (DIV)' // MISSING
+		tag_div : 'Normalny (DIV)'
 	},
 
@@ -568,7 +568,7 @@
 	{
 		label : 'Czcionka',
-		voiceLabel : 'Font', // MISSING
+		voiceLabel : 'Czcionka',
 		panelTitle : 'Czcionka',
-		panelVoiceLabel : 'Select a font' // MISSING
+		panelVoiceLabel : 'Select a font'
 	},
 
@@ -576,7 +576,7 @@
 	{
 		label : 'Rozmiar',
-		voiceLabel : 'Font Size', // MISSING
+		voiceLabel : 'Rozmiar czcionki',
 		panelTitle : 'Rozmiar',
-		panelVoiceLabel : 'Select a font size' // MISSING
+		panelVoiceLabel : 'Select a font size'
 	},
 
@@ -635,39 +635,40 @@
 	scayt :
 	{
-		title : 'Spell Check As You Type', // MISSING
-		enable : 'Enable SCAYT', // MISSING
-		disable : 'Disable SCAYT', // MISSING
-		about : 'About SCAYT', // MISSING
-		toggle : 'Toggle SCAYT', // MISSING
-		options : 'Options', // MISSING
-		langs : 'Languages', // MISSING
-		moreSuggestions : 'More suggestions', // MISSING
-		ignore : 'Ignore', // MISSING
-		ignoreAll : 'Ignore All', // MISSING
-		addWord : 'Add Word', // MISSING
-		emptyDic : 'Dictionary name should not be empty.', // MISSING
-		optionsTab : 'Options', // MISSING
-		languagesTab : 'Languages', // MISSING
-		dictionariesTab : 'Dictionaries', // MISSING
-		aboutTab : 'About' // MISSING
+		title : 'Sprawdź pisowanie podczas pisania (SCAYT)',
+		enable : 'Włącz SCAYT',
+		disable : 'Wyłącz SCAYT',
+		about : 'Na temat SCAYT',
+		toggle : 'Toggle SCAYT',
+		options : 'Opcje',
+		langs : 'Języki',
+		moreSuggestions : 'Więcej sugestii',
+		ignore : 'Ignoruj',
+		ignoreAll : 'Ignoruj wszystkie',
+		addWord : 'Dodaj słowo',
+		emptyDic : 'Nazwa słownika nie może być pusta.',
+		optionsTab : 'Opcje',
+		languagesTab : 'Języki',
+		dictionariesTab : 'Słowniki',
+		aboutTab : 'Na temat SCAYT'
 	},
 
 	about :
 	{
-		title : 'About CKEditor', // MISSING
-		moreInfo : 'For licensing information please visit our web site:', // MISSING
-		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
-	},
-
-	maximize : 'Maximize', // MISSING
+		title : 'Na temat CKEditor',
+		dlgTitle : 'Na temat CKEditor',
+		moreInfo : 'Informacje na temat licencji można znaleźć na naszej stronie:',
+		copy : 'Copyright &copy; $1. Wszelkie prawa zastrzeżone.'
+	},
+
+	maximize : 'Maksymalizuj',
 
 	fakeobjects :
 	{
-		anchor : 'Anchor', // MISSING
-		flash : 'Flash Animation', // MISSING
-		div : 'Page Break', // MISSING
-		unknown : 'Unknown Object' // MISSING
-	},
-
-	resize : 'Drag to resize' // MISSING
+		anchor : 'Kotwica',
+		flash : 'Animacja Flash',
+		div : 'Separator stron',
+		unknown : 'Nieznany obiekt'
+	},
+
+	resize : 'Przeciągnij, aby zmienić rozmiar'
 };
Index: /CKEditor/branches/versions/3.0.x/_source/lang/pt-br.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/pt-br.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/pt-br.js	(revision 4056)
@@ -32,5 +32,5 @@
 	 * of reading non-English words. So be careful while translating it.
 	 */
-	editorTitle		: 'Rich text editor, %1', // MISSING
+	editorTitle		: 'Editor de texto formatado, %1',
 
 	// Toolbar buttons without dialogs.
@@ -89,12 +89,12 @@
 		ok				: 'OK',
 		cancel			: 'Cancelar',
-		generalTab		: 'General', // MISSING
+		generalTab		: 'Geral',
 		advancedTab		: 'Avançado',
-		validateNumberFailed	: 'This value is not a number.', // MISSING
-		confirmNewPage	: 'Any unsaved changes to this content will be lost. Are you sure you want to load new page?', // MISSING
-		confirmCancel	: 'Some of the options have been changed. Are you sure to close the dialog?', // MISSING
+		validateNumberFailed	: 'Este valor não é um número.',
+		confirmNewPage	: 'Todas as mudanças não salvas serão perdidas. Tem certeza de que quer carregar outra página?',
+		confirmCancel	: 'Algumas opções foram alteradas. Tem certeza de que quer fechar a caixa de diálogo?',
 
 		// Put the voice-only part of the label in the span.
-		unavailable		: '%1<span class="cke_accessibility">, unavailable</span>' // MISSING
+		unavailable		: '%1<span class="cke_accessibility">, indisponível</span>'
 	},
 
@@ -130,5 +130,5 @@
 		targetPopupName	: 'Nome da Janela Pop-up',
 		popupFeatures	: 'Atributos da Janela Pop-up',
-		popupResizable	: 'Resizable', // MISSING
+		popupResizable	: 'Redimensionável',
 		popupStatusBar	: 'Barra de Status',
 		popupLocationBar	: 'Barra de Endereços',
@@ -142,5 +142,5 @@
 		popupHeight		: 'Altura',
 		popupTop		: 'Superior',
-		id				: 'Id', // MISSING
+		id				: 'Id',
 		langDir			: 'Direção do idioma',
 		langDirNotSet	: '<não ajustado>',
@@ -188,7 +188,7 @@
 		matchCase			: 'Coincidir Maiúsculas/Minúsculas',
 		matchWord			: 'Coincidir a palavra inteira',
-		matchCyclic			: 'Match cyclic', // MISSING
+		matchCyclic			: 'Coincidir cíclico',
 		replaceAll			: 'Substituir Tudo',
-		replaceSuccessMsg	: '%1 occurrence(s) replaced.' // MISSING
+		replaceSuccessMsg	: '%1 ocorrência(s) substituída(s).'
 	},
 
@@ -216,16 +216,16 @@
 		caption		: 'Legenda',
 		summary		: 'Resumo',
-		headers		: 'Headers', // MISSING
-		headersNone		: 'None', // MISSING
-		headersColumn	: 'First column', // MISSING
-		headersRow		: 'First Row', // MISSING
-		headersBoth		: 'Both', // MISSING
-		invalidRows		: 'Number of rows must be a number greater than 0.', // MISSING
-		invalidCols		: 'Number of columns must be a number greater than 0.', // MISSING
-		invalidBorder	: 'Border size must be a number.', // MISSING
-		invalidWidth	: 'Table width must be a number.', // MISSING
-		invalidHeight	: 'Table height must be a number.', // MISSING
-		invalidCellSpacing	: 'Cell spacing must be a number.', // MISSING
-		invalidCellPadding	: 'Cell padding must be a number.', // MISSING
+		headers		: 'Cabeçalho',
+		headersNone		: 'Nenhum',
+		headersColumn	: 'Primeira coluna',
+		headersRow		: 'Primeira linha',
+		headersBoth		: 'Ambos',
+		invalidRows		: '"Número de linhas" tem que ser um número maior que 0.',
+		invalidCols		: '"Número de colunas" tem que ser um número maior que 0.',
+		invalidBorder	: '"Tamanho da borda" tem que ser um número.',
+		invalidWidth	: '"Largura da tabela" tem que ser um número.',
+		invalidHeight	: '"Altura da tabela" tem que ser um número.',
+		invalidCellSpacing	: '"Espaçamento das células" tem que ser um número.',
+		invalidCellPadding	: '"Margem interna das células" tem que ser um número.',
 
 		cell :
@@ -240,25 +240,25 @@
 			splitHorizontal	: 'Dividir célula horizontalmente',
 			splitVertical	: 'Dividir célula verticalmente',
-			title			: 'Cell Properties', // MISSING
-			cellType		: 'Cell Type', // MISSING
-			rowSpan			: 'Rows Span', // MISSING
-			colSpan			: 'Columns Span', // MISSING
-			wordWrap		: 'Word Wrap', // MISSING
-			hAlign			: 'Horizontal Alignment', // MISSING
-			vAlign			: 'Vertical Alignment', // MISSING
-			alignTop		: 'Top', // MISSING
-			alignMiddle		: 'Middle', // MISSING
-			alignBottom		: 'Bottom', // MISSING
-			alignBaseline	: 'Baseline', // MISSING
-			bgColor			: 'Background Color', // MISSING
-			borderColor		: 'Border Color', // MISSING
-			data			: 'Data', // MISSING
-			header			: 'Header', // MISSING
-			yes				: 'Yes', // MISSING
-			no				: 'No', // MISSING
-			invalidWidth	: 'Cell width must be a number.', // MISSING
-			invalidHeight	: 'Cell height must be a number.', // MISSING
-			invalidRowSpan	: 'Rows span must be a whole number.', // MISSING
-			invalidColSpan	: 'Columns span must be a whole number.' // MISSING
+			title			: 'Propriedades da célula',
+			cellType		: 'Tipo de célula',
+			rowSpan			: 'Linhas cobertas',
+			colSpan			: 'Colunas cobertas',
+			wordWrap		: 'Quebra de palavra',
+			hAlign			: 'Alinhamento horizontal',
+			vAlign			: 'Alinhamento vertical',
+			alignTop		: 'Alinhar no topo',
+			alignMiddle		: 'Centralizado verticalmente',
+			alignBottom		: 'Alinhar na base',
+			alignBaseline	: 'Patamar de alinhamento',
+			bgColor			: 'Cor de fundo',
+			borderColor		: 'Cor das bordas',
+			data			: 'Dados',
+			header			: 'Cabeçalho',
+			yes				: 'Sim',
+			no				: 'Não',
+			invalidWidth	: 'A largura da célula tem que ser um número.',
+			invalidHeight	: 'A altura da célula tem que ser um número.',
+			invalidRowSpan	: '"Linhas cobertas" tem que ser um número inteiro.',
+			invalidColSpan	: '"Colunas cobertas" tem que ser um número inteiro.'
 		},
 
@@ -307,5 +307,5 @@
 		action		: 'Action',
 		method		: 'Método',
-		encoding	: 'Encoding', // MISSING
+		encoding	: 'Codificação',
 		target		: 'Destino',
 		targetNotSet	: '<não ajustado>',
@@ -396,6 +396,6 @@
 		alertUrl	: 'Por favor, digite o URL da figura.',
 		linkTab	: 'Hiperlink',
-		button2Img	: 'Do you want to transform the selected image button on a simple image?', // MISSING
-		img2Button	: 'Do you want to transform the selected image on a image button?' // MISSING
+		button2Img	: 'Você deseja transformar o botão de imagem selecionado em uma imagem comum?',
+		img2Button	: 'Você deseja transformar a imagem selecionada em um botão de imagem?'
 	},
 
@@ -403,19 +403,19 @@
 	flash :
 	{
-		properties		: 'Propriedades Flash',
-		propertiesTab	: 'Properties', // MISSING
-		title		: 'Propriedades Flash',
+		properties		: 'Propriedades do Flash',
+		propertiesTab	: 'Propriedades',
+		title		: 'Propriedades do Flash',
 		chkPlay		: 'Tocar Automaticamente',
 		chkLoop		: 'Loop',
 		chkMenu		: 'Habilita Menu Flash',
-		chkFull		: 'Allow Fullscreen', // MISSING
+		chkFull		: 'Permitir tela cheia',
  		scale		: 'Escala',
 		scaleAll		: 'Mostrar tudo',
 		scaleNoBorder	: 'Sem Borda',
 		scaleFit		: 'Escala Exata',
-		access			: 'Script Access', // MISSING
-		accessAlways	: 'Always', // MISSING
-		accessSameDomain	: 'Same domain', // MISSING
-		accessNever	: 'Never', // MISSING
+		access			: 'Acesso ao script',
+		accessAlways	: 'Sempre',
+		accessSameDomain	: 'Mesmo domínio',
+		accessNever	: 'Nunca',
 		align		: 'Alinhamento',
 		alignLeft	: 'Esquerda',
@@ -428,16 +428,16 @@
 		alignTextTop	: 'Superior Absoluto',
 		alignTop	: 'Superior',
-		quality		: 'Quality', // MISSING
-		qualityBest		 : 'Best', // MISSING
-		qualityHigh		 : 'High', // MISSING
-		qualityAutoHigh	 : 'Auto High', // MISSING
-		qualityMedium	 : 'Medium', // MISSING
-		qualityAutoLow	 : 'Auto Low', // MISSING
-		qualityLow		 : 'Low', // MISSING
-		windowModeWindow	 : 'Window', // MISSING
-		windowModeOpaque	 : 'Opaque', // MISSING
-		windowModeTransparent	 : 'Transparent', // MISSING
-		windowMode	: 'Window mode', // MISSING
-		flashvars	: 'Variables for Flash', // MISSING
+		quality		: 'Qualidade',
+		qualityBest		 : 'Melhor',
+		qualityHigh		 : 'Alta',
+		qualityAutoHigh	 : 'Alta automático',
+		qualityMedium	 : 'Média',
+		qualityAutoLow	 : 'Média automático',
+		qualityLow		 : 'Baixa',
+		windowModeWindow	 : 'Janela',
+		windowModeOpaque	 : 'Opaca',
+		windowModeTransparent	 : 'Transparente',
+		windowMode	: 'Modo da janela',
+		flashvars	: 'Variáveis do Flash',
 		bgcolor	: 'Cor do Plano de Fundo',
 		width	: 'Largura',
@@ -446,8 +446,8 @@
 		vSpace	: 'Vertical',
 		validateSrc : 'Por favor, digite o endereço do Hiperlink',
-		validateWidth : 'Width must be a number.', // MISSING
-		validateHeight : 'Height must be a number.', // MISSING
-		validateHSpace : 'HSpace must be a number.', // MISSING
-		validateVSpace : 'VSpace must be a number.' // MISSING
+		validateWidth : '"Largura" tem que ser um número.',
+		validateHeight : '"Altura" tem que ser um número',
+		validateHSpace : '"HSpace" tem que ser um número',
+		validateVSpace : '"VSpace" tem que ser um número.'
 	},
 
@@ -456,7 +456,7 @@
 	{
 		toolbar			: 'Verificar Ortografia',
-		title			: 'Spell Check', // MISSING
-		notAvailable	: 'Sorry, but service is unavailable now.', // MISSING
-		errorLoading	: 'Error loading application service host: %s.', // MISSING
+		title			: 'Corretor gramatical',
+		notAvailable	: 'Desculpe, o serviço não está disponível no momento.',
+		errorLoading	: 'Erro carregando servidor de aplicação: %s.',
 		notInDic		: 'Não encontrada',
 		changeTo		: 'Alterar para',
@@ -483,5 +483,5 @@
 	elementsPath :
 	{
-		eleTitle : '%1 element' // MISSING
+		eleTitle : 'Elemento %1'
 	},
 
@@ -539,9 +539,9 @@
 	{
 		label : 'Estilo',
-		voiceLabel : 'Styles', // MISSING
-		panelVoiceLabel : 'Select a style', // MISSING
-		panelTitle1 : 'Block Styles', // MISSING
-		panelTitle2 : 'Inline Styles', // MISSING
-		panelTitle3 : 'Object Styles' // MISSING
+		voiceLabel : 'Estilo',
+		panelVoiceLabel : 'Selecione um estilo',
+		panelTitle1 : 'Estilos de bloco',
+		panelTitle2 : 'Estilos em texto corrido',
+		panelTitle3 : 'Estilos de objeto'
 	},
 
@@ -549,7 +549,7 @@
 	{
 		label : 'Formatação',
-		voiceLabel : 'Format', // MISSING
+		voiceLabel : 'Formatação',
 		panelTitle : 'Formatação',
-		panelVoiceLabel : 'Select a paragraph format', // MISSING
+		panelVoiceLabel : 'Selecione uma formatação de parágrafo',
 
 		tag_p : 'Normal',
@@ -562,5 +562,5 @@
 		tag_h5 : 'Título 5',
 		tag_h6 : 'Título 6',
-		tag_div : 'Normal (DIV)' // MISSING
+		tag_div : 'Normal (DIV)'
 	},
 
@@ -568,7 +568,7 @@
 	{
 		label : 'Fonte',
-		voiceLabel : 'Font', // MISSING
+		voiceLabel : 'Fonte',
 		panelTitle : 'Fonte',
-		panelVoiceLabel : 'Select a font' // MISSING
+		panelVoiceLabel : 'Selecione uma fonte'
 	},
 
@@ -576,7 +576,7 @@
 	{
 		label : 'Tamanho',
-		voiceLabel : 'Font Size', // MISSING
+		voiceLabel : 'Tamanho da fonte',
 		panelTitle : 'Tamanho',
-		panelVoiceLabel : 'Select a font size' // MISSING
+		panelVoiceLabel : 'Selecione um tamanho de fonte'
 	},
 
@@ -635,39 +635,40 @@
 	scayt :
 	{
-		title : 'Spell Check As You Type', // MISSING
-		enable : 'Enable SCAYT', // MISSING
-		disable : 'Disable SCAYT', // MISSING
-		about : 'About SCAYT', // MISSING
-		toggle : 'Toggle SCAYT', // MISSING
-		options : 'Options', // MISSING
-		langs : 'Languages', // MISSING
-		moreSuggestions : 'More suggestions', // MISSING
-		ignore : 'Ignore', // MISSING
-		ignoreAll : 'Ignore All', // MISSING
-		addWord : 'Add Word', // MISSING
-		emptyDic : 'Dictionary name should not be empty.', // MISSING
-		optionsTab : 'Options', // MISSING
-		languagesTab : 'Languages', // MISSING
-		dictionariesTab : 'Dictionaries', // MISSING
-		aboutTab : 'About' // MISSING
+		title : 'Correção gramatical durante a digitação',
+		enable : 'Habilitar SCAYT',
+		disable : 'Desabilitar SCAYT',
+		about : 'Sobre o SCAYT',
+		toggle : 'Ativar/desativar SCAYT',
+		options : 'Opções',
+		langs : 'Línguas',
+		moreSuggestions : 'Mais sugestões',
+		ignore : 'Ignorar',
+		ignoreAll : 'Ignorar todas',
+		addWord : 'Adicionar palavra',
+		emptyDic : 'O nome do dicionário não deveria estar vazio.',
+		optionsTab : 'Opções',
+		languagesTab : 'Línguas',
+		dictionariesTab : 'Dicionários',
+		aboutTab : 'Sobre'
 	},
 
 	about :
 	{
-		title : 'About CKEditor', // MISSING
-		moreInfo : 'For licensing information please visit our web site:', // MISSING
-		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
-	},
-
-	maximize : 'Maximize', // MISSING
+		title : 'Sobre o CKEditor',
+		dlgTitle : 'About CKEditor', // MISSING
+		moreInfo : 'Para informações sobre a licença, por favor, visite o nosso site na Internet:',
+		copy : 'Direito de reprodução &copy; $1. Todos os direitos reservados.'
+	},
+
+	maximize : 'Maximizar',
 
 	fakeobjects :
 	{
-		anchor : 'Anchor', // MISSING
-		flash : 'Flash Animation', // MISSING
-		div : 'Page Break', // MISSING
-		unknown : 'Unknown Object' // MISSING
-	},
-
-	resize : 'Drag to resize' // MISSING
+		anchor : 'Âncora',
+		flash : 'Animação em Flash',
+		div : 'Quebra de página',
+		unknown : 'Objeto desconhecido'
+	},
+
+	resize : 'Arraste para redimensionar'
 };
Index: /CKEditor/branches/versions/3.0.x/_source/lang/pt.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/pt.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/pt.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/ro.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/ro.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/ro.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/ru.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/ru.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/ru.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/sk.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/sk.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/sk.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/sl.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/sl.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/sl.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/sr-latn.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/sr-latn.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/sr-latn.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/sr.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/sr.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/sr.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/sv.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/sv.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/sv.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/th.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/th.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/th.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/tr.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/tr.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/tr.js	(revision 4056)
@@ -656,4 +656,5 @@
 	{
 		title : 'About CKEditor', // MISSING
+		dlgTitle : 'About CKEditor', // MISSING
 		moreInfo : 'For licensing information please visit our web site:', // MISSING
 		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
Index: /CKEditor/branches/versions/3.0.x/_source/lang/uk.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/uk.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/uk.js	(revision 4056)
@@ -6,5 +6,5 @@
 /**
  * @fileOverview Defines the {@link CKEDITOR.lang} object, for the
- * Ukrainian language.
+ * Ukrainian language. Translated by Alexander Pervak.
  */
 
@@ -32,5 +32,5 @@
 	 * of reading non-English words. So be careful while translating it.
 	 */
-	editorTitle		: 'Rich text editor, %1', // MISSING
+	editorTitle		: 'Візуальний текстовий редактор, %1',
 
 	// Toolbar buttons without dialogs.
@@ -91,10 +91,10 @@
 		generalTab		: 'Загальна',
 		advancedTab		: 'Розширений',
-		validateNumberFailed	: 'This value is not a number.', // MISSING
-		confirmNewPage	: 'Any unsaved changes to this content will be lost. Are you sure you want to load new page?', // MISSING
-		confirmCancel	: 'Some of the options have been changed. Are you sure to close the dialog?', // MISSING
+		validateNumberFailed	: 'Значення не є числом.',
+		confirmNewPage	: 'Всі не збережені зміни будуть втрачені. Ви впевнені, що хочете завантажити нову сторінку?',
+		confirmCancel	: 'Деякі опції були змінені. Закрити вікно?',
 
 		// Put the voice-only part of the label in the span.
-		unavailable		: '%1<span class="cke_accessibility">, unavailable</span>' // MISSING
+		unavailable		: '%1<span class="cke_accessibility">, не доступне</span>'
 	},
 
@@ -130,5 +130,5 @@
 		targetPopupName	: 'Ім\'я спливаючого вікна',
 		popupFeatures	: 'Властивості спливаючого вікна',
-		popupResizable	: 'Resizable', // MISSING
+		popupResizable	: 'Масштабоване',
 		popupStatusBar	: 'Строка статусу',
 		popupLocationBar	: 'Панель локації',
@@ -142,5 +142,5 @@
 		popupHeight		: 'Висота',
 		popupTop		: 'Позиція зверху',
-		id				: 'Id', // MISSING
+		id				: 'Ідентифікатор (Id)',
 		langDir			: 'Напрямок мови',
 		langDirNotSet	: '<не визначено>',
@@ -186,9 +186,9 @@
 		replaceWith			: 'Замінити на:',
 		notFoundMsg			: 'Вказаний текст не знайдений.',
-		matchCase			: 'Учитывать регистр',
+		matchCase			: 'Враховувати регістр',
 		matchWord			: 'Збіг цілих слів',
-		matchCyclic			: 'Match cyclic', // MISSING
+		matchCyclic			: 'Циклічна заміна',
 		replaceAll			: 'Замінити все',
-		replaceSuccessMsg	: '%1 occurrence(s) replaced.' // MISSING
+		replaceSuccessMsg	: '%1 співпадінь(я) замінено.'
 	},
 
@@ -216,16 +216,16 @@
 		caption		: 'Заголовок',
 		summary		: 'Резюме',
-		headers		: 'Headers', // MISSING
-		headersNone		: 'None', // MISSING
-		headersColumn	: 'First column', // MISSING
-		headersRow		: 'First Row', // MISSING
-		headersBoth		: 'Both', // MISSING
-		invalidRows		: 'Number of rows must be a number greater than 0.', // MISSING
-		invalidCols		: 'Number of columns must be a number greater than 0.', // MISSING
-		invalidBorder	: 'Border size must be a number.', // MISSING
-		invalidWidth	: 'Table width must be a number.', // MISSING
-		invalidHeight	: 'Table height must be a number.', // MISSING
-		invalidCellSpacing	: 'Cell spacing must be a number.', // MISSING
-		invalidCellPadding	: 'Cell padding must be a number.', // MISSING
+		headers		: 'Заголовки',
+		headersNone		: 'Жодного',
+		headersColumn	: 'Перша колонка',
+		headersRow		: 'Перший рядок',
+		headersBoth		: 'Обидва',
+		invalidRows		: 'Кількість рядків повинна бути числом більше за 0.',
+		invalidCols		: 'Кількість колонок повинна бути числом більше за  0.',
+		invalidBorder	: 'Розмір бордюра повинен бути числом.',
+		invalidWidth	: 'Ширина таблиці повинна бути числом.',
+		invalidHeight	: 'Висота таблиці повинна бути числом.',
+		invalidCellSpacing	: 'Проміжок (spacing) комірки повинен бути числом.',
+		invalidCellPadding	: 'Відступ (padding) комірки повинен бути числом.',
 
 		cell :
@@ -240,25 +240,25 @@
 			splitHorizontal	: 'Розділити комірку по горизонталі',
 			splitVertical	: 'Розділити комірку по вертикалі',
-			title			: 'Cell Properties', // MISSING
-			cellType		: 'Cell Type', // MISSING
-			rowSpan			: 'Rows Span', // MISSING
-			colSpan			: 'Columns Span', // MISSING
-			wordWrap		: 'Word Wrap', // MISSING
-			hAlign			: 'Horizontal Alignment', // MISSING
-			vAlign			: 'Vertical Alignment', // MISSING
-			alignTop		: 'Top', // MISSING
-			alignMiddle		: 'Middle', // MISSING
-			alignBottom		: 'Bottom', // MISSING
-			alignBaseline	: 'Baseline', // MISSING
-			bgColor			: 'Background Color', // MISSING
-			borderColor		: 'Border Color', // MISSING
-			data			: 'Data', // MISSING
-			header			: 'Header', // MISSING
-			yes				: 'Yes', // MISSING
-			no				: 'No', // MISSING
-			invalidWidth	: 'Cell width must be a number.', // MISSING
-			invalidHeight	: 'Cell height must be a number.', // MISSING
-			invalidRowSpan	: 'Rows span must be a whole number.', // MISSING
-			invalidColSpan	: 'Columns span must be a whole number.' // MISSING
+			title			: 'Властивості комірки',
+			cellType		: 'Тип комірки',
+			rowSpan			: 'Обєднання рядків (Rows Span)',
+			colSpan			: 'Обєднання стовпчиків (Columns Span)',
+			wordWrap		: 'Авто згортання тексту (Word Wrap)',
+			hAlign			: 'Горизонтальне вирівнювання',
+			vAlign			: 'Вертикальне вирівнювання',
+			alignTop		: 'До верху',
+			alignMiddle		: 'Посередині',
+			alignBottom		: 'До низу',
+			alignBaseline	: 'По базовій лінії',
+			bgColor			: 'Колір фону',
+			borderColor		: 'Колір бордюру',
+			data			: 'Дані',
+			header			: 'Заголовок',
+			yes				: 'Так',
+			no				: 'Ні',
+			invalidWidth	: 'Ширина комірки повинна бути числом.',
+			invalidHeight	: 'Висота комірки повинна бути числом.',
+			invalidRowSpan	: 'Кількість обєднуваних рядків повинна бути цілим числом.',
+			invalidColSpan	: 'Кількість обєднуваних стовпчиків повинна бути цілим числом.'
 		},
 
@@ -307,5 +307,5 @@
 		action		: 'Дія',
 		method		: 'Метод',
-		encoding	: 'Encoding', // MISSING
+		encoding	: 'Кодування',
 		target		: 'Ціль',
 		targetNotSet	: '<не визначено>',
@@ -396,6 +396,6 @@
 		alertUrl	: 'Будь ласка, введіть URL зображення',
 		linkTab	: 'Посилання',
-		button2Img	: 'Do you want to transform the selected image button on a simple image?', // MISSING
-		img2Button	: 'Do you want to transform the selected image on a image button?' // MISSING
+		button2Img	: 'Ви хочете перетворити обрану кнопку-зображення на просте зображення?',
+		img2Button	: 'Ви хочете перетворити обране зображення на кнопку-зображення?'
 	},
 
@@ -404,18 +404,18 @@
 	{
 		properties		: 'Властивості Flash',
-		propertiesTab	: 'Properties', // MISSING
+		propertiesTab	: 'Властивості',
 		title		: 'Властивості Flash',
 		chkPlay		: 'Авто програвання',
 		chkLoop		: 'Зациклити',
 		chkMenu		: 'Дозволити меню Flash',
-		chkFull		: 'Allow Fullscreen', // MISSING
+		chkFull		: 'Дозволити повноекранний перегляд',
  		scale		: 'Масштаб',
 		scaleAll		: 'Показати всі',
 		scaleNoBorder	: 'Без рамки',
 		scaleFit		: 'Дійсний розмір',
-		access			: 'Script Access', // MISSING
-		accessAlways	: 'Always', // MISSING
-		accessSameDomain	: 'Same domain', // MISSING
-		accessNever	: 'Never', // MISSING
+		access			: 'Доступ до скрипта',
+		accessAlways	: 'Завжди',
+		accessSameDomain	: 'З того ж домена',
+		accessNever	: 'Ніколи',
 		align		: 'Вирівнювання',
 		alignLeft	: 'По лівому краю',
@@ -428,16 +428,16 @@
 		alignTextTop	: 'Текст на верху',
 		alignTop	: 'По верху',
-		quality		: 'Quality', // MISSING
-		qualityBest		 : 'Best', // MISSING
-		qualityHigh		 : 'High', // MISSING
-		qualityAutoHigh	 : 'Auto High', // MISSING
-		qualityMedium	 : 'Medium', // MISSING
-		qualityAutoLow	 : 'Auto Low', // MISSING
-		qualityLow		 : 'Low', // MISSING
-		windowModeWindow	 : 'Window', // MISSING
-		windowModeOpaque	 : 'Opaque', // MISSING
-		windowModeTransparent	 : 'Transparent', // MISSING
-		windowMode	: 'Window mode', // MISSING
-		flashvars	: 'Variables for Flash', // MISSING
+		quality		: 'Якість',
+		qualityBest		 : 'Відмінна',
+		qualityHigh		 : 'Висока',
+		qualityAutoHigh	 : 'Авто відмінна',
+		qualityMedium	 : 'Середня',
+		qualityAutoLow	 : 'Авто низька',
+		qualityLow		 : 'Низька',
+		windowModeWindow	 : 'Вікно',
+		windowModeOpaque	 : 'Непрозорість (Opaque)',
+		windowModeTransparent	 : 'Прозорість (Transparent)',
+		windowMode	: 'Режим вікна',
+		flashvars	: 'Змінні Flash',
 		bgcolor	: 'Колір фону',
 		width	: 'Ширина',
@@ -446,8 +446,8 @@
 		vSpace	: 'Вертикальний відступ',
 		validateSrc : 'Будь ласка, занесіть URL посилання',
-		validateWidth : 'Width must be a number.', // MISSING
-		validateHeight : 'Height must be a number.', // MISSING
-		validateHSpace : 'HSpace must be a number.', // MISSING
-		validateVSpace : 'VSpace must be a number.' // MISSING
+		validateWidth : 'Ширина повинна бути числом.',
+		validateHeight : 'Висота повинна бути числом.',
+		validateHSpace : 'HSpace повинна бути числом.',
+		validateVSpace : 'VSpace повинна бути числом.'
 	},
 
@@ -456,7 +456,7 @@
 	{
 		toolbar			: 'Перевірити орфографію',
-		title			: 'Spell Check', // MISSING
-		notAvailable	: 'Sorry, but service is unavailable now.', // MISSING
-		errorLoading	: 'Error loading application service host: %s.', // MISSING
+		title			: 'Перевірка орфографії',
+		notAvailable	: 'Вибачте, але сервіс наразі недоступний.',
+		errorLoading	: 'Помилка завантаження : %s.',
 		notInDic		: 'Не має в словнику',
 		changeTo		: 'Замінити на',
@@ -483,5 +483,5 @@
 	elementsPath :
 	{
-		eleTitle : '%1 element' // MISSING
+		eleTitle : '%1 елемент'
 	},
 
@@ -506,5 +506,5 @@
 		cutError	: 'Настройки безпеки вашого браузера не дозволяють редактору автоматично виконувати операції вирізування. Будь ласка, використовуйте клавіатуру для цього (Ctrl+X).',
 		copyError	: 'Настройки безпеки вашого браузера не дозволяють редактору автоматично виконувати операції копіювання. Будь ласка, використовуйте клавіатуру для цього (Ctrl+C).',
-		pasteMsg	: 'Будь-ласка, вставте з буфера обміну в цю область, користуючись комбінацією клавіш (<STRONG>Ctrl+V</STRONG>) та натисніть <STRONG>OK</STRONG>.',
+		pasteMsg	: 'Будь ласка, вставте з буфера обміну в цю область, користуючись комбінацією клавіш (<STRONG>Ctrl+V</STRONG>) та натисніть <STRONG>OK</STRONG>.',
 		securityMsg	: 'Редактор не може отримати прямий доступ до буферу обміну у зв\'язку з налаштуваннями вашого браузера. Вам потрібно вставити інформацію повторно в це вікно.'
 	},
@@ -539,9 +539,9 @@
 	{
 		label : 'Стиль',
-		voiceLabel : 'Styles', // MISSING
-		panelVoiceLabel : 'Select a style', // MISSING
-		panelTitle1 : 'Block Styles', // MISSING
-		panelTitle2 : 'Inline Styles', // MISSING
-		panelTitle3 : 'Object Styles' // MISSING
+		voiceLabel : 'Стилі',
+		panelVoiceLabel : 'Оберіть стиль',
+		panelTitle1 : 'Block стилі',
+		panelTitle2 : 'Inline стилі',
+		panelTitle3 : 'Object стилі'
 	},
 
@@ -549,7 +549,7 @@
 	{
 		label : 'Форматування',
-		voiceLabel : 'Format', // MISSING
+		voiceLabel : 'Формат',
 		panelTitle : 'Форматування',
-		panelVoiceLabel : 'Select a paragraph format', // MISSING
+		panelVoiceLabel : 'Оберіть формат абзацу',
 
 		tag_p : 'Нормальний',
@@ -568,7 +568,7 @@
 	{
 		label : 'Шрифт',
-		voiceLabel : 'Font', // MISSING
+		voiceLabel : 'Шрифт',
 		panelTitle : 'Шрифт',
-		panelVoiceLabel : 'Select a font' // MISSING
+		panelVoiceLabel : 'Оберіть шрифт'
 	},
 
@@ -576,7 +576,7 @@
 	{
 		label : 'Розмір',
-		voiceLabel : 'Font Size', // MISSING
+		voiceLabel : 'Розмір шрифта',
 		panelTitle : 'Розмір',
-		panelVoiceLabel : 'Select a font size' // MISSING
+		panelVoiceLabel : 'Оберіть розмір шрифта'
 	},
 
@@ -635,39 +635,40 @@
 	scayt :
 	{
-		title : 'Spell Check As You Type', // MISSING
-		enable : 'Enable SCAYT', // MISSING
-		disable : 'Disable SCAYT', // MISSING
-		about : 'About SCAYT', // MISSING
-		toggle : 'Toggle SCAYT', // MISSING
-		options : 'Options', // MISSING
-		langs : 'Languages', // MISSING
-		moreSuggestions : 'More suggestions', // MISSING
-		ignore : 'Ignore', // MISSING
-		ignoreAll : 'Ignore All', // MISSING
-		addWord : 'Add Word', // MISSING
-		emptyDic : 'Dictionary name should not be empty.', // MISSING
-		optionsTab : 'Options', // MISSING
-		languagesTab : 'Languages', // MISSING
-		dictionariesTab : 'Dictionaries', // MISSING
-		aboutTab : 'About' // MISSING
+		title : 'Перефірка орфографії по мірі набору',
+		enable : 'Включити SCAYT',
+		disable : 'Відключити SCAYT',
+		about : 'Про SCAYT',
+		toggle : 'Перемкнути SCAYT',
+		options : 'Опції',
+		langs : 'Мови',
+		moreSuggestions : 'Більше пропозицій',
+		ignore : 'Ігнорувати',
+		ignoreAll : 'Ігнорувати всі',
+		addWord : 'Додати слово',
+		emptyDic : 'Назва словника повинна бути заповнена.',
+		optionsTab : 'Опції',
+		languagesTab : 'Мови',
+		dictionariesTab : 'Словники',
+		aboutTab : 'Про'
 	},
 
 	about :
 	{
-		title : 'About CKEditor', // MISSING
-		moreInfo : 'For licensing information please visit our web site:', // MISSING
-		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
-	},
-
-	maximize : 'Maximize', // MISSING
+		title : 'Про CKEditor',
+		dlgTitle : 'Про CKEditor',
+		moreInfo : 'Щодо інформації з ліцензування завітайте до нашого сайту:',
+		copy : 'Copyright &copy; $1. Всі права застережено.'
+	},
+
+	maximize : 'Максимізувати',
 
 	fakeobjects :
 	{
-		anchor : 'Anchor', // MISSING
-		flash : 'Flash Animation', // MISSING
-		div : 'Page Break', // MISSING
-		unknown : 'Unknown Object' // MISSING
-	},
-
-	resize : 'Drag to resize' // MISSING
+		anchor : 'Якір',
+		flash : 'Flash анімація',
+		div : 'Розрив сторінки',
+		unknown : 'Невідомий об`єкт'
+	},
+
+	resize : 'Пересувайте для зміни розміру'
 };
Index: /CKEditor/branches/versions/3.0.x/_source/lang/vi.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/vi.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/vi.js	(revision 4056)
@@ -32,5 +32,5 @@
 	 * of reading non-English words. So be careful while translating it.
 	 */
-	editorTitle		: 'Rich text editor, %1', // MISSING
+	editorTitle		: 'Trình biên tập trực quan, %1',
 
 	// Toolbar buttons without dialogs.
@@ -91,10 +91,10 @@
 		generalTab		: 'Chung',
 		advancedTab		: 'Mở rộng',
-		validateNumberFailed	: 'This value is not a number.', // MISSING
-		confirmNewPage	: 'Any unsaved changes to this content will be lost. Are you sure you want to load new page?', // MISSING
-		confirmCancel	: 'Some of the options have been changed. Are you sure to close the dialog?', // MISSING
+		validateNumberFailed	: 'Giá trị này không phải là số.',
+		confirmNewPage	: 'Mọi thay đổi không được không được lưu lại của nội dung này sẽ bị mất. Bạn có chắc chắn muốn tải một trang mới?',
+		confirmCancel	: 'Một vài tùy chọn đã bị thay đổi. Bạn có chắc chắn muốn đóng hộp thoại?',
 
 		// Put the voice-only part of the label in the span.
-		unavailable		: '%1<span class="cke_accessibility">, unavailable</span>' // MISSING
+		unavailable		: '%1<span class="cke_accessibility">, không có</span>'
 	},
 
@@ -130,5 +130,5 @@
 		targetPopupName	: 'Tên Cửa sổ Popup',
 		popupFeatures	: 'Đặc điểm của Cửa sổ Popup',
-		popupResizable	: 'Resizable', // MISSING
+		popupResizable	: 'Có thể thay đổi kích cỡ',
 		popupStatusBar	: 'Thanh trạng thái',
 		popupLocationBar	: 'Thanh vị trí',
@@ -142,5 +142,5 @@
 		popupHeight		: 'Cao',
 		popupTop		: 'Vị trí Trên',
-		id				: 'Id', // MISSING
+		id				: 'Định danh',
 		langDir			: 'Đường dẫn Ngôn ngữ',
 		langDirNotSet	: '<không thiết lập>',
@@ -158,5 +158,5 @@
 		selectAnchor	: 'Chọn một Neo',
 		anchorName		: 'Theo Tên Neo',
-		anchorId		: 'Theo Định danh Element',
+		anchorId		: 'Theo Định danh Thành phần',
 		emailAddress	: 'Thư điện tử',
 		emailSubject	: 'Tiêu đề Thông điệp',
@@ -187,8 +187,8 @@
 		notFoundMsg			: 'Không tìm thấy chuỗi cần tìm.',
 		matchCase			: 'Phân biệt chữ hoa/thường',
-		matchWord			: 'Đúng toàn bộ từ',
-		matchCyclic			: 'Match cyclic', // MISSING
+		matchWord			: 'Giống toàn bộ từ',
+		matchCyclic			: 'Giống một phần',
 		replaceAll			: 'Thay thế Tất cả',
-		replaceSuccessMsg	: '%1 occurrence(s) replaced.' // MISSING
+		replaceSuccessMsg	: '%1 vị trí đã được thay thế.'
 	},
 
@@ -216,16 +216,16 @@
 		caption		: 'Đầu đề',
 		summary		: 'Tóm lược',
-		headers		: 'Headers', // MISSING
-		headersNone		: 'None', // MISSING
-		headersColumn	: 'First column', // MISSING
-		headersRow		: 'First Row', // MISSING
-		headersBoth		: 'Both', // MISSING
-		invalidRows		: 'Number of rows must be a number greater than 0.', // MISSING
-		invalidCols		: 'Number of columns must be a number greater than 0.', // MISSING
-		invalidBorder	: 'Border size must be a number.', // MISSING
-		invalidWidth	: 'Table width must be a number.', // MISSING
-		invalidHeight	: 'Table height must be a number.', // MISSING
-		invalidCellSpacing	: 'Cell spacing must be a number.', // MISSING
-		invalidCellPadding	: 'Cell padding must be a number.', // MISSING
+		headers		: 'Đầu đề',
+		headersNone		: 'Không có',
+		headersColumn	: 'Cột Đầu tiên',
+		headersRow		: 'Hàng Đầu tiên',
+		headersBoth		: 'Cả hai',
+		invalidRows		: 'Số lượng hàng phải là một số lớn hơn 0.',
+		invalidCols		: 'Số lượng cột phải là một số lớn hơn 0.',
+		invalidBorder	: 'Kích cỡ của đường biên phải là một số nguyên.',
+		invalidWidth	: 'Chiều rộng của Bảng phải là một số nguyên.',
+		invalidHeight	: 'Chiều cao của Bảng phải là một số nguyên.',
+		invalidCellSpacing	: 'Khoảng cách giữa các ô phải là một số nguyên.',
+		invalidCellPadding	: 'Đệm giữa các ô phải là một số nguyên.',
 
 		cell :
@@ -240,25 +240,25 @@
 			splitHorizontal	: 'Tách ngang Ô',
 			splitVertical	: 'Tách dọc Ô',
-			title			: 'Cell Properties', // MISSING
-			cellType		: 'Cell Type', // MISSING
-			rowSpan			: 'Rows Span', // MISSING
-			colSpan			: 'Columns Span', // MISSING
-			wordWrap		: 'Word Wrap', // MISSING
-			hAlign			: 'Horizontal Alignment', // MISSING
-			vAlign			: 'Vertical Alignment', // MISSING
-			alignTop		: 'Top', // MISSING
-			alignMiddle		: 'Middle', // MISSING
-			alignBottom		: 'Bottom', // MISSING
-			alignBaseline	: 'Baseline', // MISSING
-			bgColor			: 'Background Color', // MISSING
-			borderColor		: 'Border Color', // MISSING
-			data			: 'Data', // MISSING
-			header			: 'Header', // MISSING
-			yes				: 'Yes', // MISSING
-			no				: 'No', // MISSING
-			invalidWidth	: 'Cell width must be a number.', // MISSING
-			invalidHeight	: 'Cell height must be a number.', // MISSING
-			invalidRowSpan	: 'Rows span must be a whole number.', // MISSING
-			invalidColSpan	: 'Columns span must be a whole number.' // MISSING
+			title			: 'Thuộc tính của Ô',
+			cellType		: 'Kiểu của Ô',
+			rowSpan			: 'Kết hợp hàng',
+			colSpan			: 'Kết hợp cột',
+			wordWrap		: 'Word Wrap',
+			hAlign			: 'Canh lề ngang',
+			vAlign			: 'Canh lề dọc',
+			alignTop		: 'Trên cùng',
+			alignMiddle		: 'Chính giữa',
+			alignBottom		: 'Dưới cùng',
+			alignBaseline	: 'Đường cơ sở',
+			bgColor			: 'Màu nền',
+			borderColor		: 'Màu viền',
+			data			: 'Dữ liệu',
+			header			: 'Đầu đề',
+			yes				: 'Có',
+			no				: 'Không',
+			invalidWidth	: 'Chiều rộng của Ô phải là một số nguyên.',
+			invalidHeight	: 'Chiều cao của Ô phải là một số nguyên.',
+			invalidRowSpan	: 'Số hàng kết hợp phải là một số nguyên.',
+			invalidColSpan	: 'Số cột kết hợp phải là một số nguyên.'
 		},
 
@@ -307,5 +307,5 @@
 		action		: 'Hành động',
 		method		: 'Phương thức',
-		encoding	: 'Encoding', // MISSING
+		encoding	: 'Bảng mã',
 		target		: 'Đích',
 		targetNotSet	: '<không thiết lập>',
@@ -396,6 +396,6 @@
 		alertUrl	: 'Hãy đưa vào URL của hình ảnh',
 		linkTab	: 'Liên kết',
-		button2Img	: 'Do you want to transform the selected image button on a simple image?', // MISSING
-		img2Button	: 'Do you want to transform the selected image on a image button?' // MISSING
+		button2Img	: 'Bạn có muốn chuyển nút bấm bằng hình ảnh được chọn thành hình ảnh?',
+		img2Button	: 'Bạn có muốn chuyển đổi hình ảnh được chọn thành nút bấm bằng hình ảnh?'
 	},
 
@@ -404,18 +404,18 @@
 	{
 		properties		: 'Thuộc tính Flash',
-		propertiesTab	: 'Properties', // MISSING
+		propertiesTab	: 'Thuộc tính',
 		title		: 'Thuộc tính Flash',
 		chkPlay		: 'Tự động chạy',
 		chkLoop		: 'Lặp',
 		chkMenu		: 'Cho phép bật Menu của Flash',
-		chkFull		: 'Allow Fullscreen', // MISSING
+		chkFull		: 'Cho phép Toàn màn hình',
  		scale		: 'Tỷ lệ',
 		scaleAll		: 'Hiển thị tất cả',
 		scaleNoBorder	: 'Không đường viền',
 		scaleFit		: 'Vừa vặn',
-		access			: 'Script Access', // MISSING
-		accessAlways	: 'Always', // MISSING
-		accessSameDomain	: 'Same domain', // MISSING
-		accessNever	: 'Never', // MISSING
+		access			: 'Truy cập Mã',
+		accessAlways	: 'Luôn luôn',
+		accessSameDomain	: 'Cùng tên miền',
+		accessNever	: 'Không bao giờ',
 		align		: 'Vị trí',
 		alignLeft	: 'Trái',
@@ -428,16 +428,16 @@
 		alignTextTop	: 'Phía trên chữ',
 		alignTop	: 'Trên',
-		quality		: 'Quality', // MISSING
-		qualityBest		 : 'Best', // MISSING
-		qualityHigh		 : 'High', // MISSING
-		qualityAutoHigh	 : 'Auto High', // MISSING
-		qualityMedium	 : 'Medium', // MISSING
-		qualityAutoLow	 : 'Auto Low', // MISSING
-		qualityLow		 : 'Low', // MISSING
-		windowModeWindow	 : 'Window', // MISSING
-		windowModeOpaque	 : 'Opaque', // MISSING
-		windowModeTransparent	 : 'Transparent', // MISSING
-		windowMode	: 'Window mode', // MISSING
-		flashvars	: 'Variables for Flash', // MISSING
+		quality		: 'Chất lượng',
+		qualityBest		 : 'TỐt nhất',
+		qualityHigh		 : 'Cao',
+		qualityAutoHigh	 : 'Cao Tự động',
+		qualityMedium	 : 'Trung bình',
+		qualityAutoLow	 : 'Thấp Tự động',
+		qualityLow		 : 'Thấp',
+		windowModeWindow	 : 'Cửa sổ',
+		windowModeOpaque	 : 'Mờ đục',
+		windowModeTransparent	 : 'Trong suốt',
+		windowMode	: 'Chế độ Cửa sổ',
+		flashvars	: 'Các biến số dành cho Flash',
 		bgcolor	: 'Màu nền',
 		width	: 'Rộng',
@@ -446,8 +446,8 @@
 		vSpace	: 'VSpace',
 		validateSrc : 'Hãy đưa vào Liên kết URL',
-		validateWidth : 'Width must be a number.', // MISSING
-		validateHeight : 'Height must be a number.', // MISSING
-		validateHSpace : 'HSpace must be a number.', // MISSING
-		validateVSpace : 'VSpace must be a number.' // MISSING
+		validateWidth : 'Chiều rộng phải là số nguyên.',
+		validateHeight : 'Chiều cao phải là số nguyên.',
+		validateHSpace : 'HSpace phải là số nguyên.',
+		validateVSpace : 'VSpace phải là số nguyên.'
 	},
 
@@ -456,7 +456,7 @@
 	{
 		toolbar			: 'Kiểm tra Chính tả',
-		title			: 'Spell Check', // MISSING
-		notAvailable	: 'Sorry, but service is unavailable now.', // MISSING
-		errorLoading	: 'Error loading application service host: %s.', // MISSING
+		title			: 'Kiểm tra Chính tả',
+		notAvailable	: 'Xin lỗi, dịch vụ này hiện tại không có.',
+		errorLoading	: 'Lỗi khi đang nạp dịch vụ ứng dụng: %s.',
 		notInDic		: 'Không có trong từ điển',
 		changeTo		: 'Chuyển thành',
@@ -483,5 +483,5 @@
 	elementsPath :
 	{
-		eleTitle : '%1 element' // MISSING
+		eleTitle : '%1 thành phần'
 	},
 
@@ -507,5 +507,5 @@
 		copyError	: 'Các thiết lập bảo mật của trình duyệt không cho phép trình biên tập tự động thực thi lệnh sao chép. Hãy sử dụng bàn phím cho lệnh này (Ctrl+C).',
 		pasteMsg	: 'Hãy dán nội dung vào trong khung bên dưới, sử dụng tổ hợp phím (<STRONG>Ctrl+V</STRONG>) và nhấn vào nút <STRONG>Đồng ý</STRONG>.',
-		securityMsg	: '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
+		securityMsg	: 'Do thiết lập bảo mật của trình duyệt nên trình biên tập không thể truy cập trực tiếp vào nội dung đã sao chép. Bạn cần phải dán lại nội dung vào cửa sổ này.'
 	},
 
@@ -538,10 +538,10 @@
 	stylesCombo :
 	{
-		label : 'Mẫu',
-		voiceLabel : 'Styles', // MISSING
-		panelVoiceLabel : 'Select a style', // MISSING
-		panelTitle1 : 'Block Styles', // MISSING
-		panelTitle2 : 'Inline Styles', // MISSING
-		panelTitle3 : 'Object Styles' // MISSING
+		label : 'Kiểu',
+		voiceLabel : 'Kiểu',
+		panelVoiceLabel : 'Chọn một kiểu',
+		panelTitle1 : 'Kiểu Khối',
+		panelTitle2 : 'Kiểu Trực tiếp',
+		panelTitle3 : 'Kiểu Đối tượng'
 	},
 
@@ -549,7 +549,7 @@
 	{
 		label : 'Định dạng',
-		voiceLabel : 'Format', // MISSING
+		voiceLabel : 'Định dạng',
 		panelTitle : 'Định dạng',
-		panelVoiceLabel : 'Select a paragraph format', // MISSING
+		panelVoiceLabel : 'Chọn định dạng đoạn văn bản',
 
 		tag_p : 'Normal',
@@ -568,7 +568,7 @@
 	{
 		label : 'Phông',
-		voiceLabel : 'Font', // MISSING
+		voiceLabel : 'Phông',
 		panelTitle : 'Phông',
-		panelVoiceLabel : 'Select a font' // MISSING
+		panelVoiceLabel : 'Chọn phông'
 	},
 
@@ -576,7 +576,7 @@
 	{
 		label : 'Cỡ chữ',
-		voiceLabel : 'Font Size', // MISSING
+		voiceLabel : 'Kích cỡ phông',
 		panelTitle : 'Cỡ chữ',
-		panelVoiceLabel : 'Select a font size' // MISSING
+		panelVoiceLabel : 'Chọn kích cỡ phông'
 	},
 
@@ -635,39 +635,40 @@
 	scayt :
 	{
-		title : 'Spell Check As You Type', // MISSING
-		enable : 'Enable SCAYT', // MISSING
-		disable : 'Disable SCAYT', // MISSING
-		about : 'About SCAYT', // MISSING
-		toggle : 'Toggle SCAYT', // MISSING
-		options : 'Options', // MISSING
-		langs : 'Languages', // MISSING
-		moreSuggestions : 'More suggestions', // MISSING
-		ignore : 'Ignore', // MISSING
-		ignoreAll : 'Ignore All', // MISSING
-		addWord : 'Add Word', // MISSING
-		emptyDic : 'Dictionary name should not be empty.', // MISSING
-		optionsTab : 'Options', // MISSING
-		languagesTab : 'Languages', // MISSING
-		dictionariesTab : 'Dictionaries', // MISSING
-		aboutTab : 'About' // MISSING
+		title : 'Kiểm tra chính tả ngay khi gõ chữ (SCAYT)',
+		enable : 'Bật SCAYT',
+		disable : 'Tắt SCAYT',
+		about : 'Thông tin về SCAYT',
+		toggle : 'Bật tắt SCAYT',
+		options : 'Tùy chọn',
+		langs : 'Ngôn ngữ',
+		moreSuggestions : 'Đề xuất thêm',
+		ignore : 'Bỏ qua',
+		ignoreAll : 'Bỏ qua Tất cả',
+		addWord : 'Thêm Từ',
+		emptyDic : 'Tên của từ điển không được để trống.',
+		optionsTab : 'Tùy chọn',
+		languagesTab : 'Ngôn ngữ',
+		dictionariesTab : 'Từ điển',
+		aboutTab : 'Thông tin'
 	},
 
 	about :
 	{
-		title : 'About CKEditor', // MISSING
-		moreInfo : 'For licensing information please visit our web site:', // MISSING
-		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
-	},
-
-	maximize : 'Maximize', // MISSING
+		title : 'Thông tin về CKEditor',
+		dlgTitle : 'Thông tin về CKEditor',
+		moreInfo : 'Vui lòng ghé thăm trang web của chúng tôi để có thông tin về giấy phép:',
+		copy : 'Bản quyền &copy; $1. Giữ toàn quyền.'
+	},
+
+	maximize : 'Phóng to tối đa',
 
 	fakeobjects :
 	{
-		anchor : 'Anchor', // MISSING
-		flash : 'Flash Animation', // MISSING
-		div : 'Page Break', // MISSING
-		unknown : 'Unknown Object' // MISSING
-	},
-
-	resize : 'Drag to resize' // MISSING
+		anchor : 'Neo',
+		flash : 'Hoạt họa Flash',
+		div : 'Ngắt Trang',
+		unknown : 'Đối tượng không rõ ràng'
+	},
+
+	resize : 'Kéo rê để thay đổi kích cỡ'
 };
Index: /CKEditor/branches/versions/3.0.x/_source/lang/zh-cn.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/zh-cn.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/zh-cn.js	(revision 4056)
@@ -32,8 +32,8 @@
 	 * of reading non-English words. So be careful while translating it.
 	 */
-	editorTitle		: 'Rich text editor, %1', // MISSING
+	editorTitle		: '富文本编辑器, %1',
 
 	// Toolbar buttons without dialogs.
-	source			: '源代码',
+	source			: '源码',
 	newPage			: '新建',
 	save			: '保存',
@@ -91,10 +91,10 @@
 		generalTab		: '常规',
 		advancedTab		: '高级',
-		validateNumberFailed	: 'This value is not a number.', // MISSING
-		confirmNewPage	: 'Any unsaved changes to this content will be lost. Are you sure you want to load new page?', // MISSING
-		confirmCancel	: 'Some of the options have been changed. Are you sure to close the dialog?', // MISSING
+		validateNumberFailed	: '需要输入数字格式',
+		confirmNewPage	: '当前文档内容未保存,是否确认新建文档？',
+		confirmCancel	: '部分选项尚未保存，是否确认关闭对话框？',
 
 		// Put the voice-only part of the label in the span.
-		unavailable		: '%1<span class="cke_accessibility">, unavailable</span>' // MISSING
+		unavailable		: '%1<span class="cke_accessibility">, 不可用</span>'
 	},
 
@@ -130,5 +130,5 @@
 		targetPopupName	: '弹出窗口名称',
 		popupFeatures	: '弹出窗口属性',
-		popupResizable	: 'Resizable', // MISSING
+		popupResizable	: '可缩放',
 		popupStatusBar	: '状态栏',
 		popupLocationBar	: '地址栏',
@@ -142,5 +142,5 @@
 		popupHeight		: '高',
 		popupTop		: '右',
-		id				: 'Id', // MISSING
+		id				: 'ID',
 		langDir			: '语言方向',
 		langDirNotSet	: '<没有设置>',
@@ -185,10 +185,10 @@
 		findWhat			: '查找:',
 		replaceWith			: '替换:',
-		notFoundMsg			: '指定文本没有找到。',
+		notFoundMsg			: '指定文本没有找到',
 		matchCase			: '区分大小写',
 		matchWord			: '全字匹配',
-		matchCyclic			: 'Match cyclic', // MISSING
+		matchCyclic			: '循环匹配',
 		replaceAll			: '全部替换',
-		replaceSuccessMsg	: '%1 occurrence(s) replaced.' // MISSING
+		replaceSuccessMsg	: '共完成 %1 处替换.'
 	},
 
@@ -221,11 +221,11 @@
 		headersRow		: '第一行',
 		headersBoth		: '第一列和第一行',
-		invalidRows		: 'Number of rows must be a number greater than 0.', // MISSING
-		invalidCols		: 'Number of columns must be a number greater than 0.', // MISSING
-		invalidBorder	: 'Border size must be a number.', // MISSING
-		invalidWidth	: 'Table width must be a number.', // MISSING
-		invalidHeight	: 'Table height must be a number.', // MISSING
-		invalidCellSpacing	: 'Cell spacing must be a number.', // MISSING
-		invalidCellPadding	: 'Cell padding must be a number.', // MISSING
+		invalidRows		: '指定的列数必须大于零',
+		invalidCols		: '指定的行数必须大于零',
+		invalidBorder	: '边框粗细必须为数字格式',
+		invalidWidth	: '表格宽度必须为数字格式',
+		invalidHeight	: '表格高度必须为数字格式',
+		invalidCellSpacing	: '单元格间距必须为数字格式',
+		invalidCellPadding	: '单元格填充必须为数字格式',
 
 		cell :
@@ -240,25 +240,25 @@
 			splitHorizontal	: '水平拆分单元格',
 			splitVertical	: '垂直拆分单元格',
-			title			: 'Cell Properties', // MISSING
-			cellType		: 'Cell Type', // MISSING
-			rowSpan			: 'Rows Span', // MISSING
-			colSpan			: 'Columns Span', // MISSING
-			wordWrap		: 'Word Wrap', // MISSING
-			hAlign			: 'Horizontal Alignment', // MISSING
-			vAlign			: 'Vertical Alignment', // MISSING
-			alignTop		: 'Top', // MISSING
-			alignMiddle		: 'Middle', // MISSING
-			alignBottom		: 'Bottom', // MISSING
-			alignBaseline	: 'Baseline', // MISSING
-			bgColor			: 'Background Color', // MISSING
-			borderColor		: 'Border Color', // MISSING
-			data			: 'Data', // MISSING
-			header			: 'Header', // MISSING
-			yes				: 'Yes', // MISSING
-			no				: 'No', // MISSING
-			invalidWidth	: 'Cell width must be a number.', // MISSING
-			invalidHeight	: 'Cell height must be a number.', // MISSING
-			invalidRowSpan	: 'Rows span must be a whole number.', // MISSING
-			invalidColSpan	: 'Columns span must be a whole number.' // MISSING
+			title			: '单元格属性',
+			cellType		: '单元格类型',
+			rowSpan			: '行跨度',
+			colSpan			: '列跨度',
+			wordWrap		: '自动换行',
+			hAlign			: '水平对齐',
+			vAlign			: '垂直对齐',
+			alignTop		: '顶对齐',
+			alignMiddle		: '中对齐',
+			alignBottom		: '底对齐',
+			alignBaseline	: '基线对齐',
+			bgColor			: '背景颜色',
+			borderColor		: '边框颜色',
+			data			: '数据',
+			header			: '表头',
+			yes				: '是',
+			no				: '否',
+			invalidWidth	: '单元格宽度必须为数字格式',
+			invalidHeight	: '单元格高度必须为数字格式',
+			invalidRowSpan	: '行跨度必须为整数格式',
+			invalidColSpan	: '列跨度必须为整数格式'
 		},
 
@@ -307,5 +307,5 @@
 		action		: '动作',
 		method		: '方法',
-		encoding	: 'Encoding', // MISSING
+		encoding	: '表单编码',
 		target		: '目标',
 		targetNotSet	: '<没有设置>',
@@ -396,6 +396,6 @@
 		alertUrl	: '请输入图象地址',
 		linkTab	: '链接',
-		button2Img	: 'Do you want to transform the selected image button on a simple image?', // MISSING
-		img2Button	: 'Do you want to transform the selected image on a image button?' // MISSING
+		button2Img	: '确定要把当前按钮改变为图像吗?',
+		img2Button	: '确定要把当前图像改变为按钮吗?'
 	},
 
@@ -404,18 +404,18 @@
 	{
 		properties		: 'Flash 属性',
-		propertiesTab	: 'Properties', // MISSING
-		title		: 'Flash 属性',
+		propertiesTab	: '属性',
+		title		: '标题',
 		chkPlay		: '自动播放',
 		chkLoop		: '循环',
 		chkMenu		: '启用 Flash 菜单',
-		chkFull		: 'Allow Fullscreen', // MISSING
+		chkFull		: '启用全屏',
  		scale		: '缩放',
 		scaleAll		: '全部显示',
 		scaleNoBorder	: '无边框',
 		scaleFit		: '严格匹配',
-		access			: 'Script Access', // MISSING
-		accessAlways	: 'Always', // MISSING
-		accessSameDomain	: 'Same domain', // MISSING
-		accessNever	: 'Never', // MISSING
+		access			: '允许脚本访问',
+		accessAlways	: '总是',
+		accessSameDomain	: '同域',
+		accessNever	: '从不',
 		align		: '对齐方式',
 		alignLeft	: '左对齐',
@@ -428,16 +428,16 @@
 		alignTextTop	: '文本上方',
 		alignTop	: '顶端',
-		quality		: 'Quality', // MISSING
-		qualityBest		 : 'Best', // MISSING
-		qualityHigh		 : 'High', // MISSING
-		qualityAutoHigh	 : 'Auto High', // MISSING
-		qualityMedium	 : 'Medium', // MISSING
-		qualityAutoLow	 : 'Auto Low', // MISSING
-		qualityLow		 : 'Low', // MISSING
-		windowModeWindow	 : 'Window', // MISSING
-		windowModeOpaque	 : 'Opaque', // MISSING
-		windowModeTransparent	 : 'Transparent', // MISSING
-		windowMode	: 'Window mode', // MISSING
-		flashvars	: 'Variables for Flash', // MISSING
+		quality		: '质量',
+		qualityBest		 : '最好',
+		qualityHigh		 : '高',
+		qualityAutoHigh	 : '高（自动）',
+		qualityMedium	 : '中（自动）',
+		qualityAutoLow	 : '低（自动）',
+		qualityLow		 : '低',
+		windowModeWindow	 : '窗体',
+		windowModeOpaque	 : '不透明',
+		windowModeTransparent	 : '透明',
+		windowMode	: '窗体模式',
+		flashvars	: 'Flash变量',
 		bgcolor	: '背景颜色',
 		width	: '宽度',
@@ -446,8 +446,8 @@
 		vSpace	: '垂直间距',
 		validateSrc : '请输入超链接地址',
-		validateWidth : 'Width must be a number.', // MISSING
-		validateHeight : 'Height must be a number.', // MISSING
-		validateHSpace : 'HSpace must be a number.', // MISSING
-		validateVSpace : 'VSpace must be a number.' // MISSING
+		validateWidth : '宽度必须为数字格式',
+		validateHeight : '高度必须为数字格式',
+		validateHSpace : '水平间距必须为数字格式',
+		validateVSpace : '垂直间距必须为数字格式'
 	},
 
@@ -456,7 +456,7 @@
 	{
 		toolbar			: '拼写检查',
-		title			: 'Spell Check', // MISSING
-		notAvailable	: 'Sorry, but service is unavailable now.', // MISSING
-		errorLoading	: 'Error loading application service host: %s.', // MISSING
+		title			: '拼写检查',
+		notAvailable	: '抱歉，服务目前暂不可用',
+		errorLoading	: '无法联系该应用的主机: %s.',
 		notInDic		: '没有在字典里',
 		changeTo		: '更改为',
@@ -483,5 +483,5 @@
 	elementsPath :
 	{
-		eleTitle : '%1 element' // MISSING
+		eleTitle : '%1 元素'
 	},
 
@@ -504,8 +504,8 @@
 	{
 		title		: '粘贴',
-		cutError	: '您的浏览器安全设置不允许编辑器自动执行剪切操作，请使用键盘快捷键(Ctrl+X)来完成。',
-		copyError	: '您的浏览器安全设置不允许编辑器自动执行复制操作，请使用键盘快捷键(Ctrl+C)来完成。',
-		pasteMsg	: '请使用键盘快捷键(<STRONG>Ctrl+V</STRONG>)把内容粘贴到下面的方框里，再按 <STRONG>确定</STRONG>。',
-		securityMsg	: '因为你的浏览器的安全设置原因，本编辑器不能直接访问你的剪贴板内容，你需要在本窗口重新粘贴一次。'
+		cutError	: '您的浏览器安全设置不允许编辑器自动执行剪切操作，请使用键盘快捷键(Ctrl+X)来完成',
+		copyError	: '您的浏览器安全设置不允许编辑器自动执行复制操作，请使用键盘快捷键(Ctrl+C)来完成',
+		pasteMsg	: '请使用键盘快捷键(<STRONG>Ctrl+V</STRONG>)把内容粘贴到下面的方框里，再按 <STRONG>确定</STRONG>',
+		securityMsg	: '因为你的浏览器的安全设置原因，本编辑器不能直接访问你的剪贴板内容，你需要在本窗口重新粘贴一次'
 	},
 
@@ -514,5 +514,5 @@
 		toolbar : '从 MS Word 粘贴',
 		title : '从 MS Word 粘贴',
-		advice : '请使用键盘快捷键(<STRONG>Ctrl+V</STRONG>)把内容粘贴到下面的方框里，再按 <STRONG>确定</STRONG>。',
+		advice : '请使用键盘快捷键(<STRONG>Ctrl+V</STRONG>)把内容粘贴到下面的方框里，再按 <STRONG>确定</STRONG>',
 		ignoreFontFace : '忽略 Font 标签',
 		removeStyle : '清理 CSS 样式'
@@ -539,9 +539,9 @@
 	{
 		label : '样式',
-		voiceLabel : 'Styles', // MISSING
-		panelVoiceLabel : 'Select a style', // MISSING
-		panelTitle1 : 'Block Styles', // MISSING
-		panelTitle2 : 'Inline Styles', // MISSING
-		panelTitle3 : 'Object Styles' // MISSING
+		voiceLabel : '样式',
+		panelVoiceLabel : '选择样式',
+		panelTitle1 : '块级元素样式',
+		panelTitle2 : '内联元素样式',
+		panelTitle3 : '对象元素样式'
 	},
 
@@ -549,7 +549,7 @@
 	{
 		label : '格式',
-		voiceLabel : 'Format', // MISSING
+		voiceLabel : '格式',
 		panelTitle : '格式',
-		panelVoiceLabel : 'Select a paragraph format', // MISSING
+		panelVoiceLabel : '选择格式',
 
 		tag_p : '普通',
@@ -568,7 +568,7 @@
 	{
 		label : '字体',
-		voiceLabel : 'Font', // MISSING
+		voiceLabel : '字体',
 		panelTitle : '字体',
-		panelVoiceLabel : 'Select a font' // MISSING
+		panelVoiceLabel : '选择字体'
 	},
 
@@ -576,7 +576,7 @@
 	{
 		label : '大小',
-		voiceLabel : 'Font Size', // MISSING
+		voiceLabel : '文字大小',
 		panelTitle : '大小',
-		panelVoiceLabel : 'Select a font size' // MISSING
+		panelVoiceLabel : '选择文字大小'
 	},
 
@@ -635,39 +635,40 @@
 	scayt :
 	{
-		title : 'Spell Check As You Type', // MISSING
-		enable : 'Enable SCAYT', // MISSING
-		disable : 'Disable SCAYT', // MISSING
-		about : 'About SCAYT', // MISSING
-		toggle : 'Toggle SCAYT', // MISSING
-		options : 'Options', // MISSING
-		langs : 'Languages', // MISSING
-		moreSuggestions : 'More suggestions', // MISSING
-		ignore : 'Ignore', // MISSING
-		ignoreAll : 'Ignore All', // MISSING
-		addWord : 'Add Word', // MISSING
-		emptyDic : 'Dictionary name should not be empty.', // MISSING
-		optionsTab : 'Options', // MISSING
-		languagesTab : 'Languages', // MISSING
-		dictionariesTab : 'Dictionaries', // MISSING
-		aboutTab : 'About' // MISSING
+		title : '即时拼写检查',
+		enable : '启用即时拼写检查',
+		disable : '禁用即时拼写检查',
+		about : '关于即时拼写检查',
+		toggle : '暂停/启用即时拼写检查',
+		options : '选项',
+		langs : '语言',
+		moreSuggestions : '更多拼写建议',
+		ignore : '忽略',
+		ignoreAll : '全部忽略',
+		addWord : '添加单词',
+		emptyDic : '字典名不应为空.',
+		optionsTab : '选项',
+		languagesTab : '语言',
+		dictionariesTab : '字典',
+		aboutTab : '关于'
 	},
 
 	about :
 	{
-		title : 'About CKEditor', // MISSING
-		moreInfo : 'For licensing information please visit our web site:', // MISSING
-		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
-	},
-
-	maximize : 'Maximize', // MISSING
+		title : '关于CKEditor',
+		dlgTitle : '关于CKEditor',
+		moreInfo : '访问我们的网站以获取更多关于协议的信息',
+		copy : 'Copyright &copy; $1. All rights reserved.'
+	},
+
+	maximize : '全屏',
 
 	fakeobjects :
 	{
-		anchor : 'Anchor', // MISSING
-		flash : 'Flash Animation', // MISSING
-		div : 'Page Break', // MISSING
-		unknown : 'Unknown Object' // MISSING
-	},
-
-	resize : 'Drag to resize' // MISSING
+		anchor : '锚点',
+		flash : 'Flash',
+		div : '分页',
+		unknown : '位置对象'
+	},
+
+	resize : '拖拽以改变尺寸'
 };
Index: /CKEditor/branches/versions/3.0.x/_source/lang/zh.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/lang/zh.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/lang/zh.js	(revision 4056)
@@ -32,5 +32,5 @@
 	 * of reading non-English words. So be careful while translating it.
 	 */
-	editorTitle		: 'Rich text editor, %1', // MISSING
+	editorTitle		: '文書處理器, %1',
 
 	// Toolbar buttons without dialogs.
@@ -91,10 +91,10 @@
 		generalTab		: '一般',
 		advancedTab		: '進階',
-		validateNumberFailed	: 'This value is not a number.', // MISSING
-		confirmNewPage	: 'Any unsaved changes to this content will be lost. Are you sure you want to load new page?', // MISSING
-		confirmCancel	: 'Some of the options have been changed. Are you sure to close the dialog?', // MISSING
+		validateNumberFailed	: '需要輸入數字格式',
+		confirmNewPage	: '現存的修改尚未儲存，要開新檔案？',
+		confirmCancel	: '部份選項尚未儲存，要關閉對話盒？',
 
 		// Put the voice-only part of the label in the span.
-		unavailable		: '%1<span class="cke_accessibility">, unavailable</span>' // MISSING
+		unavailable		: '%1<span class="cke_accessibility">, 已關閉</span>'
 	},
 
@@ -130,5 +130,5 @@
 		targetPopupName	: '快顯視窗名稱',
 		popupFeatures	: '快顯視窗屬性',
-		popupResizable	: 'Resizable', // MISSING
+		popupResizable	: '可縮放',
 		popupStatusBar	: '狀態列',
 		popupLocationBar	: '網址列',
@@ -142,5 +142,5 @@
 		popupHeight		: '高',
 		popupTop		: '右',
-		id				: 'Id', // MISSING
+		id				: 'ID',
 		langDir			: '語言方向',
 		langDirNotSet	: '<尚未設定>',
@@ -188,7 +188,7 @@
 		matchCase			: '大小寫須相符',
 		matchWord			: '全字相符',
-		matchCyclic			: 'Match cyclic', // MISSING
+		matchCyclic			: '循環搜索',
 		replaceAll			: '全部取代',
-		replaceSuccessMsg	: '%1 occurrence(s) replaced.' // MISSING
+		replaceSuccessMsg	: '共完成 %1 次取代'
 	},
 
@@ -216,16 +216,16 @@
 		caption		: '標題',
 		summary		: '摘要',
-		headers		: 'Headers', // MISSING
-		headersNone		: 'None', // MISSING
-		headersColumn	: 'First column', // MISSING
-		headersRow		: 'First Row', // MISSING
-		headersBoth		: 'Both', // MISSING
-		invalidRows		: 'Number of rows must be a number greater than 0.', // MISSING
-		invalidCols		: 'Number of columns must be a number greater than 0.', // MISSING
-		invalidBorder	: 'Border size must be a number.', // MISSING
-		invalidWidth	: 'Table width must be a number.', // MISSING
-		invalidHeight	: 'Table height must be a number.', // MISSING
-		invalidCellSpacing	: 'Cell spacing must be a number.', // MISSING
-		invalidCellPadding	: 'Cell padding must be a number.', // MISSING
+		headers		: '標題',
+		headersNone		: '無標題',
+		headersColumn	: '第一欄',
+		headersRow		: '第一列',
+		headersBoth		: '第一欄和第一列',
+		invalidRows		: '必須有一或更多的列',
+		invalidCols		: '必須有一或更多的欄',
+		invalidBorder	: '邊框大小必須為數字格式',
+		invalidWidth	: '表格寬度必須為數字格式',
+		invalidHeight	: '表格高度必須為數字格式',
+		invalidCellSpacing	: '儲存格間距必須為數字格式',
+		invalidCellPadding	: '儲存格內距必須為數字格式',
 
 		cell :
@@ -240,25 +240,25 @@
 			splitHorizontal	: '橫向分割儲存格',
 			splitVertical	: '縱向分割儲存格',
-			title			: 'Cell Properties', // MISSING
-			cellType		: 'Cell Type', // MISSING
-			rowSpan			: 'Rows Span', // MISSING
-			colSpan			: 'Columns Span', // MISSING
-			wordWrap		: 'Word Wrap', // MISSING
-			hAlign			: 'Horizontal Alignment', // MISSING
-			vAlign			: 'Vertical Alignment', // MISSING
-			alignTop		: 'Top', // MISSING
-			alignMiddle		: 'Middle', // MISSING
-			alignBottom		: 'Bottom', // MISSING
-			alignBaseline	: 'Baseline', // MISSING
-			bgColor			: 'Background Color', // MISSING
-			borderColor		: 'Border Color', // MISSING
-			data			: 'Data', // MISSING
-			header			: 'Header', // MISSING
-			yes				: 'Yes', // MISSING
-			no				: 'No', // MISSING
-			invalidWidth	: 'Cell width must be a number.', // MISSING
-			invalidHeight	: 'Cell height must be a number.', // MISSING
-			invalidRowSpan	: 'Rows span must be a whole number.', // MISSING
-			invalidColSpan	: 'Columns span must be a whole number.' // MISSING
+			title			: '儲存格屬性',
+			cellType		: '儲存格類別',
+			rowSpan			: '儲存格列數',
+			colSpan			: '儲存格欄數',
+			wordWrap		: '自動換行',
+			hAlign			: '水平對齊',
+			vAlign			: '垂直對齊',
+			alignTop		: '向上對齊',
+			alignMiddle		: '置中對齊',
+			alignBottom		: '向下對齊',
+			alignBaseline	: '基線對齊',
+			bgColor			: '背景顏色',
+			borderColor		: '邊框顏色',
+			data			: '數據',
+			header			: '標題',
+			yes				: '是',
+			no				: '否',
+			invalidWidth	: '儲存格寬度必須為數字格式',
+			invalidHeight	: '儲存格高度必須為數字格式',
+			invalidRowSpan	: '儲存格列數必須為整數格式',
+			invalidColSpan	: '儲存格欄數度必須為整數格式'
 		},
 
@@ -307,5 +307,5 @@
 		action		: '動作',
 		method		: '方法',
-		encoding	: 'Encoding', // MISSING
+		encoding	: '表單編碼',
 		target		: '目標',
 		targetNotSet	: '<尚未設定>',
@@ -396,6 +396,6 @@
 		alertUrl	: '請輸入影像 URL',
 		linkTab	: '超連結',
-		button2Img	: 'Do you want to transform the selected image button on a simple image?', // MISSING
-		img2Button	: 'Do you want to transform the selected image on a image button?' // MISSING
+		button2Img	: '要把影像按鈕改成影像嗎？',
+		img2Button	: '要把影像改成影像按鈕嗎？'
 	},
 
@@ -404,18 +404,18 @@
 	{
 		properties		: 'Flash 屬性',
-		propertiesTab	: 'Properties', // MISSING
+		propertiesTab	: '屬性',
 		title		: 'Flash 屬性',
 		chkPlay		: '自動播放',
 		chkLoop		: '重複',
 		chkMenu		: '開啟選單',
-		chkFull		: 'Allow Fullscreen', // MISSING
+		chkFull		: '啟動全螢幕顯示',
  		scale		: '縮放',
 		scaleAll		: '全部顯示',
 		scaleNoBorder	: '無邊框',
 		scaleFit		: '精確符合',
-		access			: 'Script Access', // MISSING
-		accessAlways	: 'Always', // MISSING
-		accessSameDomain	: 'Same domain', // MISSING
-		accessNever	: 'Never', // MISSING
+		access			: '允許腳本訪問',
+		accessAlways	: '永遠',
+		accessSameDomain	: '相同域名',
+		accessNever	: '永不',
 		align		: '對齊',
 		alignLeft	: '靠左對齊',
@@ -428,16 +428,16 @@
 		alignTextTop	: '文字上方',
 		alignTop	: '靠上對齊',
-		quality		: 'Quality', // MISSING
-		qualityBest		 : 'Best', // MISSING
-		qualityHigh		 : 'High', // MISSING
-		qualityAutoHigh	 : 'Auto High', // MISSING
-		qualityMedium	 : 'Medium', // MISSING
-		qualityAutoLow	 : 'Auto Low', // MISSING
-		qualityLow		 : 'Low', // MISSING
-		windowModeWindow	 : 'Window', // MISSING
-		windowModeOpaque	 : 'Opaque', // MISSING
-		windowModeTransparent	 : 'Transparent', // MISSING
-		windowMode	: 'Window mode', // MISSING
-		flashvars	: 'Variables for Flash', // MISSING
+		quality		: '質素',
+		qualityBest		 : '最好',
+		qualityHigh		 : '高',
+		qualityAutoHigh	 : '高（自動）',
+		qualityMedium	 : '中（自動）',
+		qualityAutoLow	 : '低（自動）',
+		qualityLow		 : '低',
+		windowModeWindow	 : '視窗',
+		windowModeOpaque	 : '不透明',
+		windowModeTransparent	 : '透明',
+		windowMode	: '視窗模式',
+		flashvars	: 'Flash 變數',
 		bgcolor	: '背景顏色',
 		width	: '寬度',
@@ -446,8 +446,8 @@
 		vSpace	: '垂直距離',
 		validateSrc : '請輸入欲連結的 URL',
-		validateWidth : 'Width must be a number.', // MISSING
-		validateHeight : 'Height must be a number.', // MISSING
-		validateHSpace : 'HSpace must be a number.', // MISSING
-		validateVSpace : 'VSpace must be a number.' // MISSING
+		validateWidth : '寬度必須為數字格式',
+		validateHeight : '高度必須為數字格式',
+		validateHSpace : '水平間距必須為數字格式',
+		validateVSpace : '垂直間距必須為數字格式'
 	},
 
@@ -456,7 +456,7 @@
 	{
 		toolbar			: '拼字檢查',
-		title			: 'Spell Check', // MISSING
-		notAvailable	: 'Sorry, but service is unavailable now.', // MISSING
-		errorLoading	: 'Error loading application service host: %s.', // MISSING
+		title			: '拼字檢查',
+		notAvailable	: '抱歉，服務目前暫不可用',
+		errorLoading	: '無法聯系侍服器: %s.',
 		notInDic		: '不在字典中',
 		changeTo		: '更改為',
@@ -483,5 +483,5 @@
 	elementsPath :
 	{
-		eleTitle : '%1 element' // MISSING
+		eleTitle : '%1 元素'
 	},
 
@@ -539,9 +539,9 @@
 	{
 		label : '樣式',
-		voiceLabel : 'Styles', // MISSING
-		panelVoiceLabel : 'Select a style', // MISSING
-		panelTitle1 : 'Block Styles', // MISSING
-		panelTitle2 : 'Inline Styles', // MISSING
-		panelTitle3 : 'Object Styles' // MISSING
+		voiceLabel : '樣式',
+		panelVoiceLabel : '選擇樣式',
+		panelTitle1 : '塊級元素樣式',
+		panelTitle2 : '內聯元素樣式',
+		panelTitle3 : '物件元素樣式'
 	},
 
@@ -549,7 +549,7 @@
 	{
 		label : '格式',
-		voiceLabel : 'Format', // MISSING
+		voiceLabel : '格式',
 		panelTitle : '格式',
-		panelVoiceLabel : 'Select a paragraph format', // MISSING
+		panelVoiceLabel : '選擇段落格式',
 
 		tag_p : '一般',
@@ -568,7 +568,7 @@
 	{
 		label : '字體',
-		voiceLabel : 'Font', // MISSING
+		voiceLabel : '字體',
 		panelTitle : '字體',
-		panelVoiceLabel : 'Select a font' // MISSING
+		panelVoiceLabel : '選擇字體'
 	},
 
@@ -576,7 +576,7 @@
 	{
 		label : '大小',
-		voiceLabel : 'Font Size', // MISSING
+		voiceLabel : '文字大小',
 		panelTitle : '大小',
-		panelVoiceLabel : 'Select a font size' // MISSING
+		panelVoiceLabel : '選擇文字大小'
 	},
 
@@ -635,39 +635,40 @@
 	scayt :
 	{
-		title : 'Spell Check As You Type', // MISSING
-		enable : 'Enable SCAYT', // MISSING
-		disable : 'Disable SCAYT', // MISSING
-		about : 'About SCAYT', // MISSING
-		toggle : 'Toggle SCAYT', // MISSING
-		options : 'Options', // MISSING
-		langs : 'Languages', // MISSING
-		moreSuggestions : 'More suggestions', // MISSING
-		ignore : 'Ignore', // MISSING
-		ignoreAll : 'Ignore All', // MISSING
-		addWord : 'Add Word', // MISSING
-		emptyDic : 'Dictionary name should not be empty.', // MISSING
-		optionsTab : 'Options', // MISSING
-		languagesTab : 'Languages', // MISSING
-		dictionariesTab : 'Dictionaries', // MISSING
-		aboutTab : 'About' // MISSING
+		title : '即時拼寫檢查',
+		enable : '啟用即時拼寫檢查',
+		disable : '關閉即時拼寫檢查',
+		about : '關於即時拼寫檢查',
+		toggle : '啟用／關閉即時拼寫檢查',
+		options : '選項',
+		langs : '語言',
+		moreSuggestions : '更多拼寫建議',
+		ignore : '忽略',
+		ignoreAll : '全部忽略',
+		addWord : '添加單詞',
+		emptyDic : '字典名不應為空.',
+		optionsTab : '選項',
+		languagesTab : '語言',
+		dictionariesTab : '字典',
+		aboutTab : '關於'
 	},
 
 	about :
 	{
-		title : 'About CKEditor', // MISSING
-		moreInfo : 'For licensing information please visit our web site:', // MISSING
-		copy : 'Copyright &copy; $1. All rights reserved.' // MISSING
-	},
-
-	maximize : 'Maximize', // MISSING
+		title : '關於 CKEditor',
+		dlgTitle : '關於 CKEditor',
+		moreInfo : '訪問我們的網站以獲取更多關於協議的信息',
+		copy : 'Copyright &copy; $1. All rights reserved.'
+	},
+
+	maximize : '最大化',
 
 	fakeobjects :
 	{
-		anchor : 'Anchor', // MISSING
-		flash : 'Flash Animation', // MISSING
-		div : 'Page Break', // MISSING
-		unknown : 'Unknown Object' // MISSING
-	},
-
-	resize : 'Drag to resize' // MISSING
+		anchor : '錨點',
+		flash : 'Flash 動畫',
+		div : '分頁',
+		unknown : '不明物件'
+	},
+
+	resize : '拖拽改變大小'
 };
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/about/dialogs/about.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/about/dialogs/about.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/about/dialogs/about.js	(revision 4056)
@@ -9,5 +9,5 @@
 
 	return {
-		title : lang.title,
+		title : CKEDITOR.env.ie ? lang.dlgTitle : lang.title,
 		minWidth : 390,
 		minHeight : 230,
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/button/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/button/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/button/plugin.js	(revision 4056)
@@ -100,5 +100,12 @@
 		var command = this.command;
 
-		if ( command )
+		if ( this.modes )
+		{
+			editor.on( 'mode', function()
+				{
+					this.setState( this.modes[ editor.mode ] ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED );
+				}, this);
+		}
+		else if ( command )
 		{
 			// Get the command instance.
@@ -131,5 +138,4 @@
 				' title="', this.title, '"' +
 				' tabindex="-1"' +
-				' role="button"' +
 				' hidefocus="true"' );
 
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/clipboard/dialogs/paste.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/clipboard/dialogs/paste.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/clipboard/dialogs/paste.js	(revision 4056)
@@ -12,5 +12,5 @@
 
 		minWidth : CKEDITOR.env.ie && CKEDITOR.env.quirks ? 370 : 350,
-		minHeight : CKEDITOR.env.ie && CKEDITOR.env.quirks ? 250 : 240,
+		minHeight : CKEDITOR.env.quirks ? 250 : 245,
 		htmlToLoad : '<!doctype html><script type="text/javascript">'
 				+ 'window.onload = function()'
@@ -22,5 +22,10 @@
 					+ 'var iframe = new window.parent.CKEDITOR.dom.element( frameElement );'
 					+ 'var dialog = iframe.getCustomData( "dialog" );'
-					+ 'dialog.fire( "iframeAdded", { iframe : iframe } );'
+		      + ''
+					+ 'iframe.getFrameDocument().on( "keydown", function( e )\
+						{\
+							if ( e.data.getKeystroke() == 27 )\
+								dialog.hide();\
+						});'
 				+ '};'
 				+ '</script><style>body { margin: 3px; height: 95%; } </style><body></body>',
@@ -100,4 +105,10 @@
 		},
 
+		onLoad : function()
+		{
+			if ( ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) && editor.lang.dir == 'rtl' )
+				this.parts.contents.setStyle( 'overflow', 'hidden' );
+		},
+
 		onOk : function()
 		{
@@ -107,5 +118,7 @@
 				html = iframe.$.contentWindow.document.body.innerHTML;
 
-			editor.insertHtml( html );
+			setTimeout( function(){
+				editor.insertHtml( html );
+			}, 0 );
 
 		},
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/colorbutton/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/colorbutton/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/colorbutton/plugin.js	(revision 4056)
@@ -28,4 +28,5 @@
 					title : title,
 					className : 'cke_button_' + name.toLowerCase(),
+					modes : { wysiwyg : 1 },
 
 					panel :
@@ -55,5 +56,5 @@
 		{
 			var output = [],
-				colors = CKEDITOR.config.colorButton_colors.split( ',' );
+				colors = config.colorButton_colors.split( ',' );
 
 			var clickFn = CKEDITOR.tools.addFunction( function( color, type )
@@ -77,4 +78,5 @@
 					else
 						style.remove( editor.document );
+					editor.fire( 'saveSnapshot' );
 				});
 
@@ -140,5 +142,22 @@
 });
 
+/**
+ * Whether to enable the "More Colors..." button in the color selectors.
+ * @default false
+ * @type Boolean
+ * @example
+ * config.colorButton_enableMore = false;
+ */
 CKEDITOR.config.colorButton_enableMore = false;
+
+/**
+ * Defines the colors to be displayed in the color selectors. It's a string
+ * containing the hexadecimal notation for HTML colors, without the "#" prefix.
+ * @type String
+ * @default '000,800000,8B4513,2F4F4F,008080,000080,4B0082,696969,B22222,A52A2A,DAA520,006400,40E0D0,0000CD,800080,808080,F00,FF8C00,FFD700,008000,0FF,00F,EE82EE,A9A9A9,FFA07A,FFA500,FFFF00,00FF00,AFEEEE,ADD8E6,DDA0DD,D3D3D3,FFF0F5,FAEBD7,FFFFE0,F0FFF0,F0FFFF,F0F8FF,E6E6FA,FFF'
+ * @example
+ * // Brazil colors only.
+ * config.colorButton_colors = '00923E,F8C100,28166F';
+ */
 CKEDITOR.config.colorButton_colors =
 	'000,800000,8B4513,2F4F4F,008080,000080,4B0082,696969,' +
@@ -148,4 +167,15 @@
 	'FFF0F5,FAEBD7,FFFFE0,F0FFF0,F0FFFF,F0F8FF,E6E6FA,FFF';
 
+/**
+ * Holds the style definition to be used to apply the text foreground color.
+ * @type Object
+ * @example
+ * // This is basically the default setting value.
+ * config.colorButton_foreStyle =
+ *     {
+ *         element : 'span',
+ *         styles : { 'color' : '#(color)' }
+ *     };
+ */
 CKEDITOR.config.colorButton_foreStyle =
 	{
@@ -155,4 +185,15 @@
 	};
 
+/**
+ * Holds the style definition to be used to apply the text background color.
+ * @type Object
+ * @example
+ * // This is basically the default setting value.
+ * config.colorButton_backStyle =
+ *     {
+ *         element : 'span',
+ *         styles : { 'background-color' : '#(color)' }
+ *     };
+ */
 CKEDITOR.config.colorButton_backStyle =
 	{
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/dialog/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/dialog/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/dialog/plugin.js	(revision 4056)
@@ -359,5 +359,5 @@
 					 * then IE would still leave the caret inside the editing area.
 					 */
-					if ( CKEDITOR.env.ie )
+					if ( this._.editor.mode == 'wysiwyg' && CKEDITOR.env.ie )
 					{
 						var $selection = editor.document.$.selection,
@@ -443,4 +443,33 @@
 	};
 
+	// Focusable interface. Use it via dialog.addFocusable.
+	function Focusable( dialog, element, index ) {
+		this.element = element;
+		this.focusIndex = index;
+		this.isFocusable = function()
+		{
+			return true;
+		};
+		this.focus = function()
+		{
+			dialog._.currentFocusIndex = this.focusIndex;
+			this.element.focus();
+		};
+		// Bind events
+		element.on( 'keydown', function( e )
+			{
+				if ( e.data.getKeystroke() in { 32:1, 13:1 }  )
+					this.fire( 'click' );
+			} );
+		element.on( 'focus', function()
+			{
+				this.fire( 'mouseover' );
+			} );
+		element.on( 'blur', function()
+			{
+				this.fire( 'mouseout' );
+			} );
+	}
+
 	CKEDITOR.dialog.prototype =
 	{
@@ -548,5 +577,5 @@
 		show : function()
 		{
-			if ( CKEDITOR.env.ie )
+			if ( this._.editor.mode == 'wysiwyg' && CKEDITOR.env.ie )
 				this._.editor.getSelection().lock();
 
@@ -619,5 +648,7 @@
 					var dialogSize = this.getSize();
 
-					this.move( ( viewSize.width - dialogSize.width ) / 2, ( viewSize.height - dialogSize.height ) / 2 );
+					// We're using definition size for initial position because of
+					// offten corrupted data in offsetWidth at this point. (#4084)
+					this.move( ( viewSize.width - definition.minWidth ) / 2, ( viewSize.height - dialogSize.height ) / 2 );
 
 					this.parts.dialog.setStyle( 'visibility', '' );
@@ -723,5 +754,5 @@
 				editor.focus();
 
-				if ( CKEDITOR.env.ie )
+				if ( editor.mode == 'wysiwyg' && CKEDITOR.env.ie )
 					editor.getSelection().unlock( true );
 			}
@@ -989,4 +1020,24 @@
 		{
 			return this.getParentEditor().getSelection().getSelectedElement();
+		},
+
+		/**
+		 * Adds element to dialog's focusable list.
+		 *
+		 * @param {CKEDITOR.dom.element} element
+		 * @param {Number} [index]
+		 */
+		addFocusable: function( element, index ) {
+			if ( typeof index == 'undefined' )
+			{
+				index = this._.focusList.length;
+				this._.focusList.push( new Focusable( this, element, index ) );
+			}
+			else
+			{
+				this._.focusList.splice( index, 0, new Focusable( this, element, index ) );
+				for ( var i = index + 1 ; i < this._.focusList.length ; i++ )
+					this._.focusList[ i ].focusIndex++;
+			}
 		}
 	};
@@ -1424,4 +1475,6 @@
 		dialog.parts.title.on( 'mousedown', function( evt )
 			{
+				dialog._.updateSize = true;
+
 				lastCoords = { x : evt.data.$.screenX, y : evt.data.$.screenY };
 
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/dialogui/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/dialogui/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/dialogui/plugin.js	(revision 4056)
@@ -234,5 +234,10 @@
 					// IE BUG: Text input fields in IE at 100% would exceed a <td> or inline
 					// container's width, so need to wrap it inside a <div>.
-					var html = [ '<div class="cke_dialog_ui_input_', elementDefinition.type, '"><input ' ];
+					var html = [ '<div class="cke_dialog_ui_input_', elementDefinition.type, '"' ];
+
+					if ( elementDefinition.width )
+						html.push( 'style="width:'+ elementDefinition.width +'" ' );
+
+					html.push( '><input ' );
 					for ( var i in attributes )
 						html.push( i + '="' + attributes[i] + '" ' );
@@ -333,9 +338,11 @@
 						attributes.checked = 'checked';
 					_.checkbox = new CKEDITOR.ui.dialog.uiElement( dialog, myDefinition, html, 'input', null, attributes );
-					html.push( ' ', CKEDITOR.tools.htmlEncode( elementDefinition.label ) );
+					html.push( ' <label for="', attributes.id, '">',
+							CKEDITOR.tools.htmlEncode( elementDefinition.label ),
+							'</label>' );
 					return html.join( '' );
 				};
 
-				CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, htmlList, 'label', null, null, innerHTML );
+				CKEDITOR.ui.dialog.uiElement.call( this, dialog, elementDefinition, htmlList, 'span', null, null, innerHTML );
 			},
 
@@ -394,5 +401,4 @@
 										title : title
 									}, true ),
-							inputHtml = [],
 							inputAttributes =
 							{
@@ -401,5 +407,6 @@
 								name : commonName,
 								value : value
-							};
+							},
+							inputHtml = [];
 						if ( me._['default'] == value )
 							inputAttributes.checked = 'checked';
@@ -407,6 +414,8 @@
 						cleanInnerDefinition( labelDefinition );
 						children.push( new CKEDITOR.ui.dialog.uiElement( dialog, inputDefinition, inputHtml, 'input', null, inputAttributes ) );
-						new CKEDITOR.ui.dialog.uiElement( dialog, labelDefinition, inputHtmlList, 'label', null, null,
-							   inputHtml.join( '' ) + ' ' + item[0] );
+						inputHtml.push( ' ' );
+						new CKEDITOR.ui.dialog.uiElement( dialog, labelDefinition, inputHtml, 'label', null, { 'for' : inputAttributes.id },
+							   item[0] );
+						inputHtmlList.push( inputHtml.join( '' ) );
 					}
 					new CKEDITOR.ui.dialog.hbox( dialog, [], inputHtmlList, html );
@@ -597,4 +606,5 @@
 							' class="cke_dialog_ui_input_file"' +
 							' id="', _.frameId, '"' +
+							' title="', elementDefinition.label, '"' +
 							' src="javascript:void(' ];
 
@@ -813,5 +823,6 @@
 				{
 					this._.disabled = false;
-					this.getElement().removeClass( 'disabled' );
+					var element = this.getElement();
+					element && element.removeClass( 'disabled' );
 				},
 
@@ -896,5 +907,9 @@
 
 					// GECKO BUG: setTimeout() is needed to workaround invisible selections.
-					setTimeout( function(){ me.getInputElement().$.focus(); }, 0 );
+					setTimeout( function()
+						{
+							var element = me.getInputElement();
+							element && element.$.focus();
+						}, 0 );
 				},
 
@@ -908,5 +923,13 @@
 
 					// GECKO BUG: setTimeout() is needed to workaround invisible selections.
-					setTimeout( function(){ var e = me.getInputElement().$; e.focus(); e.select(); }, 0 );
+					setTimeout( function()
+						{
+							var e = me.getInputElement();
+							if ( e )
+							{
+								e.$.focus();
+								e.$.select();
+							}
+						}, 0 );
 				},
 
@@ -1234,4 +1257,8 @@
 							frameDocument.$.domain = document.domain;
 
+						var size = '';
+						if ( elementDefinition.size )
+							size = elementDefinition.size - ( CKEDITOR.env.ie  ? 7 : 0 );	// "Browse" button is bigger in IE.
+
 						frameDocument.$.write( [ '<html><head><title></title></head><body style="margin: 0; overflow: hidden; background: transparent;">',
 								'<form enctype="multipart/form-data" method="POST" action="',
@@ -1241,5 +1268,5 @@
 								CKEDITOR.tools.htmlEncode( elementDefinition.id || 'cke_upload' ),
 								'" size="',
-								CKEDITOR.tools.htmlEncode( elementDefinition.size || '' ),
+								CKEDITOR.tools.htmlEncode( size > 0 ? size : "" ),
 								'" />',
 								'</form>',
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/domiterator/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/domiterator/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/domiterator/plugin.js	(revision 4056)
@@ -20,4 +20,7 @@
 		this.range = range;
 		this.forceBrBreak = false;
+
+		// Whether include <br>s into the enlarged range.(#3730).
+		this.enlargeBr = true;
 		this.enforceRealBlocks = false;
 
@@ -46,5 +49,6 @@
 			{
 				range = this.range.clone();
-				range.enlarge( this.forceBrBreak ? CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS : CKEDITOR.ENLARGE_BLOCK_CONTENTS );
+				range.enlarge( this.forceBrBreak || !this.enlargeBr ?
+							   CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS : CKEDITOR.ENLARGE_BLOCK_CONTENTS );
 
 				var walker = new CKEDITOR.dom.walker( range ),
@@ -58,10 +62,30 @@
 				var lastNode = walker.previous();
 				this._.lastNode = lastNode.getNextSourceNode( true );
+
+				// We may have an empty text node at the end of block due to [3770].
+				// If that node is the lastNode, it would cause our logic to leak to the
+				// next block.(#3887)
+				if ( this._.lastNode &&
+						this._.lastNode.type == CKEDITOR.NODE_TEXT &&
+						!CKEDITOR.tools.trim( this._.lastNode.getText( ) ) &&
+						this._.lastNode.getParent().isBlockBoundary() )
+				{
+					var testRange = new CKEDITOR.dom.range( range.document );
+					testRange.moveToPosition( this._.lastNode, CKEDITOR.POSITION_AFTER_END );
+					if ( testRange.checkEndOfBlock() )
+					{
+						var path = new CKEDITOR.dom.elementPath( testRange.endContainer );
+						var lastBlock = path.block || path.blockLimit;
+						this._.lastNode = lastBlock.getNextSourceNode( true );
+					}
+				}
+
 				// Probably the document end is reached, we need a marker node.
 				if ( !this._.lastNode )
 				{
-						this._.lastNode = range.document.createText( '' );
-						this._.lastNode.insertAfter( lastNode );
-				}
+					this._.lastNode = this._.docEndMarker = range.document.createText( '' );
+					this._.lastNode.insertAfter( lastNode );
+				}
+
 				// Let's reuse this variable.
 				range = null;
@@ -181,4 +205,7 @@
 					range.setEndAt( currentNode, CKEDITOR.POSITION_AFTER_END );
 
+				currentNode = currentNode.getNextSourceNode( continueFromSibling, null, lastNode );
+				isLast = !currentNode;
+
 				// We have found a block boundary. Let's close the range and move out of the
 				// loop.
@@ -188,8 +215,14 @@
 						startPath = new CKEDITOR.dom.elementPath( range.startContainer ),
 						endPath = new CKEDITOR.dom.elementPath( range.endContainer );
+
+					// Drop the range if it only contains bookmark nodes.(#4087)
 					if ( boundaryNodes.startNode.equals( boundaryNodes.endNode )
-							&& boundaryNodes.startNode.getParent().equals( startPath.blockLimit )
-							&& boundaryNodes.startNode.type == CKEDITOR.NODE_ELEMENT && boundaryNodes.startNode.getAttribute( '_fck_bookmark' ) )
+						&& boundaryNodes.startNode.getParent().equals( startPath.blockLimit )
+						&& boundaryNodes.startNode.type == CKEDITOR.NODE_ELEMENT
+						&& boundaryNodes.startNode.getAttribute( '_fck_bookmark' ) )
+					{
 						range = null;
+						this._.nextNode = null;
+					}
 					else
 						break;
@@ -199,5 +232,4 @@
 					break;
 
-				currentNode = currentNode.getNextSourceNode( continueFromSibling, null, lastNode );
 			}
 
@@ -208,4 +240,5 @@
 				if ( !range )
 				{
+					this._.docEndMarker && this._.docEndMarker.remove();
 					this._.nextNode = null;
 					return null;
@@ -288,9 +321,14 @@
 			if ( removeLastBr )
 			{
+				// Ignore bookmark nodes.(#3783)
+				var bookmarkGuard = CKEDITOR.dom.walker.bookmark( false, true );
+
 				var lastChild = block.getLast();
 				if ( lastChild && lastChild.type == CKEDITOR.NODE_ELEMENT && lastChild.getName() == 'br' )
 				{
 					// Take care not to remove the block expanding <br> in non-IE browsers.
-					if ( CKEDITOR.env.ie || lastChild.getPrevious() || lastChild.getNext() )
+					if ( CKEDITOR.env.ie
+						 || lastChild.getPrevious( bookmarkGuard )
+						 || lastChild.getNext( bookmarkGuard ) )
 						lastChild.remove();
 				}
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/editingblock/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/editingblock/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/editingblock/plugin.js	(revision 4056)
@@ -170,4 +170,6 @@
 				return;
 
+			this.fire( 'beforeModeUnload' );
+
 			var currentMode = getMode( this );
 			data = currentMode.getData();
@@ -212,5 +214,5 @@
  * @default 'wysiwyg'
  * @example
- * config.toolbarLocation = 'source';
+ * config.startupMode = 'source';
  */
 CKEDITOR.config.startupMode = 'wysiwyg';
@@ -220,6 +222,15 @@
  * @type Boolean
  * @default false
+ * @example
+ * config.startupFocus = true;
  */
 CKEDITOR.config.startupFocus = false;
 
+/**
+ * Whether to render or not the editing block area in the editor interface.
+ * @type Boolean
+ * @default true
+ * @example
+ * config.editingBlock = false;
+ */
 CKEDITOR.config.editingBlock = true;
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/enterkey/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/enterkey/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/enterkey/plugin.js	(revision 4056)
@@ -257,4 +257,5 @@
 				lineBreak = doc.createElement( 'br' );
 
+			range.deleteContents();
 			range.insertNode( lineBreak );
 
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/entities/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/entities/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/entities/plugin.js	(revision 4056)
@@ -146,7 +146,55 @@
 })();
 
+/**
+ * Whether to use HTML entities in the output.
+ * @type Boolean
+ * @default true
+ * @example
+ * config.entities = false;
+ */
 CKEDITOR.config.entities = true;
+
+/**
+ * Whether to convert some Latin characters (Latin alphabet No&#46; 1, ISO 8859-1)
+ * to HTML entities. The list of entities can be found at the
+ * <a href="http://www.w3.org/TR/html4/sgml/entities.html#h-24.2.1">W3C HTML 4.01 Specification, section 24.2.1</a>.
+ * @type Boolean
+ * @default true
+ * @example
+ * config.entities_latin = false;
+ */
 CKEDITOR.config.entities_latin = true;
+
+/**
+ * Whether to convert some symbols, mathematical symbols, and Greek letters to
+ * HTML entities. This may be more relevant for users typing text written in Greek.
+ * The list of entities can be found at the
+ * <a href="http://www.w3.org/TR/html4/sgml/entities.html#h-24.3.1">W3C HTML 4.01 Specification, section 24.3.1</a>.
+ * @type Boolean
+ * @default true
+ * @example
+ * config.entities_greek = false;
+ */
 CKEDITOR.config.entities_greek = true;
+
+/**
+ * Whether to convert all remaining characters, not comprised in the ASCII
+ * character table, to their relative numeric representation of HTML entity.
+ * For example, the phrase "This is Chinese: &#27721;&#35821;." is outputted
+ * as "This is Chinese: &amp;#27721;&amp;#35821;."
+ * @type Boolean
+ * @default false
+ * @example
+ * config.entities_processNumerical = true;
+ */
 CKEDITOR.config.entities_processNumerical = false;
+
+/**
+ * An additional list of entities to be used. It's a string containing each
+ * entry separated by a comma. Entities names or number must be used, exclusing
+ * the "&amp;" preffix and the ";" termination.
+ * @default '#39'  // The single quote (') character.
+ * @type String
+ * @example
+ */
 CKEDITOR.config.entities_additional = '#39';
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/find/dialogs/find.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/find/dialogs/find.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/find/dialogs/find.js	(revision 4056)
@@ -712,5 +712,5 @@
 											dialog.getValueOf( 'replace', 'txtReplaceWordChk' ),
 											false, true ) )
-										;
+										{ /*jsl:pass*/ }
 
 										if ( finder.replaceCounter )
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/find/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/find/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/find/plugin.js	(revision 4056)
@@ -32,4 +32,15 @@
 } );
 
-// Styles for highlighting search results.
+/**
+ * Defines the style to be used to highlight results with the find dialog.
+ * @type Object
+ * @default { element : 'span', styles : { 'background-color' : '#004', 'color' : '#fff' } }
+ * @example
+ * // Highlight search results with blue on yellow.
+ * config.find_highlight =
+ *     {
+ *         element : 'span',
+ *         styles : { 'background-color' : '#ff0', 'color' : '#00f' }
+ *     };
+ */
 CKEDITOR.config.find_highlight = { element : 'span', styles : { 'background-color' : '#004', 'color' : '#fff' } };
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/flash/dialogs/flash.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/flash/dialogs/flash.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/flash/dialogs/flash.js	(revision 4056)
@@ -357,4 +357,5 @@
 									type : 'text',
 									id : 'width',
+									style : 'width:95px',
 									label : editor.lang.flash.width,
 									validate : CKEDITOR.dialog.validate.integer( editor.lang.flash.validateWidth ),
@@ -379,4 +380,5 @@
 									type : 'text',
 									id : 'height',
+									style : 'width:95px',
 									label : editor.lang.flash.height,
 									validate : CKEDITOR.dialog.validate.integer( editor.lang.flash.validateHeight ),
@@ -401,4 +403,5 @@
 									type : 'text',
 									id : 'hSpace',
+									style : 'width:95px',
 									label : editor.lang.flash.hSpace,
 									validate : CKEDITOR.dialog.validate.integer( editor.lang.flash.validateHSpace ),
@@ -409,4 +412,5 @@
 									type : 'text',
 									id : 'vSpace',
+									style : 'width:95px',
 									label : editor.lang.flash.vSpace,
 									validate : CKEDITOR.dialog.validate.integer( editor.lang.flash.validateVSpace ),
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/flash/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/flash/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/flash/plugin.js	(revision 4056)
@@ -20,5 +20,5 @@
 		var attributes = element.attributes;
 
-		return ( attributes.type != 'application/x-shockwave-flash' || !flashFilenameRegex.test( attributes.src || '' ) );
+		return ( attributes.type == 'application/x-shockwave-flash' || flashFilenameRegex.test( attributes.src || '' ) );
 	}
 
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/floatpanel/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/floatpanel/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/floatpanel/plugin.js	(revision 4056)
@@ -122,4 +122,7 @@
 					top += offsetParent.$.offsetHeight - 1;
 
+				// Memorize offsetParent by it's ID.
+				this._.panel._.offsetParentId = offsetParent.getId();
+
 				element.setStyles(
 					{
@@ -181,5 +184,5 @@
 					this );
 
-				setTimeout( function()
+				CKEDITOR.tools.setTimeout( function()
 					{
 						if ( rtl )
@@ -212,13 +215,6 @@
 							}
 
-							if ( !CKEDITOR.env.gecko || panel.isLoaded )
-							{
-								// IE7 needs some time (setting the delay to 0ms won't work) to refresh
-								// the scrollHeight. (#3174)
-								if ( CKEDITOR.env.ie && CKEDITOR.env.version >= 7 )
-									setTimeout( setHeight, 50 );
-								else
-									setHeight();
-							}
+							if ( panel.isLoaded )
+								setHeight();
 							else
 								panel.onLoad = setHeight;
@@ -228,5 +224,5 @@
 
 						// Set the IFrame focus, so the blur event gets fired.
-						setTimeout( function()
+						CKEDITOR.tools.setTimeout( function()
 							{
 								if ( definition.voiceLabel )
@@ -245,7 +241,10 @@
 								else
 									iframe.$.contentWindow.focus();
-							}, 0);
-					}, 0);
-
+
+								// We need this get fired manually because of unfired focus() function.
+								if ( CKEDITOR.env.ie && !CKEDITOR.env.quirks )
+									this.allowBlur( true );
+							}, 0, this);
+					}, 0, this);
 				this.visible = 1;
 
@@ -277,4 +276,8 @@
 			showAsChild : function( panel, blockName, offsetParent, corner, offsetX, offsetY )
 			{
+				// Skip reshowing of child which is already visible.
+				if ( this._.activeChild == panel && panel._.panel._.offsetParentId == offsetParent.getId() )
+					return;
+
 				this.hideChild();
 
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/font/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/font/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/font/plugin.js	(revision 4056)
@@ -118,6 +118,22 @@
 })();
 
-// Font settings.
-
+/**
+ * The list of fonts names to be displayed in the Font combo in the toolbar.
+ * Entries are separated by semi-colons (;), while it's possible to have more
+ * than one font for each entry, in the HTML way (separated by comma).
+ *
+ * A display name may be optionally defined by prefixing the entries with the
+ * name and the slash character. For example, "Arial/Arial, Helvetica, sans-serif"
+ * will be displayed as "Arial" in the list, but will be outputted as
+ * "Arial, Helvetica, sans-serif".
+ * @type String
+ * @example
+ * config.font_names =
+ *     'Arial/Arial, Helvetica, sans-serif;' +
+ *     'Times New Roman/Times New Roman, Times, serif;' +
+ *     'Verdana';
+ * @example
+ * config.font_names = 'Arial;Times New Roman;Verdana';
+ */
 CKEDITOR.config.font_names =
 	'Arial/Arial, Helvetica, sans-serif;' +
@@ -131,5 +147,26 @@
 	'Verdana/Verdana, Geneva, sans-serif';
 
+/**
+ * The text to be displayed in the Font combo is none of the available values
+ * matches the current cursor position or text selection.
+ * @type String
+ * @example
+ * // If the default site font is Arial, we may making it more explicit to the end user.
+ * config.font_defaultLabel = 'Arial';
+ */
 CKEDITOR.config.font_defaultLabel = '';
+
+/**
+ * The style definition to be used to apply the font in the text.
+ * @type Object
+ * @example
+ * // This is actually the default value for it.
+ * config.font_style =
+ *     {
+ *         element		: 'span',
+ *         styles		: { 'font-family' : '#(family)' },
+ *         overrides	: [ { element : 'font', attributes : { 'face' : null } } ]
+ *     };
+ */
 CKEDITOR.config.font_style =
 	{
@@ -139,14 +176,52 @@
 	};
 
-// Font Size setting.
-
+/**
+ * The list of fonts size to be displayed in the Font Size combo in the
+ * toolbar. Entries are separated by semi-colons (;).
+ *
+ * Any kind of "CSS like" size can be used, like "12px", "2.3em", "130%",
+ * "larger" or "x-small".
+ *
+ * A display name may be optionally defined by prefixing the entries with the
+ * name and the slash character. For example, "Bigger Font/14px" will be
+ * displayed as "Bigger Font" in the list, but will be outputted as "14px".
+ * @type String
+ * @default '8/8px;9/9px;10/10px;11/11px;12/12px;14/14px;16/16px;18/18px;20/20px;22/22px;24/24px;26/26px;28/28px;36/36px;48/48px;72/72px'
+ * @example
+ * config.fontSize_sizes = '16/16px;24/24px;48/48px;';
+ * @example
+ * config.fontSize_sizes = '12px;2.3em;130%;larger;x-small';
+ * @example
+ * config.fontSize_sizes = '12 Pixels/12px;Big/2.3em;30 Percent More/130%;Bigger/larger;Very Small/x-small';
+ */
 CKEDITOR.config.fontSize_sizes =
 	'8/8px;9/9px;10/10px;11/11px;12/12px;14/14px;16/16px;18/18px;20/20px;22/22px;24/24px;26/26px;28/28px;36/36px;48/48px;72/72px';
 
+/**
+ * The text to be displayed in the Font Size combo is none of the available
+ * values matches the current cursor position or text selection.
+ * @type String
+ * @example
+ * // If the default site font size is 12px, we may making it more explicit to the end user.
+ * config.fontSize_defaultLabel = '12px';
+ */
 CKEDITOR.config.fontSize_defaultLabel = '';
+
+/**
+ * The style definition to be used to apply the font size in the text.
+ * @type Object
+ * @example
+ * // This is actually the default value for it.
+ * config.fontSize_style =
+ *     {
+ *         element		: 'span',
+ *         styles		: { 'font-size' : '#(size)' },
+ *         overrides	: [ { element : 'font', attributes : { 'size' : null } } ]
+ *     };
+ */
 CKEDITOR.config.fontSize_style =
 	{
 		element		: 'span',
 		styles		: { 'font-size' : '#(size)' },
-		overrides	: [ { element : 'font', attributes : { 'face' : null } } ]
+		overrides	: [ { element : 'font', attributes : { 'size' : null } } ]
 	};
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/format/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/format/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/format/plugin.js	(revision 4056)
@@ -88,14 +88,104 @@
 });
 
+/**
+ * A list of semi colon separated style names (by default tags) representing
+ * the style definition for each entry to be displayed in the Format combo in
+ * the toolbar. Each entry must have its relative definition configuration in a
+ * setting named "format_(tagName)". For example, the "p" entry has its
+ * definition taken from config.format_p.
+ * @type String
+ * @default 'p;h1;h2;h3;h4;h5;h6;pre;address;div'
+ * @example
+ * config.format_tags = 'p;h2;h3;pre'
+ */
 CKEDITOR.config.format_tags = 'p;h1;h2;h3;h4;h5;h6;pre;address;div';
 
-CKEDITOR.config.format_p		= { element : 'p' };
-CKEDITOR.config.format_div		= { element : 'div' };
-CKEDITOR.config.format_pre		= { element : 'pre' };
-CKEDITOR.config.format_address	= { element : 'address' };
-CKEDITOR.config.format_h1		= { element : 'h1' };
-CKEDITOR.config.format_h2		= { element : 'h2' };
-CKEDITOR.config.format_h3		= { element : 'h3' };
-CKEDITOR.config.format_h4		= { element : 'h4' };
-CKEDITOR.config.format_h5		= { element : 'h5' };
-CKEDITOR.config.format_h6		= { element : 'h6' };
+/**
+ * The style definition to be used to apply the "Normal" format.
+ * @type Object
+ * @default { element : 'p' }
+ * @example
+ * config.format_p = { element : 'p', attributes : { class : 'normalPara' } };
+ */
+CKEDITOR.config.format_p = { element : 'p' };
+
+/**
+ * The style definition to be used to apply the "Normal (DIV)" format.
+ * @type Object
+ * @default { element : 'div' }
+ * @example
+ * config.format_div = { element : 'div', attributes : { class : 'normalDiv' } };
+ */
+CKEDITOR.config.format_div = { element : 'div' };
+
+/**
+ * The style definition to be used to apply the "Formatted" format.
+ * @type Object
+ * @default { element : 'pre' }
+ * @example
+ * config.format_pre = { element : 'pre', attributes : { class : 'code' } };
+ */
+CKEDITOR.config.format_pre = { element : 'pre' };
+
+/**
+ * The style definition to be used to apply the "Address" format.
+ * @type Object
+ * @default { element : 'address' }
+ * @example
+ * config.format_address = { element : 'address', attributes : { class : 'styledAddress' } };
+ */
+CKEDITOR.config.format_address = { element : 'address' };
+
+/**
+ * The style definition to be used to apply the "Heading 1" format.
+ * @type Object
+ * @default { element : 'h1' }
+ * @example
+ * config.format_h1 = { element : 'h1', attributes : { class : 'contentTitle1' } };
+ */
+CKEDITOR.config.format_h1 = { element : 'h1' };
+
+/**
+ * The style definition to be used to apply the "Heading 1" format.
+ * @type Object
+ * @default { element : 'h2' }
+ * @example
+ * config.format_h2 = { element : 'h2', attributes : { class : 'contentTitle2' } };
+ */
+CKEDITOR.config.format_h2 = { element : 'h2' };
+
+/**
+ * The style definition to be used to apply the "Heading 1" format.
+ * @type Object
+ * @default { element : 'h3' }
+ * @example
+ * config.format_h3 = { element : 'h3', attributes : { class : 'contentTitle3' } };
+ */
+CKEDITOR.config.format_h3 = { element : 'h3' };
+
+/**
+ * The style definition to be used to apply the "Heading 1" format.
+ * @type Object
+ * @default { element : 'h4' }
+ * @example
+ * config.format_h4 = { element : 'h4', attributes : { class : 'contentTitle4' } };
+ */
+CKEDITOR.config.format_h4 = { element : 'h4' };
+
+/**
+ * The style definition to be used to apply the "Heading 1" format.
+ * @type Object
+ * @default { element : 'h5' }
+ * @example
+ * config.format_h5 = { element : 'h5', attributes : { class : 'contentTitle5' } };
+ */
+CKEDITOR.config.format_h5 = { element : 'h5' };
+
+/**
+ * The style definition to be used to apply the "Heading 1" format.
+ * @type Object
+ * @default { element : 'h6' }
+ * @example
+ * config.format_h6 = { element : 'h6', attributes : { class : 'contentTitle6' } };
+ */
+CKEDITOR.config.format_h6 = { element : 'h6' };
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/forms/dialogs/form.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/forms/dialogs/form.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/forms/dialogs/form.js	(revision 4056)
@@ -10,5 +10,5 @@
 		id : 1,
 		method : 1,
-		encoding : 1,
+		enctype : 1,
 		target : 1
 	};
@@ -120,5 +120,5 @@
 							},
 							{
-								id : 'encoding',
+								id : 'enctype',
 								type : 'select',
 								label : editor.lang.form.encoding,
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/htmldataprocessor/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/htmldataprocessor/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/htmldataprocessor/plugin.js	(revision 4056)
@@ -7,5 +7,6 @@
 {
 	// Regex to scan for &nbsp; at the end of blocks, which are actually placeholders.
-	var tailNbspRegex = /^[\t\r\n ]*&nbsp;$/;
+	// Safari transforms the &nbsp; to \xa0. (#4172)
+	var tailNbspRegex = /^[\t\r\n ]*(?:&nbsp;|\xa0)$/;
 
 	var protectedSourceMarker = '{cke_protected}';
@@ -73,10 +74,4 @@
 	var defaultDataFilterRules =
 	{
-		elementNames :
-		[
-			// Elements that cause problems in wysiwyg mode.
-			[ ( /^(object|embed|param)$/ ), 'cke:$1' ]
-		],
-
 		attributeNames :
 		[
@@ -92,15 +87,4 @@
 		defaultDataBlockFilterRules.elements[ i ] = extendBlockForDisplay;
 
-	/**
-	 * IE sucks with dynamic 'name' attribute after element is created, '_cke_saved_name' is used instead for this attribute.
-	 */
-	var removeName = function( element )
-	{
-		var attribs = element.attributes;
-
-		if ( attribs._cke_saved_name )
-			delete attribs.name;
-	};
-
 	var defaultHtmlFilterRules =
 		{
@@ -125,4 +109,21 @@
 			elements :
 			{
+				$ : function( element )
+				{
+					// Remove duplicated attributes - #3789.
+					var attribs = element.attributes;
+
+					if ( attribs )
+					{
+						var attributeNames = [ 'name', 'href', 'src' ],
+							savedAttributeName;
+						for ( var i = 0 ; i < attributeNames.length ; i++ )
+						{
+							savedAttributeName = '_cke_saved_' + attributeNames[ i ];
+							savedAttributeName in attribs && ( delete attribs[ attributeNames[ i ] ] );
+						}
+					}
+				},
+
 				embed : function( element )
 				{
@@ -133,33 +134,28 @@
 					if ( parent && parent.name == 'object' )
 					{
-						element.attributes.width = parent.attributes.width;
-						element.attributes.height = parent.attributes.height;
+						var parentWidth = parent.attributes.width,
+							parentHeight = parent.attributes.height;
+						parentWidth && ( element.attributes.width = parentWidth );
+						parentHeight && ( element.attributes.height = parentHeight );
 					}
 				},
-
-				img : function( element )
-				{
-					var attribs = element.attributes;
-
-					if ( attribs._cke_saved_name )
-						delete attribs.name;
-					if ( attribs._cke_saved_src )
-						delete attribs.src;
+				// Restore param elements into self-closing.
+				param : function( param )
+				{
+					param.children = [];
+					param.isEmpty = true;
+					return param;
 				},
 
+				// Remove empty link but not empty anchor.(#3829)
 				a : function( element )
 				{
-					var attribs = element.attributes;
-
-					if ( attribs._cke_saved_name )
-						delete attribs.name;
-					if ( attribs._cke_saved_href )
-						delete attribs.href;
-				},
-
-				input : removeName,
-				textarea : removeName,
-				select : removeName,
-				form : removeName
+					if ( !( element.children.length ||
+							element.attributes.name ||
+							element.attributes._cke_saved_name ) )
+					{
+						return false;
+					}
+				}
 			},
 
@@ -206,4 +202,6 @@
 	var protectStyleTagsRegex = /<(style)(?=[ >])[^>]*>[^<]*<\/\1>/gi;
 	var encodedTagsRegex = /<cke:encoded>([^<]*)<\/cke:encoded>/gi;
+	var protectElementNamesRegex = /(<\/?)((?:object|embed|param).*?>)/gi;
+	var protectSelfClosingRegex = /<cke:param(.*?)\/>/gi;
 
 	function protectStyleTagsMatch( match )
@@ -216,4 +214,12 @@
 		return html.replace( protectStyleTagsRegex, protectStyleTagsMatch );
 	}
+	function protectElementsNames( html )
+	{
+		return html.replace( protectElementNamesRegex, '$1cke:$2');
+	}
+	function protectSelfClosingElements( html )
+	{
+		return html.replace( protectSelfClosingRegex, '<cke:param$1></cke:param>' );
+	}
 
 	function unprotectEncodedTagsMatch( match, encoded )
@@ -229,9 +235,11 @@
 	function protectSource( data, protectRegexes )
 	{
+		var protectedHtml = [],
+			tempRegex = /<\!--\{cke_temp\}(\d*?)-->/g;
 		var regexes =
 			[
 				// First of any other protection, we must protect all comments
 				// to avoid loosing them (of course, IE related).
-				/<!--[\s\S]*?-->/g,
+				(/<!--[\s\S]*?-->/g),
 
 				// Script tags will also be forced to be protected, otherwise
@@ -248,8 +256,20 @@
 			data = data.replace( regexes[i], function( match )
 				{
-					return '<!--' + protectedSourceMarker + encodeURIComponent( match ).replace( /--/g, '%2D%2D' ) + '-->';
+					match = match.replace( tempRegex, 		// There could be protected source inside another one. (#3869).
+						function( $, id )
+						{
+							return protectedHtml[ id ];
+						}
+					);
+					return  '<!--{cke_temp}' + ( protectedHtml.push( match ) - 1 ) + '-->';
 				});
 		}
-
+		data = data.replace( tempRegex,	function( $, id )
+			{
+				return '<!--' + protectedSourceMarker +
+						encodeURIComponent( protectedHtml[ id ] ).replace( /--/g, '%2D%2D' ) +
+						'-->';
+			}
+		);
 		return data;
 	}
@@ -299,9 +319,18 @@
 				data = protectStyleTags( data );
 
+			// Certain elements has problem to go through DOM operation, protect
+			// them by prefixing 'cke' namespace.(#3591)
+			data = protectElementsNames( data );
+
+			// All none-IE browsers ignore self-closed custom elements,
+			// protecting them into open-close.(#3591)
+			data = protectSelfClosingElements( data );
+
 			// Call the browser to help us fixing a possibly invalid HTML
 			// structure.
 			var div = document.createElement( 'div' );
-			div.innerHTML = data;
-			data = div.innerHTML;
+			// Add fake character to workaround IE comments bug. (#3801)
+			div.innerHTML = 'a' + data;
+			data = div.innerHTML.substr( 1 );
 
 			if ( CKEDITOR.env.ie )
@@ -332,3 +361,13 @@
 })();
 
+/**
+ * Whether to force using "&" instead of "&amp;amp;" in elements attributes
+ * values. It's not recommended to change this setting for compliance with the
+ * W3C XHTML 1.0 standards
+ * (<a href="http://www.w3.org/TR/xhtml1/#C_12">C.12, XHTML 1.0</a>).
+ * @type Boolean
+ * @default false
+ * @example
+ * config.forceSimpleAmpersand = false;
+ */
 CKEDITOR.config.forceSimpleAmpersand = false;
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/image/dialogs/image.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/image/dialogs/image.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/image/dialogs/image.js	(revision 4056)
@@ -210,5 +210,7 @@
 
 				var editor = this.getParentEditor(),
-					element = this.getParentEditor().getSelection().getSelectedElement();
+					sel = this.getParentEditor().getSelection(),
+					element = sel.getSelectedElement(),
+					link = element && element.getAscendant( 'a' );
 
 				// Copy of the image
@@ -217,11 +219,11 @@
 				this.originalElement.setCustomData( 'isReady', 'false' );
 
-				if ( element && element.getName() == 'a' )
-				{
-					this.linkElement = element;
+				if ( link )
+				{
+					this.linkElement = link;
 					this.linkEditMode = true;
 
 					// Look for Image element.
-					var linkChildren = element.getChildren();
+					var linkChildren = link.getChildren();
 					if ( linkChildren.count() == 1 )			// 1 child.
 					{
@@ -238,7 +240,8 @@
 					// Fill out all fields.
 					if ( dialogType == 'image' )
-						this.setupContent( LINK, element );
+						this.setupContent( LINK, link );
 				}
-				else if ( element && element.getName() == 'img' && !element.getAttribute( '_cke_protected_html' ) )
+
+				if ( element && element.getName() == 'img' && !element.getAttribute( '_cke_protected_html' ) )
 					this.imageEditMode = 'img';
 				else if ( element && element.getName() == 'input' && element.getAttribute( 'type' ) && element.getAttribute( 'type' ) == 'image' )
@@ -262,6 +265,5 @@
 				if ( this.imageEditMode )
 				{
-					var imgTagName = this.imageEditMode,
-						removeObj = this.imageElement;
+					var imgTagName = this.imageEditMode;
 
 					// Image dialog and Input element.
@@ -272,7 +274,5 @@
 						this.imageElement = editor.document.createElement( 'img' );
 						this.imageElement.setAttribute( 'alt', '' );
-						removeObj.insertBeforeMe( this.imageElement );
-						removeObj.remove( false );
-
+						editor.insertElement( this.imageElement );
 					}
 					// ImageButton dialog and Image element.
@@ -288,6 +288,5 @@
 							}
 						);
-						removeObj.insertBeforeMe( this.imageElement );
-						removeObj.remove( false );
+						editor.insertElement( this.imageElement );
 					}
 				}
@@ -321,9 +320,9 @@
 						if ( !this.linkEditMode )
 						{
-							this.linkElement.append( this.imageElement, false );
-							editor.insertElement( this.linkElement );
+							editor.insertElement(this.linkElement);
+							this.linkElement.append(this.imageElement, false);
 						}
-						else 	//Link already exists, image not.
-							this.linkElement.append( this.imageElement, false );
+						else	 //Link already exists, image not.
+							editor.insertElement(this.imageElement );
 					}
 					else
@@ -335,10 +334,13 @@
 					if ( !this.linkEditMode && this.addLink )
 					{
-						this.imageElement.insertBeforeMe( this.linkElement );
+						editor.insertElement( this.linkElement );
 						this.imageElement.appendTo( this.linkElement );
 					}
 					//Remove Link, Image exists.
 					else if ( this.linkEditMode && !this.addLink )
-						this.linkElement.remove( true );
+					{
+						editor.getSelection().selectElement( this.linkElement );
+						editor.insertElement( this.imageElement );
+					}
 				}
 			},
@@ -347,4 +349,7 @@
 				if ( dialogType != 'image' )
 					this.hidePage( 'Link' );		//Hide Link tab.
+				var doc = this._.element.getDocument();
+				this.addFocusable( doc.getById( 'btnResetSize' ), 5 );
+				this.addFocusable( doc.getById( 'btnLockSizes' ), 5 );
 			},
 			onHide : function()
@@ -418,11 +423,16 @@
 												if ( type == IMAGE )
 												{
-													var dialog = this.getDialog();
-													var url = element.getAttribute( '_cke_saved_src' );
-													if ( !url )
-														url = element.getAttribute( 'src' );
-													dialog.dontResetSize = true;
-													this.setValue( url );		// And call this.onChange()
-													this.focus();
+													var url = element.getAttribute( '_cke_saved_src' ) || element.getAttribute( 'src' );
+													var field = this;
+
+													this.getDialog().dontResetSize = true;
+
+													// In IE7 the dialog is being rendered improperly when loading
+													// an image with a long URL. So we need to delay it a bit. (#4122)
+													setTimeout( function()
+														{
+															field.setValue( url );		// And call this.onChange()
+															field.focus();
+														}, 0 );
 												}
 											},
@@ -507,4 +517,5 @@
 														{
 															type : 'text',
+															width: '40px',
 															id : 'txtWidth',
 															labelLayout : 'horizontal',
@@ -553,4 +564,5 @@
 															type : 'text',
 															id : 'txtHeight',
+															width: '40px',
 															labelLayout : 'horizontal',
 															label : editor.lang.image.height,
@@ -599,5 +611,5 @@
 												{
 													type : 'html',
-													style : 'position:relative;top:10px;height:50px;',
+													style : 'margin-top:10px;width:40px;height:40px;',
 													onLoad : function()
 													{
@@ -613,9 +625,9 @@
 															resetButton.on( 'mouseover', function()
 																{
-																	this.addClass( 'BtnOver' );
+																	this.addClass( 'cke_btn_over' );
 																}, resetButton );
 															resetButton.on( 'mouseout', function()
 																{
-																	this.removeClass( 'BtnOver' );
+																	this.removeClass( 'cke_btn_over' );
 																}, resetButton );
 														}
@@ -641,17 +653,17 @@
 															ratioButton.on( 'mouseover', function()
 																{
-																	this.addClass( 'BtnOver' );
+																	this.addClass( 'cke_btn_over' );
 																}, ratioButton );
 															ratioButton.on( 'mouseout', function()
 																{
-																	this.removeClass( 'BtnOver' );
+																	this.removeClass( 'cke_btn_over' );
 																}, ratioButton );
 														}
 													},
 													html : '<div>'+
-														'<div title="' + editor.lang.image.lockRatio +
-														'" class="cke_btn_locked" id="btnLockSizes"></div>' +
-														'<div title="' + editor.lang.image.resetSize +
-														'" class="cke_btn_reset" id="btnResetSize"></div>'+
+														'<a href="javascript:void(0)" tabindex="-1" title="' + editor.lang.image.lockRatio +
+														'" class="cke_btn_locked" id="btnLockSizes"></a>' +
+														'<a href="javascript:void(0)" tabindex="-1" title="' + editor.lang.image.resetSize +
+														'" class="cke_btn_reset" id="btnResetSize"></a>'+
 														'</div>'
 												}
@@ -666,4 +678,5 @@
 													type : 'text',
 													id : 'txtBorder',
+													width: '60px',
 													labelLayout : 'horizontal',
 													label : editor.lang.image.border,
@@ -707,4 +720,5 @@
 													type : 'text',
 													id : 'txtHSpace',
+													width: '60px',
 													labelLayout : 'horizontal',
 													label : editor.lang.image.hSpace,
@@ -754,4 +768,5 @@
 													type : 'text',
 													id : 'txtVSpace',
+													width : '60px',
 													labelLayout : 'horizontal',
 													label : editor.lang.image.vSpace,
@@ -799,5 +814,5 @@
 													labelLayout : 'horizontal',
 													widths : [ '35%','65%' ],
-													style : 'width:100%',
+													style : 'width:90px',
 													label : editor.lang.image.align,
 													'default' : '',
@@ -968,4 +983,5 @@
 							id : 'upload',
 							label : editor.lang.image.btnUpload,
+							style: 'height:40px',
 							size : 38
 						},
@@ -1010,5 +1026,5 @@
 									id : 'cmbLangDir',
 									type : 'select',
-									style : 'width : 100%;',
+									style : 'width : 100px;',
 									label : editor.lang.common.langDir,
 									'default' : '',
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/image/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/image/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/image/plugin.js	(revision 4056)
@@ -55,3 +55,10 @@
 } );
 
+/**
+ * Whether to remove links when emptying the link URL field in the image dialog.
+ * @type Boolean
+ * @default true
+ * @example
+ * config.image_removeLinkByEmptyURL = false;
+ */
 CKEDITOR.config.image_removeLinkByEmptyURL = true;
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/indent/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/indent/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/indent/plugin.js	(revision 4056)
@@ -43,5 +43,5 @@
 			else
 			{
-				while ( listItem && ( listItem = listItem.getPrevious() ) )
+				while ( listItem && ( listItem = listItem.getPrevious( CKEDITOR.dom.walker.whitespaces( true ) ) ) )
 				{
 					if ( listItem.getName && listItem.getName() == 'li' )
@@ -70,5 +70,5 @@
 			}
 			if ( ( this.name == 'outdent' && !indentStep ) ||
-					( this.name == 'indent' && indentStep == editor.config.indentClass.length ) )
+					( this.name == 'indent' && indentStep == editor.config.indentClasses.length ) )
 				return setState.call( this, editor, CKEDITOR.TRISTATE_DISABLED );
 			return setState.call( this, editor, CKEDITOR.TRISTATE_OFF );
@@ -117,5 +117,5 @@
 		// possible about the surrounding lists, we need to feed it the further
 		// ancestor node that is still a list.
-		var listParents = listNode.getParents();
+		var listParents = listNode.getParents( true );
 		for ( var i = 0 ; i < listParents.length ; i++ )
 		{
@@ -145,7 +145,48 @@
 		// And replace the old list with the new forest.
 		var newList = CKEDITOR.plugins.list.arrayToList( listArray, database, null, editor.config.enterMode, 0 );
+
+		// Avoid nested <li> after outdent even they're visually same,
+		// recording them for later refactoring.(#3982)
+		if ( this.name == 'outdent' )
+		{
+			var parentLiElement;
+			if ( ( parentLiElement = listNode.getParent() ) && parentLiElement.is( 'li' ) )
+			{
+				var children = newList.listNode.getChildren(),
+					pendingLis = [],
+					count = children.count(),
+					child;
+
+				for ( i = count - 1 ; i >= 0 ; i-- )
+				{
+					if( ( child = children.getItem( i ) ) && child.is && child.is( 'li' )  )
+						pendingLis.push( child );
+				}
+			}
+		}
+
 		if ( newList )
 			newList.listNode.replace( listNode );
 
+		// Move the nested <li> to be appeared after the parent.
+		if ( pendingLis && pendingLis.length )
+		{
+			for (  i = 0; i < pendingLis.length ; i++ )
+			{
+				var li = pendingLis[ i ],
+					followingList = li;
+
+				// Nest preceding <ul>/<ol> inside current <li> if any.
+				while( ( followingList = followingList.getNext() ) &&
+					   followingList.is &&
+					   followingList.getName() in listNodeNames )
+				{
+					li.append( followingList );
+				}
+
+				li.insertAfter( parentLiElement );
+			}
+		}
+
 		// Clean up the markers.
 		CKEDITOR.dom.element.clearAllMarkers( database );
@@ -154,7 +195,8 @@
 	function indentBlock( editor, range )
 	{
-		var iterator = range.createIterator();
+		var iterator = range.createIterator(),
+			enterMode = editor.config.enterMode;
 		iterator.enforceRealBlocks = true;
-
+		iterator.enlargeBr = enterMode != CKEDITOR.ENTER_BR;
 		var block;
 		while ( ( block = iterator.getNextParagraph() ) )
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/keystrokes/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/keystrokes/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/keystrokes/plugin.js	(revision 4056)
@@ -148,9 +148,17 @@
 
 /**
- * A list of keystrokes to be blocked if not defined in the {@link #keystrokes}
+ * A list of keystrokes to be blocked if not defined in the {@link CKEDITOR.config.keystrokes}
  * setting. In this way it is possible to block the default browser behavior
  * for those keystrokes.
  * @type Array
+ * @default (see example)
  * @example
+ * // This is actually the default value.
+ * config.blockedKeystrokes =
+ * [
+ *     CKEDITOR.CTRL + 66 &#47;*B*&#47;,
+ *     CKEDITOR.CTRL + 73 &#47;*I*&#47;,
+ *     CKEDITOR.CTRL + 85 &#47;*U*&#47;
+ * ];
  */
 CKEDITOR.config.blockedKeystrokes =
@@ -164,7 +172,28 @@
  * A list associating keystrokes to editor commands. Each element in the list
  * is an array where the first item is the keystroke, and the second is the
- * command to be executed.
+ * name of the command to be executed.
  * @type Array
+ * @default (see example)
  * @example
+ * // This is actually the default value.
+ * config.keystrokes =
+ * [
+ *     [ CKEDITOR.ALT + 121 &#47;*F10*&#47;, 'toolbarFocus' ],
+ *     [ CKEDITOR.ALT + 122 &#47;*F11*&#47;, 'elementsPathFocus' ],
+ *
+ *     [ CKEDITOR.SHIFT + 121 &#47;*F10*&#47;, 'contextMenu' ],
+ *
+ *     [ CKEDITOR.CTRL + 90 &#47;*Z*&#47;, 'undo' ],
+ *     [ CKEDITOR.CTRL + 89 &#47;*Y*&#47;, 'redo' ],
+ *     [ CKEDITOR.CTRL + CKEDITOR.SHIFT + 90 &#47;*Z*&#47;, 'redo' ],
+ *
+ *     [ CKEDITOR.CTRL + 76 &#47;*L*&#47;, 'link' ],
+ *
+ *     [ CKEDITOR.CTRL + 66 &#47;*B*&#47;, 'bold' ],
+ *     [ CKEDITOR.CTRL + 73 &#47;*I*&#47;, 'italic' ],
+ *     [ CKEDITOR.CTRL + 85 &#47;*U*&#47;, 'underline' ],
+ *
+ *     [ CKEDITOR.ALT + 109 &#47;*-*&#47;, 'toolbarCollapse' ]
+ * ];
  */
 CKEDITOR.config.keystrokes =
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/link/dialogs/link.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/link/dialogs/link.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/link/dialogs/link.js	(revision 4056)
@@ -829,5 +829,6 @@
 						id : 'upload',
 						label : editor.lang.common.upload,
-						size : 38
+						style: 'height:40px',
+						size : 29
 					},
 					{
@@ -868,5 +869,5 @@
 										label : editor.lang.link.langDir,
 										'default' : '',
-										style : 'width: 100%;',
+										style : 'width:110px',
 										items :
 										[
@@ -881,4 +882,5 @@
 										type : 'text',
 										id : 'advAccessKey',
+										width : '80px',
 										label : editor.lang.link.acccessKey,
 										maxLength : 1,
@@ -906,4 +908,5 @@
 										label : editor.lang.link.langCode,
 										id : 'advLangCode',
+										width : '110px',
 										'default' : '',
 										setup : setupAdvParams,
@@ -915,4 +918,5 @@
 										label : editor.lang.link.tabIndex,
 										id : 'advTabIndex',
+										width : '80px',
 										maxLength : 5,
 										setup : setupAdvParams,
@@ -1018,14 +1022,14 @@
 					selection.selectElement( element );
 				}
+				else if ( ( element = rangeRoot.getAscendant( 'img', true ) ) &&
+						 element.getAttribute( '_cke_real_element_type' ) &&
+						 element.getAttribute( '_cke_real_element_type' ) == 'anchor' )
+				{
+					this.fakeObj = element;
+					element = editor.restoreRealElement( this.fakeObj );
+					selection.selectElement( this.fakeObj );
+				}
 				else
-				{
-					element = rangeRoot.getAscendant( 'img', true );
-					if ( element && element.getAttribute( '_cke_real_element_type' ) && element.getAttribute( '_cke_real_element_type' ) == 'anchor' )
-					{
-						this.fakeObj = element;
-						element = editor.restoreRealElement( this.fakeObj );
-						selection.selectElement( this.fakeObj );
-					}
-				}
+					element = null;
 			}
 
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/list/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/list/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/list/plugin.js	(revision 4056)
@@ -117,5 +117,6 @@
 						currentListItem.append( item.contents[i].clone( true, true ) );
 
-					if ( currentListItem.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT )
+					if ( currentListItem.type == CKEDITOR.NODE_DOCUMENT_FRAGMENT
+						 && currentIndex != listArray.length - 1 )
 					{
 						if ( currentListItem.getLast()
@@ -177,7 +178,12 @@
 	function onSelectionChange( evt )
 	{
-		var elements = evt.data.path.elements;
-
-		for ( var i = 0 ; i < elements.length ; i++ )
+		var path = evt.data.path,
+			blockLimit = path.blockLimit,
+			elements = path.elements,
+			element;
+
+		// Grouping should only happen under blockLimit.(#3940).
+		for ( var i = 0 ; i < elements.length && ( element = elements[ i ] )
+			  && !element.equals( blockLimit ); i++ )
 		{
 			if ( listNodeNames[ elements[i].getName() ] )
@@ -336,12 +342,21 @@
 
 		var newList = CKEDITOR.plugins.list.arrayToList( listArray, database, null, editor.config.enterMode );
-		// 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.getNext() || groupObj.root.getNext().$.nodeName.toLowerCase() == 'br' )
-		{
-			if ( newList.listNode.getLast().$.nodeName.toLowerCase() == 'br' )
-				newList.listNode.getLast().remove();
-		}
-		newList.listNode.replace( groupObj.root );
+
+		// Compensate <br> before/after the list node if the surrounds are non-blocks.(#3836)
+		var docFragment = newList.listNode, boundaryNode, siblingNode;
+		function compensateBrs( isStart )
+		{
+			if ( ( boundaryNode = docFragment[ isStart ? 'getFirst' : 'getLast' ]() )
+				 && !( boundaryNode.is && boundaryNode.isBlockBoundary() )
+				 && ( siblingNode = groupObj.root[ isStart ? 'getPrevious' : 'getNext' ]
+				      ( CKEDITOR.dom.walker.whitespaces( true ) ) )
+				 && !( siblingNode.is && siblingNode.isBlockBoundary( { br : 1 } ) ) )
+				editor.document.createElement( 'br' )[ isStart ? 'insertBefore' : 'insertAfter' ]( boundaryNode );
+		}
+		compensateBrs( true );
+		compensateBrs();
+
+		var rootParent = groupObj.root.getParent();
+		docFragment.replace( groupObj.root );
 	}
 
@@ -388,4 +403,16 @@
 					selection.selectRanges( ranges );
 				}
+				// Maybe a single range there enclosing the whole list,
+				// turn on the list state manually(#4129).
+				else
+				{
+					var range = ranges.length == 1 && ranges[ 0 ],
+						enclosedNode = range && range.getEnclosedNode();
+					if ( enclosedNode && enclosedNode.is
+						&& this.type == enclosedNode.getName() )
+					{
+						setState.call( this, editor, CKEDITOR.TRISTATE_ON );
+					}
+				}
 			}
 
@@ -399,10 +426,13 @@
 			while ( ranges.length > 0 )
 			{
-				var range = ranges.shift(),
-					boundaryNodes = range.getBoundaryNodes(),
+				range = ranges.shift();
+
+				var boundaryNodes = range.getBoundaryNodes(),
 					startNode = boundaryNodes.startNode,
 					endNode = boundaryNodes.endNode;
+
 				if ( startNode.type == CKEDITOR.NODE_ELEMENT && startNode.getName() == 'td' )
 					range.setStartAt( boundaryNodes.startNode, CKEDITOR.POSITION_AFTER_START );
+
 				if ( endNode.type == CKEDITOR.NODE_ELEMENT && endNode.getName() == 'td' )
 					range.setEndAt( boundaryNodes.endNode, CKEDITOR.POSITION_BEFORE_END );
@@ -410,4 +440,5 @@
 				var iterator = range.createIterator(),
 					block;
+
 				iterator.forceBrBreak = ( this.state == CKEDITOR.TRISTATE_OFF );
 
@@ -417,10 +448,11 @@
 						listNode = null,
 						processedFlag = false,
-						blockLimit = path.blockLimit;
+						blockLimit = path.blockLimit,
+						element;
 
 					// First, try to group by a list ancestor.
-					for ( var i = 0 ; i < path.elements.length ; i++ )
-					{
-						var element = path.elements[i];
+					for ( var i = 0 ; i < path.elements.length &&
+						  ( element = path.elements[ i ] ) && !element.equals( blockLimit ); i++ )
+					{
 						if ( listNodeNames[ element.getName() ] )
 						{
@@ -487,10 +519,12 @@
 				( mergeSibling = function( rtl ){
 
-					var sibling = listNode[ rtl ? 'getPrevious' : 'getNext' ].call( listNode, true );
+					var sibling = listNode[ rtl ?
+						'getPrevious' : 'getNext' ]( CKEDITOR.dom.walker.whitespaces( true ) );
 					if ( sibling && sibling.getName &&
 					     sibling.getName() == listCommand.type )
 					{
 						sibling.remove();
-						sibling.moveChildren( listNode );
+						// Move children order by merge direction.(#3820)
+						sibling.moveChildren( listNode, rtl ? true : false );
 					}
 				} )();
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/menu/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/menu/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/menu/plugin.js	(revision 4056)
@@ -107,4 +107,10 @@
 			add : function( item )
 			{
+				// Later we may sort the items, but Array#sort is not stable in
+				// some browsers, here we're forcing the original sequence with
+				// 'order' attribute if it hasn't been assigned. (#3868)
+				if ( !item.order )
+					item.order = this.items.length;
+
 				this.items.push( item );
 			},
@@ -343,5 +349,25 @@
 });
 
+/**
+ * The amount of time, in milliseconds, the editor waits before showing submenu
+ * options when moving the mouse over options that contains submenus, like the
+ * "Cell Properties" entry for tables.
+ * @type Number
+ * @default 400
+ * @example
+ * // Remove the submenu delay.
+ * config.menu_subMenuDelay = 0;
+ */
 CKEDITOR.config.menu_subMenuDelay = 400;
+
+/**
+ * A comma separated list of items group names to be displayed in the context
+ * menu. The items order will reflect the order in this list if no priority
+ * has been definted in the groups.
+ * @type String
+ * @default 'clipboard,form,tablecell,tablecellproperties,tablerow,tablecolumn,table,anchor,link,image,flash,checkbox,radio,textfield,hiddenfield,imagebutton,button,select,textarea'
+ * @example
+ * config.menu_groups = 'clipboard,table,anchor,link,image';
+ */
 CKEDITOR.config.menu_groups =
 	'clipboard,' +
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/menubutton/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/menubutton/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/menubutton/plugin.js	(revision 4056)
@@ -6,5 +6,5 @@
 CKEDITOR.plugins.add( 'menubutton',
 {
-	requires : [ 'button' ],
+	requires : [ 'button', 'contextmenu' ],
 	beforeInit : function( editor )
 	{
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/newpage/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/newpage/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/newpage/plugin.js	(revision 4056)
@@ -56,4 +56,10 @@
 	}
 });
-
+/**
+ * The HTML to load in the editor when the "new page" command is executed.
+ * @type String
+ * @default ''
+ * @example
+ * config.newpage_html = '&lt;p&gt;Type your text here.&lt;/p&gt;';
+ */
 CKEDITOR.config.newpage_html = '';
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/panel/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/panel/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/panel/plugin.js	(revision 4056)
@@ -79,5 +79,6 @@
 			'<div class="', editor.skinClass ,'"' +
 				' lang="', editor.langCode, '"' +
-				' style="z-index:' + ( editor.config.baseFloatZIndex + 1 ) + '">' +
+				// iframe loading need sometime, keep the panel hidden(#4186).
+				' style="display:none;z-index:' + ( editor.config.baseFloatZIndex + 1 ) + '">' +
 				'<div' +
 					' id=', id,
@@ -134,5 +135,4 @@
 					langCode = parentDiv.getParent().getAttribute( 'lang' ),
 					doc = iframe.getFrameDocument();
-
 				// Initialize the IFRAME document body.
 				doc.$.open();
@@ -141,4 +141,11 @@
 				if ( CKEDITOR.env.isCustomDomain() )
 					doc.$.domain = document.domain;
+
+				var onLoad = CKEDITOR.tools.addFunction( CKEDITOR.tools.bind( function( ev )
+					{
+						this.isLoaded = true;
+						if ( this.onLoad )
+							this.onLoad();
+					}, this ) );
 
 				doc.$.write(
@@ -148,5 +155,6 @@
 							'<style>.' + className + '_container{visibility:hidden}</style>' +
 						'</head>' +
-						'<body class="cke_' + dir + ' cke_panel_frame ' + CKEDITOR.env.cssClass + '" style="margin:0;padding:0">' +
+						'<body class="cke_' + dir + ' cke_panel_frame ' + CKEDITOR.env.cssClass + '" style="margin:0;padding:0"' +
+						' onload="( window.CKEDITOR || window.parent.CKEDITOR ).tools.callFunction(' + onLoad + ');">' +
 						'</body>' +
 						// It looks strange, but for FF2, the styles must go
@@ -161,12 +169,4 @@
 				// Register the CKEDITOR global.
 				win.$.CKEDITOR = CKEDITOR;
-
-				win.on( 'load', function( ev )
-					{
-						this.isLoaded = true;
-						if ( this.onLoad )
-							this.onLoad();
-					},
-					this);
 
 				doc.on( 'keydown', function( evt )
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/pastefromword/dialogs/pastefromword.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/pastefromword/dialogs/pastefromword.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/pastefromword/dialogs/pastefromword.js	(revision 4056)
@@ -19,4 +19,10 @@
 					+ 'var iframe = new window.parent.CKEDITOR.dom.element( frameElement );'
 					+ 'var dialog = iframe.getCustomData( "dialog" );'
+		      + ''
+					+ 'iframe.getFrameDocument().on( "keydown", function( e )\
+						{\
+							if ( e.data.getKeystroke() == 27 )\
+								dialog.hide();\
+						});'
 					+ 'dialog.fire( "iframeAdded", { iframe : iframe } );'
 				+ '};'
@@ -24,4 +30,7 @@
 		cleanWord : function( editor, html, ignoreFont, removeStyles )
 		{
+			// Remove comments [SF BUG-1481861].
+			html = html.replace(/<\!--[\s\S]*?-->/g, '' ) ;
+
 			html = html.replace(/<o:p>\s*<\/o:p>/g, '') ;
 			html = html.replace(/<o:p>[\s\S]*?<\/o:p>/g, '&nbsp;') ;
@@ -31,6 +40,6 @@
 
 			// Remove margin styles.
-			html = html.replace( /\s*MARGIN: 0cm 0cm 0pt\s*;/gi, '' ) ;
-			html = html.replace( /\s*MARGIN: 0cm 0cm 0pt\s*"/gi, "\"" ) ;
+			html = html.replace( /\s*MARGIN: 0(?:cm|in) 0(?:cm|in) 0pt\s*;/gi, '' ) ;
+			html = html.replace( /\s*MARGIN: 0(?:cm|in) 0(?:cm|in) 0pt\s*"/gi, "\"" ) ;
 
 			html = html.replace( /\s*TEXT-INDENT: 0cm\s*;/gi, '' ) ;
@@ -88,7 +97,4 @@
 			// Remove Tags with XML namespace declarations: <o:p><\/o:p>
 			html = html.replace(/<\/?\w+:[^>]*>/gi, '' ) ;
-
-			// Remove comments [SF BUG-1481861].
-			html = html.replace(/<\!--[\s\S]*?-->/g, '' ) ;
 
 			html = html.replace( /<(U|I|STRIKE)>&nbsp;<\/\1>/g, '&nbsp;' ) ;
@@ -228,4 +234,9 @@
 				this.getParentEditor().document.getBody().$.contentEditable = 'true';
 		},
+		onLoad : function()
+		{
+			if ( ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) && editor.lang.dir == 'rtl' )
+				this.parts.contents.setStyle( 'overflow', 'hidden' );
+		},
 		contents :
 		[
@@ -237,5 +248,5 @@
 					{
 						type : 'html',
-						style : 'white-space: normal;',
+						style : 'white-space:normal;width:346px;display:block',
 						onShow : function()
 						{
@@ -280,10 +291,11 @@
 								id : 'ignoreFontFace',
 								label : editor.lang.pastefromword.ignoreFontFace,
-								'default' : true
+								'default' : editor.config.pasteFromWordIgnoreFontFace
 							},
 							{
 								type : 'checkbox',
 								id : 'removeStyle',
-								label : editor.lang.pastefromword.removeStyle
+								label : editor.lang.pastefromword.removeStyle,
+								'default' : editor.config.pasteFromWordRemoveStyle
 							}
 						]
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/pastefromword/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/pastefromword/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/pastefromword/plugin.js	(revision 4056)
@@ -23,5 +23,32 @@
 } );
 
+/**
+ * Whether the "Ignore font face definitions" checkbox is enabled by default in
+ * the Paste from Word dialog.
+ * @type Boolean
+ * @default true
+ * @example
+ * config.pasteFromWordIgnoreFontFace = false;
+ */
 CKEDITOR.config.pasteFromWordIgnoreFontFace = true;
+
+/**
+ * Whether the "Remove styles definitions" checkbox is enabled by default in
+ * the Paste from Word dialog.
+ * @type Boolean
+ * @default false
+ * @example
+ * config.pasteFromWordRemoveStyle = true;
+ */
 CKEDITOR.config.pasteFromWordRemoveStyle = false;
+
+/**
+ * Whether to keep structure markup (&lt;h1&gt;, &lt;h2&gt;, etc.) or replace
+ * it with elements that create more similar pasting results when pasting
+ * content from Microsoft Word into the Paste from Word dialog.
+ * @type Boolean
+ * @default false
+ * @example
+ * config.pasteFromWordKeepsStructure = true;
+ */
 CKEDITOR.config.pasteFromWordKeepsStructure = false;
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/pastetext/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/pastetext/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/pastetext/plugin.js	(revision 4056)
@@ -47,6 +47,9 @@
 				editor.on( 'beforePaste', function( event )
 					{
-						setTimeout( function() { command.exec(); }, 0 );
-						event.cancel();
+						if ( editor.mode == "wysiwyg" )
+						{
+							setTimeout( function() { command.exec(); }, 0 );
+							event.cancel();
+						}
 					},
 					null, null, 20 );
@@ -128,3 +131,12 @@
 };
 
+/**
+ * Whether to force all pasting operations to insert on plain text into the
+ * editor, loosing any formatting information possibly available in the source
+ * text.
+ * @type Boolean
+ * @default false
+ * @example
+ * config.forcePasteAsPlainText = true;
+ */
 CKEDITOR.config.forcePasteAsPlainText = false;
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/removeformat/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/removeformat/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/removeformat/plugin.js	(revision 4056)
@@ -114,6 +114,19 @@
 };
 
-// Only inline elements are valid.
+/**
+ * A comma separated list of elements to be removed when executing the "remove
+ " format" command. Note that only inline elements are allowed.
+ * @type String
+ * @default 'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var'
+ * @example
+ */
 CKEDITOR.config.removeFormatTags = 'b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var';
 
+/**
+ * A comma separated list of elements attributes to be removed when executing
+ * the "remove format" command.
+ * @type String
+ * @default 'class,style,lang,width,height,align,hspace,valign'
+ * @example
+ */
 CKEDITOR.config.removeFormatAttributes = 'class,style,lang,width,height,align,hspace,valign';
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/resize/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/resize/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/resize/plugin.js	(revision 4056)
@@ -70,7 +70,46 @@
 } );
 
+/**
+ * The minimum editor width, in pixels, when resizing it with the resize handle.
+ * @type Number
+ * @default 750
+ * @example
+ * config.resize_minWidth = 500;
+ */
 CKEDITOR.config.resize_minWidth = 750;
+
+/**
+ * The minimum editor height, in pixels, when resizing it with the resize handle.
+ * @type Number
+ * @default 250
+ * @example
+ * config.resize_minHeight = 600;
+ */
 CKEDITOR.config.resize_minHeight = 250;
+
+/**
+ * The maximum editor width, in pixels, when resizing it with the resize handle.
+ * @type Number
+ * @default 3000
+ * @example
+ * config.resize_maxWidth = 750;
+ */
 CKEDITOR.config.resize_maxWidth = 3000;
+
+/**
+ * The maximum editor height, in pixels, when resizing it with the resize handle.
+ * @type Number
+ * @default 3000
+ * @example
+ * config.resize_maxHeight = 600;
+ */
 CKEDITOR.config.resize_maxHeight = 3000;
+
+/**
+ * Whether to enable the resizing feature. If disabed the resize handler will not be visible.
+ * @type Boolean
+ * @default true
+ * @example
+ * config.resize_enabled = false;
+ */
 CKEDITOR.config.resize_enabled = true;
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/scayt/dialogs/options.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/scayt/dialogs/options.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/scayt/dialogs/options.js	(revision 4056)
@@ -9,5 +9,8 @@
 		captions,
 		doc = CKEDITOR.document,
-		fckLang = 'en';
+		tags = [],
+		i,
+		contents = [],
+		userDicActive = false;
 	var dic_buttons = [
 		// [0] contains buttons for creating
@@ -16,365 +19,5 @@
 		"dic_rename,dic_delete"
 	];
-
-	var init_with_captions = function()
-	{
-		var dialog = this,
-			lang_list = dialog.data.scayt.getLangList(),
-			buttons = [ 'dic_create','dic_delete','dic_rename','dic_restore' ],
-			labels = [ 'mixedCase','mixedWithDigits','allCaps','ignoreDomainNames' ],
-			i;
-
-		// Add buttons titles
-		for ( i in buttons )
-		{
-			var button = buttons[ i ];
-			doc.getById( button ).setHtml( '<span class="cke_dialog_ui_button">' + captions[ 'button_' + button]  +'</span>' );
-		}
-		doc.getById( 'dic_info' ).setHtml( captions[ 'dic_info' ] );
-
-		// Fill options and dictionary labels.
-		for ( i in labels )
-		{
-			var label = 'label_' + labels[ i ],
-				labelElement = doc.getById( label );
-
-			if (  'undefined' != typeof labelElement
-			   && 'undefined' != typeof captions[ label ]
-			   && 'undefined' != typeof dialog.options[labels[ i ]] )
-			{
-				labelElement.setHtml( captions[ label ] );
-				var labelParent = labelElement.getParent();
-				labelParent.$.style.display = "block";
-			}
-		}
-
-		var about = '<p>' + captions[ 'about_throwt_image' ] + '</p>'+
-					'<p>' + captions[ 'version' ]  + dialog.data.scayt.version.toString() + '</p>' +
-					'<p>' + captions[ 'about_throwt_copy' ] + '</p>';
-
-		doc.getById( 'scayt_about' ).setHtml( about );
-
-		// Create languages tab.
-		var createOption = function( option, list )
-		{
-			var label = doc.createElement( 'label' );
-			label.setAttribute( 'for', 'cke_option' + option );
-			label.setHtml( list[ option ] );
-
-			if ( dialog.sLang == option )	// Current.
-				dialog.chosed_lang = option;
-
-			var div = doc.createElement( 'div' );
-			var radio = CKEDITOR.dom.element.createFromHtml( '<input id="cke_option' +
-					option + '" type="radio" ' +
-					( dialog.sLang == option ? 'checked="checked"' : '' ) +
-					' value="' + option + '" name="scayt_lang" />' );
-
-			radio.on( 'click', function()
-				{
-					this.$.checked = true;
-					dialog.chosed_lang = option;
-				});
-
-			div.append( radio );
-			div.append( label );
-
-			return {
-				lang : list[ option ],
-				code : option,
-				radio : div
-			};
-		};
-
-		var langList = [];
-		for ( i in lang_list.rtl )
-			langList[ langList.length ] = createOption( i, lang_list.ltr );
-
-		for ( i in lang_list.ltr )
-			langList[ langList.length  ] = createOption( i, lang_list.ltr );
-
-		langList.sort( 	function( lang1, lang2 )
-			{
-				return ( lang2.lang > lang1.lang ) ? -1 : 1 ;
-			});
-
-		var fieldL = doc.getById( 'scayt_lcol' ),
-			fieldR = doc.getById( 'scayt_rcol' );
-		for ( i=0; i < langList.length; i++ )
-		{
-			var field = ( i < langList.length / 2 ) ? fieldL : fieldR;
-			field.append( langList[ i ].radio );
-		}
-
-		// user dictionary handlers
-		var dic = {};
-		dic.dic_create = function( el, dic_name , dic_buttons )
-			{
-				// comma separated button's ids include repeats if exists
-				var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];
-
-				var err_massage = captions["err_dic_create"];
-				var suc_massage = captions["succ_dic_create"];
-				//console.info("--plugin ");
-
-				scayt.createUserDictionary(dic_name,
-					function(arg)
-						{
-							//console.info( "dic_create callback called with args" , arg );
-							hide_dic_buttons ( all_buttons );
-							display_dic_buttons ( dic_buttons[1] );
-							suc_massage = suc_massage.replace("%s" , arg.dname );
-							dic_success_message (suc_massage);
-						},
-					function(arg)
-						{
-							//console.info( "dic_create errorback called with args" , arg )
-							err_massage = err_massage.replace("%s" ,arg.dname );
-							dic_error_message ( err_massage + "( "+ (arg.message || "") +")");
-						});
-
-			};
-
-		dic.dic_rename = function( el, dic_name , dic_buttons )
-			{
-				//
-				// try to rename dictionary
-				// @TODO: rename dict
-				//console.info ( captions["err_dic_rename"] )
-				var err_massage = captions["err_dic_rename"] || "";
-				var suc_massage = captions["succ_dic_rename"] || "";
-				scayt.renameUserDictionary(dic_name,
-					function(arg)
-						{
-							//console.info( "dic_rename callback called with args" , arg );
-							suc_massage = suc_massage.replace("%s" , arg.dname );
-							set_dic_name( dic_name );
-							dic_success_message ( suc_massage );
-						},
-					function(arg)
-						{
-							//console.info( "dic_rename errorback called with args" , arg )
-							err_massage = err_massage.replace("%s" , arg.dname  );
-							set_dic_name( dic_name );
-							dic_error_message( err_massage + "( " + ( arg.message || "" ) + " )" );
-						});
-			};
-
-		dic.dic_delete = function ( el, dic_name , dic_buttons )
-			{
-				var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];
-				var err_massage = captions["err_dic_delete"];
-				var suc_massage = captions["succ_dic_delete"];
-
-				// try to delete dictionary
-				// @TODO: delete dict
-				scayt.deleteUserDictionary(
-					function(arg)
-						{
-							//console.info( "dic_delete callback " , dic_name ,arg );
-							suc_massage = suc_massage.replace("%s" , arg.dname );
-							hide_dic_buttons ( all_buttons );
-							display_dic_buttons ( dic_buttons[0] );
-							set_dic_name( "" ); // empty input field
-							dic_success_message( suc_massage );
-						},
-					function(arg)
-						{
-							//console.info( " dic_delete errorback called with args" , arg )
-							err_massage = err_massage.replace("%s" , arg.dname );
-							dic_error_message(err_massage);
-						});
-			};
-
-		dic.dic_restore = dialog.dic_restore || function ( el, dic_name , dic_buttons )
-			{
-				// try to restore existing dictionary
-				var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];
-				var err_massage = captions["err_dic_restore"];
-				var suc_massage = captions["succ_dic_restore"];
-
-				scayt.restoreUserDictionary(dic_name,
-					function(arg)
-						{
-							//console.info( "dic_restore callback called with args" , arg );
-							suc_massage = suc_massage.replace("%s" , arg.dname );
-							hide_dic_buttons ( all_buttons );
-							display_dic_buttons(dic_buttons[1]);
-							dic_success_message( suc_massage );
-						},
-					function(arg)
-						{
-							//console.info( " dic_restore errorback called with args" , arg )
-							err_massage = err_massage.replace("%s" , arg.dname );
-							dic_error_message( err_massage );
-						});
-			};
-
-		// ** bind event listeners
-		var arr_buttons = ( dic_buttons[0] + ',' + dic_buttons[1] ).split( ',' ),
-			l;
-
-		for ( i = 0, l = arr_buttons.length ; i < l ; i += 1 )
-		{
-		 	var dic_button = doc.getById(arr_buttons[i]);
-
-			dic_button.on( 'click', function ()
-				{
-					var dic_name = doc.getById('dic_name').getValue();
-					if ( !dic_name )
-					{
-						dic_error_message(" Dictionary name should not be empty. ");
-						return false;
-					}
-					//apply handler
-					dic[ this.getId() ].apply( null, [ this, dic_name, dic_buttons ] );
-
-					return true;
-				});
-		}
-	};
-	var reload = function()
-	{
-		var dialog = this;
-
-		// Animate options.
-		for ( var i in dialog.options )
-		{
-			var checkbox = doc.getById( i );
-			if ( checkbox )
-			{
-				checkbox.removeAttribute( 'checked' );
-				if ( dialog.options[ i ] == 1 )
-					checkbox.setAttribute( 'checked', 'checked' );
-
-				// Bind events. Do it only once.
-				if ( firstLoad )
-				{
-					checkbox.on( 'click', function()
-						{
-							dialog.options[ this.getId() ] = this.$.checked ? 1 : 0 ;
-						} );
-				}
-			}
-		}
-
-		// * user dictionary
-		scayt.getNameUserDictionary(
-			function( o )
-			{
-				var dic_name = o.dname;
-				if ( dic_name )
-				{
-					doc.getById( 'dic_name' ).setValue(dic_name);
-					display_dic_buttons( dic_buttons[1] );
-				}
-				else
-					display_dic_buttons( dic_buttons[0] );
-
-			},
-			function ()
-				{
-					doc.getById( 'dic_name' ).setValue("");
-				});
-
-		dic_success_message("");
-	};
-
-	function dic_error_message ( m )
-		{
-			doc.getById('dic_message').setHtml('<span style="color:red;">' + m + '</span>' );
-		}
-        function dic_success_message ( m )
-		{
-			doc.getById('dic_message').setHtml('<span style="color:blue;">' + m + '</span>') ;
-		}
-	function display_dic_buttons ( sIds )
-		{
-
-			sIds = new String( sIds );
-			var aIds = sIds.split(',');
-			for ( var i=0, l = aIds.length; i < l ; i+=1)
-			{
-				doc.getById( aIds[i] ).$.style.display = "inline";
-			}
-
-		}
-	function hide_dic_buttons ( sIds )
-		{
-			sIds = new String( sIds );
-			var aIds = sIds.split(',');
-			for ( var i = 0, l = aIds.length; i < l ; i += 1 )
-			{
-				doc.getById( aIds[i] ).$.style.display = "none";
-			}
-		}
-	function set_dic_name ( dic_name )
-		{
-			doc.getById('dic_name').$.value= dic_name;
-		}
-
-	return {
-		title : editor.lang.scayt.title,
-		minWidth : 340,
-		minHeight : 200,
-		onShow : function()
-			{
-				var dialog = this;
-				dialog.data = editor.fire( 'scaytDialog', {} );
-				dialog.options = dialog.data.scayt_control.option();
-				dialog.sLang = dialog.data.scayt_control.sLang;
-
-				if ( !dialog.data || !dialog.data.scayt || !dialog.data.scayt_control )
-				{
-					alert( 'Error loading application service' );
-					dialog.hide();
-					return;
-				}
-
-				var stop = 0;
-				if ( firstLoad )
-				{
-					dialog.data.scayt.getCaption( 'en', function( caps )
-						{
-							if ( stop++ > 0 )	// Once only
-								return;
-							captions = caps;
-							init_with_captions.apply( dialog );
-							reload.apply( dialog );
-							firstLoad = false;
-						});
-				}
-				else
-					reload.apply( dialog );
-
-				dialog.selectPage( dialog.data.tab );
-			},
-			onOk : function()
-			{
-				var scayt_control =  this.data.scayt_control,
-					o = scayt_control.option(),
-					c = 0;
-
-				// Set up options if any was set.
-				for ( var oN in this.options )
-				{
-					if (o[oN] != this.options[ oN ] && c === 0 )
-					{
-						scayt_control.option( this.options );
-						c++;
-					}
-				}
-
-				// Setup languge if it was changed.
-				var csLang = this.chosed_lang;
-				if ( csLang && this.data.sLang != csLang )
-				{
-					scayt_control.setLang( csLang );
-					c++;
-				}
-				if ( c > 0 )
-					scayt_control.refresh();
-			},
-			contents : [
+	var tags_contents =  [
 				{
 					id : 'options',
@@ -464,5 +107,388 @@
 					]
 				}
-			]
+			];
+	var dialogDefiniton = {
+		title : editor.lang.scayt.title,
+		minWidth : 340,
+		minHeight : 200,
+		onShow : function()
+		{
+			var dialog = this;
+			dialog.data = editor.fire( 'scaytDialog', {} );
+			dialog.options = dialog.data.scayt_control.option();
+			dialog.sLang = dialog.data.scayt_control.sLang;
+
+			if ( !dialog.data || !dialog.data.scayt || !dialog.data.scayt_control )
+			{
+				alert( 'Error loading application service' );
+				dialog.hide();
+				return;
+			}
+
+			var stop = 0;
+			if ( firstLoad )
+			{
+				dialog.data.scayt.getCaption( 'en', function( caps )
+					{
+						if ( stop++ > 0 )	// Once only
+							return;
+						captions = caps;
+						init_with_captions.apply( dialog );
+						reload.apply( dialog );
+						firstLoad = false;
+					});
+			}
+			else
+				reload.apply( dialog );
+
+			dialog.selectPage( dialog.data.tab );
+		},
+		onOk : function()
+		{
+			var scayt_control =  this.data.scayt_control,
+				o = scayt_control.option(),
+				c = 0;
+
+			// Set up options if any was set.
+			for ( var i in this.options )
+			{
+				if (o[i] != this.options[ i ] && c === 0 )
+				{
+					scayt_control.option( this.options );
+					c++;
+				}
+			}
+
+			// Setup languge if it was changed.
+			var csLang = this.chosed_lang;
+			if ( csLang && this.data.sLang != csLang )
+			{
+				scayt_control.setLang( csLang );
+				c++;
+			}
+			if ( c > 0 )
+				scayt_control.refresh();
+		},
+		contents : contents
         };
+
+	var scayt_control = CKEDITOR.plugins.scayt.getScayt( editor );
+	if ( scayt_control )
+	{
+		tags = scayt_control.uiTags;
+	}
+
+	for ( i in tags ) {
+		if ( tags[ i ] == 1 )
+			contents[ contents.length ] = tags_contents[ i ];
+	}
+	if ( tags[2] == 1 )
+		userDicActive = true;
+
+	function onDicButtonClick()
+	{
+		var dic_name = doc.getById('dic_name').getValue();
+		if ( !dic_name )
+		{
+			dic_error_message(" Dictionary name should not be empty. ");
+			return false;
+		}
+		//apply handler
+		window.dic[ this.getId() ].apply( null, [ this, dic_name, dic_buttons ] );
+
+		return true;
+	}
+	var init_with_captions = function()
+	{
+		var dialog = this,
+			lang_list = dialog.data.scayt.getLangList(),
+			buttons = [ 'dic_create','dic_delete','dic_rename','dic_restore' ],
+			labels = [ 'mixedCase','mixedWithDigits','allCaps','ignoreDomainNames' ],
+			i;
+
+		// Add buttons titles
+		if (userDicActive)
+		{
+			for ( i in buttons )
+			{
+				var button = buttons[ i ];
+				doc.getById( button ).setHtml( '<span class="cke_dialog_ui_button">' + captions[ 'button_' + button]  +'</span>' );
+			}
+			doc.getById( 'dic_info' ).setHtml( captions[ 'dic_info' ] );
+		}
+
+
+		// Fill options and dictionary labels.
+		for ( i in labels )
+		{
+			var label = 'label_' + labels[ i ],
+				labelElement = doc.getById( label );
+
+			if (  'undefined' != typeof labelElement
+			   && 'undefined' != typeof captions[ label ]
+			   && 'undefined' != typeof dialog.options[labels[ i ]] )
+			{
+				labelElement.setHtml( captions[ label ] );
+				var labelParent = labelElement.getParent();
+				labelParent.$.style.display = "block";
+			}
+		}
+
+		var about = '<p>' + captions[ 'about_throwt_image' ] + '</p>'+
+					'<p>' + captions[ 'version' ]  + dialog.data.scayt.version.toString() + '</p>' +
+					'<p>' + captions[ 'about_throwt_copy' ] + '</p>';
+
+		doc.getById( 'scayt_about' ).setHtml( about );
+
+		// Create languages tab.
+		var createOption = function( option, list )
+		{
+			var label = doc.createElement( 'label' );
+			label.setAttribute( 'for', 'cke_option' + option );
+			label.setHtml( list[ option ] );
+
+			if ( dialog.sLang == option )	// Current.
+				dialog.chosed_lang = option;
+
+			var div = doc.createElement( 'div' );
+			var radio = CKEDITOR.dom.element.createFromHtml( '<input id="cke_option' +
+					option + '" type="radio" ' +
+					( dialog.sLang == option ? 'checked="checked"' : '' ) +
+					' value="' + option + '" name="scayt_lang" />' );
+
+			radio.on( 'click', function()
+				{
+					this.$.checked = true;
+					dialog.chosed_lang = option;
+				});
+
+			div.append( radio );
+			div.append( label );
+
+			return {
+				lang : list[ option ],
+				code : option,
+				radio : div
+			};
+		};
+
+		var langList = [];
+		for ( i in lang_list.rtl )
+			langList[ langList.length ] = createOption( i, lang_list.ltr );
+
+		for ( i in lang_list.ltr )
+			langList[ langList.length  ] = createOption( i, lang_list.ltr );
+
+		langList.sort( 	function( lang1, lang2 )
+			{
+				return ( lang2.lang > lang1.lang ) ? -1 : 1 ;
+			});
+
+		var fieldL = doc.getById( 'scayt_lcol' ),
+			fieldR = doc.getById( 'scayt_rcol' );
+		for ( i=0; i < langList.length; i++ )
+		{
+			var field = ( i < langList.length / 2 ) ? fieldL : fieldR;
+			field.append( langList[ i ].radio );
+		}
+
+		// user dictionary handlers
+		var dic = {};
+		dic.dic_create = function( el, dic_name , dic_buttons )
+			{
+				// comma separated button's ids include repeats if exists
+				var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];
+
+				var err_massage = captions["err_dic_create"];
+				var suc_massage = captions["succ_dic_create"];
+				//console.info("--plugin ");
+
+				window.scayt.createUserDictionary(dic_name,
+					function(arg)
+						{
+							//console.info( "dic_create callback called with args" , arg );
+							hide_dic_buttons ( all_buttons );
+							display_dic_buttons ( dic_buttons[1] );
+							suc_massage = suc_massage.replace("%s" , arg.dname );
+							dic_success_message (suc_massage);
+						},
+					function(arg)
+						{
+							//console.info( "dic_create errorback called with args" , arg )
+							err_massage = err_massage.replace("%s" ,arg.dname );
+							dic_error_message ( err_massage + "( "+ (arg.message || "") +")");
+						});
+
+			};
+
+		dic.dic_rename = function( el, dic_name )
+			{
+				//
+				// try to rename dictionary
+				// @TODO: rename dict
+				//console.info ( captions["err_dic_rename"] )
+				var err_massage = captions["err_dic_rename"] || "";
+				var suc_massage = captions["succ_dic_rename"] || "";
+				window.scayt.renameUserDictionary(dic_name,
+					function(arg)
+						{
+							//console.info( "dic_rename callback called with args" , arg );
+							suc_massage = suc_massage.replace("%s" , arg.dname );
+							set_dic_name( dic_name );
+							dic_success_message ( suc_massage );
+						},
+					function(arg)
+						{
+							//console.info( "dic_rename errorback called with args" , arg )
+							err_massage = err_massage.replace("%s" , arg.dname  );
+							set_dic_name( dic_name );
+							dic_error_message( err_massage + "( " + ( arg.message || "" ) + " )" );
+						});
+			};
+
+		dic.dic_delete = function ( el, dic_name , dic_buttons )
+			{
+				var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];
+				var err_massage = captions["err_dic_delete"];
+				var suc_massage = captions["succ_dic_delete"];
+
+				// try to delete dictionary
+				// @TODO: delete dict
+				window.scayt.deleteUserDictionary(
+					function(arg)
+						{
+							//console.info( "dic_delete callback " , dic_name ,arg );
+							suc_massage = suc_massage.replace("%s" , arg.dname );
+							hide_dic_buttons ( all_buttons );
+							display_dic_buttons ( dic_buttons[0] );
+							set_dic_name( "" ); // empty input field
+							dic_success_message( suc_massage );
+						},
+					function(arg)
+						{
+							//console.info( " dic_delete errorback called with args" , arg )
+							err_massage = err_massage.replace("%s" , arg.dname );
+							dic_error_message(err_massage);
+						});
+			};
+
+		dic.dic_restore = dialog.dic_restore || function ( el, dic_name , dic_buttons )
+			{
+				// try to restore existing dictionary
+				var all_buttons = dic_buttons[0] + ',' + dic_buttons[1];
+				var err_massage = captions["err_dic_restore"];
+				var suc_massage = captions["succ_dic_restore"];
+
+				window.scayt.restoreUserDictionary(dic_name,
+					function(arg)
+						{
+							//console.info( "dic_restore callback called with args" , arg );
+							suc_massage = suc_massage.replace("%s" , arg.dname );
+							hide_dic_buttons ( all_buttons );
+							display_dic_buttons(dic_buttons[1]);
+							dic_success_message( suc_massage );
+						},
+					function(arg)
+						{
+							//console.info( " dic_restore errorback called with args" , arg )
+							err_massage = err_massage.replace("%s" , arg.dname );
+							dic_error_message( err_massage );
+						});
+			};
+
+		// ** bind event listeners
+		var arr_buttons = ( dic_buttons[0] + ',' + dic_buttons[1] ).split( ',' ),
+			l;
+
+		for ( i = 0, l = arr_buttons.length ; i < l ; i += 1 )
+		{
+		 	var dic_button = doc.getById(arr_buttons[i]);
+			if ( dic_button )
+				dic_button.on( 'click', onDicButtonClick, this );
+		}
+	};
+
+	var reload = function()
+	{
+		var dialog = this;
+
+		// Animate options.
+		for ( var i in dialog.options )
+		{
+			var checkbox = doc.getById( i );
+			if ( checkbox )
+			{
+				checkbox.removeAttribute( 'checked' );
+				if ( dialog.options[ i ] == 1 )
+					checkbox.setAttribute( 'checked', 'checked' );
+
+				// Bind events. Do it only once.
+				if ( firstLoad )
+				{
+					checkbox.on( 'click', function()
+						{
+							dialog.options[ this.getId() ] = this.$.checked ? 1 : 0 ;
+						} );
+				}
+			}
+		}
+
+		// * user dictionary
+		if ( userDicActive ){
+			window.scayt.getNameUserDictionary(
+			function( o )
+			{
+				var dic_name = o.dname;
+				if ( dic_name )
+				{
+					doc.getById( 'dic_name' ).setValue(dic_name);
+					display_dic_buttons( dic_buttons[1] );
+				}
+				else
+					display_dic_buttons( dic_buttons[0] );
+
+			},
+			function ()
+			{
+				doc.getById( 'dic_name' ).setValue("");
+			});
+			dic_success_message("");
+		}
+
+	};
+
+	function dic_error_message ( m )
+		{
+			doc.getById('dic_message').setHtml('<span style="color:red;">' + m + '</span>' );
+		}
+    function dic_success_message ( m )
+		{
+			doc.getById('dic_message').setHtml('<span style="color:blue;">' + m + '</span>') ;
+		}
+	function display_dic_buttons ( sIds )
+		{
+
+			sIds = String( sIds );
+			var aIds = sIds.split(',');
+			for ( var i=0, l = aIds.length; i < l ; i+=1)
+			{
+				doc.getById( aIds[i] ).$.style.display = "inline";
+			}
+
+		}
+	function hide_dic_buttons ( sIds )
+		{
+			sIds = String( sIds );
+			var aIds = sIds.split(',');
+			for ( var i = 0, l = aIds.length; i < l ; i += 1 )
+			{
+				doc.getById( aIds[i] ).$.style.display = "none";
+			}
+		}
+	function set_dic_name ( dic_name )
+		{
+			doc.getById('dic_name').$.value= dic_name;
+		}
+
+	return dialogDefiniton;
 });
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/scayt/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/scayt/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/scayt/plugin.js	(revision 4056)
@@ -12,6 +12,4 @@
 {
 	var commandName 	= 'scaytcheck',
-		sc_on_cssclass 	= 'scayt_enabled',
-		sc_off_cssclass = 'scayt_disabled',
 		openPage		= '';
 
@@ -19,14 +17,27 @@
 	{
 		var editor = this;
-		dojo.requireLocalization( 'scayt', 'caption', '', 'ROOT' );
 
 		var createInstance = function()	// Create new instance every time Document is created.
 		{
 			// Initialise Scayt instance.
-			var oParams = CKEDITOR.config.scaytParams || {};
+			var oParams = {};
 			oParams.srcNodeRef = editor.document.getWindow().$.frameElement; 		// Get the iframe.
 			// syntax : AppName.AppVersion@AppRevision
 			oParams.assocApp  = "CKEDITOR." + CKEDITOR.version + "@" + CKEDITOR.revision;
-			var scayt_control = new scayt( oParams );
+
+			oParams.customerid = editor.config.scayt_customerid  || "1:11111111111111111111111111111111111111";
+			oParams.customDictionaryName = editor.config.scayt_customDictionaryName;
+			oParams.userDictionaryName = editor.config.scayt_userDictionaryName;
+			oParams.defLang = editor.scayt_defLang;
+
+			if ( CKEDITOR._scaytParams )
+			{
+				for ( var k in CKEDITOR._scaytParams )
+				{
+					oParams[ k ] = CKEDITOR._scaytParams[ k ];
+				}
+			}
+
+			var scayt_control = new window.scayt( oParams );
 
 			// Copy config.
@@ -68,11 +79,12 @@
 		editor.on( 'beforeCommandExec', function( ev )		// Disable SCAYT before Source command execution.
 			{
-				if ( ev.data.name == 'source' && editor.mode == 'wysiwyg' )
-				{
-					var scayt = plugin.getScayt( editor );
-					if ( scayt )
-					{
-						scayt.paused = !scayt.disabled;
-						scayt.setDisabled( true );
+				if ( (ev.data.name == 'source' ||  ev.data.name == 'newpage') && editor.mode == 'wysiwyg' )
+				{
+					var scayt_instanse = plugin.getScayt( editor );
+					if ( scayt_instanse )
+					{
+						scayt_instanse.paused = !scayt_instanse.disabled;
+						scayt_instanse.destroy();
+						delete plugin.instances[ editor.name ];
 					}
 				}
@@ -86,10 +98,29 @@
 			});
 
+		// Reload spell-checking for current word after insertion completed.
+		editor.on( 'insertElement', function()
+			{
+				var scayt_instance = plugin.getScayt( editor );
+				if ( plugin.isScaytEnabled( editor ) )
+				{
+					// Unlock the selection before reload, SCAYT will take
+					// care selection update.
+					if ( CKEDITOR.env.ie )
+						editor.getSelection().unlock( true );
+
+					// Swallow any SCAYT engine errors.
+					try{
+						scayt_instance.refresh();
+					}catch( er )
+					{}
+				}
+			}, this, null, 50 );
+
 		editor.on( 'scaytDialog', function( ev )	// Communication with dialog.
 			{
-				ev.data.djConfig = djConfig;
+				ev.data.djConfig = window.djConfig;
 				ev.data.scayt_control = plugin.getScayt( editor );
 				ev.data.tab = openPage;
-				ev.data.scayt = scayt;
+				ev.data.scayt = window.scayt;
 			});
 
@@ -125,16 +156,15 @@
 		getScayt : function( editor )
 		{
-			var instance = this.instances[ editor.name ];
-			return instance;
+			return this.instances[ editor.name ];
 		},
 		isScaytReady : function( editor )
 		{
 			return this.engineLoaded === true &&
-				'undefined' !== typeof scayt && this.getScayt( editor );
+				'undefined' !== typeof window.scayt && this.getScayt( editor );
 		},
 		isScaytEnabled : function( editor )
 		{
-			var scayt = this.getScayt( editor );
-			return ( scayt ) ? scayt.disabled === false : false;
+			var scayt_instanse = this.getScayt( editor );
+			return ( scayt_instanse ) ? scayt_instanse.disabled === false : false;
 		},
 		loadEngine : function( editor )
@@ -155,19 +185,15 @@
 
 			this.engineLoaded = -1;	// Loading in progress.
-			// assign diojo configurable vars
-			var parseUrl =  function(data)
-				{
-					var m = data.match(/(.*)[\/\\]([^\/\\]+\.\w+)$/);
-					return { path: m[1], file: m[2] };
-				};
 
 			// compose scayt url
 			var protocol = document.location.protocol;
-			var baseUrl  = "svc.spellchecker.net/spellcheck/lf/scayt/scayt.js";
-			var scaytUrl  =  editor.config.scaytParams.srcScayt ||
-				(protocol + "//" + baseUrl);
-			var scaytConfigBaseUrl = parseUrl(scaytUrl).path +  "/";
-
-			djScaytConfig =
+			// Default to 'http' for unknown.
+			protocol = protocol.search( /https?:/) != -1? protocol : 'http:';
+			var baseUrl  = "svc.spellchecker.net/spellcheck/lf/scayt/scayt1.js";
+
+			var scaytUrl  =  editor.config.scayt_srcUrl || ( protocol + "//" + baseUrl );
+			var scaytConfigBaseUrl =  plugin.parseUrl( scaytUrl ).path +  "/";
+
+			CKEDITOR._djScaytConfig =
 			{
 				baseUrl: scaytConfigBaseUrl,
@@ -194,4 +220,12 @@
 
 			return null;
+		},
+		parseUrl : function ( data )
+		{
+			var match;
+			if ( data.match && ( match = data.match(/(.*)[\/\\](.*?\.\w+)$/) ) )
+				return { path: match[1], file: match[2] };
+			else
+				return data;
 		}
 	};
@@ -312,7 +346,4 @@
 				});
 
-			// Disabling it on IE for now, as it's blocking the browser (#3802).
-			if ( !CKEDITOR.env.ie )
-			{
 				editor.ui.add( 'Scayt', CKEDITOR.UI_MENUBUTTON,
 					{
@@ -322,15 +353,15 @@
 						onRender: function()
 						{
-							command.on( 'state', function()
-								{
-									this.setState( command.state );
-								},
-								this);
-						},
-						onMenu : function()
-						{
-							var isEnabled = plugin.isScaytEnabled( editor );
-
-							editor.getMenuItem( 'scaytToggle' ).label = editor.lang.scayt[ isEnabled ? 'disable' : 'enable' ];
+						command.on( 'state', function()
+							{
+								this.setState( command.state );
+							},
+							this);
+					},
+					onMenu : function()
+					{
+						var isEnabled = plugin.isScaytEnabled( editor );
+
+						editor.getMenuItem( 'scaytToggle' ).label = editor.lang.scayt[ isEnabled ? 'disable' : 'enable' ];
 
 							return {
@@ -342,16 +373,15 @@
 						}
 					});
-			}
 
 			// If the "contextmenu" plugin is loaded, register the listeners.
 			if ( editor.contextMenu && editor.addMenuItems )
 			{
-				editor.contextMenu.addListener( function( element, selection )
-					{
-						var scayt_control = plugin.getScayt( editor );
-						if ( !plugin.isScaytEnabled( editor ) || !element || !element.$ )
+				editor.contextMenu.addListener( function( element )
+					{
+						if ( !( plugin.isScaytEnabled( editor ) && element ) )
 							return null;
 
-						var word = scayt_control.getWord( element.$ );
+						var scayt_control = plugin.getScayt( editor ),
+							word = scayt_control.getWord( element.$ );
 
 						if ( !word )
@@ -360,5 +390,5 @@
 						var sLang = scayt_control.getLang(),
 							_r = {},
-							items_suggestion = scayt.getSuggestion( word, sLang );
+							items_suggestion = window.scayt.getSuggestion( word, sLang );
 						if (!items_suggestion || !items_suggestion.length )
 							return null;
@@ -385,5 +415,5 @@
 								{
 									return {
-										exec: function( editor )
+										exec: function()
 										{
 											scayt_control.replace(el, s);
@@ -439,5 +469,5 @@
 							exec: function()
 							{
-								scayt.addWordToUserDictionary( element.$ );
+								window.scayt.addWordToUserDictionary( element.$ );
 							}
 						};
@@ -455,9 +485,6 @@
 						mainSuggestions[ 'scayt_add_word' ] = CKEDITOR.TRISTATE_OFF;
 
-						// ** ahow ads entry point
-						// ** hide ads listener register
-//						try{
-							//scayt_control.showBanner( editor )
-//						}catch(err){}
+						if ( scayt_control.fireOnContextMenu )
+							scayt_control.fireOnContextMenu( editor );
 
 						return mainSuggestions;
@@ -481,5 +508,4 @@
 })();
 
-CKEDITOR.config.scaytParams = CKEDITOR.config.scaytParams || {};
-CKEDITOR.config.scayt_maxSuggestions = 5;
+CKEDITOR.config.scayt_maxSuggestions =  5;
 CKEDITOR.config.scayt_autoStartup = false;
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/selection/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/selection/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/selection/plugin.js	(revision 4056)
@@ -134,5 +134,8 @@
 							});
 
-						editor.window.on( 'blur', function()
+						// Check document selection before 'blur' fired, this
+						// will prevent us from breaking text selection somewhere
+						// else on the host page.(#3909)
+						editor.document.on( 'beforedeactivate', function()
 							{
 								// Disable selections from being saved.
@@ -489,5 +492,8 @@
 
 						testRange.setEndPoint( 'StartToStart', range );
-						var distance = testRange.text.length;
+						// IE report line break as CRLF with range.text but
+						// only LF with textnode.nodeValue, normalize them to avoid
+						// breaking character counting logic below. (#3949)
+						var distance = testRange.text.replace( /(\r\n|\r)/g, '\n' ).length;
 
 						while ( distance > 0 )
@@ -778,5 +784,5 @@
 			if ( this.isLocked )
 			{
-				var range = new CKEDITOR.dom.range();
+				var range = new CKEDITOR.dom.range( this.document );
 				range.setStartBefore( element );
 				range.setEndAfter( element );
@@ -856,5 +862,18 @@
 					var range = ranges[ i ];
 					var nativeRange = this.document.$.createRange();
-					nativeRange.setStart( range.startContainer.$, range.startOffset );
+					var startContainer = range.startContainer;
+
+					// In FF2, if we have a collapsed range, inside an empty
+					// element, we must add something to it otherwise the caret
+					// will not be visible.
+					if ( range.collapsed &&
+						( CKEDITOR.env.gecko && CKEDITOR.env.version < 10900 ) &&
+						startContainer.type == CKEDITOR.NODE_ELEMENT &&
+						!startContainer.getChildCount() )
+					{
+						startContainer.appendText( '' );
+					}
+
+					nativeRange.setStart( startContainer.$, range.startOffset );
 					nativeRange.setEnd( range.endContainer.$, range.endOffset );
 
@@ -928,8 +947,8 @@
 	CKEDITOR.env.ie ?
 		// V2
-		function()
+		function( forceExpand )
 		{
 			var collapsed = this.collapsed;
-			var isStartMakerAlone;
+			var isStartMarkerAlone;
 			var dummySpan;
 
@@ -964,17 +983,9 @@
 			else
 			{
-// The isStartMakerAlone logic comes from V2. It guarantees that the lines
-// will expand and that the cursor will be blinking on the right place.
-// Actually, we are using this flag just to avoid using this hack in all
-// situations, but just on those needed.
-
-// But, in V3, somehow it is not interested on working whe hitting SHIFT+ENTER
-// inside text. So, let's jsut leave the hack happen always.
-
-// I'm still leaving the code here just in case. We may find some other IE
-// weirdness and uncommenting this stuff may be useful.
-
-//				isStartMakerAlone = ( !startNode.hasPrevious() || ( startNode.getPrevious().is && startNode.getPrevious().is( 'br' ) ) )
-//					&& !startNode.hasNext();
+				// The isStartMarkerAlone logic comes from V2. It guarantees that the lines
+				// will expand and that the cursor will be blinking on the right place.
+				// Actually, we are using this flag just to avoid using this hack in all
+				// situations, but just on those needed.
+				isStartMarkerAlone = forceExpand || !startNode.hasPrevious() || ( startNode.getPrevious().is && startNode.getPrevious().is( 'br' ) );
 
 				// Append a temporary <span>&#65279;</span> before the selection.
@@ -987,6 +998,6 @@
 				dummySpan.insertBefore( startNode );
 
-//				if ( isStartMakerAlone )
-//				{
+				if ( isStartMarkerAlone )
+				{
 					// To expand empty blocks or line spaces after <br>, we need
 					// instead to have any char, which will be later deleted using the
@@ -994,5 +1005,5 @@
 					// \ufeff = Zero Width No-Break Space (U+FEFF). (#1359)
 					this.document.createText( '\ufeff' ).insertBefore( startNode );
-//				}
+				}
 			}
 
@@ -1003,6 +1014,6 @@
 			if ( collapsed )
 			{
-//				if ( isStartMakerAlone )
-//				{
+				if ( isStartMarkerAlone )
+				{
 					// Move the selection start to include the temporary \ufeff.
 					ieRange.moveStart( 'character', -1 );
@@ -1012,7 +1023,7 @@
 					// Remove our temporary stuff.
 					this.document.$.selection.clear();
-//				}
-//				else
-//					ieRange.select();
+				}
+				else
+					ieRange.select();
 
 				dummySpan.remove();
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/showblocks/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/showblocks/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/showblocks/plugin.js	(revision 4056)
@@ -143,3 +143,11 @@
 } )();
 
+/**
+ * Whether to automaticaly enable the "show block" command when the editor
+ * loads.
+ * @type Boolean
+ * @default false
+ * @example
+ * config.startupOutlineBlocks = true;
+ */
 CKEDITOR.config.startupOutlineBlocks = false;
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/smiley/dialogs/smiley.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/smiley/dialogs/smiley.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/smiley/dialogs/smiley.js	(revision 4056)
@@ -8,5 +8,5 @@
 	var config = editor.config,
 		images = config.smiley_images,
-		columns = config.smiley_columns,
+		columns = 8,
 		i;
 
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/smiley/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/smiley/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/smiley/plugin.js	(revision 4056)
@@ -20,12 +20,56 @@
 } );
 
-CKEDITOR.config.smiley_path = CKEDITOR.basePath +  '_source/plugins/smiley/images/';
+/**
+ * The base path used to build the URL for the smiley images. It must end with
+ * a slash.
+ * @type String
+ * @default {@link CKEDITOR.basePath} + 'plugins/smiley/images/'
+ * @example
+ * config.smiley_path = 'http://www.example.com/images/smileys/';
+ * @example
+ * config.smiley_path = '/images/smileys/';
+ */
+CKEDITOR.config.smiley_path = CKEDITOR.basePath +
+	'_source/' +		// %REMOVE_LINE%
+	'plugins/smiley/images/';
 
-CKEDITOR.config.smiley_images = [ 'regular_smile.gif','sad_smile.gif','wink_smile.gif','teeth_smile.gif','confused_smile.gif','tounge_smile.gif',
+/**
+ * The file names for the smileys to be displayed. These files must be
+ * contained inside the URL path defined with the
+ * {@link CKEDITOR.config.smiley_path} setting.
+ * @type Array
+ * @default (see example)
+ * @example
+ * // This is actually the default value.
+ * config.smiley_images = [
+ *     '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'];
+ */
+CKEDITOR.config.smiley_images = [
+	'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'];
 
-CKEDITOR.config.smiley_descriptions = [ ':)', ':(', ';)', ':D', ':/', ':P', '', '', '', '', '', '', '', ';(', '', '', '', '', ':kiss', '' ];
-
-CKEDITOR.config.smiley_columns = 8;
+/**
+ * The description to be used for each of the smileys defined in the
+ * {@link CKEDITOR.config.smiley_images} setting. Each entry in this array list
+ * must match its relative pair in the {@link CKEDITOR.config.smiley_images}
+ * setting.
+ * @type Array
+ * @default (see example)
+ * @example
+ * // This is actually the default value.
+ * config.smiley_descriptions = [
+ *     ':)', ':(', ';)', ':D', ':/', ':P',
+ *     '', '', '', '', '', '',
+ *     '', ';(', '', '', '', '',
+ *     '', ':kiss', '' ];
+ */
+CKEDITOR.config.smiley_descriptions = [
+	':)', ':(', ';)', ':D', ':/', ':P',
+	'', '', '', '', '', '',
+	'', ';(', '', '', '', '',
+	'', ':kiss', '' ];
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/sourcearea/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/sourcearea/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/sourcearea/plugin.js	(revision 4056)
@@ -40,5 +40,6 @@
 							var styles =
 							{
-								width	: '100%',
+								// IE7 has overflow the <textarea> from wrapping table cell.
+								width	: CKEDITOR.env.ie7Compat ?  '99%' : '100%',
 								height	: '100%',
 								resize	: 'none',
@@ -125,4 +126,7 @@
 							if ( onResize )
 								editor.removeListener( 'resize', onResize );
+
+							if ( CKEDITOR.env.ie && CKEDITOR.env.version < 8 )
+								holderElement.removeStyle( 'position' );
 						},
 
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/specialchar/dialogs/specialchar.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/specialchar/dialogs/specialchar.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/specialchar/dialogs/specialchar.js	(revision 4056)
@@ -258,10 +258,10 @@
 					{
 						html.push(
-							'<td class="cke_dark_background">' +
-							'<a href="javascript: void(0);" style="display: block; height: 1.25em; margin-top: 0.25em; text-align: center;" title="', chars[i].replace( /&/g, '&amp;' ), '"' +
+							'<td class="cke_dark_background" style="cursor: default">' +
+							'<a href="javascript: void(0);" style="cursor: inherit; display: block; height: 1.25em; margin-top: 0.25em; text-align: center;" title="', chars[i].replace( /&/g, '&amp;' ), '"' +
 							' onkeydown="CKEDITOR.tools.callFunction( ' + onKeydown + ', event, this )"' +
 							' onclick="CKEDITOR.tools.callFunction(' + onClick + ', this); return false;"' +
 							' tabindex="-1">' +
-							'<span style="margin: 0 auto;">' +
+							'<span style="margin: 0 auto;cursor: inherit">' +
 							chars[i] +
 							'</span></a>');
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/styles/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/styles/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/styles/plugin.js	(revision 4056)
@@ -198,5 +198,9 @@
 						if ( attName == '_length' )
 							continue;
-						if ( attribs[attName] == element.getAttribute( attName ) )
+
+						var elementAttr = element.getAttribute( attName );
+						if ( attribs[attName] ==
+							 ( attName == 'style' ?
+							   normalizeCssText( elementAttr, false ) : elementAttr  ) )
 						{
 							if ( !fullMatch )
@@ -316,5 +320,6 @@
 		if ( !lastNode )
 		{
-				lastNode = document.createText( '' );
+				var marker;
+				lastNode = marker = document.createText( '' );
 				lastNode.insertAfter( range.endContainer );
 		}
@@ -337,5 +342,5 @@
 			if ( !lastNode )
 			{
-				lastNode = document.createText( '' );
+				lastNode = marker = document.createText( '' );
 				lastNode.insertAfter( firstNode );
 			}
@@ -444,5 +449,5 @@
 					if ( parent.getName() == elementName )
 					{
-						for ( var attName in def.attribs )
+						for ( var attName in def.attributes )
 						{
 							if ( styleNode.getAttribute( attName ) == parent.getAttribute( attName ) )
@@ -498,6 +503,6 @@
 		}
 
-//		this._FixBookmarkStart( startNode );
-
+		// Remove the temporary marking node.(#4111)
+		marker && marker.remove();
 		range.moveToBookmark( bookmark );
 	}
@@ -663,10 +668,11 @@
 
 		range.moveToBookmark( bookmark );
-	}
+}
 
 	function applyBlockStyle( range )
 	{
-		// Bookmark the range so we can re-select it after processing.
-		var bookmark = range.createBookmark();
+		// Serializible bookmarks is needed here since
+		// elements may be merged.
+		var bookmark = range.createBookmark( true );
 
 		var iterator = range.createIterator();
@@ -679,38 +685,182 @@
 		while( ( block = iterator.getNextParagraph() ) )		// Only one =
 		{
-			// Create the new node right before the current one.
 			var newBlock = getElement( this, 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.
-				block.moveChildren( newBlock );
-
-			// Replace the current block.
-			newBlock.insertBefore( block );
-			block.remove();
-
-			// 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.
+			replaceBlock( block, newBlock );
 		}
 
 		range.moveToBookmark( bookmark );
+	}
+
+	// Replace the original block with new one, with special treatment
+	// for <pre> blocks to make sure content format is well preserved, and merging/splitting adjacent
+	// when necessary.(#3188)
+	function replaceBlock( block, newBlock )
+	{
+		var newBlockIsPre	= newBlock.is( 'pre' );
+		var blockIsPre		= block.is( 'pre' );
+
+		var isToPre	= newBlockIsPre && !blockIsPre;
+		var isFromPre	= !newBlockIsPre && blockIsPre;
+
+		if ( isToPre )
+			newBlock = toPre( block, newBlock );
+		else if ( isFromPre )
+			// Split big <pre> into pieces before start to convert.
+			newBlock = fromPres( splitIntoPres( block ), newBlock );
+		else
+			block.moveChildren( newBlock );
+
+		newBlock.replace( block );
+
+		if ( newBlockIsPre )
+		{
+			// Merge previous <pre> blocks.
+			mergePre( newBlock );
+		}
+	}
+
+	/**
+	 * Merge a <pre> block with a previous sibling if available.
+	 */
+	function mergePre( preBlock )
+	{
+		var previousBlock;
+		if ( !( ( previousBlock = preBlock.getPreviousSourceNode( true, CKEDITOR.NODE_ELEMENT ) )
+				 && previousBlock.is
+				 && previousBlock.is( 'pre') ) )
+			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 mergedHtml = replace( previousBlock.getHtml(), /\n$/, '' ) + '\n\n' +
+				replace( preBlock.getHtml(), /^\n/, '' ) ;
+
+		// Krugle: IE normalizes innerHTML from <pre>, breaking whitespaces.
+		if ( CKEDITOR.env.ie )
+			preBlock.$.outerHTML = '<pre>' + mergedHtml + '</pre>';
+		else
+			preBlock.setHtml( mergedHtml );
+
+		previousBlock.remove();
+	}
+
+	/**
+	 * Split into multiple <pre> blocks separated by double line-break.
+	 * @param preBlock
+	 */
+	function splitIntoPres( preBlock )
+	{
+		// Exclude the ones at header OR at tail,
+		// and ignore bookmark content between them.
+		var duoBrRegex = /(\S\s*)\n(?:\s|(<span[^>]+_fck_bookmark.*?\/span>))*\n(?!$)/gi,
+			blockName = preBlock.getName(),
+			splitedHtml = replace( preBlock.getOuterHtml(),
+				duoBrRegex,
+				function( match, charBefore, bookmark )
+				{
+				  return charBefore + '</pre>' + bookmark + '<pre>';
+				} );
+
+		var pres = [];
+		splitedHtml.replace( /<pre>([\s\S]*?)<\/pre>/gi, function( match, preContent ){
+			pres.push( preContent );
+		} );
+		return pres;
+	}
+
+	// Wrapper function of String::replace without considering of head/tail bookmarks nodes.
+	function replace( str, regexp, replacement )
+	{
+		var headBookmark = '',
+			tailBookmark = '';
+
+		str = str.replace( /(^<span[^>]+_fck_bookmark.*?\/span>)|(<span[^>]+_fck_bookmark.*?\/span>$)/gi,
+			function( str, m1, m2 ){
+					m1 && ( headBookmark = m1 );
+					m2 && ( tailBookmark = m2 );
+				return '';
+			} );
+		return headBookmark + str.replace( regexp, replacement ) + tailBookmark;
+	}
+	/**
+	 * Converting a list of <pre> into blocks with format well preserved.
+	 */
+	function fromPres( preHtmls, newBlock )
+	{
+		var docFrag = new CKEDITOR.dom.documentFragment( newBlock.getDocument() );
+		for ( var i = 0 ; i < preHtmls.length ; i++ )
+		{
+			var blockHtml = preHtmls[ i ];
+
+			// 1. Trim the first and last line-breaks immediately after and before <pre>,
+			// they're not visible.
+			 blockHtml =  blockHtml.replace( /(\r\n|\r)/g, '\n' ) ;
+			 blockHtml = replace(  blockHtml, /^[ \t]*\n/, '' ) ;
+			 blockHtml = replace(  blockHtml, /\n$/, '' ) ;
+			// 2. Convert spaces or tabs at the beginning or at the end to &nbsp;
+			 blockHtml = replace(  blockHtml, /^[ \t]+|[ \t]+$/g, function( match, offset, s )
+					{
+						if ( match.length == 1 )	// one space, preserve it
+							return '&nbsp;' ;
+						else if ( !offset )		// beginning of block
+							return CKEDITOR.tools.repeat( '&nbsp;', match.length - 1 ) + ' ';
+						else				// end of block
+							return ' ' + CKEDITOR.tools.repeat( '&nbsp;', match.length - 1 );
+					} ) ;
+
+			// 3. Convert \n to <BR>.
+			// 4. Convert contiguous (i.e. non-singular) spaces or tabs to &nbsp;
+			 blockHtml =  blockHtml.replace( /\n/g, '<br>' ) ;
+			 blockHtml =  blockHtml.replace( /[ \t]{2,}/g,
+					function ( match )
+					{
+						return CKEDITOR.tools.repeat( '&nbsp;', match.length - 1 ) + ' ' ;
+					} ) ;
+
+			var newBlockClone = newBlock.clone();
+			newBlockClone.setHtml(  blockHtml );
+			docFrag.append( newBlockClone );
+		}
+		return docFrag;
+	}
+
+	/**
+	 * Converting from a non-PRE block to a PRE block in formatting operations.
+	 */
+	function toPre( block, newBlock )
+	{
+		// First trim the block content.
+		var preHtml = block.getHtml();
+
+		// 1. Trim head/tail spaces, they're not visible.
+		preHtml = replace( preHtml, /(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g, '' );
+		// 2. Delete ANSI whitespaces immediately before and after <BR> because
+		//    they are not visible.
+		preHtml = preHtml.replace( /[ \t\r\n]*(<br[^>]*>)[ \t\r\n]*/gi, '$1' );
+		// 3. Compress other ANSI whitespaces since they're only visible as one
+		//    single space previously.
+		// 4. Convert &nbsp; to spaces since &nbsp; is no longer needed in <PRE>.
+		preHtml = preHtml.replace( /([ \t\n\r]+|&nbsp;)/g, ' ' );
+		// 5. Convert any <BR /> to \n. This must not be done earlier because
+		//    the \n would then get compressed.
+		preHtml = preHtml.replace( /<br\b[^>]*>/gi, '\n' );
+
+		// Krugle: IE normalizes innerHTML to <pre>, breaking whitespaces.
+		if ( CKEDITOR.env.ie )
+		{
+			var temp = block.getDocument().createElement( 'div' );
+			temp.append( newBlock );
+			newBlock.$.outerHTML =  '<pre>' + preHtml + '</pre>';
+			newBlock = temp.getFirst().remove();
+		}
+		else
+			newBlock.setHtml( preHtml );
+
+		return newBlock;
 	}
 
@@ -1033,11 +1183,23 @@
 	}
 
-	function normalizeCssText( unparsedCssText )
-	{
-		// Injects the style in a temporary span object, so the browser parses it,
-		// retrieving its final format.
-		var temp = new CKEDITOR.dom.element( 'span' );
-		temp.setAttribute( 'style', unparsedCssText );
-		return temp.getAttribute( 'style' );
+	function normalizeCssText( unparsedCssText, nativeNormalize )
+	{
+		var styleText;
+		if ( nativeNormalize !== false )
+		{
+			// Injects the style in a temporary span object, so the browser parses it,
+			// retrieving its final format.
+			var temp = new CKEDITOR.dom.element( 'span' );
+			temp.setAttribute( 'style', unparsedCssText );
+			styleText = temp.getAttribute( 'style' );
+		}
+		else
+			styleText = unparsedCssText;
+
+		// Shrinking white-spaces around colon and semi-colon (#4147).
+		// Compensate tail semi-colon.
+		return styleText.replace( /\s*([;:])\s*/, '$1' )
+							 .replace( /([^\s;])$/, '$1;')
+							 .toLowerCase();
 	}
 
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/stylescombo/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/stylescombo/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/stylescombo/plugin.js	(revision 4056)
@@ -273,3 +273,23 @@
 })();
 
+/**
+ * The "styles definition set" to load into the styles combo. The styles may
+ * be defined in the page containing the editor, or can be loaded on demand
+ * from an external file when opening the styles combo for the fist time. In
+ * the second case, if this setting contains only a name, the styles definition
+ * file will be loaded from the "styles" folder inside the stylescombo plugin
+ * folder. Otherwise, this setting has the "name:url" syntax, making it
+ * possible to set the URL from which loading the styles file.
+ * @type string
+ * @default 'default'
+ * @example
+ * // Load from the stylescombo styles folder (mystyles.js file).
+ * config.stylesCombo_stylesSet = 'mystyles';
+ * @example
+ * // Load from a relative URL.
+ * config.stylesCombo_stylesSet = 'mystyles:/editorstyles/styles.js';
+ * @example
+ * // Load from a full URL.
+ * config.stylesCombo_stylesSet = 'mystyles:http://www.example.com/editorstyles/styles.js';
+ */
 CKEDITOR.config.stylesCombo_stylesSet = 'default';
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/tab/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/tab/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/tab/plugin.js	(revision 4056)
@@ -257,7 +257,7 @@
 /**
  * Intructs the editor to add a number of spaces (&amp;nbsp;) to the text when
- * hitting the TAB key. If set to zero, the TAB key will have its default
- * behavior instead (like moving out of the editor).
- * @type {Number}
+ * hitting the TAB key. If set to zero, the TAB key will be used to move the
+ * cursor focus to the next element in the page, out of the editor focus.
+ * @type Number
  * @default 0
  * @example
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/tabletools/dialogs/tableCell.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/tabletools/dialogs/tableCell.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/tabletools/dialogs/tableCell.js	(revision 4056)
@@ -315,15 +315,13 @@
 			onShow : function()
 			{
-				// Get the selected table cell.
-				var startElement = editor.getSelection().getStartElement();
-				this.cell = startElement.getAscendant( 'td', true ) || startElement.getAscendant( 'th', true );
-
-				// Call setupContent().
-				this.setupContent( this.cell );
+				this.cells = CKEDITOR.plugins.tabletools.getSelectedCells(
+					this._.editor.getSelection() );
+				this.setupContent( this.cells[ 0 ] );
 			},
 			onOk : function()
 			{
-				// Call commitContent().
-				this.commitContent( this.cell );
+				var cells = this.cells;
+				for ( var i = 0 ; i < cells.length ; i++ )
+					this.commitContent( cells[ i ] );
 			}
 		};
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/tabletools/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/tabletools/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/tabletools/plugin.js	(revision 4056)
@@ -417,5 +417,8 @@
 	}
 
-	CKEDITOR.plugins.add( 'tabletools',
+	// Context menu on table caption incorrect (#3834)
+	var contextMenuTags = { thead : 1, tbody : 1, tfoot : 1, td : 1, tr : 1, th : 1 };
+
+	CKEDITOR.plugins.tabletools =
 	{
 		init : function( editor )
@@ -545,10 +548,9 @@
 							{
 								var cells = getSelectedCells( editor.getSelection() );
-
 								return {
 									tablecell_insertBefore : CKEDITOR.TRISTATE_OFF,
 									tablecell_insertAfter : CKEDITOR.TRISTATE_OFF,
 									tablecell_delete : CKEDITOR.TRISTATE_OFF,
-									tablecell_properties : cells.length == 1 ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED
+									tablecell_properties : cells.length > 0 ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED
 								};
 							}
@@ -675,7 +677,7 @@
 							return null;
 
-							var isCell	= !element.is( 'table' ) && element.hasAscendant( 'table' ) ;
-
-							if ( isCell )
+						while ( element )
+						{
+							if ( element.getName() in contextMenuTags )
 							{
 								return {
@@ -685,9 +687,15 @@
 								};
 							}
-
-							return null;
+							element = element.getParent();
+						}
+
+						return null;
 					} );
 			}
-		}
-	} );
+		},
+
+		getSelectedCells : getSelectedCells
+
+	};
+	CKEDITOR.plugins.add( 'tabletools', CKEDITOR.plugins.tabletools );
 })();
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/templates/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/templates/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/templates/plugin.js	(revision 4056)
@@ -66,4 +66,6 @@
  * @type String
  * @default 'default'
+ * @example
+ * config.templates = 'my_templates';
  */
 CKEDITOR.config.templates = 'default';
@@ -73,4 +75,11 @@
  * @type (String) Array
  * @default [ 'plugins/templates/templates/default.js' ]
+ * @example
+ * config.templates_files =
+ *     [
+ *         '/editor_templates/site_default.js',
+ *         'http://www.example.com/user_templates.js
+ *     ];
+ *
  */
 CKEDITOR.config.templates_files =
@@ -82,8 +91,10 @@
 
 /**
- * Whether replace the current document content OR insert current
- * editing position.
+ * Whether the "Replace actual contents" checkbox is checked by default in the
+ * Templates dialog.
  * @type Boolean
  * @default true
+ * @example
+ * config.templates_replaceContent = false;
  */
 CKEDITOR.config.templates_replaceContent = true;
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/toolbar/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/toolbar/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/toolbar/plugin.js	(revision 4056)
@@ -128,6 +128,15 @@
 						for ( var r = 0 ; r < toolbar.length ; r++ )
 						{
-							var row = toolbar[ r ],
-								toolbarId = 'cke_' + CKEDITOR.tools.getNextNumber(),
+							var row = toolbar[ r ];
+
+							// It's better to check if the row object is really
+							// available because it's a common mistake to leave
+							// an extra comma in the toolbar definition
+							// settings, which leads on the editor not loading
+							// at all in IE. (#3983)
+							if ( !row )
+								continue;
+
+							var toolbarId = 'cke_' + CKEDITOR.tools.getNextNumber(),
 								toolbarObj = { id : toolbarId, items : [] };
 
@@ -303,12 +312,18 @@
  * The toolbar definition. It is an array of toolbars (strips),
  * each one being also an array, containing a list of UI items.
+ * Note that this setting is composed by "toolbar_" added by the toolbar name,
+ * which in this case is called "Basic". This second part of the setting name
+ * can be anything. You must use this name in the
+ * {@link CKEDITOR.config.toolbar} setting, so you instruct the editor which
+ * toolbar_(name) setting to you.
  * @type Array
  * @example
  * // Defines a toolbar with only one strip containing the "Source" button, a
  * // separator and the "Bold" and "Italic" buttons.
- * <b>CKEDITOR.config.toolbar_Basic =
+ * <b>config.toolbar_Basic =
  * [
  *     [ 'Source', '-', 'Bold', 'Italic' ]
  * ]</b>;
+ * config.toolbar = 'Basic';
  */
 CKEDITOR.config.toolbar_Basic =
@@ -317,4 +332,29 @@
 ];
 
+/**
+ * This is the default toolbar definition used by the editor. It contains all
+ * editor features.
+ * @type Array
+ * @default (see example)
+ * @example
+ * // This is actually the default value.
+ * config.toolbar_Full =
+ * [
+ *     ['Source','-','Save','NewPage','Preview','-','Templates'],
+ *     ['Cut','Copy','Paste','PasteText','PasteFromWord','-','Print', 'SpellChecker', 'Scayt'],
+ *     ['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
+ *     ['Form', 'Checkbox', 'Radio', 'TextField', 'Textarea', 'Select', 'Button', 'ImageButton', 'HiddenField'],
+ *     '/',
+ *     ['Bold','Italic','Underline','Strike','-','Subscript','Superscript'],
+ *     ['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],
+ *     ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
+ *     ['Link','Unlink','Anchor'],
+ *     ['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak'],
+ *     '/',
+ *     ['Styles','Format','Font','FontSize'],
+ *     ['TextColor','BGColor'],
+ *     ['Maximize', 'ShowBlocks','-','About']
+ * ];
+ */
 CKEDITOR.config.toolbar_Full =
 [
@@ -327,5 +367,6 @@
 	['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],
 	['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
-	['Link','Unlink','Anchor'],	['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak'],
+	['Link','Unlink','Anchor'],
+	['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak'],
 	'/',
 	['Styles','Format','Font','FontSize'],
@@ -335,19 +376,37 @@
 
 /**
- * The toolbox (alias toolbar) definition. It is a toolbar name or an array of toolbars (strips),
- * each one being also an array, containing a list of UI items.
- * @type Array or String
+ * The toolbox (alias toolbar) definition. It is a toolbar name or an array of
+ * toolbars (strips), each one being also an array, containing a list of UI items.
+ * @type Array|String
+ * @default 'Full'
  * @example
  * // Defines a toolbar with only one strip containing the "Source" button, a
  * // separator and the "Bold" and "Italic" buttons.
- * <b>CKEDITOR.config.toolbar =
+ * config.toolbar =
  * [
  *     [ 'Source', '-', 'Bold', 'Italic' ]
- * ]</b>;
+ * ];
+ * @example
  * // Load toolbar_Name where Name = Basic.
- * <b>CKEDITOR.config.toolbar = 'Basic';
+ * config.toolbar = 'Basic';
  */
 CKEDITOR.config.toolbar = 'Full';
 
+/**
+ * Whether the toolbar can be collapsed by the user. If disabled, the collapser
+ * button will not be displayed.
+ * @type Boolean
+ * @default true
+ * @example
+ * config.toolbarCanCollapse = false;
+ */
 CKEDITOR.config.toolbarCanCollapse = true;
+
+/**
+ * Whether the toolbar must start expanded when the editor is loaded.
+ * @type Boolean
+ * @default true
+ * @example
+ * config.toolbarStartupExpanded = false;
+ */
 CKEDITOR.config.toolbarStartupExpanded = true;
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/uicolor/dialogs/uicolor.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/uicolor/dialogs/uicolor.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/uicolor/dialogs/uicolor.js	(revision 4056)
@@ -14,5 +14,5 @@
 		// Convert HEX representation to RGB, stripping # char.
 		if ( /^#/.test( color ) )
-			color = YAHOO.util.Color.hex2rgb( color.substr( 1 ) );
+			color = window.YAHOO.util.Color.hex2rgb( color.substr( 1 ) );
 		picker.setValue( color, true );
 		// Refresh picker UI.
@@ -43,5 +43,5 @@
 
 			// Create new color picker widget.
-			picker = new YAHOO.widget.ColorPicker( "cke_uicolor_picker",
+			picker = new window.YAHOO.widget.ColorPicker( "cke_uicolor_picker",
 				{
 					showhsvcontrols : true,
@@ -83,4 +83,8 @@
 			dialog = this;
 			this.setupContent();
+
+			// #3808
+			if ( CKEDITOR.env.ie7Compat )
+				dialog.parts.contents.setStyle( 'overflow', 'hidden' );
 		},
 		contents : [
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/undo/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/undo/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/undo/plugin.js	(revision 4056)
@@ -70,28 +70,26 @@
 				});
 
+			// Registering keydown on every document recreation.(#3844)
+			editor.on( 'contentDom', function()
+				{
+					editor.document.on( 'keydown', function( event )
+						{
+							// Do not capture CTRL hotkeys.
+							if ( !event.data.$.ctrlKey && !event.data.$.metaKey )
+								undoManager.type( event );
+						});
+				});
+
+			// Always save an undo snapshot - the previous mode might have
+			// changed editor contents.
+			editor.on( 'beforeModeUnload', function()
+				{
+					editor.mode == 'wysiwyg' && undoManager.save( true );
+				});
+
 			// Make the undo manager available only in wysiwyg mode.
 			editor.on( 'mode', function()
 				{
-					if ( editor.mode == 'wysiwyg' )
-					{
-						if ( !undoManager.enabled )
-						{
-							undoManager.enabled = true;
-
-							editor.document.on( 'keydown', function( event )
-								{
-									// Do not capture CTRL hotkeys.
-									if ( !event.data.$.ctrlKey && !event.data.$.metaKey )
-										undoManager.type( event );
-								});
-
-							// Always save an undo snapshot - the previous mode might have changed
-							// editor contents.
-							undoManager.save( true );
-						}
-					}
-					else
-						undoManager.enabled = false;
-
+					undoManager.enabled = editor.mode == 'wysiwyg';
 					undoManager.onChange();
 				});
@@ -482,3 +480,11 @@
 })();
 
+/**
+ * The number of undo steps to be saved. The higher this setting value the more
+ * memory is used for it.
+ * @type Number
+ * @default 20
+ * @example
+ * config.undoStackSize = 50;
+ */
 CKEDITOR.config.undoStackSize = 20;
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/wsc/dialogs/tmpFrameset.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/wsc/dialogs/tmpFrameset.html	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/wsc/dialogs/tmpFrameset.html	(revision 4056)
@@ -23,19 +23,20 @@
 }
 
+var opener;
 function tryLoad()
 {
-	var opener = window.parent;
+	opener = window.parent;
 
-    // get access to global parameters
-    var oParams = window.opener.oldFramesetPageParams ;
+	// get access to global parameters
+	var oParams = window.opener.oldFramesetPageParams;
 
-    // make frameset rows string prepare
-    var sFramesetRows = ( parseInt( oParams.firstframeh, 10 ) || '30') + ",*," + ( parseInt( oParams.thirdframeh, 10 ) || '150' ) + ',0' ;
-    document.getElementById( 'itFrameset' ).rows = sFramesetRows ;
+	// make frameset rows string prepare
+	var sFramesetRows = ( parseInt( oParams.firstframeh, 10 ) || '30') + ",*," + ( parseInt( oParams.thirdframeh, 10 ) || '150' ) + ',0' ;
+	document.getElementById( 'itFrameset' ).rows = sFramesetRows ;
 
-    // dynamic including init frames and crossdomain transport code
-    // from config sproxy_js_frameset url
-    var addScriptUrl = oParams.sproxy_js_frameset ;
-    doLoadScript( addScriptUrl ) ;
+	// dynamic including init frames and crossdomain transport code
+	// from config sproxy_js_frameset url
+	var addScriptUrl = oParams.sproxy_js_frameset ;
+	doLoadScript( addScriptUrl ) ;
 }
 
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/wsc/dialogs/wsc.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/wsc/dialogs/wsc.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/wsc/dialogs/wsc.js	(revision 4056)
@@ -56,5 +56,5 @@
 			}
 			else if ( i++ == 180 )								// Timeout: 180 * 250ms = 45s.
-				_cancelOnError( errorMsg );
+				window._cancelOnError( errorMsg );
 		};
 	}
@@ -79,5 +79,5 @@
 		// global var is used in FCK specific core
 		// change on equal var used in fckplugin.js
-		gFCKPluginName = 'wsc';
+		window.gFCKPluginName = 'wsc';
 
 		LangComparer.setDefaulLangCode( editor.config.defaultLanguage );
Index: /CKEditor/branches/versions/3.0.x/_source/plugins/wysiwygarea/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/plugins/wysiwygarea/plugin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/plugins/wysiwygarea/plugin.js	(revision 4056)
@@ -1,3 +1,3 @@
-﻿/*
+/*
 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -167,6 +167,7 @@
 				count = children.count(),
 				firstChild,
-				previousElement = fixedBlock.getPrevious( true ),
-				nextElement = fixedBlock.getNext( true ),
+				whitespaceGuard = CKEDITOR.dom.walker.whitespaces( true ),
+				previousElement = fixedBlock.getPrevious( whitespaceGuard ),
+				nextElement = fixedBlock.getNext( whitespaceGuard ),
 				enterBlock;
 			if ( previousElement && previousElement.getName
@@ -177,10 +178,11 @@
 				enterBlock = nextElement;
 
+			// Not all blocks are editable, e.g. <hr />, further checking it.(#3994)
 			if( ( !count
 				  || ( firstChild = children.getItem( 0 ) ) && firstChild.is && firstChild.is( 'br' ) )
-				&& enterBlock )
+				&& enterBlock
+				&& range.moveToElementEditStart( enterBlock ) )
 			{
 				fixedBlock.remove();
-				range.moveToElementEditStart( enterBlock );
 				range.select();
 			}
@@ -189,6 +191,6 @@
 		// Inserting the padding-br before body if it's preceded by an
 		// unexitable block.
-		var lastNode = body.getLast( true );
-		if ( lastNode.getName && ( lastNode.getName() in nonExitableElementNames ) )
+		var lastNode = body.getLast( CKEDITOR.dom.walker.whitespaces( true ) );
+		if ( lastNode && lastNode.getName && ( lastNode.getName() in nonExitableElementNames ) )
 		{
 			var paddingBlock = editor.document.createElement(
@@ -211,7 +213,9 @@
 				{
 					var mainElement,
+						fieldset,
 						iframe,
 						isLoadingData,
 						isPendingFocus,
+						frameLoaded,
 						fireMode;
 
@@ -224,33 +228,36 @@
 						if ( iframe )
 							iframe.remove();
-
-						iframe = new CKEDITOR.dom.element( 'iframe' )
-							.setAttributes({
-								frameBorder : 0,
-								tabIndex : -1,
-								allowTransparency : true })
-							.setStyles({
-								width : '100%',
-								height : '100%' });
-
-						if ( CKEDITOR.env.ie )
-						{
-							if ( isCustomDomain )
-							{
-								// The document domain must be set within the src
-								// attribute.
-								iframe.setAttribute( 'src',
-									'javascript:void( (function(){' +
-										'document.open();' +
-										'document.domain="' + document.domain + '";' +
-										'document.write( window.parent._cke_htmlToLoad_' + editor.name + ' );' +
-										'document.close();' +
-										'window.parent._cke_htmlToLoad_' + editor.name + ' = null;' +
-									'})() )' );
-							}
-							else
-								// To avoid HTTPS warnings.
-								iframe.setAttribute( 'src', 'javascript:void(0)' );
-						}
+						if ( fieldset )
+							fieldset.remove();
+
+						frameLoaded = 0;
+						// The document domain must be set within the src
+						// attribute;
+						// Defer the script execution until iframe
+						// has been added to main window, this is needed for some
+						// browsers which will begin to load the frame content
+						// prior to it's presentation in DOM.(#3894)
+						var src = 'void( '
+								+ ( CKEDITOR.env.gecko ? 'setTimeout' : '' ) + '( function(){' +
+								'document.open();' +
+								( CKEDITOR.env.ie && isCustomDomain ? 'document.domain="' + document.domain + '";' : '' ) +
+								'document.write( window.parent._cke_htmlToLoad_' + editor.name + ' );' +
+								'document.close();' +
+								'window.parent._cke_htmlToLoad_' + editor.name + ' = null;' +
+								'}'
+								+ ( CKEDITOR.env.gecko ? ', 0 )' : ')()' )
+								+ ' )';
+
+						// Loading via src attribute does not work in Opera.
+						if ( CKEDITOR.env.opera )
+							src = 'void(0);';
+
+						iframe = CKEDITOR.dom.element.createFromHtml( '<iframe' +
+								' style="width:100%;height:100%"' +
+								' frameBorder="0"' +
+								' tabIndex="-1"' +
+								' allowTransparency="true"' +
+								' src="javascript:' + encodeURIComponent( src ) + '"' +
+								'></iframe>' );
 
 						var accTitle = editor.lang.editorTitle.replace( '%1', editor.name );
@@ -258,4 +265,11 @@
 						if ( CKEDITOR.env.gecko )
 						{
+							// Double checking the iframe will be loaded properly(#4058).
+							iframe.on( 'load', function( ev )
+							{
+								ev.removeListener();
+								contentDomReady( iframe.$.contentWindow );
+							} );
+
 							// Accessibility attributes for Firefox.
 							mainElement.setAttributes(
@@ -278,9 +292,11 @@
 						{
 							// Accessibility label for IE.
-							var fieldset = CKEDITOR.dom.element.createFromHtml(
+							fieldset = CKEDITOR.dom.element.createFromHtml(
 								'<fieldset style="height:100%' +
-									( CKEDITOR.env.quirks ? ';position:relative' : '' ) +
+								( CKEDITOR.env.ie && CKEDITOR.env.quirks ? ';position:relative' : '' ) +
 								'">' +
-									'<legend style="position:absolute;left:-10000px">' +
+									'<legend style="display:block;width:0;height:0;overflow:hidden;' +
+									( CKEDITOR.env.ie && CKEDITOR.env.quirks ? 'position:absolute' : '' ) +
+									'">' +
 										CKEDITOR.tools.htmlEncode( accTitle ) +
 									'</legend>' +
@@ -301,8 +317,4 @@
 							'window.onload = function()' +
 							'{' +
-								// Remove this script from the DOM.
-								'var s = document.getElementById( "cke_actscrpt" );' +
-								's.parentNode.removeChild( s );' +
-
 								// Call the temporary function for the editing
 								// boostrap.
@@ -314,8 +326,17 @@
 					var contentDomReady = function( domWindow )
 					{
-						delete CKEDITOR._[ 'contentDomReady' + editor.name ];
+						if ( frameLoaded )
+							return;
+
+						frameLoaded = 1;
 
 						var domDocument = domWindow.document,
 							body = domDocument.body;
+
+						// Remove this script from the DOM.
+						var script = domDocument.getElementById( "cke_actscrpt" );
+						script.parentNode.removeChild( script );
+
+						delete CKEDITOR._[ 'contentDomReady' + editor.name ];
 
 						body.spellcheck = !editor.config.disableNativeSpellChecker;
@@ -342,4 +363,24 @@
 						domWindow	= editor.window		= new CKEDITOR.dom.window( domWindow );
 						domDocument	= editor.document	= new CKEDITOR.dom.document( domDocument );
+
+						// Gecko need a key event to 'wake up' the editing
+						// ability when document is empty.(#3864)
+						var firstNode = domDocument.getBody().getFirst();
+						if ( CKEDITOR.env.gecko
+							&& firstNode && firstNode.is
+							&& firstNode.is( 'br' ) && firstNode.hasAttribute( '_moz_editor_bogus_node' ) )
+						{
+							var keyEventSimulate = domDocument.$.createEvent( "KeyEvents" );
+							keyEventSimulate.initKeyEvent( 'keypress', true, true, domWindow.$, false,
+								false, false, false, 0, 32 );
+							domDocument.$.dispatchEvent( keyEventSimulate );
+							var bogusText = domDocument.getBody().getFirst() ;
+							// Compensate the line maintaining <br> if enterMode is not block.
+							if ( editor.config.enterMode == CKEDITOR.ENTER_BR )
+								domDocument.createElement( 'br', { attributes: { '_moz_dirty' : "" } } )
+									.replace( bogusText );
+							else
+								bogusText.remove();
+						}
 
 						// Gecko/Webkit need some help when selecting control type elements. (#3448)
@@ -442,11 +483,6 @@
 								mainElement = holderElement;
 
-								if ( CKEDITOR.env.ie && ( CKEDITOR.env.quirks || CKEDITOR.env.version < 8 ) )
+								if ( CKEDITOR.env.ie && CKEDITOR.env.quirks )
 									holderElement.setStyle( 'position', 'relative' );
-
-								// Create the iframe at load for all browsers
-								// except FF and IE with custom domain.
-								if ( !isCustomDomain || !CKEDITOR.env.gecko )
-									createIFrame();
 
 								// The editor data "may be dirty" after this
@@ -487,24 +523,10 @@
 									activationScript;
 
-								// For custom domain in IE, set the global variable
-								// that will temporarily hold the editor data. This
-								// reference will be used in the ifram src.
-								if ( isCustomDomain )
-									window[ '_cke_htmlToLoad_' + editor.name ] = data;
-
+								window[ '_cke_htmlToLoad_' + editor.name ] = data;
 								CKEDITOR._[ 'contentDomReady' + editor.name ] = contentDomReady;
-
-								// We need to recreate the iframe in FF for every
-								// data load, otherwise the following spellcheck
-								// and execCommand features will be active only for
-								// the first time.
-								// The same is valid for IE with custom domain,
-								// because the iframe src must be reset every time.
-								if ( isCustomDomain || CKEDITOR.env.gecko )
-									createIFrame();
-
-								// For custom domain in IE, the data loading is
-								// done through the src attribute of the iframe.
-								if ( !isCustomDomain )
+								createIFrame();
+
+								// Opera must use the old method for loading contents.
+								if ( CKEDITOR.env.opera )
 								{
 									var doc = iframe.$.contentWindow.document;
@@ -569,5 +591,5 @@
 /**
  * Disables the ability of resize objects (image and tables) in the editing
- * area
+ * area.
  * @type Boolean
  * @default false
@@ -603,10 +625,12 @@
  */
 CKEDITOR.config.disableNativeSpellChecker = true;
+
 /**
- * The editor will post an empty value ("") if you have just an empty paragraph on it, like this:
+ * Whether the editor must output an empty value ("") if it's contents is made
+ * by an empty paragraph only.
+ * @type Boolean
+ * @default true
  * @example
- * <p></p>
- * <p><br /></p>
- * <p><b></b></p>
+ * config.ignoreEmptyParagraph = false;
  */
 CKEDITOR.config.ignoreEmptyParagraph = true;
Index: /CKEditor/branches/versions/3.0.x/_source/skins/kama/dialog.css
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/skins/kama/dialog.css	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/skins/kama/dialog.css	(revision 4056)
@@ -12,5 +12,4 @@
 .cke_skin_kama .cke_dialog_body
 {
-	position: relative;
 	z-index: 1;
 	border: solid 1px #ddd;
@@ -51,7 +50,15 @@
 }
 
+.cke_skin_kama .cke_browser_iequirks.cke_single_page .cke_dialog_title,
+.cke_skin_kama .cke_browser_ie6.cke_single_page .cke_dialog_title,
+.cke_skin_kama .cke_browser_ie7.cke_single_page .cke_dialog_title
+{
+	margin-bottom: 10px;
+}
+
 .cke_skin_kama .cke_browser_ie.cke_rtl .cke_dialog_title
 {
 	position: static !important;
+	unicode-bidi: bidi-override;
 }
 
@@ -123,5 +130,5 @@
 .cke_skin_kama a:visited.cke_dialog_tab
 {
-	background-image: url(sprites.png);
+	background-image: url(images/sprites.png);
 	background-repeat: repeat-x;
 	background-position: 0 -1323px;
@@ -173,4 +180,12 @@
 	padding-top: 5px;
 	margin-top: 10px;
+}
+
+/* IE7 + IE quirks */
+.cke_skin_kama .cke_browser_ie7.cke_single_page .cke_dialog_contents
+{
+	margin-top: -10px;
+	position: relative;
+	margin-bottom: -22px;
 }
 
@@ -216,4 +231,5 @@
 	_width: 99%;
 	overflow: auto;
+	resize: none;
 }
 
@@ -265,15 +281,31 @@
 	-webkit-border-radius: 5px;
 	border-radius: 5px;
-	background: transparent url(sprites.png) repeat-x scroll 0 -1069px;
+	background: transparent url(images/sprites.png) repeat-x scroll 0 -1069px;
 	_background: none;
 	padding: 5px 0;
 }
 
+.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button
+{
+	padding: 0;
+}
+
 /* IE6 buttons. */
+.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button span
+{
+	width: 70px;
+}
+
+.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span,
+.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span
+{
+	width: 100px;
+}
+
+.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span,
 .cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span,
 .cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button span
 {
-	/*border: #53D9F0 1px solid;*/
-	padding: 5px 20px;
+	padding: 5px 15px;
 	text-align: center;
 	color: #3b3b1f;
@@ -282,17 +314,33 @@
 	cursor: default;
 }
+/* END IE6 buttons. */
+
+.cke_skin_kama .cke_browser_webkit a.cke_dialog_ui_button span.cke_dialog_ui_button
+{
+	margin: 0;
+}
+.cke_skin_kama .cke_browser_webkit a.cke_dialog_ui_button
+{
+	float: right;
+	padding-top: 3px;
+	padding-bottom: 2px;
+	margin: 2px 0;
+}
+
+.cke_skin_kama a.cke_dialog_ui_button_ok span,
+.cke_skin_kama a.cke_dialog_ui_button_cancel span
+{
+	padding-right: 20px;
+	padding-left: 20px;
+}
 
 .cke_skin_kama a.cke_dialog_ui_button_ok
 {
 	background-position: 0 -1143px;
-	text-align: left;
 }
 
 .cke_skin_kama a.cke_dialog_ui_button_ok span
 {
-	background: transparent url(sprites.png) no-repeat scroll right -1219px;
-	min-width: 60px;
-	padding-right: 20px;
-	text-align: left;
+	background: transparent url(images/sprites.png) no-repeat scroll right -1219px;
 }
 
@@ -300,9 +348,4 @@
 {
 	background-position: left -1219px;
-}
-
-.cke_skin_kama .cke_browser_ie7 a.cke_dialog_ui_button_ok span
-{
-	margin-right: 40px;
 }
 
@@ -321,7 +364,5 @@
 .cke_skin_kama a.cke_dialog_ui_button_cancel span
 {
-	background: transparent url(sprites.png) no-repeat scroll right -1245px;
-	padding-right: 20px;
-	padding-left: 20px;
+	background: transparent url(images/sprites.png) no-repeat scroll right -1245px;
 }
 
@@ -404,7 +445,33 @@
 {
 	margin: 7px 0;
+	width: 60px;
 	text-align: center;
 }
 
+/* Firefox2 buttons */
+.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons a.cke_dialog_ui_button
+{
+	display: block;
+	padding: 0;
+}
+
+.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons span.cke_dialog_ui_button
+{
+	padding-bottom: 5px;
+	padding-top: 6px;
+	margin-bottom: 0;
+}
+
+.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons .cke_dialog_ui_button_ok .cke_dialog_ui_button
+{
+	background-position: right -1214px;
+}
+
+.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons .cke_dialog_ui_button_cancel .cke_dialog_ui_button
+{
+	background-position: right -1242px;
+}
+/* END Firefox2 buttons */
+
 .cke_skin_kama strong
 {
@@ -416,5 +483,5 @@
 .cke_skin_kama .cke_dialog_close_button
 {
-	background-image: url(sprites.png);
+	background-image: url(images/sprites.png);
 	background-repeat: no-repeat;
 	background-position: 0 -1022px;
@@ -428,5 +495,4 @@
 	/* IE 6 */
 	_background-image: url(images/sprites_ie6.png);
-	_background-position: 0 -713px;
 }
 
@@ -444,5 +510,9 @@
 {
 	right: 10px;
-	_right: 22px;
+}
+
+.cke_skin_kama .cke_browser_ie8.cke_rtl .cke_dialog_close_button
+{
+	left: 8px;
 }
 
@@ -450,21 +520,39 @@
 {
 	left: 10px;
-	_left: 22px;
-}
-
-.cke_skin_kama .cke_browser_ie6.cke_rtl .cke_dialog_close_button
-{
-	position: relative;
-	float: left;
-	margin-top: -55px;
-	margin-left: -7px;
-}
-
-.cke_skin_kama .cke_browser_iequirks.cke_rtl.cke_single_page .cke_dialog_close_button
-{
-	margin-top: -32px;
-}
-
-.cke_skin_kama .cke_browser_iequirks.cke_ltr .cke_dialog_close_button
+}
+
+.cke_skin_kama .cke_browser_ie7.cke_rtl .cke_dialog_close_button
+{
+	left: 16px;
+	top: 0;
+}
+
+/*.cke_skin_kama .cke_browser_ie6.cke_rtl .cke_dialog_close_button
+{
+	left: 16px;
+}*/
+
+/* IE7 + IE quirks */
+.cke_skin_kama .cke_browser_ie7.cke_rtl .cke_dialog_close_button
+{
+	position: absolute;
+	left: 10px;
+	top: 5px;
+}
+
+/* IE7 + IE quirks */
+.cke_skin_kama .cke_browser_ie7.cke_single_page .cke_dialog_footer
+{
+	margin-top: 22px;
+}
+
+.cke_skin_kama .cke_browser_ie6 .cke_dialog_close_button,
+.cke_skin_kama .cke_browser_iequirks .cke_dialog_close_button
+{
+	top: 7px;
+}
+
+/* IE7 + IE quirks */
+.cke_skin_kama .cke_browser_ie7.cke_ltr .cke_dialog_close_button
 {
 	margin-top: 0;
@@ -501,5 +589,5 @@
 }
 
-.cke_skin_kama .cke_dialog .cke_btn_reset
+.cke_skin_kama .cke_dialog a.cke_btn_reset
 {
 	float: right;
@@ -513,11 +601,11 @@
 }
 
-.cke_skin_kama .cke_rtl .cke_dialog .cke_btn_reset
+.cke_skin_kama .cke_rtl .cke_dialog a.cke_btn_reset
 {
 	float: left;
 }
 
-.cke_skin_kama .cke_dialog .cke_btn_locked,
-.cke_skin_kama .cke_dialog .cke_btn_unlocked
+.cke_skin_kama .cke_dialog a.cke_btn_locked,
+.cke_skin_kama .cke_dialog a.cke_btn_unlocked
 {
 	float: left;
@@ -531,11 +619,11 @@
 }
 
-.cke_skin_kama .cke_dialog .cke_btn_locked,
-.cke_skin_kama .cke_dialog .cke_btn_unlocked
+.cke_skin_kama .cke_rtl .cke_dialog a.cke_btn_locked,
+.cke_skin_kama .cke_rtl .cke_dialog a.cke_btn_unlocked
 {
 	float: right;
 }
 
-.cke_skin_kama .cke_dialog .cke_btn_unlocked
+.cke_skin_kama .cke_dialog a.cke_btn_unlocked
 {
 	background-position: 0 -16px;
Index: /CKEditor/branches/versions/3.0.x/_source/skins/kama/mainui.css
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/skins/kama/mainui.css	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/skins/kama/mainui.css	(revision 4056)
@@ -26,5 +26,5 @@
 	border-radius: 5px;
 	background-color: #d3d3d3;
-	background-image: url(sprites.png);
+	background-image: url(images/sprites.png);
 	background-repeat: repeat-x;
 	background-position: 0 -1950px;
@@ -46,4 +46,5 @@
 */
 	display: inline-table;
+	width: 100%;
 }
 
@@ -74,4 +75,9 @@
 }
 
+.cke_skin_kama .cke_contents iframe
+{
+	background-color: #fff;
+}
+
 .cke_skin_kama .cke_focus
 {
@@ -100,5 +106,9 @@
 	display: block;
 	float: right;
-	background-image: url(images/resizer.gif);
+	/* resizer.gif*/
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
+	background-position: 0 -1428px;
+	background-repeat: no-repeat;
 	cursor: se-resize;
 }
@@ -107,5 +117,6 @@
 {
 	cursor: sw-resize;
-	background-image: url(images/resizer_rtl.gif);
+	/* resizer_rtl.gif*/
+	background-position: 0 -1455px;
 	float: left;
 }
@@ -121,2 +132,8 @@
 	position: absolute;
 }
+
+.cke_skin_kama .cke_browser_ie.cke_browser_quirks .cke_contents iframe
+{
+	position: absolute;
+	top: 0;
+}
Index: /CKEditor/branches/versions/3.0.x/_source/skins/kama/menu.css
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/skins/kama/menu.css	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/skins/kama/menu.css	(revision 4056)
@@ -141,5 +141,8 @@
 .cke_skin_kama .cke_menuarrow
 {
-	background-image: url(images/arrowright.gif);
+	/* arrowright.gif*/
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
+	background-position: 0 -1411px;
 	background-repeat: no-repeat;
 	height: 5px;
@@ -155,11 +158,22 @@
 	margin-right: 0;
 	margin-left: 2px;
-	background-image: url(images/arrowleft.gif);
+	/* arrowleft.gif*/
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
+	background-position: 0px -1390px;
+	background-repeat: no-repeat;
 }
 
 /* #3766 In the context menu, long labels with second level menu get wrapped */
-.cke_browser_ie .cke_skin_kama .cke_menuarrow
+.cke_browser_ie.cke_ltr .cke_skin_kama .cke_menuarrow
 {
 	position: absolute;
-	right: 0;
+	right: 2px;
 }
+
+.cke_browser_ie.cke_rtl .cke_skin_kama .cke_menuarrow
+{
+	position: absolute;
+	left: 2px;
+}
+/* END #3766 */
Index: /CKEditor/branches/versions/3.0.x/_source/skins/kama/richcombo.css
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/skins/kama/richcombo.css	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/skins/kama/richcombo.css	(revision 4056)
@@ -39,5 +39,6 @@
 	-webkit-border-radius: 5px;
 	border-radius: 5px;
-	background-image: url(sprites.png);
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
 	background-repeat: repeat-x;
 	background-position: 0 -100px;
@@ -121,5 +122,6 @@
 .cke_skin_kama .cke_rcombo .cke_openbutton
 {
-	background-image: url(sprites.png);
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
 	background-position: 0 -68px;
 	background-repeat: no-repeat;
@@ -236,9 +238,4 @@
 }
 
-.cke_skin_kama .cke_browser_gecko18 .cke_rcombo
-{
-	display: -moz-box;
-}
-
 .cke_skin_kama .cke_browser_gecko .cke_rtl .cke_rcombo .cke_label,
 .cke_skin_kama .cke_browser_gecko .cke_rtl .cke_rcombo .cke_text,
Index: /CKEditor/branches/versions/3.0.x/_source/skins/kama/skin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/skins/kama/skin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/skins/kama/skin.js	(revision 4056)
@@ -23,4 +23,7 @@
 		init : function( editor )
 		{
+			if ( editor.config.width && !isNaN( editor.config.width ) )
+				editor.config.width -= 12;
+
 			var menuHead;
 			function menuSetUiColor( color )
@@ -224,4 +227,5 @@
 				height = data.height,
 				dialog = data.dialog,
+				contents = dialog.parts.contents,
 				standardsMode = !CKEDITOR.env.quirks;
 
@@ -229,9 +233,18 @@
 				return;
 
-			dialog.parts.contents.setStyles(
-				{
-					width : width + 'px',
-					height : height + 'px'
-				});
+			contents.setStyles(
+				( CKEDITOR.env.ie || ( CKEDITOR.env.gecko && CKEDITOR.env.version < 10900 ) ) ?		// IE && FF2
+					{
+						width : width + 'px',
+						height : height + 'px'
+					}
+				:
+					{
+						// To avoid having scrollbars in the dialogs, we're
+						// (for now) using the "min-xxx" properties, for
+						// browsers which well support it (#3878).
+						'min-width' : width + 'px',
+						'min-height' : height + 'px'
+					});
 
 			if ( !CKEDITOR.env.ie )
@@ -241,6 +254,5 @@
 			setTimeout( function()
 				{
-					var content = dialog.parts.contents,
-						body = content.getParent(),
+					var body = contents.getParent(),
 						innerDialog = body.getParent();
 
@@ -264,2 +276,16 @@
 		});
 }
+
+/**
+ * The base user interface color to be used by the editor. Not all skins are
+ * compatible with this setting.
+ * @name CKEDITOR.config.uiColor
+ * @type String
+ * @default '' (empty)
+ * @example
+ * // Using a color code.
+ * config.uiColor = '#AADC6E';
+ * @example
+ * // Using an HTML color name.
+ * config.uiColor = 'Gold';
+ */
Index: /CKEditor/branches/versions/3.0.x/_source/skins/kama/toolbar.css
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/skins/kama/toolbar.css	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/skins/kama/toolbar.css	(revision 4056)
@@ -28,7 +28,9 @@
 .cke_skin_kama a:hover.cke_toolbox_collapser
 {
-	background-image: url(images/arrowtop.gif);
+	/* arrowtop.gif */
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
+	background-position: 3px -1366px; /* +3px +4px */
 	background-repeat: no-repeat;
-	background-position: center center;
 	width: 11px;
 	height: 11px;
@@ -48,5 +50,9 @@
 .cke_skin_kama a:hover.cke_toolbox_collapser_min
 {
-	background-image: url(images/arrowleft.gif);
+	/* arrowleft.gif*/
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
+	background-position: 4px -1387px; /* +4px +3px */
+	background-repeat: no-repeat;
 	margin: 2px 4px;
 }
@@ -55,5 +61,6 @@
 .cke_skin_kama .cke_rtl a:hover.cke_toolbox_collapser_min
 {
-	background-image: url(images/arrowright.gif);
+	/* arrowright.gif*/
+	background-position: 4px -1408px; /* +2px +3px */
 }
 
@@ -89,5 +96,6 @@
 	-webkit-border-radius: 5px;
 	border-radius: 5px;
-	background-image: url(sprites.png);
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
 	background-repeat: repeat-x;
 	background-position: 0 -500px;
@@ -221,4 +229,5 @@
 .cke_skin_kama .cke_button .cke_label
 {
+	cursor: default;
 	display: none;
 	padding-left: 3px;
@@ -249,5 +258,8 @@
 {
 	position: absolute;
-	left: -10000px;
+	display: block;
+	width: 0;
+	height: 0;
+	overflow: hidden;
 }
 
@@ -257,6 +269,7 @@
 	height: 17px;
 	width: 8px;
-	background-position: right center;
-	background-image: url(images/arrowdown.gif);
+	background-position: 2px -1469px; /* (+2, -5) */
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
 	background-repeat: no-repeat;
 	float: left;
@@ -265,5 +278,5 @@
 .cke_skin_kama .cke_rtl .cke_button .cke_buttonarrow
 {
-	background-position: left center;
+	background-position: 0 -1469px; /* (0, -5) */
 	float: right;
 }
Index: /CKEditor/branches/versions/3.0.x/_source/skins/office2003/dialog.css
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/skins/office2003/dialog.css	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/skins/office2003/dialog.css	(revision 4056)
@@ -158,4 +158,5 @@
 {
 	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
 	background-position: 0 -678px;
 	background-repeat: repeat-x;
@@ -172,4 +173,5 @@
 {
 	position: static !important;
+	unicode-bidi: bidi-override;
 }
 
@@ -310,4 +312,5 @@
 	_width: 99%;
 	overflow: auto;
+	resize: none;
 }
 
@@ -360,4 +363,5 @@
 {
 	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
 	background-position: 0 -678px;
 	background-repeat: repeat-x;
@@ -448,5 +452,6 @@
 {
 	left: 10px;
-	_left: 22px;
+	_left: 16px;
+	_top: 6px;
 }
 
@@ -499,5 +504,5 @@
 }
 
-.cke_skin_office2003 .cke_dialog .cke_btn_reset
+.cke_skin_office2003 .cke_dialog a.cke_btn_reset
 {
 	float: right;
@@ -511,11 +516,11 @@
 }
 
-.cke_skin_office2003 .cke_rtl .cke_dialog .cke_btn_reset
+.cke_skin_office2003 .cke_rtl .cke_dialog a.cke_btn_reset
 {
 	float: left;
 }
 
-.cke_skin_office2003 .cke_dialog .cke_btn_locked,
-.cke_skin_office2003 .cke_dialog .cke_btn_unlocked
+.cke_skin_office2003 .cke_dialog a.cke_btn_locked,
+.cke_skin_office2003 .cke_dialog a.cke_btn_unlocked
 {
 	float: left;
@@ -529,11 +534,11 @@
 }
 
-.cke_skin_office2003 .cke_dialog .cke_btn_locked,
-.cke_skin_office2003 .cke_dialog .cke_btn_unlocked
+.cke_skin_office2003 .cke_rtl .cke_dialog a.cke_btn_locked,
+.cke_skin_office2003 .cke_rtl .cke_dialog a.cke_btn_unlocked
 {
 	float: right;
 }
 
-.cke_skin_office2003 .cke_dialog .cke_btn_unlocked
+.cke_skin_office2003 .cke_dialog a.cke_btn_unlocked
 {
 	background-position: 0 -16px;
Index: /CKEditor/branches/versions/3.0.x/_source/skins/office2003/mainui.css
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/skins/office2003/mainui.css	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/skins/office2003/mainui.css	(revision 4056)
@@ -10,4 +10,5 @@
 */
 	display: inline-table;
+	width: 100%;
 }
 
@@ -66,8 +67,12 @@
 	width: 12px;
 	height: 12px;
-	margin-top: 12px;
+	margin-top: 16px;
 	display: block;
 	float: right;
-	background-image: url(images/resizer.gif);
+	/* resizer.gif*/
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
+	background-position: 0 -1088px;
+	background-repeat: no-repeat;
 	cursor: se-resize;
 }
@@ -81,5 +86,6 @@
 {
 	cursor: sw-resize;
-	background-image: url(images/resizer_rtl.gif);
+	/* resizer_rtl.gif*/
+	background-position: 0 -1115px;
 	float: left;
 }
Index: /CKEditor/branches/versions/3.0.x/_source/skins/office2003/menu.css
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/skins/office2003/menu.css	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/skins/office2003/menu.css	(revision 4056)
@@ -100,6 +100,5 @@
 }
 
-/* Never applied */
-/*.cke_rtl .cke_skin_office2003 .cke_menuitem .cke_label
+.cke_rtl .cke_skin_office2003 .cke_menuitem .cke_label
 {
 	padding-right: 0;
@@ -107,5 +106,5 @@
 	padding-left: 3px;
 	margin-right: 28px;
-}*/
+}
 
 .cke_skin_office2003 .cke_menuitem a.cke_disabled .cke_label
@@ -141,5 +140,8 @@
 .cke_skin_office2003 .cke_menuarrow
 {
-	background-image: url(images/arrowright.gif);
+	/* arrowright.gif*/
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
+	background-position: 0 -1071px;
 	background-repeat: no-repeat;
 	height: 5px;
@@ -150,17 +152,24 @@
 }
 
-/* Never applied */
-/*.cke_rtl .cke_skin_office2003 .cke_menuarrow
+.cke_rtl .cke_skin_office2003 .cke_menuarrow
 {
 	float: left;
 	margin-right: 0;
 	margin-left: 2px;
-	background-image: url(images/arrowleft.gif);
-}*/
+	/* arrowleft.gif*/
+	background-position: 0 -1050px;
+}
 
 /* #3766 In the context menu, long labels with second level menu get wrapped */
-.cke_browser_ie .cke_skin_office2003 .cke_menuarrow
+.cke_browser_ie.cke_ltr .cke_skin_office2003 .cke_menuarrow
 {
 	position: absolute;
-	right: 0;
+	right: 2px;
 }
+
+.cke_browser_ie.cke_rtl .cke_skin_office2003 .cke_menuarrow
+{
+	position: absolute;
+	left: 2px;
+}
+/* END #3766 */
Index: /CKEditor/branches/versions/3.0.x/_source/skins/office2003/richcombo.css
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/skins/office2003/richcombo.css	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/skins/office2003/richcombo.css	(revision 4056)
@@ -11,7 +11,18 @@
 }
 
+.cke_skin_office2003 .cke_browser_ie .cke_rcombo
+{
+	#float: none;
+	#display: inline;
+}
+
 .cke_skin_office2003 .cke_rtl .cke_rcombo
 {
 	float: right;
+}
+
+.cke_skin_office2003 .cke_browser_ie .cke_rcombo
+{
+	#float: none;
 }
 
@@ -61,4 +72,5 @@
 
 	_background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
 	_background-position: 0 -962px;
 	_background-repeat: repeat-x;
@@ -96,4 +108,5 @@
 	overflow: hidden;
 	display: inline-block;
+	vertical-align: top;
 }
 
@@ -128,6 +141,7 @@
 	display: inline-block;
 
-	background-position: center center;
-	background-image: url(images/arrowdown.gif);
+	background-position: 5px -1002px;
+	background-image: url(images/sprites.png);
+	background-image: url(images/sprites_ie6.png);
 	background-repeat: no-repeat;
 
Index: /CKEditor/branches/versions/3.0.x/_source/skins/office2003/skin.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/skins/office2003/skin.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/skins/office2003/skin.js	(revision 4056)
@@ -47,5 +47,5 @@
 
 			// Fix the size of the elements which have flexible lengths.
-			setTimeout( function()
+			var fixSize = function()
 				{
 					var content = dialog.parts.contents,
@@ -68,6 +68,10 @@
 					el = innerDialog.getChild( 5 );
 					el.setStyle( 'height', ( body.$.offsetHeight - 31 - 14 ) + 'px' );
-				},
-				100 );
+				};
+			setTimeout( fixSize, 100 );
+
+			// Ensure size is correct for RTL mode. (#4003)
+			if ( evt.editor.lang.dir == 'rtl' )
+				setTimeout( fixSize, 1000 );
 		});
 }
Index: /CKEditor/branches/versions/3.0.x/_source/skins/office2003/toolbar.css
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/skins/office2003/toolbar.css	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/skins/office2003/toolbar.css	(revision 4056)
@@ -15,7 +15,8 @@
 .cke_skin_office2003 a:hover.cke_toolbox_collapser
 {
-	background-image: url(images/arrowtop.gif);
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
+	background-position: 3px -1026px; /* +3px +4px */
 	background-repeat: no-repeat;
-	background-position: center center;
 	width: 11px;
 	height: 11px;
@@ -35,5 +36,9 @@
 .cke_skin_office2003 a:hover.cke_toolbox_collapser_min
 {
-	background-image: url(images/arrowleft.gif);
+	/* arrowleft.gif*/
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
+	background-position: 4px -1047px; /* +4px +3px */
+	background-repeat: no-repeat;
 	margin: 2px;
 }
@@ -42,5 +47,6 @@
 .cke_skin_office2003 .cke_rtl a:hover.cke_toolbox_collapser_min
 {
-	background-image: url(images/arrowright.gif);
+	/* arrowright.gif*/
+	background-position: 4px -1068px; /* +2px +3px */
 }
 
@@ -68,7 +74,18 @@
 }
 
+.cke_skin_office2003 .cke_browser_ie .cke_toolgroup
+{
+	#float: none;
+	#display: inline;
+}
+
 .cke_skin_office2003 .cke_rtl .cke_toolgroup
 {
 	float: right;
+}
+
+.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_toolgroup
+{
+	#float: none;
 }
 
@@ -82,7 +99,18 @@
 }
 
+.cke_skin_office2003 .cke_browser_ie .cke_separator
+{
+	#float: none;
+	#display: inline;
+}
+
 .cke_skin_office2003 .cke_rtl .cke_separator
 {
 	float: right;
+}
+
+.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_separator
+{
+	#float: none;
 }
 
@@ -109,8 +137,19 @@
 }
 
+.cke_skin_office2003 .cke_browser_ie .cke_toolbar_start
+{
+	#float: none;
+	#display: inline;
+}
+
 .cke_skin_office2003 .cke_rtl .cke_toolbar_start
 {
     background-position: -27px -816px;
     float: right;
+}
+
+.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_toolbar_start
+{
+	#float: none;
 }
 
@@ -127,4 +166,10 @@
 }
 
+.cke_skin_office2003 .cke_browser_ie .cke_toolbar_end
+{
+	#float: none;
+	#display: inline;
+}
+
 .cke_skin_office2003 .cke_rtl .cke_toolbar_end
 {
@@ -133,13 +178,16 @@
 }
 
+.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_toolbar_end
+{
+	#float: none;
+}
+
 .cke_skin_office2003 .cke_button a,
+.cke_skin_office2003 .cke_button a:hover,
+.cke_skin_office2003 .cke_button a:focus,
+.cke_skin_office2003 .cke_button a:active,
 .cke_skin_office2003 .cke_button a.cke_off
 {
 	border: solid 1px transparent;
-	filter: alpha(opacity=70); /* IE */
-	opacity: 0.70; /* Safari, Opera and Mozilla */
-	display: inline-block;
-	-moz-border-radius: 3px;
-	-webkit-border-radius: 3px;
 	border-radius: 3px;
 	outline: none;
@@ -155,4 +203,14 @@
 	_margin: 3px 1px 1px 1px;
 	cursor: default;
+	display: inline-block;
+}
+
+.cke_skin_office2003 .cke_button a,
+.cke_skin_office2003 .cke_button a.cke_off
+{
+	filter: alpha(opacity=70); /* IE */
+	opacity: 0.70; /* Safari, Opera and Mozilla */
+	-moz-border-radius: 3px;
+	-webkit-border-radius: 3px;
 }
 
@@ -245,4 +303,5 @@
 	padding-left: 3px;
 	vertical-align: 3px;
+	cursor: default;
 
 	_background-image: url(images/sprites_ie6.png);
@@ -277,5 +336,8 @@
 {
 	position: absolute;
-	top: -1000000px;
+	display: block;
+	width: 0;
+	height: 0;
+	overflow: hidden;
 }
 
@@ -285,6 +347,7 @@
 	height: 18px;
 	width: 8px;
-	background-position: right center;
-	background-image: url(images/arrowdown.gif);
+	background-position: 2px -1004px;
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
 	background-repeat: no-repeat;
 }
@@ -292,5 +355,5 @@
 .cke_skin_office2003 .cke_rtl .cke_button .cke_buttonarrow
 {
-	background-position: left center;
+	background-position: 0 -1004px;
 }
 
Index: /CKEditor/branches/versions/3.0.x/_source/skins/v2/dialog.css
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/skins/v2/dialog.css	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/skins/v2/dialog.css	(revision 4056)
@@ -169,4 +169,5 @@
 {
 	position: static !important;
+	unicode-bidi: bidi-override;
 }
 
@@ -307,4 +308,5 @@
 	_width: 99%;
 	overflow: auto;
+	resize: none;
 }
 
@@ -447,5 +449,6 @@
 {
 	left: 10px;
-	_left: 22px;
+	_left: 16px;
+	_top: 7px;
 }
 
@@ -498,5 +501,5 @@
 }
 
-.cke_skin_v2 .cke_dialog .cke_btn_reset
+.cke_skin_v2 .cke_dialog a.cke_btn_reset
 {
 	float: right;
@@ -510,11 +513,11 @@
 }
 
-.cke_skin_v2 .cke_rtl .cke_dialog .cke_btn_reset
+.cke_skin_v2 .cke_rtl .cke_dialog a.cke_btn_reset
 {
 	float: left;
 }
 
-.cke_skin_v2 .cke_dialog .cke_btn_locked,
-.cke_skin_v2 .cke_dialog .cke_btn_unlocked
+.cke_skin_v2 .cke_dialog a.cke_btn_locked,
+.cke_skin_v2 .cke_dialog a.cke_btn_unlocked
 {
 	float: left;
@@ -528,11 +531,11 @@
 }
 
-.cke_skin_v2 .cke_dialog .cke_btn_locked,
-.cke_skin_v2 .cke_dialog .cke_btn_unlocked
+.cke_skin_v2 .cke_rtl .cke_dialog a.cke_btn_locked,
+.cke_skin_v2 .cke_rtl .cke_dialog a.cke_btn_unlocked
 {
 	float: right;
 }
 
-.cke_skin_v2 .cke_dialog .cke_btn_unlocked
+.cke_skin_v2 .cke_dialog a.cke_btn_unlocked
 {
 	background-position: 0 -16px;
Index: /CKEditor/branches/versions/3.0.x/_source/skins/v2/mainui.css
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/skins/v2/mainui.css	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/skins/v2/mainui.css	(revision 4056)
@@ -10,4 +10,5 @@
 */
 	display: inline-table;
+	width: 100%;
 }
 
@@ -81,8 +82,12 @@
 	width: 12px;
 	height: 12px;
-	margin-top: 12px;
+	margin-top: 16px;
 	display: block;
 	float: right;
-	background-image: url(images/resizer.gif);
+	/* resizer.gif*/
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
+	background-position: 0 -801px;
+	background-repeat: no-repeat;
 	cursor: se-resize;
 }
@@ -91,5 +96,6 @@
 {
 	cursor: sw-resize;
-	background-image: url(images/resizer_rtl.gif);
+	/* resizer_rtl.gif*/
+	background-position: 0 -828px;
 	float: left;
 }
Index: /CKEditor/branches/versions/3.0.x/_source/skins/v2/menu.css
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/skins/v2/menu.css	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/skins/v2/menu.css	(revision 4056)
@@ -100,6 +100,5 @@
 }
 
-/* Never applied */
-/*.cke_rtl .cke_skin_v2 .cke_menuitem .cke_label
+.cke_rtl .cke_skin_v2 .cke_menuitem .cke_label
 {
 	padding-right: 0;
@@ -107,5 +106,5 @@
 	padding-left: 3px;
 	margin-right: 28px;
-}*/
+}
 
 .cke_skin_v2 .cke_menuitem a.cke_disabled .cke_label
@@ -128,5 +127,5 @@
 {
 	background-color: transparent;
-	color: inherit;
+	color: black;
 }
 
@@ -143,5 +142,8 @@
 .cke_skin_v2 .cke_menuarrow
 {
-	background-image: url(images/arrowright.gif);
+	/* arrowright.gif*/
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
+	background-position: 0 -784px;
 	background-repeat: no-repeat;
 	height: 5px;
@@ -153,16 +155,24 @@
 
 /* Never applied */
-/*.cke_rtl .cke_skin_v2 .cke_menuarrow
+.cke_rtl .cke_skin_v2 .cke_menuarrow
 {
 	float: left;
 	margin-right: 0;
 	margin-left: 2px;
-	background-image: url(images/arrowleft.gif);
-}*/
+	/* arrowleft.gif*/
+	background-position: 0 -763px;
+}
 
 /* #3766 In the context menu, long labels with second level menu get wrapped */
-.cke_browser_ie .cke_skin_v2 .cke_menuarrow
+.cke_browser_ie.cke_ltr .cke_skin_v2 .cke_menuarrow
 {
 	position: absolute;
-	right: 0;
+	right: 2px;
 }
+
+.cke_browser_ie.cke_rtl .cke_skin_v2 .cke_menuarrow
+{
+	position: absolute;
+	left: 2px;
+}
+/* END #3766 */
Index: /CKEditor/branches/versions/3.0.x/_source/skins/v2/presets.css
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/skins/v2/presets.css	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/skins/v2/presets.css	(revision 4056)
@@ -7,5 +7,6 @@
 .cke_skin_v2 .cke_button_source .cke_label
 {
-	display: inline;
+	display: inline;		/* FF2 */
+	display: inline-block;
 }
 
Index: /CKEditor/branches/versions/3.0.x/_source/skins/v2/richcombo.css
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/skins/v2/richcombo.css	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/skins/v2/richcombo.css	(revision 4056)
@@ -11,7 +11,18 @@
 }
 
+.cke_skin_v2 .cke_browser_ie .cke_rcombo
+{
+	#float: none;
+	#display: inline;
+}
+
 .cke_skin_v2 .cke_rtl .cke_rcombo
 {
 	float: right;
+}
+
+.cke_skin_v2 .cke_browser_ie .cke_rcombo
+{
+	#float: none;
 }
 
@@ -93,4 +104,5 @@
 	overflow: hidden;
 	display: inline-block;
+	vertical-align: top;
 }
 
@@ -125,6 +137,7 @@
 	display: inline-block;
 
-	background-position: center center;
-	background-image: url(images/arrowdown.gif);
+	background-position: 5px -715px;
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
 	background-repeat: no-repeat;
 
Index: /CKEditor/branches/versions/3.0.x/_source/skins/v2/toolbar.css
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/skins/v2/toolbar.css	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/skins/v2/toolbar.css	(revision 4056)
@@ -15,7 +15,8 @@
 .cke_skin_v2 a:hover.cke_toolbox_collapser
 {
-	background-image: url(images/arrowtop.gif);
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
+	background-position: 3px -739px; /* +3px +4px */
 	background-repeat: no-repeat;
-	background-position: center center;
 	width: 11px;
 	height: 11px;
@@ -35,5 +36,9 @@
 .cke_skin_v2 a:hover.cke_toolbox_collapser_min
 {
-	background-image: url(images/arrowleft.gif);
+	/* arrowleft.gif*/
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
+	background-position: 4px -760px; /* +4px +3px */
+	background-repeat: no-repeat;
 	margin: 2px;
 }
@@ -42,5 +47,6 @@
 .cke_skin_v2 .cke_rtl a:hover.cke_toolbox_collapser_min
 {
-	background-image: url(images/arrowright.gif);
+	/* arrowright.gif*/
+	background-position: 4px -781px; /* +2px +3px */
 }
 
@@ -64,7 +70,18 @@
 }
 
+.cke_skin_v2 .cke_browser_ie .cke_toolgroup
+{
+	#float: none;
+	#display: inline;
+}
+
 .cke_skin_v2 .cke_rtl .cke_toolgroup
 {
 	float: right;
+}
+
+.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_toolgroup
+{
+	#float: none;
 }
 
@@ -78,7 +95,18 @@
 }
 
+.cke_skin_v2 .cke_browser_ie .cke_separator
+{
+	#float: none;
+	#display: inline;
+}
+
 .cke_skin_v2 .cke_rtl .cke_separator
 {
 	float: right;
+}
+
+.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_separator
+{
+	#float: none;
 }
 
@@ -104,4 +132,10 @@
 }
 
+.cke_skin_v2 .cke_browser_ie .cke_toolbar_start
+{
+	#float: none;
+	#display: inline;
+}
+
 .cke_skin_v2 .cke_rtl .cke_toolbar_start
 {
@@ -109,4 +143,9 @@
 }
 
+.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_toolbar_start
+{
+	#float: none;
+}
+
 .cke_skin_v2 .cke_toolbar_end
 {
@@ -115,4 +154,10 @@
 }
 
+.cke_skin_v2 .cke_browser_ie .cke_toolbar_end
+{
+	#float: none;
+	#display: inline
+}
+
 .cke_skin_v2 .cke_rtl .cke_toolbar_end
 {
@@ -120,14 +165,17 @@
 }
 
+.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_toolbar_end
+{
+	#float: none;
+}
+
 .cke_skin_v2 .cke_button a,
+.cke_skin_v2 .cke_button a:hover,
+.cke_skin_v2 .cke_button a:focus,
+.cke_skin_v2 .cke_button a:active,
 .cke_skin_v2 .cke_button a.cke_off
 {
 	border: solid 1px #efefde;
-	background-color: #efefde;
-	filter: alpha(opacity=70); /* IE */
-	opacity: 0.70; /* Safari, Opera and Mozilla */
-	display: inline-block;
-	-moz-border-radius: 3px;
-	-webkit-border-radius: 3px;
+	display: inline-block;
 	border-radius: 3px;
 	outline: none;
@@ -140,4 +188,14 @@
 }
 
+.cke_skin_v2 .cke_button a,
+.cke_skin_v2 .cke_button a.cke_off
+{
+	background-color: #efefde;
+	filter: alpha(opacity=70); /* IE */
+	opacity: 0.70; /* Safari, Opera and Mozilla */
+	-moz-border-radius: 3px;
+	-webkit-border-radius: 3px;
+}
+
 .cke_skin_v2 .cke_hc .cke_button a,
 .cke_skin_v2 .cke_hc .cke_button a.cke_off
@@ -215,4 +273,5 @@
 .cke_skin_v2 .cke_button .cke_label
 {
+	cursor: default;
 	display: none;
 	padding-left: 3px;
@@ -234,5 +293,8 @@
 {
 	position: absolute;
-	top: -1000000px;
+	display: block;
+	width: 0;
+	height: 0;
+	overflow: hidden;
 }
 
@@ -242,6 +304,7 @@
 	height: 17px;
 	width: 8px;
-	background-position: right center;
-	background-image: url(images/arrowdown.gif);
+	background-position: 2px -717px;
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
 	background-repeat: no-repeat;
 }
@@ -249,5 +312,7 @@
 .cke_skin_v2 .cke_rtl .cke_button .cke_buttonarrow
 {
-	background-position: left center;
+	background-position: 0 -717px;
+	background-image: url(images/sprites.png);
+	_background-image: url(images/sprites_ie6.png);
 }
 
Index: /CKEditor/branches/versions/3.0.x/_source/tests/core/bootstrap.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/tests/core/bootstrap.html	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_source/tests/core/bootstrap.html	(revision 4056)
@@ -0,0 +1,68 @@
+﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>CKEDITOR.bootstrap</title>
+	<link rel="stylesheet" type="text/css" href="../test.css" />
+	<script type="text/javascript" src="../../../ckeditor_basic_source.js"></script> <!-- %REMOVE_LINE%
+	<script type="text/javascript" src="../../ckeditor_basic.js"></script>
+	%REMOVE_LINE% -->
+	<script type="text/javascript" src="../test.js"></script>
+	<script type="text/javascript">
+	//<![CDATA[
+
+var before_loadFullCore = CKEDITOR.status;
+
+var isLoaded;
+
+CKEDITOR.on( 'loaded', function()
+	{
+		isLoaded = true;
+	});
+
+
+CKEDITOR.loadFullCore();
+
+	//]]>
+	</script>
+	<script type="text/javascript">
+	//<![CDATA[
+
+CKEDITOR.test.addTestCase( (function()
+{
+	// Local reference to the "assert" object.
+	var assert = CKEDITOR.test.assert;
+
+	return {
+		test_status1 : function()
+		{
+			assert.areSame( 'basic_loaded', before_loadFullCore );
+		},
+
+		test_status2 : function()
+		{
+			// In IE, CKEDITOR.on( 'loaded' ) will be called immediately if the scripts are cached.
+			if ( isLoaded )
+				return;
+
+			var testCase = this;
+			CKEDITOR.on( 'loaded', function()
+				{
+					testCase.resume( function()
+						{
+							assert.areSame( 'loaded', CKEDITOR.status );
+						});
+				});
+
+			this.wait();
+		},
+
+		name : document.title
+	};
+})() );
+
+	//]]>
+	</script>
+</head>
+<body>
+</body>
+</html>
Index: /CKEditor/branches/versions/3.0.x/_source/tests/core/ckeditor.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/tests/core/ckeditor.html	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/tests/core/ckeditor.html	(revision 4056)
@@ -10,6 +10,15 @@
 	<script type="text/javascript">
 	//<![CDATA[
+	// Clean up all instances been created on the page.
+	function removeAllInstances()
+	{
+		var allInstances = CKEDITOR.instances;
+		for( var i in allInstances )
+		{
+			CKEDITOR.remove(  allInstances[ i ] );
+		}
+	}
 
-CKEDITOR.test.addTestCase( (function()
+	CKEDITOR.test.addTestCase( (function()
 {
 	// Local reference to the "assert" object.
@@ -128,4 +137,9 @@
 		},
 
+		setUp : function()
+		{
+			removeAllInstances();
+		},
+
 		name : document.title
 	};
Index: Editor/branches/versions/3.0.x/_source/tests/core/ckeditor2.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/tests/core/ckeditor2.html	(revision 4055)
+++ 	(revision )
@@ -1,56 +1,0 @@
-﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-	<title>CKEDITOR 2</title>
-	<link rel="stylesheet" type="text/css" href="../test.css" />
-	<script type="text/javascript" src="../../../ckeditor_source.js"></script> <!-- %REMOVE_LINE%
-	<script type="text/javascript" src="../../ckeditor.js"></script>
-	%REMOVE_LINE% -->
-	<script type="text/javascript" src="../test.js"></script>
-	<script type="text/javascript">
-	//<![CDATA[
-
-var before_loadFullCore = CKEDITOR.status;
-
-CKEDITOR.loadFullCore();
-
-	//]]>
-	</script>
-	<script type="text/javascript">
-	//<![CDATA[
-
-CKEDITOR.test.addTestCase( (function()
-{
-	// Local reference to the "assert" object.
-	var assert = CKEDITOR.test.assert;
-
-	return {
-		test_status1 : function()
-		{
-			assert.areSame( 'basic_loaded', before_loadFullCore );
-		},
-
-		test_status2 : function()
-		{
-			var testCase = this;
-			CKEDITOR.on( 'loaded', function()
-				{
-					testCase.resume( function()
-						{
-							assert.areSame( 'loaded', CKEDITOR.status );
-						});
-				});
-
-			this.wait();
-		},
-
-		name : document.title
-	};
-})() );
-
-	//]]>
-	</script>
-</head>
-<body>
-</body>
-</html>
Index: /CKEditor/branches/versions/3.0.x/_source/tests/core/dom/document.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/tests/core/dom/document.html	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/tests/core/dom/document.html	(revision 4056)
@@ -26,5 +26,7 @@
 		test_appendStyleSheet : function()
 		{
-			var cssUrl = CKEDITOR.basePath + '_source/tests/_assets/sample.css';
+			var cssUrl = CKEDITOR.basePath + '_tests/';
+			cssUrl = CKEDITOR.basePath + '_source/tests/';	// %REMOVE_LINE%
+			cssUrl += '_assets/sample.css';
 
 			var doc = new CKEDITOR.dom.document( document );
Index: /CKEditor/branches/versions/3.0.x/_source/tests/core/dom/documentfragment.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/tests/core/dom/documentfragment.html	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/tests/core/dom/documentfragment.html	(revision 4056)
@@ -112,6 +112,7 @@
 			if ( CKEDITOR.env.ie )
 				return;
-			var element = CKEDITOR.document.getById(
-						'trimTarget' ).clone( true );
+			var element = CKEDITOR.dom.element.createFromHtml(
+				'<div id="trimTarget">\t\ntext\t\n</div>'
+			);
 			var frag =
 					new CKEDITOR.dom.documentFragment( CKEDITOR.document );
@@ -146,6 +147,7 @@
 			if ( CKEDITOR.env.ie )
 				return;
-			var element = CKEDITOR.document.getById(
-						'trimTarget' ).clone( true );
+			var element = CKEDITOR.dom.element.createFromHtml(
+				'<div id="trimTarget">\t\ntext\t\n</div>'
+			);
 			var frag =
 					new CKEDITOR.dom.documentFragment( CKEDITOR.document );
@@ -182,6 +184,7 @@
 			if ( !CKEDITOR.env.ie )
 				return;
-			var element =
-					CKEDITOR.document.getById( 'trimTarget' ).clone( true );
+			var element = CKEDITOR.dom.element.createFromHtml(
+				'<div id="trimTarget">\t\ntext\t\n</div>'
+			);
 			var frag =
 					new CKEDITOR.dom.documentFragment( CKEDITOR.document );
@@ -287,7 +290,4 @@
 	<div id="fragmentContainer2"><div id="fragmentSibling1"></div></div>
 	<div id="fragmentContainer3"></div>
-	<div id="trimTarget">
-text
-</div>
 	<iframe id="innerFrame" name="innerFrame" src="about:blank"></iframe>
 </body>
Index: /CKEditor/branches/versions/3.0.x/_source/tests/core/dom/element.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/tests/core/dom/element.html	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/tests/core/dom/element.html	(revision 4056)
@@ -84,4 +84,10 @@
 		},
 
+		test_createFromHtml2 : function()
+		{
+			var element = new CKEDITOR.dom.element.createFromHtml( '<div><x:x><p>Test</p></div>' );
+			assert.areNotEqual( 'Test', element.getChild( 0, 0 ).innerHTML );
+		},
+
 		test_append1 : function()
 		{
@@ -173,5 +179,5 @@
 			element.setAttribute( 'style', 'position: absolute;' );
 
-			assert.areEqual( 'position: absolute;', element.getAttribute( 'style' ) );
+			assert.areEqual( 'position: absolute;', CKEDITOR.test.getAttribute( element, 'style' ) );
 		},
 
@@ -202,5 +208,5 @@
 
 			assert.areSame( 'Test', document.getElementById( 'test1' ).className, 'class is wrong' );
-			assert.areEqual( 'position: absolute;', element.getAttribute( 'style'), 'style is wrong' );
+			assert.areEqual( 'position: absolute;', CKEDITOR.test.getAttribute( element, 'style'), 'style is wrong' );
 			assert.areEqual( 'TestName', document.getElementById( 'test1' ).name, 'name is wrong' );
 			assert.areEqual( 5, document.getElementById( 'test1' ).rows, 'rows is wrong' );
@@ -375,5 +381,5 @@
 		{
 			var element = new CKEDITOR.dom.element( document.getElementById( 'tabIndex10' ) );
-			assert.areEqual( 10, element.getAttribute( 'tabindex' ) );
+			assert.areEqual( 10, CKEDITOR.test.getAttribute( element, 'tabindex' ) );
 		},
 
@@ -381,5 +387,5 @@
 		{
 			var element = new CKEDITOR.dom.element( document.getElementById( 'tabIndexDef' ) );
-			assert.isNull( element.getAttribute( 'tabindex' ) );
+			assert.isNull( CKEDITOR.test.getAttribute( element, 'tabindex' ) );
 		},
 
@@ -387,5 +393,5 @@
 		{
 			var element = new CKEDITOR.dom.element( document.getElementById( 'tabIndexInputDef' ) );
-			assert.isNull( element.getAttribute( 'tabindex' ) );
+			assert.isNull( CKEDITOR.test.getAttribute( element, 'tabindex' ) );
 		},
 
@@ -393,5 +399,5 @@
 		{
 			var element = new CKEDITOR.dom.element( document.getElementById( 'tabIndexInput20' ) );
-			assert.areEqual( 20, element.getAttribute( 'tabindex' ) );
+			assert.areEqual( 20, CKEDITOR.test.getAttribute( element, 'tabindex' ) );
 		},
 
@@ -399,5 +405,5 @@
 		{
 			var element = new CKEDITOR.dom.element( document.getElementById( 'tabIndexScriptDef' ) );
-			assert.areEqual( null, element.getAttribute( 'tabindex' ) );
+			assert.areEqual( null, CKEDITOR.test.getAttribute( element, 'tabindex' ) );
 		},
 
@@ -409,11 +415,11 @@
 			var element = new CKEDITOR.dom.element( document.getElementById( 'testExpandoAttributes' ) );
 
-			assert.areEqual( 1, element.getAttribute( 'tabindex' ), 'tabindex is wrong' );
+			assert.areEqual( 1, CKEDITOR.test.getAttribute( element, 'tabindex' ), 'tabindex is wrong' );
 			element.removeAttribute( 'tabindex' );
 
-			assert.areEqual( 'hasExpando', element.getAttribute( 'class' ), 'class is wrong' );
+			assert.areEqual( 'hasExpando', CKEDITOR.test.getAttribute( element, 'class' ), 'class is wrong' );
 			element.removeAttribute( 'class' );
 
-			assert.areEqual( 'float: right;', element.getAttribute( 'style' ) );
+			assert.areEqual( 'float: right;', CKEDITOR.test.getAttribute( element, 'style' ) );
 
 			element.removeAttribute( 'style' );
@@ -508,4 +514,16 @@
 		},
 
+		/**
+		 * Test detecting of 'class' attribute in IE6/7.
+		 */
+		test_hasAttributes_4075 : function()
+		{
+			if ( !CKEDITOR.env.ie && ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) )
+				return;
+			var element = new CKEDITOR.dom.element( 'span' );
+			element.setAttribute( 'class', 'value' );
+			assert.isTrue( element.hasAttributes(), 'Failed to detect "class" attribute existence.' );
+		},
+
 		test_getDocumentPosition : function()
 		{
@@ -513,5 +531,5 @@
 			YAHOO.util.Dom.setXY('DocPositionTarget', [ 350, 450 ] );
 			var pos = CKEDITOR.document.getById( 'DocPositionTarget' ).getDocumentPosition();
-			if ( !CKEDITOR.env.ie )
+			if ( !CKEDITOR.env.ie || CKEDITOR.env.ie8 )
 			{
 				assert.areEqual( 350, pos.x, 'Position coordinates:x relative to document doesn\'t match.' );
@@ -524,4 +542,17 @@
 			}
 		},
+
+		// Test get last non-spaces child node.
+		test_getLast : function()
+		{
+			var element = new CKEDITOR.dom.element( document.getElementById( 'append' ) );
+			var span1 = new CKEDITOR.dom.element( 'span' );
+			element.append( span1 );
+			element.append( new CKEDITOR.dom.text( ' ' ) );
+			element.append( new CKEDITOR.dom.text( ' ' ) );
+			var last = element.getLast( CKEDITOR.dom.walker.whitespaces( true ) );
+			assert.areSame( span1.$, last.$ );
+		},
+
 
 		name : document.title
Index: /CKEditor/branches/versions/3.0.x/_source/tests/core/dom/node.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/tests/core/dom/node.html	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/tests/core/dom/node.html	(revision 4056)
@@ -115,4 +115,30 @@
 		},
 
+		// Test get previous non-spaces node.
+		test_getPrevious : function()
+		{
+			var element = new CKEDITOR.dom.element( document.getElementById( 'append' ) );
+			var span1 = new CKEDITOR.dom.element( 'span' );
+			element.append( span1 );
+			element.append( new CKEDITOR.dom.text( ' ' ) );
+			var span2 = new CKEDITOR.dom.element( 'span' );
+			element.append( span2 );
+			var previous = span2.getPrevious( CKEDITOR.dom.walker.whitespaces( true ) );
+			assert.areSame( span1.$, previous.$ );
+		},
+
+		// Test get next non-spaces node.
+		test_getNext : function()
+		{
+			var element = new CKEDITOR.dom.element( document.getElementById( 'append' ) );
+			var span1 = new CKEDITOR.dom.element( 'span' );
+			element.append( span1 );
+			element.append( new CKEDITOR.dom.text( ' ' ) );
+			var span2 = new CKEDITOR.dom.element( 'span' );
+			element.append( span2 );
+			var next = span1.getNext( CKEDITOR.dom.walker.whitespaces( true ) );
+			assert.areSame( span2.$, next.$ );
+		},
+
 		name : document.title
 	};
@@ -136,4 +162,5 @@
 	</div>
 	<span>Another</span>
+	<p id="append"></p>
 </body>
 </html>
Index: /CKEditor/branches/versions/3.0.x/_source/tests/core/dom/range.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/tests/core/dom/range.html	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/tests/core/dom/range.html	(revision 4056)
@@ -1058,4 +1058,18 @@
 			assert.areSame( 0, range.startOffset, 'range.startOffset' );
 			assert.isTrue( range.collapsed, 'range.collapsed' );
+		},
+
+		/**
+		 * Test enlarge list when there's no nodes between
+		 * range start and the block boundary.
+		 */
+		test_enlarge_block6 : function()
+		{
+			var range = getRange( 'S11', null );
+			range.enlarge( CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS );
+
+			assert.areSame( document.getElementById( '_EnlargeP17' ),
+				range.startContainer.$, 'range.startContainer' );
+			assert.areSame( 0, range.startOffset, 'range.startOffset' );
 		},
 
@@ -2385,4 +2399,5 @@
 		<p id="_EnlargeP15">Test <span id="S9"></span>List<br/ >Item Enlarge</p>
 		<p id="_EnlargeP16">Test <strong>Block<span id="S10"></span></strong><br /><br />Enlarge</p>
+		<p id="_EnlargeP17"><span><span id="S11"></span>Test Block Enlarge<span id="E11"></span></span></p>
 		<p id="_trim_ct">Test trim</p>
 	</div>
Index: /CKEditor/branches/versions/3.0.x/_source/tests/core/editor.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/tests/core/editor.html	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/tests/core/editor.html	(revision 4056)
@@ -10,4 +10,7 @@
 	<script type="text/javascript">
 	//<![CDATA[
+
+// Disable 'scayt' plugin due to it may alter editor config after initialized.
+CKEDITOR.config.removePlugins = 'scayt';
 
 CKEDITOR.test.addTestCase( (function()
@@ -39,18 +42,35 @@
 		test_config_inpage : function()
 		{
-			// Pass in-page settings to the instance.
-			CKEDITOR.replace( 'editor2', { test1 : 'ball', baseHref : 'test' } );
+			var self = this;
 
-			var config = CKEDITOR.instances.editor2.config;
+			CKEDITOR.replace( 'editor2',
+				{
+					// The custom setting to be checked.
+					test1 : 'ball',
+					baseHref : 'test',
 
-			assert.areSame( 'ball', config.test1, '"test1" doesn\'t match' );
-			assert.areSame( 'test', config.baseHref, '"baseHref" doesn\'t match' );
+					on :
+					{
+						instanceReady : function()
+						{
+							self.resume( function()
+							{
+								var config = CKEDITOR.instances.editor2.config;
 
-			// All other settings must match CKEDITOR.config.
-			for ( var prop in CKEDITOR.config )
-			{
-				if ( prop != 'test1' && prop != 'baseHref' )
-					assert.areSame( CKEDITOR.config[ prop ], config[ prop ], '"' + prop + '" doesn\'t match' );
-			}
+								assert.areSame( 'ball', config.test1, '"test1" doesn\'t match' );
+								assert.areSame( 'test', config.baseHref, '"baseHref" doesn\'t match' );
+
+								// All other settings must match CKEDITOR.config.
+								for ( var prop in CKEDITOR.config )
+								{
+									if ( prop != 'test1' && prop != 'baseHref' )
+										assert.areSame( CKEDITOR.config[ prop ], config[ prop ], '"' + prop + '" doesn\'t match' );
+								}
+							} );
+						}
+					}
+				});
+
+			this.wait();
 		},
 
Index: /CKEditor/branches/versions/3.0.x/_source/tests/core/htmlparser/htmlparser.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/tests/core/htmlparser/htmlparser.html	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/tests/core/htmlparser/htmlparser.html	(revision 4056)
@@ -72,5 +72,5 @@
 	<textarea id="htmlOriginal1"><pre>
 	text<b>
-inside<br /> <br /></b>
+inside<br /><br /></b>
 
 pre
@@ -89,5 +89,5 @@
 </p><b>compress   spaces</b></textarea>
 
-<textarea id="htmlResult2"><p>para graph </p><b>compress spaces</b></textarea>
+<textarea id="htmlResult2"><p>para graph</p><b>compress spaces</b></textarea>
 </body>
 </html>
Index: /CKEditor/branches/versions/3.0.x/_source/tests/core/plugins.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/tests/core/plugins.html	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/tests/core/plugins.html	(revision 4056)
@@ -23,7 +23,8 @@
 		test_addExternal : function()
 		{
+			var path = '_tests/';
+			path = '_source/tests/';	// %REMOVE_LINE%
 			CKEDITOR.plugins.addExternal( 'myplugin',
-			'_source/' + // %REMOVE_LINE%
-			'tests/core/plugins/myplugins/sample/', 'my_plugin.js' );
+			path + 'core/plugins/myplugins/sample/', 'my_plugin.js' );
 
 			CKEDITOR.plugins.load( 'myplugin', function(){
Index: /CKEditor/branches/versions/3.0.x/_source/tests/core/tools.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/tests/core/tools.html	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/tests/core/tools.html	(revision 4056)
@@ -10,6 +10,6 @@
 	<script type="text/javascript">
 	//<![CDATA[
-
-CKEDITOR.test.addTestCase( (function()
+var testcase;
+CKEDITOR.test.addTestCase( testcase = (function()
 {
 	// Local reference to the "assert" object.
@@ -76,4 +76,9 @@
 		{
 			assert.areSame( 'Test\'s &amp; "quote"', CKEDITOR.tools.htmlEncode( 'Test\'s & "quote"' ) );
+		},
+
+		test_htmlEncode_3874 : function()
+		{
+			assert.areSame( 'line1\nline2', CKEDITOR.tools.htmlEncode( 'line1\nline2' ) );
 		},
 
@@ -150,8 +155,13 @@
 		},
 
+		test_repeat : function()
+		{
+			assert.areSame( '&nbsp;&nbsp;&nbsp;', CKEDITOR.tools.repeat( '&nbsp;', 3 ) );
+		},
+
 		name : document.title
 	};
 })() );
-
+//window.onload = testcase.test_htmlEncode_3874;
 	//]]>
 	</script>
Index: /CKEditor/branches/versions/3.0.x/_source/tests/plugins/domiterator/domiterator.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/tests/plugins/domiterator/domiterator.html	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/tests/plugins/domiterator/domiterator.html	(revision 4056)
@@ -5,5 +5,7 @@
 	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 	<link rel="stylesheet" type="text/css" href="../../test.css" />
-	<script type="text/javascript" src="../../../../ckeditor_source.js"></script>
+	<script type="text/javascript" src="../../../../ckeditor_source.js"></script> <!-- %REMOVE_LINE%
+	<script type="text/javascript" src="../../../ckeditor.js"></script>
+	%REMOVE_LINE% -->
 	<script type="text/javascript" src="../../test.js"></script>
 	<script type="text/javascript">
@@ -132,5 +134,5 @@
 			range.setStartAt( doc.getById( 'iterTarget4a' ), CKEDITOR.POSITION_AFTER_START );
 			range.setEndAt( doc.getById( 'iterTarget4b' ), CKEDITOR.POSITION_BEFORE_END );
-			assumeIterationSameAs( range, null, [ 'p', 'div' ] );
+			assumeIterationSameAs( range, null, [ 'p', 'p' ] );
 			assumeElementContentAreSame( 'iterContainer4', 'iterResult4' );
 		},
@@ -220,5 +222,5 @@
 	<div id="iterTarget4b"><p id="iterTarget4a">paragraph</p>text</div>
 </div>
-<textarea id="iterResult4"><div id="iterTarget4b"><p id="iterTarget4a">paragraph</p>text</div></textarea>
+<textarea id="iterResult4"><div id="iterTarget4b"><p id="iterTarget4a">paragraph</p><p>text</p></div></textarea>
 
 <div id="iterContainer7"><p id="iterTarget7">paragraph</p></div>
Index: /CKEditor/branches/versions/3.0.x/_source/tests/plugins/htmldataprocessor/htmldataprocessor.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/tests/plugins/htmldataprocessor/htmldataprocessor.html	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/tests/plugins/htmldataprocessor/htmldataprocessor.html	(revision 4056)
@@ -9,10 +9,12 @@
 	<script type="text/javascript" src="../../test.js"></script>
 	<script type="text/javascript">
-
-CKEDITOR.plugins.load( 'htmldataprocessor' );
-
-	</script>
-	<script type="text/javascript">
 	//<![CDATA[
+
+// Load the required plugins and launch the runner.
+CKEDITOR.test.deferRunner = true;
+CKEDITOR.plugins.load( 'htmldataprocessor' , function()
+{
+ CKEDITOR.test.runner.run();
+} );
 
 var testCase;
@@ -87,7 +89,5 @@
 		test_toDataFormat_3 : function()
 		{
-			var element = new CKEDITOR.dom.element.createFromHtml( '<div><x:x><p>Test</p></div>' );
-
-			assert.areSame( '<x:x><p>Test</p></x:x>', getDataProcessor().toDataFormat( element.getHtml() ) );
+			assert.areSame( '<div><x:x><p>Test</p></x:x></div>', getDataProcessor().toDataFormat( '<div><x:x><p>Test</p></div>' ) );
 		},
 
@@ -243,9 +243,100 @@
 		},
 
+		test_ticket_3591 : function()
+		{
+			var editor = CKEDITOR.instances.editor1,
+				dataProcessor = editor.dataProcessor;
+
+			dataProcessor.writer = new CKEDITOR.htmlParser.basicWriter();
+			var html = getTextAreaValue( '_TEXTAREA_3591' );
+			var protectedHtml = dataProcessor.toHtml( html );
+
+			assert.areSame( getTextAreaValue( CKEDITOR.env.ie ? '_TEXTAREA_3591_protected_ie' : '_TEXTAREA_3591_protected' ),
+				protectedHtml );
+			assert.areSame( getTextAreaValue( '_TEXTAREA_3591' ),
+				dataProcessor.toDataFormat( protectedHtml ) );
+		},
+
+		test_ticket_3591_2 : function()
+		{
+			var editor = CKEDITOR.instances.editor1,
+				dataProcessor = editor.dataProcessor;
+
+			dataProcessor.writer = new CKEDITOR.htmlParser.basicWriter();
+			dataProcessor.writer.sortAttributes = true;
+
+			var html = getTextAreaValue( '_TEXTAREA_3591_2' );
+			var protectedHtml = dataProcessor.toHtml( html );
+
+			assert.areSame( getTextAreaValue( '_TEXTAREA_3591_2' ),
+				dataProcessor.toDataFormat( protectedHtml ) );
+		},
+
+		test_ticket_3869_1 : function()
+		{
+			var editor = CKEDITOR.instances.editor1,
+				dataProcessor = editor.dataProcessor;
+
+			dataProcessor.writer = new CKEDITOR.htmlParser.basicWriter();
+			var html = getTextAreaValue( '_TEXTAREA_3869_1' );
+			var protectedHtml = dataProcessor.toHtml( html );
+
+			assert.areSame( html , dataProcessor.toDataFormat( protectedHtml ) );
+		},
+
+		test_ticket_3869_2 : function()
+		{
+			var editor = CKEDITOR.instances.editor1,
+				dataProcessor = editor.dataProcessor,
+				config = editor.config;
+
+			config.protectedSource.push( /<\?[\s\S]*?\?>/g );   // PHP Code
+			config.protectedSource.push( /<%[\s\S]*?%>/g );   // ASP Code
+			config.protectedSource.push( /(<asp:[^\>]+>[\s|\S]*?<\/asp:[^\>]+>)|(<asp:[^\>]+\/>)/gi );   // ASP.Net Code
+			config.protectedSource.push(/<gallery[\s\S]*?<\/gallery>/gi );	// custom protected source
+			config.protectedSource.push(/<options[\s\S]*?<\/options>/gi );
+			dataProcessor.writer = new CKEDITOR.htmlParser.basicWriter();
+			var html = getTextAreaValue( '_TEXTAREA_3869_2' );
+			var protectedHtml = dataProcessor.toHtml( html );
+
+			assert.areSame( html , dataProcessor.toDataFormat( protectedHtml ) );
+		},
+
+		/**
+		 * Test empty value attributes.
+		 */
+		test_ticket_3884 : function()
+		{
+			var editor = CKEDITOR.instances.editor1,
+				dataProcessor = editor.dataProcessor;
+			dataProcessor.writer = new CKEDITOR.htmlParser.basicWriter();
+			dataProcessor.writer.sortAttributes = true;
+
+			assert.areSame( '<p><a href="" name="">emptylink</a></p>',
+				dataProcessor.toDataFormat( dataProcessor.toHtml( '<p><a href="" name="">emptylink</a></p>' ) ) );
+		},
+
+		test_innerHtmlComments_ticket_3801 : function()
+		{
+			var editor = CKEDITOR.instances.editor1,
+				dataProcessor = editor.dataProcessor;
+
+			dataProcessor.writer = new CKEDITOR.htmlParser.basicWriter();
+
+			for ( var i = 1; i <= 7; i++ )
+			{
+				var html = getTextAreaValue( '_TEXTAREA_3801_' + i );
+				var protectedHtml = dataProcessor.toHtml( html );
+
+				assert.areSame( getTextAreaValue( '_TEXTAREA_3801_' + i ),
+					dataProcessor.toDataFormat( protectedHtml ) );
+			}
+		},
+
 		name : document.title
 	};
 })() );
 
-//window.onload = testCase.test_ticket_3407;
+//window.onload = testCase.test_ticket_3884;
 	//]]>
 	</script>
@@ -259,4 +350,39 @@
 <![endif]--><td><%Response.Write(now())%></td><td><asp:control_name id="some_id" runat="server"/></td><td><?php
 include ("head.html"); ?></td></tr></tbody></table><noscript>Your browser doesn't support JavaScript</noscript></textarea>
+	<textarea id="_TEXTAREA_3591"><object><param /><param /><embed></embed></object></textarea>
+	<textarea id="_TEXTAREA_3591_protected"><cke:object><cke:param></cke:param><cke:param></cke:param><cke:embed></cke:embed></cke:object></textarea>
+	<textarea id="_TEXTAREA_3591_protected_ie"><?xml:namespace prefix="cke" /><cke:object><cke:param></cke:param><cke:param></cke:param><cke:embed></cke:embed></cke:object></textarea>
+ 	<textarea id="_TEXTAREA_3801_1"><!-- foo --><p>bar</p></textarea>
+ 	<textarea id="_TEXTAREA_3801_2"><p><!-- foo -->bar</p></textarea>
+ 	<textarea id="_TEXTAREA_3801_3"><!-- foo --><p><!-- foo -->bar</p></textarea>
+ 	<textarea id="_TEXTAREA_3801_4"><p>bar</p><!-- foo --></textarea>
+ 	<textarea id="_TEXTAREA_3801_5">bar<!-- foo --></textarea>
+ 	<textarea id="_TEXTAREA_3801_6"><!-- foo -->bar</textarea>
+ 	<textarea id="_TEXTAREA_3801_7"><p><!-- foo -->bar</p><p><!-- foo -->bar</p></textarea>
+	<textarea id="_TEXTAREA_3869_1">#3869<script language="Javascript" type="text/javascript">
+	<!--
+		alert('-->');
+	//-->
+	</script></textarea>
+	<textarea id="_TEXTAREA_3869_2">#3869&lt;gallery&gt;
+	file.jpg
+	&lt;options name="test1" value="value1"&gt;&lt;/options&gt;
+	&lt;options name="test2" value="value2"&gt;&lt;/options&gt;
+	&lt;/gallery&gt;&lt;?
+		echo '&lt;script type="text/javascript"&gt;';
+		echo '&lt;!--alert("--&gt;");//--&gt;';
+		echo '&lt;/script&gt;';
+	?&gt;&lt;!--&lt;%Response.Write(now())%&gt;//--&gt;invalid&lt;?
+		echo 'bbb&lt;script&gt;
+		&lt;!--
+		ccc();&lt;!-- &lt;/script&gt;&lt;!-- &lt;/script&gt;
+		//--&gt;&lt;/script&gt;
+		&lt;script&gt;&lt;!--
+		&lt;!--
+		ffff();
+		//--&gt;&lt;/script&gt;
+		ddd';
+	?&gt;html</textarea>
+	<textarea id="_TEXTAREA_3591_2"><object classid="clsid"><param name="movie" value="movie.swf" /><embed src="movie.swf" type="application/x-shockwave-flash"></embed></object></textarea>
 </body>
 </html>
Index: /CKEditor/branches/versions/3.0.x/_source/tests/plugins/link/link.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/tests/plugins/link/link.html	(revision 4056)
+++ /CKEditor/branches/versions/3.0.x/_source/tests/plugins/link/link.html	(revision 4056)
@@ -0,0 +1,125 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>Plugin: link</title>
+	<link rel="stylesheet" type="text/css" href="../../test.css" />
+	<script type="text/javascript" src="../../../../ckeditor_source.js"></script> <!-- %REMOVE_LINE%
+	<script type="text/javascript" src="../../../ckeditor.js"></script>
+	%REMOVE_LINE% -->
+	<script type="text/javascript" src="../../test.js"></script>
+	<script type="text/javascript">
+	//<![CDATA[
+/**
+ * Load the editor and wait for fully interactable.
+ * @param {Object} elementId
+ * @parma {Object} mode
+ * @param {Object} config
+ * @param {Object} callback Continuation with {@param editor}.
+ * @param {Object} context
+ */
+function prepareEditor( elementId, mode, config, callback, context )
+{
+	CKEDITOR.on( 'instanceReady',
+		function( evt )
+		{
+			var isMe = mode == CKEDITOR.ELEMENT_MODE_REPLACE ?
+				evt.editor.name == elementId
+				: evt.editor.element.$ ==
+					document.getElementById( elementId );
+			if ( isMe )
+			{
+				var editor = evt.editor;
+				// Force result data unformatted.
+				editor.dataProcessor.writer._.rules = {};
+				// Force remove tail br.
+				editor.dataProcessor.htmlFilter.addRules( {
+					elements : {
+						'br' : function( br ){
+							var parent = br.parent,
+								length = parent.children.length,
+								lastChild = parent.children[ length - 1 ];
+							if( lastChild == br )
+								return false;
+						}
+					}
+				} );
+				callback.call( context, editor );
+			}
+		}, this );
+
+	mode = mode || CKEDITOR.ELEMENT_MODE_REPLACE;
+	switch( mode )
+	{
+		case CKEDITOR.ELEMENT_MODE_REPLACE :
+			CKEDITOR.replace( elementId, config );
+			break;
+		case CKEDITOR.ELEMENT_MODE_APPENDTO :
+			CKEDITOR.appendTo( elementId, config );
+			break;
+	}
+}
+
+/**
+ * IE always returning CRLF for line-feed, so remove it when retrieving
+ * pre-formated text from text area.
+ */
+function getTextAreaValue( id )
+{
+	return CKEDITOR.document.getById( id ).getValue().replace( /\r/gi, '' );
+}
+
+CKEDITOR.test.addTestCase( ( function()
+	{
+
+		// Local references.
+		var assert = CKEDITOR.test.assert,
+			doc = CKEDITOR.document,
+			action = YAHOO.util.UserAction,
+			selector = YAHOO.util.Selector;
+
+		return	{
+
+			/**
+			 *  Test remove numbered list with 'enterMode = BR'.
+			 */
+			test_create_link : function()
+			{
+				prepareEditor( 'test_create_link_editor', null,
+					null,
+					function( editor )
+					{
+						this.resume( function()
+						{
+				            editor.focus();
+				            editor.execCommand( 'link' );
+							// waiting for dialog to open.
+				            this.wait( function()
+							 {
+							 	var dialog = editor._.storedDialogs[ 'link' ];
+							 	var urlField = dialog.getContentElement( 'info', 'url' );
+							 	urlField.setValue( 'svn.fckeditor.net' );
+
+							 	dialog.fire( 'ok' );
+							 	dialog.hide();
+
+							 	var result = editor.getData();
+							 	assert.areEqual(
+								 '<p><a href="http://svn.fckeditor.net">http://svn.fckeditor.net</a></p>',
+								 result, 'Created link element doesn\'t match.' );
+
+							 }, 1000 );
+						} );
+					}, this );
+					this.wait();
+			},
+
+			name :document.title
+		};
+	} )() );
+	//]]>
+	</script>
+</head>
+<body>
+<textarea id="test_create_link_editor"></textarea>
+</body>
+</html>
Index: /CKEditor/branches/versions/3.0.x/_source/tests/plugins/list/list.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/tests/plugins/list/list.html	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/tests/plugins/list/list.html	(revision 4056)
@@ -2,7 +2,9 @@
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-	<title>Plugin: toolbar</title>
+	<title>Plugin: list</title>
 	<link rel="stylesheet" type="text/css" href="../../test.css" />
-	<script type="text/javascript" src="../../../../ckeditor_source.js"></script>
+	<script type="text/javascript" src="../../../../ckeditor_source.js"></script> <!-- %REMOVE_LINE%
+	<script type="text/javascript" src="../../../ckeditor.js"></script>
+	%REMOVE_LINE% -->
 	<script type="text/javascript" src="../../test.js"></script>
 	<script type="text/javascript">
@@ -27,5 +29,8 @@
 			if ( isMe )
 			{
-				callback.call( context, evt.editor );
+				var editor = evt.editor;
+				// Force result data unformatted.
+				editor.dataProcessor.writer._.rules = {};
+				callback.call( context, editor );
 			}
 		}, this );
@@ -106,7 +111,4 @@
 							editor.focus();
 
-							// Force result data unformatted.
-							editor.dataProcessor.writer._.rules = {};
-
 							var doc = editor.document,
 								range = new CKEDITOR.dom.range( doc );
@@ -120,8 +122,77 @@
 								// Remove list.
 								editor.execCommand( 'numberedlist' );
-								assert.areSame( getTextAreaValue( 'test_ticket_3151_resultContent' ),
+								assert.areSame( getTextAreaValue( 'test_ticket_3151_result' ),
 									editor.getData(),
 									'Remove list result not correct.' );
-							}, 1000);
+							}, 1000 );
+
+						} );
+					}, this );
+					this.wait();
+			},
+
+			/**
+			 *  Test merge newlist with previous list.
+			 */
+			test_ticket_3820 : function()
+			{
+				prepareEditor( 'test_ticket_3820_editor', null,
+					{ enterMode : CKEDITOR.ENTER_BR },
+					function( editor )
+					{
+						this.resume( function()
+						{
+							editor.focus();
+
+							var doc = editor.document,
+								range = new CKEDITOR.dom.range( doc );
+							setRange( range, [ 1, 1, 0 ], true );
+							var sel = editor.getSelection();
+							sel.selectRanges( [ range ] );
+
+							// Waiting for 'comand state' effected.
+							this.wait( function(){
+								// Remove list.
+								editor.execCommand( 'bulletedlist' );
+								assert.areSame( getTextAreaValue( 'test_ticket_3820_result' ),
+									editor.getData(),
+									'Merge list result not correct.' );
+							}, 1000 );
+
+						} );
+					}, this );
+					this.wait();
+			},
+
+			/**
+			 *  Test remove list first list item not merging with previous text node.
+			 */
+			test_ticket_3836 : function()
+			{
+				prepareEditor( 'test_ticket_3836_editor', null,
+					{ enterMode : CKEDITOR.ENTER_BR },
+					function( editor )
+					{
+						this.resume( function()
+						{
+							this.wait( function ()
+							{
+								editor.focus();
+
+								var doc = editor.document,
+									range = new CKEDITOR.dom.range( doc );
+								setRange( range, [ 1, 1, 0, 0 ], [ 1, 1, 1, 1 ] );
+								var sel = editor.getSelection();
+								sel.selectRanges( [ range ] );
+
+								// Waiting for 'comand state' effected.
+								this.wait( function(){
+									// Remove list.
+									editor.execCommand( 'bulletedlist' );
+									assert.areSame( getTextAreaValue( 'test_ticket_3836_result' ),
+										editor.getData(),
+										'Remove list result not correct.' );
+								}, 1000 );
+							}, 1000 );
 
 						} );
@@ -136,149 +207,13 @@
 	</script>
 </head>
-<body>
+<body>￘
 <textarea id="test_ticket_3151_editor"><ol><li>text</li></ol></textarea>
-<textarea id="test_ticket_3151_resultContent">text</textarea>
+<textarea id="test_ticket_3151_result">text</textarea>
+<textarea id="test_ticket_3820_editor"><ul><li>bullet line 1</li><li>bullet line 2</li></ul><p>Second line</p></textarea>
+<textarea id="test_ticket_3820_result"><ul><li>bullet line 1</li><li>bullet line 2</li><li>Second line</li></ul></textarea>
+<textarea id="test_ticket_3773_editor"><ol><li>line1</li><li>line2</li></ol></textarea>
+<textarea id="test_ticket_3773_result">line1<br />line2</textarea>
+<textarea id="test_ticket_3836_editor">line1<ul><li>item1</li><li>item2</li></ul>line2</textarea>
+<textarea id="test_ticket_3836_result">line1<br />item1<br />item2<br />line2</textarea>
 </body>
 </html>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-	<title>Plugin: toolbar</title>
-	<link rel="stylesheet" type="text/css" href="../../test.css" />
-	<script type="text/javascript" src="../../../../ckeditor_source.js"></script>
-	<script type="text/javascript" src="../../test.js"></script>
-	<script type="text/javascript">
-	//<![CDATA[
-/**
- * Load the editor and wait for fully interactable.
- * @param {Object} elementId
- * @parma {Object} mode
- * @param {Object} config
- * @param {Object} callback Continuation with {@param editor}.
- * @param {Object} context
- */
-function prepareEditor( elementId, mode, config, callback, context )
-{
-	CKEDITOR.on( 'instanceReady',
-		function( evt )
-		{
-			var isMe = mode == CKEDITOR.ELEMENT_MODE_REPLACE ?
-				evt.editor.name == elementId
-				: evt.editor.element.$ ==
-					document.getElementById( elementId );
-			if ( isMe )
-			{
-				callback.call( context, evt.editor );
-			}
-		}, this );
-
-	mode = mode || CKEDITOR.ELEMENT_MODE_REPLACE;
-	switch( mode )
-	{
-		case CKEDITOR.ELEMENT_MODE_REPLACE :
-			CKEDITOR.replace( elementId, config );
-			break;
-		case CKEDITOR.ELEMENT_MODE_APPENDTO :
-			CKEDITOR.appendTo( elementId, config );
-			break;
-	}
-}
-
-/**
- * IE always returning CRLF for line-feed, so remove it when retrieving
- * pre-formated text from text area.
- */
-function getTextAreaValue( id )
-{
-	return CKEDITOR.document.getById( id ).getValue().replace( /\r/gi, '' );
-}
-
-CKEDITOR.test.addTestCase( ( function()
-	{
-
-		// Local references.
-		var assert = CKEDITOR.test.assert,
-			doc = CKEDITOR.document,
-			action = YAHOO.util.UserAction,
-			selector = YAHOO.util.Selector;
-
-		/**
-		 * Set the range with the start/end position specified by the locator, which in form of bookmark2.
-		 * @param {Object} range
-		 * @param {Array} startPosition range start path including offset
-		 * @param {Array|Boolean} endPositoin range end path including offset or is collapsed
-		 */
-		function setRange( range, startPosition, endPositoin )
-		{
-			var bm = {
-				end : null,
-				start : null,
-				is2: true,
-				startOffset : 0,
-				endoffset : 0
-			};
-			bm.start = startPosition.slice( 0, startPosition.length - 1 );
-			bm.startOffset = startPosition[ startPosition.length -1];
-			if( endPositoin === true )
-			{
-				bm.end = bm.start.slice();
-				bm.endOffset = bm.startOffset;
-			}
-			else
-			{
-				bm.end = endPositoin.slice( 0, endPositoin.length - 1 );
-				bm.endOffset = endPositoin[ endPositoin.length -1 ];
-			}
-			range.moveToBookmark( bm );
-		}
-
-		return	{
-
-			/**
-			 *  Test remove numbered list with 'enterMode = BR'.
-			 */
-			test_ticket_3151 : function()
-			{
-				prepareEditor( 'test_ticket_3151_editor', null,
-					{ enterMode : CKEDITOR.ENTER_BR },
-					function( editor )
-					{
-						this.resume( function()
-						{
-							editor.focus();
-
-							// Force result data unformatted.
-							editor.dataProcessor.writer._.rules = {};
-
-							var doc = editor.document,
-								range = new CKEDITOR.dom.range( doc );
-
-							setRange( range, [ 1, 0, 0, 0, 0 ], true );
-							var sel = editor.getSelection();
-							sel.selectRanges( [ range ] );
-
-							// Waiting for 'comand state' effected.
-							this.wait( function(){
-								// Remove list.
-								editor.execCommand( 'numberedlist' );
-								assert.areSame( getTextAreaValue( 'test_ticket_3151_resultContent' ),
-									editor.getData(),
-									'Remove list result not correct.' );
-							}, 1000);
-
-						} );
-					}, this );
-					this.wait();
-			},
-
-			name :document.title
-		};
-	} )() );
-	//]]>
-	</script>
-</head>
-<body>
-<textarea id="test_ticket_3151_editor"><ol><li>text</li></ol></textarea>
-<textarea id="test_ticket_3151_resultContent">text</textarea>
-</body>
-</html>
Index: /CKEditor/branches/versions/3.0.x/_source/tests/plugins/selection/selection.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/tests/plugins/selection/selection.html	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/tests/plugins/selection/selection.html	(revision 4056)
@@ -5,5 +5,7 @@
 	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 	<link rel="stylesheet" type="text/css" href="../../test.css" />
-	<script type="text/javascript" src="../../../../ckeditor_source.js"></script>
+	<script type="text/javascript" src="../../../../ckeditor_source.js"></script> <!-- %REMOVE_LINE%
+	<script type="text/javascript" src="../../../ckeditor.js"></script>
+	%REMOVE_LINE% -->
 	<script type="text/javascript" src="../../test.js"></script>
 	<script type="text/javascript">
Index: /CKEditor/branches/versions/3.0.x/_source/tests/plugins/styles/styles.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/tests/plugins/styles/styles.html	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/tests/plugins/styles/styles.html	(revision 4056)
@@ -4,9 +4,11 @@
 	<title>Plugin: styles</title>
 	<link rel="stylesheet" type="text/css" href="../../test.css" />
-	<script type="text/javascript" src="../../../../ckeditor_source.js"></script>
+	<script type="text/javascript" src="../../../../ckeditor_source.js"></script> <!-- %REMOVE_LINE%
+	<script type="text/javascript" src="../../../ckeditor.js"></script>
+	%REMOVE_LINE% -->
 	<script type="text/javascript" src="../../test.js"></script>
 	<script type="text/javascript">
 
-CKEDITOR.plugins.load( 'styles' );
+CKEDITOR.plugins.load( [ 'styles', 'domiterator', 'htmldataprocessor' ] );
 
 	</script>
@@ -21,4 +23,11 @@
 	var assert			= CKEDITOR.test.assert;
 	var getInnerHtml	= CKEDITOR.test.getInnerHtml;
+
+	function getInnerHtmlParsed( element )
+	{
+		var dataProcessor = new CKEDITOR.htmlDataProcessor();
+		dataProcessor.writer = new CKEDITOR.htmlParser.basicWriter();
+		return dataProcessor.toDataFormat( getInnerHtml( element, false ) );
+	}
 
 	var doc = new CKEDITOR.dom.document( document );
@@ -318,5 +327,5 @@
 			style.applyToRange( range );
 
-			assert.areSame( '<b lang="pt" style="font-size:11pt;color:red;">this<b style="font-weight:700;"> is some sample text</b></b>', getInnerHtml( '_P1' ), 'First range' );
+			assert.areSame( '<b lang="pt" style="color:red;font-size:11pt;">this<b style="font-weight:700;"> is some sample text</b></b>', getInnerHtml( '_P1' ), 'First range' );
 		},
 
@@ -538,8 +547,47 @@
 			assert.areSame( 'text <span><i></i></span><strong><bold><span><b><i id="_i1">styles</i></b></span></bold></strong>', getInnerHtml( element ) );
 		},
+
+		// Test convert multiple paragraphs to one <pre>.
+		test_ticket_3188 : function()
+		{
+			var element = doc.getById( '_P1' );
+			element.setHtml( '<p id="_P2">\nparagraph1<br /><br />para\t\ngraph2</p><p id="_P3">\nparagraph3\n</p>' );
+
+			// <p id="_P2">[paragraph1</p><p id="_P3">paragraph2]</p>
+			var range = new CKEDITOR.dom.range( doc );
+			range.setStartAt( doc.getById( '_P2' ), CKEDITOR.POSITION_AFTER_START );
+			range.setEndAt( doc.getById( '_P3' ), CKEDITOR.POSITION_BEFORE_END );
+
+			var style = new CKEDITOR.style( { element : 'pre' } );
+			style.applyToRange( range );
+
+			var result = getInnerHtmlParsed( element );
+			assert.areSame( '<pre>paragraph1\n\npara graph2\n\nparagraph3</pre>', result );
+		},
+
+		// Test convert one <pre> to multiple paragraphs.
+		test_ticket_3188_2 : function()
+		{
+			var element = doc.getById( '_P1' );
+			element.setHtml( '<pre>\n\tparagraph1\t\tparagraph1\nparagraph2\n\t\n\tpara   graph3\n</pre>' );
+
+			//<pre>[\n\tparagraph1\t\tparagraph1\nparagraph2\n\t\n\tpara   graph3\n]</pre>
+			var range = new CKEDITOR.dom.range( doc );
+			range.selectNodeContents( doc.getById( '_P1' ).getFirst() );
+			var style = new CKEDITOR.style( { element : 'p' } );
+			style.applyToRange( range );
+
+			var result = getInnerHtmlParsed( element );
+
+			if ( CKEDITOR.env.webkit || CKEDITOR.env.opera )
+				result = result.replace( /\xa0/g, '&nbsp;' );
+
+			assert.areSame( '<p>&nbsp;paragraph1&nbsp; paragraph1<br />paragraph2</p><p>&nbsp;para&nbsp;&nbsp; graph3</p>',
+					 result );
+		},
 		name : document.title
 	};
 })() );
-//window.onload = testCase.test_ticket_3309_3;
+//window.onload = testCase.test_ticket_3188;
 	//]]>
 	</script>
Index: /CKEditor/branches/versions/3.0.x/_source/tests/test.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/tests/test.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/tests/test.js	(revision 4056)
@@ -91,5 +91,6 @@
 		}
 
-		runner.run();
+		if ( !CKEDITOR.test.deferRunner )
+			runner.run();
 	};
 })();
Index: /CKEditor/branches/versions/3.0.x/_source/tests/testall.html
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/tests/testall.html	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/tests/testall.html	(revision 4056)
@@ -10,6 +10,6 @@
 [
 	'core/ajax',
+	'core/bootstrap',
 	'core/ckeditor',
-//	'core/ckeditor2',
 	'core/editor',
 	'core/env',
@@ -25,7 +25,11 @@
 	'core/dom/range',
 	'core/dom/text',
+	'core/dom/walker',
 	'core/dom/window',
 	'core/htmlparser/fragment',
+	'core/htmlparser/htmlparser',
+	'plugins/domiterator/domiterator',
 	'plugins/htmldataprocessor/htmldataprocessor',
+	'plugins/link/link',
 	'plugins/list/list',
 	'plugins/styles/styles',
@@ -34,4 +38,6 @@
 
 var currentTest;
+var currentTime;
+var totalTime;
 var totalFailed = 0;
 var totalPassed = 0;
@@ -49,9 +55,16 @@
 	var div = document.getElementById('testLogger').appendChild( document.createElement( 'div' ) );
 	div.className = 'testEntry';
-	div.innerHTML = 'Testing "' + data.testCase.name + '"...';
+	div.innerHTML = 'Testing "<a href="' + currentTest + '.html" target="_blank">' + data.testCase.name + '</a>"...';
+
+	currentTime = new Date();
+
+	if ( !totalTime )
+		totalTime = currentTime;
 }
 
 function onTestComplete( data )
 {
+	var finishTime = new Date();
+
 	var failed = data.results.failed;
 	var passed = data.results.passed;
@@ -64,5 +77,5 @@
 		html = '<span class="testPass">PASS</span>';
 
-	html += ' <a href="' + currentTest + '.html" target="_blank">Test case "' + data.testCase.name + '"</a> (' + failed + ' failed / ' + passed + ' passed)';
+	html += ' Test "<a href="' + currentTest + '.html" target="_blank">' + data.testCase.name + '</a>" (' + failed + ' failed / ' + passed + ' passed) - ' + ( finishTime - currentTime ) + 'ms';
 
 	var div = document.getElementById('testLogger').lastChild;
@@ -74,4 +87,5 @@
 	document.getElementById('testFailed').innerHTML = totalFailed;
 	document.getElementById('testPassed').innerHTML = totalPassed;
+	document.getElementById('totalTime').innerHTML = finishTime - totalTime;
 
 	document.title = totalFailed + ' failed / ' + totalPassed + ' passed - CKEditor Core Tests Runner';
@@ -93,5 +107,5 @@
 </head>
 <body>
-	<h1>CKEditor Core Tests Runner (<span id="testFailed">0</span> failed / <span id="testPassed">0</span> passed)</h1>
+	<h1>CKEditor Core Tests Runner (<span id="testFailed">0</span> failed / <span id="testPassed">0</span> passed) - <span id="totalTime">0</span>ms</h1>
 	<iframe id="testFrame" src="javascript:;" style="position: absolute; width: 50px; height: 50px; left: -1000px">
 	</iframe>
Index: /CKEditor/branches/versions/3.0.x/_source/themes/default/theme.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/_source/themes/default/theme.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/_source/themes/default/theme.js	(revision 4056)
@@ -25,5 +25,4 @@
 
 			var height	= contentsHtml && editor.config.height;
-			var width	= editor.config.width;
 
 			var tabIndex = editor.config.tabIndex || editor.element.getAttribute( 'tabindex' ) || 0;
@@ -35,6 +34,14 @@
 				height += 'px';
 
-			if ( !isNaN( width ) )
-				width += 'px';
+			var style = '';
+			var width	= editor.config.width;
+
+			if ( width )
+			{
+				if ( !isNaN( width ) )
+					width += 'px';
+
+				style += "width: " + width + ";";
+			}
 
 			var container = CKEDITOR.dom.element.createFromHtml( [
@@ -46,8 +53,10 @@
 					' title="', ( CKEDITOR.env.gecko ? ' ' : '' ), '"' +
 					' lang="', editor.langCode, '"' +
-					' tabindex="' + tabIndex + '">' +
+					' tabindex="' + tabIndex + '"' +
+					( style ? ' style="' + style + '"' : '' ) +
+					'>' +
 					'<span class="' , CKEDITOR.env.cssClass, '">' +
 						'<span class="cke_wrapper cke_', editor.lang.dir, '">' +
-							'<table class="cke_editor" border="0" cellspacing="0" cellpadding="0" style="width:', width, '"><tbody>' +
+							'<table class="cke_editor" border="0" cellspacing="0" cellpadding="0"><tbody>' +
 								'<tr', topHtml		? '' : ' style="display:none"', '><td id="cke_top_'		, name, '" class="cke_top">'	, topHtml		, '</td></tr>' +
 								'<tr', contentsHtml	? '' : ' style="display:none"', '><td id="cke_contents_', name, '" class="cke_contents" style="height:', height, '">', contentsHtml, '</td></tr>' +
@@ -146,9 +155,34 @@
 			var container = editor.container;
 
+			/*
+			 * IE BUG: Removing the editor DOM elements while the selection is inside
+			 * the editing area would break IE7/8's selection system. So we need to put
+			 * the selection back to the parent document without scrolling the window.
+			 * (#3812)
+			 */
+			if ( CKEDITOR.env.ie )
+			{
+				container.setStyle( 'display', 'none' );
+
+				var $range = document.body.createTextRange();
+				$range.moveToElementText( container.$ );
+				try
+				{
+					// Putting the selection to a display:none element - this will certainly
+					// fail. But! We've just put the selection document back to the parent
+					// document without scrolling the window!
+					$range.select();
+				}
+				catch ( e ) {}
+			}
+
 			if ( container )
 				container.remove();
 
 			if ( editor.elementMode == CKEDITOR.ELEMENT_MODE_REPLACE )
+			{
 				editor.element.show();
+				delete editor.element;
+			}
 		}
 	};
Index: /CKEditor/branches/versions/3.0.x/ckeditor.pack
===================================================================
--- /CKEditor/branches/versions/3.0.x/ckeditor.pack	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/ckeditor.pack	(revision 4056)
@@ -124,5 +124,4 @@
 					'_source/core/dom/text.js',
 					'_source/core/dom/documentfragment.js',
-					'_source/core/dom/domwalker.js',
 					'_source/core/dom/walker.js',
 					'_source/core/dom/range.js',
Index: /CKEditor/branches/versions/3.0.x/config.js
===================================================================
--- /CKEditor/branches/versions/3.0.x/config.js	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/config.js	(revision 4056)
@@ -8,4 +8,4 @@
 	// Define changes to default configuration here. For example:
 	// config.language = 'fr';
-	// config.skin = 'office2003';
+	// config.uiColor = '#AADC6E';
 };
Index: /CKEditor/branches/versions/3.0.x/contents.css
===================================================================
--- /CKEditor/branches/versions/3.0.x/contents.css	(revision 4055)
+++ /CKEditor/branches/versions/3.0.x/contents.css	(revision 4056)
@@ -16,4 +16,12 @@
 	background-color: #fff;
 }
+
+html
+{
+	/* #3658: [IE6] Editor document has horizontal scrollbar on long lines
+	To prevent this misbehavior, we show the scrollbar always */
+	_overflow-y: scroll
+}
+
 img:-moz-broken
 {
