Index: CKEditor/branches/versions/3.5.x/CHANGES.html
===================================================================
--- CKEditor/branches/versions/3.5.x/CHANGES.html	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/CHANGES.html	(revision 6898)
@@ -35,4 +35,30 @@
 		CKEditor Changelog
 	</h1>
+	<h3>
+			CKEditor 3.5.4 (SVN)</h3>
+	<p>
+			New features:</p>
+	<ul>
+		<li></li>
+	</ul>
+	<p>
+			Fixed issues:</p>
+	<ul>
+		<li>Added protection against XSS attacks in PHP samples when displaying element names.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/7347">#7347</a> : The <em>Enter</em> key will no longer be caught by the dialog window covering the editor.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6718">#6718</a> : Paste from Word command overrides the Force Paste as Plain Text configuration.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6629">#6629</a> : Padding body is no longer needed when the last block is pre-formatted.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/4844">#4844</a> : [IE] Dialog windows fail to load if there are too many editor instances on the page.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/5788">#5788</a> : HTML parser trims empty spaces following <code>&lt;br&gt;</code> elements.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/7513">#7513</a> : Invalid markup could cause the editor to hang.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6109">#6109</a> : Paste and Paste as Plain Text dialog windows now use the standard <code><a href="http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.dialog.html#commitContent">commitContent</a></code> and <code><a href="http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.dialog.html#setupContent">setupContent</a></code> methods.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/7588">#7588</a> : The editor code now has a protection system to avoid issues when including <code>ckeditor.js</code> more than once in the page.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/7322">#7322</a> : Text font plugin now recognizes font family names that contain quotes.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/7540">#7540</a> : Paste from Word introduces wrong spaces.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/7697">#7697</a> : Successive calls of the <code>replace()</code> method did not work after SCAYT context menu initialization.</li>
+		<li>Updated the following language files:<ul>
+			<li><a href="http://dev.ckeditor.com/ticket/7647">#7647</a> : Slovak;</li>
+		</ul></li>
+	</ul>
 	<h3>
 			CKEditor 3.5.3</h3>
Index: CKEditor/branches/versions/3.5.x/_dev/releaser/release.bat
===================================================================
--- CKEditor/branches/versions/3.5.x/_dev/releaser/release.bat	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_dev/releaser/release.bat	(revision 6898)
@@ -11,3 +11,3 @@
 :: rmdir /S /Q release
 
-java -jar ckreleaser/ckreleaser.jar ckreleaser.release ../.. release "3.5.3" ckeditor_3.5.3 --run-before-release=langtool.bat
+java -jar ckreleaser/ckreleaser.jar ckreleaser.release ../.. release "3.5.4 (SVN)" ckeditor_3.5.4_svn --run-before-release=langtool.bat
Index: CKEditor/branches/versions/3.5.x/_dev/releaser/release.sh
===================================================================
--- CKEditor/branches/versions/3.5.x/_dev/releaser/release.sh	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_dev/releaser/release.sh	(revision 6898)
@@ -13,4 +13,4 @@
 
 pushd $DIR
-java -jar ckreleaser/ckreleaser.jar ckreleaser.release ../.. release "3.5.3" ckeditor_3.5.3 --run-before-release=$LANGTOOL
+java -jar ckreleaser/ckreleaser.jar ckreleaser.release ../.. release "3.5.4 (SVN)" ckeditor_3.5.4_svn --run-before-release=$LANGTOOL
 popd
Index: CKEditor/branches/versions/3.5.x/_samples/asp/index.html
===================================================================
--- CKEditor/branches/versions/3.5.x/_samples/asp/index.html	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_samples/asp/index.html	(revision 6898)
@@ -81,5 +81,5 @@
 	<ul class="samples">
 		<li><a class="samples" href="replace.asp">Replace existing textareas by code</a></li>
-		<li><a class="samples" href="replaceAll.asp">Replace all textareas by code</a></li>
+		<li><a class="samples" href="replaceall.asp">Replace all textareas by code</a></li>
 		<li><a class="samples" href="standalone.asp">Create instances in asp</a></li>
 	</ul>
Index: CKEditor/branches/versions/3.5.x/_samples/assets/_posteddata.php
===================================================================
--- CKEditor/branches/versions/3.5.x/_samples/assets/_posteddata.php	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_samples/assets/_posteddata.php	(revision 6898)
@@ -40,5 +40,5 @@
 ?>
 		<tr>
-			<th style="vertical-align: top"><?php echo $sForm?></th>
+			<th style="vertical-align: top"><?php echo htmlspecialchars($sForm); ?></th>
 			<td><pre class="samples"><?php echo $postedValue?></pre></td>
 		</tr>
Index: CKEditor/branches/versions/3.5.x/_samples/php/index.html
===================================================================
--- CKEditor/branches/versions/3.5.x/_samples/php/index.html	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_samples/php/index.html	(revision 6898)
@@ -20,5 +20,5 @@
 		<li><a class="samples" href="replace.php">Replace existing textarea elements by code</a><br />
 		Replacement of selected textarea elements with CKEditor instances by using a JavaScript call.</li>
-		<li><a class="samples" href="replaceAll.php">Replace all textarea elements by code</a><br />
+		<li><a class="samples" href="replaceall.php">Replace all textarea elements by code</a><br />
 		Replacement of all textarea elements with CKEditor instances by using a JavaScript call.</li>
 		<li><a class="samples" href="standalone.php">Create CKEditor instances in PHP</a><br />
Index: CKEditor/branches/versions/3.5.x/_samples/placeholder.html
===================================================================
--- CKEditor/branches/versions/3.5.x/_samples/placeholder.html	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_samples/placeholder.html	(revision 6898)
@@ -23,10 +23,10 @@
 	<p>
 		This sample shows how to configure CKEditor instances to use the
-		<strong>placeholder</strong> plugin that lets you insert read-only elements
+		<strong>Placeholder</strong> plugin that lets you insert read-only elements
 		into your content. To enter and modify read-only text, use the
 		<strong>Create Placeholder</strong> button and its matching dialog window.
 	</p>
 	<p>
-		To add a CKEditor instance that uses the <strong>placeholder</strong> plugin and a related
+		To add a CKEditor instance that uses the <code>placeholder</code> plugin and a related
 		<strong>Create Placeholder</strong> toolbar button, insert the following JavaScript
 		call to your code:
@@ -55,5 +55,5 @@
 		<p>
 			<label for="editor1">
-				CKEditor using the <strong>placeholder</strong> plugin with its default configuration:</label>
+				CKEditor using the <code>placeholder</code> plugin with its default configuration:</label>
 			<textarea cols="80" id="editor1" name="editor1" rows="10">&lt;p&gt;This is a [[sample placeholder]]. You are using &lt;a href="http://ckeditor.com/"&gt;CKEditor&lt;/a&gt;. &lt;/p&gt;</textarea>
 			<script type="text/javascript">
Index: CKEditor/branches/versions/3.5.x/_source/core/ckeditor_base.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/ckeditor_base.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/core/ckeditor_base.js	(revision 6898)
@@ -17,4 +17,13 @@
 // #### Raw code
 // ATTENTION: read the above "Compressed Code" notes when changing this code.
+
+/* @Packager.RemoveLine
+// Avoid having the editor code initialized twice. (#7588)
+// Use CKEDITOR.dom to check whether the full ckeditor.js code has been loaded
+// or just ckeditor_basic.js.
+// Remove these lines when compressing manually.
+if ( window.CKEDITOR && window.CKEDITOR.dom )
+	return;
+@Packager.RemoveLine */
 
 if ( !window.CKEDITOR )
Index: CKEditor/branches/versions/3.5.x/_source/core/dom/walker.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/dom/walker.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/core/dom/walker.js	(revision 6898)
@@ -339,5 +339,7 @@
 	CKEDITOR.dom.element.prototype.isBlockBoundary = function( customNodeNames )
 	{
-		var nodeNameMatches = CKEDITOR.tools.extend( {}, CKEDITOR.dtd.$block, customNodeNames || {} );
+		var nodeNameMatches = customNodeNames ?
+			CKEDITOR.tools.extend( {}, CKEDITOR.dtd.$block, customNodeNames || {} ) :
+			CKEDITOR.dtd.$block;
 
 		// Don't consider floated formatting as block boundary, fall back to dtd check in that case. (#6297)
Index: CKEditor/branches/versions/3.5.x/_source/core/dtd.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/dtd.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/core/dtd.js	(revision 6898)
@@ -182,5 +182,4 @@
         table : {thead:1,col:1,tbody:1,tr:1,colgroup:1,caption:1,tfoot:1},
         code : L,
-        script : N,
         tfoot : M,
         cite : L,
Index: CKEditor/branches/versions/3.5.x/_source/core/editor.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/editor.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/core/editor.js	(revision 6898)
@@ -562,5 +562,5 @@
 		 *		executed, otherwise "false".
 		 * @example
-		 * editorInstance.execCommand( 'Bold' );
+		 * editorInstance.execCommand( 'bold' );
 		 */
 		execCommand : function( commandName, data )
Index: CKEditor/branches/versions/3.5.x/_source/core/htmlparser.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/htmlparser.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/core/htmlparser.js	(revision 6898)
@@ -19,5 +19,5 @@
 	this._ =
 	{
-		htmlPartsRegex : new RegExp( '<(?:(?:\\/([^>]+)>)|(?:!--([\\S|\\s]*?)-->)|(?:([^\\s>]+)\\s*((?:(?:[^"\'>]+)|(?:"[^"]*")|(?:\'[^\']*\'))*)\\/?>))', 'g' )
+		htmlPartsRegex : new RegExp( '<(?:(?:\\/([^>]+)>)|(?:!--([\\S|\\s]*?)-->)|(?:([^\\s>]+)\\s*((?:(?:"[^"]*")|(?:\'[^\']*\')|[^"\'>])*)\\/?>))', 'g' )
 	};
 };
Index: CKEditor/branches/versions/3.5.x/_source/core/htmlparser/fragment.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/htmlparser/fragment.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/core/htmlparser/fragment.js	(revision 6898)
@@ -361,6 +361,6 @@
 		parser.onText = function( text )
 		{
-			// Trim empty spaces at beginning of element contents except <pre>.
-			if ( !currentNode._.hasInlineStarted && !inPre )
+			// Trim empty spaces at beginning of text contents except <pre>.
+			if ( ( !currentNode._.hasInlineStarted || pendingBRs.length ) && !inPre )
 			{
 				text = CKEDITOR.tools.ltrim( text );
Index: CKEditor/branches/versions/3.5.x/_source/core/plugindefinition.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/plugindefinition.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/core/plugindefinition.js	(revision 6898)
@@ -28,4 +28,21 @@
  * {
  *     requires : [ 'button', 'selection' ]
+ * });
+ */
+
+/**
+ * A list of language files available for this plugin. These files are stored inside
+ * the "lang" directory, which is inside the plugin directory, follow the name
+ * pattern of "langCode.js", and contain a language definition created with {@link CKEDITOR.pluginDefinition#setLang}.
+ * While the plugin is being loaded, the editor checks this list to see if
+ * a language file of the current editor language ({@link CKEDITOR.editor#langCode})
+ * is available, and if so, loads it. Otherwise, the file represented by the first list item
+ * in the list is loaded.
+ * @name CKEDITOR.pluginDefinition.prototype.lang
+ * @type Array
+ * @example
+ * CKEDITOR.plugins.add( 'sample',
+ * {
+ *     lang : [ 'en', 'fr' ]
  * });
  */
Index: CKEditor/branches/versions/3.5.x/_source/core/plugins.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/core/plugins.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/core/plugins.js	(revision 6898)
@@ -77,4 +77,18 @@
 	});
 
+/**
+ * Loads a specific language file, or auto detect it. A callback is
+ * then called when the file gets loaded.
+ * @param {String} pluginName The name of the plugin to which the provided translation
+ * 		should be attached.
+ * @param {String} languageCode The code of the language translation provided.
+ * @param {Object} languageEntries An object that contains pairs of label and
+ *		the respective translation.
+ * @example
+ * CKEDITOR.plugins.setLang( 'myPlugin', 'en', {
+ * 	title : 'My plugin',
+ * 	selectOption : 'Please select an option'
+ * } );
+ */
 CKEDITOR.plugins.setLang = function( pluginName, languageCode, languageEntries )
 {
Index: CKEditor/branches/versions/3.5.x/_source/lang/_translationstatus.txt
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/_translationstatus.txt	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/lang/_translationstatus.txt	(revision 6898)
@@ -48,5 +48,5 @@
 ro.js      Found: 289 Missing: 233
 ru.js      Found: 451 Missing: 71
-sk.js      Found: 290 Missing: 232
+sk.js      Found: 334 Missing: 188
 sl.js      Found: 394 Missing: 128
 sr-latn.js Found: 264 Missing: 258
Index: CKEditor/branches/versions/3.5.x/_source/lang/sk.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/lang/sk.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/lang/sk.js	(revision 6898)
@@ -32,5 +32,5 @@
 	 * of reading non-English words. So be careful while translating it.
 	 */
-	editorTitle : 'Rich text editor, %1, press ALT 0 for help.', // MISSING
+	editorTitle : 'Rich text editor, %1, stlačte ALT 0 pre nápovedu.',
 
 	// ARIA descriptions.
@@ -57,5 +57,5 @@
 	horizontalrule	: 'Vložiť vodorovnú čiaru',
 	pagebreak		: 'Vložiť oddeľovač stránky',
-	pagebreakAlt		: 'Page Break', // MISSING
+	pagebreakAlt		: 'Zalomenie strany',
 	unlink			: 'Odstrániť odkaz',
 	undo			: 'Späť',
@@ -94,11 +94,11 @@
 		ok				: 'OK',
 		cancel			: 'Zrušiť',
-		close			: 'Close', // MISSING
-		preview			: 'Preview', // MISSING
+		close			: 'Zatvorit',
+		preview			: 'Náhľad',
 		generalTab		: 'Hlavné',
 		advancedTab		: 'Rozšírené',
-		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 : 'Hodnota nieje číslo.',
+		confirmNewPage	: 'Prajete si načítat novú stránku? Všetky neuložené zmeny budú stratené. ',
+		confirmCancel	: 'Niektore možnosti boli zmenené. Naozaj chcete zavrieť okno?',
 		options			: 'Options', // MISSING
 		target			: 'Target', // MISSING
@@ -120,6 +120,6 @@
 		alignMiddle		: 'Na stred',
 		alignBottom		: 'Dole',
-		invalidHeight	: 'Height must be a number.', // MISSING
-		invalidWidth	: 'Width must be a number.', // MISSING
+		invalidHeight	: 'Výška musí byť číslo.',
+		invalidWidth	: 'Šírka musí byť číslo.',
 
 		// Put the voice-only part of the label in the span.
@@ -137,5 +137,5 @@
 		toolbar		: 'Vložiť špeciálne znaky',
 		title		: 'Výber špeciálneho znaku',
-		options : 'Special Character Options' // MISSING
+		options : 'Možnosti špecíalneho znaku'
 	},
 
@@ -160,5 +160,5 @@
 		targetPopupName	: 'Názov vyskakovacieho okna',
 		popupFeatures	: 'Vlastnosti vyskakovacieho okna',
-		popupResizable	: 'Resizable', // MISSING
+		popupResizable	: 'Meniteľná veľkosť',
 		popupStatusBar	: 'Stavový riadok',
 		popupLocationBar: 'Panel umiestnenia',
@@ -208,9 +208,9 @@
 	list:
 	{
-		numberedTitle		: 'Numbered List Properties', // MISSING
+		numberedTitle		: 'Vlastnosti číselného zoznamu',
 		bulletedTitle		: 'Bulleted List Properties', // MISSING
-		type				: 'Type', // MISSING
-		start				: 'Start', // MISSING
-		validateStartNumber				:'List start number must be a whole number.', // MISSING
+		type				: 'Druh',
+		start				: 'Začiatok',
+		validateStartNumber				:'Začiatočné číslo číselného zoznamu musí byť celé číslo.',
 		circle				: 'Circle', // MISSING
 		disc				: 'Disc', // MISSING
@@ -242,5 +242,5 @@
 		matchCyclic			: 'Match cyclic', // MISSING
 		replaceAll			: 'Nahradiť všetko',
-		replaceSuccessMsg	: '%1 occurrence(s) replaced.' // MISSING
+		replaceSuccessMsg	: '%1 výskyt(ov) nahradených.'
 	},
 
@@ -262,16 +262,16 @@
 		caption		: 'Popis',
 		summary		: 'Prehľad',
-		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		: 'Hlavička',
+		headersNone		: 'Žiadne',
+		headersColumn	: 'Prvý stĺpec',
+		headersRow		: 'Prvý riadok',
+		headersBoth		: 'Obe',
+		invalidRows		: 'Počet riadkov musí byť číslo väčšie ako 0.',
+		invalidCols		: 'Počet stĺpcov musí byť číslo väčšie ako 0.',
+		invalidBorder	: 'Širka rámu musí byť celé číslo.',
+		invalidWidth	: 'Širka tabuľky musí byť číslo.',
+		invalidHeight	: 'Výška tabuľky musí byť číslo.',
+		invalidCellSpacing	: 'Medzera mädzi bunkami (spacing) musí byť číslo.',
+		invalidCellPadding	: 'Odsadenie v bunkách (padding) musí byť číslo.',
 
 		cell :
@@ -351,5 +351,5 @@
 		action		: 'Akcie',
 		method		: 'Metóda',
-		encoding	: 'Encoding' // MISSING
+		encoding	: 'Kódovanie'
 	},
 
@@ -476,6 +476,6 @@
 		toolbar			: 'Kontrola pravopisu',
 		title			: 'Spell Check', // MISSING
-		notAvailable	: 'Sorry, but service is unavailable now.', // MISSING
-		errorLoading	: 'Error loading application service host: %s.', // MISSING
+		notAvailable	: 'Služba práve nieje dostupná.',
+		errorLoading	: 'Chyba pri načítaní slovníka z adresy: %s.',
 		notInDic		: 'Nie je v slovníku',
 		changeTo		: 'Zmeniť na',
@@ -498,5 +498,5 @@
 		toolbar	: 'Smajlíky',
 		title	: 'Vkladanie smajlíkov',
-		options : 'Smiley Options' // MISSING
+		options : 'Možnosti smajlíkov'
 	},
 
@@ -529,13 +529,13 @@
 		pasteMsg	: 'Prosím vložte nasledovný rámček použitím klávesnice (<STRONG>Ctrl/Cmd+V</STRONG>) a stlačte <STRONG>OK</STRONG>.',
 		securityMsg	: 'Bezpečnostné nastavenia Vášho prehliadača nedovoľujú editoru pristupovať priamo k datám v schránke. Musíte ich vložiť znovu do tohto okna.',
-		pasteArea	: 'Paste Area' // MISSING
+		pasteArea	: 'Vložiť pole'
 	},
 
 	pastefromword :
 	{
-		confirmCleanup	: 'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?', // MISSING
+		confirmCleanup	: 'Vkladaný text vyzerá byť skopírovaný z Wordu. Chcete ho automaticky vyčistiť pred vkladaním?',
 		toolbar			: 'Vložiť z Wordu',
 		title			: 'Vložiť z Wordu',
-		error			: 'It was not possible to clean up the pasted data due to an internal error' // MISSING
+		error			: 'Nastala chyba pri čistení údajov. Nie je možné vyčistiť vložené údaje.'
 	},
 
@@ -550,5 +550,5 @@
 		button			: 'Šablóny',
 		title			: 'Šablóny obsahu',
-		options : 'Template Options', // MISSING
+		options : 'Vlastnosti šablóny',
 		insertOption	: 'Nahradiť aktuálny obsah',
 		selectPromptMsg	: 'Prosím vyberte šablóny na otvorenie v editore<br>(súšasný obsah bude stratený):',
@@ -603,9 +603,9 @@
 	iframe :
 	{
-		title		: 'IFrame Properties', // MISSING
+		title		: 'IFrame - vlastnosti',
 		toolbar		: 'IFrame', // MISSING
-		noUrl		: 'Please type the iframe URL', // MISSING
-		scrolling	: 'Enable scrollbars', // MISSING
-		border		: 'Show frame border' // MISSING
+		noUrl		: 'Vložte URL pre iframe',
+		scrolling	: 'Povoliť skrolovanie',
+		border		: 'Zobraziť orámovanie'
 	},
 
@@ -620,5 +620,5 @@
 	{
 		label		: 'Veľkosť',
-		voiceLabel	: 'Font Size', // MISSING
+		voiceLabel	: 'Veľkosť písma',
 		panelTitle	: 'Veľkosť'
 	},
@@ -628,5 +628,5 @@
 		textColorTitle	: 'Farba textu',
 		bgColorTitle	: 'Farba pozadia',
-		panelTitle		: 'Colors', // MISSING
+		panelTitle		: 'Farby',
 		auto			: 'Automaticky',
 		more			: 'Viac farieb...'
@@ -720,6 +720,6 @@
 	},
 
-	maximize : 'Maximize', // MISSING
-	minimize : 'Minimize', // MISSING
+	maximize : 'Maximalizovať',
+	minimize : 'Minimalizovať',
 
 	fakeobjects :
Index: CKEditor/branches/versions/3.5.x/_source/plugins/button/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/button/plugin.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/button/plugin.js	(revision 6898)
@@ -276,6 +276,6 @@
 /**
  * Adds a button definition to the UI elements list.
- * @param {String} The button name.
- * @param {Object} The button definition.
+ * @param {String} name The button name.
+ * @param {Object} definition The button definition.
  * @example
  * editorInstance.ui.addButton( 'MyBold',
Index: CKEditor/branches/versions/3.5.x/_source/plugins/clipboard/dialogs/paste.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/clipboard/dialogs/paste.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/clipboard/dialogs/paste.js	(revision 6898)
@@ -67,83 +67,5 @@
 			this.parts.dialog.$.offsetHeight;
 
-			var htmlToLoad =
-				'<html dir="' + editor.config.contentsLangDirection + '"' +
-				' lang="' + ( editor.config.contentsLanguage || editor.langCode ) + '">' +
-					'<head><style>body { margin: 3px; height: 95%; } </style></head><body>' +
-					'<script id="cke_actscrpt" type="text/javascript">' +
-					'window.parent.CKEDITOR.tools.callFunction( ' + CKEDITOR.tools.addFunction( onPasteFrameLoad, this ) + ', this );' +
-					'</script></body>' +
-				'</html>';
-
-			var src =
-				CKEDITOR.env.air ?
-					'javascript:void(0)' :
-				isCustomDomain ?
-					'javascript:void((function(){' +
-						'document.open();' +
-						'document.domain=\'' + document.domain + '\';' +
-						'document.close();' +
-						'})())"'
-				:
-					'';
-
-			var iframe = CKEDITOR.dom.element.createFromHtml(
-						'<iframe' +
-						' class="cke_pasteframe"' +
-						' frameborder="0" ' +
-						' allowTransparency="true"' +
-						' src="' + src + '"' +
-						' role="region"' +
-						' aria-label="' + lang.pasteArea + '"' +
-						' aria-describedby="' + this.getContentElement( 'general', 'pasteMsg' ).domId + '"' +
-						' aria-multiple="true"' +
-						'></iframe>' );
-
-			iframe.on( 'load', function( e )
-				{
-					e.removeListener();
-
-					var doc = iframe.getFrameDocument();
-					doc.write( htmlToLoad );
-
-					if ( CKEDITOR.env.air )
-						onPasteFrameLoad.call( this, doc.getWindow().$ );
-				},
-				this );
-
-			iframe.setCustomData( 'dialog', this );
-
-			var field = this.getContentElement( 'general', 'editing_area' ),
-				container = field.getElement();
-			container.setHtml( '' );
-			container.append( iframe );
-
-			// IE need a redirect on focus to make
-			// the cursor blinking inside iframe. (#5461)
-			if ( CKEDITOR.env.ie )
-			{
-				var focusGrabber = CKEDITOR.dom.element.createFromHtml( '<span tabindex="-1" style="position:absolute;" role="presentation"></span>' );
-				focusGrabber.on( 'focus', function()
-				{
-					iframe.$.contentWindow.focus();
-				});
-				container.append( focusGrabber );
-
-				// Override focus handler on field.
-				field.focus = function()
-				{
-					focusGrabber.focus();
-					this.fire( 'focus' );
-				};
-			}
-
-			field.getInputElement = function(){ return iframe; };
-
-			// Force container to scale in IE.
-			if ( CKEDITOR.env.ie )
-			{
-				container.setStyle( 'display', 'block' );
-				container.setStyle( 'height', ( iframe.$.offsetHeight + 2 ) + 'px' );
-			}
+			this.setupContent();
 		},
 
@@ -162,18 +84,5 @@
 		onOk : function()
 		{
-			var container = this.getContentElement( 'general', 'editing_area' ).getElement(),
-				iframe = container.getElementsByTag( 'iframe' ).getItem( 0 ),
-				editor = this.getParentEditor(),
-				body = iframe.getFrameDocument().getBody(),
-				bogus = body.getBogus(),
-				html;
-			bogus && bogus.remove();
-			// Saving the contents in variable so changes until paste is complete will not take place (#7500)
-			html = body.getHtml();
-
-			setTimeout( function(){
-				editor.fire( 'paste', { 'html' : html } );
-			}, 0 );
-
+			this.commitContent();
 		},
 
@@ -209,4 +118,101 @@
 								win.focus();
 							}, 500 );
+						},
+						setup : function()
+						{
+							var dialog = this.getDialog();
+							var htmlToLoad =
+								'<html dir="' + editor.config.contentsLangDirection + '"' +
+								' lang="' + ( editor.config.contentsLanguage || editor.langCode ) + '">' +
+								'<head><style>body { margin: 3px; height: 95%; } </style></head><body>' +
+								'<script id="cke_actscrpt" type="text/javascript">' +
+								'window.parent.CKEDITOR.tools.callFunction( ' + CKEDITOR.tools.addFunction( onPasteFrameLoad, dialog ) + ', this );' +
+								'</script></body>' +
+								'</html>';
+
+							var src =
+								CKEDITOR.env.air ?
+									'javascript:void(0)' :
+								isCustomDomain ?
+									'javascript:void((function(){' +
+										'document.open();' +
+										'document.domain=\'' + document.domain + '\';' +
+										'document.close();' +
+									'})())"'
+								:
+									'';
+
+							var iframe = CKEDITOR.dom.element.createFromHtml(
+								'<iframe' +
+									' class="cke_pasteframe"' +
+									' frameborder="0" ' +
+									' allowTransparency="true"' +
+									' src="' + src + '"' +
+									' role="region"' +
+									' aria-label="' + lang.pasteArea + '"' +
+									' aria-describedby="' + dialog.getContentElement( 'general', 'pasteMsg' ).domId + '"' +
+									' aria-multiple="true"' +
+									'></iframe>' );
+
+							iframe.on( 'load', function( e )
+							{
+								e.removeListener();
+
+								var doc = iframe.getFrameDocument();
+								doc.write( htmlToLoad );
+
+								if ( CKEDITOR.env.air )
+									onPasteFrameLoad.call( this, doc.getWindow().$ );
+							}, dialog );
+
+							iframe.setCustomData( 'dialog', dialog );
+
+							var container = this.getElement();
+							container.setHtml( '' );
+							container.append( iframe );
+
+							// IE need a redirect on focus to make
+							// the cursor blinking inside iframe. (#5461)
+							if ( CKEDITOR.env.ie )
+							{
+								var focusGrabber = CKEDITOR.dom.element.createFromHtml( '<span tabindex="-1" style="position:absolute;" role="presentation"></span>' );
+								focusGrabber.on( 'focus', function()
+								{
+									iframe.$.contentWindow.focus();
+								});
+								container.append( focusGrabber );
+
+								// Override focus handler on field.
+								this.focus = function()
+								{
+									focusGrabber.focus();
+									this.fire( 'focus' );
+								};
+							}
+
+							this.getInputElement = function(){ return iframe; };
+
+							// Force container to scale in IE.
+							if ( CKEDITOR.env.ie )
+							{
+								container.setStyle( 'display', 'block' );
+								container.setStyle( 'height', ( iframe.$.offsetHeight + 2 ) + 'px' );
+							}
+						},
+						commit : function( data )
+						{
+							var container = this.getElement(),
+								editor = this.getDialog().getParentEditor(),
+								body = this.getInputElement().getFrameDocument().getBody(),
+								bogus = body.getBogus(),
+								html;
+							bogus && bogus.remove();
+
+							// Saving the contents so changes until paste is complete will not take place (#7500)
+							html = body.getHtml();
+
+							setTimeout( function(){
+								editor.fire( 'paste', { 'html' : html } );
+							}, 0 );
 						}
 					}
Index: CKEditor/branches/versions/3.5.x/_source/plugins/clipboard/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/clipboard/plugin.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/clipboard/plugin.js	(revision 6898)
@@ -215,15 +215,5 @@
 		// Turn off design mode temporarily before give focus to the paste bin.
 		if ( mode == 'text' )
-		{
-			if ( CKEDITOR.env.ie )
-			{
-				var ieRange = doc.getBody().$.createTextRange();
-				ieRange.moveToElementText( pastebin.$ );
-				ieRange.execCommand( 'Paste' );
-				evt.data.preventDefault();
-			}
-			else
-				pastebin.$.focus();
-		}
+			pastebin.$.focus();
 		else
 		{
@@ -378,6 +368,4 @@
 				editor.on( 'key', onKey, editor );
 
-				var mode = editor.config.forcePasteAsPlainText ? 'text' : 'html';
-
 				// We'll be catching all pasted content in one line, regardless of whether the
 				// it's introduced by a document command execution (e.g. toolbar buttons) or
@@ -386,19 +374,23 @@
 				{
 					var body = editor.document.getBody();
-					body.on( ( ( mode == 'text' && CKEDITOR.env.ie ) || CKEDITOR.env.webkit ) ? 'paste' : 'beforepaste',
-						function( evt )
+					body.on( CKEDITOR.env.webkit ? 'paste' : 'beforepaste', function( evt )
 						{
 							if ( depressBeforeEvent )
 								return;
 
-							getClipboardData.call( editor, evt, mode, function ( data )
+							// Fire 'beforePaste' event so clipboard flavor get customized
+							// by other plugins.
+							var eventData =  { mode : 'html' };
+							editor.fire( 'beforePaste', eventData );
+
+							getClipboardData.call( editor, evt, eventData.mode, function ( data )
 							{
 								// The very last guard to make sure the
 								// paste has successfully happened.
-								if ( !CKEDITOR.tools.trim( data.toLowerCase().replace( /<span[^>]+data-cke-bookmark[^<]*?<\/span>/g,'' ) ) )
+								if ( !( data = CKEDITOR.tools.trim( data.replace( /<span[^>]+data-cke-bookmark[^<]*?<\/span>/ig,'' ) ) ) )
 									return;
 
 								var dataTransfer = {};
-								dataTransfer[ mode ] = data;
+								dataTransfer[ eventData.mode ] = data;
 								editor.fire( 'paste', dataTransfer );
 							} );
Index: CKEditor/branches/versions/3.5.x/_source/plugins/colorbutton/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/colorbutton/plugin.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/colorbutton/plugin.js	(revision 6898)
@@ -228,4 +228,5 @@
 /**
  * Whether to enable the "More Colors..." button in the color selectors.
+ * @name CKEDITOR.config.colorButton_enableMore
  * @default true
  * @type Boolean
@@ -241,4 +242,5 @@
  * name and the slash character. For example, "FontColor1/FF9900" will be
  * displayed as the color #FF9900 in the selector, but will be outputted as "FontColor1".
+ * @name CKEDITOR.config.colorButton_colors
  * @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'
@@ -258,4 +260,5 @@
 /**
  * Holds the style definition to be used to apply the text foreground color.
+ * @name CKEDITOR.config.colorButton_foreStyle
  * @type Object
  * @example
@@ -276,4 +279,5 @@
 /**
  * Holds the style definition to be used to apply the text background color.
+ * @name CKEDITOR.config.colorButton_backStyle
  * @type Object
  * @example
Index: CKEditor/branches/versions/3.5.x/_source/plugins/colordialog/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/colordialog/plugin.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/colordialog/plugin.js	(revision 6898)
@@ -1,13 +1,15 @@
-﻿( function()
+﻿/*
+Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.colordialog =
 {
-	CKEDITOR.plugins.colordialog =
+	init : function( editor )
 	{
-		init : function( editor )
-		{
-			editor.addCommand( 'colordialog', new CKEDITOR.dialogCommand( 'colordialog' ) );
-			CKEDITOR.dialog.add( 'colordialog', this.path + 'dialogs/colordialog.js' );
-		}
-	};
+		editor.addCommand( 'colordialog', new CKEDITOR.dialogCommand( 'colordialog' ) );
+		CKEDITOR.dialog.add( 'colordialog', this.path + 'dialogs/colordialog.js' );
+	}
+};
 
-	CKEDITOR.plugins.add( 'colordialog', CKEDITOR.plugins.colordialog );
-} )();
+CKEDITOR.plugins.add( 'colordialog', CKEDITOR.plugins.colordialog );
Index: CKEditor/branches/versions/3.5.x/_source/plugins/dialog/dialogDefinition.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/dialog/dialogDefinition.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/dialog/dialogDefinition.js	(revision 6898)
@@ -283,4 +283,22 @@
  * Function to execute whenever the UI element's parent dialog is closed.
  * @name CKEDITOR.dialog.definition.uiElement.prototype.onHide
+ * @field
+ * @type Function
+ * @example
+ */
+
+/**
+ * Function to execute whenever the UI element's parent dialog's {@link CKEDITOR.dialog.definition.setupContent} method is executed.
+ * It usually takes care of the respective UI element as a standalone element.
+ * @name CKEDITOR.dialog.definition.uiElement.prototype.setup
+ * @field
+ * @type Function
+ * @example
+ */
+
+/**
+ * Function to execute whenever the UI element's parent dialog's {@link CKEDITOR.dialog.definition.commitContent} method is executed.
+ * It usually takes care of the respective UI element as a standalone element.
+ * @name CKEDITOR.dialog.definition.uiElement.prototype.commit
  * @field
  * @type Function
Index: CKEditor/branches/versions/3.5.x/_source/plugins/dialog/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/dialog/plugin.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/dialog/plugin.js	(revision 6898)
@@ -860,4 +860,14 @@
 		})(),
 
+
+		/**
+		 * Calls the {@link CKEDITOR.dialog.definition.uiElement#setup} method of each of the UI elements, with the arguments passed through it.
+		 * It is usually being called when the dialog is opened, to put the initial value inside the field.
+		 * @example
+		 * dialogObj.setupContent();
+		 * @example
+		 * var timestamp = ( new Date() ).valueOf();
+		 * dialogObj.setupContent( timestamp );
+		 */
 		setupContent : function()
 		{
@@ -870,4 +880,13 @@
 		},
 
+		/**
+		 * Calls the {@link CKEDITOR.dialog.definition.uiElement#commit} method of each of the UI elements, with the arguments passed through it.
+		 * It is usually being called when the user confirms the dialog, to process the values.
+		 * @example
+		 * dialogObj.commitContent();
+		 * @example
+		 * var timestamp = ( new Date() ).valueOf();
+		 * dialogObj.commitContent( timestamp );
+		 */
 		commitContent : function()
 		{
@@ -1140,4 +1159,5 @@
 		 * @param {String} elementId id of UI element.
 		 * @example
+		 * dialogObj.getContentElement( 'tabId', 'elementId' ).setValue( 'Example' );
 		 * @returns {CKEDITOR.ui.dialog.uiElement} The dialog UI element.
 		 */
@@ -1153,4 +1173,5 @@
 		 * @param {String} elementId id of UI element.
 		 * @example
+		 * alert( dialogObj.getValueOf( 'tabId', 'elementId' ) );
 		 * @returns {Object} The value of the UI element.
 		 */
@@ -1166,4 +1187,5 @@
 		 * @param {Object} value The new value of the UI element.
 		 * @example
+		 * dialogObj.setValueOf( 'tabId', 'elementId', 'Example' );
 		 */
 		setValueOf : function( pageId, elementId, value )
@@ -1906,4 +1928,9 @@
 		currentCover;
 
+	function cancelEvent( ev )
+	{
+		ev.data.preventDefault(1);
+	}
+
 	function showCover( editor )
 	{
@@ -1965,4 +1992,8 @@
 			coverElement = CKEDITOR.dom.element.createFromHtml( html.join( '' ) );
 			coverElement.setOpacity( backgroundCoverOpacity != undefined ? backgroundCoverOpacity : 0.5 );
+
+			coverElement.on( 'keydown', cancelEvent );
+			coverElement.on( 'keypress', cancelEvent );
+			coverElement.on( 'keyup', cancelEvent );
 
 			coverElement.appendTo( CKEDITOR.document.getBody() );
Index: CKEditor/branches/versions/3.5.x/_source/plugins/entities/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/entities/plugin.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/entities/plugin.js	(revision 6898)
@@ -172,4 +172,5 @@
 /**
  * Whether to use HTML entities in the output.
+ * @name CKEDITOR.config.entities
  * @type Boolean
  * @default true
@@ -183,4 +184,5 @@
  * 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>.
+ * @name CKEDITOR.config.entities_latin
  * @type Boolean
  * @default true
@@ -195,4 +197,5 @@
  * 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>.
+ * @name CKEDITOR.config.entities_greek
  * @type Boolean
  * @default true
@@ -208,5 +211,5 @@
  * For example, the phrase "This is Chinese: &#27721;&#35821;." is outputted
  * as "This is Chinese: &amp;#27721;&amp;#35821;."
- * @type Boolean
+ * @name CKEDITOR.config.entities_processNumerical
  * @type Boolean|String
  * @default false
@@ -220,4 +223,5 @@
  * entry separated by a comma. Entities names or number must be used, exclusing
  * the "&amp;" preffix and the ";" termination.
+ * @name CKEDITOR.config.entities_additional
  * @default '#39'  // The single quote (') character.
  * @type String
Index: CKEditor/branches/versions/3.5.x/_source/plugins/indent/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/indent/plugin.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/indent/plugin.js	(revision 6898)
@@ -452,5 +452,5 @@
  * @name CKEDITOR.config.indentClasses
  * @type Array
- * default null
+ * @default null
  * @example
  * // Use the classes 'Indent1', 'Indent2', 'Indent3'
Index: CKEditor/branches/versions/3.5.x/_source/plugins/justify/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/justify/plugin.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/justify/plugin.js	(revision 6898)
@@ -238,2 +238,13 @@
 	});
 })();
+
+ /**
+ * List of classes to use for aligning the contents. If it's null, no classes will be used
+ * and instead the corresponding CSS values will be used. The array should contain 4 members, in the following order: left, center, right, justify.
+ * @name CKEDITOR.config.justifyClasses
+ * @type Array
+ * @default null
+ * @example
+ * // Use the classes 'AlignLeft', 'AlignCenter', 'AlignRight', 'AlignJustify'
+ * config.justifyClasses = [ 'AlignLeft', 'AlignCenter', 'AlignRight', 'AlignJustify' ];
+ */
Index: CKEditor/branches/versions/3.5.x/_source/plugins/pastefromword/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/pastefromword/plugin.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/pastefromword/plugin.js	(revision 6898)
@@ -5,4 +5,6 @@
 (function()
 {
+	function forceHtmlMode( evt ) { evt.data.mode = 'html'; }
+
 	CKEDITOR.plugins.add( 'pastefromword',
 	{
@@ -16,4 +18,5 @@
 				{
 					evt && evt.removeListener();
+					editor.removeListener( 'beforePaste', forceHtmlMode );
 					forceFromWord && setTimeout( function() { forceFromWord = 0; }, 0 );
 				};
@@ -28,6 +31,9 @@
 				exec : function()
 				{
+					// Ensure the received data format is HTML and apply content filtering. (#6718)
 					forceFromWord = 1;
-					if ( editor.execCommand( 'paste' ) === false )
+					editor.on( 'beforePaste', forceHtmlMode );
+
+					if ( editor.execCommand( 'paste', 'html' ) === false )
 					{
 						editor.on( 'dialogShow', function ( evt )
Index: CKEditor/branches/versions/3.5.x/_source/plugins/pastetext/dialogs/pastetext.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/pastetext/dialogs/pastetext.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/pastetext/dialogs/pastetext.js	(revision 6898)
@@ -14,21 +14,6 @@
 				minHeight : 240,
 
-				onShow : function()
-				{
-					// Reset the textarea value.
-					this.getContentElement( 'general', 'content' ).getInputElement().setValue( '' );
-				},
-
-				onOk : function()
-				{
-					// Get the textarea value.
-					var text = this.getContentElement( 'general', 'content' ).getInputElement().getValue(),
-						editor = this.getParentEditor();
-
-					setTimeout( function()
-					{
-						editor.fire( 'paste', { 'text' : text } );
-					}, 0 );
-				},
+				onShow : function(){ this.setupContent(); },
+				onOk : function(){ this.commitContent(); },
 
 				contents :
@@ -61,4 +46,16 @@
 								{
 									this.getElement().focus();
+								},
+								setup : function()
+								{
+									this.setValue( '' );
+								},
+								commit : function()
+								{
+									var value = this.getValue();
+									setTimeout( function()
+									{
+										editor.fire( 'paste', { 'text' : value } );
+									}, 0 );
 								}
 							}
Index: CKEditor/branches/versions/3.5.x/_source/plugins/pastetext/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/pastetext/plugin.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/pastetext/plugin.js	(revision 6898)
@@ -59,5 +59,7 @@
 				editor.on( 'beforeCommandExec', function ( evt )
 				{
-					if ( evt.data.name == 'paste' )
+					var mode = evt.data.commandData;
+					// Do NOT overwrite if HTML format is explicitly requested.
+					if ( evt.data.name == 'paste' && mode != 'html' )
 					{
 						editor.execCommand( 'pastetext' );
@@ -65,4 +67,9 @@
 					}
 				}, null, null, 0 );
+
+				editor.on( 'beforePaste', function( evt )
+				{
+					evt.data.mode = 'text';
+				});
 			}
 
@@ -83,4 +90,5 @@
  * editor, loosing any formatting information possibly available in the source
  * text.
+ * <strong>Note:</strong> paste from word is not affected by this configuration.
  * @name CKEDITOR.config.forcePasteAsPlainText
  * @type Boolean
Index: CKEditor/branches/versions/3.5.x/_source/plugins/scayt/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/scayt/plugin.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/scayt/plugin.js	(revision 6898)
@@ -664,13 +664,13 @@
 							return null;
 						// Remove unused commands and menuitems
-						for ( i in moreSuggestions )
-						{
-							delete editor._.menuItems[ i ];
-							delete editor._.commands[ i ];
+						for ( var m in moreSuggestions )
+						{
+							delete editor._.menuItems[ m ];
+							delete editor._.commands[ m ];
 						}
-						for ( i in mainSuggestions )
-						{
-							delete editor._.menuItems[ i ];
-							delete editor._.commands[ i ];
+						for ( m in mainSuggestions )
+						{
+							delete editor._.menuItems[ m ];
+							delete editor._.commands[ m ];
 						}
 						moreSuggestions = {};		// Reset items.
Index: CKEditor/branches/versions/3.5.x/_source/plugins/selection/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/selection/plugin.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/selection/plugin.js	(revision 6898)
@@ -568,8 +568,8 @@
 
 	var styleObjectElements =
-	{
-		img:1,hr:1,li:1,table:1,tr:1,td:1,th:1,embed:1,object:1,ol:1,ul:1,
-		a:1, input:1, form:1, select:1, textarea:1, button:1, fieldset:1, th:1, thead:1, tfoot:1
-	};
+		{
+			img:1,hr:1,li:1,table:1,tr:1,td:1,th:1,embed:1,object:1,ol:1,ul:1,
+			a:1,input:1,form:1,select:1,textarea:1,button:1,fieldset:1,thead:1,tfoot:1
+		};
 
 	CKEDITOR.dom.selection.prototype =
Index: CKEditor/branches/versions/3.5.x/_source/plugins/styles/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/styles/plugin.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/styles/plugin.js	(revision 6898)
@@ -816,5 +816,5 @@
 		var root = range.getCommonAncestor( true, true ),
 			element = root.getAscendant( this.element, true );
-		element && setupElement( element, this );
+		element && !element.isReadOnly() && setupElement( element, this );
 	}
 
@@ -873,6 +873,9 @@
 		while ( ( block = iterator.getNextParagraph() ) )		// Only one =
 		{
-			var newBlock = getElement( this, doc, block );
-			replaceBlock( block, newBlock );
+			if ( !block.isReadOnly() )
+			{
+				var newBlock = getElement( this, doc, block );
+				replaceBlock( block, newBlock );
+			}
 		}
 
@@ -1446,4 +1449,14 @@
 		else
 			styleText = unparsedCssText;
+
+		// Normalize font-family property, ignore quotes and being case insensitive. (#7322)
+		// http://www.w3.org/TR/css3-fonts/#font-family-the-font-family-property
+		styleText = styleText.replace( /(font-family:)(.*?)(?=;|$)/, function ( match, prop, val )
+		{
+			var names = val.split( ',' );
+			for ( var i = 0; i < names.length; i++ )
+				names[ i ] = CKEDITOR.tools.trim( names[ i ].replace( /["']/g, '' ) );
+			return prop + names.join( ',' );
+		});
 
 		// Shrinking white-spaces around colon and semi-colon (#4147).
Index: CKEditor/branches/versions/3.5.x/_source/plugins/undo/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/undo/plugin.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/undo/plugin.js	(revision 6898)
@@ -546,4 +546,5 @@
  * The number of undo steps to be saved. The higher this setting value the more
  * memory is used for it.
+ * @name CKEDITOR.config.undoStackSize
  * @type Number
  * @default 20
Index: CKEditor/branches/versions/3.5.x/_source/plugins/wysiwygarea/plugin.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/plugins/wysiwygarea/plugin.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/plugins/wysiwygarea/plugin.js	(revision 6898)
@@ -11,17 +11,13 @@
 (function()
 {
-	// List of elements in which has no way to move editing focus outside.
-	var nonExitableElementNames = { table:1,pre:1 };
-
 	// Matching an empty paragraph at the end of document.
-	var emptyParagraphRegexp = /(^|<body\b[^>]*>)\s*<(p|div|address|h\d|center)[^>]*>\s*(?:<br[^>]*>|&nbsp;|\u00A0|&#160;)?\s*(:?<\/\2>)?\s*(?=$|<\/body>)/gi;
+	var emptyParagraphRegexp = /(^|<body\b[^>]*>)\s*<(p|div|address|h\d|center|pre)[^>]*>\s*(?:<br[^>]*>|&nbsp;|\u00A0|&#160;)?\s*(:?<\/\2>)?\s*(?=$|<\/body>)/gi;
 
 	var notWhitespaceEval = CKEDITOR.dom.walker.whitespaces( true );
 
-	// Elements that could have empty new line around, including table, pre-formatted block, hr, page-break. (#6554)
-	function nonExitable( element )
+	// Elements that could blink the cursor anchoring beside it, like hr, page-break. (#6554)
+	function nonEditable( element )
 	{
-		return ( element.getName() in nonExitableElementNames )
-				|| element.isBlockBoundary() && CKEDITOR.dtd.$empty[ element.getName() ];
+		return element.isBlockBoundary() && CKEDITOR.dtd.$empty[ element.getName() ];
 	}
 
@@ -370,6 +366,10 @@
 				lastNode = pathBlock && pathBlock.getLast( isNotEmpty );
 
-			// In case it's not ended with block element and doesn't have bogus yet. (#7467)
+			// Check some specialities of the current path block:
+			// 1. It is really displayed as block; (#7221)
+			// 2. It doesn't end with one inner block; (#7467)
+			// 3. It doesn't have bogus br yet.
 			if ( pathBlock
+					&& pathBlock.isBlockBoundary()
 					&& !( lastNode && lastNode.type == CKEDITOR.NODE_ELEMENT && lastNode.isBlockBoundary() )
 					&& !pathBlock.is( 'pre' )
@@ -410,5 +410,5 @@
 				if ( element &&
 					 element.type == CKEDITOR.NODE_ELEMENT &&
-					 !nonExitable( element ) )
+					 !nonEditable( element ) )
 				{
 					range.moveToElementEditStart( element );
@@ -420,5 +420,5 @@
 					if ( element &&
 						 element.type == CKEDITOR.NODE_ELEMENT &&
-						 !nonExitable( element ) )
+						 !nonEditable( element ) )
 					{
 						range.moveToElementEditEnd( element );
@@ -433,20 +433,11 @@
 		}
 
-		// All browsers are incapable to moving cursor out of certain non-exitable
-		// blocks (e.g. table, list, pre) at the end of document, make this happen by
-		// place a bogus node there, which would be later removed by dataprocessor.
-		var walkerRange = new CKEDITOR.dom.range( editor.document ),
-			walker = new CKEDITOR.dom.walker( walkerRange );
-		walkerRange.selectNodeContents( body );
-		walker.evaluator = function( node )
-		{
-			return node.type == CKEDITOR.NODE_ELEMENT && ( node.getName() in nonExitableElementNames );
-		};
-		walker.guard = function( node, isMoveout )
-		{
-			return !( ( node.type == CKEDITOR.NODE_TEXT && isNotWhitespace( node ) ) || isMoveout );
-		};
-
-		if ( walker.previous() )
+		// Browsers are incapable of moving cursor out of certain block elements (e.g. table, div, pre)
+		// at the end of document, makes it unable to continue adding content, we have to make this
+		// easier by opening an new empty paragraph.
+		var testRange = new CKEDITOR.dom.range( editor.document );
+		testRange.moveToElementEditEnd( editor.document.getBody() );
+		var testPath = new CKEDITOR.dom.elementPath( testRange.startContainer );
+		if ( !testPath.blockLimit.is( 'body') )
 		{
 			editor.fire( 'updateSnapshot' );
@@ -456,5 +447,5 @@
 			var paddingBlock;
 			if ( enterMode != CKEDITOR.ENTER_BR )
-				paddingBlock = body.append( new CKEDITOR.dom.element( enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ) );
+				paddingBlock = body.append( editor.document.createElement( enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ) );
 			else
 				paddingBlock = body;
Index: CKEditor/branches/versions/3.5.x/_source/themes/default/theme.js
===================================================================
--- CKEditor/branches/versions/3.5.x/_source/themes/default/theme.js	(revision 6656)
+++ CKEditor/branches/versions/3.5.x/_source/themes/default/theme.js	(revision 6898)
@@ -11,4 +11,6 @@
 CKEDITOR.themes.add( 'default', (function()
 {
+	var hiddenSkins = {};
+
 	function checkSharedSpace( editor, spaceName )
 	{
@@ -121,4 +123,10 @@
 			sharedTop		&& ( sharedTop.setHtml( topHtml )		, topHtml = '' );
 			sharedBottoms	&& ( sharedBottoms.setHtml( bottomHtml ), bottomHtml = '' );
+
+			var hideSkin = '<style>.' + editor.skinClass + '{visibility:hidden;}</style>';
+			if ( hiddenSkins[ editor.skinClass ] )
+				hideSkin = '';
+			else
+				hiddenSkins[ editor.skinClass ] = 1;
 
 			var container = CKEDITOR.dom.element.createFromHtml( [
@@ -143,5 +151,5 @@
 							'</tbody></table>' +
 							//Hide the container when loading skins, later restored by skin css.
-							'<style>.', editor.skinClass, '{visibility:hidden;}</style>' +
+							hideSkin +
 						'</span>' +
 					'</span>' +
