Index: /CKEditor/branches/versions/3.4.x/CHANGES.html
===================================================================
--- /CKEditor/branches/versions/3.4.x/CHANGES.html	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/CHANGES.html	(revision 6034)
@@ -79,4 +79,6 @@
 		<li><a href="http://dev.ckeditor.com/ticket/6403">#6403</a> : [Opera] Font name options is not correctly marked in dropdown list.</li>
 		<li><a href="http://dev.ckeditor.com/ticket/4534">#4534</a> : [Opera] Arrow key to navigate through combo list has side effects of window scrolling.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6534">#6534</a> : [Opera] Menu key brings up both CKEditor and browser context menu.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6534">#6534</a> : [Opera] Menu key brings up both CKEditor and browser context menu.</li>
 		<li><a href="http://dev.ckeditor.com/ticket/6416">#6416</a> : [IE9] Unable to make text selection with mouse in source area.</li>
 		<li><a href="http://dev.ckeditor.com/ticket/6417">#6417</a> : [IE9] Context menu opens at the upper-left corner always.</li>
@@ -91,4 +93,5 @@
 		<li><a href="http://dev.ckeditor.com/ticket/6508">#6508</a> : BiDi: Margin mirroring logic doesn't honor CSS direction.</li>
 		<li><a href="http://dev.ckeditor.com/ticket/6043">#6043</a> : BIDI: When we apply RTL direction to a right aligned Paragraph, Paragraph is not moved to left & Alignment of Paragraph is not changed.</li>
+		<li><a href="http://dev.ckeditor.com/ticket/6485">#6485</a> : BIDI: When direction is applied on partial selected list, the style is been incorrectly applied on the entired list.</li>
 		<li><a href="http://dev.ckeditor.com/ticket/6087">#6087</a> : Cursor of input fields in dialog isn't visible in RLT .</li>
 		<li><a href="http://dev.ckeditor.com/ticket/5595">#5595</a> : Extra leading spaces added in preformatted block.</li>
Index: /CKEditor/branches/versions/3.4.x/_dev/docs_build/docs_build.conf
===================================================================
--- /CKEditor/branches/versions/3.4.x/_dev/docs_build/docs_build.conf	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_dev/docs_build/docs_build.conf	(revision 6034)
@@ -17,5 +17,6 @@
 		'../../_source/core/',
 		'../../_source/plugins/',
-		'../../_source/skins/kama/skin.js'
+		'../../_source/skins/kama/skin.js',
+		'../../_source/themes/default/theme.js'
 	],
 
Index: /CKEditor/branches/versions/3.4.x/_dev/docs_build/template/class.tmpl
===================================================================
--- /CKEditor/branches/versions/3.4.x/_dev/docs_build/template/class.tmpl	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_dev/docs_build/template/class.tmpl	(revision 6034)
@@ -54,4 +54,7 @@
 					{+ data.version +}.<br />
 				</if>
+
+				{+resolveLinks(data.classDesc)+}
+				
 				<if test="data.augments.length"><br />Extends
 					{+
@@ -62,9 +65,7 @@
 						)
 						.join(", ")
-					+}.<br />
+					+}.
 				</if>
 			
-				{+resolveLinks(data.classDesc)+}
-				
 				<if test="!data.isBuiltin()">{# isn't defined in any file #}
 					<br /><i>Defined in: </i> {+ ckeditor_FileLink( data.srcFile ) +}.
@@ -73,5 +74,5 @@
 
 <!-- ============================== constructor summary ==================== -->			
-			<if test="!data.isBuiltin() && (data.isNamespace || data.is('CONSTRUCTOR'))">
+			<if test="!data.isBuiltin() && data.is('CONSTRUCTOR')">
 			<table class="summaryTable" cellspacing="0" summary="A summary of the constructor documented in the class {+data.alias+}.">
 				<caption>{+classType+}Summary</caption>
@@ -313,5 +314,5 @@
 
 <!-- ============================== constructor details ==================== -->		
-			<if test="!data.isBuiltin() && (data.isNamespace || data.is('CONSTRUCTOR'))">
+			<if test="!data.isBuiltin() && data.is('CONSTRUCTOR')">
 			<div class="details"><a name="constructor"> </a>
 				<div class="sectionTitle">
Index: /CKEditor/branches/versions/3.4.x/_dev/docs_build/template/static/default.css
===================================================================
--- /CKEditor/branches/versions/3.4.x/_dev/docs_build/template/static/default.css	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_dev/docs_build/template/static/default.css	(revision 6034)
@@ -36,7 +36,7 @@
 #index
 {
-	margin-top: 24px;
+	margin-top: 14px;
 	float: left;
-	width: 160px;
+	width: 220px;
 	position: absolute;
 	left: 8px;
@@ -47,5 +47,5 @@
 #content
 {
-	margin-left: 190px;
+	margin-left: 250px;
 }
 
Index: /CKEditor/branches/versions/3.4.x/_source/core/ajax.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/ajax.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/ajax.js	(revision 6034)
@@ -10,6 +10,5 @@
 
 /**
- * Ajax methods for data loading.
- * @namespace
+ * @namespace Ajax methods for data loading.
  * @example
  */
Index: /CKEditor/branches/versions/3.4.x/_source/core/ckeditor_base.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/ckeditor_base.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/ckeditor_base.js	(revision 6034)
@@ -21,7 +21,6 @@
 {
 	/**
-	 * This is the API entry point. The entire CKEditor code runs under this object.
 	 * @name CKEDITOR
-	 * @namespace
+	 * @namespace This is the API entry point. The entire CKEditor code runs under this object.
 	 * @example
 	 */
Index: /CKEditor/branches/versions/3.4.x/_source/core/ckeditor_basic.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/ckeditor_basic.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/ckeditor_basic.js	(revision 6034)
@@ -139,8 +139,5 @@
 		};
 
-		/**
-		 * @ignore
-		 * Documented at ckeditor.js.
-		 */
+		// Documented at ckeditor.js.
 		CKEDITOR.add = function( editor )
 		{
Index: /CKEditor/branches/versions/3.4.x/_source/core/command.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/command.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/command.js	(revision 6034)
@@ -199,6 +199,7 @@
 /**
  * Fired when the command state changes.
- * @name CKEDITOR.command.prototype#state
+ * @name CKEDITOR.command#state
  * @event
+ * @example
  * command.on( <b>'state'</b> , function( e )
  *     {
Index: /CKEditor/branches/versions/3.4.x/_source/core/commanddefinition.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/commanddefinition.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/commanddefinition.js	(revision 6034)
@@ -12,13 +12,13 @@
 /**
  * (Virtual Class) Do not call this constructor. This class is not really part
- *		of the API. It just illustrates the features of command objects to be
+ * of the API. 
+ * @name CKEDITOR.commandDefinition
+ * @class Virtual class that illustrates the features of command objects to be
  *		passed to the {@link CKEDITOR.editor.prototype.addCommand} function.
- * @name CKEDITOR.commandDefinition
- * @constructor
  * @example
  */
 
  /**
- * Executes the command.
+ * The function to be fired when the commend is executed.
  * @name CKEDITOR.commandDefinition.prototype.exec
  * @function
@@ -39,7 +39,7 @@
 /**
  * Whether the command need to be hooked into the redo/undo system.
- * @name  CKEDITOR.commandDefinition.canUndo
- * @type {Boolean} If not defined or 'true' both hook into undo system, set it
- *		to 'false' explicitly  keep it out.
+ * @name  CKEDITOR.commandDefinition.prototype.canUndo
+ * @type {Boolean}
+ * @default true
  * @field
  * @example
@@ -55,16 +55,21 @@
 
 /**
- * Whether the command is asynchronous, which means the 'afterCommandExec' event
- * will be fired by the command itself manually, and the 'exec' function return value
- * of this command is not to be returned.
- * @name  CKEDITOR.commandDefinition.async
- * @type {Boolean} If defined as 'true', the command is asynchronous.
+ * Whether the command is asynchronous, which means that the
+ * {@link CKEDITOR.editor#event:afterCommandExec} event will be fired by the
+ * command itself manually, and that the return value of this command is not to
+ * be returned by the {@link CKEDITOR.command#exec} function.
+ * @name  CKEDITOR.commandDefinition.prototype.async
+ * @default false
+ * @type {Boolean}
  * @example
- * editorInstance.addCommand( 'alertName',
+ * editorInstance.addCommand( 'loadOptions',
  * {
  *     exec : function( editor )
  *     {
  *         // Asynchronous operation below.
- *         CKEDITOR.ajax.loadXml( 'data.xml' );
+ *         CKEDITOR.ajax.loadXml( 'data.xml', function()
+ *             {
+ *                 editor.fire( 'afterCommandExec' );
+ *             ));
  *     },
  *     async : true    // The command need some time to complete after exec function returns.
@@ -74,6 +79,8 @@
 /**
  * Whether the command should give focus to the editor before execution.
- * @name  CKEDITOR.commandDefinition.editorFocus
+ * @name  CKEDITOR.commandDefinition.prototype.editorFocus
  * @type {Boolean}
+ * @default true
+ * @see CKEDITOR.command#editorFocus
  * @example
  * editorInstance.addCommand( 'maximize',
@@ -81,4 +88,5 @@
  *     exec : function( editor )
  *     {
+ *         // ...
  *     },
  *     editorFocus : false    // The command doesn't require focusing the editing document.
@@ -89,5 +97,5 @@
 /**
  * Whether the command state should be set to {@link CKEDITOR.TRISTATE_DISABLED} on startup.
- * @name  CKEDITOR.commandDefinition.startDisabled
+ * @name  CKEDITOR.commandDefinition.prototype.startDisabled
  * @type {Boolean}
  * @default false
@@ -97,6 +105,25 @@
  *     exec : function( editor )
  *     {
+ *         // ...
  *     },
  *     startDisabled : true    // Command is unavailable until selection is inside a link.
  * });
  */
+
+/**
+ * The editor modes within which the command can be executed. The execution
+ * will have no action if the current mode is not listed in this property.
+ * @name  CKEDITOR.commandDefinition.prototype.modes
+ * @type Object
+ * @default { wysiwyg : 1 }
+ * @see CKEDITOR.command#modes
+ * @example
+ * editorInstance.addCommand( 'link',
+ * {
+ *     exec : function( editor )
+ *     {
+ *         // ...
+ *     },
+ *     modes : { wysiwyg : 1 }    // Command is available in wysiwyg mode only.
+ * });
+ */
Index: /CKEditor/branches/versions/3.4.x/_source/core/config.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/config.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/config.js	(revision 6034)
@@ -9,17 +9,32 @@
  */
 
+/**
+ * Used in conjuction with {@link CKEDITOR.config.enterMode} and
+ * {@link CKEDITOR.config.shiftEnterMode} to make the editor produce &lt;p&gt;
+ * tags when using the ENTER key.
+ * @constant
+ */
 CKEDITOR.ENTER_P	= 1;
+
+/**
+ * Used in conjuction with {@link CKEDITOR.config.enterMode} and
+ * {@link CKEDITOR.config.shiftEnterMode} to make the editor produce &lt;br&gt;
+ * tags when using the ENTER key.
+ * @constant
+ */
 CKEDITOR.ENTER_BR	= 2;
+
+/**
+ * Used in conjuction with {@link CKEDITOR.config.enterMode} and
+ * {@link CKEDITOR.config.shiftEnterMode} to make the editor produce &lt;div&gt;
+ * tags when using the ENTER key.
+ * @constant
+ */
 CKEDITOR.ENTER_DIV	= 3;
 
 /**
- * Holds the default configuration settings. Changes to this object are
+ * @namespace Holds the default configuration settings. Changes to this object are
  * reflected in all editor instances, if not specificaly specified for those
  * instances.
- * @namespace
- * @example
- * // All editor created after the following setting will not load custom
- * // configuration files.
- * CKEDITOR.config.customConfig = '';
  */
 CKEDITOR.config =
@@ -57,5 +72,5 @@
 	 * editor content.
 	 * @type String
-	 * @default '' (empty string)
+	 * @default '' (empty)
 	 * @example
 	 * config.baseHref = 'http://www.example.com/path/';
@@ -195,8 +210,13 @@
 	/**
 	 * Sets the "id" attribute to be used on the body element of the editing
-	 * area.
+	 * area. This can be useful when reusing the original CSS file you're using
+	 * on your live website and you want to assing to the editor the same id
+	 * you're using for the region that'll hold the contents. In this way,
+	 * id specific CSS rules will be enabled.
 	 * @since 3.1
 	 * @type String
-	 * @default ''
+	 * @default '' (empty)
+	 * @example	
+	 * config.bodyId = 'contents_id';
 	 */
 	bodyId : '',
@@ -204,8 +224,13 @@
 	/**
 	 * Sets the "class" attribute to be used on the body element of the editing
-	 * area.
+	 * area. This can be useful when reusing the original CSS file you're using
+	 * on your live website and you want to assing to the editor the same class
+	 * name you're using for the region that'll hold the contents. In this way,
+	 * class specific CSS rules will be enabled.
 	 * @since 3.1
 	 * @type String
-	 * @default ''
+	 * @default '' (empty)
+	 * @example	
+	 * config.bodyClass = 'contents';
 	 */
 	bodyClass : '',
@@ -388,8 +413,8 @@
 
 /**
- * Indicates that some of the editor features, like alignement and text
+ * Indicates that some of the editor features, like alignment and text
  * direction, should used the "computed value" of the feature to indicate it's
- * on/off state, instead of using the "real value".
- *
+ * on/off state, instead of using the "real value".<br />
+ * <br />
  * If enabled, in a left to right written document, the "Left Justify"
  * alignment button will show as active, even if the aligment style is not
Index: /CKEditor/branches/versions/3.4.x/_source/core/dom.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/dom.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/dom.js	(revision 6034)
@@ -10,8 +10,7 @@
 
 /**
- * DOM manipulation objects and function.<br /><br />
+ * @namespace DOM manipulation objects, classes and functions.
  * @see CKEDITOR.dom.element
  * @see CKEDITOR.dom.node
- * @namespace
  * @example
  */
Index: /CKEditor/branches/versions/3.4.x/_source/core/dom/documentfragment.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/dom/documentfragment.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/dom/documentfragment.js	(revision 6034)
@@ -3,11 +3,11 @@
 For licensing, see LICENSE.html or http://ckeditor.com/license
 */
+
 /**
- * DocumentFragment is a "lightweight" or "minimal" Document object. It is
+ * @class DocumentFragment is a "lightweight" or "minimal" Document object. It is
  * commonly used to extract a portion of a document's tree or to create a new
  * fragment of a document. Various operations may take DocumentFragment objects
  * as arguments and results in all the child nodes of the DocumentFragment being
  * moved to the child list of this node.
- *
  * @param {Object} ownerDocument
  */
Index: /CKEditor/branches/versions/3.4.x/_source/core/dom/domobject.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/dom/domobject.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/dom/domobject.js	(revision 6034)
@@ -239,5 +239,9 @@
 
 	/**
-	 * @name CKEDITOR.dom.domObject.prototype.getCustomData
+	 * Gets an ID that can be used to identiquely identify this DOM object in
+	 * the running session.
+	 * @name CKEDITOR.dom.domObject.prototype.getUniqueId
+	 * @function
+	 * @returns {Number} A unique ID.
 	 */
 	domObjectProto.getUniqueId = function()
Index: /CKEditor/branches/versions/3.4.x/_source/core/dom/elementpath.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/dom/elementpath.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/dom/elementpath.js	(revision 6034)
@@ -28,4 +28,7 @@
 	};
 
+	/**
+	 * @class
+	 */
 	CKEDITOR.dom.elementPath = function( lastNode )
 	{
Index: /CKEditor/branches/versions/3.4.x/_source/core/dom/nodelist.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/dom/nodelist.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/dom/nodelist.js	(revision 6034)
@@ -4,4 +4,7 @@
 */
 
+/**
+ * @class
+ */
 CKEDITOR.dom.nodeList = function( nativeList )
 {
Index: /CKEditor/branches/versions/3.4.x/_source/core/dom/range.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/dom/range.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/dom/range.js	(revision 6034)
@@ -4,4 +4,7 @@
 */
 
+/**
+ * @class
+ */
 CKEDITOR.dom.range = function( document )
 {
@@ -1301,5 +1304,6 @@
 				}
 
-				var walker = new CKEDITOR.dom.walker( walkerRange );
+				var walker = new CKEDITOR.dom.walker( walkerRange ),
+					isBookmark = CKEDITOR.dom.walker.bookmark();
 
 				walker.evaluator = function( node )
@@ -1312,4 +1316,7 @@
 				walker.guard = function( node, movingOut )
 				{
+					if ( isBookmark( node ) )
+						return true;
+
 					// Stop when we're shrink in element mode while encountering a text node.
 					if ( mode == CKEDITOR.SHRINK_ELEMENT && node.type == CKEDITOR.NODE_TEXT )
Index: /CKEditor/branches/versions/3.4.x/_source/core/dom/rangelist.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/dom/rangelist.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/dom/rangelist.js	(revision 6034)
@@ -40,5 +40,7 @@
 			{
 				var rangeList = this,
-					bookmarks = [],
+					bookmark = CKEDITOR.dom.walker.bookmark(),
+					guard = function( node ) { return ! ( node.is && node.is( 'tr' ) ); },
+						bookmarks = [],
 					current;
 
@@ -50,6 +52,7 @@
 					/**
 					 * Retrieves the next range in the list.
+					 * @param {Boolean} mergeConsequent Whether join two adjacent ranges into single, e.g. consequent table cells.
 					 */
-					getNextRange : function()
+					getNextRange : function( mergeConsequent )
 					{
 						current = current == undefined ? 0 : current + 1;
@@ -66,9 +69,56 @@
 							{
 								// Make sure bookmark correctness by reverse processing.
-								for ( var i = rangeList.length - 1; i > 0; i-- )
+								for ( var i = rangeList.length - 1; i >= 0; i-- )
 									bookmarks.unshift( rangeList[ i ].createBookmark( true ) );
 							}
-							else
-								range.moveToBookmark( bookmarks.shift() );
+
+							if ( mergeConsequent )
+							{
+								// Figure out how many ranges should be merged.
+								var mergeCount = 0;
+								while ( rangeList[ current + mergeCount + 1 ] )
+								{
+									var doc = range.document,
+										found = 0,
+										left =  doc.getById( bookmarks[ mergeCount ].endNode ),
+										right = doc.getById( bookmarks[ mergeCount + 1 ].startNode ),
+										next;
+
+									// Check subsequent range.
+									while ( 1 )
+									{
+										next = left.getNextSourceNode( false );
+										if ( !right.equals( next ) )
+										{
+											// This could be yet another bookmark or
+											// walking across block boundaries.
+											if ( bookmark( next ) || ( next.type == CKEDITOR.NODE_ELEMENT && next.isBlockBoundary() ) )
+											{
+												left = next;
+												continue;
+											}
+										}
+										else
+											found = 1;
+
+										break;
+									}
+
+									if ( !found )
+										break;
+
+									mergeCount++;
+								}
+							}
+
+							range.moveToBookmark( bookmarks.shift() );
+							
+							// Merge ranges finally after moving to bookmarks.
+							while( mergeCount-- )
+							{
+								var next = rangeList[ ++current ];
+								next.moveToBookmark( bookmarks.shift() );
+								range.setEnd( next.endContainer, next.endOffset );
+							}
 						}
 
Index: /CKEditor/branches/versions/3.4.x/_source/core/dom/walker.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/dom/walker.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/dom/walker.js	(revision 6034)
@@ -386,5 +386,5 @@
 			// Is bookmark node?
 			isBookmark = contentOnly ? isBookmark : isBookmark || isBookmarkNode( node );
-			return isReject ^ isBookmark;
+			return !! ( isReject ^ isBookmark );
 		};
 	};
@@ -400,5 +400,5 @@
 			var isWhitespace = node && ( node.type == CKEDITOR.NODE_TEXT )
 							&& !CKEDITOR.tools.trim( node.getText() );
-			return isReject ^ isWhitespace;
+			return !! ( isReject ^ isWhitespace );
 		};
 	};
@@ -419,5 +419,5 @@
 			// all sorts of empty paragraph, e.g. <br />.
 			var isInvisible = whitespace( node ) || node.is && !node.$.offsetHeight;
-			return isReject ^ isInvisible;
+			return !! ( isReject ^ isInvisible );
 		};
 	};
Index: /CKEditor/branches/versions/3.4.x/_source/core/dtd.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/dtd.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/dtd.js	(revision 6034)
@@ -11,14 +11,13 @@
 
 /**
- * Holds and object representation of the HTML DTD to be used by the editor in
- * its internal operations.
- *
- * Each element in the DTD is represented by a
- * property in this object. Each property contains the list of elements that
- * can be contained by the element. Text is represented by the "#" property.
- *
+ * @namespace Holds and object representation of the HTML DTD to be used by the
+ * editor in its internal operations.<br />
+ * <br />
+ * Each element in the DTD is represented by a property in this object. Each
+ * property contains the list of elements that can be contained by the element.
+ * Text is represented by the "#" property.<br />
+ * <br />
  * Several special grouping properties are also available. Their names start
  * with the "$" character.
- * @namespace
  * @example
  * // Check if "div" can be contained in a "p" element.
@@ -82,6 +81,12 @@
 		$blockLimit : { body:1,div:1,td:1,th:1,caption:1,form:1 },
 
+		/**
+		 * List of inline (&lt;span&gt; like) elements.
+		 */
 		$inline : L,	// Just like span.
 
+		/**
+		 * list of elements that can be children at &lt;body&gt;.
+		 */
 		$body : X({script:1,style:1}, block),
 
Index: /CKEditor/branches/versions/3.4.x/_source/core/editor.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/editor.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/editor.js	(revision 6034)
@@ -119,8 +119,44 @@
 				'skins/' + skinName + '/' ) );
 
+		/**
+		 * The name of the skin used by this editor instance. The skin name can
+		 * be set though the {@link CKEDITOR.config.skin} setting.
+		 * @name CKEDITOR.editor.prototype.skinName
+		 * @type String
+		 * @example
+		 * alert( editor.skinName );  // "kama" (e.g.)
+		 */
 		editor.skinName = skinName;
+
+		/**
+		 * The full URL of the skin directory.
+		 * @name CKEDITOR.editor.prototype.skinPath
+		 * @type String
+		 * @example
+		 * alert( editor.skinPath );  // "http://example.com/ckeditor/skins/kama/" (e.g.)
+		 */
 		editor.skinPath = skinPath;
+
+		/**
+		 * The CSS class name used for skin identification purposes.
+		 * @name CKEDITOR.editor.prototype.skinClass
+		 * @type String
+		 * @example
+		 * alert( editor.skinClass );  // "cke_skin_kama" (e.g.)
+		 */
 		editor.skinClass = 'cke_skin_' + skinName;
 
+		/**
+		 * The <a href="http://en.wikipedia.org/wiki/Tabbing_navigation">tabbing
+		 * navigation</a> order that has been calculated for this editor
+		 * instance. This can be set by the {@link CKEDITOR.config.tabIndex}
+		 * setting or taken from the "tabindex" attribute of the
+		 * {@link #element} associated to the editor.
+		 * @name CKEDITOR.editor.prototype.tabIndex
+		 * @type Number
+		 * @default 0 (zero)
+		 * @example
+		 * alert( editor.tabIndex );  // "0" (e.g.)
+		 */
 		editor.tabIndex = editor.config.tabIndex || editor.element.getAttribute( 'tabindex' ) || 0;
 
@@ -136,6 +172,22 @@
 		CKEDITOR.lang.load( editor.config.language, editor.config.defaultLanguage, function( languageCode, lang )
 			{
+				/**
+				 * The code for the language resources that have been loaded
+				 * for the user internface elements of this editor instance.
+				 * @name CKEDITOR.editor.prototype.langCode
+				 * @type String
+				 * @example
+				 * alert( editor.langCode );  // "en" (e.g.)
+				 */
 				editor.langCode = languageCode;
 
+				/**
+				 * An object holding all language strings used by the editor
+				 * interface.
+				 * @name CKEDITOR.editor.prototype.lang
+				 * @type CKEDITOR.lang
+				 * @example
+				 * alert( editor.lang.bold );  // "Negrito" (e.g. if language is Portuguese)
+				 */
 				// As we'll be adding plugin specific entries that could come
 				// from different language code files, we need a copy of lang,
@@ -189,5 +241,12 @@
 				var languageFiles = [];
 
-				// Cache the loaded plugin names.
+				/**
+				 * And object holding references to all plugins used by this
+				 * editor istance.
+				 * @name CKEDITOR.editor.prototype.plugins
+				 * @type Object
+				 * @example
+				 * alert( editor.plugins.dialog.path );  // "http://example.com/ckeditor/plugins/dialog/" (e.g.)
+				 */
 				editor.plugins = plugins;
 
@@ -272,4 +331,11 @@
 		CKEDITOR.themes.load( theme, function()
 			{
+				/**
+				 * The theme used by this editor instance.
+				 * @name CKEDITOR.editor.prototype.theme
+				 * @type CKEDITOR.theme
+				 * @example
+				 * alert( editor.theme );  "http://example.com/ckeditor/themes/default/" (e.g.)
+				 */
 				var editorTheme = editor.theme = CKEDITOR.themes.get( theme );
 				editorTheme.path = CKEDITOR.themes.getPath( theme );
@@ -604,4 +670,14 @@
 		},
 
+		/**
+		 * Gets the "raw data" currently available in the editor. This is a
+		 * fast method which return the data as is, without processing, so it's
+		 * not recommended to use it on resulting pages. It can be used instead
+		 * combined with the {@link #loadSnapshot} so one can automatic save
+		 * the editor data from time to time while the user is using the
+		 * editor, to avoid data loss, without risking performance issues.
+		 * @example
+		 * alert( editor.getSnapshot() );
+		 */
 		getSnapshot : function()
 		{
@@ -618,4 +694,13 @@
 		},
 
+		/**
+		 * Loads "raw data" in the editor. This data is loaded with processing
+		 * straight to the editing area. It should not be used as a way to load
+		 * any kind of data, but instead in combination with
+		 * {@link #getSnapshot} produced data.
+		 * @example
+		 * var data = editor.getSnapshot();
+		 * editor.<b>loadSnapshot( data )</b>;
+		 */
 		loadSnapshot : function( snapshot )
 		{
@@ -685,4 +770,22 @@
 		},
 
+		/**
+		 * Checks whether the current editor contents present changes when
+		 * compared to the contents loaded into the editor at startup, or to
+		 * the contents available in the editor when {@link #resetDirty} has
+		 * been called.
+		 * @returns {Boolean} "true" is the contents present changes.
+		 * @example
+		 * function beforeUnload( e )
+		 * {
+		 *     if ( CKEDITOR.instances.editor1.<b>checkDirty()</b> )
+		 * 	        return e.returnValue = "You'll loose the changes made in the editor.";
+		 * }
+		 * 
+		 * if ( window.addEventListener )
+		 *     window.addEventListener( 'beforeunload', beforeUnload, false );
+		 * else
+		 *     window.attachEvent( 'onbeforeunload', beforeUnload );
+		 */
 		checkDirty : function()
 		{
@@ -690,4 +793,13 @@
 		},
 
+		/**
+		 * Resets the "dirty state" of the editor so subsequent calls to
+		 * {@link #checkDirty} will return "false" if the user will not make
+		 * further changes to the contents.
+		 * @example
+		 * alert( editor.checkDirty() );  // "true" (e.g.)
+		 * editor.<b>resetDirty()</b>;
+		 * alert( editor.checkDirty() );  // "false"
+		 */
 		resetDirty : function()
 		{
@@ -764,3 +876,49 @@
  * @name CKEDITOR#pluginsLoaded
  * @event
+ * @param {CKEDITOR.editor} editor The editor instance that has been destroyed.
  */
+
+/**
+ * Fired before the command execution when {@link #execCommand} is called.
+ * @name CKEDITOR.editor#beforeCommandExec
+ * @event
+ * @param {CKEDITOR.editor} editor This editor instance.
+ * @param {String} data.name The command name.
+ * @param {Object} data.commandData The data to be sent to the command. This
+ *		can be manipulated by the event listener.
+ * @param {CKEDITOR.command} data.command The command itself.
+ */
+
+/**
+ * Fired after the command execution when {@link #execCommand} is called.
+ * @name CKEDITOR.editor#afterCommandExec
+ * @event
+ * @param {CKEDITOR.editor} editor This editor instance.
+ * @param {String} data.name The command name.
+ * @param {Object} data.commandData The data sent to the command.
+ * @param {CKEDITOR.command} data.command The command itself.
+ * @param {Object} data.returnValue The value returned by the command execution.
+ */
+
+/**
+ * Fired every custom configuration file is loaded, before the final
+ * configurations initialization.<br />
+ * <br />
+ * Custom configuration files can be loaded thorugh the
+ * {@link CKEDITOR.config.customConfig} setting. Several files can be loading
+ * by chaning this setting.
+ * @name CKEDITOR.editor#customConfigLoaded
+ * @event
+ * @param {CKEDITOR.editor} editor This editor instance.
+ * @example
+ */
+
+/**
+ * Fired once the editor configuration is ready (loaded and processed).
+ * @name CKEDITOR.editor#configLoaded
+ * @event
+ * @param {CKEDITOR.editor} editor This editor instance.
+ * @example
+ * if( editor.config.fullPage )
+ *     alert( 'This is a full page editor' );
+ */
Index: /CKEditor/branches/versions/3.4.x/_source/core/editor_basic.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/editor_basic.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/editor_basic.js	(revision 6034)
@@ -28,7 +28,7 @@
 
 	/**
-	 * Represents an editor instance. This constructor should be rarely used,
-	 * being the {@link CKEDITOR} methods preferible.
-	 * @constructor
+	 * Creates an editor class instance. This constructor should be rarely
+	 * used, in favor of the {@link CKEDITOR} editor creation functions.
+	 * @ class Represents an editor instance.
 	 * @param {Object} instanceConfig Configuration values for this specific
 	 *		instance.
@@ -36,5 +36,5 @@
 	 *		instance.
 	 * @param {Number} [mode] The mode in which the element is linked to this
-	 *		instance.
+	 *		instance. See {@link #elementMode}.
 	 * @param {String} [data] Since 3.3. Initial value for the instance.
 	 * @augments CKEDITOR.event
@@ -55,9 +55,9 @@
 		 * instance. It can be any of the following values:
 		 * <ul>
-		 * <li><b>CKEDITOR.ELEMENT_MODE_NONE</b>: No element is linked to the
+		 * <li>{@link CKEDITOR.ELEMENT_MODE_NONE}: No element is linked to the
 		 *		editor instance.</li>
-		 * <li><b>CKEDITOR.ELEMENT_MODE_REPLACE</b>: The element is to be
+		 * <li>{@link CKEDITOR.ELEMENT_MODE_REPLACE}: The element is to be
 		 *		replaced by the editor instance.</li>
-		 * <li><b>CKEDITOR.ELEMENT_MODE_APPENDTO</b>: The editor is to be
+		 * <li>{@link CKEDITOR.ELEMENT_MODE_APPENDTO}: The editor is to be
 		 *		created inside the element.</li>
 		 * </ul>
Index: /CKEditor/branches/versions/3.4.x/_source/core/env.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/env.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/env.js	(revision 6034)
@@ -12,7 +12,5 @@
 {
 	/**
-	 * Environment and browser information.
-	 * @namespace
-	 * @example
+	 * @namespace Environment and browser information.
 	 */
 	CKEDITOR.env = (function()
@@ -70,8 +68,30 @@
 			mac	: ( agent.indexOf( 'macintosh' ) > -1 ),
 
+			/**
+			 * Indicates that CKEditor is running on a quirks mode environemnt.
+			 * @type Boolean
+			 * @example
+			 * if ( CKEDITOR.env.quirks )
+			 *     alert( "Nooooo!" );
+			 */
 			quirks : ( document.compatMode == 'BackCompat' ),
 
+			/**
+			 * Indicates that CKEditor is running on a mobile like environemnt.
+			 * @type Boolean
+			 * @example
+			 * if ( CKEDITOR.env.mobile )
+			 *     alert( "I'm running with CKEditor today!" );
+			 */
 			mobile : ( agent.indexOf( 'mobile' ) > -1 ),
 
+			/**
+			 * Indicates that the browser has a custom domain enabled. This has
+			 * been set with "document.domain".
+			 * @returns {Boolean} "true" if a custom domain is enabled.
+			 * @example
+			 * if ( CKEDITOR.env.isCustomDomain() )
+			 *     alert( "I'm in a custom domain!" );
+			 */
 			isCustomDomain : function()
 			{
@@ -106,10 +126,21 @@
 
 			/**
-			 *  Indicate IE8 browser.
+			 * Indicates that CKEditor is running on Internet Explorer 8.
+			 * @name CKEDITOR.env.ie8
+			 * @type Boolean
+			 * @example
+			 * if ( CKEDITOR.env.ie8 )
+			 *     alert( "I'm on IE8!" );
 			 */
 			env.ie8 = !!document.documentMode;
 
 			/**
-			 * Indicte IE8 document mode.
+			 * Indicates that CKEditor is running on Internet Explorer 8 on
+			 * standards mode.
+			 * @name CKEDITOR.env.ie8Compat
+			 * @type Boolean
+			 * @example
+			 * if ( CKEDITOR.env.ie8Compat )
+			 *     alert( "Now I'm on IE8, for real!" );
 			 */
 			env.ie8Compat = document.documentMode == 8;
@@ -118,5 +149,9 @@
 			 * Indicates that CKEditor is running on an IE7-like environment, which
 			 * includes IE7 itself and IE8's IE7 document mode.
-			 * @type Boolean
+			 * @name CKEDITOR.env.ie7Compat
+			 * @type Boolean
+			 * @example
+			 * if ( CKEDITOR.env.ie8Compat )
+			 *     alert( "I'm on IE7 or on an IE7 like IE8!" );
 			 */
 			env.ie7Compat = ( ( version == 7 && !document.documentMode )
@@ -126,4 +161,5 @@
 			 * Indicates that CKEditor is running on an IE6-like environment, which
 			 * includes IE6 itself and IE7 and IE8 quirks mode.
+			 * @name CKEDITOR.env.ie6Compat
 			 * @type Boolean
 			 * @example
@@ -132,5 +168,4 @@
 			 */
 			env.ie6Compat = ( version < 7 || env.quirks );
-
 		}
 
@@ -161,10 +196,10 @@
 
 		/**
-		 * Contains the browser version.
-		 *
+		 * Contains the browser version.<br />
+		 * <br />
 		 * For gecko based browsers (like Firefox) it contains the revision
 		 * number with first three parts concatenated with a padding zero
-		 * (e.g. for revision 1.9.0.2 we have 10900).
-		 *
+		 * (e.g. for revision 1.9.0.2 we have 10900).<br />
+		 * <br />
 		 * For webkit based browser (like Safari and Chrome) it contains the
 		 * WebKit build version (e.g. 522).
@@ -194,6 +229,12 @@
 			false );
 
-		// The CSS class to be appended on the main UI containers, making it
-		// easy to apply browser specific styles to it.
+		/**
+		 * The CSS class to be appended on the main UI containers, making it
+		 * easy to apply browser specific styles to it.
+		 * @name CKEDITOR.env.cssClass
+		 * @type String
+		 * @example
+		 * myDiv.className = CKEDITOR.env.cssClass;
+		 */
 		env.cssClass =
 			'cke_browser_' + (
Index: /CKEditor/branches/versions/3.4.x/_source/core/event.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/event.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/event.js	(revision 6034)
@@ -12,7 +12,13 @@
 {
 	/**
-	 * This is a base class for classes and objects that require event handling
-	 * features.
-	 * @constructor
+	 * Creates an event class instance. This constructor is rearely used, being
+	 * the {@link #.implementOn} function used in class prototypes directly
+	 * instead.
+	 * @class This is a base class for classes and objects that require event
+	 * handling features.<br />
+	 * <br />
+	 * Do not confuse this class with {@link CKEDITOR.dom.event} which is
+	 * instead used for DOM events. The CKEDITOR.event class implements the
+	 * internal event system used by the CKEditor to fire API related events.
 	 * @example
 	 */
@@ -22,5 +28,5 @@
 	/**
 	 * Implements the {@link CKEDITOR.event} features in an object.
-	 * @param {Object} targetObject The object in which implement the features.
+	 * @param {Object} targetObject The object into which implement the features.
 	 * @example
 	 * var myObject = { message : 'Example' };
@@ -32,5 +38,5 @@
 	 * myObject.fire( 'testEvent' );
 	 */
-	CKEDITOR.event.implementOn = function( targetObject, isTargetPrototype )
+	CKEDITOR.event.implementOn = function( targetObject )
 	{
 		var eventProto = CKEDITOR.event.prototype;
Index: /CKEditor/branches/versions/3.4.x/_source/core/eventInfo.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/eventInfo.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/eventInfo.js	(revision 6034)
@@ -11,9 +11,9 @@
 
 /**
- * This class is not really part of the API. It just illustrates the features
- * of the event object passed to event listeners by a {@link CKEDITOR.event}
- * based object.
+ * (Virtual Class) Do not call this constructor. This class is not really part
+ * of the API. 
+ * @class Virtual class that illustrates the features of the event object to be
+ * passed to event listeners by a {@link CKEDITOR.event} based object.
  * @name CKEDITOR.eventInfo
- * @constructor
  * @example
  * // Do not do this.
Index: /CKEditor/branches/versions/3.4.x/_source/core/focusmanager.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/focusmanager.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/focusmanager.js	(revision 6034)
@@ -10,9 +10,12 @@
 
 /**
- * Manages the focus activity in an editor instance. This class is to be used
- * mainly by UI elements coders when adding interface elements to CKEditor.
- * @constructor
+ * Creates a focusManager class instance.
+ * @class Manages the focus activity in an editor instance. This class is to be
+ * used mainly by UI elements coders when adding interface elements that need
+ * to set the focus state of the editor.
  * @param {CKEDITOR.editor} editor The editor instance.
  * @example
+ * var focusManager = <b>new CKEDITOR.focusManager( editor )</b>;
+ * focusManager.focus();
  */
 CKEDITOR.focusManager = function( editor )
@@ -44,7 +47,8 @@
 {
 	/**
-	 * Indicates that the editor instance has the focus.
-	 *
-	 * This function is not used to set the focus in the editor. Use
+	 * Used to indicate that the editor instance has the focus.<br />
+	 * <br />
+	 * Note that this function will not explicitelly set the focus in the
+	 * editor (for example, making the caret blinking on it). Use
 	 * {@link CKEDITOR.editor#focus} for it instead.
 	 * @example
@@ -77,8 +81,9 @@
 
 	/**
-	 * Indicates that the editor instance has lost the focus. Note that this
-	 * functions acts asynchronously with a delay of 100ms to avoid subsequent
-	 * blur/focus effects. If you want the "blur" to happen immediately, use
-	 * the {@link #forceBlur} function instead.
+	 * Used to indicate that the editor instance has lost the focus.<br />
+	 * <br />
+	 * Note that this functions acts asynchronously with a delay of 100ms to
+	 * avoid subsequent blur/focus effects. If you want the "blur" to happen
+	 * immediately, use the {@link #forceBlur} function instead.
 	 * @example
 	 * var editor = CKEDITOR.instances.editor1;
@@ -102,5 +107,5 @@
 
 	/**
-	 * Indicates that the editor instance has lost the focus. Unlike
+	 * Used to indicate that the editor instance has lost the focus. Unlike
 	 * {@link #blur}, this function is synchronous, marking the instance as
 	 * "blured" immediately.
@@ -128,4 +133,9 @@
  * @event
  * @param {CKEDITOR.editor} editor The editor instance.
+ * @example
+ * editor.on( 'focus', function( e )
+ *     {
+ *         alert( 'The editor named ' + e.editor.name + ' is now focused' );
+ *     });
  */
 
@@ -135,3 +145,8 @@
  * @event
  * @param {CKEDITOR.editor} editor The editor instance.
+ * @example
+ * editor.on( 'blur', function( e )
+ *     {
+ *         alert( 'The editor named ' + e.editor.name + ' lost the focus' );
+ *     });
  */
Index: /CKEditor/branches/versions/3.4.x/_source/core/htmlparser.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/htmlparser.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/htmlparser.js	(revision 6034)
@@ -5,7 +5,13 @@
 
 /**
- * HTML text parser.
- * @constructor
+ * Creates a {@link CKEDITOR.htmlParser} class instance.
+ * @class Provides an "event like" system to parse strings of HTML data.
  * @example
+ * var parser = new CKEDITOR.htmlParser();
+ * parser.onTagOpen = function( tagName, attributes, selfClosing )
+ *     {
+ *         alert( tagName );
+ *     };
+ * parser.parse( '&lt;p&gt;Some &lt;b&gt;text&lt;/b&gt;.&lt;/p&gt;' );
  */
 CKEDITOR.htmlParser = function()
@@ -93,5 +99,5 @@
 		 * @example
 		 * var parser = new CKEDITOR.htmlParser();
-		 * parser.onText = function( comment )
+		 * parser.onComment = function( comment )
 		 *     {
 		 *         alert( comment );  // e.g. " Example "
Index: /CKEditor/branches/versions/3.4.x/_source/core/imagecacher.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/imagecacher.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/imagecacher.js	(revision 6034)
@@ -24,7 +24,5 @@
 
 	/**
-	 * Load images into the browser cache.
-	 * @namespace
-	 * @example
+	 * @namespace Load images into the browser cache.
 	 */
  	CKEDITOR.imageCacher =
@@ -32,9 +30,19 @@
 		/**
 		 * Loads one or more images.
-		 * @param {Array} images The URLs for the images to be loaded.
-		 * @param {Function} callback The optional function to be called once all images
-		 *		are loaded. You can bind any function to the returned event object.
-		 * @return {CKEDITOR.event} Event object which fires 'preloaded' event when all images finished.
-		 *    Additionally it set "finished" property flag after 'preloaded' event.
+		 * @param {Array} images The URLs of the images to be loaded.
+		 * @param {Function} [callback] A function to be called once all images
+		 *		are loaded.
+		 * @return {CKEDITOR.event} An event object which fires the 'loaded'
+		 *		event when all images are completely loaded. Additionally, the
+		 *		"finished" property is set after the "loaded" event call.
+		 * @example
+		 * var loader = CKEDITOR.imageCacher.load( [ '/image1.png', 'image2.png' ] );
+		 * if ( !loader.finished )
+		 * {
+		 *     loader.on( 'load', function()
+		 *         {
+		 *             alert( 'All images are loaded' );
+		 *         });
+		 * }
 		 */
 		load : function( images, callback )
@@ -43,17 +51,17 @@
 
 			var event = new CKEDITOR.event;
-			event.on( 'preloaded', function()
-			{
-				event.finished = true;
-			});
+			event.on( 'loaded', function()
+				{
+					event.finished = 1;
+				});
 			
 			if ( callback )
-				event.on( 'preloaded', callback );
+				event.on( 'loaded', callback );
 
 			var checkPending = function()
-			{
-				if ( --pendingCount === 0 )
-					event.fire( 'preloaded' );
-			};
+				{
+					if ( --pendingCount === 0 )
+						event.fire( 'loaded' );
+				};
 
 			for ( var i = 0 ; i < images.length ; i++ )
Index: /CKEditor/branches/versions/3.4.x/_source/core/lang.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/lang.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/lang.js	(revision 6034)
@@ -8,4 +8,7 @@
 	var loadedLangs = {};
 
+	/**
+	 * @namespace Holds language related functions.
+	 */
 	CKEDITOR.lang =
 	{
@@ -82,10 +85,9 @@
 		 * then called when the file gets loaded.
 		 * @param {String} languageCode The code of the language file to be
-		 *		loaded. If "autoDetect" is set to true, this language will be
-		 *		used as the default one, if the detect language is not
-		 *		available in the core.
-		 * @param {Boolean} autoDetect Indicates that the function must try to
-		 *		detect the user language and load it instead.
-		 * @param {Function} callback The function to be called once the
+		 *		loaded. If null or empty, autodetection will be performed. The
+		 *		same happens if the language is not supported.
+		 * @param {String} defaultLanguage The language to be used if
+		 *		languageCode is not supported or if the autodetection fails.
+		 * @param {Function} callback A function to be called once the
 		 *		language file is loaded. Two parameters are passed to this
 		 *		function: the language code and the loaded language entries.
@@ -122,4 +124,6 @@
 		 * @param {String} defaultLanguage The default language to be returned
 		 *		if the user language is not supported.
+		 * @param {String} [probeLanguage] A language code to try to use,
+		 *		instead of the browser based autodetection.
 		 * @returns {String} The detected language code.
 		 * @example
Index: /CKEditor/branches/versions/3.4.x/_source/core/skins.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/core/skins.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/core/skins.js	(revision 6034)
@@ -71,5 +71,5 @@
 			{
 				// Bind listener for this editor instance.
-				preloaded[ skinName ].on( 'preloaded', function()
+				preloaded[ skinName ].on( 'loaded', function()
 					{
 						loadPart( editor, skinName, part, callback );
Index: /CKEditor/branches/versions/3.4.x/_source/plugins/bidi/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/plugins/bidi/plugin.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/plugins/bidi/plugin.js	(revision 6034)
@@ -6,5 +6,5 @@
 (function()
 {
-	var guardElements = { table:1, ul:1, ol:1, blockquote:1, div:1 },
+	var guardElements = { table:1, tbody: 1, ul:1, ol:1, blockquote:1, div:1, tr: 1 },
 		directSelectionGuardElements = {},
 		// All guard elements which can have a direction applied on them.
@@ -131,16 +131,7 @@
 	}
 
-	function getFullySelected( selection, elements )
-	{
-		var ancestor = selection.getCommonAncestor();
-		if ( ancestor.type != CKEDITOR.NODE_ELEMENT )
-			return;
-
-		var ranges = selection.getRanges();
-
-		// Join multiple ranges.
-		var range = new CKEDITOR.dom.range( selection.document );
-		range.setStart( ranges[ 0 ].startContainer, ranges[ 0 ].startOffset );
-		range.setEnd( ranges[ ranges.length - 1 ].endContainer, ranges[ ranges.length - 1 ].endOffset );
+	function getFullySelected( range, elements )
+	{
+		var ancestor = range.getCommonAncestor( false, true );
 
 		range.enlarge( CKEDITOR.ENLARGE_BLOCK_CONTENTS );
@@ -149,9 +140,11 @@
 				&& range.checkBoundaryOfElement( ancestor, CKEDITOR.END ) )
 		{
-			while ( ancestor.type == CKEDITOR.NODE_ELEMENT
-					&& !( ancestor.getName() in elements )
-					&& ancestor.getParent().getChildCount() == 1
+			var parent;
+			while ( ancestor && ancestor.type == CKEDITOR.NODE_ELEMENT
+					&& ( parent = ancestor.getParent() )
+					&& parent.getChildCount() == 1
+					&& ( !( ancestor.getName() in elements ) || ( parent.getName() in elements ) )
 					)
-				ancestor = ancestor.getParent();
+				ancestor = parent;
 
 			return ancestor.type == CKEDITOR.NODE_ELEMENT
@@ -172,36 +165,45 @@
 			{
 				var database = {};
-				// Apply do directly selected elements from guardElements.
-				var selectedElement = ranges[ 0 ].getEnclosedNode();
-
-				// If this is not our element of interest, apply to fully selected elements from guardElements.
-				if ( !selectedElement || selectedElement
-						&& !( selectedElement.type == CKEDITOR.NODE_ELEMENT && selectedElement.getName() in directSelectionGuardElements )
-					)
-					selectedElement = getFullySelected( selection, guardElements );
-
-				if ( selectedElement && !selectedElement.isReadOnly() )
-					switchDir( selectedElement, dir, editor, database );
-				
+
 				// Creates bookmarks for selection, as we may split some blocks.
 				var bookmarks = selection.createBookmarks();
 
-				var iterator,
-					block;
-
-				for ( var i = ranges.length - 1 ; i >= 0 ; i-- )
+				var rangeIterator = ranges.createIterator(),
+					range,
+					i = 0;
+
+				while ( ( range = rangeIterator.getNextRange( 1 ) ) )
 				{
-					// Array of elements processed as guardElements.
-					var processedElements = [];
+					// Apply do directly selected elements from guardElements.
+					var selectedElement = range.getEnclosedNode();
+
+					// If this is not our element of interest, apply to fully selected elements from guardElements.
+					if ( !selectedElement || selectedElement
+							&& !( selectedElement.type == CKEDITOR.NODE_ELEMENT && selectedElement.getName() in directSelectionGuardElements )
+						)
+						selectedElement = getFullySelected( range, guardElements );
+
+					if ( selectedElement && !selectedElement.isReadOnly() )
+						switchDir( selectedElement, dir, editor, database );
+
+					var iterator,
+						block;
+
 					// Walker searching for guardElements.
-					var walker = new CKEDITOR.dom.walker( ranges[ i ] );
+					var walker = new CKEDITOR.dom.walker( range );
+
+					var start = bookmarks[ i ].startNode,
+						end = bookmarks[ i++ ].endNode;
+
 					walker.evaluator = function( node )
 					{
-						return node.type == CKEDITOR.NODE_ELEMENT
-							&& node.getName() in guardElements
-							&& !( node.getName() == ( enterMode == CKEDITOR.ENTER_P ) ? 'p' : 'div'
-								&& node.getParent().type == CKEDITOR.NODE_ELEMENT
-								&& node.getParent().getName() == 'blockquote'
-							);
+						return !! ( node.type == CKEDITOR.NODE_ELEMENT
+								&& node.getName() in guardElements
+								&& !( node.getName() == ( enterMode == CKEDITOR.ENTER_P ) ? 'p' : 'div'
+									&& node.getParent().type == CKEDITOR.NODE_ELEMENT
+									&& node.getParent().getName() == 'blockquote' )
+								// Element must be fully included in the range as well. (#6485).
+								&& node.getPosition( start ) & CKEDITOR.POSITION_FOLLOWING
+								&& ( ( node.getPosition( end ) & CKEDITOR.POSITION_PRECEDING + CKEDITOR.POSITION_CONTAINS ) == CKEDITOR.POSITION_PRECEDING ) );
 					};
 
@@ -209,16 +211,16 @@
 						switchDir( block, dir, editor, database );
 
-					iterator = ranges[ i ].createIterator();
+					iterator = range.createIterator();
 					iterator.enlargeBr = enterMode != CKEDITOR.ENTER_BR;
 
 					while ( ( block = iterator.getNextParagraph( enterMode == CKEDITOR.ENTER_P ? 'p' : 'div' ) ) )
 						!block.isReadOnly() && switchDir( block, dir, editor, database );
-
-					CKEDITOR.dom.element.clearAllMarkers( database );
-
-					editor.forceNextSelectionCheck();
-					// Restore selection position.
-					selection.selectBookmarks( bookmarks );
 				}
+
+				CKEDITOR.dom.element.clearAllMarkers( database );
+
+				editor.forceNextSelectionCheck();
+				// Restore selection position.
+				selection.selectBookmarks( bookmarks );
 
 				editor.focus();
Index: /CKEditor/branches/versions/3.4.x/_source/plugins/contextmenu/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/plugins/contextmenu/plugin.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/plugins/contextmenu/plugin.js	(revision 6034)
@@ -1,3 +1,3 @@
-﻿/*
+/*
 Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -225,4 +225,17 @@
 				},
 				this );
+
+			if ( CKEDITOR.env.opera )
+			{
+				// 'contextmenu' event triggered by Windows menu key is unpreventable,
+				// cancel the key event itself. (#6534)  
+				element.on( 'keypress' , function ( evt )
+				{
+					var domEvent = evt.data;
+
+					if ( domEvent.$.keyCode == 0 )
+						domEvent.preventDefault();
+				});
+			}
 
 			if ( CKEDITOR.env.webkit )
Index: /CKEditor/branches/versions/3.4.x/_source/plugins/floatpanel/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/plugins/floatpanel/plugin.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/plugins/floatpanel/plugin.js	(revision 6034)
@@ -124,5 +124,6 @@
 				element.setStyles(
 					{
-						top : '-30000px',
+						top : 0,
+						left: 0,
 						display	: ''
 					});
Index: /CKEditor/branches/versions/3.4.x/_source/plugins/indent/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/plugins/indent/plugin.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/plugins/indent/plugin.js	(revision 6034)
@@ -283,17 +283,9 @@
 				range;
 
-			var skipBookmarks = CKEDITOR.dom.walker.bookmark( 0, 1 );
 
 			var iterator = ranges.createIterator();
 			while ( ( range = iterator.getNextRange() ) )
 			{
-				// Do not indent body. (#6138)
-				range.shrink( CKEDITOR.SHRINK_ELEMENT );
-				if ( range.endContainer.getName() == 'body' )
-					range.setEndAt( range.endContainer.getLast( skipBookmarks ), CKEDITOR.POSITION_BEFORE_END );
-
-				var startContainer = range.startContainer,
-					endContainer = range.endContainer,
-					rangeRoot = range.getCommonAncestor(),
+				var rangeRoot = range.getCommonAncestor(),
 					nearestListBlock = rangeRoot;
 
@@ -302,8 +294,23 @@
 					nearestListBlock = nearestListBlock.getParent();
 
+				// Avoid having selection enclose the entire list. (#6138)
+				// [<ul><li>...</li></ul>] =><ul><li>[...]</li></ul>
+				if ( !nearestListBlock )
+				{
+					var selectedNode = range.getEnclosedNode();
+					if ( selectedNode
+						&& selectedNode.type == CKEDITOR.NODE_ELEMENT
+						&& selectedNode.getName() in listNodeNames)
+					{
+						range.setStartAt( selectedNode, CKEDITOR.POSITION_AFTER_START );
+						range.setEndAt( selectedNode, CKEDITOR.POSITION_BEFORE_END );
+						nearestListBlock = selectedNode;
+					}
+				}
+
 				// Avoid selection anchors under list root.
 				// <ul>[<li>...</li>]</ul> =>	<ul><li>[...]</li></ul>
-				if ( nearestListBlock && startContainer.type == CKEDITOR.NODE_ELEMENT
-					&& startContainer.getName() in listNodeNames )
+				if ( nearestListBlock && range.startContainer.type == CKEDITOR.NODE_ELEMENT
+					&& range.startContainer.getName() in listNodeNames )
 				{
 					var walker = new CKEDITOR.dom.walker( range );
@@ -312,6 +319,6 @@
 				}
 
-				if ( nearestListBlock && endContainer.type == CKEDITOR.NODE_ELEMENT
-					&& endContainer.getName() in listNodeNames )
+				if ( nearestListBlock && range.endContainer.type == CKEDITOR.NODE_ELEMENT
+					&& range.endContainer.getName() in listNodeNames )
 				{
 					walker = new CKEDITOR.dom.walker( range );
Index: /CKEditor/branches/versions/3.4.x/_source/plugins/panel/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/plugins/panel/plugin.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/plugins/panel/plugin.js	(revision 6034)
@@ -319,5 +319,5 @@
 			// Safari need focus on the iframe window first(#3389), but we need
 			// lock the blur to avoid hiding the panel.
-			if ( CKEDITOR.env.webkit )
+			if ( CKEDITOR.env.webkit || CKEDITOR.env.opera )
 				item.getDocument().getWindow().focus();
 			item.focus();
Index: /CKEditor/branches/versions/3.4.x/_source/plugins/selection/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/plugins/selection/plugin.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/plugins/selection/plugin.js	(revision 6034)
@@ -887,10 +887,12 @@
 							if ( !node || node.type != CKEDITOR.NODE_ELEMENT )
 								node = range.startContainer;
-
-							var child = node.getFirst();
-							while (  child && child.type == CKEDITOR.NODE_ELEMENT )
-							{
-								node = child;
-								child = child.getFirst();
+							else
+							{
+								var child = node.getFirst();
+								while (  child && child.type == CKEDITOR.NODE_ELEMENT )
+								{
+									node = child;
+									child = child.getFirst();
+								}
 							}
 						}
Index: /CKEditor/branches/versions/3.4.x/_source/plugins/wysiwygarea/plugin.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/plugins/wysiwygarea/plugin.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/plugins/wysiwygarea/plugin.js	(revision 6034)
@@ -1,3 +1,3 @@
-﻿/*
+/*
 Copyright (c) 2003-2010, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.html or http://ckeditor.com/license
@@ -637,5 +637,5 @@
 								else if ( CKEDITOR.env.opera )
 									doc.getBody().focus();
-								// Webkit needs focus for the first time on the HTML element.
+								// Webkit needs focus for the first time on the HTML element. (#6153)
 								else if ( CKEDITOR.env.webkit )
 								{
@@ -644,13 +644,4 @@
 										editor.document.getDocumentElement().focus();
 										wasFocused = 1;
-
-										// Webkit does not scroll to the cursor position after first focus.
-										setTimeout(function()
-										{
-											doc.$.execCommand( 'inserthtml', false, '<span id="cke_focus_marker" cke_temp="1"></span>' );
-											var marker = doc.getById( 'cke_focus_marker' );
-											marker.scrollIntoView();
-											marker.remove();
-										}, 0 );
 									}
 								}
Index: /CKEditor/branches/versions/3.4.x/_source/themes/default/theme.js
===================================================================
--- /CKEditor/branches/versions/3.4.x/_source/themes/default/theme.js	(revision 6033)
+++ /CKEditor/branches/versions/3.4.x/_source/themes/default/theme.js	(revision 6034)
@@ -3,4 +3,9 @@
 For licensing, see LICENSE.html or http://ckeditor.com/license
 */
+
+/**
+ * @name CKEDITOR.theme
+ * @class
+ */
 
 CKEDITOR.themes.add( 'default', (function()
@@ -66,5 +71,5 @@
 	}
 
-	return {
+	return /** @lends CKEDITOR.theme */ {
 		build : function( editor, themePath )
 		{
